## kodustech/kodus-ai — web-1.2.4…web-1.2.5

_216+ commits._

### Features
- **feat(conversation): Kody answers unmentioned replies in its threads (#2011)** (7b18c2d)
- **feat(sandbox): fetch a same-host ssh submodule over https** (f019ab9)
- **feat(selfhosted): doctor says what stops or degrades reviews (#1989)** (d6049d5)
- **feat(quality): producers report what failed, not only how many (#1986)** (2c20e74)
- **feat(quality): every CI gate reports its signal (#1982)** (4e85844)
- **feat(quality): one BigQuery table for every quality signal (#1977)** (a814107)
- **feat(evals): --no-judge, so a dead judge stops costing the finder** (2815d66)
- **feat(evals): nightly DeepSeek run, Friday tier-0 smoke, PR wiring check (#1951)** (71e094d)

### Fixes
- **Merge pull request #2024 from kodustech/fix/trial-model-deepseek-v4p1** (ae838a4)
- **fix(evals): point the Fireworks flash evals at deepseek-v4p1-flash** (5b36866)
- **fix(llm): point e2e defaults at V4.1 Flash and guard the retired-id lookup** (361bbde)
- **fix(llm): move the trial model to DeepSeek V4.1 Flash** (1cd0754)
- **Merge pull request #2023 from kodustech/fix/2021-doctor-false-verdict** (d611b11)
- **fix(doctor): read the pre-seat skip reason from the stage log too** (9dceeb7)
- **fix(doctor): skips after the seat check clear a seat skip, earlier ones do not** (ed661ee)
- **fix(doctor): a later skip for another reason no longer hides a seat skip** (c575f5a)
- **fix(doctor): stop reporting fixed seats, leaking provider ids and ownerless model failures** (5cc3b3c)
- **Merge pull request #2013 from kodustech/fix/log-content-guard** (06c64ff)
- **fix(log): single-read tail sanitizer, full tail accounting, reserved root pool** (5501554)
- **perf(log): reject typed arrays in the tail before enumerating them** (108ede2)
- **fix(log): keep redaction and a byte cap on the post-exhaustion tail** (3b4d908)
- **fix(log): stop the budget from evicting small trailing keys** (365bbf2)
- **fix(docs): make language switcher navigate to translations (#2017)** (fad4ced)
- **Revert "fix(log): let each sink set its own budget ceiling"** (bf3476f)
- **Merge pull request #2016 from kodustech/fix/context-window-mirror-2026-09-25** (91d8d7e)
- **fix(log): let each sink set its own budget ceiling** (3ccda47)
- **fix(log): budget the emitted line, charge every value, guard every read** (f018342)
- **fix(log): bound the aggregate line size and guard every property read** (c79bff5)
- **fix(log): make describeOmitted exception-proof** (6a53341)
- **fix(log): keep customer source code out of logs and bound log line size** (6928cb4)
- **Merge pull request #2009 from kodustech/fix/e2b-paused-sandbox-leak** (f05bde7)
- **Merge pull request #2008 from kodustech/fix/2007-webhooks-boot-memory** (88c6ebc)
- **fix(sandbox): bound the orphan sweep listing** (50ffa07)
- **fix(api): log rejected billing timestamps, test the absent header for real** (3220e8d)
- **fix(sandbox): let the orphan sweep reap untagged legacy sandboxes** (2aaeac7)
- **fix(api): bind billing callback signatures to method, path and timestamp** (52e825d)
- **fix(sandbox): scope the orphan sweep to this deployment's sandboxes** (1d01a72)
- **fix(sandbox): project only leaseCount when detaching a lease** (863f66a)
- **fix(sandbox): keep in-flight consumers alive when retiring a lease** (be9554f)
- **fix(api): mount the billing raw-body parser on the controller's route** (83170c8)
- **fix: keep the webhooks boot-graph spec env-free, share the billing route prefix** (d008213)
- **fix(api): require the raw body for billing callbacks, pin the golden vector** (bdad3be)
- **fix(sandbox): don't kill a reconnect-failed sandbox before the lease TTL** (f91582e)
- **fix(sandbox): stop leaking paused E2B sandboxes** (d752e38)
- **fix(webhooks): serve billing callbacks from the api, drop Kody Rules from ingestion** (d66a91a)
- **Merge pull request #2005 from kodustech/fix/prod-error-triage-2026-09-22** (9d35bc3)
- **fix: address review on the triage PR** (16d0884)
- **fix: production error triage 2026-09-22/23** (3a92dea)
- **Merge pull request #1984 from kodustech/fix/1916-json-object-contract** (06d0884)
- **Merge branch 'main' into fix/1916-json-object-contract** (abc5d86)
- **Merge pull request #1991 from kodustech/fix/1939-empty-submodules** (2050ef9)
- **fix(sandbox): one path, one section; and stop requiring a dotted ssh host** (8c92cbd)
- **fix(docker): pnpm run in dev containers no longer installs dependencies (#2002)** (462a22e)
- **fix(llm): a Claude newer than the table still gets its effort (#1998)** (607dad4)
- **fix(sandbox): only fetch submodules the base branch already declares** (ecd60e2)
- **Merge pull request #1999 from kodustech/fix/gpt56-native-reasons-now** (838957d)
- **Merge pull request #1997 from kodustech/fix/context-window-mirror-drift** (0e93283)
- **fix(llm): refresh the context-window mirror without under-chunking Gemini 2.0** (b73edb6)
- **fix(selfhosted): doctor review follow-ups from #1989 (#1992)** (28d57dd)
- **fix(sandbox): namesOnly must not mangle a provider error into "Error"** (897a612)
- **fix(sandbox): one predicate for "nothing found", and both path separators** (bcb3552)
- **Merge pull request #1994 from kodustech/fix/adaptive-thinking-display** (f6de438)
- **fix(sandbox): mark the namesOnly grep path, and contain the submodule name** (8d239b0)
- **fix(sandbox): fetch submodules in the review checkout, and mark what stays empty** (bd2b179)
- **fix(llm): the managed/env default is not automatically json_schema** (0374f17)
- **fix(llm): let the module, not the executor, say when the flag downgrades** (f50ae95)
- **Merge branch 'main' into worktree-fix-1916-dedup-json-contract** (2ca266a)
- **fix(llm): give a json_object route the contract it never carried** (6d53938)
- **Merge pull request #1976 from kodustech/fix/1937-verifier-text-verdict** (87260e6)
- **fix(evals): mirror the parser's object scan, wrapper and key precedence** (7d064d7)
- **fix(evals): read the written verdict from the object, not the whole text** (af12a31)
- **fix(evals): stop the judge preflight from sending the golden as the key** (81bebe5)
- **fix(evals): read a written verdict the way JSON.parse reads it** (324c948)
- **fix(evals): give verifier-verdict the crypto key its imports read at load** (e46bdab)
- **fix(evals): fail before the finder is paid for, and on an unknown flag** (bc32f07)
- **fix(code-review): trace a recovered verdict back to its organization** (7ee1d67)
- **fix(evals): score a captured tool verdict from its payload, not its text** (d28f60d)
- **Merge remote-tracking branch 'origin/main' into fix/1937-verifier-text-verdict** (1170fba)
- **Merge branch 'main' into fix/1937-verifier-text-verdict** (74a5f1a)
- **Merge pull request #1901 from andyst-dev/fix/1841-large-pr-persistence** (8735d2c)
- **fix(evals): keep the infra budget honest after the merge (#1973)** (95aad43)
- **fix(code-review): let the verifier reach a verdict before its budget ends** (8e956c7)
- **fix(code-review): read a verifier verdict delivered as text** (16e60f0)
- **fix(preview): unbreak the preview overlay and stop proxying MCP anonymously (#1972)** (d8917c4)
- **fix(logger): stop credentials and Node internals from reaching logs (#1957)** (1440430)
- **Merge pull request #1967 from kodustech/fix/preview-webhook-url** (8ab5c87)
- **fix(preview): fail the stack when the webhooks URL is not supplied** (227c57f)
- **fix(preview): give previews a reachable webhook URL** (dd43102)
- **Merge pull request #1960 from kodustech/fix/1956-azure-hook-listing** (fb0ce2c)
- **fix(platform): resolve hook ownership instead of trusting listing order** (7995226)
- **fix(platform): replace Azure hooks Azure itself stopped delivering** (4679736)
- **fix(platform): scope Azure hook pruning to the team that created them** (3d195bc)
- **fix(platform): list Azure service hooks once per webhook pass** (664e557)
- **Merge pull request #1912 from andyst-dev/fix/1908-git-ref-signal-gate** (58cca21)
- **Merge pull request #1954 from kodustech/fix/prod-error-audit-2026-09** (5237375)
- **fix(llm): exclude the whole pre-5 two-digit range from OpenAI reasoner detection** (8fa8cc7)
- **fix(platform): don't crash the request-changes stage on incomplete critical comments** (8376c13)
- **fix(code-review): don't force GITHUB platform for uninferable trial-mode hosts** (0b3f1d9)
- **fix(llm): keep two-digit OpenAI reasoner ids after excluding gpt-35-turbo** (90fad0a)
- **Merge branch 'main' of github.com:kodustech/kodus-ai into fix/prod-error-audit-2026-09** (bc35d59)
- **fix(llm): stop the reasoner pattern swallowing Azure's gpt-35-turbo** (a75fd7e)
- **fix(platformData): fall back to a non-empty title for PR backfill** (e692dc6)
- **fix(platform): recognize GitHub's third line-mismatch error shape** (285cd31)
- **fix(organization): serialize concurrent code review config saves** (99ec314)
- **fix(api): don't crash agent conversations that omit teamId** (ac9958c)
- **fix(integrations): log platform auth failures through the structured logger** (e165367)
- **fix(code-review): skip integration lookup for trial-mode CLI reviews without a PAT** (c33e5b9)
- **fix(code-review): stop poisoning automation_execution UUID lookups with correlationId** (b7879a9)
- **fix(code-review): fix OpenAI json_object prompt requirement, thread organizationId through finder recovery** (edd3166)
- **fix(code-review): don't drop findings for out-of-range confidence, attribute LLM_ENVELOPE logs to an org** (77820da)
- **fix(llm): stop sending an explicit empty system message** (72cf908)
- **Merge pull request #1895 from kodustech/fix/1313-pr-decision-memory** (7f82b1d)

### Backend
- **Merge pull request #1922 from RainLib/feature/pr-summary-task-instructions** (2d6d463)
- **Merge pull request #1952 from Baicheng-MiQ/Baicheng-MiQ/gpt-6-astra-openai-model-facts-a86b** (7e853eb)

### Tests
- **test(evals): run the dedup eval through LLM.run, like the stage** (c9ab441)
- **test(sandbox): throw CommandExitError, not a bare Error, in the blob fixture** (7840028)
- **test(shared): freeze the clock in the getDayForFilter date test** (6e6757a)
- **test(sandbox): reject the base blob read when the ref is absent** (319df2b)
- **test(llm): gpt-5.6 native reasons now, and Bedrock hides the split not the cost** (d296f96)
- **test(llm): stop asserting reasoning where the transport cannot show it** (71ceb23)
- **test(llm): point the #1916 negative control at a provider that enforces the rule** (e1e7544)
- **test(code-review): make the #1916 e2e discriminate — it passed on main** (53dd875)
- **test(llm): close the two review threads that were still open** (2f2f3c7)
- **test(code-review): reproduce #1916 end to end, with the provider's rule as the double** (316d491)
- **test(llm): pin that the JSON contract is appended once, never stacked** (ed834de)
- **test(llm): cover the caller the issue is about, not just its route** (645b977)
- **test(evals): let observed.json own the production numbers** (0c02cf3)
- **test(evals): make verifier-verdict comply with the eval rules** (1e1ca68)
- **test(evals): register verifier-verdict in the suite and follow the shape layer** (a2a4851)
- **test(byok): live coverage for gpt-5.6, gpt-6, Vertex and Kodus (#1971)** (8a2813b)
- **test(evals): add the verifier-verdict delivery eval** (38c6ee7)

### Docs
- **docs(quality): feedback_items and feedback_daily DDL in signals.sql (#1990)** (47f8a27)
- **docs(evals): say which verdict shapes verifier-verdict refuses to read** (18da2a4)

### Chore
- **refactor(doctor): let the latest run decide the seat report** (87e19bf)
- **ci: route RC, benchmark and PR-test alerts to the tests Discord channel (#2022)** (cdb52e6)
- **chore(llm): refresh context-window mirror from upstream LiteLLM** (af24681)
- **refactor(api): thin billing controller, signature guard and use-cases** (2f005fb)
- **refactor(api): one canonical form for the billing route prefix** (c7e0ae3)
- **ci(preview): power off 2h after the last deploy; /preview comment wakes it (#2001)** (c5afe6c)
- **ci(hooks): pre-push runs affected tests and works in a fresh worktree (#1995)** (f1c2de2)
- **chore(quality): mirror read access moves to a dedicated pull SA (#1993)** (4c669a6)
- **ci(preview): one preview per shape, decided per pull request (#1981)** (2da2a37)
- **chore(llm): refresh the model context-window mirror** (10d36b0)
- **refactor(llm): one module lookup, and pin that the two wire sources agree** (3c7ac31)
- **chore(evals): invent the fixture scenarios instead of rewording real ones** (f60ae43)
- **chore(evals): strip customer-derived wording and trace ids from the fixtures** (2cd9304)
- **chore(runo): give the env's host what the jest gate needs (#1975)** (95a5ca1)
- **chore(evals): delete scripts nothing runs any more (#1970)** (4a35c6f)
- **ci(e2e): route matrix alerts to the tests channel, drop auto-issues (#1969)** (985170f)
- **ci: migrate Runo previews to the isolated Ohio server (#1959)** (0fa524f)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/kodustech/kodus-ai?utm_source=github-action)._