mirror of
https://github.com/motajs/template.git
synced 2026-09-13 10:18:50 +08:00
docs(03): create replay and event gap plans
This commit is contained in:
parent
c41b84bef3
commit
2b471b83ed
159
.planning/phases/03-data-completion/03-17-PLAN.md
Normal file
159
.planning/phases/03-data-completion/03-17-PLAN.md
Normal file
@ -0,0 +1,159 @@
|
||||
---
|
||||
phase: 03-data-completion
|
||||
plan: 17
|
||||
type: execute
|
||||
wave: 10
|
||||
depends_on: [03-15, 03-16]
|
||||
files_modified:
|
||||
- packages-user/data-state/src/replay/commands.ts
|
||||
- packages-user/data-state/src/replay/commands.test.ts
|
||||
- .planning/phases/03-data-completion/03-REPLAY-CONTRACT.md
|
||||
files_deleted: []
|
||||
autonomous: true
|
||||
requirements: [DATA-01]
|
||||
gap_closure: true
|
||||
gap_ids: [CORR-03-08, CORR-03-09, CORR-03-10, CORR-03-11]
|
||||
estimate:
|
||||
tokens: 30000
|
||||
raw_tokens: 30000
|
||||
tasks: 2
|
||||
confidence: low
|
||||
must_haves:
|
||||
truths:
|
||||
- "CORR-03-08: replay command implementations contain no replay-safety utility import or constructor-time decoration; decorator placement remains owned by the user on low-level state mutation methods."
|
||||
- "CORR-03-09: directional and auto-pathfinding replay commands await their returned movement controller completion before their Promise<boolean> resolves, so ReplaySandbox cannot begin the next step early."
|
||||
- "CORR-03-10: up/right/down/left are four registrations of one parameterized directional command class, not four duplicate command classes."
|
||||
- "CORR-03-11: the replay registry uses ordinary formatted construction with no manual formatter-suppression comments."
|
||||
- "ReplayCommandCode values, REPLAY_COMMAND_ORDER, IReplayCommand, IReplayCommandItem, CoreState registry ownership, item/equipment synchronous behavior, and first-divergence verifier boundaries remain stable."
|
||||
- "Legacy/save files and user-owned decorator placement are outside this correction's modified and deleted file sets."
|
||||
artifacts:
|
||||
- path: "packages-user/data-state/src/replay/commands.ts"
|
||||
provides: "One parameterized directional command, awaited movement/pathfinding commands, and simple stable registry construction"
|
||||
exports: ["createReplayCommandItems", "registerReplayCommandItems"]
|
||||
- path: "packages-user/data-state/src/replay/commands.test.ts"
|
||||
provides: "Deferred-controller ordering, class-collapse, safety-boundary, and registry-format regressions"
|
||||
- path: ".planning/phases/03-data-completion/03-REPLAY-CONTRACT.md"
|
||||
provides: "Latest user-authoritative replay completion and ownership correction"
|
||||
key_links:
|
||||
- "ReplaySandbox.step -> IReplayCommand.execute -> movement controller.onEnd -> next replay step"
|
||||
- "ReplayCommandCode order -> ReplayDirectionCommand(direction) instances -> ReplaySystem registration"
|
||||
- "commands.ts import/constructor surface -> no replay-safety decoration in command implementation"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Close CORR-03-08 through CORR-03-11 in the replay command implementation. Remove replay-safety decoration from the command layer, make directional and pathfinding commands await their controllers, collapse the four directional implementations into one parameterized class, and remove registry formatter suppressions while preserving every existing replay interface and stable code.
|
||||
|
||||
Purpose: The latest user review supersedes the earlier command-layer decoration and synchronous completion shape. Replay sequencing must observe real movement completion, while the user retains ownership of the eventual low-level state-mutation decorator placement.
|
||||
Output: Corrected replay command source, regression tests, and a replay contract record that matches the latest user-authoritative behavior.
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
@C:/Users/book/.config/opencode/gsd-core/workflows/execute-plan.md
|
||||
@C:/Users/book/.config/opencode/gsd-core/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/REQUIREMENTS.md
|
||||
@.planning/STATE.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/phases/03-data-completion/03-CONTEXT.md
|
||||
@.planning/phases/03-data-completion/03-REPLAY-CONTRACT.md
|
||||
@.planning/phases/03-data-completion/03-VERIFICATION.md
|
||||
@.planning/phases/03-data-completion/03-15-SUMMARY.md
|
||||
@.planning/phases/03-data-completion/03-16-SUMMARY.md
|
||||
@packages-user/data-state/src/replay/commands.ts
|
||||
@packages-user/data-state/src/replay/commands.test.ts
|
||||
@packages-user/data-state/src/replay/types.ts
|
||||
@packages-user/data-common/src/replay/types.ts
|
||||
@packages-user/data-common/src/replay/func.ts
|
||||
@packages-user/data-common/src/replay/sandbox.ts
|
||||
@packages-user/data-base/src/hero/attribute.ts
|
||||
@dev.md
|
||||
</context>
|
||||
|
||||
## Source Audit
|
||||
|
||||
| Source | ID | Item | Plan | Status |
|
||||
|---|---|---|---|---|
|
||||
| GOAL | — | Data-layer replay remains independently usable and deterministic in Node | 03-17 | COVERED |
|
||||
| REQ | DATA-01 | Replay commands remain usable behind the existing data-side interfaces | 03-17 | COVERED |
|
||||
| RESEARCH | D-05/D-07/D-08/D-25 | State-changing replay boundaries, explicit failure, stable top-level codes, and stable order | 03-17 | COVERED |
|
||||
| CONTEXT | S-02 latest user correction | Await movement/pathfinding completion in command Promises; this latest user requirement supersedes the older synchronous correction record | 03-17 | COVERED |
|
||||
| CONTEXT | S-04 | Do not place or relocate user-owned state decorators | 03-17 | COVERED |
|
||||
| CONTEXT | CORR-03-08..11 | Four-gap review cluster's replay implementation corrections | 03-17 | COVERED |
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="tracer">
|
||||
<name>Task 1: CORR-03-08/09/10 awaited parameterized replay path</name>
|
||||
<gap_id>CORR-03-08, CORR-03-09, CORR-03-10</gap_id>
|
||||
<files>packages-user/data-state/src/replay/commands.ts, packages-user/data-state/src/replay/commands.test.ts, .planning/phases/03-data-completion/03-REPLAY-CONTRACT.md</files>
|
||||
<read_first>packages-user/data-state/src/replay/commands.ts, packages-user/data-state/src/replay/commands.test.ts, packages-user/data-state/src/replay/types.ts, packages-user/data-common/src/replay/types.ts, packages-user/data-common/src/replay/sandbox.ts, packages-user/data-system/src/path/types.ts, packages-user/data-system/src/path/system.ts, packages-user/data-base/src/hero/attribute.ts, .planning/phases/03-data-completion/03-REPLAY-CONTRACT.md, .planning/phases/03-data-completion/03-CONTEXT.md, dev.md</read_first>
|
||||
<action>Remove the replay-safety utility import from the command implementation and delete every constructor-time wrapper that manually decorates a command method; do not add a replacement decorator, move a decorator to a state class, or edit `HeroAttribute.set`, `HeroAttribute.mul`, or any other user-owned mutation method (CORR-03-08, S-04). Replace the four directional command class bodies with one `ReplayDirectionCommand` that receives the existing `IReplayCommandState` and a `FaceDirection` in its constructor, stores that direction, starts the mover, awaits the returned controller's `onEnd`, and resolves `true` only after completion; a missing/active/failed move still resolves `false`. Keep the four stable enum entries and construct four fresh parameterized instances in their existing order. Change auto-pathfinding to await `IPathfindingController.controller.onEnd` before resolving, while retaining its numeric parameter validation and null-result failure. Keep item, equip, and unequip calls synchronous behind the unchanged `Promise<boolean>` interface. Replace the old command tests with a real deferred-controller sequence assertion proving the next replay step cannot start before directional movement or pathfinding completion, and assert the four directional entries share the one command constructor while carrying distinct directions. Record this latest user-authoritative completion/ownership rule in `03-REPLAY-CONTRACT.md` without changing the public replay interfaces, route format, stable codes, legacy/save path, or user-owned decorator placement (CORR-03-09, CORR-03-10, D-07, D-08, D-25).</action>
|
||||
<verify>
|
||||
<automated>pnpm exec vitest run packages-user/data-state/src/replay/commands.test.ts</automated>
|
||||
<fails_when>Vitest exits non-zero, a deferred movement/pathfinding command resolves before its controller completion signal, the next-step assertion observes early execution, the four directional entries use different command constructors, command behavior calls the replay-safety utility, or any user-owned decorator-placement assertion changes.</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- `commands.ts` has one parameterized directional command implementation and no command-layer replay-safety utility import or constructor decoration (CORR-03-08, CORR-03-10).
|
||||
- Directional and auto-pathfinding command Promises remain pending until their returned controller `onEnd` settles; item/equipment behavior remains synchronous at the existing command boundary (CORR-03-09).
|
||||
- The focused test file has a Chinese single-line coverage comment immediately before every `it` call added or modified, and no test edits touch `packages-user/data-base/src/hero/attribute.ts` (D-03, D-04, S-04).
|
||||
</acceptance_criteria>
|
||||
<done>The real replay command path awaits movement completion, uses one directional class, and contains no command-layer replay-safety decoration.</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: CORR-03-11 simple replay registry and full regression gates</name>
|
||||
<gap_id>CORR-03-11</gap_id>
|
||||
<files>packages-user/data-state/src/replay/commands.ts, packages-user/data-state/src/replay/commands.test.ts</files>
|
||||
<read_first>packages-user/data-state/src/replay/commands.ts, packages-user/data-state/src/replay/commands.test.ts, packages-user/data-state/src/replay/types.ts, packages-user/data-common/src/replay/system.ts, packages-user/data-common/src/replay/sandbox.ts, .planning/phases/03-data-completion/03-REPLAY-CONTRACT.md, dev.md</read_first>
|
||||
<action>Rewrite the ordered registry construction as ordinary formatted object literals with direct `new ReplayDirectionCommand(state, direction)` and direct construction of the five non-directional command classes. Remove the manual formatter-suppression comments from this registry and let the repository formatter decide line breaks. Extend the source/behavior regression to assert stable enum order, fresh command instances, one directional constructor name, absence of command-layer decoration, and unchanged custom `IReplayCommandItem` registration. Keep the test's generic replay-safety helper coverage separate from production command construction, preserve Chinese comments before every changed `it`, and leave legacy/save files, `packages-user/data-base/src/hero/attribute.ts`, `ReplaySystem`, `ReplaySandbox`, and all route/enum interfaces untouched (CORR-03-08, CORR-03-10, CORR-03-11, D-04, S-04).</action>
|
||||
<verify>
|
||||
<automated>$commands = Get-Content -Raw 'packages-user/data-state/src/replay/commands.ts'; if ($commands -match 'shouldReplay') { throw 'Command implementation still references replay-safety decoration' }; if ($commands -match 'prettier-ignore') { throw 'Replay registry still contains manual formatter suppression' }; if ($commands -match 'class\s+Replay(?:Up|Right|Down|Left)Command\b') { throw 'Duplicate directional command classes remain' }; if ($commands -notmatch 'class\s+ReplayDirectionCommand\b') { throw 'Parameterized directional command class is missing' }; $test = Get-Content -Raw 'packages-user/data-state/src/replay/commands.test.ts'; if ($test -notmatch 'ReplayDirectionCommand') { throw 'Directional constructor regression is missing' }; pnpm exec vitest run packages-user/data-state/src/replay/commands.test.ts; if ($?) { pnpm test:ci packages-user/data-common packages-user/data-base packages-user/data-system packages-user/data-state }; if ($?) { pnpm test:data-node }; if ($?) { pnpm exec tsx script/check-data-type.ts }; if ($?) { pnpm exec tsx script/check-data-circular.ts }; if ($?) { pnpm exec prettier --check packages-user/data-state/src/replay/commands.ts packages-user/data-state/src/replay/commands.test.ts }</automated>
|
||||
<fails_when>Any source assertion finds command-layer decoration, a manual formatter suppression, or a duplicate directional class; the Chinese-comment scan/test suite, Node replay gate, scoped type gate, scoped circular gate, or Prettier check exits non-zero.</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- The registry has no manually inserted formatter-suppression comments and remains in the exact `REPLAY_COMMAND_ORDER` (CORR-03-11, D-08, D-25).
|
||||
- The full data suite and independent Node replay pass without modifying legacy/save code or user-owned decorator placement (D-04, D-15, S-01, S-04).
|
||||
</acceptance_criteria>
|
||||
<done>The replay registry is normally formatted and structurally corrected, with all four replay gaps covered by focused and phase data gates.</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<threat_model>
|
||||
## Trust Boundaries
|
||||
|
||||
| Boundary | Description |
|
||||
|---|---|
|
||||
| replay route -> command implementation | Encoded replay parameters select state-changing movement or equipment actions. |
|
||||
| movement command -> controller completion | A deferred controller determines when the replay step is complete. |
|
||||
| command source -> user-owned decorator boundary | Command code must not claim ownership of low-level replay-safety placement. |
|
||||
|
||||
## STRIDE Threat Register
|
||||
|
||||
| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
|
||||
|---|---|---|---|---|---|
|
||||
| T-03-40 | Denial of service | movement/pathfinding replay step | high | mitigate | Await the returned controller completion and test that a subsequent step remains blocked until settlement. |
|
||||
| T-03-41 | Tampering | replay command registry | high | mitigate | Use one parameterized directional class, stable enum order, direct construction, and source-level duplicate/suppression checks. |
|
||||
| T-03-42 | Tampering | replay-safety ownership | high | mitigate | Remove command-layer decoration and assert the user-owned attribute file remains outside the correction. |
|
||||
| T-03-SC | Tampering | npm/pip/cargo installs | low | accept | No package installation is planned. |
|
||||
</threat_model>
|
||||
|
||||
<verification>
|
||||
- `pnpm exec vitest run packages-user/data-state/src/replay/commands.test.ts`
|
||||
- `pnpm test:ci packages-user/data-common packages-user/data-base packages-user/data-system packages-user/data-state`
|
||||
- `pnpm test:data-node`
|
||||
- `pnpm exec tsx script/check-data-type.ts`
|
||||
- `pnpm exec tsx script/check-data-circular.ts`
|
||||
- Scoped ESLint and Prettier checks on the replay implementation and test files
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
CORR-03-08, CORR-03-09, CORR-03-10, and CORR-03-11 are closed when replay command implementations contain no command-layer replay-safety decoration, movement/pathfinding steps await controller completion, four directions use one parameterized class, the registry has ordinary formatting, and stable replay/data gates remain green.
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
Create `.planning/phases/03-data-completion/03-17-SUMMARY.md` when done
|
||||
</output>
|
||||
186
.planning/phases/03-data-completion/03-18-PLAN.md
Normal file
186
.planning/phases/03-data-completion/03-18-PLAN.md
Normal file
@ -0,0 +1,186 @@
|
||||
---
|
||||
phase: 03-data-completion
|
||||
plan: 18
|
||||
type: execute
|
||||
wave: 10
|
||||
depends_on: [03-12, 03-13, 03-16]
|
||||
files_modified:
|
||||
- packages-user/data-state/src/event/index.ts
|
||||
- packages-user/data-state/src/event/map.ts
|
||||
- packages-user/data-state/src/event/hero.ts
|
||||
- packages-user/data-state/src/event/event.ts
|
||||
- packages-user/data-state/src/event/runtime.ts
|
||||
- packages-user/data-state/src/event/registrations.ts
|
||||
- packages-user/data-state/src/event/event.test.ts
|
||||
- packages-user/data-state/src/core.ts
|
||||
- .planning/phases/03-data-completion/03-EVENT-CONTRACT.md
|
||||
files_deleted: []
|
||||
autonomous: true
|
||||
requirements: [DATA-01]
|
||||
gap_closure: true
|
||||
gap_ids: [CORR-03-12, CORR-03-13]
|
||||
estimate:
|
||||
tokens: 36000
|
||||
raw_tokens: 36000
|
||||
tasks: 3
|
||||
confidence: low
|
||||
must_haves:
|
||||
truths:
|
||||
- "CORR-03-12: packages-user/data-state/src/event/index.ts contains export statements only; it has no imports, registration assembly, or registration logic."
|
||||
- "CORR-03-13: each approved event registration is an explicit class owning its stable name and callable func; registration assembly is a simple direct construction list in a non-index module."
|
||||
- "eventTouchFront implementation and its registration class belong to the hero event layer, while event.ts retains only event-control insertion behavior."
|
||||
- "The approved eight registration names and stable order remain unchanged, and CoreState passes the assembled entries to GameEventSystem through the existing seam."
|
||||
- "Event semantics, awaited movement/event actions, Statement[] direct insertion, null/missing-target safety, legacy/save boundaries, and user-owned decorator placement remain unchanged."
|
||||
artifacts:
|
||||
- path: "packages-user/data-state/src/event/index.ts"
|
||||
provides: "Export-only event barrel"
|
||||
- path: "packages-user/data-state/src/event/registrations.ts"
|
||||
provides: "Simple stable-order construction of the eight class-based registrations"
|
||||
- path: "packages-user/data-state/src/event/map.ts"
|
||||
provides: "Map event functions and map registration classes"
|
||||
- path: "packages-user/data-state/src/event/hero.ts"
|
||||
provides: "Hero movement/front-touch functions and hero registration classes"
|
||||
- path: "packages-user/data-state/src/event/event.ts"
|
||||
provides: "Temporary event sequence/body functions and event registration classes"
|
||||
- path: "packages-user/data-state/src/event/runtime.ts"
|
||||
provides: "Shared environment target resolution without a barrel cycle"
|
||||
key_links:
|
||||
- "registrations.ts direct class construction -> CoreState -> GameEventSystem built-in table"
|
||||
- "hero TouchFront registration -> hero eventTouchFront -> existing ordered EventExecutor invocation"
|
||||
- "event/index.ts export statements -> public event symbols without executing assembly"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Close CORR-03-12 and CORR-03-13 by making the event barrel export-only and replacing module factory registrations with explicit class-based registrations. Move eventTouchFront to the hero event layer, keep the existing eight-name order and semantics, and assemble registrations in a separate simple module used directly by CoreState.
|
||||
|
||||
Purpose: The event module boundaries must expose declarations without hiding initialization/registration assembly in the barrel, while each registration object must make its stable name and function ownership explicit.
|
||||
Output: Export-only event index, module-owned registration classes, separate registration assembly module, hero-owned front-touch operation, updated CoreState wiring, and regression coverage.
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
@C:/Users/book/.config/opencode/gsd-core/workflows/execute-plan.md
|
||||
@C:/Users/book/.config/opencode/gsd-core/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/REQUIREMENTS.md
|
||||
@.planning/STATE.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/phases/03-data-completion/03-CONTEXT.md
|
||||
@.planning/phases/03-data-completion/03-EVENT-CONTRACT.md
|
||||
@.planning/phases/03-data-completion/03-VERIFICATION.md
|
||||
@.planning/phases/03-data-completion/03-12-SUMMARY.md
|
||||
@.planning/phases/03-data-completion/03-13-SUMMARY.md
|
||||
@packages-user/data-state/src/event/index.ts
|
||||
@packages-user/data-state/src/event/map.ts
|
||||
@packages-user/data-state/src/event/hero.ts
|
||||
@packages-user/data-state/src/event/event.ts
|
||||
@packages-user/data-state/src/event/types.ts
|
||||
@packages-user/data-state/src/core.ts
|
||||
@packages-user/data-system/src/event/system.ts
|
||||
@dev.md
|
||||
</context>
|
||||
|
||||
## Source Audit
|
||||
|
||||
| Source | ID | Item | Plan | Status |
|
||||
|---|---|---|---|---|
|
||||
| GOAL | — | Data-side event operations remain usable in the independent replay path | 03-18 | COVERED |
|
||||
| REQ | DATA-01 | Event built-ins remain available through the existing GameEventSystem assembly | 03-18 | COVERED |
|
||||
| RESEARCH | D-10/D-11/D-24/D-27 | Top-level assembly, minimum event scope, approved names, `(param, env)`, and safe behavior | 03-18 | COVERED |
|
||||
| CONTEXT | CORR-03-12 | Export-only event index and external registration assembly | 03-18 | COVERED |
|
||||
| CONTEXT | CORR-03-13 | Class-owned registrations with hero-level front touch and no scope expansion | 03-18 | COVERED |
|
||||
| CONTEXT | S-01/S-04 | Preserve legacy/save code and user-owned replay decorator placement | 03-18 | COVERED |
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="tracer">
|
||||
<name>Task 1: CORR-03-13 class-owned event registrations and hero front-touch path</name>
|
||||
<gap_id>CORR-03-13</gap_id>
|
||||
<files>packages-user/data-state/src/event/map.ts, packages-user/data-state/src/event/hero.ts, packages-user/data-state/src/event/event.ts, packages-user/data-state/src/event/runtime.ts</files>
|
||||
<read_first>packages-user/data-state/src/event/map.ts, packages-user/data-state/src/event/hero.ts, packages-user/data-state/src/event/event.ts, packages-user/data-state/src/event/types.ts, packages-user/data-system/src/event/types.ts, packages-user/data-system/src/event/executor.ts, packages-user/data-common/src/event/types.ts, packages-user/data-base/src/map/types.ts, .planning/phases/03-data-completion/03-EVENT-CONTRACT.md, .planning/phases/03-data-completion/03-CONTEXT.md, dev.md</read_first>
|
||||
<action>Define explicit registration classes beside the existing handlers: three map classes in `map.ts`, three hero classes in `hero.ts` for move, move-step, and front touch, and two event-control classes in `event.ts` for the two insertion operations. Each class must implement the existing AnonTokyo built-in shape and own a typed stable `name` field plus the corresponding `func` field; do not route registration through a generic handler factory or opaque descriptor array. Move `eventTouchFront`, its event-source collection helpers, and its registration ownership into `hero.ts`; keep its current OnTouch ordering, environment construction, no-movement behavior, and awaited executor call. Move shared map/layer target resolution into a small `runtime.ts` declaration module if needed so map and hero imports remain acyclic. Keep `event.ts` responsible for `eventInsertEvents` and direct `Statement[]` `eventInsertEvent`, preserving the existing nested-depth guard and store/interpreter semantics. Keep simple compatibility builders temporarily if the existing barrel needs them during this task, but make them instantiate the explicit registration classes and preserve the exact eight-name order; the following task removes barrel assembly. Do not alter event parameter interfaces, event scope, legacy/save paths, or user-owned decorator placement (CORR-03-13, D-10, D-11, D-24, D-27, S-01, S-04).</action>
|
||||
<verify>
|
||||
<automated>pnpm exec vitest run packages-user/data-state/src/event/event.test.ts packages-user/data-system/src/event/eventDispatch.test.ts</automated>
|
||||
<fails_when>Focused event or dispatch tests exit non-zero, front-touch registration remains owned by event.ts, a registration class does not expose its own stable name/function pair, event ordering/awaiting/direct-body semantics change, or a new import cycle prevents the event path from loading.</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- The eight approved handlers retain their current behavior and stable names; `eventTouchFront` and its registration class are defined in `hero.ts` (CORR-03-13, D-24).
|
||||
- Registration classes own the callable function and stable name directly, with no generic factory/descriptor mechanism controlling their identity (CORR-03-13).
|
||||
- New or modified `it` calls in the focused event tests have Chinese single-line coverage comments immediately before them (D-03, D-04).
|
||||
</acceptance_criteria>
|
||||
<done>The production event handlers and class-owned registrations provide the same event behavior, with front touch owned by the hero layer.</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: CORR-03-12 move assembly out of the event barrel</name>
|
||||
<gap_id>CORR-03-12, CORR-03-13</gap_id>
|
||||
<files>packages-user/data-state/src/event/index.ts, packages-user/data-state/src/event/registrations.ts, packages-user/data-state/src/core.ts, .planning/phases/03-data-completion/03-EVENT-CONTRACT.md</files>
|
||||
<read_first>packages-user/data-state/src/event/index.ts, packages-user/data-state/src/event/map.ts, packages-user/data-state/src/event/hero.ts, packages-user/data-state/src/event/event.ts, packages-user/data-state/src/event/runtime.ts, packages-user/data-state/src/core.ts, packages-user/data-system/src/event/system.ts, .planning/phases/03-data-completion/03-EVENT-CONTRACT.md, .planning/phases/03-data-completion/03-CONTEXT.md, dev.md</read_first>
|
||||
<action>Create `event/registrations.ts` as the sole assembly module. Its factory must return one direct, readable list of new registration class instances in the existing order: set block, move block, delete block, move hero, move hero step, touch front, insert events, insert event. Change CoreState to import this factory from the assembly module rather than relying on the event barrel. Reduce `event/index.ts` to export statements only, re-exporting declarations without importing or invoking them. Remove the temporary per-module builders once the direct assembly is wired. Update `03-EVENT-CONTRACT.md` to record that the index is export-only, `registrations.ts` owns order assembly, each class owns `name`/`func`, and front touch belongs to hero; preserve the eight names, existing event semantics, and no legacy catalog expansion (CORR-03-12, CORR-03-13, D-10, D-11, S-01).</action>
|
||||
<verify>
|
||||
<automated>$index = Get-Content -Raw 'packages-user/data-state/src/event/index.ts'; if ($index -match '(?m)^\s*import\s') { throw 'Event index still imports registration code' }; if ($index -match '(?m)^\s*(?:export\s+)?(?:async\s+)?function\s') { throw 'Event index still declares assembly logic' }; $registration = Get-Content -Raw 'packages-user/data-state/src/event/registrations.ts'; foreach ($token in @('new SetBlockEventRegistration', 'new MoveBlockEventRegistration', 'new DeleteBlockEventRegistration', 'new MoveHeroEventRegistration', 'new MoveHeroStepEventRegistration', 'new TouchFrontEventRegistration', 'new InsertEventsEventRegistration', 'new InsertEventEventRegistration')) { if ($registration -notmatch [regex]::Escape($token)) { throw "Missing direct registration construction: $token" } }; $core = Get-Content -Raw 'packages-user/data-state/src/core.ts'; if ($core -notmatch "event/registrations") { throw 'CoreState does not consume the external registration assembly module' }; pnpm exec vitest run packages-user/data-state/src/event/event.test.ts packages-user/data-system/src/event/eventDispatch.test.ts; if ($?) { pnpm exec tsx script/check-data-type.ts }; if ($?) { pnpm exec prettier --check packages-user/data-state/src/event/index.ts packages-user/data-state/src/event/registrations.ts packages-user/data-state/src/event/map.ts packages-user/data-state/src/event/hero.ts packages-user/data-state/src/event/event.ts packages-user/data-state/src/event/runtime.ts packages-user/data-state/src/core.ts .planning/phases/03-data-completion/03-EVENT-CONTRACT.md }</automated>
|
||||
<fails_when>The event index contains any import or function declaration, the assembly module omits any approved class/order entry, CoreState still consumes barrel-owned assembly, focused tests/type gate/Prettier exit non-zero, or the updated contract omits the new ownership boundaries.</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- `event/index.ts` contains only `export` statements and does not assemble registrations (CORR-03-12).
|
||||
- `registrations.ts` is a readable direct construction list, and CoreState consumes it without a second registration owner (CORR-03-12, CORR-03-13, D-10).
|
||||
- The contract record explicitly preserves stable order and event semantics while recording hero ownership of front touch (D-11, D-24, D-27).
|
||||
</acceptance_criteria>
|
||||
<done>Event registration assembly has moved out of the barrel into the explicit class-based assembly module and remains wired to GameEventSystem.</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 3: CORR-03-12/13 registration ownership regression matrix</name>
|
||||
<gap_id>CORR-03-12, CORR-03-13</gap_id>
|
||||
<files>packages-user/data-state/src/event/event.test.ts</files>
|
||||
<read_first>packages-user/data-state/src/event/event.test.ts, packages-user/data-state/src/event/index.ts, packages-user/data-state/src/event/registrations.ts, packages-user/data-state/src/event/map.ts, packages-user/data-state/src/event/hero.ts, packages-user/data-state/src/event/event.ts, packages-user/data-state/src/core.ts, .planning/phases/03-data-completion/03-EVENT-CONTRACT.md, dev.md</read_first>
|
||||
<action>Extend the focused regression through the real `registrations.ts` assembly and CoreState interpreter. Assert the eight names and existing order, that every registration instance owns its own name/function properties, that the front-touch registration constructor originates from the hero module, and that the event barrel source contains exports only. Retain behavior assertions for map mutations, awaited hero/event actions, front OnTouch ordering/no movement, direct Statement[] insertion, id-sequence insertion, and safe missing targets. Add Chinese single-line comments immediately before each new or modified `it` call. Do not assert or implement any expanded legacy event catalog, save change, replay decorator move, or altered public event parameter contract (CORR-03-12, CORR-03-13, D-03, D-04, D-11, D-24, S-01, S-04).</action>
|
||||
<verify>
|
||||
<automated>$lines = Get-Content -LiteralPath 'packages-user/data-state/src/event/event.test.ts'; for ($i = 0; $i -lt $lines.Count; $i++) { if ($lines[$i] -match '^\s*it(?:\.[A-Za-z]+)*\s*\(') { if ($i -eq 0 -or $lines[$i - 1] -notmatch '^\s*//\s*[\u4e00-\u9fff]') { throw "Missing Chinese coverage comment before it at line $($i + 1)" } } }; pnpm exec vitest run packages-user/data-state/src/event/event.test.ts packages-user/data-system/src/event/eventDispatch.test.ts; if ($?) { pnpm test:ci packages-user/data-common packages-user/data-base packages-user/data-system packages-user/data-state }; if ($?) { pnpm test:data-node }</automated>
|
||||
<fails_when>Any event test lacks its Chinese coverage comment, registration ownership/order or existing event behavior fails, the four-package data suite exits non-zero, or the independent Node replay command exits non-zero.</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- The real eight-entry class registry and CoreState interpreter path pass behavior and ownership assertions (CORR-03-13, D-10).
|
||||
- The existing data suite and Node replay remain green without modifications to legacy/save code or user-owned decorator placement (D-04, D-15, S-01, S-04).
|
||||
</acceptance_criteria>
|
||||
<done>Event barrel, class ownership, hero front-touch placement, stable order, and existing behavior are regression-tested through the real assembly path.</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<threat_model>
|
||||
## Trust Boundaries
|
||||
|
||||
| Boundary | Description |
|
||||
|---|---|
|
||||
| event/index.ts -> public imports | Barrel contents can accidentally execute assembly or create a back-edge. |
|
||||
| registration classes -> AnonTokyo interpreter | Class-owned names/functions become callable event operations. |
|
||||
| eventTouchFront -> hero/map/event state | Front-touch collection can change event ordering or hero state if moved incorrectly. |
|
||||
|
||||
## STRIDE Threat Register
|
||||
|
||||
| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
|
||||
|---|---|---|---|---|---|
|
||||
| T-03-43 | Tampering | event registration order/ownership | high | mitigate | Use eight explicit class instances in one readable order list and assert each name/function owner. |
|
||||
| T-03-44 | Denial of service | event barrel/import graph | medium | mitigate | Keep the index export-only and place shared resolution in an acyclic helper module. |
|
||||
| T-03-45 | Tampering | hero front-touch dispatch | high | mitigate | Move only ownership, preserve source ordering, OnTouch trigger, no-movement behavior, and awaited executor semantics. |
|
||||
| T-03-SC | Tampering | npm/pip/cargo installs | low | accept | No package installation is planned. |
|
||||
</threat_model>
|
||||
|
||||
<verification>
|
||||
- `pnpm exec vitest run packages-user/data-state/src/event/event.test.ts packages-user/data-system/src/event/eventDispatch.test.ts`
|
||||
- `pnpm test:ci packages-user/data-common packages-user/data-base packages-user/data-system packages-user/data-state`
|
||||
- `pnpm test:data-node`
|
||||
- `pnpm exec tsx script/check-data-type.ts`
|
||||
- Scoped ESLint and Prettier checks for the event implementation, assembly, CoreState import, contract, and tests
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
CORR-03-12 and CORR-03-13 are closed when the event barrel contains exports only, explicit registration classes own their names/functions, a separate direct assembly module preserves the eight-entry order, eventTouchFront is hero-owned, and all existing event/data/replay behavior remains green.
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
Create `.planning/phases/03-data-completion/03-18-SUMMARY.md` when done
|
||||
</output>
|
||||
163
.planning/phases/03-data-completion/03-19-PLAN.md
Normal file
163
.planning/phases/03-data-completion/03-19-PLAN.md
Normal file
@ -0,0 +1,163 @@
|
||||
---
|
||||
phase: 03-data-completion
|
||||
plan: 19
|
||||
type: execute
|
||||
wave: 11
|
||||
depends_on: [03-17, 03-18]
|
||||
files_modified:
|
||||
- packages-user/data-state/src/replay/commands.ts
|
||||
- packages-user/data-state/src/replay/commands.test.ts
|
||||
- packages-user/data-state/src/event/map.ts
|
||||
- packages-user/data-state/src/event/hero.ts
|
||||
- packages-user/data-state/src/event/event.ts
|
||||
- packages-user/data-state/src/event/runtime.ts
|
||||
- packages-user/data-state/src/event/registrations.ts
|
||||
- packages-user/data-state/src/event/event.test.ts
|
||||
files_deleted: []
|
||||
autonomous: true
|
||||
requirements: [DATA-01]
|
||||
gap_closure: true
|
||||
gap_ids: [CORR-03-14]
|
||||
estimate:
|
||||
tokens: 18000
|
||||
raw_tokens: 18000
|
||||
tasks: 2
|
||||
confidence: low
|
||||
must_haves:
|
||||
truths:
|
||||
- "CORR-03-14: every function/method JSDoc block changed by these replay/event corrections uses multiline /** ... */ form."
|
||||
- "The JSDoc correction is limited to the replay/event files and functions/methods touched by CORR-03-08 through CORR-03-13; unrelated legacy/save/render files are not reformatted."
|
||||
- "Chinese single-line coverage comments remain immediately before every modified or newly added Vitest it call."
|
||||
- "Replay await semantics, one directional class, export-only event index, class-owned registration assembly, hero front touch, stable order, legacy/save boundaries, and user-owned decorator placement remain intact."
|
||||
artifacts:
|
||||
- path: "packages-user/data-state/src/replay/commands.ts"
|
||||
provides: "Multiline function JSDoc for touched replay exports"
|
||||
- path: "packages-user/data-state/src/event/map.ts"
|
||||
provides: "Multiline function JSDoc for touched map event functions"
|
||||
- path: "packages-user/data-state/src/event/hero.ts"
|
||||
provides: "Multiline function JSDoc for touched hero/front-touch functions"
|
||||
- path: "packages-user/data-state/src/event/event.ts"
|
||||
provides: "Multiline function JSDoc for touched event-control functions"
|
||||
- path: "packages-user/data-state/src/event/registrations.ts"
|
||||
provides: "Multiline function JSDoc for the registration assembly function"
|
||||
key_links:
|
||||
- "JSDoc structural audit -> touched function declarations -> scoped formatter/test gates"
|
||||
- "Chinese test-comment audit -> replay/event regression tests -> reviewable correction evidence"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Close CORR-03-14 after the replay and event structural corrections by normalizing only the JSDoc attached to touched functions/methods into multiline form, while preserving the corrected runtime contracts and Chinese test-comment convention.
|
||||
|
||||
Purpose: The correction must satisfy the repository's documentation style without broad unrelated reformatting or changing user-owned architecture.
|
||||
Output: Scoped JSDoc/style cleanup and structural regression checks over the corrected replay/event files.
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
@C:/Users/book/.config/opencode/gsd-core/workflows/execute-plan.md
|
||||
@C:/Users/book/.config/opencode/gsd-core/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/REQUIREMENTS.md
|
||||
@.planning/STATE.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/phases/03-data-completion/03-CONTEXT.md
|
||||
@.planning/phases/03-data-completion/03-EVENT-CONTRACT.md
|
||||
@.planning/phases/03-data-completion/03-REPLAY-CONTRACT.md
|
||||
@.planning/phases/03-data-completion/03-VERIFICATION.md
|
||||
@.planning/phases/03-data-completion/03-17-SUMMARY.md
|
||||
@.planning/phases/03-data-completion/03-18-SUMMARY.md
|
||||
@packages-user/data-state/src/replay/commands.ts
|
||||
@packages-user/data-state/src/replay/commands.test.ts
|
||||
@packages-user/data-state/src/event/map.ts
|
||||
@packages-user/data-state/src/event/hero.ts
|
||||
@packages-user/data-state/src/event/event.ts
|
||||
@packages-user/data-state/src/event/runtime.ts
|
||||
@packages-user/data-state/src/event/registrations.ts
|
||||
@packages-user/data-state/src/event/event.test.ts
|
||||
@dev.md
|
||||
</context>
|
||||
|
||||
## Source Audit
|
||||
|
||||
| Source | ID | Item | Plan | Status |
|
||||
|---|---|---|---|---|
|
||||
| GOAL | — | Data-side corrections remain reviewable and maintainable | 03-19 | COVERED |
|
||||
| REQ | DATA-01 | Corrected replay/event behavior remains covered after documentation cleanup | 03-19 | COVERED |
|
||||
| RESEARCH | dev.md:71-85 | Function JSDoc style and Chinese test coverage comments | 03-19 | COVERED |
|
||||
| CONTEXT | CORR-03-14 | Multiline JSDoc for every touched function/method | 03-19 | COVERED |
|
||||
| CONTEXT | S-01/S-04 | No legacy/save changes and no user-owned decorator relocation | 03-19 | COVERED |
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="tracer">
|
||||
<name>Task 1: CORR-03-14 replay documentation and ordering audit</name>
|
||||
<gap_id>CORR-03-14</gap_id>
|
||||
<files>packages-user/data-state/src/replay/commands.ts, packages-user/data-state/src/replay/commands.test.ts</files>
|
||||
<read_first>packages-user/data-state/src/replay/commands.ts, packages-user/data-state/src/replay/commands.test.ts, packages-user/data-state/src/replay/types.ts, packages-user/data-common/src/replay/types.ts, packages-user/data-base/src/hero/attribute.ts, .planning/phases/03-data-completion/03-REPLAY-CONTRACT.md, dev.md</read_first>
|
||||
<action>Convert every JSDoc block attached to a replay function or method changed by CORR-03-08 through CORR-03-11 into a multiline `/**` block with the description on its own line and the closing marker on its own line. Keep comments on the corrected parameterized directional command, awaited pathfinding path, stable registry exports, and registration behavior accurate; do not add decorator placement to the command classes or to user-owned state methods. Preserve the focused deferred-controller/class-collapse tests and ensure every changed `it` call retains an immediately preceding Chinese single-line coverage comment (CORR-03-14, S-04).</action>
|
||||
<verify>
|
||||
<automated>$files = @('packages-user/data-state/src/replay/commands.ts'); foreach ($file in $files) { $text = Get-Content -Raw $file; if ([regex]::IsMatch($text, '/\*\*[^\r\n]*\*/\s*(?:export\s+)?(?:async\s+)?function')) { throw "Single-line function JSDoc remains in $file" } }; $lines = Get-Content -LiteralPath 'packages-user/data-state/src/replay/commands.test.ts'; for ($i = 0; $i -lt $lines.Count; $i++) { if ($lines[$i] -match '^\s*it(?:\.[A-Za-z]+)*\s*\(') { if ($i -eq 0 -or $lines[$i - 1] -notmatch '^\s*//\s*[\u4e00-\u9fff]') { throw "Missing Chinese coverage comment before it at line $($i + 1)" } } }; pnpm exec vitest run packages-user/data-state/src/replay/commands.test.ts; if ($?) { pnpm exec prettier --check packages-user/data-state/src/replay/commands.ts packages-user/data-state/src/replay/commands.test.ts }</automated>
|
||||
<fails_when>Any touched replay function retains a single-line JSDoc block, a replay test lacks its Chinese coverage comment, focused tests fail, or the scoped Prettier check exits non-zero.</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- All touched replay function JSDoc blocks are multiline and describe the corrected await/ownership behavior (CORR-03-14).
|
||||
- Focused replay tests still prove controller ordering and one directional command ownership without changing user-owned decorator placement (CORR-03-08, CORR-03-09, CORR-03-10, S-04).
|
||||
</acceptance_criteria>
|
||||
<done>The replay correction has repository-compliant multiline function JSDoc and retains its behavioral regression path.</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: CORR-03-14 event documentation and phase gates</name>
|
||||
<gap_id>CORR-03-14</gap_id>
|
||||
<files>packages-user/data-state/src/event/map.ts, packages-user/data-state/src/event/hero.ts, packages-user/data-state/src/event/event.ts, packages-user/data-state/src/event/runtime.ts, packages-user/data-state/src/event/registrations.ts, packages-user/data-state/src/event/event.test.ts</files>
|
||||
<read_first>packages-user/data-state/src/event/map.ts, packages-user/data-state/src/event/hero.ts, packages-user/data-state/src/event/event.ts, packages-user/data-state/src/event/runtime.ts, packages-user/data-state/src/event/registrations.ts, packages-user/data-state/src/event/index.ts, packages-user/data-state/src/event/event.test.ts, packages-user/data-state/src/core.ts, .planning/phases/03-data-completion/03-EVENT-CONTRACT.md, dev.md</read_first>
|
||||
<action>Convert every JSDoc block attached to an event function or registration-assembly function changed by CORR-03-12/13 into multiline form, including the moved hero-owned front-touch function and the shared runtime resolution functions. Add multiline JSDoc where the correction creates a public event function or assembly function that requires documentation; do not reformat member-only comments in unrelated contracts or files. Keep the export-only index, explicit class-owned registration fields, stable registration order, direct Statement[] behavior, front OnTouch semantics, and event test Chinese comments unchanged (CORR-03-14, CORR-03-12, CORR-03-13, D-11, D-24, D-27).</action>
|
||||
<verify>
|
||||
<automated>$files = @('packages-user/data-state/src/event/map.ts','packages-user/data-state/src/event/hero.ts','packages-user/data-state/src/event/event.ts','packages-user/data-state/src/event/runtime.ts','packages-user/data-state/src/event/registrations.ts'); foreach ($file in $files) { $text = Get-Content -Raw $file; if ([regex]::IsMatch($text, '/\*\*[^\r\n]*\*/\s*(?:export\s+)?(?:async\s+)?function')) { throw "Single-line function JSDoc remains in $file" } }; $lines = Get-Content -LiteralPath 'packages-user/data-state/src/event/event.test.ts'; for ($i = 0; $i -lt $lines.Count; $i++) { if ($lines[$i] -match '^\s*it(?:\.[A-Za-z]+)*\s*\(') { if ($i -eq 0 -or $lines[$i - 1] -notmatch '^\s*//\s*[\u4e00-\u9fff]') { throw "Missing Chinese coverage comment before it at line $($i + 1)" } } }; pnpm exec vitest run packages-user/data-state/src/event/event.test.ts packages-user/data-system/src/event/eventDispatch.test.ts; if ($?) { pnpm test:ci packages-user/data-common packages-user/data-base packages-user/data-system packages-user/data-state }; if ($?) { pnpm test:data-node }; if ($?) { pnpm exec tsx script/check-data-type.ts }; if ($?) { pnpm exec prettier --check packages-user/data-state/src/event/map.ts packages-user/data-state/src/event/hero.ts packages-user/data-state/src/event/event.ts packages-user/data-state/src/event/runtime.ts packages-user/data-state/src/event/registrations.ts packages-user/data-state/src/event/event.test.ts }</automated>
|
||||
<fails_when>Any touched event function retains a single-line JSDoc block, any event test lacks its Chinese coverage comment, event/data/Node/type/Prettier gates exit non-zero, or the gates reveal a change to stable event semantics or scope.</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- Event function and assembly JSDoc is multiline only in the correction-owned files; unrelated legacy/save/render files are not reformatted (CORR-03-14).
|
||||
- Event ownership, index export-only shape, hero front-touch placement, replay await behavior, stable order, and all data gates remain green (CORR-03-12, CORR-03-13, D-04, D-15, S-01, S-04).
|
||||
</acceptance_criteria>
|
||||
<done>All touched replay/event function JSDoc and test-comment requirements pass without runtime or out-of-scope file changes.</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<threat_model>
|
||||
## Trust Boundaries
|
||||
|
||||
| Boundary | Description |
|
||||
|---|---|
|
||||
| source comments -> structural review | Documentation shape is checked against function declarations and can conceal stale ownership if left ambiguous. |
|
||||
| test comments -> regression evidence | Chinese comments identify the behavior covered by each test for manual review. |
|
||||
| corrected source -> phase gates | Documentation changes must not alter replay/event execution or phase boundaries. |
|
||||
|
||||
## STRIDE Threat Register
|
||||
|
||||
| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
|
||||
|---|---|---|---|---|---|
|
||||
| T-03-46 | Repudiation | touched function documentation | medium | mitigate | Run a structural multiline-JSDoc audit over the exact replay/event file set. |
|
||||
| T-03-47 | Tampering | scoped formatter cleanup | medium | mitigate | Run focused Prettier and behavior/data gates; do not format unrelated paths. |
|
||||
| T-03-48 | Repudiation | test coverage comments | low | mitigate | Scan every `it` call in the changed replay/event tests for the required Chinese preceding comment. |
|
||||
| T-03-SC | Tampering | npm/pip/cargo installs | low | accept | No package installation is planned. |
|
||||
</threat_model>
|
||||
|
||||
<verification>
|
||||
- `pnpm exec vitest run packages-user/data-state/src/replay/commands.test.ts packages-user/data-state/src/event/event.test.ts packages-user/data-system/src/event/eventDispatch.test.ts`
|
||||
- `pnpm test:ci packages-user/data-common packages-user/data-base packages-user/data-system packages-user/data-state`
|
||||
- `pnpm test:data-node`
|
||||
- `pnpm exec tsx script/check-data-type.ts`
|
||||
- Scoped ESLint and Prettier checks for the correction-owned replay/event files
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
CORR-03-14 is closed when every function/method JSDoc touched by CORR-03-08 through CORR-03-13 is multiline, all changed tests retain Chinese coverage comments, and the corrected replay/event behavior and data gates remain green without legacy/save or user-owned decorator changes.
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
Create `.planning/phases/03-data-completion/03-19-SUMMARY.md` when done
|
||||
</output>
|
||||
Loading…
Reference in New Issue
Block a user