v0.9.0
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.