@ -56,7 +56,7 @@ Rows appear when work starts; default for unlisted modules is **Planned** / not
| 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.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. **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.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. **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 ) |
| 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 ) |
| E5.M1 | In Progress | **NEO-76 landed:** frozen prototype four-ability catalog in [`content/abilities/prototype_abilities.json` ](../../../content/abilities/prototype_abilities.json ); [`ability-def.schema.json` ](../../../content/schemas/ability-def.schema.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ) E5M1 four-id gate ([NEO-76](../../plans/NEO-76-implementation-plan.md)). **NEO-77 landed:** fail-fast server load of `content/abilities/*_abilities.json` at startup — `server/NeonSprawl.Server/Game/Combat/` ([NEO-77](../../plans/NEO-77-implementation-plan.md)); [server README — Ability catalog ](../../../server/README.md#ability-catalog-contentabilities-neo-77 ). **NEO-79 landed:** injectable ** `IAbilityDefinitionRegistry` ** + DI; hotbar/cast use ** `TryNormalizeKnown` ** ([NEO-79](../../plans/NEO-79-implementation-plan.md)); Bruno `bruno/neon-sprawl-server/hotbar-loadout/` + `ability-cast/` unknown-ability deny smokes. **NEO-78 landed:** ** `GET /game/world/ability-definitions` ** — `AbilityDefinitionsWorldApi` + DTOs in `Game/Combat/` ([NEO-78](../../plans/NEO-78-implementation-plan.md)); [server README — Ability definitions (NEO-78) ](../../../server/README.md#ability-definitions-neo-78 ); Bruno `bruno/neon-sprawl-server/ability-definitions/` . **NEO-80 landed:** ** `ICombatEntityHealthStore` ** / ** `InMemoryCombatEntityHealthStore` ** — lazy prototype dummy HP at ** `PrototypeCombatConstants.MaxPrototypeTargetHp` (100)**; DI via ** `AddCombatEntityHealthStore()` ** ([NEO-80](../../plans/NEO-80-implementation-plan.md)); [server README — Combat entity health (NEO-80) ](../../../server/README.md#combat-entity-health-neo-80 ). **NEO-81 landed:** ** `CombatOperations.TryResolve` ** + ** `CombatResult` ** + ** `CombatReasonCodes` ** — defeated pre-check deny, catalog damage ([NEO-81](../../plans/NEO-81-implementation-plan.md)); [server README — Combat engine (NEO-81) ](../../../server/README.md#combat-engine-neo-81 ). **NEO-82 landed:** ** `AbilityCastApi` ** → ** `CombatOperations.TryResolve` **; nested wire ** `combatResolution` ** on accept; per-ability catalog cooldown; ** `target_defeated` ** cast deny ([NEO-82](../../plans/NEO-82-implementation-plan.md)); [server README — Ability cast (NEO-82) ](../../../server/README.md#ability-cast-neo-31-neo-82 ); Bruno `bruno/neon-sprawl-server/ability-cast/` defeat spine. **NEO-83 landed:** ** `GET /game/world/combat-targets` ** — `CombatTargetsWorldApi` + DTOs; authoritative HP snapshot from ** `ICombatEntityHealthStore` ** ([NEO-83](../../plans/NEO-83-implementation-plan.md)); [server README — Combat targets snapshot (NEO-83) ](../../../server/README.md#combat-targets-snapshot-neo-83 ); Bruno `bruno/neon-sprawl-server/combat-targets/` . **NEO-44 landed:** ** `CombatDefeatGigXpGrant` ** on cast ** `targetDefeated` ** — **25** gig XP to ** `breach` ** via ** `IPlayerGigProgressionStore` ** (V007); ** `GET …/gig-progression` ** ([NEO-44](../../plans/NEO-44-implementation-plan.md), [`NEO-44` manual QA ](../../manual-qa/NEO-44.md )); [server README — Gig progression (NEO-44) ](../../../server/README.md#gig-progression-snapshot-neo-44 ); Bruno `bruno/neon-sprawl-server/gig-progression/` . **NEO-84 landed:** comment-only ** `ability_used` ** / ** `enemy_defeat` ** telemetry hook sites in ** `CombatOperations.TryResolve` **; reserved ** `encounter_start` ** / ** `player_death` ** ([NEO-84](../../plans/NEO-84-implementation-plan.md)); [server README — Combat telemetry hooks (NEO-84) ](../../../server/README.md#combat-telemetry-hooks-neo-84 ). ** Backlog decomposed:** Epic 5 Slice 1 — [E5M1-prototype-backlog.md ](../../plans/E5M1-prototype-backlog.md ) **E5M1-11** [NEO-85 ](https://linear.app/neon-sprawl/issue/NEO-85 ) through **E5M1-12** [NEO-86 ](https://linear.app/neon-sprawl/issue/NEO-86 ). **Precursor landed:** E1.M4 cast funnel (NEO-28/31/32). | [E5M1-prototype-backlog.md ](../../plans/E5M1-prototype-backlog.md ), [E5_M1 ](E5_M1_CombatRulesEngine.md ), [NEO-77 ](../../plans/NEO-77-implementation-plan.md ), [NEO-79 ](../../plans/NEO-79-implementation-plan.md ), [NEO-78 ](../../plans/NEO-78-implementation-plan.md ), [NEO-80 ](../../plans/NEO-80-implementation-plan.md ), [NEO-81 ](../../plans/NEO-81-implementation-plan.md ), [NEO-82 ](../../plans/NEO-82-implementation-plan.md ), [NEO-83 ](../../plans/NEO-83-implementation-plan.md ), [NEO-44 ](../../plans/NEO-44-implementation-plan.md ), [NEO-84 ](../../plans/NEO-84 -implementation-plan.md), [E1M4-prototype-backlog.md ](../../plans/E1M4-prototype-backlog.md ) |
| E5.M1 | In Progress | **NEO-76 landed:** frozen prototype four-ability catalog in [`content/abilities/prototype_abilities.json` ](../../../content/abilities/prototype_abilities.json ); [`ability-def.schema.json` ](../../../content/schemas/ability-def.schema.json ); PR gate + [`validate_content.py` ](../../../scripts/validate_content.py ) E5M1 four-id gate ([NEO-76](../../plans/NEO-76-implementation-plan.md)). **NEO-77 landed:** fail-fast server load of `content/abilities/*_abilities.json` at startup — `server/NeonSprawl.Server/Game/Combat/` ([NEO-77](../../plans/NEO-77-implementation-plan.md)); [server README — Ability catalog ](../../../server/README.md#ability-catalog-contentabilities-neo-77 ). **NEO-79 landed:** injectable ** `IAbilityDefinitionRegistry` ** + DI; hotbar/cast use ** `TryNormalizeKnown` ** ([NEO-79](../../plans/NEO-79-implementation-plan.md)); Bruno `bruno/neon-sprawl-server/hotbar-loadout/` + `ability-cast/` unknown-ability deny smokes. **NEO-78 landed:** ** `GET /game/world/ability-definitions` ** — `AbilityDefinitionsWorldApi` + DTOs in `Game/Combat/` ([NEO-78](../../plans/NEO-78-implementation-plan.md)); [server README — Ability definitions (NEO-78) ](../../../server/README.md#ability-definitions-neo-78 ); Bruno `bruno/neon-sprawl-server/ability-definitions/` . **NEO-80 landed:** ** `ICombatEntityHealthStore` ** / ** `InMemoryCombatEntityHealthStore` ** — lazy prototype dummy HP at ** `PrototypeCombatConstants.MaxPrototypeTargetHp` (100)**; DI via ** `AddCombatEntityHealthStore()` ** ([NEO-80](../../plans/NEO-80-implementation-plan.md)); [server README — Combat entity health (NEO-80) ](../../../server/README.md#combat-entity-health-neo-80 ). **NEO-81 landed:** ** `CombatOperations.TryResolve` ** + ** `CombatResult` ** + ** `CombatReasonCodes` ** — defeated pre-check deny, catalog damage ([NEO-81](../../plans/NEO-81-implementation-plan.md)); [server README — Combat engine (NEO-81) ](../../../server/README.md#combat-engine-neo-81 ). **NEO-82 landed:** ** `AbilityCastApi` ** → ** `CombatOperations.TryResolve` **; nested wire ** `combatResolution` ** on accept; per-ability catalog cooldown; ** `target_defeated` ** cast deny ([NEO-82](../../plans/NEO-82-implementation-plan.md)); [server README — Ability cast (NEO-82) ](../../../server/README.md#ability-cast-neo-31-neo-82 ); Bruno `bruno/neon-sprawl-server/ability-cast/` defeat spine. **NEO-83 landed:** ** `GET /game/world/combat-targets` ** — `CombatTargetsWorldApi` + DTOs; authoritative HP snapshot from ** `ICombatEntityHealthStore` ** ([NEO-83](../../plans/NEO-83-implementation-plan.md)); [server README — Combat targets snapshot (NEO-83) ](../../../server/README.md#combat-targets-snapshot-neo-83 ); Bruno `bruno/neon-sprawl-server/combat-targets/` . **NEO-44 landed:** ** `CombatDefeatGigXpGrant` ** on cast ** `targetDefeated` ** — **25** gig XP to ** `breach` ** via ** `IPlayerGigProgressionStore` ** (V007); ** `GET …/gig-progression` ** ([NEO-44](../../plans/NEO-44-implementation-plan.md), [`NEO-44` manual QA ](../../manual-qa/NEO-44.md )); [server README — Gig progression (NEO-44) ](../../../server/README.md#gig-progression-snapshot-neo-44 ); Bruno `bruno/neon-sprawl-server/gig-progression/` . **NEO-84 landed:** comment-only ** `ability_used` ** / ** `enemy_defeat` ** telemetry hook sites in ** `CombatOperations.TryResolve` **; reserved ** `encounter_start` ** / ** `player_death` ** ([NEO-84](../../plans/NEO-84-implementation-plan.md)); [server README — Combat telemetry hooks (NEO-84) ](../../../server/README.md#combat-telemetry-hooks-neo-84 ). ** NEO-85 landed:** client combat HUD — ** `ability_cast_client.gd` ** parses ** `combatResolution` **; ** `combat_targets_client.gd` **, ** `CastFeedbackLabel` ** resolution copy, ** `CombatTargetHpLabel` **; event-driven GET refresh ([NEO-85](../../plans/NEO-85-implementation-plan.md), [`NEO-85` manual QA ](../../manual-qa/NEO-85.md )); `client/README.md` combat HUD section. **Backlog decomposed:** Epic 5 Slice 1 — **E5M1-12** [NEO-86 ](https://linear.app/neon-sprawl/issue/NEO-86 ) capstone pending . **Precursor landed:** E1.M4 cast funnel (NEO-28/31/32). | [E5M1-prototype-backlog.md ](../../plans/E5M1-prototype-backlog.md ), [E5_M1 ](E5_M1_CombatRulesEngine.md ), [NEO-77 ](../../plans/NEO-77-implementation-plan.md ), [NEO-79 ](../../plans/NEO-79-implementation-plan.md ), [NEO-78 ](../../plans/NEO-78-implementation-plan.md ), [NEO-80 ](../../plans/NEO-80-implementation-plan.md ), [NEO-81 ](../../plans/NEO-81-implementation-plan.md ), [NEO-82 ](../../plans/NEO-82-implementation-plan.md ), [NEO-83 ](../../plans/NEO-83-implementation-plan.md ), [NEO-44 ](../../plans/NEO-44-implementation-plan.md ), [NEO-84 ](../../plans/NEO-84 -implementation-plan.md), [NEO-85 ](../../plans/NEO-85 -implementation-plan.md), [E1M4-prototype-backlog.md ](../../plans/E1M4-prototype-backlog.md ) |
---
---