Перейти к содержимому

Changelog

Это содержимое пока не доступно на вашем языке.

Four route phrases now name the model they spell, and a Codex pin to GPT-5.6 Sol may run at max.

  • "mimo pro" / «мимо про» names MiMo v2.6 Pro through OpenRouter (ormimopro, paid, ≈ $0.06 a run), as "mimo 2.6 pro" does since 1.119.3. In 1.120.0 "only mimo pro" started the older MiMo v2.5 Pro (mimo25pro) and «только мимо про» the free MiMo v2.6 Flash.
  • "mimo flash" / «мимо флеш» names the MiMo v2.6 Flash voice of the cheap panel: a new group, mimoflash, holds exactly that voice's channels, so the run takes the same route as the cheap panel (opencode's free copy where opencode runs). "mimo 2.6 flash" and «мимо 2.6 флеш» too. In 1.120.0 «только мимо флеш» started the paid mimo CLI copy (mimov26flash), and "only mimo flash" and "only mimo 2.6 flash" were refused.
  • "glm 5.3 flash" / «глм 5.3 флеш» names GLM 5.3 Flash (ocglm53flashfree, free, through opencode; also "glm-5.3-flash", "glm flash", «глм флеш»). In 1.120.0 it started the paid GLM 5.3 (orglm53); "glm 5.3" alone still names GLM 5.3.
  • "codex cli" / «кодекс кли» names Codex alone. In 1.120.0 the word "cli" there also named the group of CLI agents, so "only codex cli" ran Codex plus every CLI agent of the cheap panel.
  • More words are checked. A word after a model's name that the registry uses to spell another model now stops the route, as a word after a group word does since 1.119.3, and Cyrillic words after a group word or a channel's name are checked too. So "only glm-5.3 flash" (GLM 5.3 in 1.120.0) and «только квен про» (Qwen 3.8 Max in 1.120.0) are refused; the Latin "only qwen pro" still runs Qwen 3.8 Max.
  • Codex effort ladders follow Codex's own model list. GPT-5.6 Sol offers low to max (the registry stopped at xhigh), so "only codex 5.6 sol" with "effort": "max" in your settings now sends max where 1.120.0 sent xhigh; with the kit's default effort (xhigh) nothing changes. GPT-6 Sol's list lost none. Codex's ultra (max plus sub-agents Codex starts by itself) is in no list and is never sent. GPT-5.5 and GPT-5.4 are no longer in Codex's list; their pins are kept, unmeasured.
  • New selftest suite suite_r178_route_residuals (24 checks).

Both Muse Spark Contributor voices run in the cheap panel, on the OpenCode Go plan where opencode has it and through OpenRouter elsewhere; without agy no paid Gemini 3.8 Flash starts in its place; an OpenCode Go refusal names what the workspace owner must switch on.

  • Two Spark voices. Muse Spark 1.2 Contributor and 1.3 Contributor, each on the first route the machine has: the OpenCode Go plan (ocspark12go, ocspark13go), then a Meta key (1.2 only, spark12cont), then OpenRouter (orspark12cont, orspark13cont; $0.10 / $0.20 per 1M). The cheap panel has 7 voices, «CLI only» 5, the standard panel 13. The README overlay that switched ocspark12go on is no longer needed.
  • The Go plan is checked, not assumed. An opencode-go/ channel is ready only where opencode models lists its model, so opencode without the Go plan no longer takes the Spark voices away from OpenRouter. In «CLI only» such a machine still starts the two Go channels; the plan now says they will fail and how to leave them out (--skip ocspark12go ocspark13go).
  • No paid Gemini 3.8 Flash without agy. orgemini38flash (OpenRouter) starts only when named; up to 1.119.3 it took agy's seat by itself.
  • The OpenCode Go Privacy switch. A Go workspace refuses both Contributor models until an owner or admin turns on «Allow paid endpoints that train on request data» in the OpenCode Console, Settings › Privacy. The refusal is diagnosed with that action, and REPORT.md (the channel table) and HANDOFF.md print it opposite the refused Spark; DeepSeek's «requires Global regions» refusal on Go is diagnosed the same way. README and INSTALL carry the step.
  • New selftest suites suite_r179_kit_defaults and suite_r179_i3_go_owner_action.

A route that named MiMo v2.6 Pro started the retired Gemini 3.1 Pro instead. A model word in a route now names only the model it spells.

  • "pro" and "flash" alone name nothing. Gemini 3.1 Pro (agy31pro) answered to the bare word "pro" and Gemini 3.6 Flash (agy36flash) to the bare word "flash". A model's own name counts as naming its channel directly, which starts a channel even when it is off or starts only by name. So in 1.119.2 "cheap panel, including codex and mimo 2.6 pro" ran Gemini 3.1 Pro (off since 1.115.0: agy no longer offers its model on our account) and no MiMo Pro; "only qwen pro" and "only gemini 4 pro" added Gemini 3.1 Pro; "only mimo 2.6 flash" and "only glm 5.3 flash" added Gemini 3.6 Flash (off). Both channels keep their full names ("agy31pro", "gemini-3.1-pro", "3.1 pro"; "agy36flash", "gemini-3.6-flash", "3.6 flash").
  • "mimo 2.6 pro" names MiMo v2.6 Pro through OpenRouter (ormimopro, paid, ≈ $0.06 a run), as «мимо 2.6 про» already did; "mimo v2.6 pro" and "mimo-v2.6-pro" too. "add mimo 2.6 pro" adds it to the cheap panel, "only mimo 2.6 pro" runs it alone. "mimocli", «мимо кли» and "mimo cli v2.6" still name the same model through the mimo CLI (mimov26pro, where that CLI is installed). Before, "mimo" was only a group word, and a group word never starts a channel that is off by default, so of the whole group only the free MiMo v2.6 Flash ran.
  • Words after a group word are checked. A model-looking word after a group word ("mimo", "gemini", ...) that none of the group's channels answers to now stops the route and lists the names the group's channels do answer to, so "only mimo 2.6 flash" and "only gemini 4 pro" are refused. Before, only the words after a channel's own name were checked: words after a group word were dropped and the group's default members ran.
  • New selftest suite suite_r177_route_model_words (21 checks), with a registry census: a one-word model name of a channel that is off or starts only by name may not be a word of another channel's name, label or model.

Known and unchanged: "qwen pro" runs Qwen 3.8 Max (a short word after a channel's name is let through on purpose), "glm 5.3 flash" runs GLM 5.3 (a word after a model's name is not checked), and Cyrillic words after a group word are not checked.

Two fixes on the default path. A Grok tool may now run up to 300 s before the inner watchdog stops the run (90 s cut working web searches), and a free API voice whose request gets no response headers sends that request once more inside the same call (DeepSeek V4.1 Flash on NVIDIA's free endpoint lost 10 of its last 24 reviews that way).

  • Grok's inner watchdog waits 300 s for every tool (was 90 s since 1.117.0). Measured on the author's machine: 64 Grok web searches, median 58.7 s, the longest 172.3 s, 5 past 90 s; in a 2026-11-09 round the 90 s limit fired as a web search completed (94.6 s) and the whole review was lost under «stayed pending». GROK_TOOL_SILENCE is 300 s (ORCH_GROK_TOOL_SILENCE still overrides) and GROK_TOOL_SILENCE_BY_TOOL (web_search 300 s) is a per-tool floor the default never lowers. A tool that completed as the watchdog fired is now recorded as such (watchdog_raced: true, «completed as the watchdog fired», its own diagnose() entry) instead of as a hang. Suite suite_r175_grok_tool_limits.
  • A free API voice re-sends one request that got no response headers. When the headers of a request do not arrive within 300 s, the same request is sent once more inside the call; the conversation grows only after a successful round, so the copy carries the pages already read. Once per call and only on channels whose cost is free: a paid request with no headers may still be queued and billed upstream, so paid channels never re-send. Deadline and stall cuts are never re-sent. The record gains headers_resent (after_rounds, at_s, answered) and headers_waits_s, retries counts the re-send, and diagnose() gains two entries for NO RESPONSE HEADERS within (plain, and after the re-send). A copy that fails too costs at most 300 s more, and 1.119.0's free-voice rule then applies unchanged (silence: no retry, no fallback). Measured: DeepSeek V4.1 Flash on NVIDIA's free endpoint, 24 rounds since 2026-10-31, 11 answered, 10 ended on «no response headers within 300 s» (6 on the first request). A live probe on 2026-11-09 got HTTP 504 from NVIDIA's own gateway after ~302 s for a small and a large request alike, so a longer limit would not help, and in such an hour the copy fails too: the re-send rescues a single dropped request; headers_resent[].answered in the records shows how often. Suite suite_r176_headers_resend.

Latent dispatcher-shape fix found by the first live chat round. routing.initial_plan now carries the chat seat's driver field from the registry into the plan slot — otherwise the dispatcher could not find the driver script for a seat kind, and orchestrate.py --panel chat --chat claude on an enabled chat seat failed with R173_SEAT_DRIVER_MISSING before subprocess.run. Nothing user-visible changed: chat seats still ship enabled: false in the kit and are enabled only through the author's overlay; the fix matters when an operator enables a seat. No chat slot is spent on the failed path (the resolver raises before any subprocess runs), so no live cost ever rode this bug.

  • routing.initial_plan copies driver into the plan slot (one line). The plan slot's field whitelist did not include driver, which R173 И-3 added to channels.json for chat seat kinds. The R173 И-3 suite exercised call_chatseat() directly, bypassing main()'s initial_plan, so the plan slot's missing field was not caught at the time. One new suite block in suite_r173_i3_seats_topology (e) iterates over claudeaiseat / cldesktopseat / cgptseat / cgptdeskseat and checks that initial_plan(reg) carries each one's driver into the plan slot.
  • Live-verified on 2026-11-02 by a cheap chat round on Haiku 5.5: driver resolved, subprocess ran, 3,384-byte answer in 42.6 s with chat_slot_spent: True, planted false claim refuted with the correct release date and a vendor citation. Selftest in SOURCE after the fix: 2521/2521 PASS (R173 И-4b's 4 added to 1.119.0's 2517).

Three source-tree features bundle together. A free voice that fails inside its 25-minute window now retries or falls back inside the same round, not after it. Chat panel seats scaffold ships off by default (overlay flips them on). Overlay channels can carry a valid_through date that flips them off automatically.

  • Free-voice IN-ROUND retry+fallback rule (R172 И-2; operator's rule 2026-10-31). orchestrate.main uses concurrent.futures.wait(FIRST_COMPLETED) with a nested in-round pool; a free primary's failure is classified by _classify_free_failure(r, elapsed_s, 1500 s) into past_window / silence / transient + delay / quota / other. A known transient (429, 5xx) retries the primary once in-round with a 60 s / 30 s delay bounded by the remaining window; a known refusal (provider.quota, provider.free-limit) or an unknown-but-real failure dispatches the fallback at once in-round. Silence (clean exit, no error, no answer) and failure past the 25-minute window end the voice without a retry and without a fallback — the operator's rule verbatim «silence or past 25 min: no fallback». The marker free_inround on the primary record blocks the after-round AUTO-RETRY and the after-round fallback from re-firing. Paid and subscription voices keep the after-the-round fallback, unchanged. Env overrides for CI and probe worlds: ORCH_FREE_INROUND_WINDOW (window seconds), ORCH_FREE_INROUND_RETRY_429 (429 delay seconds), ORCH_FREE_INROUND_RETRY_5XX (5xx delay seconds). The rule was live-verified on a cheap panel on 2026-11-02: 8/8 behaviours matched the expected branch, 0/4 false positives on paid voices. Suite: suite_r172_i2_free_inround (29 checks a–k).
  • Chat panel seats scaffold (R173 И-3). Four new channels — claudeaiseat (chatseat, CDP), cldesktopseat (uiaseat, UI Automation), cgptseat (chatseat), cgptdeskseat (uiaseat) — are present in the kit with distribution: local and enabled: false; an overlay enables them. --panel chat refuses to run without --chat claude|chatgpt|both. Drivers live in the author's seats/ directory and are excluded from the kit tree — a chat seat is operated through the author's own browser or desktop app and is not a general-purpose channel. The kill-switch env R173_SEAT_FORBID_LIVE leaves chat_slot_spent: False so a refusal does not count a chat slot. The chat panel is exempt from the free-voice in-round rule (D5). Suites: suite_r173_i2_chat_panel_scaffold (wired), suite_r173_i3_seats_topology (a–d3).
  • valid_through self-expiry in routing (R174 И-1). routing._valid_through_expired(ch, today=None) returns the ISO date when today > valid_through (lexical YYYY-MM-DD compare), None otherwise (shape guard rejects non-string, wrong length, wrong separator, non-digit components). initial_plan AND-s expiry into enabled, writes valid_through + expired_on into the plan, and prepends a why line naming the date. default_enabled is not touched by expiry — a spend-gate can still tell "off by default" from "on but expired". Overlay channels with valid_through revert to off automatically the day after the date — the mechanism IS the reminder, no code change, no manual step. Suite: suite_r174_valid_through (18 checks a–s).

Panel counts stay at the 1.118.0 numbers (cheap 6, standard 12; --ask 4; chat channels off by default). Selftest in SOURCE after this release: 2517/2517 PASS (R174 И-1's 18 + R173 И-3's 8 + R172 И-2's 29 added since 1.118.2).

"Second opinion" without a panel name defaults to the cheap panel — the standard panel runs only when explicitly asked for.

  • SKILL.md description no longer says "every external reviewer voice at once" — the phrase caused AI agents to pass --panel standard when a user said "second opinion" without specifying a tier. The description now says "the default (cheap) panel" and carries a 🔴 rule: "second opinion" without a tier/panel name = cheap; NEVER pass --panel standard unless the user explicitly asks for it. The same rule is repeated in §0.0 Hard rules and §2.
  • AGENTS.md carries the same rule for AI agents that read the repository directly.
  • Flag table trimmed: --answer-cap, --attach, --strict-pii descriptions shortened to fit the new rules within the 5000-token auto-compaction budget.

Panel r171i3 review findings (A1–A10): the docs now state the worst case for a cheap round with DeepSeek (142 min, not "past an hour"); the OpenRouter 402 advice matches the vendor's remedy (retry after in-flight requests settle); the Qwen 403 cause text is softened; the page-fetch fence IDNA-normalises the host before the name check (Unicode spellings of *.ts.net are caught by the name rule, not only the IP rule); the selftest's fence check covers mapped IPv6, NAT64, 6to4, ULA, loopback, capitals and trailing-dot on every CI leg; the no-key fallback OFF is pinned; Tailscale Funnel pages are mentioned in SECURITY and TECHNICAL; Python floor 3.8→3.9 (aligned to CI); CHANGELOG lists z.ai/зетай; the suite_r153_i5 label covers glm too.

DeepSeek V4.1 Flash on NVIDIA's free key takes Step 5 Preview's seat in the cheap panel, with GLM 5.3 Flash as its fallback; «deepseek» and «glm» become family words; the page-fetch tool stops opening Tailscale addresses; CI is green again.

  • DeepSeek V4.1 Flash replaces Step 5 Preview, which kept failing real rounds. nvdeepseekv41flash runs on NVIDIA's free endpoint (NVIDIA_NIM_API_KEY) at effort max (NVIDIA accepts none..max; n=3 high against max overlapped, so no depth verdict), max_tokens 131072, timeout 61m, with the page-fetch tool and no web search. Its fallback is GLM 5.3 Flash on the same key (nvglm53flash: off as a voice, effort max, 20m), started once after the round when DeepSeek ends with under 2000 bytes of text, a timeout included. Without the key the plan names it and prints the fallback OFF in this run. ocstep5previewnv / nvstep5preview are off and start only by name. Counts on a machine with every key and CLI: cheap 6, standard 12, «CLI only» 3 (2 on a day opencode's free allowance was refused), --ask 4 (3).
  • Measured: the seat is slow, so plan for it. At 20 minutes one live review (~20K tokens of brief and diff) was still reasoning with no answer, hence 61. At 61 minutes the same review's first attempt died silently at 650 s; the automatic retry (the AUTO-RETRY rule, unchanged: the full budget again) answered at 3,556 s of 3,660 with 22 KB and 61,030 reasoning tokens, and opened no page. DeepSeek held that cheap round about 70 minutes. By the rules (not measured), a silent death late in the first attempt, a retry that times out and GLM's turn can hold it past two hours.
  • Family words: deepseek / дипсик and glm / глм / zai / z.ai / зетай are groups over every transport, as kimi and grok are. «не используй glm» also turns DeepSeek's fallback off; --only glm on the cheap panel stops with a route error, because its only startable member there is the paid orglm53; --only deepseek runs nvdeepseekv41flash.
  • The page-fetch fence: citecheck._resolve_public refuses every address that is not is_global and every *.ts.net name before resolving it. Python calls 100.64.0.0/10, the range Tailscale uses, neither private nor global, so such an address used to pass as public. One function serves the citation check and the page-fetch tool the API reviewers call; a reviewer had fetched a tailnet admin page through it.
  • Two more causes in diagnose(): Qwen Code's «403 Access to model denied» (the account's Token Plan lapsed or its monthly credits are spent: renewing is the owner's step, and re-running the brief on a paid channel is a spending decision, not a repair) and OpenRouter's «would exceed your available credits» (402; tokens generated before the refusal are billed).
  • CI green again (red on every release since 1.116.0). The Python 3.9 leg runs on ubuntu-24.04: setup-python has no 3.9 for Ubuntu 26.04, today's ubuntu-latest, so 1.116.0-1.117.2 never ran on 3.9. Three checks had not followed 1.116.0's utf-8 change: two Muse Code environment checks now admit the utf-8 variables, and R138 re-pins the grok bypass prompt (its only change is 1.116.0's utf-8 sentence). SKILL.md is back under its 5,000-token re-attach budget. These were checks lagging the code, not run defects; python selftest.py on an installed 1.116.0-1.117.2 printed the same failures. orchestrate.py loses the UTF-8 byte-order mark 1.116.0 put before its #! line.
  • Not in this release: a free voice's fallback still starts only after the whole round.

upgrade.py guard refinement: refuse only author-form targets (no run-behaviour change).

  • 1.117.1 refused any --to carrying .git — too broad: this machine's .config/opencode install itself lives in a git clone (kit-form content from past upgrades) and needs upgrades. The guard now reads the target's channels.json and refuses only author-form content (any prompt_suffix, or an enabled distribution: local channel — the kit ships neither), still naming the .agents / .codex junctions. Kit-form checkouts upgrade as before.

upgrade.py refuses a target that resolves to a source checkout (R166 follow-up, no run-behaviour change).

  • On this machine .agents/skills/model-orchestration and .codex/... are NTFS junctions to the author source tree (since 2026-09-30): their text differs, so the old same-folder check passed while copy_tree wrote straight through them into the working copy — twice kit-ifying the source (local channels off, prompt suffixes stripped, a stamped VERSION). An install never carries .git; the guard refuses any --to whose real path holds .git + channels.json (exit 2, nothing written) and names the junctions. The two junctions need no install at all — they read the live source.

The inner watchdog (R166): a Grok tool that starts and never finishes stops the run after 90 s of silence instead of the channel timeout.

  • _run_grok watches Grok's own session record every poll: a tool pending longer than GROK_TOOL_SILENCE (90 s, ORCH_GROK_TOOL_SILENCE overrides) kills the whole tree at once, with info["watchdog"] naming the tool and its age. A turn that already ended keeps the R165 linger grace; a hit channel timeout keeps its TimeoutExpired. The 2026-10-26 hang (run_terminal_command on a 97 KB pipe no parent drained, 40 min of silence, zero bytes) now costs ~90 s.
  • call_grokcli reports the stop as failed-with-partial: no answer text, no outfile (an armed fallback may still run it), a WATCHDOG warning, Grok's session note plus the stuck tool in the error, watchdog_tool / watchdog_stuck_s on the record. diagnose() names the stalled tool and says a longer timeout would not help.
  • Other CLIs unchanged: this harness has no per-tool progress signal for them (their output arrives at exit), so the watch is Grok-session-specific by measurement. selftest.py gains suite_r166_grok_tool_watchdog (stuck child stopped + tree dead, completing tool untouched, tracker unit, record shape, diagnosis).
  • Also in this release: source-tree repair after a kit→source overwrite (local channels, prompt suffixes, maintainer placeholder back in place; see TECHNICAL). No panel changes.

Older releases: the whole CHANGELOG.md of v1.120.1.