Skip to content

Releases: rustakka/atomr-agents

v0.21.0

08 Jun 22:38

Choose a tag to compare

Added — Claude Agent SDK harness

Anthropic's Claude Agent SDK (claude-agent-sdk /
@anthropic-ai/claude-agent-sdk) — the programmable form of Claude Code —
wrapped as a first-class atomr-agents harness. It exposes Claude Code's full
feature set (slash commands, subagents, hooks, MCP, permission modes,
sessions, custom system prompts, built-in Read/Write/Edit/Bash/Grep/WebSearch
tools) and bills against your Anthropic API credits by driving the bundled
claude CLI. Distinct from the server-side "Managed Agents" API.

  • atomr-agents-agent-sdk-core — the contract: AgentSdkConfig mirroring
    the SDK's ClaudeAgentOptions (round-trips to a JSON dict), a normalized
    message/result/event schema, and the pluggable AgentSdkBackend /
    AgentSdkSession trait seam with a deterministic in-memory MockBackend so
    the whole surface is testable without the SDK, the claude CLI, or
    network/credits.
  • atomr-agents-agent-sdk-harness — orchestrator with a pluggable backend,
    an event broadcast, a session registry under an atomically-reserved
    concurrency quota, Anthropic-credit spend tracking via the shared
    SpendLedger, a .claude/ projection (skills / slash commands / MCP /
    settings), and a Callable impl. Behind the actor feature it exposes the
    bidirectional interactive session as an atomr_core::actor::Actor. The
    default permission_mode is bypassPermissions (max autonomy — overridable
    per request/spec).
  • atomr-agents-agent-sdk-harness-web — axum REST + SSE companion (start
    runs/sessions, post messages, interrupt, change mode/model, stream events).
  • PyO3 bridgefrom atomr_agents.agent_sdk import harness. The Rust
    PythonAgentSdkBackend drives the real claude-agent-sdk over a reverse
    async-iterator bridge (Rust drives the Python __anext__); the interactive
    session is exposed as AgentSdkSession (the actor surface). atomr @tool
    guests and Rust tools are bridged into the agent as in-process SDK MCP tools
    via create_sdk_mcp_server.
  • Per-session sandbox workspaces (Pattern C) — behind the harness sandbox
    feature, each interactive session (and each headless run) gets its own
    isolated microVM sandbox as a disposable
    workspace: the .claude/ projection is staged into it (write_file), the
    agent's exec/file is routed there via an in-process run_in_sandbox tool
    while the host Bash/Write/Edit are disabled (true containment), and the
    workspace is discarded — or snapshotted to the warm pool — on close
    (spec.workspace.{enabled,profile,backend,on_close,reuse_warm}). One
    SandboxClient is shared between the Rust harness and the Python tool so both
    resolve the workspace from a single registry; SandboxClient.attach(id)
    binds the tool. See Pattern C in docs/agent-sdk-harness.md.
  • Host loader<root>/agent-sdk/<id>/ (harness.yaml + commands/ +
    skills/ + mcp/) → AgentSdkHarnessSpec + .claude projection, reusing
    the host's on-disk conventions.
  • Umbrella — new agent-sdk feature.
  • Packagingpip install atomr-agents[agent-sdk] pulls the SDK (which
    auto-bundles the claude CLI); the native extension imports it lazily.

Added — MicroVM sandbox capability (local + dev tiers)

Secure, instant-boot compute environments for executing untrusted agent
code (Python / Bash / JavaScript / Rust), per the Agentic MicroVM
Sandboxes
PRD. This wave lands the backend-agnostic foundation plus the
locally-runnable tiers; the Firecracker/KVM backend and the Tier-3 gRPC
cluster are the documented next milestones.

  • atomr-agents-sandbox-coreSandboxBackend / SandboxHandle
    traits, profile / budget / request types (with the security-relevant
    Rust 2 GB / 2 vCPU floor), SandboxEvent stream, and a deterministic
    in-memory MockBackend so the whole surface is testable without Docker
    or KVM.
  • atomr-agents-sandbox-harness — orchestrator with a pluggable
    backend, a sandbox registry under an atomically-reserved concurrency
    quota, a best-fit bin-packing scheduler, a warm snapshot pool, lifecycle
    event broadcast, and a Callable impl. The Rust budget floor is enforced
    structurally at the harness boundary.
  • atomr-agents-sandbox-tool — the execute_in_sandbox Tool.
  • atomr-agents-sandbox-backend-docker — bollard-backed "insecure dev
    mode" backend (real exec, tar file I/O, commit-based snapshot/fork).
    Containers share the host kernel, so this is explicitly not an isolation
    boundary for untrusted code.
  • atomr-agents-sandbox-harness-web — axum REST + SSE companion.
  • atomr-agents-sandbox-proto — host↔guest wire protocol
    (length-prefixed postcard frames over AF_VSOCK).
  • atomr-agents-sandbox-guest-agent — the in-VM PID-1 guest daemon.
  • PyO3 bindingsfrom atomr_agents.sandbox import SandboxClient, SandboxConfig, SandboxProfile.
  • Umbrella — new sandbox feature.

Changed — Coding-CLI vendor: Gemini CLI → Antigravity CLI (agy)

Google is transitioning the Gemini CLI into the Antigravity CLI; the
legacy gemini CLI stops serving requests on 2026-06-18. The
coding-cli-vendor-gemini crate is renamed to
atomr-agents-coding-cli-vendor-antigravity and now targets the
agy binary. Unlike the old Gemini CLI, Antigravity serves non-Gemini
models (Claude, etc.) selectable via the model flag.

  • GeminiVendorAntigravityVendor; GeminiParser
    AntigravityParser; materialize_gemini_config
    materialize_antigravity_config.
  • New AntigravityConfig makes the binary name, headless flags, and the
    on-disk config directory (default .antigravity/) configurable — so
    operators can reconcile them with agy's real interface without a code
    change.
  • Harness Cargo feature vendor-geminivendor-antigravity.
  • Default Docker image gemini.Dockerfileantigravity.Dockerfile
    (installs agy via the official install.sh).
  • Breaking: CliVendorKind::GeminiCliVendorKind::Antigravity;
    the serde wire value changes from "gemini" to "antigravity", so
    persisted CliRequest JSON with vendor: "gemini" no longer
    deserializes.

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from `Arc<dyn Scor...
Read more

v0.20.0

08 Jun 20:35

Choose a tag to compare

Added — Claude Agent SDK harness

Anthropic's Claude Agent SDK (claude-agent-sdk /
@anthropic-ai/claude-agent-sdk) — the programmable form of Claude Code —
wrapped as a first-class atomr-agents harness. It exposes Claude Code's full
feature set (slash commands, subagents, hooks, MCP, permission modes,
sessions, custom system prompts, built-in Read/Write/Edit/Bash/Grep/WebSearch
tools) and bills against your Anthropic API credits by driving the bundled
claude CLI. Distinct from the server-side "Managed Agents" API.

  • atomr-agents-agent-sdk-core — the contract: AgentSdkConfig mirroring
    the SDK's ClaudeAgentOptions (round-trips to a JSON dict), a normalized
    message/result/event schema, and the pluggable AgentSdkBackend /
    AgentSdkSession trait seam with a deterministic in-memory MockBackend so
    the whole surface is testable without the SDK, the claude CLI, or
    network/credits.
  • atomr-agents-agent-sdk-harness — orchestrator with a pluggable backend,
    an event broadcast, a session registry under an atomically-reserved
    concurrency quota, Anthropic-credit spend tracking via the shared
    SpendLedger, a .claude/ projection (skills / slash commands / MCP /
    settings), and a Callable impl. Behind the actor feature it exposes the
    bidirectional interactive session as an atomr_core::actor::Actor. The
    default permission_mode is bypassPermissions (max autonomy — overridable
    per request/spec).
  • atomr-agents-agent-sdk-harness-web — axum REST + SSE companion (start
    runs/sessions, post messages, interrupt, change mode/model, stream events).
  • PyO3 bridgefrom atomr_agents.agent_sdk import harness. The Rust
    PythonAgentSdkBackend drives the real claude-agent-sdk over a reverse
    async-iterator bridge (Rust drives the Python __anext__); the interactive
    session is exposed as AgentSdkSession (the actor surface). atomr @tool
    guests and Rust tools are bridged into the agent as in-process SDK MCP tools
    via create_sdk_mcp_server.
  • Host loader<root>/agent-sdk/<id>/ (harness.yaml + commands/ +
    skills/ + mcp/) → AgentSdkHarnessSpec + .claude projection, reusing
    the host's on-disk conventions.
  • Umbrella — new agent-sdk feature.
  • Packagingpip install atomr-agents[agent-sdk] pulls the SDK (which
    auto-bundles the claude CLI); the native extension imports it lazily.

Added — MicroVM sandbox capability (local + dev tiers)

Secure, instant-boot compute environments for executing untrusted agent
code (Python / Bash / JavaScript / Rust), per the Agentic MicroVM
Sandboxes
PRD. This wave lands the backend-agnostic foundation plus the
locally-runnable tiers; the Firecracker/KVM backend and the Tier-3 gRPC
cluster are the documented next milestones.

  • atomr-agents-sandbox-coreSandboxBackend / SandboxHandle
    traits, profile / budget / request types (with the security-relevant
    Rust 2 GB / 2 vCPU floor), SandboxEvent stream, and a deterministic
    in-memory MockBackend so the whole surface is testable without Docker
    or KVM.
  • atomr-agents-sandbox-harness — orchestrator with a pluggable
    backend, a sandbox registry under an atomically-reserved concurrency
    quota, a best-fit bin-packing scheduler, a warm snapshot pool, lifecycle
    event broadcast, and a Callable impl. The Rust budget floor is enforced
    structurally at the harness boundary.
  • atomr-agents-sandbox-tool — the execute_in_sandbox Tool.
  • atomr-agents-sandbox-backend-docker — bollard-backed "insecure dev
    mode" backend (real exec, tar file I/O, commit-based snapshot/fork).
    Containers share the host kernel, so this is explicitly not an isolation
    boundary for untrusted code.
  • atomr-agents-sandbox-harness-web — axum REST + SSE companion.
  • atomr-agents-sandbox-proto — host↔guest wire protocol
    (length-prefixed postcard frames over AF_VSOCK).
  • atomr-agents-sandbox-guest-agent — the in-VM PID-1 guest daemon.
  • PyO3 bindingsfrom atomr_agents.sandbox import SandboxClient, SandboxConfig, SandboxProfile.
  • Umbrella — new sandbox feature.

Changed — Coding-CLI vendor: Gemini CLI → Antigravity CLI (agy)

Google is transitioning the Gemini CLI into the Antigravity CLI; the
legacy gemini CLI stops serving requests on 2026-06-18. The
coding-cli-vendor-gemini crate is renamed to
atomr-agents-coding-cli-vendor-antigravity and now targets the
agy binary. Unlike the old Gemini CLI, Antigravity serves non-Gemini
models (Claude, etc.) selectable via the model flag.

  • GeminiVendorAntigravityVendor; GeminiParser
    AntigravityParser; materialize_gemini_config
    materialize_antigravity_config.
  • New AntigravityConfig makes the binary name, headless flags, and the
    on-disk config directory (default .antigravity/) configurable — so
    operators can reconcile them with agy's real interface without a code
    change.
  • Harness Cargo feature vendor-geminivendor-antigravity.
  • Default Docker image gemini.Dockerfileantigravity.Dockerfile
    (installs agy via the official install.sh).
  • Breaking: CliVendorKind::GeminiCliVendorKind::Antigravity;
    the serde wire value changes from "gemini" to "antigravity", so
    persisted CliRequest JSON with vendor: "gemini" no longer
    deserializes.

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-han...
Read more

v0.19.0

08 Jun 05:28

Choose a tag to compare

Added — MicroVM sandbox capability (local + dev tiers)

Secure, instant-boot compute environments for executing untrusted agent
code (Python / Bash / JavaScript / Rust), per the Agentic MicroVM
Sandboxes
PRD. This wave lands the backend-agnostic foundation plus the
locally-runnable tiers; the Firecracker/KVM backend and the Tier-3 gRPC
cluster are the documented next milestones.

  • atomr-agents-sandbox-coreSandboxBackend / SandboxHandle
    traits, profile / budget / request types (with the security-relevant
    Rust 2 GB / 2 vCPU floor), SandboxEvent stream, and a deterministic
    in-memory MockBackend so the whole surface is testable without Docker
    or KVM.
  • atomr-agents-sandbox-harness — orchestrator with a pluggable
    backend, a sandbox registry under an atomically-reserved concurrency
    quota, a best-fit bin-packing scheduler, a warm snapshot pool, lifecycle
    event broadcast, and a Callable impl. The Rust budget floor is enforced
    structurally at the harness boundary.
  • atomr-agents-sandbox-tool — the execute_in_sandbox Tool.
  • atomr-agents-sandbox-backend-docker — bollard-backed "insecure dev
    mode" backend (real exec, tar file I/O, commit-based snapshot/fork).
    Containers share the host kernel, so this is explicitly not an isolation
    boundary for untrusted code.
  • atomr-agents-sandbox-harness-web — axum REST + SSE companion.
  • atomr-agents-sandbox-proto — host↔guest wire protocol
    (length-prefixed postcard frames over AF_VSOCK).
  • atomr-agents-sandbox-guest-agent — the in-VM PID-1 guest daemon.
  • PyO3 bindingsfrom atomr_agents.sandbox import SandboxClient, SandboxConfig, SandboxProfile.
  • Umbrella — new sandbox feature.

Changed — Coding-CLI vendor: Gemini CLI → Antigravity CLI (agy)

Google is transitioning the Gemini CLI into the Antigravity CLI; the
legacy gemini CLI stops serving requests on 2026-06-18. The
coding-cli-vendor-gemini crate is renamed to
atomr-agents-coding-cli-vendor-antigravity and now targets the
agy binary. Unlike the old Gemini CLI, Antigravity serves non-Gemini
models (Claude, etc.) selectable via the model flag.

  • GeminiVendorAntigravityVendor; GeminiParser
    AntigravityParser; materialize_gemini_config
    materialize_antigravity_config.
  • New AntigravityConfig makes the binary name, headless flags, and the
    on-disk config directory (default .antigravity/) configurable — so
    operators can reconcile them with agy's real interface without a code
    change.
  • Harness Cargo feature vendor-geminivendor-antigravity.
  • Default Docker image gemini.Dockerfileantigravity.Dockerfile
    (installs agy via the official install.sh).
  • Breaking: CliVendorKind::GeminiCliVendorKind::Antigravity;
    the serde wire value changes from "gemini" to "antigravity", so
    persisted CliRequest JSON with vendor: "gemini" no longer
    deserializes.

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.

v0.18.0

30 May 00:23

Choose a tag to compare

Changed — Coding-CLI vendor: Gemini CLI → Antigravity CLI (agy)

Google is transitioning the Gemini CLI into the Antigravity CLI; the
legacy gemini CLI stops serving requests on 2026-06-18. The
coding-cli-vendor-gemini crate is renamed to
atomr-agents-coding-cli-vendor-antigravity and now targets the
agy binary. Unlike the old Gemini CLI, Antigravity serves non-Gemini
models (Claude, etc.) selectable via the model flag.

  • GeminiVendorAntigravityVendor; GeminiParser
    AntigravityParser; materialize_gemini_config
    materialize_antigravity_config.
  • New AntigravityConfig makes the binary name, headless flags, and the
    on-disk config directory (default .antigravity/) configurable — so
    operators can reconcile them with agy's real interface without a code
    change.
  • Harness Cargo feature vendor-geminivendor-antigravity.
  • Default Docker image gemini.Dockerfileantigravity.Dockerfile
    (installs agy via the official install.sh).
  • Breaking: CliVendorKind::GeminiCliVendorKind::Antigravity;
    the serde wire value changes from "gemini" to "antigravity", so
    persisted CliRequest JSON with vendor: "gemini" no longer
    deserializes.

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.

v0.17.0

20 May 05:10

Choose a tag to compare

Changed — Coding-CLI vendor: Gemini CLI → Antigravity CLI (agy)

Google is transitioning the Gemini CLI into the Antigravity CLI; the
legacy gemini CLI stops serving requests on 2026-06-18. The
coding-cli-vendor-gemini crate is renamed to
atomr-agents-coding-cli-vendor-antigravity and now targets the
agy binary. Unlike the old Gemini CLI, Antigravity serves non-Gemini
models (Claude, etc.) selectable via the model flag.

  • GeminiVendorAntigravityVendor; GeminiParser
    AntigravityParser; materialize_gemini_config
    materialize_antigravity_config.
  • New AntigravityConfig makes the binary name, headless flags, and the
    on-disk config directory (default .antigravity/) configurable — so
    operators can reconcile them with agy's real interface without a code
    change.
  • Harness Cargo feature vendor-geminivendor-antigravity.
  • Default Docker image gemini.Dockerfileantigravity.Dockerfile
    (installs agy via the official install.sh).
  • Breaking: CliVendorKind::GeminiCliVendorKind::Antigravity;
    the serde wire value changes from "gemini" to "antigravity", so
    persisted CliRequest JSON with vendor: "gemini" no longer
    deserializes.

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.

v0.16.3

20 May 00:08

Choose a tag to compare

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.

v0.16.2

19 May 21:25

Choose a tag to compare

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.

v0.13.0

15 May 22:12

Choose a tag to compare

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.

v0.12.0

15 May 16:33

Choose a tag to compare

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.

v0.11.0

15 May 05:29

Choose a tag to compare

Added — Meetings harness: structured extraction from diarized transcripts

A downstream harness that turns a diarized SttConversation into a
structured MeetingAnalysis — attendee roster, linear append-only
notes/actions ledgers, and a tiered dynamic summary stack. See
docs/meetings-harness.md.

  • crates/meetings-harness — the harness core: typed +
    Boxed* split mirroring stt-harness; RuleBasedExtractor
    default that is deterministic and LLM-free; pluggable
    MeetingExtractor trait for LLM-driven implementations;
    MeetingsToolSet of Tool impls (list_turns, upsert_attendee,
    append_note, append_action, update_action, revise_tail_segment,
    finalize_segment, regenerate_running, set_title, finalize).
    BatchExtractionLoop and StreamingExtractionLoop — the latter
    subscribes to an STT harness's broadcast and maintains an append-only
    ledger with a revisable in-flight tail segment summary. Persistence
    via MeetingsStore and (feature state) CheckpointerMeetingsStore,
    filed under the same conversation_id as the source transcript.
  • crates/meetings-harness-web — an optional axum backend plus an
    embedded React + Vite SPA (port 7100) for reviewing and editing
    analyses: REST CRUD, attendee rename, action patch, run trigger / stop,
    WebSocket live feed of MeetingsHarnessEvents, SPA fallback.
  • atomr-agents meetings — new CLI subcommand. meetings analyze --conversation-id <id> --model <model_id> runs the harness against
    an existing transcript; meetings serve boots the web UI. Gated by
    --features meetings / --features meetings-web.

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.