You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Companions have dossiers, approval, banter — but no agendas. Story 4.3 needs relationships that push back: companions who initiate scenes, object mid-quest, have conflicting desires, and can leave. (Audit insight: story ≥4.3 is a SYSTEM gap, not a prose gap — prose already scores 4.0+.)
Design
Agenda model (additive on companion.py/companion_arc.py): each companion gets agenda: {goal, taboo, fuse} — a desire (e.g. Rolan: prove himself), a line the player mustn't cross (taboo), and a fuse (approval threshold + event triggers that fire an agenda beat).
Companion-initiated beats: a deterministic engine trigger (the Director's advisory channel — director.py already advises the DM per beat) that, when a fuse condition fires (approval crossing a band, a taboo event logged, a camp rest after a charged scene), instructs the DM: "COMPANION BEAT: pulls the player aside — play their agenda scene." The engine decides WHEN (deterministic, gauge-backed per invariant Epic 2: Characters & progression #3); the DM plays WHAT.
Objection interjections: on quest decisions that touch a companion's taboo, the engine surfaces an objection flag in the decision payload → the DM voices it BEFORE resolution; the player chooses anyway → approval consequence logged with reason ([memory] Append {delta,reason} at the ~4 approval/reputation mutator sites #613 machinery).
Departure: approval floor + a fired taboo ⇒ engine sets companion.status=departing → the DM plays the exit; reversible via a reconciliation arc (the existing arc-stage machine).
Files
servers/engine/companion.py, companion_arc.py, director.py (the trigger channel), models.py (additive agenda fields, default-empty = today's behavior), dungeon-master skill (the COMPANION BEAT directive), viewer Relations screen (agenda hints, fuse state NOT shown raw — show "something is weighing on Rolan").
Acceptance
A scripted engine test: approval crossing a band fires exactly one companion-beat advisory; a taboo event sets the objection flag; departure triggers at the configured floor. A duo run shows a companion-initiated scene in the transcript (story-lens scored). Old snapshots round-trip (agenda defaults empty).
Moves
story_craft → 4.3 (the biggest single lever), cross_persona_sat (narrative), retention.
Concept
Companions have dossiers, approval, banter — but no agendas. Story 4.3 needs relationships that push back: companions who initiate scenes, object mid-quest, have conflicting desires, and can leave. (Audit insight: story ≥4.3 is a SYSTEM gap, not a prose gap — prose already scores 4.0+.)
Design
companion.py/companion_arc.py): each companion getsagenda: {goal, taboo, fuse}— a desire (e.g. Rolan: prove himself), a line the player mustn't cross (taboo), and a fuse (approval threshold + event triggers that fire an agenda beat).director.pyalready advises the DM per beat) that, when a fuse condition fires (approval crossing a band, a taboo event logged, a camp rest after a charged scene), instructs the DM: "COMPANION BEAT: pulls the player aside — play their agenda scene." The engine decides WHEN (deterministic, gauge-backed per invariant Epic 2: Characters & progression #3); the DM plays WHAT.objectionflag in the decision payload → the DM voices it BEFORE resolution; the player chooses anyway → approval consequence logged with reason ([memory] Append {delta,reason} at the ~4 approval/reputation mutator sites #613 machinery).companion.status=departing→ the DM plays the exit; reversible via a reconciliation arc (the existing arc-stage machine).Files
servers/engine/companion.py,companion_arc.py,director.py(the trigger channel),models.py(additive agenda fields, default-empty = today's behavior), dungeon-master skill (the COMPANION BEAT directive),viewerRelations screen (agenda hints, fuse state NOT shown raw — show "something is weighing on Rolan").Acceptance
A scripted engine test: approval crossing a band fires exactly one companion-beat advisory; a taboo event sets the objection flag; departure triggers at the configured floor. A duo run shows a companion-initiated scene in the transcript (story-lens scored). Old snapshots round-trip (agenda defaults empty).
Moves
story_craft → 4.3 (the biggest single lever), cross_persona_sat (narrative), retention.