@ -53,9 +53,9 @@ Rows appear when work starts; default for unlisted modules is **Planned** / not
| E2.M1 | In Progress | **NEO-33 landed:** frozen prototype trio ** `salvage` ** / ** `refine` ** / ** `intrusion` ** in [`content/skills/prototype_skills.json` ](../../../content/skills/prototype_skills.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ) enforce schema, duplicate `id` , exact trio ids, and category coverage; designer note on ** `allowedXpSourceKinds` ** in [E2_M1 ](E2_M1_SkillDefinitionRegistry.md ) + [`content/README.md` ](../../../content/README.md ). **NEO-34 landed:** fail-fast server load of `content/skills/*.json` at startup — `server/NeonSprawl.Server/Game/Skills/` ([NEO-34](../../plans/NEO-34-implementation-plan.md)); config + discovery in [server README — Skill catalog ](../../../server/README.md#skill-catalog-contentskills-neo-34 ). **NEO-35 landed:** `ISkillDefinitionRegistry` / `SkillDefinitionRegistry` + DI ([NEO-35](../../plans/NEO-35-implementation-plan.md)). **NEO-36 landed:** versioned ** `GET /game/world/skill-definitions` ** ([NEO-36](../../plans/NEO-36-implementation-plan.md)) — `SkillDefinitionsWorldApi` + `SkillDefinitionsListDtos` in `server/NeonSprawl.Server/Game/Skills/` ; Bruno `bruno/neon-sprawl-server/skill-definitions/` ; manual QA [`NEO-36` ](../../manual-qa/NEO-36.md ). **E2.M2 consumer (NEO-38 landed):** grant path validates `skillId` + `sourceKind` vs catalog ** `allowedXpSourceKinds` ** on ** `POST …/skill-progression` ** ([NEO-38](../../plans/NEO-38-implementation-plan.md)); see [server README — Skill progression grant ](../../../server/README.md#skill-progression-grant-neo-38 ) and [E2_M2 ](E2_M2_XpAwardAndLevelEngine.md ). | [NEO-33 ](../../plans/NEO-33-implementation-plan.md ), [NEO-34 ](../../plans/NEO-34-implementation-plan.md ), [NEO-35 ](../../plans/NEO-35-implementation-plan.md ), [NEO-36 ](../../plans/NEO-36-implementation-plan.md ); [E2_M1 ](E2_M1_SkillDefinitionRegistry.md ); [module_dependency_register.md ](module_dependency_register.md ) **E2.M1 note** ; `server/NeonSprawl.Server/Game/Skills/` ; [`docs/manual-qa/NEO-36.md` ](../../manual-qa/NEO-36.md ); [server README — Skill definitions (NEO-36) ](../../../server/README.md#skill-definitions-neo-36 ) |
| E2.M1 | In Progress | **NEO-33 landed:** frozen prototype trio ** `salvage` ** / ** `refine` ** / ** `intrusion` ** in [`content/skills/prototype_skills.json` ](../../../content/skills/prototype_skills.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ) enforce schema, duplicate `id` , exact trio ids, and category coverage; designer note on ** `allowedXpSourceKinds` ** in [E2_M1 ](E2_M1_SkillDefinitionRegistry.md ) + [`content/README.md` ](../../../content/README.md ). **NEO-34 landed:** fail-fast server load of `content/skills/*.json` at startup — `server/NeonSprawl.Server/Game/Skills/` ([NEO-34](../../plans/NEO-34-implementation-plan.md)); config + discovery in [server README — Skill catalog ](../../../server/README.md#skill-catalog-contentskills-neo-34 ). **NEO-35 landed:** `ISkillDefinitionRegistry` / `SkillDefinitionRegistry` + DI ([NEO-35](../../plans/NEO-35-implementation-plan.md)). **NEO-36 landed:** versioned ** `GET /game/world/skill-definitions` ** ([NEO-36](../../plans/NEO-36-implementation-plan.md)) — `SkillDefinitionsWorldApi` + `SkillDefinitionsListDtos` in `server/NeonSprawl.Server/Game/Skills/` ; Bruno `bruno/neon-sprawl-server/skill-definitions/` ; manual QA [`NEO-36` ](../../manual-qa/NEO-36.md ). **E2.M2 consumer (NEO-38 landed):** grant path validates `skillId` + `sourceKind` vs catalog ** `allowedXpSourceKinds` ** on ** `POST …/skill-progression` ** ([NEO-38](../../plans/NEO-38-implementation-plan.md)); see [server README — Skill progression grant ](../../../server/README.md#skill-progression-grant-neo-38 ) and [E2_M2 ](E2_M2_XpAwardAndLevelEngine.md ). | [NEO-33 ](../../plans/NEO-33-implementation-plan.md ), [NEO-34 ](../../plans/NEO-34-implementation-plan.md ), [NEO-35 ](../../plans/NEO-35-implementation-plan.md ), [NEO-36 ](../../plans/NEO-36-implementation-plan.md ); [E2_M1 ](E2_M1_SkillDefinitionRegistry.md ); [module_dependency_register.md ](module_dependency_register.md ) **E2.M1 note** ; `server/NeonSprawl.Server/Game/Skills/` ; [`docs/manual-qa/NEO-36.md` ](../../manual-qa/NEO-36.md ); [server README — Skill definitions (NEO-36) ](../../../server/README.md#skill-definitions-neo-36 ) |
| E2.M3 | In Progress | **NEO-45 landed:** prototype ** `salvage` ** mastery catalog + CI gates (see [NEO-45 plan ](../../plans/NEO-45-implementation-plan.md )). **NEO-46 landed:** fail-fast server load under `server/NeonSprawl.Server/Game/Mastery/` — `MasteryCatalogLoader` , `IMasteryCatalogRegistry` , cross-check vs `ISkillDefinitionRegistry` , Slice 4 + ** `tierIndex` ** 1..N gate; see [NEO-46 plan ](../../plans/NEO-46-implementation-plan.md ). **NEO-47 landed:** `PerkUnlockEngine` , `IPlayerPerkStateStore` + ** `V004` **, level-up hook in skill XP grants; see [NEO-47 plan ](../../plans/NEO-47-implementation-plan.md ). **NEO-49 landed:** comment-only ** `perk_unlock` ** telemetry hook site in [`PerkUnlockEngine.TryUnlockPerks` ](../../../server/NeonSprawl.Server/Game/Mastery/PerkUnlockEngine.cs ) ([NEO-49 plan](../../plans/NEO-49-implementation-plan.md), [`NEO-49` manual QA ](../../manual-qa/NEO-49.md )); [server README — Perk unlock telemetry (NEO-49) ](../../../server/README.md#perk-unlock-engine-and-telemetry-hooks-neo-47-neo-49 ). **NEO-48 landed:** ** `GET` /`POST /game/players/{id}/perk-state`** — `PerkStateApi` + DTOs in `Game/Mastery/` ([NEO-48](../../plans/NEO-48-implementation-plan.md), [`NEO-48` manual QA ](../../manual-qa/NEO-48.md )); [server README — Perk state (NEO-48) ](../../../server/README.md#perk-state-neo-48 ); Bruno `bruno/neon-sprawl-server/perk-state/` . | [NEO-45 ](../../plans/NEO-45-implementation-plan.md ), [NEO-46 ](../../plans/NEO-46-implementation-plan.md ), [NEO-47 ](../../plans/NEO-47-implementation-plan.md ), [NEO-48 ](../../plans/NEO-48-implementation-plan.md ), [NEO-49 ](../../plans/NEO-49-implementation-plan.md ), [E2M3-pre-production-backlog ](../../plans/E2M3-pre-production-backlog.md ), [E2_M3 ](E2_M3_MasteryAndPerkUnlocks.md ) |
| E2.M3 | In Progress | **NEO-45 landed:** prototype ** `salvage` ** mastery catalog + CI gates (see [NEO-45 plan ](../../plans/NEO-45-implementation-plan.md )). **NEO-46 landed:** fail-fast server load under `server/NeonSprawl.Server/Game/Mastery/` — `MasteryCatalogLoader` , `IMasteryCatalogRegistry` , cross-check vs `ISkillDefinitionRegistry` , Slice 4 + ** `tierIndex` ** 1..N gate; see [NEO-46 plan ](../../plans/NEO-46-implementation-plan.md ). **NEO-47 landed:** `PerkUnlockEngine` , `IPlayerPerkStateStore` + ** `V004` **, level-up hook in skill XP grants; see [NEO-47 plan ](../../plans/NEO-47-implementation-plan.md ). **NEO-49 landed:** comment-only ** `perk_unlock` ** telemetry hook site in [`PerkUnlockEngine.TryUnlockPerks` ](../../../server/NeonSprawl.Server/Game/Mastery/PerkUnlockEngine.cs ) ([NEO-49 plan](../../plans/NEO-49-implementation-plan.md), [`NEO-49` manual QA ](../../manual-qa/NEO-49.md )); [server README — Perk unlock telemetry (NEO-49) ](../../../server/README.md#perk-unlock-engine-and-telemetry-hooks-neo-47-neo-49 ). **NEO-48 landed:** ** `GET` /`POST /game/players/{id}/perk-state`** — `PerkStateApi` + DTOs in `Game/Mastery/` ([NEO-48](../../plans/NEO-48-implementation-plan.md), [`NEO-48` manual QA ](../../manual-qa/NEO-48.md )); [server README — Perk state (NEO-48) ](../../../server/README.md#perk-state-neo-48 ); Bruno `bruno/neon-sprawl-server/perk-state/` . | [NEO-45 ](../../plans/NEO-45-implementation-plan.md ), [NEO-46 ](../../plans/NEO-46-implementation-plan.md ), [NEO-47 ](../../plans/NEO-47-implementation-plan.md ), [NEO-48 ](../../plans/NEO-48-implementation-plan.md ), [NEO-49 ](../../plans/NEO-49-implementation-plan.md ), [E2M3-pre-production-backlog ](../../plans/E2M3-pre-production-backlog.md ), [E2_M3 ](E2_M3_MasteryAndPerkUnlocks.md ) |
| E2.M2 | In Progress | **NEO-37 landed:** versioned ** `GET /game/players/{id}/skill-progression` ** ([NEO-37](../../plans/NEO-37-implementation-plan.md)) — read model for every registered skill; known-player gate via `IPositionStateStore` ; [server README — Skill progression snapshot (NEO-37) ](../../../server/README.md#skill-progression-snapshot-neo-37 ); manual QA [`NEO-37` ](../../manual-qa/NEO-37.md ). **NEO-38 landed:** ** `POST` ** same path — grant apply, persistence (`IPlayerSkillProgressionStore`, `V003` migration), structured denies + ** `levelUps` ** ([NEO-38](../../plans/NEO-38-implementation-plan.md)); manual QA [`NEO-38` ](../../manual-qa/NEO-38.md ); Bruno `bruno/neon-sprawl-server/skill-progression/` ; [server README — Skill progression grant (NEO-38) ](../../../server/README.md#skill-progression-grant-neo-38 ). **NEO-39 landed:** data-driven `LevelCurve` content + schema + CI validation (`*_level_curve.json`) with fail-fast startup schema checks; progression GET/POST level resolution now uses `ISkillLevelCurve` content-backed thresholds ([NEO-39](../../plans/NEO-39-implementation-plan.md)); manual QA [`NEO-39` ](../../manual-qa/NEO-39.md ). **NEO-40 landed:** comment-only telemetry hook sites in [`SkillProgressionSnapshotApi.cs` ](../../../server/NeonSprawl.Server/Game/Skills/SkillProgressionSnapshotApi.cs ) on ** `POST …/skill-progression` ** for future ** `xp_grant` ** / ** `level_up` ** ([NEO-40](../../plans/NEO-40-implementation-plan.md), [`NEO-40` manual QA ](../../manual-qa/NEO-40.md )). **NEO-41 landed:** gather prototype — ** `POST …/interact` ** with ** `kind: resource_node` ** grants ** `salvage` ** + ** `activity` ** (10 XP) via [`SkillProgressionGrantOperations` ](../../../server/NeonSprawl.Server/Game/Skills/SkillProgressionGrantOperations.cs ) ([NEO-41](../../plans/NEO-41-implementation-plan.md), [`NEO-41` manual QA ](../../manual-qa/NEO-41.md )); [server README — Interaction ](../../../server/README.md#interaction-neo-9 ). **NEO-42 landed (prep):** ** `RefineActivitySkillXpGrant` ** / ** `RefineSkillXpConstants` ** + deny-registry factory + tests — same NEO-38 grant stack; **E3.M2** must invoke on craft/refine success ([NEO-42](../../plans/NEO-42-implementation-plan.md), [`NEO-42` manual QA ](../../manual-qa/NEO-42.md )); [server README — Craft / refine hook (NEO-42) ](../../../server/README.md#craft--refine-hook--skill-xp-neo-42 ). **NEO-43 landed (prep):** ** `MissionRewardSkillXpGrant` ** / ** `MissionRewardSkillXpConstants` ** + deny-registry factory + tests — same NEO-38 grant stack with fixed ** `sourceKind: mission_reward` **; **E7.M2** must invoke from quest hand-in ([NEO-43](../../plans/NEO-43-implementation-plan.md), [`NEO-43` manual QA ](../../manual-qa/NEO-43.md )); [server README — Mission / quest reward (NEO-43) ](../../../server/README.md#mission--quest-reward--skill-xp-neo-43 ). **Slice 3 still open:** [NEO-44 ](https://linear.app/neon-sprawl/issue/NEO-44 ). See [epic_02 — E2.M2 + Slice 3 ](../epics/epic_02_skills_and_progression.md ). | [NEO-37 ](../../plans/NEO-37-implementation-plan.md ), [NEO-38 ](../../plans/NEO-38-implementation-plan.md ), [NEO-39 ](../../plans/NEO-39-implementation-plan.md ), [NEO-40 ](../../plans/NEO-40-implementation-plan.md ), [NEO-41 ](../../plans/NEO-41-implementation-plan.md ), [NEO-42 ](../../plans/NEO-42-implementation-plan.md ), [NEO-43 ](../../plans/NEO-43-implementation-plan.md ), [E2_M2 ](E2_M2_XpAwardAndLevelEngine.md ); label ** `E2.M2` ** on NEO-37– NEO-41, NEO-42– NEO-44 |
| E2.M2 | In Progress | **NEO-37 landed:** versioned ** `GET /game/players/{id}/skill-progression` ** ([NEO-37](../../plans/NEO-37-implementation-plan.md)) — read model for every registered skill; known-player gate via `IPositionStateStore` ; [server README — Skill progression snapshot (NEO-37) ](../../../server/README.md#skill-progression-snapshot-neo-37 ); manual QA [`NEO-37` ](../../manual-qa/NEO-37.md ). **NEO-38 landed:** ** `POST` ** same path — grant apply, persistence (`IPlayerSkillProgressionStore`, `V003` migration), structured denies + ** `levelUps` ** ([NEO-38](../../plans/NEO-38-implementation-plan.md)); manual QA [`NEO-38` ](../../manual-qa/NEO-38.md ); Bruno `bruno/neon-sprawl-server/skill-progression/` ; [server README — Skill progression grant (NEO-38) ](../../../server/README.md#skill-progression-grant-neo-38 ). **NEO-39 landed:** data-driven `LevelCurve` content + schema + CI validation (`*_level_curve.json`) with fail-fast startup schema checks; progression GET/POST level resolution now uses `ISkillLevelCurve` content-backed thresholds ([NEO-39](../../plans/NEO-39-implementation-plan.md)); manual QA [`NEO-39` ](../../manual-qa/NEO-39.md ). **NEO-40 landed:** comment-only telemetry hook sites in [`SkillProgressionSnapshotApi.cs` ](../../../server/NeonSprawl.Server/Game/Skills/SkillProgressionSnapshotApi.cs ) on ** `POST …/skill-progression` ** for future ** `xp_grant` ** / ** `level_up` ** ([NEO-40](../../plans/NEO-40-implementation-plan.md), [`NEO-40` manual QA ](../../manual-qa/NEO-40.md )). **NEO-41 landed:** gather prototype — ** `POST …/interact` ** with ** `kind: resource_node` ** grants ** `salvage` ** + ** `activity` ** (10 XP) via [`SkillProgressionGrantOperations` ](../../../server/NeonSprawl.Server/Game/Skills/SkillProgressionGrantOperations.cs ) ([NEO-41](../../plans/NEO-41-implementation-plan.md), [`NEO-41` manual QA ](../../manual-qa/NEO-41.md )); [server README — Interaction ](../../../server/README.md#interaction-neo-9 ). **NEO-42 landed (prep):** ** `RefineActivitySkillXpGrant` ** / ** `RefineSkillXpConstants` ** + deny-registry factory + tests — same NEO-38 grant stack; **E3.M2** must invoke on craft/refine success ([NEO-42](../../plans/NEO-42-implementation-plan.md), [`NEO-42` manual QA ](../../manual-qa/NEO-42.md )); [server README — Craft / refine hook (NEO-42) ](../../../server/README.md#craft--refine-hook--skill-xp-neo-42 ). **NEO-43 landed (prep):** ** `MissionRewardSkillXpGrant` ** / ** `MissionRewardSkillXpConstants` ** + deny-registry factory + tests — same NEO-38 grant stack with fixed ** `sourceKind: mission_reward` **; **E7.M2** must invoke from quest hand-in ([NEO-43](../../plans/NEO-43-implementation-plan.md), [`NEO-43` manual QA ](../../manual-qa/NEO-43.md )); [server README — Mission / quest reward (NEO-43) ](../../../server/README.md#mission--quest-reward--skill-xp-neo-43 ). **Slice 3 still open:** [NEO-44 ](https://linear.app/neon-sprawl/issue/NEO-44 ). See [epic_02 — E2.M2 + Slice 3 ](../epics/epic_02_skills_and_progression.md ). | [NEO-37 ](../../plans/NEO-37-implementation-plan.md ), [NEO-38 ](../../plans/NEO-38-implementation-plan.md ), [NEO-39 ](../../plans/NEO-39-implementation-plan.md ), [NEO-40 ](../../plans/NEO-40-implementation-plan.md ), [NEO-41 ](../../plans/NEO-41-implementation-plan.md ), [NEO-42 ](../../plans/NEO-42-implementation-plan.md ), [NEO-43 ](../../plans/NEO-43-implementation-plan.md ), [E2_M2 ](E2_M2_XpAwardAndLevelEngine.md ); label ** `E2.M2` ** on NEO-37– NEO-41, NEO-42– NEO-44 |
| E3.M1 | Ready | **NEO-41 landed (prototype, superseded on interact by NEO-63):** inline XP on ** `resource_node` ** interact. **NEO-57– NEO-61** — content, registry, HTTP defs, depletion store (see prior alignment). **NEO-62 landed:** ** `GatherOperations` ** + ** `GatherResult` **. **NEO-63 landed:** ** `POST …/interact` ** ** `resource_node` ** → gather engine; **four** ** `PrototypeInteractableRegistry` ** anchors; Bruno gather → inventory + depletion deny ([NEO-63](../../plans/NEO-63-implementation-plan.md), [`NEO-63` manual QA ](../../manual-qa/NEO-63.md )); [server README — Gather via interact (NEO-63) ](../../../server/README.md#gather-via-interact-neo-63 ). **NEO-64 landed:** comment-only ** `resource_gathered` ** / ** `gather_node_depleted` ** hook sites in ** `GatherOperations.TryGather` ** ([NEO-64](../../plans/NEO-64-implementation-plan.md), [`NEO-64` manual QA ](../../manual-qa/NEO-64.md )); Epic 3 Slice 2 backlog **E3M1-01** – **E3M1-08** complete. **NEO-73 landed:** client gather feedback — ** `skill_progression_client.gd` **, ** `prototype_interactable_picker.gd` ** (nearest in-range **R** ), ** `GatherFeedbackLabel` ** + ** `SkillProgressionLabel` **, auto inventory/skill refresh after successful gather ([NEO-73](../../plans/NEO-73-implementation-plan.md), [`NEO-73` manual QA ](../../manual-qa/NEO-73.md )); `client/README.md` gather section. ** Slice 5 client (remaining):** capstone [NEO-75 ](https://linear.app/neon-sprawl/issue/NEO-75 ) — [E3S5 backlog ](../../plans/E3S5-client-prototype-backlog.md ) . | [NEO-41 ](../../plans/NEO-41-implementation-plan.md ) … [NEO-64 ](../../plans/NEO-64-implementation-plan.md ), [NEO-73 ](../../plans/NEO-73 -implementation-plan.md), [E3S5-client-prototype-backlog ](../../plans/E3S5-client-prototype-backlog.md ), [E3_M1 ](E3_M1_ResourceNodeAndGatherLoop.md ); `server/NeonSprawl.Server/Game/Gathering/` , `Game/Interaction/` , `client/scripts/skill_progression_client.gd` , `client/scripts/prototype_interactable_picker.gd` |
| E3.M1 | Ready | **NEO-41 landed (prototype, superseded on interact by NEO-63):** inline XP on ** `resource_node` ** interact. **NEO-57– NEO-61** — content, registry, HTTP defs, depletion store (see prior alignment). **NEO-62 landed:** ** `GatherOperations` ** + ** `GatherResult` **. **NEO-63 landed:** ** `POST …/interact` ** ** `resource_node` ** → gather engine; **four** ** `PrototypeInteractableRegistry` ** anchors; Bruno gather → inventory + depletion deny ([NEO-63](../../plans/NEO-63-implementation-plan.md), [`NEO-63` manual QA ](../../manual-qa/NEO-63.md )); [server README — Gather via interact (NEO-63) ](../../../server/README.md#gather-via-interact-neo-63 ). **NEO-64 landed:** comment-only ** `resource_gathered` ** / ** `gather_node_depleted` ** hook sites in ** `GatherOperations.TryGather` ** ([NEO-64](../../plans/NEO-64-implementation-plan.md), [`NEO-64` manual QA ](../../manual-qa/NEO-64.md )); Epic 3 Slice 2 backlog **E3M1-01** – **E3M1-08** complete. **NEO-73 landed:** client gather feedback — ** `skill_progression_client.gd` **, ** `prototype_interactable_picker.gd` ** (nearest in-range **R** ), ** `GatherFeedbackLabel` ** + ** `SkillProgressionLabel` **, auto inventory/skill refresh after successful gather ([NEO-73](../../plans/NEO-73-implementation-plan.md), [`NEO-73` manual QA ](../../manual-qa/NEO-73.md )); `client/README.md` gather section. ** NEO-75 landed:** capstone gather→refine→make loop in Godot — [`NEO-75` manual QA ](../../manual-qa/NEO-75.md ), `client/README.md` end-to-end section; Epic 3 Slice 5 client complete . | [NEO-41 ](../../plans/NEO-41-implementation-plan.md ) … [NEO-64 ](../../plans/NEO-64-implementation-plan.md ), [NEO-73 ](../../plans/NEO-73 -implementation-plan.md), [NEO-75 ](../../plans/NEO-75 -implementation-plan.md), [E3S5-client-prototype-backlog ](../../plans/E3S5-client-prototype-backlog.md ), [E3_M1 ](E3_M1_ResourceNodeAndGatherLoop.md ); `server/NeonSprawl.Server/Game/Gathering/` , `Game/Interaction/` , `client/scripts/skill_progression_client.gd` , `client/scripts/prototype_interactable_picker.gd` |
| E3.M3 | In Progress | **NEO-50 landed:** frozen prototype six-item catalog in [`content/items/prototype_items.json` ](../../../content/items/prototype_items.json ); [`item-def.schema.json` ](../../../content/schemas/item-def.schema.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ). **NEO-51 landed:** fail-fast server load of `content/items/*_items.json` at startup — `server/NeonSprawl.Server/Game/Items/` ([NEO-51](../../plans/NEO-51-implementation-plan.md)); [server README — Item catalog ](../../../server/README.md#item-catalog-contentitems-neo-51 ). **NEO-52 landed:** injectable ** `IItemDefinitionRegistry` ** + lookup tests ([NEO-52](../../plans/NEO-52-implementation-plan.md)). **NEO-53 landed:** ** `GET /game/world/item-definitions` ** — `ItemDefinitionsWorldApi` + DTOs in `Game/Items/` ([NEO-53](../../plans/NEO-53-implementation-plan.md), [`NEO-53` manual QA ](../../manual-qa/NEO-53.md )); [server README — Item definitions (NEO-53) ](../../../server/README.md#item-definitions-neo-53 ); Bruno `bruno/neon-sprawl-server/item-definitions/` . **NEO-54 landed:** ** `IPlayerInventoryStore` ** + ** `PlayerInventoryOperations` ** — 24 bag + 1 equipment slots, stack rules, `V005` migration ([NEO-54](../../plans/NEO-54-implementation-plan.md)). **NEO-55 landed:** ** `GET` /`POST /game/players/{id}/inventory`** — `PlayerInventoryApi` + DTOs in `Game/Items/` ([NEO-55](../../plans/NEO-55-implementation-plan.md)); [server README — Player inventory (NEO-54 store, NEO-55 HTTP) ](../../../server/README.md#player-inventory-neo-54-store-neo-55-http ); Bruno `bruno/neon-sprawl-server/inventory/` . **NEO-56 landed:** comment-only ** `item_created` ** / ** `inventory_transfer_denied` ** telemetry hook sites in [`PlayerInventoryOperations` ](../../../server/NeonSprawl.Server/Game/Items/PlayerInventoryOperations.cs ) ([NEO-56](../../plans/NEO-56-implementation-plan.md), [`NEO-56` manual QA ](../../manual-qa/NEO-56.md )); no E9.M1 ingest. **NEO-72 landed:** client inventory HUD — ** `inventory_client.gd` **, ** `item_definitions_client.gd` **, ** `InventoryLabel` **, boot hydrate + ** `I` ** refresh ([NEO-72](../../plans/NEO-72-implementation-plan.md), [`NEO-72` manual QA ](../../manual-qa/NEO-72.md )); `client/README.md` inventory HUD section. ** Slice 5 client (remaining):** capstone [NEO-75 ](https://linear.app/neon-sprawl/issue/NEO-75 ) — [E3S5 backlog ](../../plans/E3S5-client-prototype-backlog.md ) . | [NEO-50 ](../../plans/NEO-50-implementation-plan.md ), [NEO-51 ](../../plans/NEO-51-implementation-plan.md ), [NEO-52 ](../../plans/NEO-52-implementation-plan.md ), [NEO-53 ](../../plans/NEO-53-implementation-plan.md ), [NEO-54 ](../../plans/NEO-54-implementation-plan.md ), [NEO-55 ](../../plans/NEO-55-implementation-plan.md ), [NEO-56 ](../../plans/NEO-56-implementation-plan.md ), [NEO-72 ](../../plans/NEO-72 -implementation-plan.md), [E3S5-client-prototype-backlog ](../../plans/E3S5-client-prototype-backlog.md ), [E3M3-prototype-backlog ](../../plans/E3M3-prototype-backlog.md ), [E3_M3 ](E3_M3_ItemizationAndInventorySchema.md ) |
| E3.M3 | In Progress | **NEO-50 landed:** frozen prototype six-item catalog in [`content/items/prototype_items.json` ](../../../content/items/prototype_items.json ); [`item-def.schema.json` ](../../../content/schemas/item-def.schema.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ). **NEO-51 landed:** fail-fast server load of `content/items/*_items.json` at startup — `server/NeonSprawl.Server/Game/Items/` ([NEO-51](../../plans/NEO-51-implementation-plan.md)); [server README — Item catalog ](../../../server/README.md#item-catalog-contentitems-neo-51 ). **NEO-52 landed:** injectable ** `IItemDefinitionRegistry` ** + lookup tests ([NEO-52](../../plans/NEO-52-implementation-plan.md)). **NEO-53 landed:** ** `GET /game/world/item-definitions` ** — `ItemDefinitionsWorldApi` + DTOs in `Game/Items/` ([NEO-53](../../plans/NEO-53-implementation-plan.md), [`NEO-53` manual QA ](../../manual-qa/NEO-53.md )); [server README — Item definitions (NEO-53) ](../../../server/README.md#item-definitions-neo-53 ); Bruno `bruno/neon-sprawl-server/item-definitions/` . **NEO-54 landed:** ** `IPlayerInventoryStore` ** + ** `PlayerInventoryOperations` ** — 24 bag + 1 equipment slots, stack rules, `V005` migration ([NEO-54](../../plans/NEO-54-implementation-plan.md)). **NEO-55 landed:** ** `GET` /`POST /game/players/{id}/inventory`** — `PlayerInventoryApi` + DTOs in `Game/Items/` ([NEO-55](../../plans/NEO-55-implementation-plan.md)); [server README — Player inventory (NEO-54 store, NEO-55 HTTP) ](../../../server/README.md#player-inventory-neo-54-store-neo-55-http ); Bruno `bruno/neon-sprawl-server/inventory/` . **NEO-56 landed:** comment-only ** `item_created` ** / ** `inventory_transfer_denied` ** telemetry hook sites in [`PlayerInventoryOperations` ](../../../server/NeonSprawl.Server/Game/Items/PlayerInventoryOperations.cs ) ([NEO-56](../../plans/NEO-56-implementation-plan.md), [`NEO-56` manual QA ](../../manual-qa/NEO-56.md )); no E9.M1 ingest. **NEO-72 landed:** client inventory HUD — ** `inventory_client.gd` **, ** `item_definitions_client.gd` **, ** `InventoryLabel` **, boot hydrate + ** `I` ** refresh ([NEO-72](../../plans/NEO-72-implementation-plan.md), [`NEO-72` manual QA ](../../manual-qa/NEO-72.md )); `client/README.md` inventory HUD section. ** NEO-75 landed:** ** `prototype_economy_hud_section.gd` ** collapse toggle + capstone manual QA ([NEO-75](../../plans/NEO-75-implementation-plan.md), [`NEO-75` manual QA ](../../manual-qa/NEO-75.md )); Epic 3 Slice 5 client complete . | [NEO-50 ](../../plans/NEO-50-implementation-plan.md ), [NEO-51 ](../../plans/NEO-51-implementation-plan.md ), [NEO-52 ](../../plans/NEO-52-implementation-plan.md ), [NEO-53 ](../../plans/NEO-53-implementation-plan.md ), [NEO-54 ](../../plans/NEO-54-implementation-plan.md ), [NEO-55 ](../../plans/NEO-55-implementation-plan.md ), [NEO-56 ](../../plans/NEO-56-implementation-plan.md ), [NEO-72 ](../../plans/NEO-72 -implementation-plan.md), [NEO-75 ](../../plans/NEO-75 -implementation-plan.md), [E3S5-client-prototype-backlog ](../../plans/E3S5-client-prototype-backlog.md ), [E3M3-prototype-backlog ](../../plans/E3M3-prototype-backlog.md ), [E3_M3 ](E3_M3_ItemizationAndInventorySchema.md ) |
| E3.M2 | Ready | **NEO-65 landed:** frozen prototype eight-recipe catalog in [`content/recipes/prototype_recipes.json` ](../../../content/recipes/prototype_recipes.json ); [`recipe-def.schema.json` ](../../../content/schemas/recipe-def.schema.json ) + [`recipe-io-row.schema.json` ](../../../content/schemas/recipe-io-row.schema.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ) Slice 3 gates ([NEO-65](../../plans/NEO-65-implementation-plan.md)). **NEO-66 landed:** fail-fast server load of `content/recipes/*_recipes.json` at startup — `server/NeonSprawl.Server/Game/Crafting/` ([NEO-66](../../plans/NEO-66-implementation-plan.md)); [server README — Recipe catalog ](../../../server/README.md#recipe-catalog-contentrecipes-neo-66 ). **NEO-67 landed:** injectable ** `IRecipeDefinitionRegistry` ** + lookup tests ([NEO-67](../../plans/NEO-67-implementation-plan.md)). **NEO-68 landed:** ** `GET /game/world/recipe-definitions` ** — `RecipeDefinitionsWorldApi` + DTOs in `Game/Crafting/` ([NEO-68](../../plans/NEO-68-implementation-plan.md), [`NEO-68` manual QA ](../../manual-qa/NEO-68.md )); [server README — Recipe definitions (NEO-68) ](../../../server/README.md#recipe-definitions-neo-68 ); Bruno `bruno/neon-sprawl-server/recipe-definitions/` . **NEO-69 landed:** ** `CraftOperations.TryCraft` ** + ** `CraftResult` ** — pre-flight inputs/outputs, inventory mutation, refine XP ([NEO-69](../../plans/NEO-69-implementation-plan.md)); [server README — Craft engine (NEO-69) ](../../../server/README.md#craft-engine-neo-69-and-craft-http-neo-70 ). **NEO-70 landed:** ** `POST /game/players/{id}/craft` ** — `PlayerCraftApi` + wire ** `CraftResponse` **; Bruno gather→refine→make spine ([NEO-70](../../plans/NEO-70-implementation-plan.md)); Bruno `bruno/neon-sprawl-server/craft/` . **NEO-71 landed:** comment-only ** `item_crafted` ** / ** `craft_failed` ** telemetry hook sites in ** `CraftOperations.TryCraft` ** ([NEO-71](../../plans/NEO-71-implementation-plan.md)); [server README — Craft telemetry hooks (NEO-71) ](../../../server/README.md#craft-telemetry-hooks-neo-71 ). **NEO-42 landed (prep):** ** `RefineActivitySkillXpGrant` ** / ** `RefineSkillXpConstants` ** — wired from craft engine success path. Epic 3 Slice 3 server backlog **E3M2-01** – **E3M2-07** complete. Upstream: E3.M1 **Ready** , E3.M3 inventory landed. **NEO-74 landed:** client craft UI — ** `recipe_definitions_client.gd` **, ** `craft_client.gd` **, ** `craft_recipe_panel.gd` **, ** `CraftFeedbackLabel` **, **refine** skill row ([NEO-74](../../plans/NEO-74-implementation-plan.md), [`NEO-74` manual QA ](../../manual-qa/NEO-74.md )); `client/README.md` craft section. ** Slice 5 client (remaining):** capstone playable loop [NEO-75 ](https://linear.app/neon-sprawl/issue/NEO-75 ) — [E3S5 backlog ](../../plans/E3S5-client-prototype-backlog.md ) . | [NEO-42 ](../../plans/NEO-42-implementation-plan.md ), [NEO-65 ](../../plans/NEO-65-implementation-plan.md ), [NEO-66 ](../../plans/NEO-66-implementation-plan.md ), [NEO-67 ](../../plans/NEO-67-implementation-plan.md ), [NEO-68 ](../../plans/NEO-68-implementation-plan.md ), [NEO-69 ](../../plans/NEO-69-implementation-plan.md ), [NEO-70 ](../../plans/NEO-70-implementation-plan.md ), [NEO-71 ](../../plans/NEO-71-implementation-plan.md ), [NEO-74 ](../../plans/NEO-74-implementation-plan.md ) … [NEO-75 ](https://linear.app/neon-sprawl/issue/NEO-75 ), [E3M2-prototype-backlog ](../../plans/E3M2-prototype-backlog.md ), [E3S5-client-prototype-backlog ](../../plans/E3S5-client-prototype-backlog.md ), [E3_M2 ](E3_M2_RefinementAndRecipeExecution.md ) |
| E3.M2 | Ready | **NEO-65 landed:** frozen prototype eight-recipe catalog in [`content/recipes/prototype_recipes.json` ](../../../content/recipes/prototype_recipes.json ); [`recipe-def.schema.json` ](../../../content/schemas/recipe-def.schema.json ) + [`recipe-io-row.schema.json` ](../../../content/schemas/recipe-io-row.schema.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ) Slice 3 gates ([NEO-65](../../plans/NEO-65-implementation-plan.md)). **NEO-66 landed:** fail-fast server load of `content/recipes/*_recipes.json` at startup — `server/NeonSprawl.Server/Game/Crafting/` ([NEO-66](../../plans/NEO-66-implementation-plan.md)); [server README — Recipe catalog ](../../../server/README.md#recipe-catalog-contentrecipes-neo-66 ). **NEO-67 landed:** injectable ** `IRecipeDefinitionRegistry` ** + lookup tests ([NEO-67](../../plans/NEO-67-implementation-plan.md)). **NEO-68 landed:** ** `GET /game/world/recipe-definitions` ** — `RecipeDefinitionsWorldApi` + DTOs in `Game/Crafting/` ([NEO-68](../../plans/NEO-68-implementation-plan.md), [`NEO-68` manual QA ](../../manual-qa/NEO-68.md )); [server README — Recipe definitions (NEO-68) ](../../../server/README.md#recipe-definitions-neo-68 ); Bruno `bruno/neon-sprawl-server/recipe-definitions/` . **NEO-69 landed:** ** `CraftOperations.TryCraft` ** + ** `CraftResult` ** — pre-flight inputs/outputs, inventory mutation, refine XP ([NEO-69](../../plans/NEO-69-implementation-plan.md)); [server README — Craft engine (NEO-69) ](../../../server/README.md#craft-engine-neo-69-and-craft-http-neo-70 ). **NEO-70 landed:** ** `POST /game/players/{id}/craft` ** — `PlayerCraftApi` + wire ** `CraftResponse` **; Bruno gather→refine→make spine ([NEO-70](../../plans/NEO-70-implementation-plan.md)); Bruno `bruno/neon-sprawl-server/craft/` . **NEO-71 landed:** comment-only ** `item_crafted` ** / ** `craft_failed` ** telemetry hook sites in ** `CraftOperations.TryCraft` ** ([NEO-71](../../plans/NEO-71-implementation-plan.md)); [server README — Craft telemetry hooks (NEO-71) ](../../../server/README.md#craft-telemetry-hooks-neo-71 ). **NEO-42 landed (prep):** ** `RefineActivitySkillXpGrant` ** / ** `RefineSkillXpConstants` ** — wired from craft engine success path. Epic 3 Slice 3 server backlog **E3M2-01** – **E3M2-07** complete. Upstream: E3.M1 **Ready** , E3.M3 inventory landed. **NEO-74 landed:** client craft UI — ** `recipe_definitions_client.gd` **, ** `craft_client.gd` **, ** `craft_recipe_panel.gd` **, ** `CraftFeedbackLabel` **, **refine** skill row ([NEO-74](../../plans/NEO-74-implementation-plan.md), [`NEO-74` manual QA ](../../manual-qa/NEO-74.md )); `client/README.md` craft section. ** NEO-75 landed:** capstone playable gather→refine→make loop — [`NEO-75` manual QA ](../../manual-qa/NEO-75.md ), ** `prototype_economy_hud_section.gd` **; Epic 3 Slice 5 client complete . | [NEO-42 ](../../plans/NEO-42-implementation-plan.md ), [NEO-65 ](../../plans/NEO-65-implementation-plan.md ), [NEO-66 ](../../plans/NEO-66-implementation-plan.md ), [NEO-67 ](../../plans/NEO-67-implementation-plan.md ), [NEO-68 ](../../plans/NEO-68-implementation-plan.md ), [NEO-69 ](../../plans/NEO-69-implementation-plan.md ), [NEO-70 ](../../plans/NEO-70-implementation-plan.md ), [NEO-71 ](../../plans/NEO-71-implementation-plan.md ), [NEO-74 ](../../plans/NEO-74-implementation-plan.md ), [NEO-75 ](../../plans/NEO-75-implementation-plan.md ), [E3M2-prototype-backlog ](../../plans/E3M2-prototype-backlog.md ), [E3S5-client-prototype-backlog ](../../plans/E3S5-client-prototype-backlog.md ), [E3_M2 ](E3_M2_RefinementAndRecipeExecution.md ) |
---
---