@@ -5,6 +5,79 @@ All notable changes to this project will be documented in this file.
55The format is based on [ Keep a Changelog] ( https://keepachangelog.com/en/1.0.0/ ) ,
66and this project adheres to [ Semantic Versioning] ( https://semver.org/spec/v2.0.0.html ) .
77
8+ ## [ 3.4.0] - 2026-05-30
9+
10+ Programmable, deterministic multi-agent orchestration — a grammar for
11+ expressing fan-out, pipelines, and resumable workflows in code (not only via
12+ model-driven delegation), drawn along the framework / host (书安OS) boundary:
13+ the framework owns the grammar + serializable contracts; the host owns
14+ placement, transport, and scheduling. All additions are backward compatible
15+ (new types/methods, new optional fields, new ` SessionStore ` methods with
16+ default no-op impls).
17+
18+ ### Added
19+
20+ - ** ` AgentExecutor ` seam** (` orchestration ` module) — the boundary between the
21+ orchestration grammar and the host's placement/transport/scheduling. The
22+ in-box ` TaskExecutor ` runs each step as a child agent locally; a host
23+ substitutes its own executor to place steps across a cluster.
24+ ` concurrency_hint() ` is advisory, not a hard local bound, so orchestration
25+ scales past a single process. ` AgentSession::agent_executor() ` /
26+ ` session_store() ` expose a session-backed executor + its store.
27+ - ** Serializable step contracts** — ` AgentStepSpec ` (` task_id ` / ` agent ` /
28+ ` description ` / ` prompt ` / ` max_steps? ` / ` parent_session_id? ` /
29+ ` output_schema? ` ) and ` StepOutcome ` (` + structured? ` ), serializable for
30+ cross-node transport and checkpoints.
31+ - ** Combinators** —
32+ - ` execute_steps_parallel ` — barrier fan-out, input-order preserving,
33+ per-branch panic isolation, bounded by the executor's concurrency hint.
34+ - ` execute_pipeline ` — per-item chains through stages with ** no inter-stage
35+ barrier** (item A can be in stage 3 while item B is still in stage 1);
36+ stages are pure spec-builders that branch on the prior outcome.
37+ - ` execute_steps_parallel_resumable ` — journals completed steps to a
38+ ` SessionStore ` at each step boundary; on resume it skips completed steps
39+ and re-dispatches the rest. Records only successful steps (a failed step
40+ retries on resume). The checkpoint is serializable, so a host can resume an
41+ interrupted workflow on a * different* node.
42+ - ** Schema-forced step output** — a step carrying ` output_schema ` returns a
43+ schema-validated object in ` StepOutcome.structured ` (reuses the
44+ structured-output coercion + repair). A coercion failure demotes the step to
45+ unsuccessful, so callers never treat unvalidated text as the promised object.
46+ - ** ` WorkflowCheckpoint ` ** (` schema_version ` / ` workflow_id ` / ` steps ` /
47+ ` checkpoint_ms ` ) + ` SessionStore::{save,load,delete}_workflow_checkpoint `
48+ (default no-ops; the file store writes crash-atomically). Loads from a
49+ future, incompatible schema version are rejected.
50+ - ** SDK grammar (Node + Python)** — ` session.parallel(specs) ` ,
51+ ` session.pipeline(items, stages) ` , `session.parallelResumable(specs,
52+ workflowId)` (Node, camelCase) / ` parallel` / ` pipeline` /
53+ ` parallel_resumable ` (Python, snake_case). Pipeline stages are JS/Python
54+ callbacks ` (ctx) -> spec | null ` ; the bridges fail closed — a hung,
55+ null-returning, or raising stage stops only its own chain. (A Node stage
56+ callback must not throw — return ` null ` on error, same constraint as
57+ ` setBudgetGuard ` .)
58+ - ** ` LoopCheckpoint::ensure_loadable() ` ** — loads from a future, incompatible
59+ loop-checkpoint schema version are now rejected at the store layer (both
60+ file and memory), honoring the documented contract.
61+
62+ ### Changed
63+
64+ - The resumable combinator now distinguishes "no checkpoint" from an
65+ * unreadable* one: an unreadable (e.g. future-version) checkpoint logs a
66+ warning and re-runs the workflow from scratch rather than silently swallowing
67+ the error.
68+ - Documented the FFI panic-safety contract in each SDK's module doc (napi 2.x
69+ does not catch panics in sync ` #[napi] ` bodies by default; PyO3 0.23 catches
70+ ` #[pyfunction] ` / ` #[pymethods] ` bodies). No code change — both boundaries
71+ were audited panic-safe.
72+
73+ ### Tests
74+
75+ - Persisted-schema round-trip fuzz extended to the new migratable types
76+ (` AgentStepSpec ` , ` StepOutcome ` , ` WorkflowCheckpoint ` ) — round-trip stability
77+ + forward/backward compat. Comprehensive unit ** and** real-LLM integration
78+ tests for the orchestration layer (parallel fan-out, multi-item pipeline, the
79+ resume path, nested-schema coercion) run against ` .a3s/config.acl ` .
80+
881## [ 3.3.0] - 2026-05-29
982
1083Cluster-grade runtime: everything needed for a host platform (e.g. 书安OS)
0 commit comments