--- title: "Sprint 22 — Joint Briefing" description: "Fog regression fix coordination, triangle pressure threshold, entanglement config sync" type: sprint status: archived sprint: 22 team: "joint" --- # Sprint 22: Wire — Joint / Integration **Goal:** Fix the fog regression, wire the authored Sova content into a production population and triangle set, and activate the contamination pacing layer that gives the vertical slice its 30-minute shape. **Agents:** All implementation agents (Dudley, Tyre, Hoshe, Stig, Araminta, Justine) --- ## Pre-Sprint Actions These must happen at sprint start, before implementation tickets begin: | Action | Owner | Blocks | |--------|-------|--------| | Resolve Q-017 (triangle pressure threshold) | Gestalt + Paula (planning) | #254 | | Confirm struct name for `EntanglementConfig` | Dudley + Stig sync | #175, #176 | | Confirm `world_seed` field in startup IPC message | Tyre | #175, #178 | If Q-017 is not resolved within the first two days of the sprint, implement #254 with a `CONTAMINATION_DELAY_TICKS = 1800` timer fallback and a `CONFRONTATION_THRESHOLD = 75` constant placeholder. Do not block the sprint on the discussion. --- ## Cross-Team Dependencies | Dependency | Direction | Notes | |------------|-----------|-------| | `EntanglementConfig` struct definition | Server (#176) → Client (#175) | Server defines, client adds seed-carrying protocol field | | `world_seed` in startup IPC message | Client (#175) → Server (#176) | Client sends seed; server uses it to seed `SimRng` and sample `EntanglementConfig` | | Fog architecture fixed | Client (#569) → Visual (#563) | Araminta must not touch `fog.gdshader` until Stig's #569 is in review | --- ## Sprint Completion Proof The sprint is done when all of the following are observable: 1. **Fog renders correctly.** Boot the client, walk around the Gauntlet. The forward cone has a smooth gradient edge (no tile-stepping). Tiles left behind the player show underlying art at ~25-30% fog overlay. Never-visited tiles are solid near-black. Araminta's zone temperature tints are visible in previously-explored areas. 2. **Production world boots.** Start the server without the `gauntlet` feature (or with a `--production` flag). The server logs show 17+ NPC entities spawned from `content/campaigns/main/`. No panic. No assertion failures. 3. **Triangles exist.** After production boot, a debug query (or test) confirms 5 `TriangleState` entities: 3 flagged as active forks, 2 as passive tensions. All have valid NPC role assignments. 4. **Contamination fires.** A test running 1801+ ticks asserts `ContaminationActive` is set and at least one `TriangleState::pressure > 0`. 5. **Seed determinism holds.** Two server boots with the same `world_seed` produce identical `EntanglementConfig` values. Different seeds produce different values. 6. **CI green.** `make ci` passes on all branches. No regressions. --- ## Test Plan Alignment (D-030) Sprint 22 is in D-030 Phase 2 (sprint 3-4 scope: integration tests + information boundary negative tests). The new tests in this sprint: - **#176:** Integration test — production boot spawns 17+ NPCs. (Phase 2 integration test) - **#188:** Assertion test — 5 triangle entities with correct classifications post-boot. (Phase 2 integration test) - **#254:** Timer test — 1801-tick simulation asserts `ContaminationActive`. (Phase 2 integration test) - **#509:** Fuzzy test — 50-seed map invariant sweep. (Phase 2, borderline Phase 3) - **#178:** Determinism test — same seed = same `EntanglementConfig`. (Phase 1 determinism, retroactive) Hoshe owns acceptance test definition for #176, #188, #254. Coordinate with Dudley on world setup for integration tests — reuse the `AppBuilder` pattern from existing integration tests in `server/tests/`. --- ## Open Questions | ID | Question | Blocks | Action | |----|----------|--------|--------| | Q-017 | Triangle pressure threshold | #254 | Resolve at sprint start. Fallback: timer + constant if unresolved in 2 days. | | Q-020 | Multi-entity collision resolution | none this sprint | Tracked, not blocking. | --- ## PR Merge Order To avoid conflicts on shared files (`fog.gdshader`, `bridge/types.rs`): 1. Server PRs (#565, #567, #509, #512) — merge first, no client/visual conflicts. 2. Server PR (#176 → #188 → #254 chain) — merge when chain is complete. 3. Client PR (#569 fog fix) — merge after server PRs are in. 4. Client PR (#175 + #178 seed config) — can merge alongside #569. 5. Visual PR (#563 fog tuning) — merge last, after client #569 is in main. 6. CI PR (#568 symlink removal) — merge anytime, no conflicts.