integrated candidate system

This commit is contained in:
2026-08-15 13:01:04 +02:00
parent 9e5c3277bf
commit 22b8c7a438
6 changed files with 512 additions and 2 deletions
@@ -5,6 +5,14 @@
// Writing rules (code does not enforce these):
// - Wrong Truth failures: no failure signal in the prose; the UI banner is the only tell.
// - Documentary routes are gated on Act and errand state, never on a voice.
//
// TODO: ambient fallback. Every voice in the Skill Bible has one context-free
// PASSIVE VOICE line, and right now those lines have nowhere to live — a voice
// with no Commentary_{context}_{id} node simply stays silent in that context.
// Proposal: when no context node matches an eligible skill, CommentarySystem
// falls back to Commentary_Ambient_{id}. Deferred from the refactor as optional;
// only worth doing if it doesn't complicate the candidate loop.
// See docs/skill-system-refactor-plan.md §5.6.
title: Commentary_Entrance_Queue_facework
---
@@ -36,4 +36,15 @@ title: Declarations
<<declare $check_modifier = 0 as number>>
<<declare $check_degree = "" as string>>
<<declare $check_skill = "" as string>>
// Candidate lean. Three permanently-live readings of who the PC is; they are
// not mutually exclusive and never resolve. Writers <<set>> these; no code
// reads them. There is deliberately NO derived "winning candidate" variable —
// see docs/candidate-system-plan.md §5.
<<declare $self_lean_made_asset = 0 as number>>
<<declare $self_lean_journalist = 0 as number>>
<<declare $self_lean_inheritor = 0 as number>>
// Scene witnessed. New convention: $seen_<scene_id>.
<<declare $seen_sc_101 = false as bool>>
===
@@ -1,5 +1,5 @@
// Scratch node for verifying the skill-check plumbing. Not part of the story.
// Point DialogueRunner.startNode at "Debug_SkillCheck" to run it, then set it
// Scratch nodes for verifying mechanics in isolation. Not part of the story.
// Point DialogueRunner.startNode at the node you want to run, then set it
// back to "Start" when you're done.
title: Debug_SkillCheck
@@ -20,3 +20,16 @@ Narrator: Confluence came out {$check_degree}.
<<check nosuchskill routine>>
Narrator: Survived the bad skill id.
===
// Candidate lean accumulator round-trip. Expect made_asset 2 / journalist 1 /
// inheritor 0, and the threshold branch to fire.
title: Debug_CandidateLean
---
<<set $self_lean_made_asset += 1>>
<<set $self_lean_made_asset += 1>>
<<set $self_lean_journalist += 1>>
Narrator: made_asset {$self_lean_made_asset} / journalist {$self_lean_journalist} / inheritor {$self_lean_inheritor}
<<if $self_lean_made_asset >= 2>>
Narrator: threshold branch reached.
<<endif>>
===
@@ -0,0 +1,56 @@
// SC-101 — The Card at the Desk. Opening candidate hooks.
//
// Scene files stay thin: set the stage, <<detour>> into hook nodes, return.
// Prose is TODO until the writing pass; structure and flag writes are locked.
//
// Evidence rule (design §1.3): each candidate gets exactly one of each evidence
// type — object, testimony, document, intuition. Preserve that balance; do not
// stack types so trust becomes an artifact of imbalance.
//
// Discovery order (§1.5): hooks are independently reachable in any order via
// <<detour>> from the desk. Never <<if>>-guard a hook on another hook having
// fired, on any $self_lean_*, or on skill_rank(...). Never make a hook only
// reachable as fall-through from another.
title: SC101_Desk
---
<<set $seen_sc_101 = true>>
Narrator: TODO — desk / card stage-setting.
-> Made Asset hook
<<detour SC101_Hook_MadeAsset>>
<<jump SC101_Desk>>
-> Journalist hook
<<detour SC101_Hook_Journalist>>
<<jump SC101_Desk>>
-> Inheritor hook
<<detour SC101_Hook_Inheritor>>
<<jump SC101_Desk>>
-> Neutral hook
<<detour SC101_Hook_Neutral>>
<<jump SC101_Desk>>
-> Leave the desk
Narrator: TODO — exit the desk beat.
===
title: SC101_Hook_MadeAsset
---
CONFLUENCE: TODO — Made Asset intuition.
<<set $self_lean_made_asset += 1>>
===
title: SC101_Hook_Journalist
---
FACEWORK: TODO — Journalist intuition.
<<set $self_lean_journalist += 1>>
===
title: SC101_Hook_Inheritor
---
STANDING ORDER: TODO — Inheritor intuition.
<<set $self_lean_inheritor += 1>>
===
title: SC101_Hook_Neutral
---
HOUSE POUR: TODO — neutral Body texture; no lean.
===
@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: ef4adc1687e744cd0afd7041ab38c377
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}