This is the current payment-truth contract on the Development Engine. The
ownership doctrine is unchanged from the
Payment Truth Foundation
(dated 2026-06-19): the Engine owns payment truth, Stripe is what actually
moved, the durable ledger is what survives a restart, and the Admin renders
Engine truth. What is new since September is that the Admin now executes real
Stripe doors on the owner’s tap, and the truth closes the step.
Real Stripe, declared mode
One truth function
Payment truth is resolved per obligation (deposit, balance) from the Stripe ledger and the owner’s own rows, by one function that every reader uses: the Algorithm, the Focus house pack, the payment-status read and every money door (LUCI-215 phase 01b, engine deve0c869f and 5af7703, 2026-09-06).
31fce1c, 2026-09-03;
founder: “ship”). ALGO-24’s “round two” (the Postgres ledger as the only
financial truth in durable mode) is named on that record as the production
gate and is not started.
A lying balance field on a booking record cannot move a charge: every money
door computes its amount from the ledger.
The money story, in owner words
The Engine serves the record’s words; the Admin reads them, never composes them (Payment page speaks as one, LUCI-242, engine dev1f7d773,
2026-09-09):
payment-history-kinds/v1, LUCI-245, engine
dev e2166b8): card_failed, money_in, asked, refund, dispute,
recorded_by_owner, other. The kind is attached from the ledger event that
produced the row, never inferred from the sentence (no keyword guardrails); an
unmapped row is other, never null. The founder’s ask (2026-09-09): “for
anything historical or timeline-ish like this, we should copy Linear with this
flowing, connected, vertical element.”
Every time word is the property’s own (America/Bahia_Banderas), never a zone
name, never a year.
The doors
Each door is a real Stripe action executed on the owner’s tap and never before it. Every tap carries a freshclient_reference, which is the
idempotency identity; a network retry of the same tap reuses the same Stripe
idempotency key and never mints a second object.
The generic
create-checkout-session endpoint is retired (LUCI-215 round
2): it trusted the client’s amount and became live-capable with the mode
contract. Only the payment-status reads remain on that router.
When there is no card on file, the record says so in words: “There’s no card
on file for Quinn, so this link asks for one and keeps it for next time.”
Lucia’s draft, one brain
The payment request is drafted by one gateway task,payment_request_draft,
pinned to claude-fable-5-1 on Development with no fallback (Lucia asks
Quinn for a new card, LUCI-210, 2026-09-06): if Fable cannot draft, the step
says so and offers Copy link only. The draft names the guest, the amount
and the moment, carries the live checkout link, never a year, never an engine
word; the owner’s own edits are never rewritten. Three buttons, no Save:
Send email (Resend), Send text (Twilio, only when the record has a
phone), Copy link.
The draft reports its stages (payment-draft-stages/v1, LUCI-233,
Completed 2026-09-09): reading → linking → composing → ready, streamed as
data-only server-sent events when the caller asks for them; a reused link
omits linking; never a timer, never a percentage. Founder: “Narration during
loader is MUCH more helpful.”
The draft’s honest face was proved and fixed on 2026-09-07 (Lucia couldn’t
write the payment ask, LUCI-220, engine dev e2dc3d8): the composer had been
refusing before any provider was asked because of a string-versus-number
booking id at the hand-off. The per-task no-fallback env line for this task
(LUCIA_FALLBACK_MODEL_PAYMENT_REQUEST_DRAFT=none) is not evidenced set
on api-dev and remains an open founder item on that record; the source default
already yields no fallback for the task at e2166b8.
The truth closes the step
A payment item on the arrival readiness feed isdone only when the applied
truth for the stay reads confirmed_paid, owner-recorded rows included; it
re-opens when the truth leaves confirmed_paid. “Nothing else closes it — not
a send, not a note, not a tap.” (Payment step is the payment record, LUCI-219,
shape accepted 2026-09-07; engine dev 5c3ca1b and 63b5546, admin dev
814d90f.)
Doctrine, unchanged
Not current
- Live mode: possible by contract, not on. No production service, no live keys evidenced, no live webhook registered.
- ALGO-24 round two (the Postgres ledger as sole financial truth in durable mode): the production gate, not started.
- Engine migrations ride the deploy (LUCI-146): Planned; the September Stripe migrations were applied by hand before their code was pushed.
- Founder proofs still open on the record: the rebuilt payment record
(LUCI-215 phase 02, admin dev
81ab08f), the self-closing step (LUCI-219), the history rail’s icons (LUCI-245). - The admin surface’s own words and layout are documented separately (wave 2).
See also
- Payment Truth Foundation (historical, 2026-06-19)
- Resend
- Model Layer
- Supabase
- Focus Ops Intelligence
- LIEA doctrine

