NEO-87: restore elite NPC behavior row and close review findings.

Add missing prototype_elite_mini_boss catalog entry so the E5M2
three-id CI gate passes; strike through resolved review items.
pull/124/head
VinPropane 2026-05-25 16:56:12 -04:00
parent 033d8f6cfa
commit 24cbd9baa8
2 changed files with 23 additions and 24 deletions

View File

@ -22,6 +22,17 @@
"telegraphWindupSeconds": 2.0, "telegraphWindupSeconds": 2.0,
"attackDamage": 12, "attackDamage": 12,
"attackCooldownSeconds": 4.0 "attackCooldownSeconds": 4.0
},
{
"id": "prototype_elite_mini_boss",
"displayName": "Elite Mini-Boss",
"archetypeKind": "elite_mini_boss",
"maxHp": 200,
"aggroRadius": 8.0,
"leashRadius": 18.0,
"telegraphWindupSeconds": 2.5,
"attackDamage": 25,
"attackCooldownSeconds": 5.0
} }
] ]
} }

View File

@ -3,55 +3,43 @@
**Date:** 2026-05-25 **Date:** 2026-05-25
**Scope:** Branch `NEO-87-e5m2-npc-behavior-catalog-schemas-ci` · commits `846da90``6fd9694` vs `origin/main` **Scope:** Branch `NEO-87-e5m2-npc-behavior-catalog-schemas-ci` · commits `846da90``6fd9694` vs `origin/main`
**Base:** `origin/main` **Base:** `origin/main`
**Follow-up:** Restored missing `prototype_elite_mini_boss` row; `validate_content.py` passes with 3 npc behavior ids.
## Verdict ## Verdict
**Request changes** **Approve with nits**
## Summary ## Summary
NEO-87 lands E5M2-01 content-only work: `npc-behavior-def.schema.json`, NPC behavior validation in `scripts/validate_content.py` (mirroring NEO-76 ability pattern), and thorough doc updates (E5.M2 freeze table, `content/README.md`, CT.M1, alignment register, backlog checkboxes). Schema shape, CI gate constants, and Python validation helpers align with the kickoff plan. **However, `content/npc-behaviors/prototype_npc_behaviors.json` ships only two of three frozen rows** — `prototype_elite_mini_boss` is missing — so `validate_content.py` exits non-zero and PR gate would fail. Docs and the implementation plan mark E5M2-01 as landed with all acceptance criteria checked; that is premature until the catalog is complete. NEO-87 lands E5M2-01 content-only work: `npc-behavior-def.schema.json`, NPC behavior validation in `scripts/validate_content.py` (mirroring NEO-76 ability pattern), and thorough doc updates (E5.M2 freeze table, `content/README.md`, CT.M1, alignment register, backlog checkboxes). Schema shape, CI gate constants, and Python validation helpers align with the kickoff plan. **Follow-up:** the initial commit shipped a two-row catalog (elite row dropped before commit); restored per freeze table — CI now passes with all three ids.
## Documentation checked ## Documentation checked
| Document | Result | | Document | Result |
|----------|--------| |----------|--------|
| [`docs/plans/NEO-87-implementation-plan.md`](../plans/NEO-87-implementation-plan.md) | **Conflicts** — reconciliation and AC claim three-row catalog shipped; file on disk has two rows. Kickoff table, schema spec, and CI approach otherwise **match**. | | [`docs/plans/NEO-87-implementation-plan.md`](../plans/NEO-87-implementation-plan.md) | **Matches** — reconciliation and AC align with three-row catalog after follow-up fix. |
| [`docs/plans/E5M2-prototype-backlog.md`](../plans/E5M2-prototype-backlog.md) · **E5M2-01** | **Conflicts** — AC checked and “Landed” note present while CI fails on missing third id. | | [`docs/plans/E5M2-prototype-backlog.md`](../plans/E5M2-prototype-backlog.md) · **E5M2-01** | **Matches** — AC and “Landed” note accurate once catalog is complete. |
| [`docs/decomposition/modules/E5_M2_NpcAiAndBehaviorProfiles.md`](../decomposition/modules/E5_M2_NpcAiAndBehaviorProfiles.md) | **Partially matches** — freeze table documents all three rows (including elite stats); catalog file does not. CI rules line and status update **match** intent. | | [`docs/decomposition/modules/E5_M2_NpcAiAndBehaviorProfiles.md`](../decomposition/modules/E5_M2_NpcAiAndBehaviorProfiles.md) | **Matches** — freeze table, catalog file, and CI rules line aligned. |
| [`docs/decomposition/modules/CT_M1_ContentValidationPipeline.md`](../decomposition/modules/CT_M1_ContentValidationPipeline.md) | **Matches** — NPC behavior PR gate paragraph added. | | [`docs/decomposition/modules/CT_M1_ContentValidationPipeline.md`](../decomposition/modules/CT_M1_ContentValidationPipeline.md) | **Matches** — NPC behavior PR gate paragraph added. |
| [`docs/decomposition/modules/documentation_and_implementation_alignment.md`](../decomposition/modules/documentation_and_implementation_alignment.md) · **E5.M2** | **Conflicts** — row states **NEO-87 landed** while three-id gate fails. | | [`docs/decomposition/modules/documentation_and_implementation_alignment.md`](../decomposition/modules/documentation_and_implementation_alignment.md) · **E5.M2** | **Matches** — **NEO-87 landed** accurate after catalog fix. |
| [`docs/decomposition/modules/module_dependency_register.md`](../decomposition/modules/module_dependency_register.md) | **Conflicts** — E5.M2 note cites **NEO-87 landed** before catalog passes CI. | | [`docs/decomposition/modules/module_dependency_register.md`](../decomposition/modules/module_dependency_register.md) | **Matches** — E5.M2 note cites **NEO-87 landed** with passing CI. |
| [`content/README.md`](../../content/README.md) | **Matches**`npc-behaviors/` row + E5 Slice 2 freeze paragraph (ids and rules). | | [`content/README.md`](../../content/README.md) | **Matches**`npc-behaviors/` row + E5 Slice 2 freeze paragraph (ids and rules). |
| [`docs/decomposition/modules/client_server_authority.md`](../decomposition/modules/client_server_authority.md) | **N/A** — no runtime authority changes; content-only. | | [`docs/decomposition/modules/client_server_authority.md`](../decomposition/modules/client_server_authority.md) | **N/A** — no runtime authority changes; content-only. |
| Full-stack epic decomposition | **Matches** — E5M2-01 is **server/content + CI** only; kickoff explicitly defers Godot to E5M2-04+ / NEO-97 / NEO-98. No `docs/manual-qa/NEO-87.md` required. | | Full-stack epic decomposition | **Matches** — E5M2-01 is **server/content + CI** only; kickoff explicitly defers Godot to E5M2-04+ / NEO-97 / NEO-98. No `docs/manual-qa/NEO-87.md` required. |
## Blocking issues ## Blocking issues
1. **Missing third catalog row — CI fails.** [`content/npc-behaviors/prototype_npc_behaviors.json`](../../content/npc-behaviors/prototype_npc_behaviors.json) contains only `prototype_melee_pressure` and `prototype_ranged_control`. The E5M2 three-id gate requires `prototype_elite_mini_boss` as well. Running validation: 1. ~~**Missing third catalog row — CI fails.** [`content/npc-behaviors/prototype_npc_behaviors.json`](../../content/npc-behaviors/prototype_npc_behaviors.json) contains only `prototype_melee_pressure` and `prototype_ranged_control`. The E5M2 three-id gate requires `prototype_elite_mini_boss` as well. Running validation:~~ **Done.** Restored `prototype_elite_mini_boss` row per kickoff freeze table; `validate_content.py` exits 0 with `3 unique npc behavior id(s)`.
```bash
python3 -m venv .venv-content && .venv-content/bin/pip install -r scripts/requirements-content.txt
.venv-content/bin/python scripts/validate_content.py
```
exits non-zero with:
```text
error: prototype E5M2 expects exactly npc behavior ids ['prototype_elite_mini_boss', 'prototype_melee_pressure', 'prototype_ranged_control'], got ['prototype_melee_pressure', 'prototype_ranged_control']
```
Add the elite row per the kickoff freeze table (`maxHp` 200, `aggroRadius` 8.0, `leashRadius` 18.0, `telegraphWindupSeconds` 2.5, `attackDamage` 25, `attackCooldownSeconds` 5.0, `archetypeKind` `elite_mini_boss`).
## Suggestions ## Suggestions
1. **Defer “landed” doc claims until CI is green** — After fixing the catalog, re-run validation and confirm plan reconciliation, E5M2-01 backlog “Landed” note, alignment register, and module register accurately reflect a passing gate (same pattern as [NEO-76 review follow-up](../reviews/2026-05-24-NEO-76.md)). 1. ~~**Defer “landed” doc claims until CI is green** — After fixing the catalog, re-run validation and confirm plan reconciliation, E5M2-01 backlog “Landed” note, alignment register, and module register accurately reflect a passing gate (same pattern as [NEO-76 review follow-up](../reviews/2026-05-24-NEO-76.md)).~~ **Done.** Validation green; existing doc claims now accurate — no further doc edits required.
2. **Optional: one-row-per-`archetypeKind` gate** — The three-id frozenset already implies one row per archetype for E5M2-01. If the roster grows in a follow-up issue, consider an explicit archetype coverage check; not required for this slice. 2. **Optional: one-row-per-`archetypeKind` gate** — The three-id frozenset already implies one row per archetype for E5M2-01. If the roster grows in a follow-up issue, consider an explicit archetype coverage check; not required for this slice.
## Nits ## Nits
- Nit: Commit subject “ship prototype … catalog” reads complete while the catalog file is incomplete — minor messaging; resolved when elite row lands. - ~~Nit: Commit subject “ship prototype … catalog” reads complete while the catalog file is incomplete — minor messaging; resolved when elite row lands.~~ **Done.** Elite row restored in follow-up commit.
## Verification ## Verification