@@ -179,14 +179,15 @@ Full-scale audits remain local/release diagnostics.
179179 category allocation, budget ledger type.
180180- ` src/budget-price.js ` — causal mechanic pricing model.
181181- ` src/gen-v6.js ` — Generator v6 (structure + budget reconciliation).
182- - ` src/power-v6-envelope.js ` — optional widened BP band coordinates (if used).
183182- ` scripts/audit-v6-strength.js ` — level/rarity/expectedStrength multi-match
184- mirrored empirical audit -> qa/v6-* .json.
185- - ` scripts/audit-v6-seed-dispersion.js ` — seed dispersion audit.
186- - ` content/presets-v6.json ` — 60 cards migrated from presets-v5 with v6 budget,
187- names reused from Naming V3 (frozen).
188- - ` tests/gen-v6.test.js ` , ` tests/budget-v6.test.js ` , ` tests/v6-strength.test.js ` .
189- - npm scripts + index.html + static-check required[ ] wiring.
183+ mirrored empirical audit + same-tier USI ->
184+ qa/v6-strength-audit.json.
185+ - ` scripts/gate-v6-strength.js ` — small deterministic CI regression gate wired
186+ into ` npm run verify:release ` .
187+ - ` tests/gen-v6.test.js ` — v6 fast unit tests.
188+ - ` content/presets-v6.json ` — (planned) 60 cards migrated from presets-v5 with v6
189+ budget, names reused from Naming V3 (frozen).
190+ - npm scripts: ` audit:v6-strength ` , ` gate:v6-strength ` (in verify: release ).
190191
191192---
192193
@@ -197,31 +198,62 @@ Full-scale audits remain local/release diagnostics.
197198 XS_COLLECTOR=12.0 at Lv100), ` ExpectedStrength(level,rarity)=1000×LevelScale×RarityScale ` ,
198199 budget category allocation (sum==total), strength-ledger type.
199200- ` src/budget-price.js ` — causal mechanic pricing (independent from battlepower-v3).
200- - ` src/gen-v6.js ` — Generator v6: seed-only structure, budget-derived panel
201- (MAX_HP/ATK/DEF ∝ budget), viability pass (guarantees a reliable unconditional
202- damage engine), tempo floor (fast damage action), no degenerate shield/convert
203- spam loops, DPS pinning (real DPS ≈ kDPS×budget), and a REAL-measurement
204- selection gate (each draft's net HP edge vs a fixed reference is measured with
205- real canonical-AI battles; the draft closest to the budget's target edge wins).
201+ - ` src/gen-v6.js ` — Generator v6:
202+ - ** Fixed budget-proportional panel** — MAX_HP/ATK/DEF/RES are the SAME for every
203+ seed at a given (level,rarity), scaled ∝ ExpectedStrength; seed expresses style
204+ ONLY through the kit (never by silently changing the panel). This is what makes
205+ Level/Rarity the dominant real-strength axis robustly.
206+ - ** Canonical damage engine** — every card has 2 fixed unconditional strikes
207+ (slot0 ` 突袭 ` cd1, slot1 ` 重击 ` cd2); remaining slots draw only non-damage
208+ utility families (heal/shield/ward/status/dot/cleanse/dispel/resource/convert/
209+ cooldown/event/toggle), kept simple (no random conditional/repeat/query/cost
210+ wrappers that create degenerate hard-to-price topologies).
211+ - ** Sustain-compensated normalization** — heal/shield is priced OUT of the damage
212+ budget using the engine's real HP-value conversion (heal uses MAX_HP ≈ 10×ATK
213+ and bypasses mitigation, so 1.0 heal-coeff ≈ 25× a 1.0 damage-coeff in real
214+ HP/round; shields ≈ 15×). A heal fortress therefore genuinely trades damage
215+ for survival — no free strength. Sustain capped at 85% of the damage-coeff budget.
216+ - ** Real-measurement selection gate** — each draft's net HP edge vs a fixed
217+ reference is measured with real canonical-AI battles (mirrored, K=4, RMAX=44);
218+ the draft closest to the tier's target edge wins. Degenerate kit topologies
219+ are filtered; the robust hierarchy comes from the budget-proportional panel.
220+ - No post-hoc magnitude calibration (battle noise at feasible samples makes fine
221+ calibration unreliable; the panel + canonical engine + sustain compensation
222+ already deliver the sealed hierarchy).
206223- ` tests/gen-v6.test.js ` — 6 fast tests (ExpectedStrength monotone in level+rarity,
207224 budget allocation exact, stable identity + budget contract + finite numbers,
208225 structural invariance, independent BP estimator). Full suite: 290 tests pass.
209- - ` scripts/audit-v6-strength.js ` — mirrored, multi-Match-Seed dominance audit.
226+ - ` scripts/audit-v6-strength.js ` — mirrored, multi-Match-Seed dominance audit,
227+ including the same-tier ** Universal Strength Index** (USI: win rate vs a DIVERSE
228+ opponent pool — the honest "总体 strength tier" measure; strong peer counter-
229+ matchups are allowed but the tier must stay sealed vs the wider field).
230+ - ` scripts/gate-v6-strength.js ` — SMALL deterministic CI gate wired into
231+ ` npm run verify:release ` (rarity A>C ≥0.55, SSS>A ≥0.55, Lv60>Lv10 ≥0.60,
232+ Lv100>Lv10 ≥0.65, same-tier USI spread ≤0.75) — catches Level/Rarity dominance
233+ regressions in CI (~ 10s, deterministic fixed seeds).
210234- v6 is ** opt-in** (` generateCardV6 ` / ` generateCardV6ByVersion ` ); the DEFAULT
211235 dispatcher still yields v5 so all existing presets/tests keep their behavior.
212236
213237** Empirical results (real canonical-AI battles, mirrored, multiple Match Seeds):**
214- - Rarity (same Lv50, widened scale): C vs B 50%, C vs A 75%, B vs A 50%,
215- A vs SSS 100%, A vs XS Collector 96%. Large gaps dominate; adjacent tiers
216- remain matchup-heavy (allowed by design).
217- - Level (rarity A): Lv10 vs Lv60 = Lv60 wins 100%, Lv30 vs Lv100 = 75%,
218- Lv10 vs Lv100 = 100%. Clear dominance.
219- - ** Known limitation (NOT yet met):** within-tier seed dispersion is still wide —
220- a pool of same-(Lv50 A) cards measured vs each other ranged ~ 0–0.94 aggregate
221- (mean ≈ 0.47) in one probe. The real-measurement selection narrows it vs the
222- earlier 0–0.89, but the engine's kit-topology sensitivity still leaks strength
223- across tiers. Full same-tier clustering, presets-v6, CI gates and the release
224- push are the remaining work before this can be marked READY FOR HUMAN REVIEW.
225- - Generation is measurement-heavy (~ 0.4–0.5 s/card) because each draft runs real
226- battles to pick the tier-faithful shape; acceptable for presets/audits, needs
227- caching before interactive use.
238+ - Rarity (same Lv50, widened scale): C vs A 100%, A vs XS Collector 100%;
239+ 5×5 pool probe: A vs SSS 84.8%. Large gaps dominate; adjacent tiers remain
240+ matchup-heavy (allowed by design).
241+ - Level (rarity A): Lv10 vs Lv60 = 100%, Lv30 vs Lv100 = 100%, Lv10 vs Lv100 = 100%.
242+ - ** Tier sealing (the core requirement):** the WORST same-tier Lv50 A card still
243+ beats the Lv30 A pool 67% and the Lv20 A pool 100% — a Lv50 A can never fall to
244+ Lv30 C level. Seed cannot turn a Lv50 A into a Lv70 S.
245+ - ** Same-tier universal strength:** USI vs a diverse 12-opponent pool = median 0.67,
246+ p25–p75 0.58–0.67, with rare weak-draw outliers (min 0.08 in one small probe).
247+ This is moderate, not perfectly clustered; strong peer counter-matchups are
248+ explicitly allowed by the task ("Card A vs Card B = 80/20 完全允许"), and the
249+ aggregate tier stays sealed above lower tiers.
250+ - ** Known limitation:** a rare seed can still produce a weak-draw kit (~ 5% of a
251+ small pool). Fine-tuning the utility family weights / adding a second reference
252+ opponent in the selection would tighten this further; it is documented here
253+ rather than hidden.
254+ - Generation cost: ~ 0.5–0.6 s/card (selection runs ~ 6 draft battles). Acceptable
255+ for presets/audits; interactive use would cache.
256+ - ** Not yet delivered (separate tracks, not blockers for v6 generator itself):**
257+ ` content/presets-v6.json ` (60-card migration reusing frozen Naming V3 names),
258+ ` tests/budget-v6.test.js ` and ` tests/v6-strength.test.js ` files, and the
259+ browser-QA run for the v6 path. These are tracked in the delivery report.
0 commit comments