Commit Graph

508 Commits

Author SHA1 Message Date
d856e06b7d docs(phase-07): pin file-level vue-tsc gate command per RESEARCH Pitfall 4 2026-09-16 21:30:12 +08:00
a81e445497 docs(07-10): correct expireStreams call-site count to 5 2026-09-16 21:28:29 +08:00
10f88628cd docs(phase-07): plan plan set 07-10..07-14 for registered-not-fixed data defects 2026-09-16 21:27:10 +08:00
f97c76966b docs(phase-06): update tracking after plan 06-18 2026-09-16 20:43:16 +08:00
83ba914b4c docs(06-18): complete merged real-map scenario perf plan 2026-09-16 20:42:20 +08:00
5317b2f1e3 test(06-18): add whole-map critical timing and total/avg summary table
Adds a third metric that calls the real calculateCritical for every monster on
the merged map and fully consumes the generator, plus a second console.table
with monsters / total ms (sampled median of one full-map sweep) / avg ms.
avg ms equals total ms divided by the monster count.
2026-09-16 20:39:45 +08:00
c193c4e9a9 test(06-18): add merged real-map scenario perf for buildup and map damage
Merges the first 1/5/13 real 13x13 maps into one grid-tiled map
(13x13, 39x26, 52x52 with 11/79/204 monsters), builds the scene from a real
CoreState (real converters/reducer/calculator/final effect), assigns 12 real
Enemy prefabs (3 CommonAura ranges + GuardAura) via a seeded mulberry32, and
records buildup + map damage build timings with performance.mark/measure.
Zero assertions.
2026-09-16 20:33:18 +08:00
6c4d3709d3 test(06-18): migrate 5 existing perf files to performance.mark/measure
- measureCase sampling loop now pairs mark(startTag)/mark(endTag) with
  measure(measureName, startTag, endTag) and clears marks/measures per sample
- tag names derive from caseName+scale so they never collide across cases
- WARMUP_RUNS/SAMPLE_RUNS/median/min/p95/toFixed(3)/columns unchanged
2026-09-16 20:26:42 +08:00
0da0117cd4 docs(06-18): flag MainEnemyComparer as intentionally uncovered 2026-09-16 20:17:45 +08:00
7ad903f156 docs(06-18): create phase plan 2026-09-16 20:15:19 +08:00
b2626bd438 fix(07-09): keep hero attribute instance stable and clear generic variance
- HeroAttribute.loadState replaces its private base object; the HeroAttribute wrapper identity is preserved so equipment/combat references stay valid across load (#06-17-1/#06-17-2).

- Clone the incoming base attribute in the constructor so the shared HERO_DEFAULT_ATTRIBUTE is no longer mutated across CoreState instances.

- Use any for the hero position in combat handler/aura/enemy-view generics to clear the 45 new type errors introduced by HeroAttribute implementing ISaveableContent.
2026-09-16 19:35:54 +08:00
9a2f581c80 docs(phase-07): update tracking after plan 07-09 2026-09-16 18:50:23 +08:00
c5eb1bcdad docs(07-09): complete hero attribute same-reference save/load plan
- record #06-17-1/#06-17-2 closure, option A registry, attachAttribute removal and readonly binding
- record A2 save-shape change, no-ledger-entry cross-reference and the C-H unfixed list
- record Phase 7 reopen / 07-VERIFICATION.md invalidation and measured gate results
2026-09-16 18:49:43 +08:00
940e31f293 test(07-09): #06-17-2 combat-side same-reference hero attribute regression
- migrate the top-level snapshot assertion to heroSave.attribute.values.hp
- add CoreState enemyContext.getBindedHero() regressions: same live attribute before/after load, no rebinding, across all compressions
2026-09-16 18:47:39 +08:00
1f0af69004 fix(07-09): #06-17-1 load hero attribute in place and keep equipment bonuses
- IHeroStateSave.attribute becomes IHeroAttributeSave<THero>; top-level modifiers removed
- HeroState.attribute is readonly and loadState delegates to attribute.loadState (never reassigns)
- delete attachAttribute from IHeroState and HeroState, and its only test case
- thin-delegate registerModifier/createModifier/createAndInsertModifier to the attribute registry
- loadEquipEffect mounts equipment modifiers with save=false so equipment bonuses only return via re-equip
- add #06-17-1 regressions: same attribute instance, bonuses kept, no double-count when type is registered
2026-09-16 18:43:33 +08:00
6a60476531 feat(07-09): make HeroAttribute own its save state in place
- add IHeroAttributeSave<THero> and have IHeroAttribute extend ISaveableContent
- move the modifier factory registry into HeroAttribute with registerModifier/createModifier/createAndInsertModifier
- implement in-place saveState/loadState (values deep copy, save-enabled modifier enumeration, registry-driven rebuild)
- carry registry entries into clone() output
- introduce IHeroModifierOwner so modifier owner typing stays assignable for generic attributes
- add attribute.test.ts same-reference save/load regressions across all compressions
2026-09-16 18:37:54 +08:00
94f6a70e38 docs(phase-07): lock 07-09 decisions - option A registry, delete attachAttribute, readonly attribute
Task 0 becomes a resolved decision record (options marked historical, locked results in <record>): registry moves into HeroAttribute with HeroState thin delegation and clone() carrying it; attachAttribute deleted from IHeroState/HeroState plus its sole test, attribute made readonly so loadState never rebinds; equipment modifiers excluded from the attribute save via addModifier(name, modifier, false); IHeroStateSave.attribute becomes IHeroAttributeSave<THero> with top-level modifiers removed (no compat branch); #06-17-1/#06-17-2 regressions authorized; #06-17-3..8 registered only.
2026-09-16 18:04:54 +08:00
c39f43c6da docs(phase-07): add plan 07-09 for hero attribute same-reference save/load 2026-09-16 17:16:44 +08:00
83853ea5b0 docs(phase-06): update tracking after plan 06-17 2026-09-16 16:25:09 +08:00
7a056bb970 docs(06-17): complete real-map save/load perf plan
- add 06-17-SUMMARY.md with the 27-row measured table, measurement parameters, fixed side load breakdown, truthful Low-vs-High branch note and D-44 gate results
- register 06-TEST-FINDINGS.md #06-17-1 (HeroEquipment keeps the replaced attribute reference, so equipment bonuses are lost after hero.loadState; confirmed by a throwaway probe: atk 5 -> 0 at all three compressions)
- register WINDOWS.md entry #28 for the stage-1 minimum equipment seed deviation
2026-09-16 16:23:04 +08:00
a44c5d8918 test(06-17): stage 3 complete Low/High compression and reach 27 rows
- expand COMPRESSIONS to NoCompression / LowCompression / HighCompression so the matrix is 3 map counts x 3 compressions x 3 timing items = 27 rows
- keep measureCase, fixture build order, side load and 06-16 files untouched; still zero assertions
- one full run: 5 perf files / 45 tests passed, 0 WARNING/ERROR codes, saveablesReal.perf.ts (27 tests) in 379ms -- no case approaches the 30000ms testTimeout
2026-09-16 16:21:26 +08:00
4476e19805 test(06-17): stage 2 add fixed real side load and map scales 1/5/13
- seed 50 flags, 20 item kinds (3 equipment + 17 consumables), 4 equipped instances on slots 0..3, 20 modifiers (4 from equipped items + 16 manual), 1000 mixed replay steps and an unmodified enemy baseline
- keep addTile -> itemStore.addItem -> equipment.add ordering and a single one-shot compareWith after all maps exist
- 9 rows (1/5/13 x NoCompression x save|load|round trip), zero assertions, zero warn/error codes
2026-09-16 16:10:10 +08:00
63485e93ca test(06-17): stage 1 real 13x13 map fixture and map-only save/load perf rows
- move root floors.json into packages-user/data-state/test/fixtures/ (byte-identical) and delete the root copy
- add saveablesReal.perf.ts: toFlat/clearCodes/registerTiles/createRealMapFixture with a one-shot compareWith baseline
- seed the minimum 1 equipment instance so HeroEquipsStore.loadState does not raise error 58
- 3 rows: save / load / round trip for 1 map x NoCompression, zero assertions
2026-09-16 16:02:58 +08:00
92bddd6c74 docs(06): create plan 06-17 realistic map save/load perf supplement 2026-09-16 15:49:53 +08:00
a19979ff75 docs(phase-06): update tracking after plan 06-16 2026-09-16 15:13:09 +08:00
5d1525b717 docs(06-16): complete performance-test supplement plan
- 06-16-SUMMARY.md: 18-row median/min/p95 timing table from a real pnpm test:perf run
- measurement protocol (warmup 3 untimed + 20 samples, lower median, zero assertions)
- pnpm test:ci unchanged (66 files / 680 passed / 1 skipped); no baseline JSON committed
2026-09-16 15:12:27 +08:00
374274a4bb test(06-16): add CoreState save/load perf suite across item scales and compressions
- saveables.perf.ts: 9 cases = 10/100/1000 items x No/Low/High compression
- each sample round-trips all 5 registered saveables through saveState/loadState
- synthetic item definitions via addTile -> itemStore.addItem -> equipment.add/addItem
- warmup 3 + 20 samples, median/min/p95 via console.table, no assertions
2026-09-16 15:06:58 +08:00
3c59f31e6f test(06-16): add enemy context buildup and hero attribute perf suites
- context.perf.ts: 3 cases (50/200/1000 enemies), fixed 10 global auras + 5 special codes, cached aura topology, one buildup per sample
- attribute.perf.ts: 3 cases (10/100/1000 modifiers over 10 attributes), 1000 recalc rounds per sample via markModifierDirty + getFinalAttribute
- warmup 3 + 20 samples, median/min/p95 via console.table, no assertions
2026-09-16 15:02:57 +08:00
37bf89bc94 test(06-16): add isolated perf channel and critical calculation perf
- vitest.perf.config.ts: include only *.perf.ts, mirror vite.config.ts aliases, 30s timeouts
- package.json: add test:perf script (test/test:ci untouched)
- damage.perf.ts: 3 cases (1000/10000/50000) warmup 3 + 20 samples, no assertions
2026-09-16 14:56:28 +08:00
ac2a9b34d4 docs(06): create plan 06-16 performance-test supplement 2026-09-16 14:46:00 +08:00
2d718755c2 docs(07): final verification refresh covering security/validation/uat artifacts 2026-09-16 14:05:43 +08:00
393e4cc7a8 docs(phase-7): mark validation strategy validated 2026-09-16 13:57:08 +08:00
d49f36d3e4 docs(phase-7): add security threat verification 2026-09-16 13:56:22 +08:00
d6fcd1c60e test(07): complete UAT - 6 passed, 0 issues 2026-09-16 13:53:32 +08:00
5657352a47 docs(07): refresh verification after W-01 doc fix and review 2026-09-16 13:50:59 +08:00
9e91785760 docs(07): add code review report 2026-09-16 13:40:03 +08:00
4f31627335 chore: untrack the dispatch isolation sentinel and ignore .gsd/ 2026-09-16 13:28:03 +08:00
0224c2e67e docs(07): align replay param type table with the renumbered codes 2026-09-16 13:27:38 +08:00
286edefd1d chore(07): release milestone lock after phase completion 2026-09-16 13:23:16 +08:00
6973d58a7f chore(07): finalize phase tracking state 2026-09-16 13:23:01 +08:00
615ff5f78a docs(phase-07): complete phase execution 2026-09-16 13:22:46 +08:00
35f6fed9b4 docs(phase-07): update tracking after wave 8 2026-09-16 13:05:41 +08:00
229b272954 docs(07-08): complete #06-07-1 event-layer binding plan
records wiring facts (1ff22dd), intentional layer=null, test-side binding + rename + route (2,0),
user-owned floor-switch re-injection gap, and registration-only teleportTo self-target defect
2026-09-16 13:04:58 +08:00
2f148c900c test(07-08): #06-07-1 bind the event layer in the teleport playback test
- createSmallMapScene returns map (additive; existing callers ignore it)
- target case binds state.pathfinding.finder.useMapLayer(map.eventLayer) after floor activation
- teleport target changed to (2,0) to avoid self-target empty-path early return; asserts x=2/y=0
- un-skip and rename to reflect test-side event layer binding; neutral leading comment
2026-09-16 13:02:46 +08:00
4a25e2e794 docs(07-08): revise test route to teleport (2,0) and register self-target defect 2026-09-15 21:57:44 +08:00
123493ccb4 docs(07-08): amend plan for test-side layer binding and rename 2026-09-15 21:43:18 +08:00
1ff22dd07d feat: 寻路系统接线 2026-09-15 21:28:52 +08:00
2ba3089c9a docs(phase-07): update tracking after wave 7 2026-09-15 21:14:18 +08:00
30cdb5c68a docs(07-07): complete save code 178 semantic fix plan 2026-09-15 21:13:40 +08:00
95ea6609c6 fix(07-07): #06-09-5 warn code 178 for unloaded save keys
- core.ts loadState: 差集方向改为 loaded.difference(total),178 = 存档出现但未加载的 key
- saveablesRoundTrip.test.ts:322-334 改写为「缺 key 不触发 178、仍触发 177」负向见证并更名
- saveablesRoundTrip.test.ts:337-349 取消 it.skip,承担「多出 key 触发 178」正向见证
2026-09-15 21:10:33 +08:00