Repository navigation
v1.2.0
[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.resolverpruned to its real surface (runner-levelresolve_checkpointer/resolve_durability/resolve_planner/resolve_policy); dead re-exports of nano'sresolve_memory/resolve_subagents/resolve_tools/SUBAGENT_FACTORIESremoved. Host pool binding imports nano's publicsoothe_nano.resolve.{resolve_checkpointer,resolve_durability}instead of the private_resolver_infrapath. - 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 theuxpackage towire). Allsoothe/soothe-daemonsrc + 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 theconfig/templates/nano.ymlsymlink):tools.execution→tools.shell, and thetools.data/tools.file_ops/subagents.academic_researchblocks are removed (nano 2.0 deleted thedataandimagetoolkits, retired thefile_opstoolkit group in favour of the middleware filesystem surface, and deleted theacademic_researchsubagent with no compat shim). - Pin
soothe-nano>=2.0.0,<3.0.0(was>=2.0.0a2).
Fixed
- Break the unbounded
DISPATCH → ROOT_EVAL → DISPATCHcycle that exhausted the LangGraph recursion limit and aborted long-runningcontinue_looploops on a single goal.ROOT_EVALnow detects exhausted waves and falls through to coverage Eval insertion / finalize instead of cycling, anddag_idleis suppressed when the tree isn't green so rail rules don't fire a falsecomplete_job. GraphRecursionErrorfrom the StrangeLoop graph invoke is now scoped to the current goal:pump_graphmarks the in-flight goalinterrupted(resumable viaretry/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/IntakeScopejoinedResponseLanguage(plus nano'sRoutingClassification/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_singletonsnow awaitsAsyncConnectionPool._signal_stop_worker(a coroutine since psycopg_pool 3.3) and joins the returned worker tasks under a bounded timeout; it also unwrapsSharedPostgreSQLPool._poolso the inner psycopg pool is signalled.