Files
settled-reach/docs/sprints/sprint-11/joint.md
T
jpmschweitzerandClaude Opus 4.6 6f9a53cb1f docs(briefings): add Sprint 11 Combine briefings
Server (5 tickets), client (2 tickets), and joint coordination
briefings for the Gauntlet completion sprint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 09:54:08 +01:00

138 lines
7.2 KiB
Markdown

# 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
```