Skip to content

Commit 59213df

Browse files
committed
chore(release): bump version to 3.4.0
Programmable orchestration (AgentExecutor seam, parallel/pipeline/resumable combinators, WorkflowCheckpoint, Node + Python SDK grammar) + the #31/#32/#43 hardening since v3.3.0. Backward-compatible feature additions → minor bump. Bumps the full version-sync surface (core/sdk Cargo.toml + core-dep pins, package.json + optionalDeps, pyproject + bootstrap __version__, Cargo.lock, npm lockfiles); scripts/check_release_versions.sh passes at 3.4.0. Adds the [3.4.0] CHANGELOG entry. No source changes — prep only.
1 parent 7005557 commit 59213df

11 files changed

Lines changed: 104 additions & 31 deletions

File tree

CHANGELOG.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,79 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and 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

1083
Cluster-grade runtime: everything needed for a host platform (e.g. 书安OS)

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "a3s-code-core"
3-
version = "3.3.0"
3+
version = "3.4.0"
44
edition = "2021"
55
authors = ["A3S Lab Team"]
66
license = "MIT"

sdk/node/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "a3s-code-node"
3-
version = "3.3.0"
3+
version = "3.4.0"
44
edition = "2021"
55
authors = ["A3S Lab Team"]
66
license = "MIT"
@@ -11,7 +11,7 @@ description = "A3S Code Node.js bindings - Native addon via napi-rs"
1111
crate-type = ["cdylib"]
1212

1313
[dependencies]
14-
a3s-code-core = { version = "3.3.0", path = "../../core", features = ["ahp", "s3"] }
14+
a3s-code-core = { version = "3.4.0", path = "../../core", features = ["ahp", "s3"] }
1515
napi = { version = "2", features = ["async", "napi6", "serde-json"] }
1616
napi-derive = "2"
1717
tokio = { version = "1.35", features = ["full"] }

sdk/node/examples/package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/node/package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/node/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@a3s-lab/code",
3-
"version": "3.3.0",
3+
"version": "3.4.0",
44
"description": "A3S Code - Native Node.js bindings for the coding-agent runtime",
55
"main": "index.js",
66
"types": "index.d.ts",
@@ -43,11 +43,11 @@
4343
"test:helpers": "node test-helpers.mjs"
4444
},
4545
"optionalDependencies": {
46-
"@a3s-lab/code-darwin-arm64": "3.3.0",
47-
"@a3s-lab/code-linux-x64-gnu": "3.3.0",
48-
"@a3s-lab/code-linux-x64-musl": "3.3.0",
49-
"@a3s-lab/code-linux-arm64-gnu": "3.3.0",
50-
"@a3s-lab/code-linux-arm64-musl": "3.3.0",
51-
"@a3s-lab/code-win32-x64-msvc": "3.3.0"
46+
"@a3s-lab/code-darwin-arm64": "3.4.0",
47+
"@a3s-lab/code-linux-x64-gnu": "3.4.0",
48+
"@a3s-lab/code-linux-x64-musl": "3.4.0",
49+
"@a3s-lab/code-linux-arm64-gnu": "3.4.0",
50+
"@a3s-lab/code-linux-arm64-musl": "3.4.0",
51+
"@a3s-lab/code-win32-x64-msvc": "3.4.0"
5252
}
5353
}

sdk/python-bootstrap/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ name = "a3s-code"
77
# Keep in sync with crates/code core release. The bootstrap loader fetches
88
# the matching native wheel from `https://github.com/AI45Lab/Code/releases/tag/v<version>`
99
# at import time.
10-
version = "3.3.0"
10+
version = "3.4.0"
1111
description = "A3S Code Python SDK — pure-Python bootstrap that fetches the native wheel from GitHub Releases"
1212
readme = "README.md"
1313
license = {text = "MIT"}

sdk/python-bootstrap/src/a3s_code/_bootstrap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
# Version is the bootstrap's own version, which equals the matching native
3333
# wheel version on GH Releases. Bumped by the release workflow.
34-
__version__ = "3.3.0"
34+
__version__ = "3.4.0"
3535

3636
_DEFAULT_BASE_URL = "https://github.com/AI45Lab/Code/releases/download"
3737
_REQUEST_TIMEOUT_S = 120

sdk/python/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "a3s-code-py"
3-
version = "3.3.0"
3+
version = "3.4.0"
44
edition = "2021"
55
authors = ["A3S Lab Team"]
66
license = "MIT"
@@ -12,7 +12,7 @@ name = "a3s_code"
1212
crate-type = ["cdylib"]
1313

1414
[dependencies]
15-
a3s-code-core = { version = "3.3.0", path = "../../core", features = ["ahp", "s3"] }
15+
a3s-code-core = { version = "3.4.0", path = "../../core", features = ["ahp", "s3"] }
1616
pyo3 = "0.23"
1717
tokio = { version = "1.35", features = ["full"] }
1818
serde_json = "1.0"

0 commit comments

Comments
 (0)