diff --git a/docs/manual-qa/NEO-141.md b/docs/manual-qa/NEO-141.md deleted file mode 100644 index 3dd07dc..0000000 --- a/docs/manual-qa/NEO-141.md +++ /dev/null @@ -1,34 +0,0 @@ -# Manual QA — NEO-141 (faction telemetry hook sites) - -Reference: [implementation plan](../plans/NEO-141-implementation-plan.md), [NEO-136 implementation plan](../plans/NEO-136-implementation-plan.md) (reputation ops), [NEO-137 implementation plan](../plans/NEO-137-implementation-plan.md) (gate ops). - -## Preconditions - -- Run `NeonSprawl.Server` (`dotnet run` from `server/NeonSprawl.Server`; default `http://localhost:5253`) if exercising Bruno; not required for code review only. -- This story adds **comments only**; faction standing, gate eval, and reward delivery behavior match NEO-136/137/138. - -## Code review check - -- [ ] Open `server/NeonSprawl.Server/Game/Factions/ReputationOperations.cs`. -- [ ] Confirm **`reputation_delta`** comment block immediately after **`auditStore.TryAppend`** returns **`true`**. -- [ ] Confirm **`TODO(E9.M1)`** markers and planned payload fields; **no** new `ILogger` or metrics calls. -- [ ] Open `server/NeonSprawl.Server/Game/Factions/FactionGateOperations.cs`. -- [ ] Confirm **`faction_gate_blocked`** comment on standing read-failure deny and threshold deny branches. -- [ ] Confirm **no** duplicate hook comments in **`QuestStateOperations`**, **`QuestAcceptApi`**, **`FactionStandingApi`**, or **`RewardRouterOperations`** for these event names. -- [ ] Open [server README — Faction telemetry hooks (NEO-141)](../../server/README.md#faction-telemetry-hooks-neo-141) — NEO-141 subsection present with event table. -- [ ] Open [server README — Reward telemetry hooks (NEO-130)](../../server/README.md#reward-telemetry-hooks-neo-130) — **`reputation_delta`** stub row removed; cross-link to NEO-141 present. - -## Regression (optional) - -```bash -cd server && dotnet test NeonSprawl.sln -``` - -Expect all tests pass (comments-only change). - -## Bruno (optional sanity) - -From `bruno/neon-sprawl-server/` against a running server: - -- **Accept grid contract faction gate deny** — **`faction_gate_blocked`** deny unchanged. -- **Accept grid contract after operator chain** — rep grant + accept success unchanged. diff --git a/docs/plans/E7M3-pre-production-backlog.md b/docs/plans/E7M3-pre-production-backlog.md index f812a2f..735dace 100644 --- a/docs/plans/E7M3-pre-production-backlog.md +++ b/docs/plans/E7M3-pre-production-backlog.md @@ -307,7 +307,7 @@ Accepting **`prototype_quest_grid_contract`** before operator-chain completion o - [x] Hook sites documented in README; no behavior change beyond comments. -**Landed (NEO-141):** comment-only **`reputation_delta`** in **`ReputationOperations.TryApplyDelta`**; **`faction_gate_blocked`** in **`FactionGateOperations.TryEvaluate`** (threshold + standing read failure); router duplicate stub removed; [server README — Faction telemetry hooks (NEO-141)](../../../server/README.md#faction-telemetry-hooks-neo-141); manual QA [`NEO-141.md`](../../manual-qa/NEO-141.md). +**Landed (NEO-141):** comment-only **`reputation_delta`** in **`ReputationOperations.TryApplyDelta`**; **`faction_gate_blocked`** in **`FactionGateOperations.TryEvaluate`** (threshold + standing read failure); router duplicate stub removed; [server README — Faction telemetry hooks (NEO-141)](../../../server/README.md#faction-telemetry-hooks-neo-141). **Client counterpart:** none (infrastructure-only). diff --git a/docs/plans/NEO-141-implementation-plan.md b/docs/plans/NEO-141-implementation-plan.md index 964da71..61ab402 100644 --- a/docs/plans/NEO-141-implementation-plan.md +++ b/docs/plans/NEO-141-implementation-plan.md @@ -25,7 +25,7 @@ Anchor future E9.M1 catalog events **`reputation_delta`** and **`faction_gate_bl | **`faction_gate_blocked` anchor** | **`FactionGateOperations.TryEvaluate`** deny paths only — not duplicate in **`QuestStateOperations.TryAccept`** or **`QuestAcceptApi`** | Backlog lists ops + TryAccept flow; NEO-137 placed hook at eval engine; HTTP maps all gate failures to `faction_gate_blocked` | | **Standing read failure deny** | **Same event name** with ops **`reasonCode`** in planned payload (`unknown_faction` vs `gate_blocked`) — add comment block on read-failure branch | NEO-137 review: ops may carry `unknown_faction` for telemetry while quest HTTP surfaces `faction_gate_blocked` | | **Emit timing for `reputation_delta`** | After **`auditStore.TryAppend`** returns **`true`** (standing + audit committed) — not on deny, audit rollback, or compensating revert paths | NEO-136 success path; mirror NEO-49 idempotent “commit site only” | -| **Manual QA doc** | **`docs/manual-qa/NEO-141.md`** — NEO-121/130 comment-only verification pattern | Infrastructure-only server story | +| **Manual QA doc** | **None** — comment-only server story; `dotnet test` covers regression ([NEO-140](NEO-140-implementation-plan.md) precedent; [planning-implementation-docs](../.cursor/rules/planning-implementation-docs.md) skip when AC fully automated) | Infrastructure-only; no user-visible behavior | ## Scope and out-of-scope @@ -36,7 +36,6 @@ Anchor future E9.M1 catalog events **`reputation_delta`** and **`faction_gate_bl - Remove duplicate **`reputation_delta`** stub from **`RewardRouterOperations`**. - **`server/README.md`** — dedicated **Faction telemetry hooks (NEO-141)** subsection; update **Reward telemetry hooks (NEO-130)** table to cross-link (remove stub row). - **`E7_M3_FactionReputationLedger.md`**, alignment register, E7M3 backlog updates when implementation completes. -- **`docs/manual-qa/NEO-141.md`**. **Out of scope:** @@ -57,7 +56,7 @@ Anchor future E9.M1 catalog events **`reputation_delta`** and **`faction_gate_bl - **`FactionGateOperations.TryEvaluate`:** **`faction_gate_blocked`** hooks on threshold deny and standing read-failure deny (ops `reasonCode` in payload note). - **`RewardRouterOperations`:** duplicate **`reputation_delta`** stub removed — single ops-layer anchor. - **Docs:** `server/README.md` **Faction telemetry hooks (NEO-141)** subsection; NEO-130 reward table cross-link; E7.M3 module + alignment register + E7M3 backlog updated. -- **Manual QA:** `docs/manual-qa/NEO-141.md`. +- **Manual QA:** none — comment-only server story; `dotnet test` covers regression (manual QA checklists reserved for user-visible stories per project convention). ## Technical approach @@ -138,9 +137,7 @@ sequenceDiagram ## Files to add -| Path | Rationale | -|------|-----------| -| `docs/manual-qa/NEO-141.md` | Manual QA: verify comment blocks + no behavior/API change (NEO-121/130 pattern) | +None — comment-only changes to existing ops files and docs; no new source or test files. ## Files to modify @@ -158,7 +155,7 @@ sequenceDiagram | File | Coverage | |------|----------| -| *(none added or changed)* | Comments-only change; no behavior or wire contract change. Regression: `dotnet test NeonSprawl.sln` (existing faction/quest/reward tests unchanged). Manual verification: **`docs/manual-qa/NEO-141.md`**. | +| *(none added or changed)* | Comments-only change; no behavior or wire contract change. Regression: `dotnet test NeonSprawl.sln` (existing faction/quest/reward tests unchanged). | ## Open questions / risks diff --git a/docs/reviews/2026-06-17-NEO-141.md b/docs/reviews/2026-06-17-NEO-141.md index 38a0517..b309d71 100644 --- a/docs/reviews/2026-06-17-NEO-141.md +++ b/docs/reviews/2026-06-17-NEO-141.md @@ -21,7 +21,7 @@ This branch lands **E7M3-09**: comment-only telemetry anchor sites for future E9 | `docs/decomposition/modules/E7_M3_FactionReputationLedger.md` | **Matches** — Status line notes E7M3-09 landed (NEO-141); Responsibilities “Emit telemetry hook sites” satisfied at comment layer. | | `docs/decomposition/modules/documentation_and_implementation_alignment.md` | **Matches** — E7.M3 row updated with NEO-141 telemetry + README link. | | `docs/decomposition/modules/module_dependency_register.md` | **N/A change** — no register row edit required beyond module doc / alignment table. | -| `docs/manual-qa/NEO-141.md` | **Matches** — NEO-130-style code-review checklist; Bruno optional sanity steps. | +| `docs/manual-qa/NEO-141.md` | **N/A (removed)** — comment-only server story; no user-visible manual QA per [NEO-140](NEO-140-implementation-plan.md) / [planning-implementation-docs](../../.cursor/rules/planning-implementation-docs.md) skip rule. | | `docs/plans/NEO-140-implementation-plan.md` | **Matches** — manual QA removal note consistent with story-end convention (bundled in branch). | | `server/README.md` | **Matches** — Faction telemetry hooks (NEO-141) subsection; NEO-130 table cross-link; no duplicate router stub. | @@ -44,12 +44,7 @@ None. cd /Users/don/neon-sprawl && dotnet test NeonSprawl.sln ``` -Manual (see `docs/manual-qa/NEO-141.md` — code review checklist): - -- Confirm hook comment blocks in `ReputationOperations.cs`, `FactionGateOperations.cs`; no **`reputation_delta`** stub in `RewardRouterOperations.cs`. -- Confirm README NEO-141 subsection and NEO-130 cross-link. - -Optional Bruno (unchanged behavior): +Manual verification: `dotnet test NeonSprawl.sln`; optional Bruno gate/rep flows unchanged. - `quest-progress/Accept grid contract faction gate deny` - `quest-progress/Accept grid contract after operator chain` diff --git a/server/README.md b/server/README.md index efd1920..a1d05f0 100644 --- a/server/README.md +++ b/server/README.md @@ -143,7 +143,7 @@ Comment-only hook sites for future E9.M1 catalog events ([Epic 7 Slice 3](../../ | **`reputation_delta`** | **`ReputationOperations.TryApplyDelta`** | After successful audit append (auditable apply committed). | | **`faction_gate_blocked`** | **`FactionGateOperations.TryEvaluate`** | On any rule deny (threshold or standing read failure). | -Manual QA: [`docs/manual-qa/NEO-141.md`](../../docs/manual-qa/NEO-141.md); plan: [NEO-141 implementation plan](../../docs/plans/NEO-141-implementation-plan.md). +Plan: [NEO-141 implementation plan](../../docs/plans/NEO-141-implementation-plan.md). **Dev quest fixture (NEO-137, Bruno/manual QA):** When `Game:EnableQuestFixtureApi` is **true** (default in **Development** via `appsettings.Development.json`, **Testing**, or CI Bruno step) or the host environment is **Development** / **Testing**, **`POST /game/players/{id}/__dev/quest-fixture`** accepts `schemaVersion` **1** with optional (resets run before **`completedQuestIds`** when combined): - **`resetQuestIds`** — deletes each quest's progress row for the player and clears matching **`IRewardDeliveryStore`** + quest-completion **`IReputationDeltaStore`** audit rows (idempotent when absent).