Added
-
Frontier model routing strategy and prompt policy (
docs/MODEL-ROUTING-STRATEGY.md,docs/GPT-5.6-PROMPTING.md,skills/blocks/frontier-model-routing.md): defines Opus 5 as the premium lead, GPT-5.6 Sol as the independent implementation/review peer, Sonnet 5 as the standard Claude seat, and Fable 5 as an explicit capability escalation rather than an automatic default. -
Cross-harness continuity contract (
AI_AGENT_HANDOFF.md,AGENTS.md,CLAUDE.md): gives Claude Code, Codex, Copilot, OpenCode, and other coding agents one committed resume point for active decisions, evidence, blockers, verification, and branch state while retaining Beads as the task system of record. -
Tangle now has an explicit verification-only mode (#675).
orchestrate.sh verify "<prompt>"diagnoses the committed baseline in a disposable detached worktree, accepts only a structured and internally consistent result, reportsVERIFIED_NO_CHANGE,DEFECT_REPRODUCED, orNEEDS_DIAGNOSIS, and never launches implementation agents or preserves diagnostic writes. -
Tangle implementation runs now execute in an isolated Git worktree by default (#673). Each real run gets a deterministic
octopus/run/<run-id>/integrationbranch, records source and run metadata, reuses that run ID for delegated tasks and validation artifacts, resolves caller-relative ignored context before changing worktrees, restores the caller's project context afterward, and preserves failed worktrees for inspection; setup failures roll back both the worktree and branch. -
Councils configure per-seat dispatch timeouts and salvage a finished review from a non-zero dispatch (#667). A single global timeout was too tight for large-diff reviews and the strict pass/fail dispatch check discarded seats that had already written a complete
VERDICT:-bearing response but were killed at the boundary.council_seat_timeoutnow resolves most-specific-first (OCTOPUS_COUNCIL_TIMEOUT_<PROVIDER>> the run-wide--seat-timeoutflag > the legacyOCTOPUS_COUNCIL_AGENT_TIMEOUT> a 120s default), so a slow provider such asagycan be given more room without loosening the others. The advice phase now counts a seat whose response is non-empty, substantive, and carries an explicit verdict even when its dispatch return code was non-zero, so a complete review is no longer thrown away as a shortage. -
Council
summary.jsonnow records a per-seatseats[]array, making quorum integrity machine-checkable without readingresponses/*by hand. Each advice seat carriesseat(role),provider,provider_org,model,response_bytes,payload_kind(currentlyfull),verdict,status(responded/degenerate/empty/no-response), andcounted_as_approver.distinct_approving_providersis recomputable as the count of distinct providers among seats wherecounted_as_approveris true — so a chair or degenerate seat can no longer masquerade as a distinct approving vendor. First of the sail-cruisey #2077 council-runner reliability fixes; later fixes extendpayload_kind(agy chunking) andstatus(timeout/degraded).
Changed
- Real Tangle implementation runs now require a clean Git baseline by default (#674). Modified tracked files, untracked files, and non-Git workspaces fail before provider dispatch with each blocking status entry reported; ignored files remain allowed and direct library consumers may explicitly opt out with
OCTOPUS_TANGLE_REQUIRE_CLEAN_BASELINE=false. - Current-model defaults now prefer Opus 5, Sonnet 5, and GPT-5.6 when the installed Claude Code and Codex versions support them. Fresh provider configurations use GPT-5.6 Sol/Terra/Luna and Opus 5/Sonnet 5/Haiku 4.5; existing environment, session, and
providers.jsonpins retain precedence. - Fable 5 remains opt-in and falls back to Opus 5 for security routing or a refusal/empty response.
OCTOPUS_FABLE5_FALLBACK_MODELcan select another fallback, and automatic Opus 5xhighphase routing is now opt-in throughOCTOPUS_OPUS5_AUTO_XHIGH=1. - Provider capability gates and cost reporting recognize the new roster: Sonnet 5 requires Claude Code v2.1.197+, Opus 5 requires v2.1.219+, and GPT-5.6 routing requires Codex CLI v0.144.0+.
Fixed
- A council advice seat now survives an interrupt to the council process instead of dying mid-write (#669). Advice seats ran inline in the council's own process group, so a SIGHUP/SIGINT/SIGTERM to the council (a Claude Code tool timeout, a user Ctrl-C, an orchestrator-level signal) propagated to the in-flight provider child, killing it mid-write and leaving a torn response file — the council then hung or reported a false provider shortage.
council_dispatch_member_detachednow runs each advice/chair-fallback seat in a signal-isolated, disowned background subshell (trap '' HUP INT TERM+disown— the portable equivalent ofsetsid, which is absent on macOS) that writes to a.partialfile and atomically renames it into place on completion, dropping a.donesentinel that carries the exit code. Reaping uses the same per-provider timeout as dispatch, and timeout cleanup kills the provider process tree before removing temporary artifacts so no stale response can publish later. Seats still run one at a time; this is a reliability change, not a concurrency change. SetOCTOPUS_COUNCIL_DETACH=0to restore the legacy inline dispatch. - The chair seat no longer counts toward the distinct-approving-vendor quorum (#670).
council_run_advice_phaseadded every substantive seat's provider to the responding/approving vendor sets, including the chair. Because the chair is the synthesizer rather than an independent cross-lab reviewer — and the count gate already excludes it viareceived_non_chair— a chair-only vendor could inflatedistinct_approving_providers, letting a single independent approver plus the chair's own vendor pass a 2-vendor quorum. The vendor tally now skips the chair seat (the chair-fallback path never added to it either), soseats[]andquorumstay consistent and a chair-only approving vendor no longer satisfies consensus. A vendor that also holds an independent seat still counts through that seat, so the exclusion is seat-scoped, not vendor-scoped. The #577 quorum tests are unaffected (provider diversity is enforced among non-chair seats). - Tangle now stops immediately when its validation gate fails (#672). A failed validation no longer falls through into contextual review and correction agents, preventing additional writes after the run has already been declared invalid while preserving the generated validation report for diagnosis.
- An oversized council prompt to
agynow degrades to a structured skip instead of OOM-killing the seat (#2077). The adapter's existing file-path fallback sidesteps the argvMAX_ARG_STRLENlimit but not agy itself — a multi-megabyte prompt is loaded whole into agy's context and OOM-kills the headless process (or is rejected by the backend for context length), leaving the seat dead with an opaque exit code or a silent-empty result the retry cannot recover.agy-exec.shnow enforces a configurable payload ceiling (OCTOPUS_AGY_MAX_PAYLOAD_BYTES, default 1 MiB): above it, the adapter refuses to dispatch, exits 0, and emits a provider-rejection marker thatclassify_agent_outputalready recognizes, so dispatch records a structuredskipped:oversizeseat and the council keeps its remaining seats rather than crashing on this one. The ceiling is measured in bytes on the exact prompt content agy would read.