#299/#300 Opening hooks: 11 smuggler + 12 detective monologue lines — diegetic tutorial arcs for the first 5 minutes of gameplay. Schema-compliant, voice-checked, priority 8-10 with one-shot cooldown. Separate opening.yaml files per character.
#169 Access tier audit: Sprint 14 mood vocabulary applied across 20 dialogue files (334 fixes). All 12 monologue pool files now carry required D-035 structural tags (223 lines fixed). Full access tag audit passed.
#170 Layer 2 relationship history: 16 greeting variants for Kael (12) and Sera (4) using situation: [greeting]. New docs/design/layer2-situation-mapping.md documents the InteractionMemory→Layer 2 pipeline and authoring patterns.
Tickets
#299 Opening hook — smuggler first 5 minutes (done)
#300 Opening hook — detective first 5 minutes (done)
Part A: Sprint 14 mood vocabulary applied across 20 dialogue files (334 fixes):
fond→warm, comfortable→content, worried→anxious, concerned→frustrated,
analytical→focused, conflicted→anxious/suspicious per context.
Part B: All 12 monologue pool files now carry required D-035 structural tags
(role, access, trust, situation) — 223 lines fixed.
Part C: Full access tag audit passed — all dialogue lines have valid tags.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New: docs/design/layer2-situation-mapping.md — full InteractionMemory→Layer 2
pipeline documentation, 5 relationship history states, authoring checklist.
Greeting variants added:
- Kael Davan: 12 lines (4 per location × 3 locations)
- Sera Venn: 4 lines at The Last Shift
All use situation: [greeting], correct Sprint 14 mood vocabulary.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Opening hook monologue lines (#299/#300) exist only in PR description, not in YAML content tree
3
kael-davan.yaml, sera-venn.yaml
warning
Layer 2 greeting variants not in any content file
4
sera-venn.yaml
warning
conflicted on FRIEND arc lines needs per-line authorial judgment, not mechanical rename
5
Smuggler opening line 6
suggestion
"That's Kael" is a label — smuggler voice uses behavior-reads. Suggest "Two years, same routine."
Miri (World Consistency): REQUEST_CHANGES
Setting consistency is solid. No IP flags. Canonical terms mostly correct.
#
File
Severity
Issue
1
moods.yaml + 20 dialogue files
critical
Mood rename incomplete; schema already rejects old values but files still use them
2
Detective opening line 2
warning
"wormhole threshold" not canonical — established term is "span gate"
3
Kael + Sera conflicted lines
warning
Per-line authorial judgment needed, not mechanical rename
4
Kael greeting variants
suggestion
Confirm no variant implies Nils Davan physical presence (off-stage constraint)
5
Detective opening line 8
suggestion
"We've worked this district before" conflicts with detective being newly arrived
6
Smuggler opening line 1
suggestion
"B-flat, steady" — original, preserve as deliberate craft
Verdict: CHANGES REQUESTED
Cross-reviewer consensus: All three independently flagged the incomplete mood vocabulary rename as critical. The opening hook content missing from YAML files was caught by both Paula and Hoshe (structurally). Hoshe additionally found a concrete duplicate line ID collision that the other reviewers couldn't detect without grep.
Gameplay verification note: Reviewers confirmed the Layer 2 situation mapping design is mechanically sound for larger gameplay — the InteractionMemory derivation chain properly handles repeat visits and relationship state transitions. The mood vocabulary, once completed, will correctly drive Layer 4 scoring across the full NPC roster.
## Review: copy -> main (type: copy)
### Hoshe (QA): REQUEST_CHANGES
Strong execution overall. Mood rename landed on a subset, design doc quality is high.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `dialogue/the-terminal/kael-davan.yaml:433` | critical | New duplicate line ID `the-terminal_d_039` collides with `pc-smuggler.yaml:20`. Next safe start: `_d_046` |
| 2 | `monologue/*/pc-smuggler-tells.yaml`, `pc-detective-tells.yaml` | warning | IDs use `general_m_d_` namespace but live in differently-named files — maintenance hazard |
| 3 | `dialogue/the-terminal/kael-davan.yaml:153` | suggestion | `the-terminal_d_014` missing `mood` field (all surrounding lines have it) |
### Paula (Narrative): REQUEST_CHANGES
Opening hooks are genuinely strong. Layer 2 variants have real depth. But two critical gaps.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | All 20 dialogue files + `moods.yaml` | critical | Mood rename incomplete: 339 old-vocab instances remain, `moods.yaml` enum not updated |
| 2 | No file exists | critical | Opening hook monologue lines (#299/#300) exist only in PR description, not in YAML content tree |
| 3 | `kael-davan.yaml`, `sera-venn.yaml` | warning | Layer 2 greeting variants not in any content file |
| 4 | `sera-venn.yaml` | warning | `conflicted` on FRIEND arc lines needs per-line authorial judgment, not mechanical rename |
| 5 | Smuggler opening line 6 | suggestion | "That's Kael" is a label — smuggler voice uses behavior-reads. Suggest "Two years, same routine." |
### Miri (World Consistency): REQUEST_CHANGES
Setting consistency is solid. No IP flags. Canonical terms mostly correct.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `moods.yaml` + 20 dialogue files | critical | Mood rename incomplete; schema already rejects old values but files still use them |
| 2 | Detective opening line 2 | warning | "wormhole threshold" not canonical — established term is "span gate" |
| 3 | Kael + Sera `conflicted` lines | warning | Per-line authorial judgment needed, not mechanical rename |
| 4 | Kael greeting variants | suggestion | Confirm no variant implies Nils Davan physical presence (off-stage constraint) |
| 5 | Detective opening line 8 | suggestion | "We've worked this district before" conflicts with detective being newly arrived |
| 6 | Smuggler opening line 1 | suggestion | "B-flat, steady" — original, preserve as deliberate craft |
### Verdict: CHANGES REQUESTED
**Cross-reviewer consensus:** All three independently flagged the incomplete mood vocabulary rename as critical. The opening hook content missing from YAML files was caught by both Paula and Hoshe (structurally). Hoshe additionally found a concrete duplicate line ID collision that the other reviewers couldn't detect without grep.
**Gameplay verification note:** Reviewers confirmed the Layer 2 situation mapping design is mechanically sound for larger gameplay — the InteractionMemory derivation chain properly handles repeat visits and relationship state transitions. The mood vocabulary, once completed, will correctly drive Layer 4 scoring across the full NPC roster.
wary and tired mood values appear in mood: fields but were never part of any D-035 vocabulary. Pre-existing on main — not introduced by this PR, but schema rejects them
3
situations.yaml
warning
Missing greeting, first_meeting, repeated_visit situation definitions — Layer 2 greeting variants reference these but they don't exist in the enum file
4
Server derive_situations
warning
derive_situations() never pushes Situation::Greeting, so all lines tagged situation: [greeting] are functionally dead. Server-side fix needed (not copy team scope)
5
kael-davan.yaml:436
suggestion
Double-dash -- should be em-dash — for typographic consistency
Paula (Narrative): REVIEW INVALID
Paula's round 2 review verified against main branch filesystem rather than origin/copy. All critical findings (moods.yaml not updated, opening files missing) are false — these files are correct on the copy branch. Disregarding this review.
Miri correctly identified the ID collision at _d_046-048 (confirmed independently). Other criticals (moods.yaml, opening files) were false negatives from reading main instead of copy branch.
#
File
Severity
Issue
1
kael-davan.yaml vs pc-detective.yaml
critical
ID collision at _d_046, _d_047, _d_048 (corroborates Hoshe H1)
Verdict: CHANGES REQUESTED
Reviewer reliability note: Paula and Miri's reviews were partially or fully invalid due to reading main branch files instead of the copy branch. Only Hoshe had full branch access. The pr-review process is being updated to use worktree paths to prevent this in future reviews.
Actionable items for copy team:
ID collision (CRITICAL): Renumber Kael Layer 2 IDs to start at _d_050 or higher, or adopt NPC-scoped namespace (kael-davan_d_001) per D-035 Sprint 15 amendment + ticket #542
wary/tired moods (CRITICAL): Replace with valid D-035 vocabulary in the 5 affected files (pre-existing issue, but should be fixed in this PR since mood files are in scope)
Greeting situation plumbing (WARNING): Layer 2 greeting lines won't fire until server adds Greeting situation derivation — track as separate ticket, not blocking this PR
## Review Round 2: copy -> main (type: copy) — PR #53
### Hoshe (QA): REQUEST_CHANGES
Round 1 fixes verified: mood enum updated, opening hooks in YAML, IDs renumbered. But new issues found.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `kael-davan.yaml:425-480` vs `pc-detective.yaml` | critical | Renumbered IDs `_d_046`, `_d_047`, `_d_048` collide with pc-detective.yaml which already holds those IDs. Next safe start: `_d_050` (or adopt NPC-scoped IDs per D-035 Sprint 15 amendment) |
| 2 | `bar-regular.yaml`, `dock-worker.yaml`, `bar-owner.yaml`, `scheduler.yaml`, `ring-operative.yaml` | critical | `wary` and `tired` mood values appear in mood: fields but were never part of any D-035 vocabulary. Pre-existing on main — not introduced by this PR, but schema rejects them |
| 3 | `situations.yaml` | warning | Missing `greeting`, `first_meeting`, `repeated_visit` situation definitions — Layer 2 greeting variants reference these but they don't exist in the enum file |
| 4 | Server `derive_situations` | warning | `derive_situations()` never pushes `Situation::Greeting`, so all lines tagged `situation: [greeting]` are functionally dead. Server-side fix needed (not copy team scope) |
| 5 | `kael-davan.yaml:436` | suggestion | Double-dash `--` should be em-dash `—` for typographic consistency |
### Paula (Narrative): REVIEW INVALID
Paula's round 2 review verified against main branch filesystem rather than origin/copy. All critical findings (moods.yaml not updated, opening files missing) are false — these files are correct on the copy branch. Disregarding this review.
### Miri (World Consistency): PARTIAL — REQUEST_CHANGES
Miri correctly identified the ID collision at `_d_046-048` (confirmed independently). Other criticals (moods.yaml, opening files) were false negatives from reading main instead of copy branch.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `kael-davan.yaml` vs `pc-detective.yaml` | critical | ID collision at `_d_046`, `_d_047`, `_d_048` (corroborates Hoshe H1) |
### Verdict: CHANGES REQUESTED
**Reviewer reliability note:** Paula and Miri's reviews were partially or fully invalid due to reading main branch files instead of the copy branch. Only Hoshe had full branch access. The pr-review process is being updated to use worktree paths to prevent this in future reviews.
**Actionable items for copy team:**
1. **ID collision (CRITICAL):** Renumber Kael Layer 2 IDs to start at `_d_050` or higher, or adopt NPC-scoped namespace (`kael-davan_d_001`) per D-035 Sprint 15 amendment + ticket #542
2. **wary/tired moods (CRITICAL):** Replace with valid D-035 vocabulary in the 5 affected files (pre-existing issue, but should be fixed in this PR since mood files are in scope)
3. **Greeting situation plumbing (WARNING):** Layer 2 greeting lines won't fire until server adds Greeting situation derivation — track as separate ticket, not blocking this PR
All round 2 fixes verified: ID collision resolved (_d_050-053), wary/tired moods removed, greeting added to situations.yaml, double-dashes fixed in kael-davan.yaml. Full QA pass clean.
#
File
Severity
Issue
1
situations.yaml
suggestion
Header comment says "13 situation values" but file now has 14 after adding greeting
2
sera-venn.yaml (new Layer 2 lines)
suggestion
Double-dash -- in new lines — consistent with pre-existing file style but diverges from kael-davan's em-dash convention
3
Pre-existing (not this branch)
suggestion
Widespread ID collisions across all three dialogue directories confirmed present on main — tracked by ticket #542 (NPC-scoped namespace migration)
Paula (Narrative): APPROVE
Strong, production-ready copy. Opening hook sequences praised as "the best single deliverable in the branch." Voice discipline consistent for both characters, dual-lens contrast effective, Layer 2 greeting variants mechanically clean.
#
File
Severity
Issue
1
detective/opening.yaml (opening_m_d_002)
suggestion
Missing mood tag on analytical line — should be mood: [focused] for consistency with surrounding lines
2
kael-davan.yaml (the-terminal_d_020)
suggestion
Missing mood tag on knowledge-granting ring-ops line — recommend mood: [content]
3
sera-venn.yaml (6 lines)
suggestion
Double-dash -- inconsistency with kael-davan's em-dash convention
4
layer2-situation-mapping.md
suggestion
Document the fallback behavior when greeting-tagged lines don't fire (pending Rust update)
Miri (World Consistency): REQUEST_CHANGES
Setting consistency solid. IP check clean. Mood vocabulary correct throughout — zero old-vocab instances. Two warnings remain.
#
File
Severity
Issue
1
detective/opening.yaml (opening_m_d_002)
warning
"span gate threshold" is not a canonical compound. D-036 establishes "span gate" as the noun; "threshold" is an unestablished expansion. Notes field incorrectly claims D-036 establishes this compound. Fix: use "span gate" or "span gate hum"
2
kael-davan.yaml (the-terminal_d_020)
warning
Missing mood tag on a knowledge-granting ring-ops line (knowledge_grant: investigation.drin_inspection_pattern). High-signal lines need explicit mood for Layer 4 scoring. Add mood: [content]
Verdict: CHANGES REQUESTED
Progress: Major improvement — all round 2 criticals resolved, worktree-based reviews now producing reliable results across all three reviewers. Only two minor warnings remain, both trivial fixes:
Change "span gate threshold" to "span gate" in detective opening line + fix notes field
Add mood: [content] to the-terminal_d_020
Note: Hoshe discovered widespread pre-existing ID collisions across all dialogue directories on main. These are NOT introduced by this PR and are tracked by ticket #542 (NPC-scoped namespace migration).
## Review Round 3: copy -> main (type: copy) — PR #53
### Hoshe (QA): APPROVE
All round 2 fixes verified: ID collision resolved (_d_050-053), wary/tired moods removed, greeting added to situations.yaml, double-dashes fixed in kael-davan.yaml. Full QA pass clean.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `situations.yaml` | suggestion | Header comment says "13 situation values" but file now has 14 after adding greeting |
| 2 | `sera-venn.yaml` (new Layer 2 lines) | suggestion | Double-dash `--` in new lines — consistent with pre-existing file style but diverges from kael-davan's em-dash convention |
| 3 | Pre-existing (not this branch) | suggestion | Widespread ID collisions across all three dialogue directories confirmed present on main — tracked by ticket #542 (NPC-scoped namespace migration) |
### Paula (Narrative): APPROVE
Strong, production-ready copy. Opening hook sequences praised as "the best single deliverable in the branch." Voice discipline consistent for both characters, dual-lens contrast effective, Layer 2 greeting variants mechanically clean.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `detective/opening.yaml` (`opening_m_d_002`) | suggestion | Missing mood tag on analytical line — should be `mood: [focused]` for consistency with surrounding lines |
| 2 | `kael-davan.yaml` (`the-terminal_d_020`) | suggestion | Missing mood tag on knowledge-granting ring-ops line — recommend `mood: [content]` |
| 3 | `sera-venn.yaml` (6 lines) | suggestion | Double-dash `--` inconsistency with kael-davan's em-dash convention |
| 4 | `layer2-situation-mapping.md` | suggestion | Document the fallback behavior when greeting-tagged lines don't fire (pending Rust update) |
### Miri (World Consistency): REQUEST_CHANGES
Setting consistency solid. IP check clean. Mood vocabulary correct throughout — zero old-vocab instances. Two warnings remain.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `detective/opening.yaml` (`opening_m_d_002`) | warning | "span gate threshold" is not a canonical compound. D-036 establishes "span gate" as the noun; "threshold" is an unestablished expansion. Notes field incorrectly claims D-036 establishes this compound. Fix: use "span gate" or "span gate hum" |
| 2 | `kael-davan.yaml` (`the-terminal_d_020`) | warning | Missing mood tag on a knowledge-granting ring-ops line (`knowledge_grant: investigation.drin_inspection_pattern`). High-signal lines need explicit mood for Layer 4 scoring. Add `mood: [content]` |
### Verdict: CHANGES REQUESTED
**Progress:** Major improvement — all round 2 criticals resolved, worktree-based reviews now producing reliable results across all three reviewers. Only two minor warnings remain, both trivial fixes:
1. Change "span gate threshold" to "span gate" in detective opening line + fix notes field
2. Add `mood: [content]` to `the-terminal_d_020`
**Note:** Hoshe discovered widespread pre-existing ID collisions across all dialogue directories on main. These are NOT introduced by this PR and are tracked by ticket #542 (NPC-scoped namespace migration).
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
opening.yamlfiles per character.situation: [greeting]. Newdocs/design/layer2-situation-mapping.mddocuments the InteractionMemory→Layer 2 pipeline and authoring patterns.Tickets
Test plan
opening_m_{s|d}_{###}patternReview: copy -> main (type: copy)
Hoshe (QA): REQUEST_CHANGES
Strong execution overall. Mood rename landed on a subset, design doc quality is high.
dialogue/the-terminal/kael-davan.yaml:433the-terminal_d_039collides withpc-smuggler.yaml:20. Next safe start:_d_046monologue/*/pc-smuggler-tells.yaml,pc-detective-tells.yamlgeneral_m_d_namespace but live in differently-named files — maintenance hazarddialogue/the-terminal/kael-davan.yaml:153the-terminal_d_014missingmoodfield (all surrounding lines have it)Paula (Narrative): REQUEST_CHANGES
Opening hooks are genuinely strong. Layer 2 variants have real depth. But two critical gaps.
moods.yamlmoods.yamlenum not updatedkael-davan.yaml,sera-venn.yamlsera-venn.yamlconflictedon FRIEND arc lines needs per-line authorial judgment, not mechanical renameMiri (World Consistency): REQUEST_CHANGES
Setting consistency is solid. No IP flags. Canonical terms mostly correct.
moods.yaml+ 20 dialogue filesconflictedlinesVerdict: CHANGES REQUESTED
Cross-reviewer consensus: All three independently flagged the incomplete mood vocabulary rename as critical. The opening hook content missing from YAML files was caught by both Paula and Hoshe (structurally). Hoshe additionally found a concrete duplicate line ID collision that the other reviewers couldn't detect without grep.
Gameplay verification note: Reviewers confirmed the Layer 2 situation mapping design is mechanically sound for larger gameplay — the InteractionMemory derivation chain properly handles repeat visits and relationship state transitions. The mood vocabulary, once completed, will correctly drive Layer 4 scoring across the full NPC roster.
Review Round 2: copy -> main (type: copy) — PR #53
Hoshe (QA): REQUEST_CHANGES
Round 1 fixes verified: mood enum updated, opening hooks in YAML, IDs renumbered. But new issues found.
kael-davan.yaml:425-480vspc-detective.yaml_d_046,_d_047,_d_048collide with pc-detective.yaml which already holds those IDs. Next safe start:_d_050(or adopt NPC-scoped IDs per D-035 Sprint 15 amendment)bar-regular.yaml,dock-worker.yaml,bar-owner.yaml,scheduler.yaml,ring-operative.yamlwaryandtiredmood values appear in mood: fields but were never part of any D-035 vocabulary. Pre-existing on main — not introduced by this PR, but schema rejects themsituations.yamlgreeting,first_meeting,repeated_visitsituation definitions — Layer 2 greeting variants reference these but they don't exist in the enum filederive_situationsderive_situations()never pushesSituation::Greeting, so all lines taggedsituation: [greeting]are functionally dead. Server-side fix needed (not copy team scope)kael-davan.yaml:436--should be em-dash—for typographic consistencyPaula (Narrative): REVIEW INVALID
Paula's round 2 review verified against main branch filesystem rather than origin/copy. All critical findings (moods.yaml not updated, opening files missing) are false — these files are correct on the copy branch. Disregarding this review.
Miri (World Consistency): PARTIAL — REQUEST_CHANGES
Miri correctly identified the ID collision at
_d_046-048(confirmed independently). Other criticals (moods.yaml, opening files) were false negatives from reading main instead of copy branch.kael-davan.yamlvspc-detective.yaml_d_046,_d_047,_d_048(corroborates Hoshe H1)Verdict: CHANGES REQUESTED
Reviewer reliability note: Paula and Miri's reviews were partially or fully invalid due to reading main branch files instead of the copy branch. Only Hoshe had full branch access. The pr-review process is being updated to use worktree paths to prevent this in future reviews.
Actionable items for copy team:
_d_050or higher, or adopt NPC-scoped namespace (kael-davan_d_001) per D-035 Sprint 15 amendment + ticket #542Review Round 3: copy -> main (type: copy) — PR #53
Hoshe (QA): APPROVE
All round 2 fixes verified: ID collision resolved (_d_050-053), wary/tired moods removed, greeting added to situations.yaml, double-dashes fixed in kael-davan.yaml. Full QA pass clean.
situations.yamlsera-venn.yaml(new Layer 2 lines)--in new lines — consistent with pre-existing file style but diverges from kael-davan's em-dash conventionPaula (Narrative): APPROVE
Strong, production-ready copy. Opening hook sequences praised as "the best single deliverable in the branch." Voice discipline consistent for both characters, dual-lens contrast effective, Layer 2 greeting variants mechanically clean.
detective/opening.yaml(opening_m_d_002)mood: [focused]for consistency with surrounding lineskael-davan.yaml(the-terminal_d_020)mood: [content]sera-venn.yaml(6 lines)--inconsistency with kael-davan's em-dash conventionlayer2-situation-mapping.mdMiri (World Consistency): REQUEST_CHANGES
Setting consistency solid. IP check clean. Mood vocabulary correct throughout — zero old-vocab instances. Two warnings remain.
detective/opening.yaml(opening_m_d_002)kael-davan.yaml(the-terminal_d_020)knowledge_grant: investigation.drin_inspection_pattern). High-signal lines need explicit mood for Layer 4 scoring. Addmood: [content]Verdict: CHANGES REQUESTED
Progress: Major improvement — all round 2 criticals resolved, worktree-based reviews now producing reliable results across all three reviewers. Only two minor warnings remain, both trivial fixes:
mood: [content]tothe-terminal_d_020Note: Hoshe discovered widespread pre-existing ID collisions across all dialogue directories on main. These are NOT introduced by this PR and are tracked by ticket #542 (NPC-scoped namespace migration).
Review Round 4: copy -> main (type: copy) — PR #53
Hoshe (QA): APPROVE
All 6 round 3 items verified fixed. Full QA pass clean.
monologue/detective/the-last-shift.yaml+monologue/smuggler/the-last-shift.yamlPaula (Narrative): APPROVE
Round 3 fixes landed without degrading narrative quality. Voice discipline maintained, em-dash consistency confirmed across sera-venn.
detective/opening.yaml(opening_m_d_002)layer2-situation-mapping.mdarrivaltags but body describes fallback toroutine/social— minor precision gapMiri (World Consistency): APPROVE
Both round 3 warnings fixed. "span gate hum" is canonical per D-036. All mood values from D-035 set. No lore or IP issues.
No new issues.
Verdict: APPROVED
Pull request closed