Skip to content

Runtime comparison + Phases 0–7: correctness, loop control, streaming, durability v2, sessions, toolsets, model profiles - #171

Draft
senamakel wants to merge 1845 commits into
mainfrom
runtime-comparison
Draft

senamakel wants to merge 1845 commits into
mainfrom
runtime-comparison

Conversation

@senamakel

@senamakel senamakel commented Sep 19, 2026

Copy link
Copy Markdown
Member

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.mdfeature-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.md for each row's "what remains").

Phase 0 — hygiene

CI --workspace everywhere + non-blocking rustdoc/machete steps; [workspace.dependencies], rust-version = "1.88", unsafe_code = "deny"; tinyagents-tracing removed; unused deps dropped; harness features claude-code/langfuse/builtin-tools; vendor re-exports; live tests behind TINYAGENTS_LIVE=1 + #[ignore]; docs truth pass.

Phase 1 — correctness

Harness: hosted-path Arc<dyn Any> cast removed (fail-closed type check, child/child_with_data split), signed thinking blocks kept through streaming, terminal events for every started sibling tool, CallTimeout vs run Timeout, gated text-dialect recovery, fail-closed host allow-list, relaxed_json repair, #[non_exhaustive] events/errors, typed HostedError, spawn_blocking for sqlite/fs, steering routed by run id, retry correlation, max_tool_concurrency, M-1…M-14.
Graph: executor.rs split; real pending writes (completed parallel and sequential siblings never re-run; equivalence tests); thread locks + durable leases; TaskId end 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_graph rejects-then-lowers, deterministic default model, serialisable diagnostics, registry metadata/DefinitionRegistry bridge, schema_version, router item.

Phase 2 — loop control & HITL

MiddlewareControl::{Continue, JumpTo, UpdateState, StopWithFinal, Interrupt} from every hook, should_stop_after_turn, tool ToolControl (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/ToolCallUnion modes + EndStrategy; RunQueue steer/follow-up/collect lanes wired with QueueMode; ToolExecutionContext call_id/store/state view; rich ToolResult{follow_up, metadata, control, error_kind} (vendor tinytools); RunContext::bounded, EventSink zero-listener fast path.

Phase 3 — streaming & events

Block-indexed ModelStreamItem::{BlockStart, BlockDelta, BlockEnd} (Anthropic + OpenAI chat SSE), ProviderError.partial_message; AssistantFrame codec + reducer; GraphEventEnvelope{run_id, task_id, ns, seq}, StreamMode::{Tasks, Checkpoints}, StreamProjection with late-attach cursor, JournalGraphSink::dropped().

Phase 4 — durability v2

Checkpoint v2 (version, created_at, single tasks/completed lists, v1 decoder, SQLite format_version); serialisable ChannelSet + ReducerRegistry, channel_versions/versions_seen, delta-channel history, ChannelWrite::Overwrite; NodePolicy (per-node retry/timeout/idle/cache/on_error/real defer), TaskCache (memory + SQLite); interrupt_before/after, Interrupt.response_schema, DrainSignal/Drained, NodeContext::durable_task; WorkflowDefinition lowered to a CompiledGraph (graph-workflows feature, 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 .rag lowering (joins, per-node timeout/retry, sends, route tables, options/metadata; channels still inert).

Phase 6 — tool ecosystem

ToolSet trait + Combined/Filtered/Prefixed/Renamed/Prepared/ApprovalRequired/External, ToolExposureExplanation; transcript-carried SystemMessage{sections, tools_added, tools_removed} + declare_tool_changes (cache-aware dynamic tools); Capability bundle + load_capability + .rag capability item.

Phase 7 — models & testing

ModelProfile behaviour (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, ProviderRequestOptions hooks, 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 Turn struct; GraphLoopDriver not itself checkpointable (compile_loop is); .rag channels inert; executor lease claim-once (renewal only in the workflow engine); ToolProgress unwired pending a tinytools progress seam; harness C-1 keeps one type_name-guarded unsafe.

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.
  • Pre-existing flake: claude_agent_sdk::…::provider_pipes_large_request_to_cli_stdin ("Text file busy" under parallel threads); passes in isolation.
  • Every Markdown file ≤ 500 lines (docs/sdk-gaps/ split).

Breaking API changes

invoke_agentResult<AgentRun, HostedError>; RunContext::child same-Ctx only; HostInvocationBinding.allowed_tools: Option<HashSet>; GraphEventSink::emit takes GraphEventEnvelope; NodeHandler receives Arc<State> (old closure shape kept via adapter; NodeFactory impls updated); Send args Option<Arc<Value>>; Checkpoint v2 fields (v1 decodes); ProviderError/ToolDelta/AssistantMessage/SystemMessage gained fields (vendor); ModelStreamItem/ContentBlock/Message/TinyAgentsError/AgentEvent gained variants; harness tools feature → builtin-tools (alias kept); tinyagents-tracing removed; apply_handoff takes &HandoffConfig; TerminalObserver receives TerminalRunSummary.

Co-authored-by: Medulla medulla@tinyhumans.ai

@coderabbitai

coderabbitai Bot commented Sep 19, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Comment @coderabbitai help to get the list of available commands.

senamakel and others added 29 commits September 20, 2026 02:11
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>
senamakel and others added 27 commits September 20, 2026 03:32
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>
@senamakel senamakel changed the title Runtime comparison docs + Phase 0/1 hygiene and correctness fixes Runtime comparison + Phases 0–7: correctness, loop control, streaming, durability v2, sessions, toolsets, model profiles Sep 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant