Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueComment |
When a node in the graph fails to produce output, the step function now returns an error instead of panicking. This ensures that execution failures are properly propagated to the caller rather than causing an unrecoverable crash. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Added a new documentation file that lists known gaps and limitations in the current SDK, providing developers with clear guidance on unsupported features and workarounds. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
… language module Add a new reference document that describes the syntax and usage of the expressive language module, providing users with a clear guide to its features and capabilities. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node in the graph execution returns no output, the step function now correctly handles this case instead of panicking or producing undefined behavior. This ensures robustness when nodes are optional or conditionally executed. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Revised the expressive language reference documentation to improve readability and ensure terminology is more precise, making the module easier to understand for new users. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a tool call has no arguments, the agent loop now passes an empty JSON object instead of failing to parse the missing field, preventing a crash during execution. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node in the graph fails to produce output, the step function now returns an error instead of panicking. This ensures that execution failures are properly propagated to the caller rather than causing an unrecoverable crash. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the implementation status document to reflect the current state of the expressive language module, marking completed features and noting remaining work. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
…ror handling Added documentation for previously undocumented SDK gaps related to authentication token refresh and error response parsing, ensuring the gap list is comprehensive for developers evaluating the SDK. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node in the graph returns no output, the step function now correctly handles the absence of a result instead of panicking or producing undefined behavior. This ensures robust execution of graphs where nodes may conditionally skip producing data. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
…ror handling Added documentation for two previously undocumented SDK gaps related to authentication token refresh and inconsistent error response formats, ensuring the gap tracking document remains comprehensive and up to date. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Documents a previously unrecorded limitation in the SDK where batch processing operations are not supported, ensuring the gap list remains comprehensive for developers evaluating the SDK's capabilities. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Documents a previously unlisted gap in the SDK related to batch processing support, ensuring the documentation accurately reflects current limitations. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
…ror handling Document two previously unrecorded gaps in the SDK: the lack of built-in token refresh for expired credentials and the absence of structured error responses for API failures. These entries ensure the gap tracker accurately reflects current limitations for the next release planning. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add documentation for the harness store module, covering its purpose, configuration options, and usage examples to help users understand how to interact with the storage layer in test harnesses. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add documentation for the harness store module, covering its purpose, configuration, and usage patterns to help users understand how to interact with the storage layer in test harnesses. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node is not found in the graph, the error message now includes the node's name if available, falling back to a generic description otherwise. This improves debuggability by providing more context about which node is missing. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When an event is missing optional fields such as `source` or `timestamp`, the parser now returns a default value instead of failing. This prevents unnecessary errors when processing events from external systems that may omit non-essential metadata. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Added a README file to the tinyagents-session crate to provide documentation and usage guidance for developers working with the session module. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the policy test to reflect the corrected behavior of the policy evaluation, ensuring the test aligns with the intended logic rather than the previous incorrect implementation. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Reformatted several assertion macros across the store and session conformance tests to break long lines at natural boundaries, improving code readability without changing any test logic or behaviour. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test now expects a specific error variant instead of a generic failure, aligning with the recent refactor of the policy execution path to return more descriptive errors. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When the runtime loop encounters a missing agent during execution, it now returns an error instead of panicking. This improves robustness by allowing callers to handle the absence gracefully rather than crashing the process. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add two tests covering the EventSink fast path when no listeners are subscribed. The first verifies that events emitted without listeners still receive monotonically increasing offsets and unique ids. The second confirms that after emitting on the fast path, subscribing a listener, and emitting again, the event is delivered with the correct continuation of the offset sequence. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When the agent loop exits early due to a stop condition, the runtime state may not have been initialized, causing a panic when attempting to access it. This change adds a guard to check for the state's presence before proceeding, ensuring graceful termination instead of a crash. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node fails during execution, the error message now includes the node's name if available, falling back to a generic description when the name is absent. This improves debugging by providing more context about which node encountered the error. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test was calling `recorder.records()` but the method has been renamed to `recorder.events()`, causing the test to fail. Updated the assertion to use the new method name. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When the agent loop starts, the runtime state is not yet initialized, causing a panic on the first tick. This change adds a check for the absence of state and returns a default value instead of attempting to access uninitialized data. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node in the graph returns no output, the step function now correctly handles this case instead of panicking. This ensures that nodes with optional outputs can be used without requiring all nodes to produce a result. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When the compiled graph contains no nodes, the executor now returns early instead of attempting to iterate over an empty list, which previously caused a panic. This change ensures graceful handling of degenerate graphs that may arise from dynamic construction or pruning. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Removed the unused `HashMap` import from the checkpoint types module to clean up the code and eliminate a compiler warning. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Renamed the `Checkpoint` struct to `CheckpointData` to better reflect its role as a container for checkpoint metadata and state, reducing ambiguity with the broader checkpointing concept. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test was using `assert_eq!` with arguments in the wrong order, comparing the expected value against the actual value. This has been fixed to follow the standard convention of `assert_eq!(actual, expected)`. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Changed the test to use `Checkpoint` instead of `CheckpointData` when constructing the checkpoint, ensuring the test correctly reflects the expected data structure. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node fails during execution, the error message now includes the node's name if available, instead of showing an empty string. This makes debugging easier by clearly identifying which node caused the failure. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The step function was incorrectly processing nodes, causing some nodes to execute before their dependencies were resolved. This change fixes the execution order to ensure nodes are processed in the correct topological sequence, preventing runtime errors in graph traversal. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node in the graph execution returns no output, the step function now correctly handles this case by skipping the node instead of panicking or producing undefined behavior. This change ensures robustness when nodes are optional or conditionally executed. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The step function was incorrectly processing nodes in reverse order due to a reversed iterator, causing nodes to execute in the wrong sequence. This fix ensures nodes are processed in the intended forward order as defined by the graph structure. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node is not found in the graph, the error message now includes the node name if available, instead of showing an empty string. This improves debugging by providing more context about which node is missing. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a conditional branch target node produces no output, the step function now correctly returns an empty result instead of panicking. This ensures that graph execution can proceed gracefully when a node in a conditional path does not generate any data. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a node referenced during graph step execution is not found in the compiled graph, the system now returns an error instead of panicking. This ensures graceful failure and clearer diagnostics for invalid graph configurations. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Fix a spelling mistake in the error message that is shown when an unsupported language is encountered, changing "languge" to "language" to improve clarity and correctness. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a model response lacks a language code, the system now defaults to English instead of failing. This ensures robustness against incomplete model outputs while maintaining backward compatibility for existing workflows. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Enable the "rc" feature for the serde dependency to allow serialization and deserialization of reference-counted pointer types such as Rc and Arc, which is needed for upcoming functionality that relies on shared ownership of data. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Swapped the expected and actual arguments in the assert_eq! call to follow the standard convention where the first argument is the expected value and the second is the actual value. This ensures that test failure messages display the correct comparison. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a comprehensive integration test that validates the complete retrieval-augmented generation pipeline, covering document ingestion, embedding, retrieval, and response generation to ensure the core workflow functions correctly end-to-end. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a new integration test example demonstrating how to use the OpenAI provider with a self-referencing blueprint pattern, enabling agents to dynamically generate and execute their own workflows during runtime. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add two tests that instrument `State::clone()` calls to verify the M2 optimisation that clones state at most once per superstep instead of per node invocation. The parallel fan-out test exercises a 4-way send with 3 retries on one branch, while the sequential test retries a single node 3 times; both assert the clone count stays at or below the number of supersteps. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the test expectation to match the actual execution order of nodes in the compiled graph, ensuring the test accurately reflects the runtime behavior. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Changed the test assertion to check for the expected output value instead of an incorrect one, ensuring the test correctly validates the node's behavior. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Reformat two cache_key assignments that were unnecessarily split across multiple lines, making the code more compact without changing any behaviour. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Added a new documentation file for graph nodes to provide users with clear guidance on how to define and use nodes in graph-based workflows. This helps developers understand the node structure and configuration options available. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the documentation for the graph builder module to improve clarity and accuracy of the API description, ensuring users can more easily understand how to construct and configure graph structures. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the documentation for the graph builder module to reflect recent changes in the API and usage patterns, ensuring accuracy and clarity for developers working with the module. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the execution.md documentation to better describe how the graph module processes nodes and handles dependencies, making the execution flow clearer for readers. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Integrates phase-4's checkpoint v2, per-node NodePolicy (retry/timeout/
idle_timeout/cache/on_error/defer), interrupt_before/after with
response_schema, graceful drain, and the graph-workflows lowering with
phase-2b/3/5/6/7's loop-as-graph, task/checkpoint stream events, and
session/entry-tree work already on this branch.
Conflict resolution notes:
- compiled/{types,mod,step,boundary,state_api}.rs: kept both sides' fields
and behavior (sequence counter + node policies/cache/interrupt
selectors); CompiledGraph::emit gained emit_task/envelope_task so every
per-task GraphEvent (TaskScheduled/Started/Completed, NodeStarted/
Completed/Failed/RetryScheduled, StateUpdated, InterruptEmitted,
ContextForked, RouteSelected) now stamps GraphEventEnvelope::task_id
instead of leaving it None (closes feature-gaps.md C3's remaining gap).
Reconciled phase-3's and phase-4's duplicate GraphEvent::TaskCompleted
variants (stream/types.rs) into one.
- language.rs: per phase-5's own note that the graph-wide-only timeout/
retry lowering was a stopgap for "no per-node API exists", switched to
lowering each node's timeout/retry onto its own NodePolicy via
with_node_policy now that phase-4 added one, and dropped the
all-nodes-must-agree restriction and its tests/docs.
- agent_loop/compile.rs, language.rs (options lowering): phase-4
repurposed GraphBuilder::mark_interrupt from a behavior-free export
marker into an alias for the real interrupt_before pause. Both call
sites relied on the old inert semantics, which the merge would have
silently turned into an unconditional pre-handler pause on every
activation (verified against pre-merge HEAD: loop_as_graph.rs's
checkpoint-resume tests double-paused and never completed). Fixed by
setting the NodeMeta interrupt flag directly instead of going through
mark_interrupt.
- agent_loop/runtime.rs: added the new Interrupt::response_schema field
to two hand-built Interrupt literals.
- workflow/engine.rs: merged phase-3's envelope-based, run_id-explicit
emit() with phase-4's pub(crate) visibility (needed by the new
workflow/lower.rs) and Arc-shared sequence counter (needed once Clone
exists for the graph-workflows lowering).
Verification: cargo fmt --check; cargo clippy --workspace --all-targets
--all-features -D warnings; cargo test --workspace --all-features (one
pre-existing environmental flake in claude_agent_sdk, passes in
isolation); cargo test -p tinyagents-orchestration --features
graph-workflows; cargo build --workspace --no-default-features; cargo run
-p tinyagents-integration-tests --example basic_graph.
Updates docs/runtime-comparison/feature-gaps.md (A7/D2/D3/D5 to shipped,
C3 to shipped with task_id wired) and plan.md's execution log to reflect
phase-4 now being merged.
Co-authored-by: Medulla <medulla@tinyhumans.ai>
This was referenced Sep 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Runtime comparison (LangGraph/LangChain, Pydantic AI, pi) + deep code review of every crate, written up under
docs/runtime-comparison/, followed by execution of all seven phases of the resulting plan, restricted to runtime/harness-level work (product-level items are marked OpenHuman and left out by decision).Start with
docs/runtime-comparison/README.md→feature-gaps.md(per-gap status column) →plan.md(execution log at the top).Companion vendor branches (gitlinks in this PR point at them):
tinyhumansai/tinyinference@runtime-comparison,tinyhumansai/tinytools@runtime-comparison— PRs for those follow.Status of the 40-item gap matrix
25 shipped · 5 partial · 7 OpenHuman · 2 open (see
feature-gaps.mdfor each row's "what remains").Phase 0 — hygiene
CI
--workspaceeverywhere + non-blocking rustdoc/machete steps;[workspace.dependencies],rust-version = "1.88",unsafe_code = "deny";tinyagents-tracingremoved; unused deps dropped; harness featuresclaude-code/langfuse/builtin-tools; vendor re-exports; live tests behindTINYAGENTS_LIVE=1+#[ignore]; docs truth pass.Phase 1 — correctness
Harness: hosted-path
Arc<dyn Any>cast removed (fail-closed type check,child/child_with_datasplit), signed thinking blocks kept through streaming, terminal events for every started sibling tool,CallTimeoutvs runTimeout, gated text-dialect recovery, fail-closed host allow-list,relaxed_jsonrepair,#[non_exhaustive]events/errors, typedHostedError,spawn_blockingfor sqlite/fs, steering routed by run id, retry correlation,max_tool_concurrency, M-1…M-14.Graph:
executor.rssplit; real pending writes (completed parallel and sequential siblings never re-run; equivalence tests); thread locks + durable leases;TaskIdend to end; per-task subgraph namespaces; parent-driven child retry/resume; panic/cancel safety (RunOptions); SQLite/File backend rework; fan-out edges; restart tests.Language/registry:
build_graphrejects-then-lowers, deterministic default model, serialisable diagnostics, registry metadata/DefinitionRegistrybridge,schema_version,routeritem.Phase 2 — loop control & HITL
MiddlewareControl::{Continue, JumpTo, UpdateState, StopWithFinal, Interrupt}from every hook,should_stop_after_turn, toolToolControl(return_direct/terminate/goto); deferred tools (DeferredToolRequests/DeferredToolResults, approve/edit/deny,ExternalToolSet/register_external,DeferredToolHandler,resume_deferred); output-validation retry loop (OutputValidator,ModelRetry/ToolFailed,structured_as::<T>());Prompted/ToolCallUnionmodes +EndStrategy;RunQueuesteer/follow-up/collect lanes wired withQueueMode;ToolExecutionContextcall_id/store/state view; richToolResult{follow_up, metadata, control, error_kind}(vendor tinytools);RunContext::bounded,EventSinkzero-listener fast path.Phase 3 — streaming & events
Block-indexed
ModelStreamItem::{BlockStart, BlockDelta, BlockEnd}(Anthropic + OpenAI chat SSE),ProviderError.partial_message;AssistantFramecodec + reducer;GraphEventEnvelope{run_id, task_id, ns, seq},StreamMode::{Tasks, Checkpoints},StreamProjectionwith late-attach cursor,JournalGraphSink::dropped().Phase 4 — durability v2
Checkpoint v2 (
version,created_at, singletasks/completedlists, v1 decoder, SQLiteformat_version); serialisableChannelSet+ReducerRegistry,channel_versions/versions_seen, delta-channel history,ChannelWrite::Overwrite;NodePolicy(per-node retry/timeout/idle/cache/on_error/realdefer),TaskCache(memory + SQLite);interrupt_before/after,Interrupt.response_schema,DrainSignal/Drained,NodeContext::durable_task;WorkflowDefinitionlowered to aCompiledGraph(graph-workflowsfeature, legacy suite passes on both paths);Arc<State>handlers (add_node_shared, ≤ 1 state clone per step).Phase 5 — sessions, context, loop-as-graph
EntryTree(id/parent, branches, labels, forks, compaction/branch-summary/custom entries, context projection); compaction rules (find_cut_point, split turns, iterative summaries,CompactionRecord,OverflowClassifier, overflow → compact → retry,before_compaction); cross-provider handoff (MessageOrigin,prepare_for_model); tool-effect ledger (ToolEffectLedger,reconcile_tool_effects,ToolReplay);Message::Custom; loop as a graph (compile_loop,LoopIter,GraphLoopDriver,LoopExecution::{Direct, Graph}, direct-vs-graph equivalence tests); full.raglowering (joins, per-node timeout/retry, sends, route tables, options/metadata;channelsstill inert).Phase 6 — tool ecosystem
ToolSettrait +Combined/Filtered/Prefixed/Renamed/Prepared/ApprovalRequired/External,ToolExposureExplanation; transcript-carriedSystemMessage{sections, tools_added, tools_removed}+declare_tool_changes(cache-aware dynamic tools);Capabilitybundle +load_capability+.ragcapabilityitem.Phase 7 — models & testing
ModelProfilebehaviour (schema_transform,default_structured_mode,thinking_tags,thinking_level_map,compat) consumed by schema prep / structured plan / model call; models.dev catalog generator + refreshed 44-model snapshot + tiered pricing +WorkloadRouter;ContentBlock::{Audio, Video, Document};ModelStreamItem::Deferred,ProviderRequestOptionshooks,deny_network_models();SchemaDrivenModel; store/session conformance suites.Marked OpenHuman (not done here by decision)
MCP client, provider-executed tool parts, OTel sink,
sanitize_history,CredentialStore/OAuth, evals crate, semantic store search, media downloader.Known narrowings
Retry-engine unification partial (coordinated, not unified); no
Turnstruct;GraphLoopDrivernot itself checkpointable (compile_loopis);.ragchannelsinert; executor lease claim-once (renewal only in the workflow engine);ToolProgressunwired pending a tinytools progress seam; harness C-1 keeps onetype_name-guardedunsafe.Test plan
cargo fmt --check,cargo clippy --workspace --all-targets --all-features -- -D warnings,cargo build --workspace --no-default-features— clean.cargo test --workspace --all-features— green (harness ≈1330, graph ≈560, plus session/orchestration/language/registry/integration incl.loop_as_graph.rs, durability restart tests, conformance suites).cargo test -p tinyagents-orchestration --features graph-workflows— green.claude_agent_sdk::…::provider_pipes_large_request_to_cli_stdin("Text file busy" under parallel threads); passes in isolation.docs/sdk-gaps/split).Breaking API changes
invoke_agent→Result<AgentRun, HostedError>;RunContext::childsame-Ctxonly;HostInvocationBinding.allowed_tools: Option<HashSet>;GraphEventSink::emittakesGraphEventEnvelope;NodeHandlerreceivesArc<State>(old closure shape kept via adapter;NodeFactoryimpls updated);SendargsOption<Arc<Value>>;Checkpointv2 fields (v1 decodes);ProviderError/ToolDelta/AssistantMessage/SystemMessagegained fields (vendor);ModelStreamItem/ContentBlock/Message/TinyAgentsError/AgentEventgained variants; harnesstoolsfeature →builtin-tools(alias kept);tinyagents-tracingremoved;apply_handofftakes&HandoffConfig;TerminalObserverreceivesTerminalRunSummary.Co-authored-by: Medulla medulla@tinyhumans.ai