Skip to content

Commit fa9f22b

Browse files
committed
Refresh roadmap and feature matrix for completed Phase-A runtime
Mark A4 (error handling, observability incl. RunObserver, HITL pause+resume), parallel fan-out + merge barrier, connection_ref, and versioning/migration as implemented; keep genuinely-open items (full jaq, retry backoff, timeouts, checkpointed replay, Phase B) accurate.
1 parent f66bb37 commit fa9f22b

2 files changed

Lines changed: 51 additions & 27 deletions

File tree

docs/08-roadmap.md

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2436
The public runtime works end-to-end against mock capabilities, guarded by the
2537
reference-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

docs/19-feature-matrix.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ A capability checklist for tinyflows, with the stage each feature lands (see the
1616
| Linear sequences | ✅ A1 |
1717
| IF (condition, true/false) | ✅ A2 |
1818
| Multi-way switch | ✅ A2 |
19-
| Merge / fan-in (named inputs, barrier) | ✅ A2 |
20-
| Parallel branches | 🟡 A2 (fan-out pending) |
19+
| Merge / fan-in (named inputs, barrier) | ✅ A2 (waiting-edge join) |
20+
| Parallel branches (fan-out) | A2 (concurrent same-port successors) |
2121
| Split-out / per-item fan-out | ✅ A2 |
2222
| Loops (bounded) | 🟡 A2 (`RecursionPolicy`) |
2323
| Sub-workflow (nested graph) | ✅ A3 |
@@ -44,17 +44,17 @@ A capability checklist for tinyflows, with the stage each feature lands (see the
4444
| Per-node error policy (stop/continue/route) + error port | ✅ A4 ([error handling](14-error-handling.md)) |
4545
| Retries with backoff | 🟡 A4 (retry ✅, backoff timing pending) |
4646
| Per-node / per-run timeouts | 🟡 A4 |
47-
| Human-in-the-loop approval (interrupt/resume) | 🟡 A4 |
48-
| Durable checkpointing / resume | 🟡 A4 |
47+
| Human-in-the-loop approval (interrupt/resume) | A4 (`requires_approval` pause + `engine::resume`) |
48+
| Durable checkpointing / resume | 🟡 A4 (checkpointer wired; replay-resume pending) |
4949
| Sandboxed code + network gating + curated tools | 🟡 A3/B (host) ([security](07-security.md)) |
5050
| Trust boundary (definition authorizes, payload untrusted) | 🟡 B2 |
5151

5252
## Connections & observability
5353
| Feature | Status |
5454
|---------|--------|
55-
| Opaque `connection_ref` (secrets host-side) | 🟡 A3 ([credentials](15-credentials-and-connections.md)) |
56-
| Run / execution-step record + inspect data | 🟡 A4 ([observability](16-observability-and-runs.md)) |
57-
| Tracing spans + `RunObserver` hook | ✅ A4 (tracing spans/events; `RunObserver` hook pending) |
55+
| Opaque `connection_ref` (secrets host-side) | A3 ([credentials](15-credentials-and-connections.md)) |
56+
| Run / execution-step record + inspect data | A4 ([observability](16-observability-and-runs.md)) |
57+
| Tracing spans + `RunObserver` hook | ✅ A4 (tracing events + `Run`/`ExecutionStep` record & `RunObserver` hook) |
5858

5959
## Authoring & lifecycle
6060
| Feature | Status |
@@ -63,7 +63,7 @@ A capability checklist for tinyflows, with the stage each feature lands (see the
6363
| Agent-first chat authoring | 🟡 B4 (host) |
6464
| Starter templates | 🟡 B4 (host) |
6565
| Enable / disable, run history UI | 🟡 B1/B5 (host) |
66-
| Schema + node `type_version` migrations | 🟡 A1 ([versioning](18-versioning-and-migration.md)) |
66+
| Schema + node `type_version` migrations | A1 (`crate::migrate` load-time upgrade) ([versioning](18-versioning-and-migration.md)) |
6767
| Import / export JSON | 🟡 A1 (format is the contract) |
6868

6969
## Distribution

0 commit comments

Comments
 (0)