chore(meta): add feasibility warnings to Sprint 25 briefings

server.md: four warnings from Troblum — generate_npc() requires a live
bevy World (stub routine generation in Phase 1), cultural text assembly
is a new code path not a one-liner, DayPhase alias collision in
generator.rs, schema negotiation takes rounds.

joint.md: confidence 15% note at top. Intra-zone variance test added
(rural seed 42 vs rural seed 43 — coherence within type, variance
across seeds). Pass conditions restructured into three explicit
comparisons: cross-type, intra-type, culture.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 20:54:51 +01:00
co-authored by Claude Sonnet 4.6
parent 0f1eda8d12
commit 58d2e3b695
2 changed files with 29 additions and 5 deletions
+17 -5
View File
@@ -1,5 +1,7 @@
# Sprint 25: Emerge — Joint
**Confidence: 15%.** This sprint is exploratory — we learn whether the approach works, not whether we can ship it. Declare what we learned, not victory.
**Goal:** Prove the generator can extrapolate from minimal input — a rural Krenn area AND an industrial Krenn zone from zone type and culture profile alone, no per-location spec. Two zone types, one culture, side-by-side comparison.
## Pre-Sprint
@@ -19,6 +21,7 @@ The critical coordination handoff: #611 defines the Rust structs and writes exam
```bash
cargo run --bin generator-spike -- --zone rural --seed 42
cargo run --bin generator-spike -- --zone industrial --seed 42
cargo run --bin generator-spike -- --zone rural --seed 43
```
**Expected output per invocation:**
@@ -26,12 +29,21 @@ cargo run --bin generator-spike -- --zone industrial --seed 42
- NPC roster: name, role, 2-3 traits, one observable behavior
- Relationship pairs: "A knows B as [type] ([valence])"
**Pass condition — compare the two outputs side by side:**
- Rural and industrial produce **different** output shape (different social site mix, NPC role distribution, density)
- Both feel **Krenn** (shared naming conventions, cultural markers)
**Pass condition — three comparisons:**
Cross-type (rural vs industrial, seed 42):
- Different output shape — social site mix, NPC role distribution, density all differ
- Both feel Krenn — shared naming conventions and cultural markers
- Zone taxonomy does visible work (outputs distinguishable by zone type alone)
Intra-type (rural seed 42 vs rural seed 43):
- Both recognizably rural — same zone shape, similar role distribution
- Different people — different names, traits, relationship pairs
- Tests coherence within a type and variance across seeds
Culture (both zone types):
- Culture profile does visible work — output feels Krenn, not generic space-village
- NPC relationships are **readable** from text — not inferred, read
- Zone taxonomy does **visible work** (rural vs industrial distinguishable)
- Culture profile does **visible work** (both feel Krenn, not generic)
**Fail condition:**
- Both outputs look the same with different labels (zone taxonomy not doing work)
+12
View File
@@ -73,6 +73,18 @@ This phasing means the copy team's blocking relationship is on the final integra
#611 first. Phase 1 of #612 runs in parallel with copy writing #609/#610. Phase 2 of #612 waits for both.
## Feasibility Warnings
From Troblum's pre-sprint review. Read before starting.
1. **`generate_npc()` requires a live bevy World.** The existing function in `npc/generate.rs` takes `TilePosition`, `StableId`, and a real `bevy_ecs::World`. The spike binary has none of these. Do not attempt to instantiate a full World for text output — stub or strip routine generation in Phase 1. Wire only the axes that produce inspectable output (traits, relationships, cultural markers). Full ECS wiring is deferred.
2. **Cultural text assembly is the real work of #612.** The existing generator produces enum variants and placeholder strings (`format!("{} has a {:?} secret", ...)`). There is no cultural text surface in the codebase today. Getting `CultureProfile` fields to appear in NPC output is a new code path — budget time for it, it is not a one-liner.
3. **`DayPhase` name collision.** `server/src/simulation/generator.rs` defines `DayPhase = String` as a stub type alias, shadowing the real `DayPhase` enum in `server/src/simulation/time.rs`. Use the real enum explicitly or alias the stub out of scope before the spike binary sees both. Do not let the collision silently compile to the wrong type.
4. **Schema negotiation takes rounds.** The first YAML draft from copy will not deserialize cleanly. Build in slack between Phase 1 and Phase 2 — expect at least one round of struct adjustments after seeing real content.
## PR Workflow
When ready to submit, create a PR with `tea` CLI. All flags are required to avoid TTY prompts (see CLAUDE.md "Gitea access" section):