9 tickets assigned. Teams: server (5), copy (3), planning (1). Sprint goal: extend zone-type template library from 2 to 31 zone types, wire server structs for D-142, eliminate Clippy debt. New ticket #676 created: assign teams to v0.2 story backlog (#614-#626). Tickets #669 and #672 reassigned from maintenance to server. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
9.8 KiB
title, description, type, status, sprint, team
| title | description | type | status | sprint | team |
|---|---|---|---|---|---|
| Sprint 27 — Copy Briefing | Author all 29 remaining zone-type behavior templates, replace overheard.yaml, extend validate-ron name collision checking | sprint | active | 27 | copy |
Sprint 27: Scale — Copy Tasks
Goal: Extend the zone-type template library from 2 to 31 zone types, wire the server to load them, and eliminate Clippy debt — clearing the path to the NPC legibility sprint.
Branch: copy
Agents: Mellanie (author), Paula (narrative), Gestalt (systems)
New Tickets
| # | Title | Blocked by |
|---|---|---|
| #662 | Author zone-type behavior templates (29 remaining types) | #663 (server structs, soft dependency — can author in parallel, but validate-ron requires server struct changes to pass) |
| #664 | Replace overheard.yaml with generator-compatible conversation system | — |
| #665 | Extend validate-ron to cross-culture name pool collision checking | — |
Use tooling/db/ticket show <id> for full details.
Key Decisions
decisions/content.md— D-142 (zone-type template architecture — primary reference for all authoring in this sprint), D-139 (composable behavior primitives — the three-layer assembly model), D-121 (voice is culture-driven, job as modifier), D-122 (all NPCs generated), D-128 (culture implicit in starting location)decisions/scope.md— D-114 (generator-first proof-of-life)
Open Questions to Resolve Early
- Q-WTF-033: AI templating (Claude API vs ollama vs manual) — does not block #662. The primitives authored this sprint are Layer 1 (culture-neutral physical actions). Layer 3 (LLM flavor) is an optional runtime layer; the base text must be fully playable without it. Author for standalone readability per D-142's standalone readability constraint.
Notes
#662 — Author zone-type behavior templates (29 remaining types)
Existing files (done, use as reference):
content/global/zone-types/rural_agricultural.ron— canonical authoring referencecontent/global/zone-types/industrial_freight.ron
29 remaining zone types to author (canonical list from D-142):
| Group | Zone Types |
|---|---|
| Rural | rural_pastoral, rural_aquaculture, rural_orbital |
| Industrial | industrial_manufacturing, industrial_processing |
| Port | port_space, port_surface, port_maritime, port_fishing |
| Extraction | extraction_space, extraction_surface, extraction_platform |
| Commercial | commercial_market, commercial_transit |
| Administrative | administrative_civil, administrative_judicial |
| Single | research_station, medical_facility, military_garrison, security_checkpoint, entertainment_hospitality, entertainment_venue, residential_station, residential_surface, residential_dispersed, detention_facility, archaeological_site, wilderness_frontier, diplomatic_elite |
Authoring rules (non-negotiable, from D-142):
-
Primitives are culture-neutral. Do not encode cultural attitudes, speech patterns, or voice register in action text. "Works a crop row, stopping to pull weeds by the root" is correct. "Works with quiet dignity, as is the Krenn way" is incorrect. Culture is applied by the culture modifier layer at assembly time.
-
Standalone readability constraint. Every
actionmust be informative without a culture modifier. "farms" fails. "kneels at the base of a struggling plant and parts the soil with two fingers" passes. A player reading base text must be able to read what an NPC is doing. -
~15 primitives per role, ~4 roles per zone type. (~60 primitives per zone type file, ~1,740 total.) Quality over volume — 12 excellent primitives beats 20 mediocre ones.
-
Context tags: Use
OnShift,OffDuty,Social,Any. Most primitives areOnShift. Include at least 3–5Socialprimitives per role for tavern/social-site coverage. -
modifier_hint: Match the seven D-142 categories:
work_pace,physical_manner,social_signal,task_completion,environmental_scan,offduty_posture,authority_response. Every primitive should have a hint. -
Grammar constraint (D-142): Culture modifier clauses attach as prepositional phrases or coordinating conjunctions. Your action text should end in a form that accepts a trailing clause cleanly. "loads a wheelbarrow" → accepts "with unhurried efficiency". Avoid action text that ends in a subordinate clause that would create a grammatically broken assembly.
-
Roles: Each zone type needs roles that match its physical reality. A
detention_facilityhasguard,administrator,prisoner,medic. Aresearch_stationhasresearcher,technician,security,support. Use the zone type's physical space and social function to derive the roles. -
social_site_types: Every zone type needs at least two social site types. Include one "work" site (workshop, lab bench, loading dock) and one "off-duty" site (break room, canteen, recreation space). List
eligible_rolesfor each.
Validate each file:
tooling/validate-ron content/global/zone-types/<zone_type>.ron zone_type
Note: this requires #663 (server struct changes) to be merged first for validate-ron to accept the zone_type schema. Until then, validate structurally by checking the file matches the pattern in rural_agricultural.ron.
Large content push execution — team-patterns.md model:
This is a large batch of structured content (29 files, ~1,740 primitives). Use the parallel writer pattern from docs/ team patterns:
-
Lore librarian agent (read-only): Loads
rural_agricultural.ron,industrial_freight.ron, D-142, D-139. Answers authoring questions from writers. Tracks cross-file consistency (docommercial_transitandcommercial_markethave distinct enough flavor? Doesport_spaceread differently fromport_maritime?). -
Multiple writer agents (parallel, by group): Split by zone-type group:
- Writer A: Rural (3 files) + Port (4 files)
- Writer B: Industrial (2) + Extraction (3) + Commercial (2)
- Writer C: Administrative (2) + Single group part 1 (4 files:
research_station,medical_facility,military_garrison,security_checkpoint) - Writer D: Single group part 2 (5 files:
entertainment_hospitality,entertainment_venue,residential_station,residential_surface,residential_dispersed) - Writer E: Single group part 3 (4 files:
detention_facility,archaeological_site,wilderness_frontier,diplomatic_elite)
Each writer writes directly to disk using the Write tool — one file at a time. No text accumulation. Write often.
-
Reviewer agent (after writing complete): Reads all 29 new files + the 2 existing references. Checks: voice consistency (do all zone types read as the same authoring voice?), context tag coverage (are OnShift/Social balanced?), standalone readability (no cultural encoding?), grammar constraint compliance.
Heartbeat rule: If any agent has been working on a single file for more than 15 minutes without progress, message the team lead. Do not silently retry.
#664 — Replace overheard.yaml with generator-compatible conversation system
content/npc-conversations/overheard.yaml contains 48 hand-authored conversation entries referencing named v0.1 NPCs (Kael, Sera, Torek, etc.) and the detective arc. Per D-122 (all NPCs generated), this content is superseded.
What to do:
- Read
content/npc-conversations/overheard.yamlto understand its current structure. - Design a replacement RON format that supports generator-compatible overheard conversations: no named NPC references, parameterized by role pair and zone type, culture-neutral content that accepts culture modifier at assembly time.
- Author 10–15 sample overheard conversation snippets in the new format covering at least 3 zone types.
- Rename/archive the old YAML:
content/npc-conversations/overheard.yaml.deprecatedwith a header comment explaining why. - File the new format spec as a note in
decisions/content.mdif it introduces a new content pattern (check with Qatux).
The old format is not salvageable as-is — the named NPC references make all 48 entries invalid. The structural value (the idea of overheard conversation as an ambient information layer) is worth preserving; the content is not.
#665 — Extend validate-ron to cross-culture name pool collision checking
Currently tooling/validate-ron validates individual RON files against their schema. Name pool collisions across culture profiles (a given name appearing in both Krenn and Vael pools) are caught only in PR review.
Deliverable: A new mode in tooling/validate-ron (or a separate tooling/validate-names script):
tooling/validate-ron --check-name-collisions content/global/
This scans all culture-*.ron files, extracts naming.given_names and naming.family_names pools, and reports any name that appears in more than one culture's pool. Output should be machine-readable (exit 1 on collision, print the colliding names and which cultures they appear in).
This is a tooling task. It does not require server changes — the culture RON files are already parseable by the existing validator infrastructure.
Dependency Chain
#665 (validate-ron name collision) — standalone, no blockers
#664 (replace overheard.yaml) — standalone, no blockers
#662 (29 zone-type templates) → soft dependency on #663 (server structs) for full validate-ron pass
└── Parallel writer agents (groups A/B/C/D/E) — all parallel once authoring begins
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):
tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(content): description" --description "body" --base main --head copy