Plans for acl-on-sx (Datalog), flow-on-sx (Scheme), feed-on-sx (APL), mod-on-sx (Prolog), search-on-sx (Haskell). Each is a 4-phase queue sitting on its respective guest language, targeting rose-ash needs: access control, durable workflows, activity feeds, moderation, search. Federation extension in Phase 4 of each (plugs into fed-sx). Briefings for the three loops we're kicking off now: acl-loop, flow-loop, feed-loop. mod-sx and search-sx briefings will follow once the first three have surfaced any shared infrastructure worth extracting to lib/guest/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.9 KiB
flow-on-sx: Durable DAG Workflows on Scheme
rose-ash needs workflows that survive restarts: content pipelines (write → review → publish → federate), scheduled jobs (digest emails), multi-step user flows (signup, confirm, onboard). art-dag is the precedent — DAG-of-tasks with pause/resume at IO boundaries.
Scheme's call/cc + delimited continuations make pause/resume natural: a suspend
captures the continuation, serializes it as part of the flow record, and resume
re-enters at exactly that point. No state-machine bookkeeping by hand. R7RS-small is
already at 2644/2644 (see kernel/architecture status).
End-state: a Scheme-on-SX layer over the existing scheme runtime, with combinators for sequence/parallel/branch/retry/timeout/suspend, persistent flow store, and a federation extension via fed-sx for remote-node execution.
Status (rolling)
bash lib/flow/conformance.sh → 0/0 (not yet started)
Ground rules
- Scope: only touch
lib/flow/**andplans/flow-on-sx.md. Do not editspec/,hosts/,shared/,lib/scheme/**, or otherlib/<lang>/. You may import fromlib/scheme/(public API vialib/scheme/scheme.sx); do not modify Scheme. - Shared-file issues go under "Blockers" with a minimal repro; do not fix here.
- SX files: use
sx-treeMCP tools only. - Architecture: flow combinators are Scheme macros + procedures. Runtime is a
driver loop that walks the flow graph and invokes
call/ccatsuspendpoints. Persistence layer serializes the continuation + open file/socket placeholders are forbidden (continuations must be resumable across process restart). - art-dag awareness: read
plans/art-dag*if it exists for design lineage; do not import code. - Commits: one feature per commit. Keep Progress log updated and tick boxes.
Architecture sketch
(defflow publish
(sequence
(write-content)
(parallel
(review)
(spell-check))
(cond approved?
(sequence (publish) (federate))
(notify-author))))
│
▼
lib/flow/spec.sx lib/flow/runtime.sx lib/flow/store.sx
— defflow — driver loop — append-only flow log
— sequence/parallel — node dispatch — checkpoint serialize
— cond/retry/timeout — call/cc at suspend — restart loader
— suspend/resume │ │
▼ ▼
lib/flow/api.sx lib/flow/remote.sx
— (flow/start name args) — fed-sx adapter
— (flow/resume id value) — node-on-peer execution
— (flow/cancel id) — failure handling
Phase 1 — Declarative DAG + sequential execution
lib/flow/spec.sx—defflowmacro,sequencecombinator- node = Scheme thunk; output threads to next node (data flow)
parallelcombinator (sequential semantics for now — TRUE parallelism in Phase 3)- runtime executes a flow synchronously, returns final value
lib/flow/api.sx—(flow/start name args)entry pointlib/flow/tests/basic.sx— 15+ cases: linear sequence, nested sequences, data flow between nodes, parallel-with-joinlib/flow/scoreboard.{json,md}lib/flow/conformance.sh
Phase 2 — Control flow + error handling
condcombinator — predicate selects branchretry n [backoff]— re-runs node up to n times on exceptiontimeout ms— bounds node executiontry-catch— exception handler with reified error- error model — exceptions vs explicit
(fail :reason ...)results lib/flow/tests/control.sx— 25+ cases: each combinator + composition
Phase 3 — Suspend / resume (the showcase)
(suspend reason)—call/cccaptures continuation, returns flow-id to callerlib/flow/store.sx— serialize flow state (continuation + open vars)(flow/resume id value)— load continuation, inject value, re-enter(flow/cancel id)— explicit termination- crash recovery — on restart, scan store for paused flows, mark resumable
lib/flow/tests/suspend.sx— pause-resume scenarios, cancellation, "restart" scenarios (simulated by re-loading store)
Phase 4 — Distributed nodes via fed-sx
(remote-node addr fn args)— execute node on a federation peer- failure semantics — retry on different peer, fall through to local
- persistence across instances — flow state replicates via fed-sx
- handoff — flow started here can resume on a peer if the local instance is down
lib/flow/tests/distributed.sx— federated flow scenarios (mock fed-sx in tests)
Progress log
(loop fills this in)
Blockers
(loop fills this in)