Sprint 18 copy team deliverables — two design-first tickets:
#544 — D-084: Dual-namespace line ID scheme — resolves Q-028. Role namespace (shared pool) unchanged; instance namespace (role-slug + seeded counter) added as opt-in for per-instance authored content on auto-generated NPCs. No schema migration needed.
#158 — Tier 1 drama module schema — JSON Schema for drama modules covering entry conditions, NPC requirements, event sequences, and outcomes. Includes smuggling ring v0.1 stub module (6 NPC roles, dual event sequences, 5 outcomes) and authoring guide with review feedback.
Files changed
decisions/content.md — D-084 decision record added
decisions/questions.md — Q-028 resolved → D-084
decisions/README.md — index updated
content/schemas/drama_module.schema.yaml — new schema
content/modules/tier1/smuggling_ring_v0_1.yaml — new stub module
docs/design/line-id-authoring-guide.md — new authoring guide
docs/design/tier1-module-authoring.md — new authoring guide
Role namespace (shared pool) stays unchanged; instance namespace
(role-slug + seeded counter) added as opt-in for per-instance
authored content on auto-generated NPCs. No schema migration needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JSON Schema for drama modules covering entry conditions, NPC
requirements, event sequences, and outcomes. Includes v0.1
vertical slice stub module and authoring guide with review
feedback from Mellanie (pattern/motivation reference, terminal
outcome semantics, fact ID conventions, trigger type bridge).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
events_fired references flag names (secret_meeting_occurred, final_shipment_known) instead of event IDs (kael_secret_meeting, final_shipment_scheduled). Two outcomes unreachable.
Fix events_fired referencing flag names instead of event IDs (two
outcomes unreachable). Wire 4 orphaned flags into narratively
coupled outcome conditions. Fix typo and stale question count.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Schema and authoring guides are well-structured. The fix commit c55474f addressed schema compliance correctly. However, three critical issues remain in the smuggling ring module's logic and data references.
ring_splinters is is_terminal: false with no clear downstream exit path after ring goes quiet. May run indefinitely.
5
decisions/README.md:14-15
suggestion
D-035 ID collision — appears in both perception.md (LOS shadowcasting) and content.md (tag taxonomy). Pre-existing but now more visible.
6
docs/design/line-id-authoring-guide.md:96
suggestion
"Contiguous prefix" wording slightly misleading given that gaps from deleted lines are acceptable.
Paula (Narrative Depth): APPROVE
Outstanding narrative design. The Kael arc produces genuine retroactive reinterpretation — events seen earlier mean something different after later reveals. Dual-lens framing creates distinct moral weight per character (smuggler: loyalty vs safety; detective: duty vs harm reduction).
#
File
Severity
Issue
1
smuggling_ring_v0_1.yaml:529-565
suggestion
kael_escapes relies on outcome ordering to avoid co-firing with ring_exposed. A defensive flags_not_set guard would be more robust.
2
smuggling_ring_v0_1.yaml:599-633
suggestion
ring_splinters non-terminal with no explicit downstream exit path documented. Expiry is the implicit safety net but could confuse future authors.
3
smuggling_ring_v0_1.yaml:100-106
suggestion
Pattern/motivation constraints on named bindings are redundant (useful as documentation, but guide should note this explicitly).
4
tier1-module-authoring.md:236-248
suggestion
Guide recommends two discovery methods per fact, but the reference module only provides one per fact. Clarify stub vs production expectation.
Miri (World Consistency): REQUEST_CHANGES
Setting integration is strong — Meridian network, Commission, Syndic supply chains all use established Settled Reach terminology with no franchise parallels. Internal consistency is solid. However, the same ring_completes/ring_splinters auto-flag gating issue makes two outcome paths unreachable.
#
File
Severity
Issue
1
smuggling_ring_v0_1.yaml:580-585
warning
ring_completes gated on flags_not_set: [kael_message_sent] — auto-fired flag makes this permanently false by tick 1550. Unreachable outcome.
2
smuggling_ring_v0_1.yaml:617-621
warning
ring_splinters has same auto-flag gate issue. Partial-discovery resolution path unreachable.
Empty faction stubs — faction_reaction effects will silently no-op. Add at least slug/display_name or a # TODO reference.
4
smuggling_ring_v0_1.yaml:135
suggestion
npc:nils binding vs existing npc:renn ring-operative — clarify whether these are distinct characters.
Verdict: CHANGES REQUESTED
Two reviewers flagged critical/warning issues. Key problems:
NPC ID mismatch (npc:nils vs npc:nils-davan) — load-time failure
Auto-flag gating bug — ring_completes and ring_splinters both unreachable due to kael_message_sent being auto-set before evaluation
Unregistered fact IDs — all ring.* facts missing from content/global/knowledge/
## Review: copy -> main (type: copy) — PR #64
### Hoshe (QA): REQUEST_CHANGES
Schema and authoring guides are well-structured. The fix commit `c55474f` addressed schema compliance correctly. However, three critical issues remain in the smuggling ring module's logic and data references.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `content/modules/tier1/smuggling_ring_v0_1.yaml:134` | critical | `named_npc: "npc:nils"` doesn't match canonical ID `npc:nils-davan` in the district profile. Schema Tier 2 validation = load-time failure. |
| 2 | `content/modules/tier1/smuggling_ring_v0_1.yaml:579-585` | critical | `ring_completes` outcome uses `flags_not_set: [kael_message_sent]`, but `kael_message_sent` is auto-set at ~tick 1550. Outcome requires `ticks_since_activation: 3600`. Gate is permanently false — outcome unreachable. |
| 3 | `content/modules/tier1/smuggling_ring_v0_1.yaml` (throughout) | critical | All `ring.*` fact IDs have no entries in `content/global/knowledge/`. Facts will silently never become discoverable at runtime. |
| 4 | `content/modules/tier1/smuggling_ring_v0_1.yaml:599-633` | warning | `ring_splinters` is `is_terminal: false` with no clear downstream exit path after ring goes quiet. May run indefinitely. |
| 5 | `decisions/README.md:14-15` | suggestion | D-035 ID collision — appears in both `perception.md` (LOS shadowcasting) and `content.md` (tag taxonomy). Pre-existing but now more visible. |
| 6 | `docs/design/line-id-authoring-guide.md:96` | suggestion | "Contiguous prefix" wording slightly misleading given that gaps from deleted lines are acceptable. |
### Paula (Narrative Depth): APPROVE
Outstanding narrative design. The Kael arc produces genuine retroactive reinterpretation — events seen earlier mean something different after later reveals. Dual-lens framing creates distinct moral weight per character (smuggler: loyalty vs safety; detective: duty vs harm reduction).
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `smuggling_ring_v0_1.yaml:529-565` | suggestion | `kael_escapes` relies on outcome ordering to avoid co-firing with `ring_exposed`. A defensive `flags_not_set` guard would be more robust. |
| 2 | `smuggling_ring_v0_1.yaml:599-633` | suggestion | `ring_splinters` non-terminal with no explicit downstream exit path documented. Expiry is the implicit safety net but could confuse future authors. |
| 3 | `smuggling_ring_v0_1.yaml:100-106` | suggestion | Pattern/motivation constraints on named bindings are redundant (useful as documentation, but guide should note this explicitly). |
| 4 | `tier1-module-authoring.md:236-248` | suggestion | Guide recommends two discovery methods per fact, but the reference module only provides one per fact. Clarify stub vs production expectation. |
### Miri (World Consistency): REQUEST_CHANGES
Setting integration is strong — Meridian network, Commission, Syndic supply chains all use established Settled Reach terminology with no franchise parallels. Internal consistency is solid. However, the same `ring_completes`/`ring_splinters` auto-flag gating issue makes two outcome paths unreachable.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `smuggling_ring_v0_1.yaml:580-585` | warning | `ring_completes` gated on `flags_not_set: [kael_message_sent]` — auto-fired flag makes this permanently false by tick 1550. Unreachable outcome. |
| 2 | `smuggling_ring_v0_1.yaml:617-621` | warning | `ring_splinters` has same auto-flag gate issue. Partial-discovery resolution path unreachable. |
| 3 | `global/factions/lattice-commission.yaml`, `the-ring.yaml` | suggestion | Empty faction stubs — faction_reaction effects will silently no-op. Add at least `slug`/`display_name` or a `# TODO` reference. |
| 4 | `smuggling_ring_v0_1.yaml:135` | suggestion | `npc:nils` binding vs existing `npc:renn` ring-operative — clarify whether these are distinct characters. |
### Verdict: CHANGES REQUESTED
Two reviewers flagged critical/warning issues. Key problems:
1. **NPC ID mismatch** (`npc:nils` vs `npc:nils-davan`) — load-time failure
2. **Auto-flag gating bug** — `ring_completes` and `ring_splinters` both unreachable due to `kael_message_sent` being auto-set before evaluation
3. **Unregistered fact IDs** — all `ring.*` facts missing from `content/global/knowledge/`
Fix npc:nils → npc:nils-davan canonical ID mismatch. Replace
auto-flag gates on ring_completes/ring_splinters with player-
action-gated fact conditions (unreachable outcomes). Add
ring_stalemate terminal exit for non-terminal ring_splinters.
Create ring.yaml with 10 fact stubs for content/global/knowledge/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Exit path — ring_stalemate (terminal) added as downstream from ring_splinters.
#
File
Severity
Issue
1
ring.yaml
suggestion
Field vocabulary differs from schema — pre-existing pattern, not introduced by this PR.
2
smuggling_ring_v0_1.yaml:134
suggestion
nils-davan profile says off-stage but module fires observable events for him. Worth reviewing before simulation hookup.
Paula (Narrative Depth): APPROVE
Fixes are narratively coherent. facts_not_known gating correctly measures player investigation engagement. Knowledge catalog entries are evocative and precise.
#
File
Severity
Issue
1
ring.yaml
suggestion
ring.voss_accelerating_timeline description over-explains at knows_of confidence.
Miri (World Consistency): APPROVE
Both warnings resolved. All 10 fact IDs registered. IP originality holds. Outcome tree is coherent.
No issues.
Verdict: APPROVED
Ready to merge.
## Review Round 3: copy -> main — PR #64
### Hoshe (QA): APPROVE
All 4 previous issues confirmed fixed:
1. **NPC ID** — `npc:nils-davan` matches canonical ID.
2. **Auto-flag gating** — replaced with `facts_not_known` / `facts_known` polarity. `module_abandoned` also fixed.
3. **Unregistered facts** — `ring.yaml` registers all 10 fact IDs. Cross-reference verified: 10/10.
4. **Exit path** — `ring_stalemate` (terminal) added as downstream from `ring_splinters`.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `ring.yaml` | suggestion | Field vocabulary differs from schema — pre-existing pattern, not introduced by this PR. |
| 2 | `smuggling_ring_v0_1.yaml:134` | suggestion | `nils-davan` profile says off-stage but module fires observable events for him. Worth reviewing before simulation hookup. |
### Paula (Narrative Depth): APPROVE
Fixes are narratively coherent. `facts_not_known` gating correctly measures player investigation engagement. Knowledge catalog entries are evocative and precise.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `ring.yaml` | suggestion | `ring.voss_accelerating_timeline` description over-explains at `knows_of` confidence. |
### Miri (World Consistency): APPROVE
Both warnings resolved. All 10 fact IDs registered. IP originality holds. Outcome tree is coherent.
No issues.
### Verdict: APPROVED
Ready to merge.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Sprint 18 copy team deliverables — two design-first tickets:
Files changed
decisions/content.md— D-084 decision record addeddecisions/questions.md— Q-028 resolved → D-084decisions/README.md— index updatedcontent/schemas/drama_module.schema.yaml— new schemacontent/modules/tier1/smuggling_ring_v0_1.yaml— new stub moduledocs/design/line-id-authoring-guide.md— new authoring guidedocs/design/tier1-module-authoring.md— new authoring guideCHANGELOG.md— updatedReview notes
Review: copy → main (PR #64, type: copy)
Hoshe (QA): REQUEST_CHANGES
Well-structured schema and docs, but the module has schema conformance issues.
content/modules/tier1/smuggling_ring_v0_1.yaml:507-508,578-579events_firedreferences flag names (secret_meeting_occurred,final_shipment_known) instead of event IDs (kael_secret_meeting,final_shipment_scheduled). Two outcomes unreachable.content/modules/tier1/smuggling_ring_v0_1.yaml:191,215,342,377content/modules/tier1/smuggling_ring_v0_1.yaml:458decisions/README.md:18content/schemas/drama_module.schema.yaml:38-43module_idpattern accepts trivially short name portions.docs/design/line-id-authoring-guide.md:96Paula (Narrative Depth): APPROVE
Strong design work — dual-lens experience mechanically enforced, moral weight in every outcome path.
smuggling_ring_v0_1.yaml:501ring_exposedoutcome description doesn't capture relational dimension of Kael's hostility.smuggling_ring_v0_1.yaml:530is_terminalpriority logic buried in inline comment — upgrade to explicit PRIORITY NOTE.smuggling_ring_v0_1.yaml:596-628ring_completes/ring_splinterssay nothing about Naia's awareness — consequence-light vs other outcomes.drama_module.schema.yaml:350-357SKEPTICmotivation has no instantiated example in the reference module.tier1-module-authoring.md:236-248hear_sound.tier1-module-authoring.md:57Miri (World Consistency): APPROVE
Setting-faithful, IP-clean, consistent with all relevant D-records.
smuggling_ring_v0_1.yaml:257smuggling_ring_v0_1.yaml:521-523,561-563lattice-commissionandthe-ringunverified against faction registry.tier1-module-authoring.md:445content/campaigns/main/systems/krenn/path not in project structure docs.drama_module.schema.yaml:350-357must_have_patternenum lacks reference to D-024 definition source.drama_module.schema.yaml:670-718npc_knowledge_updateoutcome effect — Naia's awareness not structurally trackable.smuggling_ring_v0_1.yaml:630-655facts_not_known— good reference model.Verdict: CHANGES REQUESTED
Deduplicated blockers:
events_fireduses flag names instead of event IDs — two outcomes unreachableReview: copy -> main (type: copy) — PR #64
Hoshe (QA): REQUEST_CHANGES
Schema and authoring guides are well-structured. The fix commit
c55474faddressed schema compliance correctly. However, three critical issues remain in the smuggling ring module's logic and data references.content/modules/tier1/smuggling_ring_v0_1.yaml:134named_npc: "npc:nils"doesn't match canonical IDnpc:nils-davanin the district profile. Schema Tier 2 validation = load-time failure.content/modules/tier1/smuggling_ring_v0_1.yaml:579-585ring_completesoutcome usesflags_not_set: [kael_message_sent], butkael_message_sentis auto-set at ~tick 1550. Outcome requiresticks_since_activation: 3600. Gate is permanently false — outcome unreachable.content/modules/tier1/smuggling_ring_v0_1.yaml(throughout)ring.*fact IDs have no entries incontent/global/knowledge/. Facts will silently never become discoverable at runtime.content/modules/tier1/smuggling_ring_v0_1.yaml:599-633ring_splintersisis_terminal: falsewith no clear downstream exit path after ring goes quiet. May run indefinitely.decisions/README.md:14-15perception.md(LOS shadowcasting) andcontent.md(tag taxonomy). Pre-existing but now more visible.docs/design/line-id-authoring-guide.md:96Paula (Narrative Depth): APPROVE
Outstanding narrative design. The Kael arc produces genuine retroactive reinterpretation — events seen earlier mean something different after later reveals. Dual-lens framing creates distinct moral weight per character (smuggler: loyalty vs safety; detective: duty vs harm reduction).
smuggling_ring_v0_1.yaml:529-565kael_escapesrelies on outcome ordering to avoid co-firing withring_exposed. A defensiveflags_not_setguard would be more robust.smuggling_ring_v0_1.yaml:599-633ring_splintersnon-terminal with no explicit downstream exit path documented. Expiry is the implicit safety net but could confuse future authors.smuggling_ring_v0_1.yaml:100-106tier1-module-authoring.md:236-248Miri (World Consistency): REQUEST_CHANGES
Setting integration is strong — Meridian network, Commission, Syndic supply chains all use established Settled Reach terminology with no franchise parallels. Internal consistency is solid. However, the same
ring_completes/ring_splintersauto-flag gating issue makes two outcome paths unreachable.smuggling_ring_v0_1.yaml:580-585ring_completesgated onflags_not_set: [kael_message_sent]— auto-fired flag makes this permanently false by tick 1550. Unreachable outcome.smuggling_ring_v0_1.yaml:617-621ring_splintershas same auto-flag gate issue. Partial-discovery resolution path unreachable.global/factions/lattice-commission.yaml,the-ring.yamlslug/display_nameor a# TODOreference.smuggling_ring_v0_1.yaml:135npc:nilsbinding vs existingnpc:rennring-operative — clarify whether these are distinct characters.Verdict: CHANGES REQUESTED
Two reviewers flagged critical/warning issues. Key problems:
npc:nilsvsnpc:nils-davan) — load-time failurering_completesandring_splintersboth unreachable due tokael_message_sentbeing auto-set before evaluationring.*facts missing fromcontent/global/knowledge/Review Round 3: copy -> main — PR #64
Hoshe (QA): APPROVE
All 4 previous issues confirmed fixed:
npc:nils-davanmatches canonical ID.facts_not_known/facts_knownpolarity.module_abandonedalso fixed.ring.yamlregisters all 10 fact IDs. Cross-reference verified: 10/10.ring_stalemate(terminal) added as downstream fromring_splinters.ring.yamlsmuggling_ring_v0_1.yaml:134nils-davanprofile says off-stage but module fires observable events for him. Worth reviewing before simulation hookup.Paula (Narrative Depth): APPROVE
Fixes are narratively coherent.
facts_not_knowngating correctly measures player investigation engagement. Knowledge catalog entries are evocative and precise.ring.yamlring.voss_accelerating_timelinedescription over-explains atknows_ofconfidence.Miri (World Consistency): APPROVE
Both warnings resolved. All 10 fact IDs registered. IP originality holds. Outcome tree is coherent.
No issues.
Verdict: APPROVED
Ready to merge.
Pull request closed