7.4 KiB
NEO-27 — Implementation plan
Story reference
| Field | Value |
|---|---|
| Key | NEO-27 |
| Title | E1.M3: Slice 3 telemetry hook sites (target_changed, …) |
| Linear | NEO-27 |
| Slug | E1M3-05 |
| Git branch | NEO-27-e1m3-slice-3-telemetry-hook-sites |
| Parent context | Epic 1 — Core Player Runtime · E1M3 prototype backlog |
| Decomposition | Epic 1 Slice 3 — telemetry hooks; E1.M3 — InteractionAndTargetingLayer |
Kickoff clarifications
- Q1 (resolved): Where should reserved
ability_cast_requested/ability_cast_deniedhook comments live for this story? - Answer: Keep them in
client/scripts/main.gd(no extra placeholder script in NEO-27). - Why no additional blocking questions: Event names, scope, and out-of-scope were explicit in Linear + backlog docs; this was the only implementation-location decision not already settled.
Goal, scope, and out-of-scope
Goal: Establish documented hook sites for Epic 1 Slice 3 product telemetry names: target_changed (wired to real selection transitions), plus reserved (no-op / comment-only) sites for ability_cast_requested and ability_cast_denied until E1.M4 + E5.M1. All real ingest waits on TODO(E9.M1) per E9.M1 — TelemetryEventSchema.
In scope
- Event names in code or doc comments matching epic Slice 3 (
target_changed,ability_cast_requested,ability_cast_denied). TODO(E9.M1)at each hook site until a catalog exists.- Optional dev logging when a flag is enabled (reuse or extend the NEO-26
log_selection_eventspattern on the client; optionalILogger/Debug.WriteLineguard on server only if we add a clearly dev-gated path—prefer comments + single optional trace line consistent with repo norms). documentation_and_implementation_alignment.md: extend the E1.M3 snapshot row to mention NEO-27 hook sites (per Linear acceptance; NEO-23 is already onmain).
Out of scope
- Production ingest, dashboards, OpenTelemetry.
- Changing
TargetState/ HTTP contracts (NEO-23). - Implementing real ability cast requests (E1.M4).
Acceptance criteria checklist
- Documented event names in-repo matching Slice 3:
target_changed,ability_cast_requested,ability_cast_denied(latter two may be comment-only reserves). TODO(E9.M1)at each hook site referencing schema work.- Optional dev logging for
target_changedwhen a documented flag is on (or explicitly documented that an existing flag covers it, with log line including the product event name). documentation_and_implementation_alignment.mdE1.M3 row updated for NEO-27.
Technical approach
-
target_changed(client) — Canonical prototype mirror: whenTargetSelectionClientemitsselection_event(NEO-26), the product telemetry name istarget_changed(same transition: normalizedlockedTargetIdchange, withcause/sequencecarrying intent). Add a short class-level or method-level note on_maybe_emit_selection_eventlinkingselection_event→target_changed. Optionally prefix devprint(whenlog_selection_eventsis true) with a literaltarget_changedtoken so grep and QA are unambiguous. -
target_changed(server) — Authoritative lock id transitions occur inInMemoryPlayerTargetLockStore.ApplySet/ApplyClearwhen the stored lock id actually changes (sequence bumps). Add//////comments (andTODO(E9.M1)) at those mutation success paths as the server-side hook site fortarget_changed. Rationale: single choke point; HTTP handlers stay thin. -
ability_cast_requested/ability_cast_denied(reserve) — No hotbar or cast route exists yet. Add a compact comment block inclient/scripts/main.gd(or the first file E1.M4 will extend for input, if we prefer—Decision:main.gdnext to other prototype wiring) listing the two event names and pointing to E1.M4 / E5.M1 + E9.M1. Optionally mirror a one-line reserve inTargetingApi.csnear denial responses noting thatability_cast_denied(withreasonCode) will attach to a future cast POST, not the current target-select deny path—avoids confusion with selection denials. -
Docs alignment — Append to the E1.M3 Snapshot cell: NEO-27 documents Slice 3 telemetry hook sites; link this plan.
Files to add
| Path | Rationale |
|---|---|
docs/manual-qa/NEO-27.md |
Ticket-level manual verification checklist for Slice 3 telemetry hook-site behavior and expectations. |
Files to modify
| Path | Rationale |
|---|---|
client/scripts/target_selection_client.gd |
Document target_changed ↔ selection_event; optional dev log prefix; TODO(E9.M1). |
server/NeonSprawl.Server/Game/Targeting/InMemoryPlayerTargetLockStore.cs |
Server authoritative target_changed hook site on lock id transitions. |
client/scripts/main.gd |
Reserved comment block for ability_cast_requested / ability_cast_denied (E1.M4 + E5.M1). |
server/NeonSprawl.Server/Game/Targeting/TargetingApi.cs |
Optional one-line reserve clarifying cast denials vs target-select denials (avoids mis-mapping event names). |
client/README.md |
Short “Slice 3 telemetry (NEO-27)” pointer next to SelectionEvent section. |
docs/decomposition/modules/documentation_and_implementation_alignment.md |
E1.M3 snapshot: NEO-27 telemetry hook sites landed (per team rule). |
docs/decomposition/modules/E1_M3_InteractionAndTargetingLayer.md |
Optional one-line under telemetry: code hook pointers (target_selection_client.gd, lock store)—only if the module table still says hooks are TODO-only; keep register alignment. |
docs/plans/NEO-27-implementation-plan.md |
Keep kickoff clarifications and resolved decisions synchronized with actual implementation choices. |
Tests
| File | Action |
|---|---|
client/test/selection_event_client_test.gd |
Change only if new observable behavior is added (e.g. new export or signal). If implementation is comments + optional print format only, no test change — manual QA: enable log_selection_events, tab/clear, confirm output contains target_changed. |
docs/manual-qa/NEO-27.md |
Add explicit manual checks for target_changed log token, id-change-only emission behavior, and ability telemetry reserve documentation. |
Server: No new tests required for comment-only / dev-trace placeholders unless we introduce a testable abstraction (out of scope).
Open questions / risks
Resolved (2026-04-26): Linear no longer lists NEO-24 as blocking NEO-27 (dependency removed on board).
Resolved (2026-04-26): Keep ability telemetry reserve comments in client/scripts/main.gd for NEO-27; no placeholder script yet.
None otherwise.