commerce: order lifecycle as a durable flow-on-sx flow (21 tests) — Phase 3 done
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 57s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 57s
order.sx — reserve -> await-payment -> fulfil as a flow-on-sx flow carrying only the order-id; the SX driver services each request by appending to the persist ledger. order-begin! creates+reserves and suspends at payment; order-settle! (webhook) resumes -> fulfils, idempotent on replay (:already-settled). order-flow-restart! simulates a process restart Scheme-side and the suspended order resumes with the ledger intact. Composes all three substrates: minikanren pricing -> flow lifecycle -> persist ledger. Total 153/153 across 9 suites. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,7 +21,7 @@ reconciliation — all auditable via the event log.
|
||||
|
||||
## Status (rolling)
|
||||
|
||||
`bash lib/commerce/conformance.sh` → **132/132** (8 suites: catalog, cart, price, api, promo, stack, quote, ledger) — Phases 1-2 done; Phase 3 ledger done
|
||||
`bash lib/commerce/conformance.sh` → **153/153** (9 suites: catalog, cart, price, api, promo, stack, quote, ledger, order) — Phases 1-3 done
|
||||
|
||||
## Ground rules
|
||||
|
||||
@@ -66,8 +66,8 @@ lib/commerce/api.sx ── (commerce/add) (commerce/total) (commerce/checkout)
|
||||
- [x] tests: stacking order, mutually-exclusive promos, member vs guest
|
||||
|
||||
## Phase 3 — Order lifecycle (flow + store)
|
||||
- [ ] order flow: reserve stock → await payment → fulfil
|
||||
- [ ] payment webhook resumes the suspended flow
|
||||
- [x] order flow: reserve stock → await payment → fulfil
|
||||
- [x] payment webhook resumes the suspended flow
|
||||
- [x] order ledger as a `persist` stream; idempotent reconciliation
|
||||
|
||||
## Phase 4 — Reconciliation + federation
|
||||
@@ -76,6 +76,21 @@ lib/commerce/api.sx ── (commerce/add) (commerce/total) (commerce/checkout)
|
||||
- [ ] tests: webhook replay, partial refund, double-charge guard
|
||||
|
||||
## Progress log
|
||||
- 2026-06-07 — `order.sx` (**Phase 3 complete**, checkboxes 1-2): order lifecycle
|
||||
as a flow-on-sx flow `(lambda (oid) (begin (request 'reserve oid) (request
|
||||
'payment oid) (request 'fulfil oid)))` — pure orchestration carrying only the
|
||||
order-id; the SX driver services each request by appending to the persist
|
||||
ledger. `order-begin!` creates+reserves and leaves the flow SUSPENDED at
|
||||
payment; `order-settle!` (the webhook) resumes → fulfils, and is idempotent
|
||||
(only acts while waiting on payment, so a replayed webhook → :already-settled).
|
||||
`order-flow-restart!` simulates a process restart entirely Scheme-side
|
||||
(export→reset→reload→import) and the suspended order resumes correctly
|
||||
afterwards with the persist ledger intact. Composes all three substrates
|
||||
(minikanren pricing → flow lifecycle → persist ledger). order suite 21/21;
|
||||
total 153/153. Gotchas: flow ids start at 1; never return flow-make-env across
|
||||
the eval boundary (serializer hangs on the cyclic env); guest Scheme rejects
|
||||
`:ok` keyword as a value — use `#t`. Flow env build ~150s CPU; order suite runs
|
||||
single-process with timeout 560.
|
||||
- 2026-06-07 — `ledger.sx` (Phase 3 piece, checkbox 3): order ledger as a
|
||||
persist event stream "order/<id>". Status/total/paid/recon are projections
|
||||
(folds) over events — ledger is the single source of truth. `order-pay`/
|
||||
|
||||
Reference in New Issue
Block a user