5.4 KiB
Code review — NEO-84 combat telemetry hook sites
Date: 2026-05-25
Scope: Branch NEO-84-combat-telemetry-hooks · commits fb2bfe5–667a1a9 vs origin/main
Base: origin/main
Verdict
Approve with nits
Summary
NEO-84 delivers E5M1-09: comment-only telemetry hook sites in CombatOperations.TryResolve for Epic 5 Slice 1 catalog names ability_used (every successful resolve, including zero-damage abilities) and enemy_defeat (lethal defeat transition only), plus class-level reserved comments for encounter_start and player_death. All active sites carry TODO(E9.M1): catalog emit with planned payload fields; no runtime behavior, API shape, or test changes. server/README.md, CombatResult.cs, E5_M1_CombatRulesEngine.md, E5M1-prototype-backlog.md, and documentation_and_implementation_alignment.md were updated in the implementation commit. Implementation matches the kickoff plan and acceptance checklist. Residual risk is negligible — comments-only server slice; client combat HUD remains NEO-85 out of scope.
Documentation checked
| Document | Result |
|---|---|
docs/plans/NEO-84-implementation-plan.md |
Matches — kickoff decisions (engine-only hooks, zero-damage ability_used, comments-only, skip manual QA), scope, hook placement table, and acceptance checklist align with code. |
docs/plans/E5M1-prototype-backlog.md · E5M1-09 |
Matches — AC checked; landed note cites TryResolve and README anchor. |
docs/decomposition/modules/E5_M1_CombatRulesEngine.md |
Matches — Status and Related implementation slices entry for E5M1-09 NEO-84. |
docs/decomposition/modules/documentation_and_implementation_alignment.md |
Matches — E5.M1 row cites NEO-84 landed + README link. |
docs/decomposition/modules/module_dependency_register.md |
Matches — E5.M1 note includes NEO-44 and NEO-84 landed (addressed post-review). |
docs/decomposition/epics/epic_05_pve_combat.md · Slice 1 telemetry vocabulary |
Matches — hook names align with epic list. |
docs/decomposition/modules/client_server_authority.md |
Matches — server-authoritative resolve path; no client telemetry. |
server/README.md |
Matches — combat telemetry hooks subsection; distinguishes NEO-30 cast funnel from E5 combat-outcome names. |
| Full-stack epic decomposition | Matches — plan documents no client counterpart; NEO-85 owns HUD. |
| Manual QA | N/A — kickoff skip (NEO-71/NEO-83 pattern). |
Blocking issues
None.
Suggestions
-
StaleDone. E5.M1 note appended NEO-44 + NEO-84 landed; E2.M2 note corrected NEO-44 status.module_dependency_registerE5.M1 note — The long E5.M1 note paragraph still ends at NEO-83 landed and omits NEO-44 (gig XP) and NEO-84 (telemetry hooks) even thoughE5_M1_CombatRulesEngine.mdand the alignment register were updated. Append landed one-liners (mirror alignment row) so dependency-register readers stay consistent. -
Damage-pathDone. Post-damageability_usedpayload comment parity — The zero-damage branch documents thatplayerIdis out of engine scope and should be correlated atAbilityCastApiaccept; the post-damageability_usedblock lists payload fields but omits that note. Copy the one-lineplayerIdcorrelation hint for E9.M1 wiring consistency.ability_usedblock now includes theplayerIdcorrelation line.
Nits
-
Nit:
enemy_defeatuses an emptyif (after.Defeated) { …comments… }block — intentional hook anchoring (same pattern asgather_node_depletedinGatherOperations); fine as-is. -
Nit: Class-level reserved-site comments sit immediately above the
TryResolveXML summary rather than in a dedicated region after all methods — readable and matches “class-level reserved block” kickoff decision; optional reorder only if a style guide emerges. -
Nit:Done. Addressed with suggestion 1 register update.E2.M2 noteinmodule_dependency_registerstill says NEO-44 remains backlog — pre-existing staleness unrelated to this diff; fix when touching register for suggestion 1.
Verification
cd /home/don/neon-sprawl/server
dotnet test NeonSprawl.Server.Tests/NeonSprawl.Server.Tests.csproj \
--filter "FullyQualifiedName~CombatOperations"
dotnet test NeonSprawl.Server.Tests/NeonSprawl.Server.Tests.csproj \
--filter "FullyQualifiedName~AbilityCastApiTests"
CombatOperationsTests: 10/10 passed (local run).
AbilityCastApiTests: 21/21 passed (local run).
Manual (optional): Confirm hook comment blocks in server/NeonSprawl.Server/Game/Combat/CombatOperations.cs cite ability_used / enemy_defeat / reserved names, include TODO(E9.M1), and that enemy_defeat sits only after TryApplyDamage when after.Defeated. Optional Bruno ability-cast/ + combat-targets/ regression — no request/response change expected.