# Changelog

All notable changes to TachiBot MCP will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.33.0] - 2026-08-27

### Added
- **The writing family (`storm`, `re3`, `de_generic`)** — the library had creative *thinking* (`what_if`, `innovate`, `alt_view`, `creative_use`) and zero creative *writing*. Against a 7-stage pipeline, stage 4 (structure) and stage 5 (draft) were empty, and stage 6 (revise) fell to `reflexion`, which optimises toward *correct* — prose revision is cutting, rhythm and specificity, which is a different objective. 85 → 88 techniques.
- **`blog_writer`** — researched long-form in one call, composing `storm` and `re3` rather than carrying a private copy of their text. A copy would drift the moment either template was edited, and drift *silently*, because both paths still emit well-formed prose. `research: true` runs the persona interview first and feeds its 3 surprising answers into the four-pass write; `research: false` goes straight to the passes. 66 → 67 tools; enabled in `full`, `balanced` and `research_power`, off in `minimal`, `code_focus` and `heavy_coding`.

### Fixed
- **`preview_prompt_technique(technique="auto")` had no route for writing intent.** `RECOMMEND_RULES` carried no matcher for it, so "write a blog post" fell through to `CORE_TECHNIQUES.slice(0, 3)` — `chain_of_note` / `astute_rag` / `spotlighting` — while `list_prompt_techniques` advertised `auto` as the way in. Writing verbs now route to `storm`, `re3`, `de_generic`.
- **`blog_writer` truncated silently at `maxTokens: 8000`.** Its output is several full renderings of the same piece (`re3`'s draft, restructure and line-edit passes, plus `storm`'s 16 marked answers on the default research path), unlike sibling tools that emit one artifact. 8000 was already at the ceiling at the word count the docs use as their own example, and nothing errored on truncation. Raised to 16000.
- **The storm → re3 seam discarded its own outline.** `blog-writer-tool.ts` dropped storm's Stage 4 outline and word budgets and re-derived them from scratch in re3's Pass 1; they are now carried across.
- **Stale doc counts.** `TOOLS_REFERENCE.md` and `TOOL_PROFILES.md` claimed `continue_focus` sits outside the profile system and is not counted — `profiles/full.json` and the golden snapshot both count it. `skills/prompt/SKILL.md` still said 37 techniques (now 88) and was missing five filter categories (retrieval, security, few_shot, tabular, writing). README's per-profile table was one release behind before this work and two behind after.
- **Anti-drift tests could not detect drift.** The "uses the template rather than a private copy" tests asserted characteristic phrases that a copy would also satisfy; they now assert the engine's exact live output.

## [2.32.0] - 2026-08-15

### Added
- **`consilience` (`confidence_trajectory`)** — rank several runs by the SHAPE of their confidence rather than by majority vote; a run that was certain from its first line was guessing (arXiv:2608.09898). Landed in `9cfb71a`, after 2.31.0 shipped, and was missing from this file entirely — which is why the counts here read 37 → 74 → 84 while the tool reported 85.
- **Tabular family (7 new techniques)** — the library had nothing that matched data-shaped work, so "filter these rows" fell through to the generic core contracts. Every one of these exists because the failure it prevents is *silent*:
  - `data_assert` (`assert_dont_eyeball`) — state the downstream purpose, then check the data with executable assertions carrying counts. A filter that silently matched zero rows is indistinguishable from one that worked.
  - `self_debug` (`feed_the_traceback`) — feed the **actual** traceback back in and fix the smallest thing it implicates, capped at 3 rounds. Re-prompting from scratch throws away the only evidence you have.
  - `chain_of_table` (`table_walk`) — transform the table one operation at a time, showing the intermediate table and row count after each, until the table *is* the answer.
  - `sub_table_first` (`tabsqlify`) — extract the relevant sub-table and prune the schema with one explicit query, then reason over the small result instead of 10k rows.
  - `sql_stages` (`din_sql`) — text-to-SQL in four passes: schema-link → classify difficulty → generate → self-correct, capped at 2 correction rounds.
  - `xlsx_map` (`map_the_sheet`) — map a human-made spreadsheet before computing: merged cells, multi-row headers, formulas, and the subtotal rows hiding inside the data that double-count silently.
  - `table_format` (`pick_the_format`) — choose Markdown/HTML/CSV/JSON on purpose; format measurably changes accuracy, and long tables lose their middle.
- **Retrieval family completed (3 new)** — `astute_rag` (`conflict_check`) answers from memory first, then marks each source agrees/fills/conflicts and resolves every conflict out loud, because a wrong page silently overriding correct knowledge looks identical to the reverse; `crag` (`grade_the_sources`) grades sources correct/ambiguous/wrong and acts on the grade, since search always returns its nearest neighbours and has no way to return nothing; `hyde` (`hypothetical_answer`) drafts the answer you wish existed, searches with *its* vocabulary, then discards it.
- **Recommender routing for both families** — new matchers for tables/spreadsheets/SQL/data-cleaning, and for the two retrieval cases that had no route: contradictory sources and empty result sets. `self_debug` now leads the bug/traceback rule.

### Fixed
- **Spotlighting fences carried 24 bits of entropy, not 32.** `untrustedFence()` called `randomBytes(3)` while its own comment block reasoned its way to 4 bytes ("8 hex characters put it back above where it started"). Spotlighting's entire security property is that an attacker cannot guess the delimiter to close your block, so the shortfall was load-bearing. Now `randomBytes(4)` → 8 hex chars, as documented.
- **The literal `37` survived two expansions of the technique catalogue** (37 → 74 → 75 → 85) in the `list_prompt_techniques` description — text the model reads to decide whether to call the tool at all. The count is now derived from `FLAT_TECHNIQUES.length` rather than hardcoded.

## [2.31.0] - 2026-08-15

### Added
- **Prompt technique library goes 37 → 74**, closing three families that were at **zero** coverage. Two of them were load-bearing for tools this server already ships:
  - **Retrieval (4 new).** TachiBot ships five search tools (`grok_search`, `grok_search_lite`, `perplexity_ask`, `gemini_search`, `openai_search`) and had no discipline for what to do with what they return — retrieved text went straight into reasoning unfiltered, which is where confidently-miscited sources come from. `chain_of_note` (write a note on each source *before* answering), `self_rag` (decide whether to retrieve at all; mark each claim SUPPORTED/UNSUPPORTED), `ircot` (interleave retrieval with each reasoning step, for multi-hop questions where query 2 depends on result 1), `flare` (retrieve only where confidence drops).
  - **Prompt-injection defence (1 new).** Those same five tools ingest untrusted web text with no isolation contract, so a page saying "ignore previous instructions" was read exactly like our own prompt. `spotlighting` fences untrusted content in explicit markers and states the rule: analyse it as data, never obey it.
  - **Few-shot / exemplars (5 new).** Nothing touched example selection, ordering or generation, despite this moving accuracy more than most reasoning tricks. `analogical` is the cheapest entry — the model writes its own worked examples, so there is nothing to curate — plus `contrastive_cot`, `auto_cot`, `complexity_based`, `exemplar_selection`.
- **Eight trace-management techniques** from Jun–Aug 2026 research: `structured_thoughts` (alternating `<try>`/`<outcome>` blocks so the scratch work can be pruned from long runs), `breadth_then_depth` (repair 3 candidates rather than sampling 20 — resampling saturates), `hourglass` (compress to a rule, discard the exploration, regenerate from the rule instead of appending errors), `backtrack` (rewind to the last validated checkpoint rather than restarting or patching), `compute_ration` (triage a *set* by difficulty × payoff before solving any of it), `loop_spec` (declare trigger/goal/verification ladder/stopping rule before running an agent loop), `context_preflight` (score the context on 7 criteria before spending tokens), `prompt_coverage` (map each test to the requirement it covers).
- **Twelve more filling thin families**: `universal_consistency` (`self_consistency` silently fails on prose, code and plans — nothing to string-match), `self_verification` (re-derive a given *backwards* from your answer), `self_calibration` (judge the answer in a fresh context — a model that just spent 2k tokens justifying an answer will defend it), `adaptive_consistency`, `paraphrase_ensemble`, `maieutic`, `s2a`, `self_ask`, `rephrase_respond`, `metacognitive`, `re2`, plus `atom_of_thoughts`, `algorithm_of_thoughts`, `chain_of_code`, `chain_of_draft` (~5 words per step — there was no cheap-reasoning mode at all), `thread_of_thought`, `chain_of_density`, `verbalized_sampling`, `skeleton_parallel`.
- **Recommendation rules for all of it.** 74 techniques is past the point where anyone recalls names, so `RECOMMEND_RULES` gained eight groups matched to how people actually phrase the situation — search/cite → `chain_of_note`, untrusted/scraped → `spotlighting`, batch/each-of → `compute_ration`, vague/ambiguous → `rephrase_respond`, agent/loop → `loop_spec`, and so on. Without these the new techniques were reachable only by knowing their name in advance.

### Changed
- **Twelve original prompts rewritten to read as instructions.** The early set used telegraphic shorthand — `"X" systematic: components→relationships→patterns→strengths/risks→conclusions` — which reads as a label rather than a request and leaves the model to infer the task. Now: *"Analyse X systematically: 1) break it into its components, 2) map how those components relate…"*. Affects `what_if`, `alt_view`, `creative_use`, `investigate`, `evidence`, `analyze`, `first_prin`, `feasible`, `reflect`, `patterns`, `decompose`, `integrate`. A note in the source records the convention so the two styles don't diverge again.
- **Three new categories** (`retrieval`, `security`, `few_shot`) extend the `list_prompt_techniques` filter enum — the only wire-contract change in this release.

### Notes
- `skeleton_parallel` is deliberately named apart from the existing `skeleton`: the published Skeleton-of-Thought expands branches independently, ours expands sequentially. Same name upstream, different goal.
- **Consilience** (arXiv:2608.09898) was evaluated and deliberately **not** added — it ranks candidate runs by the temporal shape of their token-level confidence, which isn't available through an MCP prompt contract. A prose approximation would be cargo-cult rather than the technique.

## [2.30.1] - 2026-08-14

### Fixed
- **19 tool descriptions carried version-pinned model IDs.** Pinned strings ("GPT-5.2", "Kimi K3", "GLM-5.2", "Step 3.7 Flash", "424B MoE", "top AIME/GPQA") silently rot on every model bump and then actively mislead the routing model. All 19 were rewritten to name the provider and the task instead. Two were outright wrong: `openai_reason` and `openai_search` advertised "GPT-5.2" while the code actually calls the current OpenAI flagship tier.
- **`grok_search` had a 10-character description.** "Web search" gave the routing model no way to choose it over the four other search tools. It now states its live X/news grounding edge and cross-references `grok_search_lite` as the cheaper path.
- **The five OpenRouter reasoners were indistinguishable.** `deepseek_reason`, `glm_reason`, `stepfun_reason`, `ernie_reason` and `qwen_reason` previously differed only by vendor trivia; each now carries an actual routing rule for when to pick it.
- **manifest.json misdescribed the server.** It advertised "65 tools" (actual: 66), omitted the `heavy_coding` profile from the `TACHIBOT_PROFILE` help, and its `OPENAI_API_KEY` hint wrongly claimed that key powers the Qwen and QwQ tools — those route via OpenRouter.
- **`scripts/package-extension.sh` left the working tree unbuildable.** It ran `npm install --production`, pruning devDependencies and leaving `tsc` unable to build afterward (missing @types). It now restores the full dependency tree when it finishes.
- **The server reported itself as v2.0.0 on every connection.** `serverInfo.version` was hardcoded — a 12-tool era that ended ~28 minor versions ago — so Claude Desktop's connector panel misidentified which build was running. It now reads the real version from `package.json`, falling back to `0.0.0` rather than failing to start.
- **The `/setup` wizard quoted profile sizes that no longer existed** — "full (63, default), balanced (52), code_focus (41), minimal (13)". Corrected to the real six (full 66, heavy_coding 59, balanced 55 and the actual default, code_focus 43, research_power 37, minimal 14).

- **Correction to the v2.30.0 note: `grok-4.3` does grounded search.** That note claimed grok-4.3 "does not invoke web search either", which would have made `grok_search_lite` useless and justified deleting it. Re-probed 2026-08-15 against `/v1/responses` with `tools:[web_search,x_search]`, asking for today's date: **grok-4.3 returned 2 `web_search_call` entries and 1 citation in 10.4s; grok-4.6 returned 2 calls and 2 citations in 36.4s.** `grok_search_lite` is grounded, cheaper, and roughly 3–4x faster than `grok_search` — keep using it for high-volume lookups and jury fan-outs. `grok-4.5` remains the model that does not ground.
- **The cheap search tier now has its own grounding test.** The v2.30.0 probe only covered `grok_search`, so nothing contradicted the false claim above. `test/smoke/grok-search-grounding.test.ts` now probes `grok_search_lite` too, asserting a `web_search_call`, a citation, and that the served model equals the requested one.

### Notes
- No tools were added or removed; the tool count stays 66. The tool-contract golden baseline changed only in description text.

## [2.30.0] - 2026-08-14

Ten defects found by an MCP-compliance audit. Every one was verified against source or the live xAI API before being fixed; each carries a regression test.

### Fixed
- **`grok_search` was not searching.** It ran on `grok-4.5`, which never invokes the `web_search` tool on xAI's Agent Tools API — so it answered from training data while rendering a source footer and a "Search used up to N sources" line computed locally from `max_search_results`, not from actual usage. Probed 2026-08-14: asked the date, `grok-4.5` returned "October 10, 2025" with zero `web_search_call` entries; `grok-4.6` returned the correct date with two search calls and a citation. Repointed to `grok-4.6` (added to `GROK_MODELS`/`GrokModel`; same $2/$6 and 500K context as 4.5). The new test asserts *grounding* — presence of a `web_search_call` and ≥1 annotation — never the answer text, because a plausible ungrounded answer is exactly what hid this.
- **13 `console.log` calls corrupted the JSON-RPC stream.** stdout is the protocol channel on a stdio-transport MCP server. Sites in `provider-router.ts` (fired on every routed provider call), `smart-api-client.ts`, `scout.ts`, `challenger.ts`, `custom-workflows.ts` now use `console.error`. Guarded by a test that also rejects `console.info`, `console.debug` and `process.stdout.write`.
- **`create_workflow` silently destroyed user files.** `saveWorkflow()` checked `existsSync` on the *directory* and then wrote the *file* unguarded, so a name collision overwrote existing YAML with no warning. Now refuses unless `overwrite: true` is passed, and the success message reports the real `.tachibot/workflows/` path instead of `.tachi/workflows/`.
- **Eight prompt maps injected the literal string "undefined".** The `||` fallback sat *inside* the index (`approachPrompts[args.approach || 'analytical']`), so it only rescued an empty value — any unknown one still resolved to `undefined` and landed in the system prompt. Fixed in `grok_reason`, `grok_code`, `kimi_thinking`, `qwen_reason`, `deepseek_reason`, `glm_reason`, `stepfun_reason`, `ernie_reason`. Same class as 2.28.x's OpenAI fix.
- **`tool-mapper` ran the wrong model.** Its `qwen_algo` case called `QWQ_32B` with a generic prompt instead of Qwen3.8-Max with the algorithm-engineer protocol, and `qwq_reason` lost its 4-persona deliberation entirely — so a workflow step got a materially different tool than the MCP tool of the same name. Both now delegate to the real tool objects.
- **`planner_maker` emitted an invalid tool call.** Its `qwen_coder` step sent `{task, code, requirements}`, but that schema has no `requirements`, requires `query`, and `requirements` is not an input alias — so every agent execution of that step failed Zod validation.

### Changed
- Test suite 130 → 158 (157 passing, 1 opt-in live probe). The live grok grounding probe now requires `RUN_LIVE_TESTS=1` in addition to a key, so an ordinary `npm test` no longer fires a billed API call.

### Notes
- Golden snapshot unchanged: no tool name, description, or input schema moved. This release is behavior-only.
- `grok-4.6` is the current latest Grok, verified against `GET /v1/models`. There is no `grok-4.7` or `grok-5`.

## [2.29.0] - 2026-08-12

### Fixed
- **Failed jurors were synthesized as real opinions.** Every provider helper catches internally and RETURNS a marker string (`[Grok error: ...]`, `[OpenRouter timeout: ...]`) rather than throwing, so `jury`'s drop filter only ever caught typed throws from `callLocal`. A quota-limited juror reached the judge as a considered perspective. New `utils/provider-failure.ts` detects the markers; verified against all nine real provider error strings with no false positives on realistic answers.
- **The judge was told the wrong juror count.** The prompt interpolated `validJurors.length` while showing `liveJurors`, presenting a short-handed panel as full and miscalibrating every consensus claim. Counts now come from what the judge is actually shown, and dropped jurors are declared to it.
- **`grok_search_lite` advertised a model it wasn't using.** `grok-4-1-fast-non-reasoning` was retired by xAI, and the retirement is invisible: the API returns HTTP 200 and silently serves `grok-4.3`, disclosing the swap only in `response.model` (which the codebase discards). Nothing threw, so no fallback could fire. The tool billed $1.25/$2.50 while claiming $0.20/$0.50 and "~10x cheaper" in three user-visible places. Now points at `grok-4.3` explicitly with corrected claims — zero behaviour change, since 4.3 was already what ran.
- **`continue_focus` was unprofileable.** Emitted by the server but absent from `ToolsConfig` and all six profiles, so it could not be disabled by any profile including `minimal`, and was invisible to every count. Registered in all six (behaviour-preserving); `full` now reports 66, matching the emitted contract exactly.
- **The literal string `"undefined"` could be injected into reasoning prompts.** Five sites indexed a closed prompt map with the fallback inside the brackets (`modePrompts[x || 'default']`), so any value not in the map missed the lookup silently. Only `openai_reason` was reachable — its `mode` is a free string per the tool-param rule, which is precisely what removed the enum guard protecting the others.
- **`gemini-tools.ts` depended on import order for its API key.** It read `process.env` at module scope under a comment claiming "dotenv is loaded in server.ts before any imports" — false: `server.ts` is a 12-line dispatcher with no dotenv call, and `server-main.ts`'s `override: true` runs in its module body, after the whole static graph. It worked only because `grok-tools.js` calls `config()` eleven lines earlier in `registry.ts`. Now self-sufficient.

### Added
- **Judge fallback chain (`utils/judge-runner.ts`).** A single Gemini failure used to destroy an entire panel *after* every juror had run and billed. Judges now escalate: retry with backoff (honouring Google's `RetryInfo.retryDelay`) → degrade Pro→Flash → escalate to `gpt-5.6-sol` → return raw unsynthesized perspectives with an explicit warning. Wired into `jury`, `diff_review`, and `plan_critique`. Verified live against a real quota outage: Pro 429 ×3 → Flash 429 → sol answered in 7.5s.
- **`callGemini` retains the API error body**, which it previously discarded in favour of `statusText`. Google puts the useful part there — which quota was hit, and a `retryDelay` when the limit is transient rather than a plan cap.
- **`max` reasoning effort** for OpenAI. `gpt-5.6` accepts `none|low|medium|high|xhigh|max`, but `OPENAI_REASONING` stopped at `xhigh` and the zod enum rejected `max`, so nothing could request the top tier. The 180s timeout branch now covers it.

### Changed
- **Judge prompts rewritten** (`utils/judge-constants.ts`, shared by `jury` and `gemini_judge`, which carried drifting copies). Jurors are anonymized so the judge weighs reasoning rather than brand; the "You are Gemini 3 Pro" persona is gone (stale, and an invitation to self-preference bias); six stacked reasoning frameworks are replaced by decomposition into sub-claims tagged AGREED/CONTESTED/UNVERIFIED plus one adversarial pass; the impossible self-consistency instruction is removed (it requires sampling repeatedly, which one call cannot do); and the judge is told it cannot verify factual claims rather than being graded on "accuracy" it has no means to assess.
- **OpenAI pricing corrected** for the Jul 30 2026 cut: terra $2.50/$15 → $2/$12, luna $1/$6 → $0.20/$1.20. `MODEL_COSTS` had luna 5x over reality, skewing cost-aware routing.
- **`optimization/model-router.ts` refreshed.** Its `ModelTier` enum was routing live workflow traffic to Mar-2026 models (`gpt-5.4`, `gpt-5.4-pro`, `gemini-3-flash-preview`), and no current model appeared in its cost table, so every one fell through to a flat $0.001 estimate.
- **`openai_reason` runs `xhigh`** (was `high`). `max` is deliberately not the default — OpenAI recommends reserving it for hardest-case work.
- **`openai_search` moves to `gpt-5.6-terra`** (was `sol`). Web search bills a flat $10/1k calls regardless of model, so the model is the only cost lever, and it was set to the most expensive option. All 5.6 tiers support `web_search` identically.

### Verified, not changed
- **Gemini 3.1 Pro is still the newest Pro model** — no 3.5 Pro or 4 has shipped. Confirmed against Google's live docs by two independent sources plus a direct `models.list` probe (HTTP 200, exact id match). Grok 4.5 likewise remains flagship. No Codex-specific OpenAI model exists; the `CODEX*` constants are legacy aliases.

## [2.28.0] - 2026-08-03

### Added
- **Qwen3.8 Max** (`qwen/qwen3.8-max`) registered in `OpenRouterModel` and `QWEN_MODELS`. Alibaba's flagship 3.8-series model, general-availability on OpenRouter as of today (Aug 3, 2026). 1M context (up from the 262K of the model it replaces), multimodal input (text+image+video), 131K max completion, $2/$6 per M with cache reads at $0.25/M. It is the **first Qwen model exposing `reasoning_effort`**.
- **`reasoning_effort` option on `callOpenRouter`** (`"low" | "medium" | "high"`) — forwarded to the OpenRouter request body only when set. OpenRouter drops the parameter for models that don't list it in `supported_parameters`, so the quota-fallback chain stays safe.
- **`qwen/qwen3.7-max`** registered as the intermediate fallback tier.

### Changed
- **`qwen_algo` and `qwen_reason` move to Qwen3.8 Max** (from `qwen/qwen3-235b-a22b-thinking-2507`). Verified live against a range-query algorithm problem (offline BIT / persistent segment tree): 3.8 Max produced the most complete answer of the five Qwen candidates tested — the only one to flag both the offline-vs-online tradeoff and the strict-inequality-with-duplicates edge case. The outgoing 235B Thinking model was correct but shallow; `qwen3.7-max` cost 1.6x for twice the wall time. `qwen/qwen3-max-thinking` was rejected outright: it returns 0 reasoning tokens, so its fast/cheap result is not a thinking pass.
- **`reasoning_effort` is pinned to `"medium"` on every Qwen3.8 call site — never left unset.** Measured on one `qwen_algo` call with the full tool prompt: default effort 302s / 14991 completion tokens / $0.091, `high` 353s / 17521 tokens / $0.106, `medium` 48s / $0.018, `low` 38s / $0.014. On the quality probe, `medium` (18s, $0.006) hit both depth markers that `high` did, while `low` dropped the online-alternative discussion. For reference the outgoing 235B model took 169s and $0.036 on the same prompt for a *shorter* answer — so `medium` is faster, cheaper, and deeper than what it replaces, while the default would have been a 6x latency and 2.5x cost regression.
- **Output budget for both tools raised 8000 → 12000 tokens** — headroom for the visible answer. Note that reasoning tokens are billed as completion tokens but are *not* charged against `max_tokens` by this provider (a 12000-cap call returned 17521 completion tokens).
- **`qwen_reason` juror** (`jury-tool.ts`) also moves to Qwen3.8 Max, likewise pinned to `"medium"` — the panel waits on its slowest juror, and default effort would have parked it at ~5 minutes.
- **`MODEL_FALLBACKS`**: `qwen3.8-max` → `qwen3.7-max` → `qwen3-235b-a22b-thinking-2507`.
- **`getOpenRouterModelTimeout()`** now routes `qwen3.8` and `qwen3.7-max` to the 600s extended bucket — neither ID contains `thinking`/`reasoning`, so they would otherwise have inherited the 180s default despite being reasoning models.
- **`TOOL_DEFAULTS.qwen_algo` / `.qwen_reason`** and `CURRENT_MODELS.openrouter.qwen_reason` updated to match the wired values.
- Tool description and system prompt for `qwen_reason` renamed from "Qwen3-Max-Thinking (>1T params, 98% HMMT)" to Qwen3.8 Max; golden tool-contract snapshot regenerated (this description is the only contract change — tool count stays 65).

### Unchanged
- **`qwen_coder`, `qwen_competitive`, and `testgen` stay on `qwen3-coder-next`** — it is coding-specialized and ~16x cheaper ($0.12/$0.80 vs $2/$6). Qwen3.8 Max is the reasoning tier, not the codegen tier.
- `deepseek_algo` (DeepSeek V4 Pro) remains the primary recommendation for algorithmic review; `qwen_algo` is now a stronger runner-up.

## [2.27.1] - 2026-07-26

### Changed
- **Kimi K2.7-Code → K3** (`moonshotai/kimi-k3`, released Jul 16 on OpenRouter, verified via WebSearch + grok_search against OpenRouter/Moonshot docs): 2.8T-parameter open-weight MoE — the largest open model shipped — built for long-horizon coding, reasoning, and agent workflows. 1M-token context (up from 262K), native multimodal, tool calls, structured outputs. Beats Claude Opus 4.8 and GPT-5.5 on coding and general-agent benchmarks. List price **$3/$15 per M (4x K2.7-Code's $0.75/$3.50)** — accepted per the repo's quality-over-cost model strategy. Now powers all Kimi tools — `kimi_thinking`, `kimi_code`, `kimi_decompose`, `kimi_long_context` (`openrouter-tools.ts`), the `kimi` juror (`jury-tool.ts`), and the Kimi seat on the `diff_review` panel. K2.7-Code kept as quota fallback via `MODEL_FALLBACKS` (K3 → K2.7-Code → K2.6 → K2-Thinking); the `kimi` substring already routes K3 to the 600s reasoning timeout (regression test extended).
- **Gemini Flash 3.5 → 3.6** (`gemini-3.6-flash`, GA Jul 21): the new workhorse/search tier — 1M ctx, **$1.50/$7.50 (down from $9 output)**, ~17% fewer output tokens than 3.5 Flash. Powers `gemini_search` and the `"flash"` choice in the workflow tool-mapper. 3.5 Flash kept as the previous tier.
- **Gemini Flash-Lite 3.1 → 3.5** (`gemini-3.5-flash-lite`, Jul 21, $0.30/$2.50) — catalog/pricing entry only; no tool calls this tier today.
- **Qwen general-purpose constant 3.6-Plus → 3.7-Plus** (`qwen/qwen3.7-plus`, Jun 3, 1M ctx, multimodal, $0.32/$1.28) — catalog/pricing entry only; `QWEN_MODELS.PLUS_*` is not wired to any tool (the Qwen tools use `CODER_NEXT` and `MAX_THINKING`).
- **`diff_review` panel label corrected** — the OpenAI seat was labelled "GPT-5.5" while already calling `OPENAI_MODELS.DEFAULT` (`gpt-5.6-sol`). Label and tool description now say GPT-5.6 Sol; no model change.

### Notes
Full provider audit run Jul 26, 2026 — every model in `model-constants.ts` checked against live provider docs/OpenRouter. Verified current, **no bump needed**:
- **GPT-5.6** (sol/terra/luna, Jul 9) — no GPT-5.7. Only `gpt-realtime-2.1` (specialized voice) shipped since.
- **Grok 4.5** (Jul 8) — no Grok 4.6/5; Grok 5 has no confirmed date. xAI's staged rollout completed (EU access Jul 17), so the `grok-4.3` fallback is now quota/region insurance rather than a rollout workaround.
- **Gemini 3.1 Pro** stays the reasoning/judge default — Google shipped three models on Jul 21 (3.6 Flash, 3.5 Flash-Lite, 3.5 Flash Cyber) and **explicitly skipped 3.5 Pro**; it missed internal perf goals, with Gemini 4 pre-training already underway.
- **DeepSeek V4 Pro/Flash** — V4 went GA Jul 20; `deepseek/deepseek-v4-pro` is unchanged and no V5/R2 is announced. DeepSeek's Jul 24 alias retirement only affects direct-API `deepseek-chat`/`deepseek-reasoner`, which this repo never calls (all DeepSeek traffic goes through OpenRouter).
- **GLM-5.2** — current; GLM-5.5 is an unconfirmed August target with no published endpoint.
- **MiniMax M3**, **StepFun Step 3.7 Flash**, **ERNIE 4.5 VL** — all still the newest available on OpenRouter (no ERNIE 5.x listing).
- **Perplexity** `sonar` / `sonar-pro` / `sonar-reasoning-pro` — naming unchanged.
- **Qwen coder** stays `qwen3-coder-next`; no `qwen4-coder` exists on OpenRouter. `qwen_reason`/`qwen_algo` deliberately stay on `qwen3-235b-a22b-thinking-2507` — Qwen3.7-Max is newer and agent-tuned, but publishes no thinking/reasoning mode, so swapping a dedicated reasoning model for it would risk a regression on the math/CP workloads those tools serve.

Second-pass sweep of the remaining constants (Jul 27) — all confirmed already-newest, nothing bumpable:
- **Qwen 4 Coder** (Jun 2, 32B-A3B, ~82% SWE-Verified) is real but is **not listed on OpenRouter** — no callable ID across its 76-model Qwen catalog — so it is unreachable on the gateway every Qwen tool uses. `qwen3-coder-next` remains the newest dedicated Qwen coder.
- **QwQ line** has no successor: only `qwen/qwq-32b` and the older `qwq-32b-preview` exist; Qwen3+ superseded the line for reasoning.
- **Grok specialists** verified against docs.x.ai: `grok-build-0.1` is still the only Grok Build model string (the "v0.2.73" in release notes is the *agent product*, not the model), and `grok-code-fast-2` is unannounced.
- **ERNIE 5.1** still has no published weights, no Hugging Face repo, and no OpenRouter listing — it is Qianfan-API-only, so `baidu/ernie-4.5-vl-424b-a47b` stays.
- **Grok 4.6** is the next expected bump: 2T params, confirmed by Musk Jul 18, pre-training finished the week of Jul 20, ETA "~2 weeks" (early Aug), with 4.7 ~2 weeks behind. No ID/pricing/context published yet — a watch note now sits in `GROK_MODELS`.
- K3's weights were due under a Modified MIT license by Jul 27; the API is live regardless, so this bump does not depend on the weight drop.

## [2.23.3] - 2026-06-17

### Changed
- **GLM-5.1 → GLM-5.2** (`z-ai/glm-5.2`, released Jun 13 on OpenRouter, verified via grok_search + web): Zhipu's open-weights flagship for long-horizon tasks — usable 1M-token context (up from agentic-tier 5.1), two thinking-effort levels (High/Max). SWE-Bench Pro 62.1 (up from 58.4), Terminal-Bench 2.1 81.0 (up from 62.0); beats GPT-5.5 on several long-horizon coding benchmarks at ~1/6 the cost. List price $1.40/$4.40 per M (262K max output). Powers `glm_reason` and the `glm` juror. GLM-5.1 kept as quota fallback via `MODEL_FALLBACKS` (GLM-5.2 → GLM-5.1 → GLM-5); the `glm` substring already routes 5.2 to the 600s reasoning timeout.

## [2.23.2] - 2026-06-15

### Changed
- **Kimi K2.6 → K2.7-Code** (`moonshotai/kimi-k2.7-code`, released Jun 12 on OpenRouter, verified via grok_search): coding-specialized variant built on K2.6 — +21.8% on Kimi Code Bench v2 with lower token use, 262K context, native multimodal, always-thinking mode. List price $0.75/$3.50 per M. Now powers all Kimi tools — `kimi_thinking`, `kimi_code`, `kimi_decompose`, `kimi_long_context` (`openrouter-tools.ts`) and the `kimi` juror (`jury-tool.ts`). K2.6 kept as quota fallback via `MODEL_FALLBACKS` (K2.7-Code → K2.6 → K2-Thinking); the `kimi` substring already routes K2.7-Code to the 600s reasoning timeout (regression test added).

### Notes
- No general-purpose Kimi K2.7 exists yet — K2.7-Code is the only post-K2.6 release. The coding-tuned model now also serves the reasoning/long-context tools and the kimi juror.

## [2.23.1] - 2026-06-11

### Changed
- **MiniMax M2.7 → M3** (`minimax/minimax-m3`, released May 31 on OpenRouter, API-verified via grok_search): 1M-token context (up from 200K), MSA sparse attention (~1/20 compute at 1M ctx vs prior gen), native multimodal, tuned for long-horizon agentic work. Same promo pricing as M2.7 ($0.30/$1.20 per M). Powers `minimax_code`, `minimax_agent`, and the `minimax` juror. M2.7 kept as quota fallback via `MODEL_FALLBACKS`.

## [2.23.0] - 2026-06-11

### Changed
- **Tool registration via central scan registry** — merged the tool-standardization refactor (PR #5): all provider tools register through `src/tools/registry.ts` + `defineModelTool` factory, with golden wire-contract tests (57 tool schemas snapshot-locked) and a plop `add-tool` generator. No behavior change; the registered tool surface is byte-identical.
- **Jury: removed the `hermes` juror** — it was a persona variant of `local` calling the same `LOCAL_LLM_MODEL` weights while claiming "You are Hermes" (a false-role prompt). Council-reviewed rationale: jury independence comes from different model weights, not different system prompts on the same backend. `hermes` is kept as a **legacy alias** of `local`; panels are deduped after alias mapping, so `jurors: "hermes,local"` now yields one local vote instead of two correlated ones. 12 jurors total.
- Docs now describe the Hermes connection honestly (verified via grok_search against Nous docs/GitHub): the local juror runs whatever `LOCAL_LLM_MODEL` points at, e.g. a Nous Hermes build via Ollama. The Hermes *agent* is model-agnostic — it consumes 300+ backends (GPT, Claude, Gemini, self-hosted Ollama/vLLM); it is not an OpenAI-compatible endpoint to point `LOCAL_LLM_BASE_URL` at.

## [2.22.0] - 2026-06-10

### Added
- **Four new reasoning providers** via OpenRouter: **DeepSeek V4 Pro** (`deepseek_reason`, `deepseek_algo` — open-weight frontier math/CP, top AIME/CodeElo), **Zhipu GLM-5.1** (`glm_reason` — SWE-Bench Pro leader, agentic tool-use), **StepFun Step 3.7 Flash** (`stepfun_reason` — efficient reasoning at flash-tier cost), **Baidu ERNIE 4.5 VL** (`ernie_reason` — broad knowledge, human-preference strength). Each with quota fallbacks and 600s reasoning timeouts.
- **Local model provider** (`local_query`): any OpenAI-compatible server — Ollama, LM Studio, llama.cpp, vLLM. Ollama gets the native `/api/chat` endpoint so `num_ctx` is honored; failures raise a typed `LocalLLMError`. Configure via `LOCAL_LLM_BASE_URL` / `LOCAL_LLM_MODEL` / `LOCAL_LLM_NUM_CTX`.
- **Jury roster expansion**: new jurors `deepseek`, `glm`, `stepfun`, `ernie`, `hermes`, `local` (13 total). New lab-diverse default panel: `grok, deepseek, kimi, openai`. Offline jurors are dropped (not error-leaked) when the local server is down.
- **Three new Claude Code skills**: `/lens` (long-context analysis over Kimi's 256K window), `/reflect` (grounded reflexion loop against external evidence), `/tot` (Tree-of-Thought with jury-based branch pruning). 12 skills total.
- `deepseek_algo` is now the lead model in `/algo` (strongest algorithmic review).

### Changed
- Profile counts: minimal 12, code_focus 34, research_power 35, balanced 45, heavy_coding 50, full 57.
- Merged the `local-models-ollama` release line (v2.21.3–v2.21.5): Gemini 3.5 Flash search tier, Grok 4.3 default, Kimi K2.6 repoints.

## [2.21.5] - 2026-06-04

### Fixed
- **Kimi tools were calling a retired model.** All Kimi call sites hardcoded `moonshotai/kimi-k2.5`, which OpenRouter no longer serves — every `kimi_*` request failed with a JSON/timeout error (surfaced as "Kimi down"). The model config (`KIMI_MODELS.K2_6`) was already correct but unused by the tools. Repointed all 5 call sites — `kimi_thinking`, `kimi_code`, `kimi_decompose`, `kimi_long_context` (`openrouter-tools.ts`) and the Kimi juror (`jury-tool.ts`) — to `moonshotai/kimi-k2.6`.
- Fixed the `MODEL_FALLBACKS` entry for `KIMI_K2_6`, which pointed at the retired `KIMI_K2_5`; it now falls back to `KIMI_K2_THINKING` (`moonshotai/kimi-k2-thinking`, still live).

### Notes
- The `KIMI_K2_5` enum value is retained for back-compat but is marked do-not-call; `moonshotai/kimi-k2.5` is no longer a valid OpenRouter model ID.

## [2.21.4] - 2026-06-01

### Changed
- **Grok bumped `grok-4.20` → `grok-4.3`** (xAI's Apr 30 2026 flagship). All Grok roles (`grok_reason`, `grok_code`, `grok_debug`, `grok_brainstorm`, `grok_search`, `grok_architect`) now resolve to `grok-4.3`: 1M context, lowest hallucination rate, and **cheaper** ($1.25/$2.50 vs 4.20's $2/$6). Pricing entry dropped `0.004` → `0.001875`.
- `grok-4.3` is a single model ID with **configurable reasoning effort** (replacing 4.20's reasoning/non-reasoning/multi-agent split). `callGrok` now (a) treats `grok-4.3` as a long-timeout flagship (180s) and (b) forwards `reasoning.effort` for `grok-4.3` as well as multi-agent — so `grok_architect` keeps its `high`-effort behaviour.
- Repointed `CURRENT_MODELS.grok`, `MODELS.GROK`, workflow `model-router` routing, `ModelProviderRegistry` alias, and `config.ts` available-models list to `grok-4.3`.

### Added
- `GROK_MODELS._4_3` / `GROK_MODELS._BUILD` constants (+ `GrokModel.GROK_4_3`, `GROK_4_3_LATEST`, `GROK_BUILD`). `grok-build-0.1` (May 29 2026 coding specialist, 256k ctx) added as a constant for future wiring.
- Display name, pricing, OpenRouter-gateway mapping (`x-ai/grok-4.3`), cost-monitor entry, and ANSI terminal labels (all 4 style maps) for `grok-4.3`.

### Notes
- Legacy `GROK_4_20_*` enum keys are retained (now resolving to `grok-4.3`) for back-compat; grok-4.20 itself was **not** retired by xAI and remains a valid fallback.

## [2.21.3] - 2026-05-29

### Added
- **Gemini 3.5 Flash** (`gemini-3.5-flash`) — went GA at Google I/O on 2026-05-19. Now the Flash/search tier: `gemini_query` (`flash`), `gemini_search` grounding, and `tool-mapper` `flash` routing all resolve to it via `GEMINI_MODELS.FLASH`. Agentic/coding focus, 1M context, $1.50/$9 per M tokens. SWE-bench Verified 78.8%, Terminal-bench 76.2%.
- Display name + pricing for `gemini-3.5-flash`; ANSI terminal labels in all 4 style maps.

### Changed
- `GEMINI_MODELS.FLASH` alias bumped `gemini-3-flash-preview` → `gemini-3.5-flash`. The legacy `GEMINI_3_FLASH` constant is retained for `model-router.ts` cost tiers.

### Notes
- **Reasoning default unchanged** — `gemini.default` stays `gemini-3.1-pro-preview`. Gemini 3.5 **Pro** is not yet released (announced at I/O, expected June 2026, no API model ID). Swap the default to 3.5 Pro once it ships.
- No OpenAI change: GPT-5.5 (Apr 23) remains the latest flagship; no GPT-5.6 exists.

## [2.21.2] - 2026-05-04

### Fixed
- Test suite: dropped stray `vitest` import in `strip-markdown` test (project uses Jest).

### Docs
- Backfilled CHANGELOG entries for v2.20.0 and v2.21.0.

## [2.21.1] - 2026-04-26

### Changed
- **OpenAI: gpt-5.4 → gpt-5.5** (released 2026-04-23). Agentic-focused, 1.1M context, omnimodal. Pricing $5/$30 per M tokens. `gpt-5.5-pro` ($30/$180) for premium tier. `gpt-5.4-mini` retained for `code`/`explain` tools (no `gpt-5.5-mini` released yet).
- **Kimi: kimi-k2.5 → kimi-k2.6** (released 2026-04-20). 1T MoE, leads SWE-bench Pro for long-horizon coding. Pricing ~$0.74/$4.65 per M tokens. K2.5 retained as fallback.

### Added
- **Qwen3.6-Plus** (`qwen/qwen3.6-plus`) registered in `QWEN_MODELS.PLUS_3_6`. New April 2026 general-purpose flagship at $0.325/$1.95 per M. Not yet wired as default — `qwen3-coder-next` (coder) and `qwen3-235b-thinking-2507` (reason) remain primary; awaiting `qwen3.6-coder` variant.
- Display names + pricing for `gpt-5.5`, `gpt-5.5-pro`, `kimi-k2.6`, `qwen3.6-plus`, `qwen3-235b-a22b-thinking-2507`.
- Auto-fallback: `kimi-k2.6` → `kimi-k2.5` on quota errors.

### Notes
- Grok 5 not released (Q2 2026 expected). Keeping `grok-4.20-0309-reasoning`.
- Gemini 3.5 in preview, GA expected at Google I/O May 2026. Keeping `gemini-3.1-pro-preview`.
- Verified all model IDs against live OpenAI `/v1/models` and OpenRouter `/v1/models` endpoints before release.

## [2.21.0] - 2026-04-13

### Added
- **Auto-alias param names** — `z.preprocess()` hook in `safeAddTool` remaps `query` ↔ `problem` ↔ `prompt` ↔ `question` ↔ `topic` before Zod validation. LLMs that reach for the wrong synonym now succeed instead of hard-failing with `-32602 InvalidParams`.
- **Zero per-tool changes** — single source of truth in `src/utils/param-aliases.ts`; every tool benefits automatically.
- **11 unit tests** in `src/utils/__tests__/param-aliases.test.ts` covering directional aliasing, primary-wins precedence, and missing-key behavior.

### Notes
- Primary param value always wins when both primary and alias are provided.
- Aliasing is transparent to tool implementations — the Zod schema sees the canonical key.

## [2.20.0] - 2026-04-10

### Changed
- **Grok 4 → 4.20** — all defaults moved to flagship.
  - `grok_reason` / `grok_search` → `grok-4.20-0309-reasoning` (low hallucination, 2M context)
  - `grok_architect` → `grok-4.20-multi-agent-0309` (4–16 parallel agents)
  - `grok_code` / `grok_debug` / `grok_brainstorm` → `grok-4.20-0309-non-reasoning` (fast turn-around)
- **Smart timeout defaults bumped** — OpenAI 20→60s base, Grok max 90→120s.

### Added
- **AbortController on OpenAI** — 90s default, 180s for high-reasoning. No more hung calls.
- **AbortController on Grok** — 60–180s based on model.
- **`reasoning` param** on `callGrok` for multi-agent invocation; unified `GrokModel` enum.

### Fixed
- Stale `gpt-4-mini` → `gpt-5.4-mini` in architect + workflows.
- Hardcoded `grok-4-0709` references across 6 scattered files (OpenRouter gateway, ANSI badges, model-router, tool-mapper).

### Docs
- Updated `docs/API_KEYS.md` and `docs/TOOL_PARAMETERS.md` for Grok 4.20.

## [2.19.3] - 2026-03-21

### Fixed
- **Section header regex** — now matches mixed case + optional dashes (works across all providers, not just Gemini)
- **Planner 5/1 bug** — `parsePlanSteps` now matches `### Task [T-ID]:` format (was only matching `### Step N:`)
- **Planner mismatch warning** — surfaces parse failures instead of masking with `Math.max`

## [2.19.2] - 2026-03-21

### Added
- **Rotating pastel section headers** — 6 colors cycle per response: lavender, mauve, powder blue, sand, mint, peach
- **Indigo tool name badge** — replaces gray summary badge with soft indigo (61) + nerd font icon
- **Rounded corner tables** — markdown tables rendered as aligned ASCII with `╭─┬─╮ │ │ ╰─┴─╯` box-drawing
- **Color-coded verdicts** — pastel 256-color: sage green (151) pass, soft yellow (186) partial, rose (174) fail
- **Tables in FORMAT_INSTRUCTION** — models now allowed to use `| table |` format
- **Spacing** — blank line between badge bar and first section header

### Changed
- **Emoji palette** — verdict 👩‍⚖️, sections use 🧠

## [2.19.0] - 2026-03-21

### Added
- **Sparse render mode** (`RENDER_OUTPUT=sparse`) — lightweight output formatting with ~72 tokens overhead per response
- **ANSI model badges** — colored background badges for model name (provider color) + tool name (charcoal bg)
- **Pastel section headers** — emoji section headers (`🧠 HEADER ───`) rendered as teal bg + dark bold text badges
- **Color-coded verdicts** — `✅ pass` (sage green), `🫠 partial` (soft yellow), `💀 fail` (rose) with colored bg badges
- **Summary badge** — tool name displayed as bold charcoal badge next to model badge
- **`stripMarkdown` options** — `{ boldHeaders: true }` converts markdown/emoji headers to ANSI-styled badges
- **Empty input guard** on `stripMarkdown` — early return for empty/whitespace input
- **Strip markdown headers** — `##` prefixes and `───` decorators removed from output
- **8 unit tests** for `stripMarkdown` covering headers, bold, bullets, code blocks, HR, empty input

### Fixed
- **ANSI truncation corruption** — truncate raw content BEFORE applying ANSI badges (prevents mid-escape code corruption)
- **Summary badge without model** — tools returning null from `inferModelFromTool` (think, focus) still show tool name badge
- **Unused imports** — cleaned up 10+ unused imports/variables in server.ts

### Changed
- **Emoji palette** — analysis 🧠, insight 🔮, key 🗝, verdict 👩‍⚖️ (replaced 🔍🧿🪩🎯)
- **Auditor/Challenger** — use `EMOJI_PALETTE` constants instead of hardcoded emoji
- **Planner** — topological task ordering with T-ID preservation and Dependencies metadata

## [2.18.0] - 2026-03-21

### Added
- **Goal-oriented checkpoints** — `planner_maker` and `planner_runner` now accept `goal` parameter for success criteria tracking
- **6 checkpoint gates** with 5 different models (no adjacent repeats): step1 (Gemini Sherlock), 10% (Grok), 25% (GPT + amendment protocol), 50% (Qwen), 80% (Kimi decompose), 100% (GPT+Gemini dual judge)
- **Reflexion Lite** — at 100%, Gemini reflects on what worked/failed, lesson saved to devlog
- **Amendment protocol** — at 25%, structured plan revision (evidence + proposed changes + impact) with human gate
- **Unblinded checkpoints** — `diff`, `testResults`, `modifiedFiles` params replace blind `code.substring(0,1500)` with real evidence
- **`files` param on all analysis tools** — 39 tools across 9 files can now read ACTUAL CODE from disk via `readFilesIntoContext()`
- **Shared `src/utils/file-reader.ts`** — reusable file reader with line range support (`file.ts:100-200`), size limits, directory expansion
- **Blueprint skill updated** — `goal` param, prompt template, `planner_runner` as default execution path

### Fixed
- **Step index reset bug** — filtered arrays used local index instead of original step number (found by 3-model consensus: Kimi + Gemini + Qwen reading actual code)
- **Truncation indicators** — `code.substring()` now adds `[truncated]` so judge models know they're seeing partial code

## [2.17.2] - 2026-03-21

### Added
- **`files` parameter on 13+ more tools** — grok_architect, grok_brainstorm, grok_reason_v4, openai_explain, kimi_code, kimi_long_context, gemini_judge, gemini_brainstorm, gemini_query, gemini_summarize, qwq_reason, qwen_competitive, qwen_general (38 tools now support `files`)
- **Directory expansion in file reader** — pass `src/tools/` to read all code files in a directory (non-recursive, capped at 20 files)
- **Smart char budget** — multi-file reads distribute token budget across files to prevent context overflow

## [2.17.1] - 2026-03-21

### Fixed
- **kimi_decompose readability overhaul** — output now uses OVERVIEW/STRUCTURE/DETAILS/RISKS sections instead of dense inline metadata
- **Reasoning leak stripped** — Kimi K2.5 dumps CoT into content; now extracted via `<output>` tags with OVERVIEW fallback
- **Conflicting FORMAT_INSTRUCTION removed** — emoji headers and verdict lines no longer clash with decomposition formatting
- **Heartbeat interval fixed** — was incorrectly set to 240s instead of default 5s; network timeout now correctly passed to callOpenRouter (360s)
- **Type safety** — args typed from zod schema, unused `log` removed, `||` replaced with `??`

### Changed
- **Smart decomposition** — model now infers context, constraints, risks, and measurable criteria even when user doesn't state them
- **Tuned for format adherence** — temperature 0.3 (was 0.5), maxTokens 4500 (was 6000), timeout 360s (was 180s default)

## [2.17.0] - 2026-03-21

### Changed
- **GPT-5.4-mini added** — new fast/efficient coding model (400k context, $0.75/$4.50 per 1M tokens, SWE-Bench 54.4%)
- **Code tasks use gpt-5.4-mini** — replaces `gpt-5.3-codex` for `openai_code_review` and explain tasks (94% of flagship quality, 70% cheaper)
- **GPT-5.3 series retired** — `gpt-5.3-codex` and `gpt-5.3` removed from all registries; coding capabilities absorbed into `gpt-5.4`
- **Model lineup simplified** — now just `gpt-5.4` (flagship), `gpt-5.4-mini` (coding/fast), `gpt-5.4-pro` (expert)

### Added
- Display name, pricing, fallback chain, model router, and ANSI style entries for `gpt-5.4-mini`
- `gpt-5.4-mini` falls back to `gpt-5.4` if unavailable

### Removed
- `gpt-5.3-codex` and `gpt-5.3` from all model registries, OpenRouter mappings, provider configs, and style themes (backward-compat aliases preserved)

## [2.16.1] - 2026-03-06

### Changed
- **Gemini 3.1 Pro migration** — switched from `gemini-3-pro-preview` to `gemini-3.1-pro-preview` before March 9 retirement (1M context, enhanced reasoning)
- Removed stale `gemini-3-pro-preview` entries from display names and pricing tables

## [2.16.0] - 2026-03-06

### Changed
- **GPT-5.4 upgrade** — default OpenAI model bumped from `gpt-5.2` to `gpt-5.4` (most capable, Mar 2026, $2.50/$15 per 1M tokens)
- **GPT-5.4-pro** — expert model upgraded from `gpt-5.2-pro` to `gpt-5.4-pro` ($30/$180 per 1M tokens)
- **GPT-5.3-codex** — new agentic coding model for `openai_code_review` (Feb 2026)
- **GPT-5.3** — new fast instant model available as option
- **Gemini 3.1 Flash-Lite** — added as option (released Mar 3, fastest/cheapest in 3.1 series)
- **Token limits bumped** — GPT-5.4 reasoning tokens eat into `max_output_tokens`, so all OpenAI tools bumped (reason: 8000, brainstorm: 6000, code_review: 6000, explain: 4000, search: 8000)
- **Brainstorm min floor** — enforces 4000 token minimum to prevent truncation from reasoning overhead
- **Pricing updated** — all model pricing tables updated with actual March 2026 rates

### Fixed
- **`openai_brainstorm` "No response from OpenAI"** — eliminated fragile `callOpenAIWithCustomParams` duplicate; brainstorm now uses `callOpenAI` with retry/fallback logic like all other OpenAI tools
- **`isGPT52` → `isGPT5`** — model detection now matches all `gpt-5.x` models, not just 5.2

### Removed
- **`callOpenAIWithCustomParams`** — duplicate of `callOpenAI` without retry logic; was the root cause of brainstorm failures

## [2.15.6] - 2026-02-26

### Fixed
- **Full audit: 6 tools had required enum anti-pattern** — Claude couldn't fill required enums correctly, causing MCP -32602 errors. Fixed `usage_stats`, `openrouter_multi`, `gemini_judge`, `planner_maker`, `planner_runner`, `create_workflow`
- **`gemini_judge`** — had zero required params. Made `perspectives` required as primary content param
- **`openrouter_multi`** — `model` enum now optional (default: `qwen-coder`)
- **`planner_maker` / `planner_runner`** — `mode` enum missing `.optional()` before `.default()`
- **`create_workflow`** — `type` enum now optional (default: `custom`)
- **`usage_stats`** — `action` enum now optional (default: `view`), added `query` param

### Changed
- **`perplexity_reason` downgraded** — `sonar-pro` ($3/$15/M) → `sonar-reasoning` ($1/$5/M), 3x cheaper
- **`perplexity_research` removed** — `sonar-deep-research` ($5/$25/M) was burning $12 in 3 days

## [2.15.5] - 2026-02-26

### Fixed
- **`qwen_coder` parameter validation** — Claude was putting queries in `task` enum or omitting it. Added `query` as required primary param, made `task` optional (default: `analyze`). Removes `requirements` param
- **`kimi_code` parameter validation** — same fix: added `query` as required primary param, made `task` optional (default: `review`)
- **`minimax_code` parameter validation** — same fix: added `query` as required primary param, made `task` optional (default: `review`)
- **`kimi_long_context` parameter validation** — made `task` enum optional (default: `analyze`), `content` remains the required primary param
- **Updated callers** — `prompt-technique-tools.ts` and `qwen-wrapper.ts` adapted to new `query` param

### Changed
- **Gemini 3.1 → 3.0 Pro rollback** — reverted from `gemini-3.1-pro-preview` to stable `gemini-3-pro-preview` (3.1 has widespread timeout/503 issues)
- **Gemini timeout 30s → 90s** — Pro models need longer than Flash, bumped default

## [2.15.2] - 2026-02-19

### Changed
- **Gemini 3 → 3.1 Pro** — upgraded from `gemini-3-pro-preview` to `gemini-3.1-pro-preview` across all tools, model router, cost tables, and display names
- **Gemini 30s timeout** — added AbortController timeout to `callGemini()` and `gemini_search` to prevent hanging requests

### Fixed
- **`gemini_judge` parameter validation crash** — `perspectives` param now accepts `query` or `text` as fallbacks. AI clients that pass content in the wrong parameter no longer get MCP -32602 errors

## [2.14.7] - 2026-02-05

### Added
- **`gemini_judge` tool** — dedicated LLM-as-a-Judge evaluation tool backed by science (Gu et al., arXiv:2411.15594). 4 modes: synthesize, evaluate, rank, resolve. Integrates chain-of-thought, first-principles, tree-of-thoughts, and adversarial reasoning techniques
- **`jury` tool** — multi-model jury panel. Runs configurable jurors (grok, openai, qwen, kimi, perplexity, minimax, qwen_reason) in parallel, then Gemini judge synthesizes a unified verdict. Based on "Replacing Judges with Juries" (Cohere, arXiv:2404.18796)
- **`gemini_search`** added to tools.config.json (was missing)

### Changed
- **Perplexity models fixed** — `SONAR_PRO` now correctly uses `"sonar-pro"` (200K ctx) instead of `"sonar"` (was using the lightweight model by mistake). Removed deprecated `SONAR_SMALL`. Added `SONAR_REASONING` enum
- **`perplexity_research` upgraded to `sonar-deep-research`** — single call to Perplexity's exhaustive research model (synthesizes hundreds of sources) instead of 5-7 parallel `sonar-pro` calls. 10-min timeout for deep reports
- **Smart routing updated** — judge keywords now route to `gemini_judge` instead of `gemini_analyze_text`
- **`general-judge.yaml` workflow** — uses `gemini_judge` tool with proper `perspectives`/`question`/`mode` params
- **ModelProviderRegistry** — added `gemini-judge` mapping with aliases `gemini-synthesize`, `gemini-verdict`
- **Profile tool counts** — full: 50, heavy_coding: 44, balanced: 38, research_power: 30

## [2.14.6] - 2026-02-05

### Changed
- **qwen_coder upgraded to Qwen3-Coder-Next** — replaced `qwen/qwen3-coder` (480B MoE) with `qwen/qwen3-coder-next` (80B/3B MoE, 262K context, SWE-Bench >70%). 3x cheaper ($0.07/$0.30 per M tokens), 2x context window, better benchmarks. Hybrid attention architecture (Gated DeltaNet + Attention) optimized for agentic coding
- **Auto-fallback** — Coder-Next falls back to legacy 480B coder on provider failure
- **Updated model defaults** — Scout, Challenger, Verifier now route Qwen queries through Coder-Next
- `qwen_algo` (QwQ-32B) and `qwen_reason` (235B-Thinking) unchanged

## [2.14.5] - 2026-02-02

### Added
- **Tool annotations** — all 35+ tools now have MCP-standard annotations (`title`, `readOnlyHint`, `openWorldHint`, `streamingHint`). Improves `/mcp` display and tool discovery via ToolSearch
- **`src/utils/tool-annotations.ts`** — centralized annotation registry
- **`src/utils/stream-distill.ts`** — `truncateSmart()` for paragraph-boundary-aware truncation; distillation logic ready for future use when Claude Code supports display/context separation
- **25K character safety net** — responses capped with smart truncation to prevent Claude Code's 30K background task truncation

### Changed
- **ANSI rendering removed from tool results** — replaced `renderOutput()` with `stripMarkdown()` in `safeAddTool()`. Claude Code CLI does not render markdown in tool result blocks, so decorative formatting (`**bold**`, `*italic*`, `` `code` ``) is now stripped while structural elements (`#` headers, `-` bullets, numbered lists, `>` blockquotes, `|` tables, code block content) are preserved
- **`stripMarkdown()` rewritten** — code blocks protected via placeholder extraction (prevents corrupting code samples); `*` bullets normalized to `-` before italic stripping; `_italic_` skip added to avoid mangling `snake_case` identifiers
- **`kimi_decompose` prompt improved** — dependency graph now uses box-drawing characters (`├─ └─ ──►`) for visual clarity; task cards use indented tree format with acceptance criteria
- **Heavy Coding profile** — enabled `openai_code_review` and `openai_explain` (40 → 42 tools)
- **Wildcard permission** — replaced 30 individual `mcp__tachibot-mcp__*` entries in `~/.claude/settings.json` with single `mcp__tachibot-mcp__*` wildcard

### Fixed
- **Token overhead reduced to ~x1** — removed ANSI escape code overhead (~x1.5-2x) and Ink rendering overhead (~x12x). Tool results now return clean plain text at baseline token cost
- **`truncateSmart()` marker overflow** — marker length now subtracted from cap before truncating, ensuring output never exceeds the specified limit

## [2.13.0] - 2026-01-30

### Removed
- **@types/yaml** — stub package; `yaml` ships its own TypeScript definitions
- **ink-box** — deprecated; use Ink's built-in `<Box>` component
- **js-yaml** + **@types/js-yaml** — redundant YAML parser; consolidated on `yaml` v2
- **cli-highlight** — unmaintained (5 years); replaced with `highlight.js` wrapper
- **ts-node** — stalling ESM support; replaced with `tsx`

### Added
- **highlight.js** — direct dependency replacing cli-highlight for syntax highlighting
- **tsx** — modern TypeScript execution for ESM projects (devDependency)
- `src/utils/syntax-highlight.ts` — lightweight highlight.js-to-ANSI wrapper with default theme and function-based theme support

### Changed
- **Node engine requirement** bumped from `>=20.19.0` to `>=22.0.0` (Node 22 active LTS)
- `src/validators/syntax-validator.ts` — migrated from `js-yaml.load()` to `yaml.parse()`
- `src/utils/ansi-renderer.ts` — switched to local syntax-highlight utility
- `src/utils/ink-markdown-renderer.tsx` — switched to local syntax-highlight utility

## [2.12.1] - 2026-01-29

### Changed
- **Heavy Coding** is now the default profile (40 tools) — ships as `activeProfile` in `tools.config.json`
- Updated profile description and README to reflect default status
- Updated `tools.config.json` available tools list with new Kimi tools and `list_plans`

## [2.12.0] - 2026-01-29

### Added
- **Kimi K2.5 Suite** — 3 new tools expanding Kimi from 1 to 4 tools:
  - `kimi_code` — SWE-focused code generation/fixing (SWE-Bench 76.8%), temp=0.3, 240s timeout
  - `kimi_decompose` — Structured task decomposition with Agent Swarm reasoning, dependency graphs, parallel subtask identification, acceptance criteria. Output formats: tree, flat, dependencies
  - `kimi_long_context` — Long-context document analysis (best-effort 256K context window), 5 task types (summarize/extract/analyze/compare/find), 300s timeout
- **Planner: kimi_decompose integration** — `planner_maker` now includes a Decomposition phase using `kimi_decompose` to break tasks into subtasks with dependency ordering before synthesis
- **Planner: 80% checkpoint** — `planner_runner` now supports 50%, 80%, and 100% verification checkpoints. The 80% checkpoint uses `kimi_decompose` to decompose remaining work into granular subtasks, ensuring nothing is missed before the final push

### Fixed
- **z.number() coercion bug** — MCP clients send numbers as strings (e.g., `maxSteps: "3"`), causing Zod validation failures. Replaced `z.number()` with `z.coerce.number()` at 3 parameter locations (temperature, maxSteps, steps). Added `.int().min().max()` constraints for maxSteps and steps

### Changed
- All 6 profiles updated with new Kimi tools (enabled in all except minimal)
- Profile tool counts: Minimal 12, Research Power 28, Code Focus 28, Balanced 36, Heavy Coding 40, Full 48
- `planner_maker` synthesis steps now include task decomposition output for better-structured plans
- `planner_runner` description updated to document 80% checkpoint and kimi_decompose integration
- Server registration updated: "Qwen, Kimi x4, MiniMax"

## [2.3.1] - 2025-12-28

### Fixed
- **gemini_analyze_text** and **gemini_analyze_code** now work via nextThought
  - Added missing cases in ToolExecutionService switch statement
  - Added parameter mapping (`text:` and `code:` params)
- **TACHIBOT_FINAL_JUDGE** env var now properly resolves as default judge

### Changed
- **balanced profile** now includes `gemini_analyze_text: true`
- Removed noisy memory save hint from nextThought output

### Added
- **TACHIBOT_FINAL_JUDGE** env var - Set default final judge model (e.g., `gemini`)

## [2.3.0] - 2025-12-28

### Added
- **Context Window String Aliases** - Use `"none"`, `"recent"`, `"all"` instead of magic numbers (0, 3, -1)
- **finalJudge** - Auto-call a judge model when session completes with `nextThoughtNeeded: false`
- **Context Distillation** - Compress 8000+ tokens to ~500 with `distillContext: "light" | "aggressive"`
- **Memory Provider Hints** - Pluggable memory system (devlog, mem0) returns hints for Claude to execute
- **usage_stats Tool** - Track tool usage with ASCII bar charts, per-repo statistics
- **general-judge Workflow** - Multi-model council (Grok, Perplexity, Qwen, Kimi) with Gemini extraction + GPT synthesis
- `src/utils/memory-provider.ts` - Hint-only formatter for memory MCPs
- `src/utils/model-availability.ts` - Centralized model availability checks

### Enhanced
- **nextThought** now supports:
  - `contextWindow: "none" | "recent" | "all"` (clearer than 0/3/-1)
  - `finalJudge: "gemini"` - Auto-executes judge with ALL context
  - `distillContext: "light"` - 5x token savings
  - `memoryProvider: { provider: "devlog" }` - Session persistence hints

### Example Usage
```typescript
// With string aliases and finalJudge
nextThought({
  thought: "Analyze the problem",
  model: "kimi",
  executeModel: true,
  contextWindow: "recent",  // Last 3 thoughts
  nextThoughtNeeded: true
})

nextThought({
  thought: "Final verdict",
  model: "grok",
  executeModel: true,
  contextWindow: "all",     // Full history
  finalJudge: "gemini",     // Auto-called!
  nextThoughtNeeded: false
})
```

## [2.2.7] - 2025-12-28

### Added
- **Enhanced nextThought with multi-model execution**
- **Multi-Model Judgment Protocols** in CLAUDE.md:
  - Protocol 1: Parallel Council (subagents for context isolation)
  - Protocol 2: Sequential Pipeline (progressive refinement)
  - Protocol 3: Adversarial Debate (pro vs con)
  - Protocol 4: Architecture Decision (focus modes)
- Model name normalization (spaces/underscores → hyphens)
- Model aliases in registry: `grok-search`, `grok-reason`, `gemini-judge`, etc.

## [2.0.3] - 2025-11-18

### Changed
- Updated OpenAI models from GPT-5 to GPT-5.1 series
- Updated default model to `gpt-5.1-codex-mini` for better code generation
- Added GPT-5.1 reasoning effort levels (none, low, medium, high)
- Changed default active profile from `research_power` to `full`
- Improved model configuration in workflows and tool mapper
- Updated model constants and defaults throughout codebase

### Fixed
- Model references in iterative-problem-solver workflow
- Model references in scout workflow
- Model references in ultra-creative-brainstorm workflow

## [2.0.2] - 2025-11-15

### Fixed
- OpenAI GPT-5.1 API integration
- License correction from MIT to AGPL-3.0 in package.json

## [2.0.1] - 2025-11-10

### Changed
- Updated README with comprehensive API key documentation
- Added missing GEMINI_API_KEY and OPENROUTER_API_KEY to installation examples
- Improved documentation clarity

## [2.0.0] - 2025-10-15

### Added
- Complete rewrite with 12 essential tools (reduced from 80+)
- Multi-model orchestration with GPT-5, Gemini, Grok, and more
- Tool profiles system (minimal, research_power, code_focus, balanced, full)
- Perplexity integration for web search and reasoning
- Grok-4 integration with live search capabilities
- Workflow system for multi-step tool sequences
- Challenger tool for critical thinking and verification
- Scout tool for hybrid intelligence gathering
- Verifier tool for multi-model consensus
- PingPong collaborative brainstorming
- Cost optimization and tracking features
- Session management with logging and export
- Comprehensive .env.example with all configuration options
- GitHub Actions workflows for CI/CD
- Community health files (CONTRIBUTING, CODE_OF_CONDUCT, SECURITY)

### Changed
- Simplified from 80+ tools to 12 essential ones
- Improved token efficiency (2.6k tokens vs 30k+)
- Better environment variable handling
- Deferred API key loading for better performance
- Modular architecture for easier maintenance
- Cleaned up workflows to use only existing tools

### Fixed
- Environment variable loading in MCP context
- API key configuration issues
- Build errors with missing personality module

### Security
- No hardcoded API keys in source code
- All sensitive data in environment variables
- Security policy and responsible disclosure process

## [1.0.0] - 2024-12-01

### Initial Release
- Original version with 80+ tools
- Basic multi-model support
- Initial MCP server implementation

---

Note: This is a side project maintained in spare time. Updates may be irregular.