Skip to content

v1.2.0

Choose a tag to compare

@caesar0301 caesar0301 released this 18 Oct 14:28
· 740 commits to main since this release

[v1.2.0] - 2026-10-18

First stable release on the nano 2.0 train. Pins soothe-nano>=2.0.0,<3.0.0.

Changed

  • Align to nano 2.0: soothe.runner.resolver pruned to its real surface (runner-level resolve_checkpointer/resolve_durability/resolve_planner/resolve_policy); dead re-exports of nano's resolve_memory/resolve_subagents/resolve_tools/SUBAGENT_FACTORIES removed. Host pool binding imports nano's public soothe_nano.resolve.{resolve_checkpointer,resolve_durability} instead of the private _resolver_infra path.
  • Stream tool-wire contract imports moved with the nano rename: soothe_nano.ux.{task_namespace,stream_tool_wire} → soothe_nano.wire.{task_namespace,stream_tool_wire} (nano renamed the ux package to wire). All soothe/soothe-daemon src + test import sites updated in lockstep.
  • Config scaffold aligned to nano 2.0's tool/subagent surface (packages/soothe-daemon/src/soothe_daemon/setup/templates/nano.yml, mirrored by the config/templates/nano.yml symlink): tools.execution → tools.shell, and the tools.data / tools.file_ops / subagents.academic_research blocks are removed (nano 2.0 deleted the data and image toolkits, retired the file_ops toolkit group in favour of the middleware filesystem surface, and deleted the academic_research subagent with no compat shim).
  • Pin soothe-nano>=2.0.0,<3.0.0 (was >=2.0.0a2).

Fixed

  • Break the unbounded DISPATCH → ROOT_EVAL → DISPATCH cycle that exhausted the LangGraph recursion limit and aborted long-running continue_loop loops on a single goal. ROOT_EVAL now detects exhausted waves and falls through to coverage Eval insertion / finalize instead of cycling, and dag_idle is suppressed when the tree isn't green so rail rules don't fire a false complete_job.
  • GraphRecursionError from the StrangeLoop graph invoke is now scoped to the current goal: pump_graph marks the in-flight goal interrupted (resumable via retry/resume) and surfaces a goal-scoped message, so the loop thread survives and the next goal starts fresh with a full recursion budget.
  • Checkpoint serde allowlist covers every host routing enum that rides in loop state: IntakeLabel / IntakeConfidence / IntakeScope joined ResponseLanguage (plus nano's RoutingClassification / TaskComplexity) in _create_host_serde. Unlisted enums serialized fine but were dropped on restore, silently losing branch-routing state across restarts and thread resumes.
  • The PostgreSQL integration suite no longer hangs forever in pytest-asyncio event-loop teardown. support_config.reset_pool_singletons now awaits AsyncConnectionPool._signal_stop_worker (a coroutine since psycopg_pool 3.3) and joins the returned worker tasks under a bounded timeout; it also unwraps SharedPostgreSQLPool._pool so the inner psycopg pool is signalled.