From 85083fc88a0424a413a7e5eb3532c82aade98a15 Mon Sep 17 00:00:00 2001 From: Cameron Pfiffer Date: Fri, 17 Jul 2026 17:12:28 -0700 Subject: [PATCH] Withdraw unsupported clinic-debt plot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The route could not truthfully resolve against the modeled gambling debt and would duplicate the existing settlement path if reframed. Remove it instead of inventing unsupported debt state, and tighten the authored-plot contract around target-relative debt effects. Defense: plot narration and typed world acts must describe the same modeled obligation, while overlapping routes must remain mechanically distinct. 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code --- .../plots/generic/looming-bill-absorbed.toml | 82 ------------------- .../log/2026-07-17-looming-bill-causal-fix.md | 49 +++++++++++ wiki/log/DEVLOG.md | 5 ++ wiki/mechanics/plots.md | 18 +++- 4 files changed, 69 insertions(+), 85 deletions(-) delete mode 100644 assets/plots/generic/looming-bill-absorbed.toml create mode 100644 wiki/log/2026-07-17-looming-bill-causal-fix.md 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 -- 2.51.2