NEO-141: remove server-only manual QA doc after story end
Comment-only infrastructure story — acceptance fully covered by dotnet test; align with NEO-140 and planning-implementation-docs skip rule.pull/182/head
parent
e102a6b539
commit
b4d48f6e36
|
|
@ -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.
|
|
||||||
|
|
@ -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.
|
- [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).
|
**Client counterpart:** none (infrastructure-only).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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` |
|
| **`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` |
|
| **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” |
|
| **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
|
## 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`**.
|
- 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).
|
- **`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.
|
- **`E7_M3_FactionReputationLedger.md`**, alignment register, E7M3 backlog updates when implementation completes.
|
||||||
- **`docs/manual-qa/NEO-141.md`**.
|
|
||||||
|
|
||||||
**Out of scope:**
|
**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).
|
- **`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.
|
- **`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.
|
- **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
|
## Technical approach
|
||||||
|
|
||||||
|
|
@ -138,9 +137,7 @@ sequenceDiagram
|
||||||
|
|
||||||
## Files to add
|
## Files to add
|
||||||
|
|
||||||
| Path | Rationale |
|
None — comment-only changes to existing ops files and docs; no new source or test files.
|
||||||
|------|-----------|
|
|
||||||
| `docs/manual-qa/NEO-141.md` | Manual QA: verify comment blocks + no behavior/API change (NEO-121/130 pattern) |
|
|
||||||
|
|
||||||
## Files to modify
|
## Files to modify
|
||||||
|
|
||||||
|
|
@ -158,7 +155,7 @@ sequenceDiagram
|
||||||
|
|
||||||
| File | Coverage |
|
| 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
|
## Open questions / risks
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/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/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/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). |
|
| `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. |
|
| `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
|
cd /Users/don/neon-sprawl && dotnet test NeonSprawl.sln
|
||||||
```
|
```
|
||||||
|
|
||||||
Manual (see `docs/manual-qa/NEO-141.md` — code review checklist):
|
Manual verification: `dotnet test NeonSprawl.sln`; optional Bruno gate/rep flows unchanged.
|
||||||
|
|
||||||
- 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):
|
|
||||||
|
|
||||||
- `quest-progress/Accept grid contract faction gate deny`
|
- `quest-progress/Accept grid contract faction gate deny`
|
||||||
- `quest-progress/Accept grid contract after operator chain`
|
- `quest-progress/Accept grid contract after operator chain`
|
||||||
|
|
|
||||||
|
|
@ -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). |
|
| **`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). |
|
| **`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):
|
**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).
|
- **`resetQuestIds`** — deletes each quest's progress row for the player and clears matching **`IRewardDeliveryStore`** + quest-completion **`IReputationDeltaStore`** audit rows (idempotent when absent).
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue