v0.17.0
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.
GeminiVendor→AntigravityVendor;GeminiParser→
AntigravityParser;materialize_gemini_config→
materialize_antigravity_config.- New
AntigravityConfigmakes the binary name, headless flags, and the
on-disk config directory (default.antigravity/) configurable — so
operators can reconcile them withagy's real interface without a code
change. - Harness Cargo feature
vendor-gemini→vendor-antigravity. - Default Docker image
gemini.Dockerfile→antigravity.Dockerfile
(installsagyvia the officialinstall.sh). - Breaking:
CliVendorKind::Gemini→CliVendorKind::Antigravity;
the serde wire value changes from"gemini"to"antigravity", so
persistedCliRequestJSON withvendor: "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 mirroringstt-harness;RuleBasedExtractor
default that is deterministic and LLM-free; pluggable
MeetingExtractortrait for LLM-driven implementations;
MeetingsToolSetofToolimpls (list_turns,upsert_attendee,
append_note,append_action,update_action,revise_tail_segment,
finalize_segment,regenerate_running,set_title,finalize).
BatchExtractionLoopandStreamingExtractionLoop— the latter
subscribes to an STT harness's broadcast and maintains an append-only
ledger with a revisable in-flight tail segment summary. Persistence
viaMeetingsStoreand (featurestate)CheckpointerMeetingsStore,
filed under the sameconversation_idas 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 ofMeetingsHarnessEvents, SPA fallback.atomr-agents meetings— new CLI subcommand.meetings analyze --conversation-id <id> --model <model_id>runs the harness against
an existing transcript;meetings serveboots 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 aConversationStore
with aCheckpointer-backed implementation (statefeature).
BoxedSttHarnessmirrors the Agent/Harness boxed-handle pattern.crates/stt-harness-web— an optional axum backend plus an
embedded React SPA (embed-uifeature, viarust-embed) for
reviewing and editing diarized conversations: REST routes, a
WebSocket live feed, and the SPA fallback handler.atomr-agents servenow runs the real review UI when the CLI is
built with--features stt-web, persisting conversations through the
configuredcrates/statecheckpointer.xtask stt-web-build— builds the React SPA intoui/distso
stt-harness-webcan be compiled with--features embed-ui.- Python bindings —
atomr_agents.stt_harnesswraps the harness;
the top-level facade now resolves native names defensively so a name
not yet bound on the Rust side degrades toNoneinstead 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:
AsyncScorertrait (crates/eval/src/scorer.rs). Parallel to
the existing syncScorer; blanketimpl<S: Scorer> AsyncScorer for Skeeps existing sync impls compatible.LlmJudgeScorer,
RubricScorer, andPairwiseScorernow implementAsyncScorer
directly — dropping thetokio::task::block_in_placeworkaround
the syncScorerimpl required.EvalSuite::scorerfield type
changed fromArc<dyn Scorer>toArc<dyn AsyncScorer>.- 6 Python→Rust guest adapters (
crates/py-bindings/src/guest/).
The single-fileguest.rs(331 LOC) is split into aguest/
directory (10 files, ~1400 LOC). New adapters:PyInstructionAdapter,
PyMemoryStrategyAdapter,PySkillStrategyAdapter,PyPersonaAdapter,
PyMemoryStoreAdapter,PyEmbedderAdapter. Each ships a
build_guest_*factory mirroring the existingbuild_guest_toolset
pattern. BoxedAgent+AgentSpec::into_agent(crates/agent/src/boxed.rs).
Object-erasedBoxedAgentfor config-driven instantiation. The typed
Agent<I,T,Ms,Sk>keeps hot-path monomorphization; both share a
pub(crate) async fn run_turn_implhelper.HarnessDispatch+HarnessRef+BoxedHarness(crates/harness/).
Mirror of the Agent boxed-handle pattern.Harness::into_boxed,
HarnessSpec::into_harness, andimpl HarnessDispatch for Harness<L,T>
added.PyAgent,PyHarness,PyWorkflowRunnerPython wrappers with
from_spec/from_dictconstructors and asyncrun_turn/run
exposed as Python coroutines via
pyo3_async_runtimes::tokio::future_into_py.WorkflowRunner::new
was added as a public constructor.
Changed
EvalSuite::scorerfield type:Arc<dyn Scorer>→
Arc<dyn AsyncScorer>. The blanketimpl<S: Scorer> AsyncScorer for Smeans callers holding a syncArc::new(SomeSyncScorer)
continue to compile via auto-unsizing into the new field type.
Direct&dyn Scorercallers ofLlmJudgeScorer/RubricScorer
must migrate to&dyn AsyncScorer— Rust coherence forbids both
the blanketAsyncScorerimpl and a directScorerimpl on the
same judge (ContainsScoreris unaffected).- Sibling deps (
atomr,atomr-infer,atomr-accel) consume
crates.io artifacts only — nopath = "../sibling/..."links.
Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.