# Sprint 11: Combine — Joint / Integration **Goal:** Complete the Gauntlet test matrix with final interaction-combination rooms and cross-room scenarios, deliver the WRONG-button bug-capture system, resolve open implementation questions OQ-07 and OQ-18, and add contraband detection — hardening the system as a fully covered, testable unit. **Agents:** Dudley, Tyre, Hoshe (server); Stig, Tyre, Hoshe (client) --- ## Pre-Sprint Decisions | Item | Status | Needed by | |------|--------|-----------| | OQ-18 resolution (#524) | Resolve day 1-2. Output: new D-NNN decision in `decisions/`. May require update to dialogue filter in #305. | Downstream content work (unblocked immediately on resolution) | | OQ-07 resolution (#522) | Resolve day 1-2. Output: D-056 or D-057 amendment. | #507 (WRONG button — cursor state data in captures) | | RNG seed in ObserverSnapshot | Client team must confirm whether seed is already present in the snapshot wire format. If not, server team must add it. Raise on day 1. | #507 (replay seed capture) | No other decisions are required before Sprint 11 begins. All other tickets operate within confirmed decisions. --- ## Cross-Team Dependencies ``` Server #504 (Sprint Gauntlet, Eavesdrop Alcove, Confrontation Stage) → Server #506 (cross-room transitions T1-T8) Client #507 (WRONG button full captures) → potential Server protocol change (RNG seed field on ObserverSnapshot) raise day 1 if needed; server team to respond same day Server #524 (OQ-18 resolution) → no client code change, but unblocks copy team content work Client #522 (OQ-07 resolution) → cursor_renderer.gd + interaction list renderer update (client-only) ``` **Critical path:** `Server #504 → Server #506`. Server team should start #504 immediately. All other tickets are independent parallel tracks. **Potential protocol dependency:** If #507 requires adding a seed field to `ObserverSnapshot`, this is a server change that the client depends on. Identify this on day 1 and route it through the server team as a minimal, additive struct field with `#[serde(default)]` so the client handles older snapshots gracefully during development. --- ## Sprint Completion Proof Sprint 11 is complete when all of the following are observable: **Gauntlet expansion (server #504)** - Server boots with Gauntlet content and all 10 rooms load without panic (7 from Sprint 10 + 3 new: Sprint Gauntlet, Eavesdrop Alcove, Confrontation Stage) - Room constants for all 3 new rooms in `server/src/test_world/constants.rs` - Sprint Gauntlet: player sprints past an NPC → interaction buffer empty during sprint, anomaly monologue fires retroactively post-sprint - Eavesdrop Alcove: player in Careful stance at eavesdrop position → World SFX boost observable in log, conversation murmur event emitted - Confrontation Stage: player confronts NPC → peripheral NPC movement during confrontation does NOT trigger anomaly monologue; delayed "did I miss something?" monologue fires post-confrontation **Cross-room transitions (server #506)** - `make test-server` includes 8 cross-room transition tests (T1-T8) - All 8 pass: knowledge state, inventory, fog carry-over, and stance all survive room transitions correctly - T2 (Inventory Interact): item `CarriedBy` survives transition; item absent from tile queries in new room; present in player inventory in snapshot **Content scaling (server #513)** - `make test-server` includes the 100-tick max-NPC stress test - Test passes: every tick within D-026 100ms budget at maximum Active tier entity count (80 NPCs) - Behavioral regression check passes: baseline NPC subset matches `tests/perf/baseline.json` at tick 100 **Contraband detection (server #425)** - NPC with `ScanAuthority` within interaction range of player carrying a `Contraband`-flagged item → NPC KG updated with `HasContraband` fact at `KnowsDetails` confidence - Scan event present in ObserverSnapshot for that tick - No scan event emitted when player carries no contraband items - BTreeMap used for KG storage (D-010 determinism, D-041) **OQ-18 resolved (server #524)** - New D-NNN decision committed to `decisions/` (content.md or architecture.md as appropriate) - Decision states clearly whether dialogue access tiers and D-041 confidence tiers are the same system or layered - If #305 dialogue filter changed: `make test-server` still passes **WRONG button full captures (client #507)** - F12 during Gauntlet play → bug report directory contains: `inputs.jsonl` (60 ticks of PlayerInput history), `snapshots.jsonl` (60 ticks of ObserverSnapshot history), `seed.txt` (server RNG seed), plus existing MVP files (text render, description) - `tooling/test-client --replay inputs.jsonl` against a fresh server with matching seed reproduces the same snapshot sequence - Ring buffer pre-allocated at startup — no per-tick allocation in hot path **OQ-07 resolved (client #522)** - D-056 or D-057 amended with OQ-07 resolution note - `client/scripts/rendering/cursor_renderer.gd` enforces the chosen insert-off behavior - Interaction verb labels absent (or reduced per chosen option) when insert is off in Gauntlet test mode --- ## Test Plan Alignment (D-030) | D-030 Phase | Coverage | Sprint 11 Status | |-------------|----------|-----------------| | Phase 1 (infra) | Done Sprints 1-2 | — | | Phase 2 (integration) | Done Sprints 3-5 | — | | Phase 3 (CauseChain, divergent snapshots) | Gauntlet golden suite expanded Sprint 9-10 | Expanding with 3 new rooms (#504) | | Cross-room transitions | T1-T8 from Gestalt (#506) | In scope this sprint | | Replay / scripted testing | Replay loading done (#483, Sprint 10) | WRONG button ring buffer feeds replay system (#507) | | Performance regression | Baseline committed (#499, Sprint 10) | 100-tick stress test adds to baseline (#513) | | Pre-PR gate | `make pre-pr` stable | Unchanged | --- ## Sequence Recommendation **Days 1-2 (all teams, parallel):** - Server: start #504 immediately (no blockers). Sprint Gauntlet is the critical path node. - Server: start #524 (OQ-18 resolution) on day 1. Write decision by end of day 2. - Server: start #513 (stress test) in parallel — standalone, no dependency on #504. - Server: start #425 (contraband detection) in parallel — standalone. - Client: start #522 (OQ-07 resolution) on day 1. Implement and amend decision by end of day 2. - Client: start #507 (WRONG button) on day 1 — confirm RNG seed availability first. **Days 3-5:** - Server: complete all 3 rooms in #504 and verify server boots without panic. Hand off to #506. - Server: start #506 (cross-room transitions) once #504 is merged. - Client: #507 ring buffer implementation complete; end-to-end replay test. **Days 6-10:** - Server: complete #506 (T1-T8 tests pass). - All teams: verify against Sprint Completion Proof criteria. --- ## PR Workflow Each team submits their own PR from their branch. Integration is via merge to `main`. No joint branch. ```bash # Server tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ --title "feat(simulation): sprint 11 combine — server" \ --description "body" --base main --head server # Client tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ --title "feat(client): sprint 11 combine — client" \ --description "body" --base main --head client ```