diff --git a/docs/sprints/sprint-25/joint.md b/docs/sprints/sprint-25/joint.md index fd1659911..79c621e5a 100644 --- a/docs/sprints/sprint-25/joint.md +++ b/docs/sprints/sprint-25/joint.md @@ -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) diff --git a/docs/sprints/sprint-25/server.md b/docs/sprints/sprint-25/server.md index eed11b629..d307988c4 100644 --- a/docs/sprints/sprint-25/server.md +++ b/docs/sprints/sprint-25/server.md @@ -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):