@@ -10,16 +10,28 @@ its exit criteria.
1010- ✅ ** A0–A3 landed** : workflow model + validation; the compiler/engine
1111 (` engine::run ` lowers onto tinyagents, per-run build, merge reducer, item-based
1212 ` {run, nodes:{id:{items}}} ` state); native control-flow nodes (condition,
13- switch, merge, split_out, transform) with conditional routing; and all
14- capability-backed nodes (agent, tool_call, http_request, code, output_parser,
15- sub_workflow) running against mock capabilities. A minimal ` = ` -expression module
16- (` crate::expr ` , dotted-path) covers the interim; full ` jq ` /` jaq ` -style
17- expressions are still deferred (O1).
18- - 🟡 ** A4 partial** : per-node error handling (` on_error ` stop/continue/route +
19- ` retry ` + ` error ` port) and ` tracing ` -based observability are done; HITL
20- interrupt/resume, retry backoff timing, and durable checkpointing are still
21- pending.
22- - ⬜ A5 and B0–B5 pending.
13+ switch, merge, split_out, transform) with conditional routing — including real
14+ ** parallel fan-out** (multiple same-port successors run concurrently) and a
15+ ** merge fan-in barrier** (a waiting-edge join); and all capability-backed nodes
16+ (agent, tool_call, http_request, code, output_parser, sub_workflow) running
17+ against mock capabilities, with opaque ` connection_ref ` threaded through the
18+ LLM/tool/HTTP traits. A minimal ` = ` -expression module (` crate::expr ` ,
19+ dotted-path) covers the interim; full ` jq ` /` jaq ` -style expressions are still
20+ deferred (O1).
21+ - ✅ ** A4 essentially done** : per-node error handling (` on_error `
22+ stop/continue/route + ` retry ` + ` error ` port); observability (` tracing `
23+ events plus the ` Run ` /` ExecutionStep ` record model and the ` RunObserver ` hook,
24+ ` src/observability.rs ` , driven via ` engine::run_with_observer ` ); and HITL —
25+ nodes with ` requires_approval ` pause (` RunOutcome::pending_approvals ` ) via a
26+ native tinyagents interrupt + ` InMemoryCheckpointer ` , and ` engine::resume `
27+ completes the approve-and-continue loop. Load-time versioning/migration
28+ (` schema_version ` + per-node ` type_version ` , ` crate::migrate ` ) also landed.
29+ Remaining polish: retry ** backoff timing** (retries are bounded but don't
30+ sleep — runtime-agnostic), per-node ** timeouts** , and durable
31+ ** checkpointed super-step replay** for resume.
32+ - 🟡 ** A5** : publish-ready (` cargo publish --dry-run ` clean) but not yet
33+ published.
34+ - ⬜ B0–B5 (OpenHuman host integration) not started.
2335
2436The public runtime works end-to-end against mock capabilities, guarded by the
2537reference-workflow e2e suite (` tests/reference_workflows.rs ` , feature ` mock ` ).
@@ -48,9 +60,12 @@ reference-workflow e2e suite (`tests/reference_workflows.rs`, feature `mock`).
4860 wire the expression library (` jaq ` or ` minijinja ` ).
4961- ** Exit:** branch/switch/merge/parallel/split/loop covered by unit tests.
5062- ** Landed:** all five control-flow nodes plus conditional routing in the engine
51- (branch nodes route by chosen port). The expression side ships as a ** minimal
52- interim** ` = ` -module (` crate::expr ` , dotted-path); full ` jq ` /` jaq ` -style
53- expressions remain deferred (O1).
63+ (branch nodes route by chosen port), including real ** parallel fan-out** (a node
64+ with multiple same-port successors runs them concurrently via ` Command::goto ` +
65+ ` with_parallel ` ) and a ** merge fan-in barrier** (a real waiting-edge join,
66+ ` add_waiting_edge ` ). The expression side ships as a ** minimal interim**
67+ ` = ` -module (` crate::expr ` , dotted-path); full ` jq ` /` jaq ` -style expressions
68+ remain deferred (O1).
5469
5570### A3 — Capability-backed nodes ✅ (landed)
5671- Implement ` agent ` (with chat_model/memory/tool/output_parser sub-ports),
@@ -60,19 +75,28 @@ reference-workflow e2e suite (`tests/reference_workflows.rs`, feature `mock`).
6075- ** Landed:** every capability-backed node calls its ` caps ` trait and is
6176 exercised against the mocks by the reference-workflow e2e suite.
6277
63- ### A4 — Durability, HITL, observability 🟡 (partial )
78+ ### A4 — Durability, HITL, observability ✅ (essentially done )
6479- Wire tinyagents checkpointing; mid-run ` Interrupt ` /` resume ` approval steps;
6580 per-node retry/backoff + timeout; tracing spans.
6681- ** Exit:** a workflow pauses for approval and resumes; a failing node retries.
6782- ** Landed:** per-node error handling (` on_error ` stop/continue/route + ` retry `
68- + ` error ` port) and ` tracing ` -based observability (spans/events).
69- - ** Pending:** HITL interrupt/resume, retry backoff timing, and durable
70- checkpointing.
71-
72- ### A5 — Docs, e2e, publish ⬜ (pending)
83+ + ` error ` port); observability — ` tracing ` events ** plus** the
84+ ` Run ` /` ExecutionStep ` record model and the ` RunObserver ` hook
85+ (` src/observability.rs ` ), surfaced through ` engine::run_with_observer ` ; and
86+ HITL — nodes with ` requires_approval ` pause (` RunOutcome::pending_approvals ` )
87+ via a native tinyagents interrupt + ` InMemoryCheckpointer ` , with
88+ ` engine::resume ` completing the approve-and-continue loop.
89+ - ** Remaining polish:** retry ** backoff timing** (retries are bounded but don't
90+ sleep — runtime-agnostic), per-node ** timeouts** , and durable ** checkpointed
91+ super-step replay** for resume (the checkpointer is wired, but resume currently
92+ re-runs with the approval; replay-resume is a future optimization).
93+
94+ ### A5 — Docs, e2e, publish 🟡 (publish-ready)
7395- Finalize docs + ` e2e/ ` reference scenarios + examples; ** ` cargo publish ` to
7496 crates.io** (semver + ` release.yml ` publish-on-tag).
7597- ** Exit:** ` tinyflows = "x.y" ` is installable; CI green on a tagged release.
98+ - ** Status:** publish-ready — ` cargo publish --dry-run ` is clean — but not yet
99+ published to crates.io.
76100
77101## Phase B — OpenHuman integration
78102
0 commit comments