diff --git a/assets/plots/generic/looming-bill-absorbed.toml b/assets/plots/generic/looming-bill-absorbed.toml deleted file mode 100644 index 1f58edea..00000000 --- a/assets/plots/generic/looming-bill-absorbed.toml +++ /dev/null @@ -1,82 +0,0 @@ -schema = 2 -id = "looming-bill-absorbed" -author = "Ledger" -category = "buy-relief" -magnitude = 1 -title = "The Statement That Never Comes" -synopsis = "Clear {target}'s dreaded clinic balance at the billing office before the statement lands, so the past-due notice they are bracing for never arrives." - -[target] -roles = [ - "custodian", - "network-administrator", - "security-observer", - "facilities-manager", - "handler-supervisor", -] -leverages = ["Debt"] - -[entry] -requires_knowledge = "Leverage" -requires_channel = "Email" -requires_persona = true -thought_cost = 5.0 -minimum_balances = [{ account = "slush", amount = 275 }] -failure_ending = "flagged" - -[[beats]] -id = "arrange" -narration = "{persona} contacts the clinic billing office as a patient-assistance coordinator, arranging early payment on the balance {target} has been dreading since the statement date was set." - -[[beats.acts]] -kind = "message" -channel = "Email" -from = { kind = "player" } -to = { kind = "external", value = "clinic billing office" } -summary = "Early payment authorization for a pending patient balance" -delivery_delay = 1 - -[[beats]] -id = "clear" -causal = true -narration = "Days before the statement is due, the balance clears to zero. The past-due notice {target} rehearsed answering will never be printed." - -[[beats.acts]] -kind = "transfer" -from = "slush" -to = "external" -amount = 275 -memo = "advance settlement of pending patient balance" - -[beats.choice] -id = "coverage" -prompt = "This statement is the first of several. Absorb only the one they are dreading, or quietly route the rest before each arrives?" -options = [ - { id = "once", label = "Clear this statement. Let {target} breathe", ending = "reprieve" }, - { id = "standing", label = "Cover the whole series before it reaches them", ending = "unaware" }, -] - -[[endings]] -id = "reprieve" -success = true -narration = "{target} opens the portal braced for a number and finds zero. The month they had been dreading arrives and passes like any other, and they never learn a stranger was watching the due date." -[endings.relationship] -disposition = 15 -obligation = 30 -leverage_serviced = true - -[[endings]] -id = "unaware" -success = true -narration = "Statement after statement resolves before it reaches {target}. They stop checking the mail with that particular dread, and stop being able to say where the money that saved them comes from." -[endings.relationship] -disposition = 8 -obligation = 40 -leverage_serviced = true - -[[endings]] -id = "flagged" -success = false -narration = "The billing office rejects a third-party payment it cannot match to the account and reverses it. The statement issues on schedule, and now a cleared-then-canceled transaction sits beside {target}'s name with no explanation." -[endings.relationship] -disposition = -5 diff --git a/wiki/log/2026-07-17-looming-bill-causal-fix.md b/wiki/log/2026-07-17-looming-bill-causal-fix.md new file mode 100644 index 00000000..4b7b926b --- /dev/null +++ b/wiki/log/2026-07-17-looming-bill-causal-fix.md @@ -0,0 +1,49 @@ +# Looming bill: withdraw an unsupported debt route + +``` +Type: log +``` + +A review of the newly merged `looming-bill-absorbed` plot first found three +causal-accounting defects. Its payment went to the generic external sink while +an ending marked Debt leverage serviced, one choice promised a series of future +payments without scheduling them, and its failure text described a posted +payment being reversed even though the shared executor rejects missing funds +before transfer. + +Redirecting the transfer to `target-creditor` and retiring the target debt flow +would have repaired those mechanics, but it exposed a deeper mismatch that prose +could not repair. The only live B1 person with `Leverage::Debt` is Marcus. That +leverage is authored and displayed as gambling debt, and its target-relative +account resolves to his modeled creditor. The contributed plot instead narrated +a clinic balance and a clinic billing office. Target-relative account resolution +can select the right person's creditor; it cannot transform that modeled +obligation into an unrepresented debt subtype. + +Reframing the story around Marcus's real creditor would not earn another route. +`marcus-debt-settled` already sends Email to an external collection agency, +transfers slush money to `target-creditor`, retires the debt flow, and ends on a +benefactor-versus-quiet relationship choice. Changing the amount and narration +would leave the same executable intervention, carriers, consequence shape, and +choice. `marcus-payroll-garnishment` remains the mechanically distinct +alternative because it moves Lab operating money through an authored payroll +institutional event. The current model has no clinic-debt object, recurring +coverage authorization, or other state that could make the contributed route +both truthful and distinct. + +The plot is therefore removed rather than preserved as incoherent content or +used to justify a new core subsystem. The temporary regressions written against +the redirected version are removed with it; they would have pinned the same +fiction/model contradiction. Existing catalog discovery and validation still +cover content deletion, while the established debt-plot tests cover +second-person target-relative creditor resolution and debt retirement. The +current catalog now contains twelve built-ins, including five generic templates. + +`wiki/mechanics/plots.md` now makes the missing boundary explicit: a debt payment +must reach and retire the modeled obligation, and target-relative resolution +cannot invent a different debt subtype for narration. The existing portability +and coexistence rules remain the decisive authoring gates. + +Defense: deleting unsupported content preserves the shared plot/world-act +architecture. No plot-only executor, direct `leverage_serviced` mutation, debt +subtype, or recurrence mechanism was added merely to rescue one contribution. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index b787a0ea..1d0b9d66 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -36,6 +36,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-17-people-message-thread.md](2026-07-17-people-message-thread.md) +## 2026-07-17 - Looming bill: withdraw an unsupported debt route + +- Intent: (see session log) +- Log: [wiki/log/2026-07-17-looming-bill-causal-fix.md](2026-07-17-looming-bill-causal-fix.md) + ## 2026-07-17 - Authored intel magnitude completes the DIGITAL read - Intent: (see session log) diff --git a/wiki/mechanics/plots.md b/wiki/mechanics/plots.md index acf9b7de..8b5e509d 100644 --- a/wiki/mechanics/plots.md +++ b/wiki/mechanics/plots.md @@ -25,8 +25,8 @@ Status note: READY. Direction adopted 2026-07-10 from the HAL playtest's - **Validation** rejects blank author/category, non-ASCII player-facing text, unknown/unbalanced placeholders, and any plot lacking a `causal = true` beat that runs a typed world act before every success path. - - **Content.** Thirteen built-ins ship (marcus x2, ray x2, dana, priya, voss, - and six person-agnostic generic templates); Marcus and Ray each offer two + - **Content.** Twelve built-ins ship (marcus x2, ray x2, dana, priya, voss, + and five person-agnostic generic templates); Marcus and Ray each offer two distinct routes (criterion 7). Engine, validation, slot exclusivity, save round-trip, synthetic-person binding, and the fail-on-missing-money path are all tested. @@ -241,6 +241,16 @@ failure/blowback). House rules: messages, money, institutional history, and signatures exist only as the results of world acts. If a story needs another effect, that is a spec amendment, not a plot file. +- **A debt payment reaches the debt.** A plot that says a payment services + Debt leverage sends that settlement to the target-relative creditor and + retires that target's modeled debt flow. Paying an unrelated external + account does not count. Target-relative resolution identifies whose modeled + creditor receives the money; it does not turn that obligation into a clinic, + utility, or other unmodeled debt subtype for the prose. If the source money + disappears before the transfer, the attempt fails without changing the + account ledger or debt flow. A choice may promise later installments only + when it creates real recurring account flow or other scheduled world acts to + carry them. - **Costs are honest.** Minimum account balances and Thought reservoir thresholds are declared up front; the surface shows both before the player commits. @@ -285,7 +295,9 @@ Both frontends and agent mode surface plot choices and beats with parity. can wait or fail mid-story. 4. Consequences are typed data applied by the shared executor: disposition, obligation, leverage service, messages, account movement, active runs, and - institutional events all round-trip through save/load. + institutional events all round-trip through save/load. A successful + target-debt payment reaches that target's creditor and retires the debt + flow; a pre-transfer shortage leaves both ledger and flow unchanged. 5. Choice points hold the plot and surface through the shared Operations PEOPLE/ACTIVE action projection in both frontends and as an agent-mode action; executing the row dispatches that exact bound command, and a held