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>
138 lines
7.2 KiB
Markdown
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
|
|
```
|