template/.planning/WINDOWS.md
unanmed 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

387 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
schema_version: 1
open_count: 11
waived_count: 0
fixed_count: 17
total_count: 28
last_updated: 2026-09-16T08:20:22.513Z
---
# Broken Windows Ledger
> Cross-phase defect register. With `workflow.windows_enforce` enabled, `/gsd-ship` blocks while `open_count > 0`.
> Waive with `gsd-tools windows waive <id> "<reason>"` (reason required).
> Mark fixed with `gsd-tools windows fixed <id>`.
| id | phase | kind | file | line | description | status | reason | recorded_at | resolved_at |
|----|-------|------|------|------|-------------|--------|--------|-------------|-------------|
| 1 | 01 | stub | packages-user/data-state/src/core.ts | 153 | Serialized event registration and map-id binding remains an intentional deferred TODO. | fixed | | 2026-09-08T15:06:40.634Z | 2026-09-10T12:20:52.319Z |
| 2 | 01 | unrun-verify | .planning/phases/01-event/01-05-SUMMARY.md | | Downstream implementation verification was not run because the user explicitly prohibited downstream plan execution. | open | | 2026-09-08T15:37:54.227Z | |
| 3 | 01 | deviation | packages-user/data-base/src/map/mapLayer.ts | | Replaced unsupported Map upsert runtime calls so the raw map event path runs under Node Vitest. | open | | 2026-09-08T15:54:23.173Z | |
| 4 | 02 | skipped-test | packages-user/data-common/src/common/mover.test.ts | | 4 个 it.skip 坐标回写回归用例(x/y 正交、斜向、传送),待 02-02 修复 mover.ts:651 后翻绿 | fixed | | 2026-09-09T07:51:25.555Z | 2026-09-09T09:34:39.843Z |
| 5 | 02 | stub | packages-user/data-system/src/path/system.ts | 254 | interrupt() is an intentional placeholder that only stops the in-flight move; takeover sequencing (stop-then-await per approved option 1) is implemented by 02-03 Task 4 | fixed | | 2026-09-09T09:34:59.707Z | 2026-09-09T13:24:24.755Z |
| 6 | 02 | stub | packages-user/data-state/src/hero/moverImpl.ts | 284 | Existing cannotEnter() is intentionally empty because no event trigger corresponds to movement blocked by an impassable mask; D-08 direct OnTouch dispatch handles allowed adjacent no-pass targets. | open | | 2026-09-10T01:38:48.570Z | |
| 7 | 03 | stub | packages-user/data-common/src/save/memory.ts | 90 | MemorySaveSystem.saveAutosaveToDB is an intentional no-op because Node never persists to IndexedDB. | fixed | | 2026-09-10T07:45:16.944Z | 2026-09-11T06:11:48.592Z |
| 8 | 03 | stub | packages-user/data-common/src/save/memory.ts | 90 | MemorySaveSystem.saveAutosaveToDB is an intentional no-op because Node never persists to IndexedDB. | fixed | | 2026-09-10T07:45:32.524Z | 2026-09-11T06:11:49.370Z |
| 9 | 03 | stub | packages-user/data-state/src/legacy/dependencies.ts | 53 | Node legacy dependency boundary intentionally registers no browser loading callbacks. | fixed | | 2026-09-10T07:45:33.228Z | 2026-09-11T06:04:34.207Z |
| 10 | 03 | deviation | packages-user/data-base/src/map/mapLayer.ts | 216 | Replaced Map.getOrInsertComputed with explicit Map lookup so the replay event path is Node-safe without a global prototype shim. | open | | 2026-09-10T07:45:33.930Z | |
| 11 | 03 | unrun-verify | .planning/phases/03-data-completion/deferred-items.md | | Repository type gate remains non-zero on pre-existing render/legacy and Tile contract diagnostics; owned Node tracer and data tests pass. | fixed | | 2026-09-10T07:45:45.249Z | 2026-09-10T07:58:56.466Z |
| 12 | 03 | unrun-verify | .planning/phases/03-data-completion/deferred-items.md | | Repository type gate remains non-zero on pre-existing render/legacy diagnostics; Tile contract diagnostics are resolved. | open | | 2026-09-10T07:58:50.208Z | |
| 13 | 03 | deviation | packages-user/data-common/src/store/tileStore.test.ts | | Applied ESLint/Prettier CRLF formatting required by the project after functional Tile tests passed. | open | | 2026-09-10T07:59:02.467Z | |
| 14 | 03 | stub | packages-user/data-state/src/core.ts | 166 | Existing deferred serialized event registration and map-event-id binding TODO; preserved by Plan 03-03. | fixed | | 2026-09-10T08:47:49.808Z | 2026-09-10T12:20:54.566Z |
| 15 | 03 | deviation | packages-user/data-common/src/replay/array.ts | | Repaired replay parameter encoding so diagnostic params remain original and deterministic. | open | | 2026-09-10T09:18:58.279Z | |
| 16 | 03 | deviation | packages-user/data-state/test/replayVerifier.ts | | Added a package-local verifier harness shared by Vitest and the Node runner to avoid composite-script import resolution. | open | | 2026-09-10T09:18:58.946Z | |
| 17 | 03 | deviation | packages-user/data-state/test/fixtures/closed-loop.ts | | Applied repository Prettier/CRLF formatting to the fixed replay fixture and runner files. | open | | 2026-09-10T09:18:59.589Z | |
| 18 | 03 | deviation | script/check-data-circular.ts | | Plan 03-15 scoped circular gate reports seven pre-existing legacy/render boundary cycles through data-state/src/legacy/move.ts; replay command class changes do not touch those imports. | open | | 2026-09-11T06:27:22.412Z | |
| 19 | 06 | skipped-test | packages-user/data-system/src/combat/damage.test.ts | | 06-01-1 suspected bug: calculateCritical yields info not matching nextValue (Finding #06-01-1) | fixed | | 2026-09-14T00:54:02.628Z | 2026-09-15T09:05:01.001Z |
| 20 | 06 | skipped-test | packages-user/data-system/src/combat/mapDamage.test.ts | | 06-01-2 suspected bug: MapDamage.deleteEnemy leaves enemy-sourced damage (Finding #06-01-2) | fixed | | 2026-09-14T00:54:03.338Z | 2026-09-15T09:05:02.090Z |
| 21 | 06 | skipped-test | packages-user/data-system/src/combat/combat.test.ts | | 06-01-3 suspected bug: CombatFlow.before truthy/falsy semantics inverted vs interface doc (Finding #06-01-3) | fixed | | 2026-09-14T00:54:04.044Z | 2026-09-15T09:05:02.930Z |
| 22 | 06 | skipped-test | packages-user/data-common/src/common/mover.test.ts | | backward(count>1) 方向摆动、净位移为零(#06-08-1),已 it.skip 待用户确认 | fixed | | 2026-09-14T09:03:38.649Z | 2026-09-15T12:58:50.953Z |
| 23 | 06 | skipped-test | packages-user/data-common/src/replay/array.test.ts | | 受阻塞缺口 G-06-04-A:多字节 bigint / 超 int32 int64 编解码缺陷 #06-04-1/#06-04-2 未修复,正确预期用例保持 it.skip | fixed | | 2026-09-15T02:46:32.026Z | 2026-09-15T10:51:28.234Z |
| 24 | 06 | skipped-test | packages-user/data-base/src/enemy/manager.test.ts | | 受阻塞缺口 G-06-03-A:复用映射未接入 createEnemy/createEnemyById(#06-03-1),四朝向复用生成独立怪物的正确预期用例保持 it.skip | fixed | | 2026-09-15T02:46:32.772Z | 2026-09-15T09:17:32.073Z |
| 25 | 06 | skipped-test | packages-user/data-base/src/hero/saveLoad.test.ts | | 受阻塞缺口 G-06-09-B:压缩档 loadDiff 未回退装备原始定义(#06-09-1),EquipmentState 百分比加成 Low/High 档正确预期用例保持 it.skip | fixed | | 2026-09-15T03:31:00.000Z | 2026-09-15T12:33:32.230Z |
| 26 | 06 | skipped-test | packages-user/data-base/src/hero/saveLoad.test.ts | | 受阻塞缺口 G-06-09-B:HeroEquipment.saveState 未深拷贝 equipped/slots(#06-09-2),经 HeroState 容器三档恢复装备映射的正确预期用例保持 it.skip | fixed | | 2026-09-15T03:31:01.000Z | 2026-09-15T12:33:33.035Z |
| 27 | 06 | skipped-test | packages-user/data-system/src/combat/context.test.ts | 625 | 受阻塞缺口 G-06-01-D:deleteAura 后再次 buildup 不回到基础值(#06-15-1,与 #06-01-4 同根因),正确预期用例保持 it.skip 待用户确认 | fixed | | 2026-09-15T05:23:29.159Z | 2026-09-15T09:05:03.731Z |
| 28 | 06 | deviation | packages-user/data-state/test/saveablesReal.perf.ts | | stage-1 fixture seeds the minimum 1 equipment instance (plan said no side load) because HeroEquipsStore.loadState raises error 58 with an empty equipment list | open | | 2026-09-16T08:20:22.513Z | |
````json
[
{
"id": 1,
"kind": "stub",
"phase": "01",
"file": "packages-user/data-state/src/core.ts",
"line": 153,
"description": "Serialized event registration and map-id binding remains an intentional deferred TODO.",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-08T15:06:40.634Z",
"resolved_at": "2026-09-10T12:20:52.319Z"
},
{
"id": 2,
"kind": "unrun-verify",
"phase": "01",
"file": ".planning/phases/01-event/01-05-SUMMARY.md",
"line": null,
"description": "Downstream implementation verification was not run because the user explicitly prohibited downstream plan execution.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-08T15:37:54.227Z",
"resolved_at": null
},
{
"id": 3,
"kind": "deviation",
"phase": "01",
"file": "packages-user/data-base/src/map/mapLayer.ts",
"line": null,
"description": "Replaced unsupported Map upsert runtime calls so the raw map event path runs under Node Vitest.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-08T15:54:23.173Z",
"resolved_at": null
},
{
"id": 4,
"kind": "skipped-test",
"phase": "02",
"file": "packages-user/data-common/src/common/mover.test.ts",
"line": null,
"description": "4 个 it.skip 坐标回写回归用例(x/y 正交、斜向、传送),待 02-02 修复 mover.ts:651 后翻绿",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-09T07:51:25.555Z",
"resolved_at": "2026-09-09T09:34:39.843Z"
},
{
"id": 5,
"kind": "stub",
"phase": "02",
"file": "packages-user/data-system/src/path/system.ts",
"line": 254,
"description": "interrupt() is an intentional placeholder that only stops the in-flight move; takeover sequencing (stop-then-await per approved option 1) is implemented by 02-03 Task 4",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-09T09:34:59.707Z",
"resolved_at": "2026-09-09T13:24:24.755Z"
},
{
"id": 6,
"kind": "stub",
"phase": "02",
"file": "packages-user/data-state/src/hero/moverImpl.ts",
"line": 284,
"description": "Existing cannotEnter() is intentionally empty because no event trigger corresponds to movement blocked by an impassable mask; D-08 direct OnTouch dispatch handles allowed adjacent no-pass targets.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-10T01:38:48.570Z",
"resolved_at": null
},
{
"id": 7,
"kind": "stub",
"phase": "03",
"file": "packages-user/data-common/src/save/memory.ts",
"line": 90,
"description": "MemorySaveSystem.saveAutosaveToDB is an intentional no-op because Node never persists to IndexedDB.",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-10T07:45:16.944Z",
"resolved_at": "2026-09-11T06:11:48.592Z"
},
{
"id": 8,
"kind": "stub",
"phase": "03",
"file": "packages-user/data-common/src/save/memory.ts",
"line": 90,
"description": "MemorySaveSystem.saveAutosaveToDB is an intentional no-op because Node never persists to IndexedDB.",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-10T07:45:32.524Z",
"resolved_at": "2026-09-11T06:11:49.370Z"
},
{
"id": 9,
"kind": "stub",
"phase": "03",
"file": "packages-user/data-state/src/legacy/dependencies.ts",
"line": 53,
"description": "Node legacy dependency boundary intentionally registers no browser loading callbacks.",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-10T07:45:33.228Z",
"resolved_at": "2026-09-11T06:04:34.207Z"
},
{
"id": 10,
"kind": "deviation",
"phase": "03",
"file": "packages-user/data-base/src/map/mapLayer.ts",
"line": 216,
"description": "Replaced Map.getOrInsertComputed with explicit Map lookup so the replay event path is Node-safe without a global prototype shim.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-10T07:45:33.930Z",
"resolved_at": null
},
{
"id": 11,
"kind": "unrun-verify",
"phase": "03",
"file": ".planning/phases/03-data-completion/deferred-items.md",
"line": null,
"description": "Repository type gate remains non-zero on pre-existing render/legacy and Tile contract diagnostics; owned Node tracer and data tests pass.",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-10T07:45:45.249Z",
"resolved_at": "2026-09-10T07:58:56.466Z"
},
{
"id": 12,
"kind": "unrun-verify",
"phase": "03",
"file": ".planning/phases/03-data-completion/deferred-items.md",
"line": null,
"description": "Repository type gate remains non-zero on pre-existing render/legacy diagnostics; Tile contract diagnostics are resolved.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-10T07:58:50.208Z",
"resolved_at": null
},
{
"id": 13,
"kind": "deviation",
"phase": "03",
"file": "packages-user/data-common/src/store/tileStore.test.ts",
"line": null,
"description": "Applied ESLint/Prettier CRLF formatting required by the project after functional Tile tests passed.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-10T07:59:02.467Z",
"resolved_at": null
},
{
"id": 14,
"kind": "stub",
"phase": "03",
"file": "packages-user/data-state/src/core.ts",
"line": 166,
"description": "Existing deferred serialized event registration and map-event-id binding TODO; preserved by Plan 03-03.",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-10T08:47:49.808Z",
"resolved_at": "2026-09-10T12:20:54.566Z"
},
{
"id": 15,
"kind": "deviation",
"phase": "03",
"file": "packages-user/data-common/src/replay/array.ts",
"line": null,
"description": "Repaired replay parameter encoding so diagnostic params remain original and deterministic.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-10T09:18:58.279Z",
"resolved_at": null
},
{
"id": 16,
"kind": "deviation",
"phase": "03",
"file": "packages-user/data-state/test/replayVerifier.ts",
"line": null,
"description": "Added a package-local verifier harness shared by Vitest and the Node runner to avoid composite-script import resolution.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-10T09:18:58.946Z",
"resolved_at": null
},
{
"id": 17,
"kind": "deviation",
"phase": "03",
"file": "packages-user/data-state/test/fixtures/closed-loop.ts",
"line": null,
"description": "Applied repository Prettier/CRLF formatting to the fixed replay fixture and runner files.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-10T09:18:59.589Z",
"resolved_at": null
},
{
"id": 18,
"kind": "deviation",
"phase": "03",
"file": "script/check-data-circular.ts",
"line": null,
"description": "Plan 03-15 scoped circular gate reports seven pre-existing legacy/render boundary cycles through data-state/src/legacy/move.ts; replay command class changes do not touch those imports.",
"status": "open",
"reason": "",
"recorded_at": "2026-09-11T06:27:22.412Z",
"resolved_at": null
},
{
"id": 19,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-system/src/combat/damage.test.ts",
"line": null,
"description": "06-01-1 suspected bug: calculateCritical yields info not matching nextValue (Finding #06-01-1)",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-14T00:54:02.628Z",
"resolved_at": "2026-09-15T09:05:01.001Z"
},
{
"id": 20,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-system/src/combat/mapDamage.test.ts",
"line": null,
"description": "06-01-2 suspected bug: MapDamage.deleteEnemy leaves enemy-sourced damage (Finding #06-01-2)",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-14T00:54:03.338Z",
"resolved_at": "2026-09-15T09:05:02.090Z"
},
{
"id": 21,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-system/src/combat/combat.test.ts",
"line": null,
"description": "06-01-3 suspected bug: CombatFlow.before truthy/falsy semantics inverted vs interface doc (Finding #06-01-3)",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-14T00:54:04.044Z",
"resolved_at": "2026-09-15T09:05:02.930Z"
},
{
"id": 22,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-common/src/common/mover.test.ts",
"line": null,
"description": "backward(count>1) 方向摆动、净位移为零(#06-08-1),已 it.skip 待用户确认",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-14T09:03:38.649Z",
"resolved_at": "2026-09-15T12:58:50.953Z"
},
{
"id": 23,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-common/src/replay/array.test.ts",
"line": null,
"description": "受阻塞缺口 G-06-04-A:多字节 bigint / 超 int32 int64 编解码缺陷 #06-04-1/#06-04-2 未修复,正确预期用例保持 it.skip",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-15T02:46:32.026Z",
"resolved_at": "2026-09-15T10:51:28.234Z"
},
{
"id": 24,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-base/src/enemy/manager.test.ts",
"line": null,
"description": "受阻塞缺口 G-06-03-A:复用映射未接入 createEnemy/createEnemyById(#06-03-1),四朝向复用生成独立怪物的正确预期用例保持 it.skip",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-15T02:46:32.772Z",
"resolved_at": "2026-09-15T09:17:32.073Z"
},
{
"id": 25,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-base/src/hero/saveLoad.test.ts",
"line": null,
"description": "受阻塞缺口 G-06-09-B:压缩档 loadDiff 未回退装备原始定义(#06-09-1),EquipmentState 百分比加成 Low/High 档正确预期用例保持 it.skip",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-15T03:31:00.000Z",
"resolved_at": "2026-09-15T12:33:32.230Z"
},
{
"id": 26,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-base/src/hero/saveLoad.test.ts",
"line": null,
"description": "受阻塞缺口 G-06-09-B:HeroEquipment.saveState 未深拷贝 equipped/slots(#06-09-2),经 HeroState 容器三档恢复装备映射的正确预期用例保持 it.skip",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-15T03:31:01.000Z",
"resolved_at": "2026-09-15T12:33:33.035Z"
},
{
"id": 27,
"kind": "skipped-test",
"phase": "06",
"file": "packages-user/data-system/src/combat/context.test.ts",
"line": 625,
"description": "受阻塞缺口 G-06-01-D:deleteAura 后再次 buildup 不回到基础值(#06-15-1,与 #06-01-4 同根因),正确预期用例保持 it.skip 待用户确认",
"status": "fixed",
"reason": "",
"recorded_at": "2026-09-15T05:23:29.159Z",
"resolved_at": "2026-09-15T09:05:03.731Z"
},
{
"id": 28,
"kind": "deviation",
"phase": "06",
"file": "packages-user/data-state/test/saveablesReal.perf.ts",
"line": null,
"description": "stage-1 fixture seeds the minimum 1 equipment instance (plan said no side load) because HeroEquipsStore.loadState raises error 58 with an empty equipment list",
"status": "open",
"reason": "",
"recorded_at": "2026-09-16T08:20:22.513Z",
"resolved_at": null
}
]
````