Skip to content

v0.10.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Sep 14:56
· 7919 commits to main since this release
Immutable release. Only release title and notes can be modified.
cf3f9f3

[v0.10.0] - 2026-09-28

Highlights

Bug Fixes

  • (frontend) Admin-only controls are hidden from non-admins instead of offered and then refused: the Feature Flags settings tab, the telemetry toggle (its public state display stays visible), and theme install/uninstall. (#16494)
  • (infra) Adding an apt repository during provisioning now retries with a bounded backoff, so one transient keyserver or repository-host failure (gpg: keyserver receive failed) no longer aborts the whole play. A repository that still cannot be added once the retries are spent stops the deploy as before, but now only after up to five attempts 10 seconds apart, so a permanent failure such as a mistyped or retired repository takes up to about 50 seconds longer to surface. (#17230)
  • (backend) An admin can now propose an orphan-storage deletion for human approval (POST /api/admin/orphan-storage/deletion-requests), and an approval naming an action no handler is registered for is refused when it is created rather than recorded as a failure after someone approves it. (#17315)
  • (backend) Agent-terminal session creation now refuses (404) a conversation_id the caller does not own, so a user can no longer bind another user's conversation and inherit its pending command approval. (#17422)

Commit Log

Bug Fixes

  • (deps+security) Consolidate six packages into the constraints SSOT and confine repo_path (#17304, #17300) (#17309) (#17309)

  • (security) Close an arbitrary file write and two path-injection holes (#17300) (#17301) (#17301)

  • (pricing) Migrate LLM cost tracking off hardcoded price tables (#16230, #16233, #16316) (#17187) (#17187)

  • (rag) Preserve per-view provenance and multiplicity through RRF fusion (#17207) (#17216) (#17216)

  • (code-intelligence) Wire the code indexer and give the graph its own collection (#4835, #17254) (#17256)

  • (deploy) Provisioning aborts on every non-manager host, and the failure summary hid it (#17240, #17242, #17243, #17244) (#17241)

  • (slm-tests) Real-load capability_tiers and node_capability (#15495) (#17206) (#17206)

  • (billing) Record LLM spend from the chat path and both compat gateways (#16845) (#16853) (#16853)

  • (gui) Defect sweep — escaped entities, dead styles, unserved sockets, missing hygiene page (#17153) (#17153)

  • (ansible) Cert provisioning chain — own privilege, and before nginx's install (#16020, #17172) (#17184) (#17184)

  • (ci) Baseline a secrets false positive and re-pin the SLM-frontend contract ratchet (#17174) (#17174)

  • (frontend) Stop routing build through npm-run-all2's broken {@} re-spawn (#17169)

  • (slm) Stop repair's own success clearing itself via fetchOrphans (#17157)

  • (ci) Keep test_self_update_systemd_detach_11492.py at its frozen 691-line ceiling (#17150)

  • (tests) Set _ansible_dir_explicit on the init-skipping test double (#17150)

  • (updater) Re-detect ansible_dir per execute_playbook call, not once at construction (#17150)

  • (slm) Address bb's review nits on the Data hygiene page (#17040)

  • (ci) Re-pin hooks-path-override 6486 -> 6488 for the security batch (#17154)

  • (security) Match injection patterns against what a model reads, not the raw text (#16354)

  • (security) Redact secrets in npu_client log, bound ReDoS-vulnerable regexes (#17104)

  • (docs,tests) Re-point four THREAT_MODEL anchors and drop two forbidden line citations (#17147)

  • (ci) Re-pin hooks-path-override 6484 -> 6486 for the consolidated batch (#17147)

  • (approvals) Dispatcher records every failure to reach a handler's own trail (#17141)

  • (knowledge,plugin_sdk) Resolve connector/jsonschema imports lazily, not at package init (#17138)

  • (sync) Is_shallow_repository distinguishes "not shallow" from "could not tell" (#17118)

  • (ci) Re-pin prompt-injection-detector-strict-mode floor 2940 -> 2944 (#17072)

  • (ci) Re-pin hooks-path-override floor 6473 -> 6481 (#17072)

  • (security,tests) Give the human-gated approve-command tests a human, re-anchor THREAT_MODEL, collect the validation-handler tests (#17134)

  • (repo_tests) Re-pin the four ratchets the merged train moved, and split the reason table out (#17134)

  • (deploy) Run the pre-flight unshallow from the synced source, not the not-yet-updated install (#17137)

  • (ssot) Drop the step executor's stale timeout baseline entry now it reads an env var (#17074)

  • (security) Take the harness's human role from the RBAC Role enum (#17052)

  • (agents) One PTY command runner for the agent terminal and the overseer (#17078, #17079)

  • (agents) Multi-line output, truncation and the deadline edge in agent command results (#17074)

  • (agents) Agent commands finish when they finish; a timeout is never a success (#17074)

  • (agents) A chat-granted conversation keeps its agent session owned; one locked singleton (#17053)

  • (agents) Agent-terminal sessions act only for their owner or an admin (#17052)

  • (security) Allowlist 9 non-secret literals the whole-tree scan flags — model revision SHA, reasons hash keys, X-API-Key header name (#17087)

  • (api) Isort + a runtime auth negative control for #16375

  • (api) Import get_current_user before the router that depends on it (#16375)

  • (i18n) Route TranscriberLayout's settings labels through vue-i18n (#16335)

  • (kb) Rename legacy shared-facts key to a backup, audit each migration (#16709)

  • (kb) Default migrate_shared_facts_index.py to dry-run, require --apply (#16709)

  • (kb) Share_facts routes through the canonical ownership index (#16709)

  • (security) Stop the model integrity check from failing open (#16899)

  • (security) Allowlist #17087's new pinned-SHA occurrences in the reasons file

  • (ci) Audit 2 pre-existing i18n Secret Keyword false positives (#13034)

  • (ai-ml) Resolve #16899 CI reds — SSOT URL dup, black, secrets baseline (#13034)

  • (secrets) Route SYSTEM-visibility UI secrets to the envelope vault (#17099)

  • (security) Resolve #16444's CodeQL red -- reuse secret_log_ref, not a raw id (#16428)

  • (secrets) The vault mirror's failure log names a registry label, not a tainted parameter (#16444)

  • (guards) Trim secrets.py by one line instead of raising its ratchet (#16428)

  • (secrets) Enforce ownership on the connector-bridge read path (#16428)

  • (secrets) Give GET and PUT their own value-key contract for a bridged secret (#16428)

  • (secrets) An empty credentials dict is present, not absent (#16428)

  • (auth) A failed key-request audit write answers an explicit 503, never a bare 500 (#16294)

  • (security) An agent nobody classified is refused to an external originator, not reached unchecked (#16957, #16950)

  • (security) Key A2A trust on the verified credential presenting a peer id, with an audited admin re-grant (#16950)

  • (security) Remove DISCOVERY -- the agent card is public by protocol design, so no trust level can restrict it (#16957)

  • (security) An A2A peer's task is refused the agents its trust level may not reach (#16957, #16950)

  • (security) A token a parent holds costs a claude_code child its Bash when no finer tool covers it (#16950)

  • (security) Only the trusted overlay can give a run an executor identity (#16950)

  • (security) A delegated subagent inherits its parent's authority, so it cannot do what the parent is held from (#16950)

  • (approvals) Pin decided_at's ALTER COLUMN to UTC, add a non-UTC-session test (#17072)

  • (approvals) Match decided_at's column type, fix post-downgrade query (#17072)

  • (approvals) Fix migration CI red — bind/cast SQL bug and downgrade round-trip (#17043)

  • (approvals) Close 4 review gaps on the general/LLC unification (#17043)

  • (rest-train) 8 CI reds on vehicle-v090-2026-09-19-rest (#17133)

  • (ci) Rest-train reds — SLM publisher contract accepts templated build:slm, sanitized source-delete error, audited doc placeholder (#17133)

  • (agents) Retain the idle-notice publish task via fire_and_forget; allowlist a fake test key (#16949)

  • (ci) Make same-scope batching check vehicle-aware and advisory (#17128)

  • (updater) Filter _sd_own_marker_is_legacy through | bool at assignment (#16310)

  • (updater) Unshallow code_source and re-bootstrap legacy markers (#16310)

  • (media) Parse office and ODF documents instead of plain-texting them (#16784)

  • (hooks) Repair pre_push_open_pr_cap_17006_test's sandbox for #16728's selection call (#17008, #16711)

  • (ci) Address open-PR cap review findings (#17006)

  • (tests) The deploy_artifacts lockstep test binds the module it registers onto the parent, so the two never diverge (#16722)

  • (tests) The slm services stub is a hollow package, not a MagicMock with a path (#16722)

  • (tests) The services stub answers pytest's package-module attributes, so Package.setup doesn't read an invented pytest_plugins (#16722)

  • (tests) The slm conftest's services stub carries path, so pytest never re-imports the real package over it (#16722)

  • (hooks) Pre-push selects tests by pytest.ini's python_files, so a changed test_*.py runs (#16711)

  • (analytics) Sanitize error text, direct registered_source_ids() tests (#17065)

  • (backend) Close the remaining fail-open gaps and surface outages (#17039 review)

  • (backend) Fail closed on a source-registry outage (#17039 review)

  • (slm) Address #17096 review — SSOT autobot.base_dir, restart-write race, malformed-tracker robustness, exhaustion cause (#16020, #16712, #16970)

  • (slm) Stop services/*_test.py collection from leaking the real package into sys.modules (#16020, #16712)

  • (slm) Ensure the shared TLS cert on vnc/redis-only nodes and persist the reconciler's service-restart cap (#16020, #16712)

  • (deploy) Ensure the shared TLS cert for vnc/redis-only nodes, persist the reconciler's service-restart cap, fix a hardcoded frontend path (#16020, #16712, #15603)

  • (ci) Repoint the hardcoded-values baseline at the renamed frontend path (#15603)

  • (deploy) Drop the dead exec_start from the user-frontend manifest too (#15603)

  • (deploy) The user-frontend build sites publish through a staged swap (#15603)

  • (agents) Claim an agent id atomically, answer a shed request at once, one overload log per episode (#16986)

  • (agents) Bound in-flight handlers and inboxes, one live owner per channel, peer requests through tracking and claims (#16986)

  • (agents) The peer channel delivers to the recipient, broadcast reaches every other agent, a forwarding hop gets its reply (#16986)

  • (agents) Clamp presence env vars, real tenancy test, per-company isolation (#16947, #16965)

  • (agents) Wire production callers for the presence registry (#16947, #16965)

  • (agents) Refuse AI_STACK peer messages with no wired drain (#16948)

  • (agents) Extract the shared heartbeat-run join to kill duplication (#16947)

  • (agents) Wire real busy/idle for SESSION and AI_STACK presence (#16947)

  • (agents) Persist tenant_id across a session's Redis reload (#16975)

  • (agents) Fail-closed tenancy for presence, tenant-scoped list_live (#16947)

  • (repo_tests) Re-pin prompt-injection-detector-strict-mode floor for #17048's combined population (#17129)

  • (security) Echo the bearer subprotocol when the intelligent agent accepts a WebSocket (#17000)

  • (ci) Pr-preflight.sh mentions python-suite now that it is required (#17129)

  • (security) Audit 2 remaining unaudited base-branch secret findings (#17130)

  • (repo_tests) Unblock python-suite on main -- 6 more failures (#17129)

  • (repo_tests) Record #15317's .service/.service.j2/docker/*.yml globs (#17124)

  • (knowledge) Carry forward legacy-id facts instead of duplicating them (#17124)

  • (knowledge) Scope claude_memory_importer's fact_id by owner (#17124)

  • (repo_tests) Add tracked reasons for #17102's 18 carried .secrets.baseline entries (#17108)

  • (security) Audit #13708's redaction-test fixtures into the secrets baseline

  • (repo_tests) Correct a mislabeled SPECIFIC_REASONS entry (#17108 review)

  • (ci) Prune the now-stale 0.0.0.0:11434 baseline entries (#16771)

  • (repo_tests) Ratchet two reach floors for the #13708/#16771 redaction feature's ~211 new test files (#17108)

  • (repo_tests) Red-main base fixes — nginx floor migration, python-suite filter gap, secrets baseline reasons, hermetic subprocess env, stale hardcoded-value entries

  • (test) Give result.metadata a real dict in 3 multimodal perf/scalability mocks (#16990)

  • (infra) Gate doc-sync to main-at-origin-tip, move it off post-commit (#16934)

  • (security) Restore empty-bind alternation and catch chromadb host networking (#15317)

  • (security) Close 3 nits from the chromadb bind guard's re-review (#15317)

  • (security) Close the chromadb bind guard's two review gaps (#15317)

  • (tests) Add negative control that _python_files pruning happens during the walk, not after (#16601)

  • (tests) Add negative control that pruning happens during the walk, not after (#16601)

  • (tests) Prune SKIP dirs during the walk, not after rglob returns (#16601)

  • (hooks) Back up a superseded pre-commit hook before overwriting (#16923)

  • (hooks) Stop post-checkout reverting the #16923 pre-commit hook

  • (ci) Chain formatter dispatch after the branch guard in pre-commit (#16923)

  • (session) Short SHA in the handoff — a 40-hex string trips detect-secrets HexHighEntropyString (#16778)

  • (kb) Hold both #16707/#16708 ceilings at their original values instead of raising them

  • (kb) /knowledge-maintenance/lint reads kb.chroma_collection, which the knowledge base never defines (#16707)

  • (ci) Audit_api_wiring.py imports dead_surface without a broken sys.path assumption (#16816)

  • (ci) The dead-surface test imports from dead_surface, and carries its license header (#16816)

  • (llc) Read the stall timeout via env_int so a malformed value cannot fail at import (#16817)

  • (llc) Declare stalled_run_sweep as an eager task module in the split-import guard (#16817)

  • (slm-backend) Retain the last five discarded background-task launches (#15524)

  • (admin) Add the missing adminMenuItems entries for pricing/mcp-servers (#16933)

  • (llc) Isort costs.py imports; fix double /costs prefix in the new quota-windows test (#16951)

  • (agents) Stop dropping real quota headroom that names an unlisted window (#16951)

  • (ci) Bump the mcp CI floor mirror to match the landed dependabot bump (#16449)

  • (hooks) Use stdin JSON instead of $TOOL_ARGS in settings.json hooks (#17024)

  • (reconciler) Stop a DB-level failure poisoning the heartbeat session (#17070)

  • (security) Redact identifier-shaped passwords, tighten basic-auth URL scan (#13708)

  • (knowledge) Resolve file-size-ratchet overages from #13708's redaction chokepoints (#13708)

  • (security) Move the credential chokepoint to sanitize_fact_content, close the version-rollback gap (#13708)

  • (security) Redact credentials at the true KB write chokepoint (#13708)

  • (security) Wire credential redaction into gdrive/onedrive PDF+text branches and manual upload (#13708)

  • (secrets) Resolve #16895 CI reds — black formatting, secrets baseline (#13708)

  • (multimodal) The response says whether a result was stored, and if not, why (#16926)

  • (security) Route smart_retrieve_knowledge/retrieve_combined_knowledge through the content firewall (#16771 AC5)

  • (security) Re-firewall budget_grounded_context's own rebuild (#16930)

  • (ci) Resolve #16930's code-quality red -- zero-growth ratchet fix (#16771)

  • (session) Short SHA in the handoff — a 40-hex string trips detect-secrets HexHighEntropyString

  • (ci) Replace a fixed-sleep test assertion with a real lock-wait proof, add research-to-issues to the agent tier map (#16255, #17021)

  • (ci) Size the trailer gate's fetch to the PR so a release is scanned whole (#16931)

  • (backend) Split multi-agent orchestration out of ai_stack_integration.py (#16716)

  • (backend) Consolidate #16908 duplicate-route dedupe into #16716's branch (#16665, #16908)

  • (kb) Move the knowledge_rag_loop import to the top of knowledge_rag.py (#16665)

  • (security) Remove admin read bypass from KB-fed chat/RAG synthesis (#16716)

  • (kb) Configure rag_integration_api_test.py's ownership_manager mock for advanced_search's permission filter (#16665)

  • (deploy) Guard play-level nginx reload handlers, safe the unused nginx role handlers (#16979)

  • (deploy) Order nginx handlers test-before-reload, harden non-symlink checks (#16979)

  • (deploy) Enable rendered nginx sites on self-update, not just full provision (#16979)

  • (deploy) The align tasks must only replace the known default, not any value (#16299)

  • (deploy) Remove the AUTOBOT_BACKEND_SECRET_KEY/GRAFANA_ADMIN_PASSWORD backfills (#16299)

  • (hooks) The non-git guards tell invoking a command from naming one (#14144)

  • (test) The unreachable tolerance is empty — neither hyphenated spelling is gated on (#14288)

  • (test) Drop browser-automation from the unreachable tolerance now its last gate is gone (#14288)

  • (deploy) Browser cleanup targets the plain 'browser' group, not the deprecated underscore spelling (#14288)

  • (deploy) Point the cleanup plays at group names an inventory actually emits (#14288)

  • (kb) The RAPTOR tree is built at all, and its nodes cite their chunks (#14968)

  • (security) Strip the stray line_number field #17067 reintroduced into .secrets.baseline (#16353)

  • (chat) Guard every remaining post-unmount await in chat init (#16274)

  • (chat) The init stops at its first await once the component unmounts (#16274)

  • (hooks) Pre-push's targeted vitest run strips the autobot-frontend/ prefix (#16470)

  • (collaboration) Stay under the frontend fragmentation ratchet after rebase, fix a ref-unwrap test bug (#16470)

  • (collaboration) Show an inline error when responding to an invitation fails (#16470)

  • (docs) Correct two stale THREAT_MODEL.md line anchors for auth_middleware.py (#17042)

  • (ci) Pin explicit parametrize ids in orphan_repair_test.py to stop pytest-xdist worker mismatch

  • (ci) Record the frontend-source glob dependency of the #16299 VNC-password guard (#16299)

  • (ci) Trigger the whole-tree secret scan on .secrets.baseline changes too (#17067)

  • (security) Audit the test_orphan_secret_repair.py fixture in .secrets.baseline

  • (ci) Mark the login token_type label as not a credential for bandit (#17042)

  • (ci) Split the Cipher construction so the B305 nosec lands on bandit's flagged line (#16299)

  • (ci) Audit 2 false-positive secret-detection findings, suppress the mandated DES-ECB bandit finding (#16299)

  • (auth) Lower the mirrored size ceiling for auth_middleware.py too (#17042)

  • (auth) Request-revision on an approval gate needs a person too (#17042)

  • (auth) Know a login token by positive evidence, not absent claims (#17042)

  • (auth) Attribute approval decisions to the verified human caller (#17042)

  • (merge) Un-squash two dict entries the conflict resolution merged onto one line

  • (slm-agent) Mirror the heartbeat GPU changes into the Ansible role's agent copy (#16280)

  • (backend) GPU availability sees any NVIDIA GPU, not only an RTX 4070 (#16289)

  • (ci) Read each queued job's labels, so hosted saturation is never reported as a self-hosted outage (#16309)

  • (deploy) Stop rescuing genuine registration failures, defer only the expected one (#16299)

  • (deploy) Fix the real deploy-ordering bug, not just delay it (#16299)

  • (deploy) Fix 4 review findings on #17069 -- deploy ordering, plaintext transit, protocol, no_log

  • (frontend) Keep the WebSocket protocols option out of Required<> defaults (#17009)

  • (ops) A resumed operation's raw checkpoint never reaches the panel, migrate creates and records its creator, resume tested for creator and admin (#17017)

  • (ops) Await get_operation — every status, cancel, resume and progress lookup received a coroutine, not an operation (#17017)

  • (ops) Operations reach the panel in the shape it reads; the old conversion answered 500 for every status and list (#17017)

  • (ops) The test-suite route creates an operation that records its creator, unimplemented start routes answer 501, and every read or control is its creator's or an admin's (#17017)

  • (security) The operation progress socket authenticates before it reveals whether the framework is up (#17009)

  • (security) An unreadable session owner is unowned, and a raising WebSocket authorization check refuses with 1008 (#17009)

  • (frontend) The five clients of the newly authenticated WebSocket endpoints send the bearer subprotocol (#17009)

  • (security) Authenticate nine WebSocket endpoints before accept, scope the overseer and workflow sockets to their owners, and make /api/long-running admin-only (#17009, #17010)

  • (ci) Resolve #16891 CI reds — oxlint spread, black formatting (#16457)

  • (frontend) MockWebSocket supports addEventListener, not just onX properties (#16457)

  • (docs) Move bug-pattern checklist to CLAUDE_REVIEW.md per lean-instructions rule (#17028)

  • (docs) Correct diff-semantics and worktree-exception wording in CLAUDE.md (#17021)

  • (frontend) Fix components_declaring_styles' own +1, recount the 2 approved size counters (#16972)

  • (i18n) Recount 10 locales' untranslated-string baseline (#16973)

  • (frontend) Bring #16875's ratchet growth back down, 4 of 7 metrics clean (#16875)

  • (ci) Audit 2 missing .secrets.baseline entries blocking every PR (#16960)

  • (test) Resolve the sidebar path with node:path, not a relative URL base (#16901)

  • (llc) The workflow builder reaches the Company OS menu (#16901)

  • (terminal) The legacy workflow-step modal can open (#16312)

  • (files) The extension guard reads deny sets too, and says so (#16521)

  • (files) .con was a truncated .conf, and the guard now checks every entry against a named list (#16521)

  • (files) .con was a truncated .conf, and the guard now checks every entry against a named list (#16521)

  • (security) Judge an envelope secret under a row lock held to the write; a refused store write is an error, not a refusal (#15779, #16940)

  • (security) Repair an orphan through its own type's service, and only a genuine one (#15779, #16927, #16940)

  • (api) Move the repair-grant models out of the router into a companion schemas module (#15779)

  • (skills) Route the catalog-fetch timeout through SSOT config (#16595)

  • (security) Admin break-glass repair for unreachable null-scope resources (#15779)

  • (backend) Dedupe channel authorization between subscribe and command paths (#14893)

  • (ci) The batching gate stops claiming one issue where it counts zero (#16855)

  • (guards) The git-write scrub guard gates clone, and exemptions cite an issue (#15490)

  • (ci) Use the named timeout constant at the call site (#16859)

  • (ci) Name the gh timeout constant, matching the convention in pipeline-scripts (#16859)

  • (ci) The gh timeout is an env-overridable helper, not a hardcoded literal (#16859)

  • (ci) Tell "gh failed" apart from "no open PR" in pre-push's body check

  • (ci) Allowlist the header-check token fixtures so the whole-tree secret scan passes (#15204)

  • (hooks) Remove core.hooksPath on presence, not on value (#16812)

  • (collaboration) Keep the #16580 rationale out of the published API description

  • (ci) A missing PR template heading is reported as missing, not empty (#16793)

  • (ci) Only a closing keyword makes a pull request batched (#16795)

  • (infrastructure) Keep the #16426 rationale out of the published API description

  • (guards) Filter entry instead of a raised MAX, fix a stale test signature (#16442)

  • (guards) Record the new concrete-literal frontend read for #16427's test (#16442)

  • (slm) Restore the underscore-prefixed alias names in slm_frontend_build.py (#16717)

  • (tests) Bypass the #13312 subprocess guard for real git calls in the shallow-clone bootstrap tests

  • Pay for #16640/#16717 growth by moving code out, not raising file-size ceilings (#14236)

  • (slm) Update-all no longer reports completed while a co-located deploy failed (#16640)

  • (slm) A forced resync of autobot-slm-frontend no longer deletes its live bundle or rollback (#16717)

  • (repo) Add the missing SPDX header to the changelog-branch guard (#16563)

  • (release) Changelog branch carries no slash, and the PR step classifies its own failure (#16563, #15167)

  • (kb) An update keeps the route that wrote the fact (#16770)

  • (vehicle) Chain the kb visibility backfill migration after collaboration_events so alembic has one head (#16693)

  • (vehicle) Drop the unused CollabEventResponse import oxlint flags in services/api.ts (#16460)

  • (ansible) Resolve two update-path regressions (#16750) (#16752) (#16752)

  • (vehicle) Derive #16471's collaboration response types from the API contract; responses back to 187 (#16460)

  • (vehicle) Drop #16471's local Session*Response copies; main imports them from the api contract (#16460)

  • (kb) The backfill's candidates are a migration-set column, so adoption observes it and decided facts drop out (#16693)

  • (vehicle) Repoint the references #16454's mcp rename stranded (#16449)

  • (test) Restore sys.modules['mcp'] after the shadow guard runs (#16449)

  • (ci) Install the real mcp SDK in CI so the shadow guard means something (#16449)

  • (mcp) Fix stale path, root-cause the SSOT red, generalize AC3's guard (#16449)

  • (mcp) Rename autobot-backend/mcp/ off the name it shadows (#16449)

  • (i18n) Translate the two collaboration-panel strings copied English into fr (#16460)

  • (ratchet) Bump 4 baselines for this PR's own new collaboration UI (#16460)

  • (collaboration) Tailwind @reference and stop colliding with the fake-shape banlist (#16460, #16443)

  • (kb) Six callers and a doc pass get_fact(query=...) to a synchronous get_fact(fact_id) (#16710)

  • (deps) Raise dependency_patching's pypdf floor to 6.18.1 to match the manifests (#16742)

  • (kb) Lower UNFILTERED_READ_CEILING to the count after #16691, #16706 land together (#16667)

  • (knowledge-ui) Dedupe stat-card CSS against the shared components.css classes (#16695)

  • (knowledge-ui) Move Watch Folders under Knowledge → Manage and fix its form styling (#16695)

  • (kb) /rag/scoped never takes the admin read bypass -- it no longer calls the /scoped route, whose role-derived bypass it inherited (#16662)

  • (kb) Explicit read APIs pass the admin read input, and fact store and delete degrade without an ownership manager (#16662, #16685)

  • (kb) Read shared_with and group_ids back as lists on share, unshare and cleanup; pin the admin read bypass to explicit read APIs (#16662)

  • (kb) Restore the category-counts allowlist entry the guard's scan can't clear (#16665)

  • (kb) Restore 2 allowlist entries the guard's single-hop scan can't clear (#16665)

  • (kb) Correct the analytics import path, and decode JSON-encoded fact metadata before filtering (#16665)

  • (kb) Correct the response-schema import path in the two extracted routers (#16665)

  • (ansible) Apply constraints/shared.txt on every path filling /opt/autobot/venv (#15684)

  • (ansible) The remaining 13 venvs create with python -m venv, no guard exemptions left (#16641)

  • (ansible) Venvs create with python -m venv, chdir their relative editables, single-source two venvs (#16641)

  • (tests) Raise the real redis ConnectionError in TestPersistHeadroomFrom429's mock (#15026)

  • (llm) Treat a None Redis client as unavailable too, not an AttributeError (#16483)

  • (llm) Narrow quota_headroom's Redis fallback to real Redis errors, stop one bad entry sinking the whole store (#16483)

  • (redis) The deploy scripts survive a missing secret key under pipefail, and redis-cli arguments are shell-quoted so an empty password keeps ping as the command (#16678, #16686)

  • (ratchet) The audio-extension-allowlist floor must clear completed(), not just examined() (#16702)

  • (ratchet) Raise the audio-extension-allowlist REACH floor for the combined vehicle tree (#16702)

  • (vehicle) Reconcile 3 CI regressions surfaced by the combined tree (#16702)

  • (ratchet) Recount fa/he/ur locale baselines on the combined vehicle tree

  • (ratchet) Recount ar locale's untranslated baseline on the corrected 14-member vehicle

  • (tests) Use a long-lived child to avoid the pid-reuse test's own race (#13097)

  • (llc) A finished run polled after its stall deadline never touches a vanished pid (#13097)

  • (llc) Drop the duplicated registry docstring paragraph (#13097)

  • (llc) Survive a missing boot time and honour the SIGKILL grace period (#13097)

  • (llc) Never signal a process the run no longer owns, and judge a dead run by its exit (#13097, #13099)

  • (llc) Kill a stalled agent run instead of holding its slot for the full timeout (#13099)

  • (llc) Kill the agent's whole process tree on cancel and timeout, not one PID (#13097)

  • (guard) Shrink the remaining 47 cleared import-hermeticity offenders (#16262)

  • (guard) Shrink 4 cleared import-hermeticity offenders (#16262)

  • (config) Drop @computed_field on external_url, keep it out of dumps (#16262)

  • (config) Defer external_url's socket probe past import time (#16262)

  • (guards) Clear the three guard findings on the sync-deletion branch (#16310)

  • (slm-frontend) The drift panel's helpers accept the readonly data the template passes (#16310)

  • (slm) Cleanup can't abort the fleet, the bootstrap switch is a real bool, and each shared pin is bounded (#16310)

  • (tests) Expect bootstrap_required in the planner CLI's JSON, and test the unknown-commit path (#16310)

  • (slm) Dash-safe deletion shell, target-side delete list, bootstrap fallback for an unknown marker commit (#16310, #16322)

  • (tests) Site.yml's real path, an unmasked xfail, move two tests under tests/services/ (#16310)

  • (tests) Slash-free injection payload, --allow-empty no-op commits, restore "services" (#16310)

  • (drift) Stop the source-disk walk from hiding a kept, gitignored file (#16310)

  • (deploy) Reach the update path, not just main.yml, for #16310 deletion + AC4 (#16310)

  • (deploy,drift) Re-deliver AC4 via ansible, wire full-tree drift into the SLM GUI (#16310)

  • (sync-deletions) Catch rename-only paths, prove injection resistance, quote non-ASCII names (#16310)

  • (deploy) Bound the bootstrap enumeration, contain a fleet failure, stop the marker being wiped (#16310)

  • (deploy) Move deletion into the ansible roles themselves (#16310, closes #16322)

  • (sync-deletions) Never write .deployed_commit, skip host state, stay contained (#16310)

  • (code-sync) Remove files deleted from source on every update, never untracked host state (#16310)

  • (guard) Tighten octal-digit check and share the offense loop (#16522)

  • (guard) Reject a non-string TLS key mode instead of misreading it (#16522)

  • (infra) Route the shared TLS cert-ensure through the builtin updater, fix frontend key mode (#16522, #16566)

  • (infra) Consolidate the last 3 private TLS-cert-generation copies (#16020)

  • (frontend) Retire four dead settings API paths, stop a fifth calling admin-gated settings from non-admin surfaces (#16481)

  • (guards) Recount ur untranslated-string ratchet at the rebased tree (#16245)

  • (guards) Recount he untranslated-string ratchet at the rebased tree (#16245)

  • (guards) Recount fa untranslated-string ratchet at the rebased tree (#16245)

  • (guards) Recount ar untranslated-string ratchet at the rebased tree (#16245)

  • (guards) Recount distinct_class_names at the rebased tree (5619 -> 5617) (#16245)

  • (guards) Recount css_rule_declarations at the rebased tree (9401 -> 9398) (#16245)

  • (guards) Recount inline_generics at the rebased tree (564 -> 562) (#16245)

  • (secrets) Audit Batch B's locale translation keys into the detect-secrets baseline (#15031)

  • (frontend) Design tokens for ProviderOAuthConnect's status and error colours (#15031)

  • (gui) Batch B, i18n gaps and reduced-motion wiring (#15031, #15665, #13960, #14807, #15749)

  • (llm) Fail open when prompt compression raises (#16526, #16527)

  • (llm) Read prompt-compression config live per call, not baked into the singleton (#16526, #16527)

  • (ci) Lower the print/console ratchet baseline and dismiss a CodeQL false positive (#16526, #16527)

  • (tests) Lower the print/console known-violations count to 352 (#16318)

  • (comments) Describe role-based placement, not a VM count (#15194)

  • (agents) Report progress on every exit of every LLM attempt, and bound the stall window by the token wait too (#15950)

  • (agents) Report progress per LLM attempt, end a run's claim on exit, and give refusals one shape (#15950, #16208)

  • (slm) An env file must sit strictly under the deployed root, so the guard CodeQL reads leaves no equality branch (#16236)

  • (slm) Check the env file's containment where CodeQL can see it (#16229)

  • (slm) Fix the two CI reds blocking the merge train (#16229, #16231)

  • (pricing) An admin override outranks the live price and survives the refresh (#16229)

  • (auth) Keep permissions.py at 600 lines instead of grandfathering it (#11542)

  • (mcp) Update the admin-role dispatch test's _call_bridge stub for the new role param (#11542)

  • (mcp) Forward reserved_names into discover_and_resolve (#16458 delta)

  • (collaboration) Wire ShareSecretDialog, fix build/ratchet/i18n regressions (#16443)

  • (security) Deny an SLM token when its revocation check cannot run, HS256 and RS256 (#16387, #16412) (#16413) (#16413)

  • (hooks) Pre-push always uses the merge-base range, not remote_sha..local_sha (#16637) (#16639) (#16639)

  • (ci) Reconcile the dependabot train's ansible-floor-sync and CI pin fixes onto main (#16591) (#16636) (#16636)

  • (migrations) Port 6 orphaned tables into the canonical Alembic chain (#16464) (#16467) (#16467)

  • (code-sync) Fetch --prune before self-update, so a moved branch tip doesn't stall the fetch stage (#16610) (#16612)

  • (slm-frontend) Give the service-log fetch one path and its real timeout (#16256) (#16500)

  • (guards) Fold shell continuations in the hooksPath guard via one shared helper (#15961) (#16414)

  • (files) Conversation uploads accept PDF and GIF, not the truncated '.pd' and '.gi' (#16521) (#16523)

  • (tooling) Scope protect-files.sh's secrets/ rule to real credential storage (#16446) (#16448)

  • (a2a) Cooperative cancellation checkpoints in execute_a2a_task (#16174) (#16498)

  • (security) Generate the vault root key from 32 random bytes, not alphanumeric characters (#16405) (#16410)

  • (security) The dev proxy stops granting admin without a login, and the session check endpoint is tested (#16382, #16385) (#16390)

  • (config) Register AUTOBOT_BROWSER_SERVICE_HOST/PORT, AUTOBOT_VNC_PORT (#15151) (#16555)

  • (chat-knowledge) Contexts can be deleted, cascade with their chat, and orphans get cleaned (#16490) (#16503)

  • (frontend) Converge the permission vocabulary onto the backend's real Permission enum, wire in v-permission (#16243) (#16493)

  • (security) Require sign-in on seven ungated routers, and admin where they change shared state or reach outside (#16375) (#16418)

  • (fragmentation) Re-derive the frontend ratchet baselines after batch 2b's combined effect (#16596) (#16596)

  • (sdk) TypeScript SDK request/response parity + missing /api prefix (#15528, #16495) (#16497)

  • (frontend) Point artifact-cells/CodeCell.vue at the shared --codecell-syntax-* tokens (#14853) (#16437)

  • (knowledge) Wire real grounding:stats counters, replacing the hardcoded claim_sources split (#14981) (#16434)

  • (knowledge) Give _CPUBackend a non-recursive vector-search leaf (#15165) (#16564)

  • (infra) Clear the debt blocking the last four branch-name swaps, and default install.sh to main (#16540) (#16558)

  • (ci) Keep line numbers out of the secrets baseline, so a line move no longer rewrites it (#16353) (#16362)

  • (rag) Wire GPU faiss onto an automated install, gated on GPU alone (#15163) (#16560)

  • (scripts) Detect-environment.sh only selects files this repo tracks (#15143) (#16553)

  • (security) Agent_config, sync and hardware-priority record the real caller, not "admin" (#16547, #16541) (#16550)

  • (llm-shared) Remove dead SemanticLLMCache, keep live semantic cache (#16528) (#16536)

  • (security) The SLM proxy checks the caller's SLM session before it adds the backend key (#16374) (#16386)

  • (tests) Stop gating a disk-bound model load on a CPU work budget, and prove it stays offline and import-free (#15055, #15235) (#16404)

  • (ci) Keep the drift-checked SLM agent mirror out of the duplication scan (#16401) (#16402)

  • (ci) Bring CI's pytest environment up to its declared floors, and gate on them (#16264) (#16391)

  • (ci) Retire the CodeQL suite file nothing loads, and record the real guard behind alert #1030 (#16283, #16302) (#16377)

  • (security) Write the service-key export only to its configured directory, never into a checkout, and keep one (#16348) (#16372)

  • (security) Authenticate every skills route, and require admin to change, fetch or execute (#16368) (#16370)

  • (ci) Let the system-package retry recover from its own timeout, and fetch before unpacking (#15515) (#16367)

  • (terminal) Render TerminalModals in TerminalWindow, with each action reporting the parent's real outcome (#16285) (#16313)

  • (ci) Stop the regen bot's approved runs cancelling the job that approved them (#16360) (#16363)

  • (docker) Retry apt fetches and fail apt-get update on a lost index, set once for every image (#16291) (#16356) (#16356)

  • (kb) Make three summarisation paths do what they claim (#14840, #15700, #16110) (#16345) (#16345)

  • (ci) Gate the frontend npm audit on one report, retry it, and report 'could not check' apart from advisories (#16337) (#16357) (#16357)

  • (guards) Tell a baseline entry that matches nothing apart from one that under-matches (#16334) (#16365) (#16365)

  • (guards) Scope no-local-schemas to the lines a change added, and point at modules with headroom (#16178) (#16241) (#16241)

  • (pre-commit) Run detect-secrets serially and refresh the baseline's line numbers (#16343) (#16349) (#16349)

  • (slm) A failed manifest read evicts its cache entry (#16204) (#16235) (#16235)

  • (guards) The URL rule stands down in .github/workflows/ (#16260) (#16271) (#16271)

  • (coordination) Make task a reserved kind in work_claims, and record why the claim primitives stay separate (#15957) (#16215) (#16215)

  • (gui) Batch A, canonical vocabularies (#14993, #14937, #14939, #15002, #15401) (#16265) (#16265)

  • (agents) Refuse a malformed declared scope by name on the agent path, and make the tests reach the parser (#16209) (#16267) (#16267)

  • (a2a) A caller's typo in declared_scopes wedged the task in WORKING forever (#16209) (#16213) (#16213)

  • (ci) The parked-branch merger has never merged anything (#15938) (#16128) (#16128)

  • (guards) Name the duplication env var, and stop the reach exemptions growing silently (#16163, #16147) (#16226) (#16226)

  • (security) Match scan-gate allowances by alias, so a re-keyed advisory cannot redden base (#16222) (#16223) (#16223)

  • (eval) Give the trajectory gate a candidate that can disagree with it (#16157) (#16160) (#16160)

  • (guards) The router sweep was wrong four ways, and three guards swept at IMPORT (#16187, #16188, #16202) (#16189) (#16189)

  • (slm) The manifest cache TTL was hardcoded and its bypass was unreachable from the one caller that needed it (#16026) (#16197) (#16197)

  • (guards) The reach meta-test could not see .glob(, could not say what it does not check, and the duplication guard could not name its failing scope (#16147, #16154, #16163) (#16168) (#16168)

  • (ci) One helper for check-run status, and stop truncating the listing (#16120) (#16167) (#16167)

  • (guards) The hooksPath guard could not read a single git hook (#16139, #15961) (#16141) (#16141)

  • (kb) The summary evaluator must see more than the opening 200 characters (#16110) (#16130) (#16130)

  • (guards) Bind the hooksPath guard to what it examined (#16150) (#16151) (#16151)

  • (ci) Clear the three defects every open PR is inheriting (#16089, #16104, #16122) (#16129) (#16129)

  • (redis) The guard's own skip was hiding three live instances (#16071) (#16094) (#16094)

  • (redis) Name the Stack unit everywhere it is operated (#16071) (#16072) (#16072)

  • (hooks) A non-deny permissionDecision must exit 0 to be read (#15956) (#15996) (#15996)

  • (hooks) Run autobot-slm-backend as its own pytest invocation (#16069) (#16074) (#16074)

  • (vnc) Ensure the shared TLS keypair through the shared task (#16020) (#16070) (#16070)

  • (slm) Manage Redis by the unit the role installs, and fail a restore that cannot stop it (#16061) (#16061)

  • (slm) A healthy oneshot and a templated unit must not report unknown (#16027) (#16027)

  • (llc) A status transition's comment reaches the store, not the floor (#16054) (#16054)

  • (ci) The PR gates accept the readable rationale and let the body override a stale branch (#16053) (#16053)

  • (auth) An API key's authority is the key's, not its owner's (#16040) (#16049) (#16049)

  • (tools) The merge gate's blind spots, and naming the ones that remain (#16046, #16044) (#16052) (#16052)

  • (hooks) The health-route guard reported prose, including warnings against itself (#16011) (#16012) (#16012)

  • (llc) Stop /heartbeat/report declaring four fields it never stores (#15966) (#16018) (#16018)

  • (ansible) Nginx and redis must ensure the shared TLS keypair exists (#16020) (#16023) (#16023)

  • (guards) A bare file name in exclude= excluded nothing (#16013) (#16014) (#16014)

  • (guards) Three review findings I merged past on #15994 (#15900) (#15998) (#15998)

  • (guards) The import resolver followed a WSL2 symlink, inverting its own control (#15986) (#16005) (#16005)

  • (hooks) A timed-out pre-push check fails the push instead of skipping (#15985) (#16006) (#16006)

  • (guards) Allowlist the #15926 scrub contrast fixture, which turned base red (#16002) (#16002)

  • (llc) Three review findings I merged past on #15920 (#15905) (#15964) (#15964)

  • (llc) GH#8252's blocked-by rule had never fired (#15931) (#15939) (#15939)

  • (test) Assert protobuf parity, not a version literal, in the reach check (#15981) (#15982) (#15982)

  • (guards) Key path checks on the scan root and on composition, not on spelling (#15900, #15510) (#15954) (#15954)

  • (pricing) One literal price table, and a guard that found three live disagreements (#15912) (#15918) (#15918)

  • (analysis) Revive five dead analyzer constructors and widen the F821 guard past the tree that hid them (#15914) (#15915) (#15915)

  • (llc) Make cost events accrue — wire the routes and price the default model (#15859, #15860) (#15906) (#15906)

  • (llc) Repair the CEO rows 088 provisioned for non-companies, with executing tests (#15892) (#15883) (#15883)

  • (tasks) Resolve the man-page indexer from the repo root, not the cwd (#15853) (#15895) (#15895)

  • (update) Make the update surface say what the update did (#15879, #15881) (#15880) (#15880)

  • (security) Scope the agent budget slug to its company (#15812) (#15864) (#15864)

  • (ci) Anchor every trailer arm so documenting the rule does not violate it (#15848) (#15850) (#15850)

  • (ansible) Remove become from a TaskInclude — it aborts the self-update play (#15823) (#15870) (#15870)

  • (docs) Give the doc-sync hook an indexer it can actually run (#15845) (#15854)

  • (install) Make the install-path error handlers reachable and surface provision failure (#15825) (#15851)

  • (auth) Decide the reporting-line permission without acquiring a DB session (#15805) (#15852)

  • (safety) Treat a ref-sourced path checkout as destructive, and match at command position (#15835) (#15849)

  • (ci) Make the ansible fact guard fail on the defect it exists for (#15824) (#15831)

  • (ansible) Rebind the self-update socket around the backend restart (#15823) (#15832)

  • (guards,docs) Close a trailer hole, warn on uncommitted work, fix the anonymization rule (#15830, #15836, #15841) (#15842) (#15842)

  • (ansible) Survive set_fact bool coercion and restore wrong-node cleanup (#15822) (#15827)

  • (security) Reject escaping segments before building the path expression (#15786) (#15818) (#15818)

  • (guards) Gate by default and name only what always runs (#15820) (#15821)

  • (lint) Bind the SPDX header check to a floor of files examined (#15817) (#15819)

  • (guards) Give the fixture-teardown guard a reachability model (#15810, #15811) (#15815)

  • (lint) Add the missing SPDX header to the destructive-migration marker check (#15776) (#15816)

  • (security) Scope agent reporting-line writes to the caller's company (#15794) (#15804)

  • (guards) Close five scope and derivation gaps in the fixture-teardown guard (#15797) (#15809)

  • (guards) Sweep the whole tree for unregistered env vars, not just staged files (#15807) (#15808) (#15808)

  • (test) Contain the auth stub to the import that needs it (#15799) (#15799)

  • (tooling) Gate every unscrubbed git subprocess, not just --show-toplevel (#15783) (#15784) (#15784)

  • (security) Gate the agent org routes — reporting-line writes took no caller identity (#15794) (#15798) (#15798)

  • (api) Map database integrity errors onto 409/422 instead of 500 (#15775) (#15787) (#15787)

  • (user-mgmt) A concurrent duplicate returns the same 409 as a sequential one (#15780) (#15780)

  • (security) The cognition-store seed admin gate now actually executes (#15768) (#15768)

  • (auth) Change-password gates on caller identity, closing the account-takeover path (#15752) (#15752)

  • (auth) Make the ungated-core-router sweep repeatable (#15745) (#15760) (#15760)

  • (user-mgmt) Make the authorization posture of user-management routes legible and testable (#15744) (#15744)

  • (user-mgmt) 409s carry the real conflict, plus test/lint scope cleanup (#15730, #15736) (#15740) (#15740)

  • (auth) Exempt npu status from service-auth 401s, guard the drift (#13008, #13365) (#15735) (#15735)

  • (test) Auth_middleware stub: real contract for every name, no catch-all (#15729) (#15729)

  • (deploy) Give pip a cwd where its relative editables resolve (#15733) (#15734) (#15734)

  • (deploy) Stop localhost plays touching the autobot mapping (#15731) (#15732) (#15732)

  • (deploy) Give the shell SLM-frontend publishers the #15557/#15610 shape (#15721) (#15721)

  • (config) Clamp 58 os.environ.get-wrapped module-level env casts (#15710) (#15716) (#15716)

  • (deploy) Resolve infra-tree paths against a root something maintains (#15726) (#15727) (#15727)

  • (config) Clamp module-level env casts against crash-at-import (#15711) (#15711)

  • (test) Make the ansible repo_tests resolve role defaults that derive from the SSOT (#15714, #15632) (#15712) (#15712)

  • (prompts) Give three LLM prompts the inputs they were already promised (#15630, #15681, #15682) (#15699) (#15699)

  • (deps) Make each worker manifest declare what its ansible role installs (#15660, #15671) (#15686) (#15686)

  • (slm) Clamp the release-keep bound so a bad value cannot break import (#15610) (#15688) (#15688)

  • (workflow) Send the intent-analysis prompt the request it names, screened and data-framed (#15651) (#15683) (#15683)

  • (deploy) Publish the SLM frontend by flipping a symlink, not by two renames (#15610) (#15654) (#15654)

  • (guards) Carry the ternary and emitted-bare placeholder classes the detector could not see (#15627, #15628) (#15652) (#15652)

  • (backend) Stop two background paths from capturing request-scoped ORM rows (#15611, #15612) (#15618) (#15618)

  • (async) Schedule watchdog events across the thread boundary, retain the launches that were dropped, and stop the pool leaking a mid-create container (#15636, #15637, #15638) (#15644) (#15644)

  • (guards) Widen the background-task retention ratchet to both backends and triage the population it could not see (#15619) (#15639) (#15639)

  • (ssot) Derive the ansible constraint fallback and the journal SSH ceiling from the SSOT (#15601, #15620) (#15634) (#15634)

  • (config) Split the backend component out of env_registry so variables can be registered again (#15624) (#15625) (#15625)

  • (ci) Pair the required code-quality context with a complement shim over a shared filter file (#15608) (#15631) (#15631)

  • (strings) Drain the placeholder census and carry both halves it dropped (#15613, #15614, #15617) (#15626) (#15626)

  • (ansible) Bring ansible pip declarations back onto the requirements they provision against (#15596, #15597, #15598) (#15623) (#15623)

  • (slm) Give the background replication job its own DB session (#15549) (#15615) (#15615)

  • (tests) Make an unavailable real-load announce itself instead of vanishing (#15563) (#15605) (#15605)

  • (ci) Publish startup-import-smoke from a complement shim so a non-backend PR can merge (#15606) (#15607) (#15607)

  • (ansible) Stage the SLM frontend publish and repair three backend path defects (#15557, #15560) (#15602) (#15602)

  • (logging) Read config through the accessor that walks a dotted path (#15575) (#15594) (#15594)

  • (config) Declare the four logging toggles, wire the one that can be wired (#15587) (#15593) (#15593)

  • (config) Point install.sh at a live redis key, and drop the LLMSettings collision (#15577) (#15591) (#15591)

  • (config) A live agent crash found behind a test that reported it as a pass (#15255, #13382) (#15582) (#15582)

  • (logging) Read the log level key that is actually published (#15575) (#15586) (#15586)

  • (infra) Eleven generators emitted their own placeholder syntax (#15585) (#15588) (#15588)

  • (infra) Clear the lint backlog, and the three real bugs hiding inside it (#14505) (#15584) (#15584)

  • (skills) Validate uploaded documents against the data root, not just the code root (#15293) (#15583) (#15583)

  • (config) Remove three inert project-root placeholders and one orphaned copy (#15044) (#15570) (#15570)

  • (deploy) Make the autobot_shared symlink relative and unify backend_install_dir (#13539) (#15559) (#15559)

  • (deploy) Publish the SLM frontend atomically and give recovery its own surface (#15462, #15475) (#15556) (#15556)

  • (api) Give POST /api/agent/execute_command a JSON body model both SDKs can send (#15527) (#15541) (#15541)

  • (slm) Retain seven background tasks; record five blocked on the file-size ratchet (#15524) (#15548) (#15548)

  • (deps) Clear the two advisories that redden every PR from base (#15520, #15540) (#15550) (#15550)

  • (api-contract) Give the five untyped SLM endpoints a response_model (#13139, #13138) (#15539) (#15539)

  • (sdk) Send the fields the routes read and align the SDK docs with the shipped packages (#15057, #15058, #15141, #15170) (#15526) (#15526)

  • (slm-frontend) Point the self-service password change at a served route and guard the class (#15533, #15236) (#15538) (#15538)

  • (slm) Retain self-update tasks, bind the verdict to its run, unbreak the reconciler (#15522, #15523) (#15525) (#15525)

  • (terminal) Stop naming an SLM SSH route that was never built; make post-checkout stop rewriting itself (#15236, #15532) (#15535) (#15535)

  • (deps) Declare the hard dependencies nothing installs and pull nested manifests into dependabot's reach (#15035, #14562) (#15517) (#15517)

  • (paths) Resolve phantom autobot-user-backend references and untrack scheduled workflow state (#15193, #14479) (#15514) (#15514)

  • (tests) Anchor guard sweeps to their own scan root, not the working directory (#12993, #14484) (#15511) (#15511)

  • (lint) Floor every full-repo sweep and gate git ls-files (#14896, #14895, #13200) (#15504) (#15504)

  • (security) Watch the secrets store from the health surface and state why the pattern sets diverge (#14126, #14042) (#15458) (#15458)

  • (automation) Count landed files, not just surviving lines, in the branch sweeps (#15036) (#15489) (#15489)

  • (security) Bump browserslist in the TypeScript SDK past the same advisories (#15467) (#15481) (#15481)

  • (terminal) Send RiskLevel on the wire and surface the blocked-command warning (#14995, #14992) (#15474) (#15474)

  • (chat) Apply the page parameter and describe the session and message rows (#15186, #15138) (#15470) (#15470)

  • (deploy) Make installer-written units obey the ansible unit rules, and guard label keys (#14100, #14123) (#15457) (#15457)

  • (i18n) Translate the terminate confirmation and ratchet untranslated strings (#14209) (#15448) (#15448)

  • (security) Bump browserslist past the OOM and prototype-write advisories (#15467) (#15468) (#15468)

  • (deploy) Ship the libs/ and autobot-plugins/ workspace packages the frontends build against (#15462) (#15464) (#15464)

  • (ci) Accept slashed scopes, skip enum unions, and stop the print hook spawning awk per line (#14076, #14073, #14115) (#15436) (#15436)

  • (deploy) Give the installer's chromadb unit a reachable start limit and document the gateway variables (#14100, #14145) (#15453) (#15453)

  • (security) Stop a broken secrets store reading as empty, and normalise before pattern matching (#14126, #14042) (#15450) (#15450)

  • (security) Own imported sessions and stop unreadable ownership reading as unowned (#14026, #14033) (#15433) (#15433)

  • (frontend) Consolidate the duplicated load-failure styles and unblock the ratchets (#12731, #15429) (#15454) (#15454)

  • (llc) Make the board data contract honest and surface load failures (#14044, #14064, #14074, #14075) (#15429) (#15429)

  • (deploy) Diff dependencies across the whole deployment and stage the frontend build (#15430, #15418) (#15432) (#15432)

  • (config) Restore 9 more pre-#7437 ssot_config defaults (#13264) (#15425) (#15425)

  • (ansible) Install browser worker deps into its venv and guard pip isolation (#15417) (#15419) (#15419)

  • (slm-frontend) Surface failed per-service actions and record the full capability diff (#15224) (#15420) (#15420)

  • (frontend) Restore the SPDX header on both useToast shims (#14907) (#15412) (#15412)

  • (ci) Sweep open PR heads for the infrastructure-retry watchdog (#15139) (#15399) (#15399)

  • (test) Unwrap config_consolidation_p2_test.py's swallowed asserts, lower the #15189 ratchets (#15393) (#15393)

  • (config) Restore 22 more pre-#7437 ssot_config defaults (#15343) (#15343)

  • (automation) Branch sweeps must test landing, not ancestry (#15036) (#15366) (#15366)

  • (ci) Re-dispatch infrastructure-caused reds, and close the merge_group gaps (#15139) (#15396)

  • (frontend) IsAdmin rejects superadmin, mirror backend is_admin_role() (#14937) (#15356) (#15356)

  • (slm) Close post-sync silent-divergence window and detect stale processes (#15371) (#15371)

  • (ci) Three stale action pins, a closed-issue citation, and two guards to catch both recurring (#15347) (#15347)

CI/CD

  • (migration-gate) Add jsonschema and prometheus_client, found by walking the import graph (#17134)

  • (migration-gate) Install defusedxml, which the eager connector package makes mandatory (#17134)

  • (migration-gate) Install aiohttp for the #17099 coordinator test (#16444)

  • (security) Exclude secrets_baseline_legacy_keys.json from detect-secrets (#17130)

  • (python-suite) Queue the shards first in, first out across PRs, with a per-shard job-level queue: max group (#16320)

  • (filters) Run the python suite when the files the reduced-motion guards read change (#15749)

  • (python-suite) Dump a hung test's traceback via faulthandler_timeout from one shard setting (#16516) (#16602)

  • (release) Open a weekly sync PR from Dev_new_gui into main, never merging it (#16246) (#16263) (#16263)

  • (duplication-guard) Gate each scope on its absolute duplicated-line count, so deleting unique code can't fail it (#16319) (#16323) (#16323)

  • (codeql) Return code scanning to advanced setup, gated by paths (#16283) (#16304) (#16304)

  • (codeql) Stop claiming exclusions a query filter cannot make, and make pin labels agree per SHA (#16302, #16303) (#16311) (#16311)

  • The trailer gate cloned 12,874 commits to read about five (#16207) (#16210) (#16210)

  • Make python-suite reportable on stacked PRs and in a merge queue (#14747, #14353) (#16098) (#16098)

  • (duplication-guard) Scan the three trees it never opened (#13044) (#16095) (#16095)

  • (perf) Delete the formatting bot — it is the third application of the same tools (#15934) (#16081) (#16081)

  • (npm) Gate four ungated npm test runners and record the measured reason for the rest (#15674, #15675, #15676, #15677) (#15697) (#15697)

  • (slm-frontend) Run the vitest suite in CI, repair the four suites it red-lights, and guard the class (#15667) (#15685) (#15685)

  • (python) Report the real shard count, and hold it to the matrix (#14353) (#15565) (#15565)

  • (guard) Enforce same-scope batching and documented blanket skips (#15492, #15488) (#15493) (#15493)

  • (perf) Scope enforce-precommit to the PR diff and cache its hook environments (#15358) (#15392)

  • (runners) Merge_group triggers for every required context, and off self-hosted (#14054) (#15394)

Documentation

  • (research) Correct a false orphaned-role claim and record the issues filed (#17257) (#17269) (#17269)

  • (research) Paraphrase quoted source copy — a verbatim sentence is a searchable fingerprint (#17217)

  • (research) Correct three citations and record the citation audit (#17217)

  • (research) Land the regulated-readiness source analysis (#17217)

  • (claude) Finish what you started — append to an open PR before opening a new one (#17128)

  • (secrets) Correct index.ts's stale ShareSecretDialog wiring note (#16429)

  • (changelog) Add fragment for #16429

  • (claude) One Closes per line; record the same-file one-PR rule (#17110)

  • (hooks) No bypass in the hooks README — only the conforming route, and a blocking hook is a defect to fix or file (#17029)

  • (chat) Drop the literal bind URL from outbound_url's docstring so the hardcoded-values gate passes (#16771)

  • (changelog) Add fragment for #16785 (DocumentExtractor csv/json/html)

  • (deploy) Note the accepted edge case in grafana_admin_password's generate guard (#16299)

  • (changelog) Name the browser group the cleanup play actually targets (#14288)

  • (changelog) Add fragment for #14288 (cleanup group names)

  • (ci) The two PR gates name their importer, because pre-push cannot warn you (#16859)

  • (security) Move two THREAT_MODEL anchors that this branch's comment reflow shifted (#16457)

  • (claude) No agent cleans up data or credentials on its own — human-approved, always-reviewable, paper-trailed (#17038)

  • (claude) Known Self-Inflicted Bug Patterns checklist (#17028)

  • (claude) Pre-push checklist, verification rule, research-to-issues skill+agent (#17021)

  • (research) Add a third confirming data point to the NAS app-store generalization

  • (research) Compose-based NAS/homelab app-store distribution channel

  • (research) Correct index scope and self-review audit for multi-agent-executive-advisor (#16766)

  • (research) Compare Company OS against an external multi-agent executive-assistant product (#16762)

  • (rules) Forbid privilege escalation, with a tested guard proposed for whoever can apply it (#12662)

  • (ci) The runner-health probe is live, not dormant as its header claims (#14444)

  • (roadmap) Replace the December 2025 snapshot with measured current counts (#16803)

  • (research) Land the sandboxed agent VM orchestration analysis (#16867)

  • (architecture) Map every control-plane layer to its doc and enforcing code (#16835)

  • (tools) Check_run_status cites #16046, not the unrelated #16040 (#16046)

  • (research) Index row follows the voice pipeline status (#16814, #16815)

  • (research) Voice pipeline status names all five filed issues (#16814, #16815)

  • (research) Second comparison pass — eval framework and per-provider formatting findings

  • (research) Index both orphaned research passes

  • (research) Add streaming-voice-agent-pipeline-architecture.md

  • (research) Add document-to-markdown-conversion-pipeline.md

  • (store-authority) Trim activity_audit_trail's write_sites after #16466 (#16460)

  • (changelog) Add fragment for #16443

  • (positioning) Add NIS2 fit alongside EU AI Act, ISO 42001, ISO 14001 (#16733)

  • (positioning) Add ISO/IEC 42001 and ISO 14001 fit alongside EU AI Act (#16733)

  • (positioning) State Why/How/What and the EU AI Act governance fit in README and Platform Model (#16733)

  • (env-vars) Regenerate CLAUDE_RULES.md's env-var table (#16483)

  • (rules) Count the two LLC stall-watchdog variables in the env registry footer (#13099)

  • (changelog) Document the update-all-nodes.yml wiring and #16566 fix (#16522)

  • Describe role-based placement instead of a fixed VM count (#15194)

  • (security) State blast radius by role, not a fixed VM count (#15194)

  • (env) Move the generated env-var table into ENV_VARS.md and drop its count line, so env-var PRs stop conflicting (#16317)

  • (architecture) One count-free distributed architecture document (#15194)

  • (adr) Supersede ADR-001's fixed VM count with role-separation placement (#15194)

  • (changelog) Add fragment for #16443

  • (infra) Record redis role tools as binary names, not units (#16060, #16071) (#16511)

  • (research) The disk-tiered MoE streaming analysis against llm_shared/optimization (#13030) (#16571)

  • (research) Add internal audit of LLM request-pipeline gaps (#16559)

  • (process) A report whose text is not derived from its measurement (#15953) (#16206) (#16206)

  • (process) Four corrections found in review, two of them missing criteria (#16126, #15953) (#16127) (#16127)

  • (research) Prompts.chat source analysis and AutoBot comparison (#16108) (#16119) (#16119)

  • (process) Name the selector — an empty result is not a true negative (#15953) (#16102) (#16102)

  • (architecture) State that the installer and the Ansible fleet are sequential stages (#15993) (#16004) (#16004)

  • (guards) Write down the ratchet-baseline convention and its worked examples (#15897) (#15959) (#15959)

  • (guards) Fix eight stale referents and guard the two classes behind them (#15877, #15887) (#15896) (#15896)

  • (process) Never work from a stale base (#15884) (#15886) (#15886)

  • (guards) Correct nine comments asserting mechanisms that had moved (#15873, #15876, #15877) (#15878) (#15878)

  • (playwright) Say what omitting session_id does on every model that takes it (#15802) (#15875) (#15875)

  • (skills) State the anonymization invariant in research and adopt (#15829) (#15829)

  • (deps) Correct the stale protobuf instruction and drop the orphaned markdown declaration (#15600, #15622) (#15647) (#15647)

  • Move external_apps out of the repository (#15223) (#15573) (#15573)

  • (design) Release-directory-with-atomic-flip scheme for the live-tree rewrite (#13539) (#15558) (#15558)

  • (process) Batch same-scope issues per PR and never block on CI (#15434) (#15435) (#15435)

  • (skills) Align area taxonomy with labels in use, add cluster areas (#15423) (#15428) (#15428)

  • (process) Adopt GitHub native issue relationships as the default (#15423) (#15424) (#15424)

  • (deps) Align the openvino floor in four docs and guard documentation drift (#15415) (#15416) (#15416)

  • (research) Why commit progress feels slow — patterns, fixes and corrections (#15306) (#15413) (#15413)

  • (changelog) Restore 12 releases of notes and rebuild the version index (#15376) (#15377) (#15377)

Features

  • (ci) Gate the CodeQL backlog and the squash subject (#15333, #15473) (#17303) (#17303)

  • (ui-kit) Vitest harness + behavioral tests for the 5 Base* components (#17171) (#17171)

  • (admin) Coming-later panel for fine-grained permission scopes (#16825)

  • (slm) Data hygiene page -- orphan storage propose, orphan repair, audit view (#17040)

  • (secrets) Bridge connector credential templates to ConnectorCredentialStore (#16428)

  • (auth) The SLM accepts a user API key only on routes that declare one, refuses it with 403 elsewhere, and audits every key request (#16294, #16040, #16999)

  • (agents) A peer request carries its originator across every relay (#16950)

  • (approvals) Wire orphan-storage delete_candidate() behind approval-gate execution (#17039)

  • (secrets) Wire in SecretAuditLog, consolidate SecretVault into SecretsManager (#16429)

  • (ci) Add an open-PR cap to the pre-push gate (#17006)

  • (backend) Orphan-storage detector framework + code-source clone detector (#17038, #17039)

  • (agents) One-shot idle notice, split from #16948's PR (#16949)

  • (agents) Peer-to-peer messaging and idle notice (#16948, #16949)

  • (agents) Capture a terminal session's tenant at creation (#16975)

  • (agents) Live presence registry, one query across all three agent kinds (#16947)

  • (knowledge) Import Claude Code auto-memory into knowledge_facts (#16642)

  • (ci) Report backend capability the GUI cannot reach, split three ways (#16816)

  • (llc) Close out heartbeat runs whose agent stopped reporting (#16817)

  • (agents) Wire QuotaHeadroomStore's read side, add provider/cpu/queue claim kinds (#16951)

  • (knowledge) DocumentExtractor handles .csv/.json/.html like the GUI upload path (#16785)

  • (kb) Accept spreadsheet, presentation and OpenDocument uploads (#16775)

  • (documents) Verify ZIP-based office and ODF formats by content (#16773)

  • (collaboration) Add an always-visible pending-invitations indicator (#16470)

  • (collaboration) Surface pending invitations in the collaboration panel (#16470)

  • (slm-frontend) Type the GPU nodes read from the generated contract, not an inline generic (#15226)

  • (slm-frontend) The monitoring view shows each node's GPU, and says when it can't (#15226)

  • (slm) Nodes report their GPUs in the heartbeat, and the SLM serves them per node (#16280, #16281)

  • (knowledge) One Research surface — Web Tools and Settings become tabs (#16900)

  • (knowledge) Fold Connectors into Manage as a tab (#16897)

  • (admin) MCP server admin CRUD + live model pricing GUI (#16825) (#16875) (#16875)

  • (ci) Catch PR body gate failures before push, not after (#16859)

  • (llc) Give an agent workspace an owner and an expiry (#16818)

  • (collaboration) Persist activity/notification history, add invitation list+respond endpoints (#16460)

  • (collaboration) Wire the collaboration UI onto the real backend (#16443)

  • (llm) Add the cross-worker quota headroom store, persist real 429 headroom (#15026)

  • (drift) Check every file, name every exclusion (#16310)

  • (slm) Run the Redis panel on the SLM's node-service API, with logs, and colour AdminMonitoringView by what the backend sends (#16245, #16252)

  • (llm) Wire extractive prompt compression and enforce per-provider concurrency cap (#16526, #16527)

  • (agents) Renew work claims only while the run makes progress, and refuse writes under a lapsed claim (#15950)

  • (pricing) Refresh on every install and update, at first boot, on a set cadence, and on demand (#16231)

  • (pricing) Fetch live prices from LiteLLM and OpenRouter, cross-checked, with honest freshness (#16229)

  • (mcp) Apply isolated-runtime resource limits to admin-configured stdio servers (#11542, #3229)

  • (mcp) Standalone chat-tool bridge for external MCP servers, wired into prompt+dispatch (#11542)

  • (mcp) Admin CRUD for user-configured external MCP servers (#11542)

  • (mcp) Thread credential headers through MCPClient's remote transports; add stdio launcher allowlist (#11542)

  • (mcp) Thread an opt-in egress guard through MCPClient's remote transports (#11542)

  • (collaboration) Wire the collaboration UI onto the real backend (#16443)

  • (tooling) Check_run_status gains a pending-with-age helper (#16126) (#16534)

  • (preflight) Run every reproducible required check through the workflow's own command (#15933) (#16416)

  • (secrets) Wire in SecretAuditLog, consolidate SecretVault into SecretsManager (#16485) (#16486)

  • (auth) One permission vocabulary, key scopes as bundles, /me permissions, and API-key scope enforcement (#16270, #16040) (#16298)

  • (frontend) Wire router meta.minRole into a real guard, ranked against the backend's role order (#16244) (#16489)

  • (agents) Agents hold the scopes they declare, and a guard keeps the declaration honest (#15950) (#16175) (#16175)

  • (site) A landing page for the user root, which is currently a 404 (#16135) (#16136) (#16136)

  • (coordination) Project work claims onto the bus and expose the claim table (#15949) (#16085) (#16085)

  • (preflight) Run the two frontend gates locally when the workspace allows (#15933) (#16093) (#16093)

  • (coordination) Unlanded changes keep a scope spoken for, and stewardship transfers (#15987) (#16067) (#16067)

  • (coordination) Queue behind a held scope, ask the holder to yield, arbitrate (#15948) (#15992) (#15992)

  • (tooling) A required-contexts gate that can see an unreported check (#15995) (#16001) (#16001)

  • (ci) Make pr-preflight name every required status check (#15933) (#15960) (#15960)

  • (coordination) Work_claims — agents announce and reserve the scope they hold (#15947) (#15958) (#15958)

  • (llc) The three remaining agent routes do their work (#15905) (#15920) (#15920)

  • (llc) Expose the company CEO designation over HTTP (#15872) (#15921) (#15921)

  • (guards) Declare what a guard examined, and prove the floor fires (#15826) (#15840) (#15840)

  • (browser) Make an unscoped Playwright caller visible via path-scoped middleware (#15802) (#15855) (#15855)

  • (llc) Give every company a CEO, including the ones that already exist (#15770) (#15856) (#15856)

  • (api) Idempotency keys so a retried creation replays instead of duplicating (#15778) (#15813) (#15813)

  • (migrations) Require a data-loss statement on destructive migrations (#15776) (#15806) (#15806)

  • (llc) One reporting relation spanning people and agents, and an org chart that is a hierarchy (#15763) (#15792)

  • (auth) Mint admin.reporting_line.write with its enforcement gate (#15765) (#15793) (#15793)

  • (guards) Standing checks for bare-default route deps and fixed-path fixture teardown (#15769, #15785) (#15790) (#15790)

  • (llc) A company tool catalogue over the registry, not a second identity store (#14852) (#15753) (#15753)

  • (slm) Credential-free self-update trigger over a permission-gated local socket (#15746) (#15746)

  • (backlog) Report umbrella-label drift from the native sub-issue relation (#15440) (#15595) (#15595)

  • (backlog) Read umbrella checklists into native relationships (#15439) (#15581) (#15581)

  • (update) Gate venv removal on install provenance, not a name diff (#15067) (#15572) (#15572)

  • (health) Report the served frontend bundle, not just the process (#15462) (#15465) (#15465)

  • (llc) Mirror the contact API validation as field errors and say what delete destroys (#14105) (#15471) (#15471)

  • (llc) Wire contact create and delete to the endpoints that already exist (#14105) (#15456) (#15456)

  • (llc) Offer the tool colour dimension and surface variable i18n keys (#14190, #14123) (#15452) (#15452)

  • (document) Fold PDF/DOCX tables into every ingest path (#14970) (#15372) (#15372)

Miscellaneous

  • (vehicle) Land 4 small branches (#16249, #16394, CodeQL fixes, dependabot uv) (#17116) (#17116)

  • (deps) Consolidate 13 dependabot PRs into one CI run (#17205) (#17205)

  • (vehicle) V0.9.1 — consolidate 6 ready PRs into one CI run (#17194) (#17194)

  • (vehicle) V0.9.0 2026-09-20 -- consolidate 5 orphaned branches (#16249, #16394, #16466, #16143, #15021) (#17149) (#17149)

  • (frontend) Remove the two dead useVncControls shims (#14907) (#17180) (#17180)

  • (vehicle) Carry issue-16354-unicode-normalisation into the security batch (#17148)

  • (guards) Re-pin prompt-injection-detector-strict-mode floor 2944 -> 2945 (#16354)

  • (vehicle) Carry issue-17141-approval-failure-trail into the 2026-09-20 batch (#17146)

  • (vehicle) Carry issue-17138-lazy-connectors into the 2026-09-20 batch (#17145)

  • (guards) Re-pin hooks-path-override floor 6481 -> 6484 (#17138)

  • (vehicle) Carry issue-17118-shallow-tristate into the 2026-09-20 batch (#17140)

  • (vehicle) Carry the command-approvals branch into the security train (#17052) (#17106)

  • (vehicle) Merge the rest train into command approvals for the security train (#17052)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (agents) Consolidate the agent-output fix into the session-ownership PR (#17052, #17074)

  • (agents) Merge main into PR-A (#17052)

  • (agents) Merge main now that #17051 has landed (#17052)

  • (vehicle) Drop stale a2a.py size-baseline entry, now compliant (#17048)

  • (secrets) Tracked reasons for #17087's 21 new baseline entries

  • (secrets) Audit worker_settings.py's pinned-model hex entries as non-secrets (#17087)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Carry #17113 (d69a1d1) into the security consolidation train (#17048)

  • (vehicle) Merge main into the 7b security train (#16957)

  • (security) Carry SLM API key scopes (#16040, #16294, #16999)

  • (security) Carry a2a capability gating (#16957)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Carry #17129 (75878df) into the rest consolidation train (#17048)

  • (vehicle) Carry #17117 (9fc5356) into the rest consolidation train (#17048)

  • (vehicle) Carry #17122 (4ecfcd1) into the rest consolidation train (#17048)

  • (vehicle) Carry #17119 (e1533c9) into the rest consolidation train (#17048)

  • (vehicle) Carry #17008 (9d2e036)

  • (vehicle) Carry #16728 (9de661f)

  • (vehicle) Carry #17050 (e0416f3)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Carry #16970 (809f350)

  • (vehicle) Carry #17107 (74dc31b) into the rest consolidation train (#17048)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (agents) Consolidate peer routing (#16986)

  • (agents) Consolidate the idle notice (#16949) (#17015)

  • (agents) Consolidate the presence stack onto main (#16947, #16975, #16948) (#16996)

  • Lower service.py's ratchet to match the merged #16947+#16975 result

  • (vehicle) Carry f4's strict-mode floor re-pin into the ws-auth train (#17129) (#17127)

  • (vehicle) Carry main's base fix #17127 (8bb7591) and #17131 into the ws-auth train (#17124)

  • Claim worktree for issue #17130 secrets baseline exclusion fix

  • (vehicle) Merge #16959 cd87aab into vehicle-v090-2026-09-18-ci-hooks

  • (vehicle) Merge #16882 9410b8c into vehicle-v090-2026-09-18-ci-hooks

  • Claim worktree for #15317

  • (vehicle) Merge #16958 c3d8b47 into vehicle-v090-2026-09-18-ci-hooks

  • (vehicle) Merge #16952 c19678e into vehicle-v090-2026-09-18-ci-hooks

  • (vehicle) Merge #17032 0114377 into vehicle-v090-2026-09-18-ci-hooks

  • (hooks) Take the root from the hook's working directory, not a bare rev-parse; document finishing a pick of an old subject (#17029)

  • (hooks) Track the commit-msg hook, install it, and reject a subject without the issue-reference convention (#17029)

  • (vehicle) Merge #16938 705a0f8 into vehicle-v090-2026-09-18-ci-hooks

  • (session) Update handoff with post-hoc audit findings (#16642)

  • (session) Write end-of-session handoff for issue-16642 (#16642)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (ratchet) Lower knowledge_population.py's file-size ceiling to 1525 (#16642)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (session) Write end-of-session handoff for issue-16707-16708-kb-bugfix-batch (#16707, #16708)

  • Merge main into #16778 (refresh behind by #16597, #16761)

  • Claim worktree for #16820 ratchet resolution

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • Session handoff for issue-17024-tool-args-hooks (#17024)

  • Claim worktree for #17024

  • (ci) Merge main into the ws-auth vehicle (#17009)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge #16790 c5f51c0 into vehicle-v090-2026-09-18-docparser

  • (session) Write end-of-session handoff for issue-16784-16785-document-format-gaps (#16785, #16784)

  • Merge main into #16790 (refresh behind by #16597, #16761)

  • Claim worktree for #16784, #16785

  • (vehicle) Merge #16788 cfb0d49 into vehicle-v090-2026-09-18-docparser

  • (vehicle) Merge #16783 ca95302 into vehicle-v090-2026-09-18-docparser

  • (documents) Merge main into the #16773 format-verification branch (#16773)

  • (ci) Merge main into the ws-auth vehicle again (#17009)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge #17037 f0b8b13 into vehicle-v090-2026-09-18-ansible

  • (changelog) Add fragment for the secrets-baseline reasons guard (#16299)

  • Claim worktree for #14288

  • (ci) Merge main into the ws-auth vehicle (#17009)

  • (vehicle) Merge #16911 35cd9e6 into vehicle-v090-2026-09-18-chat (#16911)

  • (vehicle) Merge #16472 0550f48 into vehicle-v090-2026-09-18-chat (#16472)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • Claim worktree for #16280

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (claim) Helper-02 takes the node GPU data path (#16280, #16281)

  • Claim worktree for #16320

  • (claim) Helper-02 takes FIFO queueing for the heavy suites (#16320)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge #17027 abce3e7 into vehicle-v090-2026-09-18-ws-auth

  • (changelog) #17017 fragment carries its PR number (#17017)

  • (changelog) #17017 fragment (#17017)

  • (changelog) #17009 fragment carries its PR number (#17009)

  • Session handoff for issue-17028-bug-ledger (#17028)

  • Claim worktree for #17028

  • Claim worktree for #17021

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (session) Write end-of-session handoff for docs/research-multi-agent-executive-advisor (#16766)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • Claim worktree for #15234

  • Claim worktree for #16835

  • (hooks) Merge main into the #16812 core.hooksPath branch (#16812)

  • Merge main into #16811 (refresh past #16824's SPDX fix)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • Merge main into #16810 (refresh past #16824's SPDX fix)

  • (secrets) Merge main into the #16426 admin-gate branch (#16426)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (kb) Merge main into the #16770 chokepoint branch (#16770)

  • (deps) Bump the uv group across 1 directory with 2 updates (#16597) (#16597)

  • (deps) Update scikit-learn requirement (#16761) (#16761)

  • (train) Land vehicle, 9 PRs (#16751) (#16751)

  • (vehicle) Merge main into vehicle 2f after #16752 landed (#16751)

  • (vehicle) Lower the frontend contract responses baseline to 193 after dropping #16471's duplicates (#16460)

  • (vehicle) Keep mcp_server/autobot_server.py at its 948 ceiling after the import union (#16449)

  • (vehicle) Merge PR #16723 into vehicle 2f (#16723) (#16723)

  • (kb) Merge main into the #16693 backfill, keeping ownerless SYSTEM facts indexed (#16693)

  • (vehicle) Merge PR #16732 into vehicle 2f (#16732) (#16732)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge PR #16454 into vehicle 2f (#16454) (#16454)

  • (vehicle) Merge PR #16730 into vehicle 2f (#16730) (#16730)

  • (vehicle) Merge PR #16471 into vehicle 2f (#16471) (#16471)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge PR #16719 into vehicle 2f (#16719) (#16719)

  • (vehicle) Merge PR #16725 into vehicle 2f (#16725) (#16725)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Restore generated API types to origin/main's current state

  • (settings) Drop two tests superseded by independently-merged PRs (#16278, #16279)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge PR #16734 into vehicle 2f (#16734) (#16734)

  • (vehicle) Merge PR #16738 into vehicle 2f (#16738) (#16738)

  • (deps) Bump actions/upload-artifact in the all-dependencies group

  • (train) Land vehicle, 7 PRs (#16747) (#16747)

  • (vehicle) Merge main into the deps vehicle after 2e landed (#16747)

  • (train) Land vehicle, 9 PRs (#16746) (#16746)

  • (vehicle) Merge PR #16696 into vehicle 2e (#16696) (#16696)

  • (vehicle) Merge PR #16705 into vehicle 2e (#16705) (#16705)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge PR #16706 into vehicle 2e (#16706) (#16706)

  • (vehicle) Merge PR #16691 into vehicle 2e (#16691) (#16691)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge PR #16703 into vehicle 2e (#16703) (#16703)

  • (vehicle) Merge PR #16689 into vehicle 2e (#16689) (#16689)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (vehicle) Merge PR #16721 into vehicle 2e (#16721) (#16721)

  • (vehicle) Merge PR #16483 into vehicle 2e (#16483) (#16483)

  • (vehicle) Merge PR #16700 into vehicle 2e (#16700) (#16700)

  • (vehicle) Merge PR #16743 into vehicle deps (#16743) (#16743)

  • (deps) Bump the all-dependencies group across 1 directory with 11 updates

  • (vehicle) Merge PR #16742 into vehicle deps (#16742) (#16742)

  • (deps) Bump the all-dependencies group

  • (vehicle) Merge PR #16741 into vehicle deps (#16741) (#16741)

  • (deps) Update huggingface-hub requirement

  • (vehicle) Merge PR #16740 into vehicle deps (#16740) (#16740)

  • (deps) Update huggingface-hub requirement

  • (vehicle) Merge PR #16739 into vehicle deps (#16739) (#16739)

  • (deps) Bump the all-dependencies group across 1 directory with 13 updates

  • (vehicle) Merge PR #16737 into vehicle deps (#16737) (#16737)

  • (deps) Update psycopg2-binary requirement

  • (vehicle) Merge PR #16474 into vehicle deps (#16474) (#16474)

  • (deps) Bump the npm_and_yarn group across 4 directories with 2 updates

  • (train) Land batch 2d vehicle, 14 PRs (#16702) (#16702)

  • (ssot) Prune stranded hardcoded-value baseline entries from #16713 (#16702)

  • (vehicle) Merge main into the 2d vehicle (#16702)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (claim) Helper-02 takes the Redis service and detailed-health move into the SLM (#16245, #16252)

  • (worktree) Claim for GUI consistency batch (#15031)

  • (claim) Helper-02 takes the env-docs merge hotspot (#16317)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • Re-trigger CI after bot type-regen push (#11542, #16458)

  • (types) Regenerate generated API types from OpenAPI schema(s)

  • (deps) Bump the all-dependencies group (#16587) (#16587)

  • (deps) Bump mcp (#16586) (#16586)

  • (deps) Bump the all-dependencies group (#16585) (#16585)

  • (deps) Bump the all-dependencies group (#16582) (#16582)

  • (deps) Update numpy requirement (#16581) (#16581)

  • (deps) Bump the all-dependencies group (#16578) (#16578)

  • (deps) Bump the all-dependencies group with 3 updates (#16576) (#16576)

  • (deps-dev) Bump the all-dependencies group (#16574) (#16574)

  • (deps-dev) Bump the oxlint group (#16573) (#16573)

  • (deps) Bump the all-dependencies group across 1 directory with 9 updates (#16572) (#16572)

  • (slm-frontend) Retire getApiUrl(), route its display-only callers through getSlmApiBase() (#15761) (#16432)

  • (frontend) Retire useApi.ts, the deprecated useApiWithState composable family (#15025) (#16424)

  • (docker) Retire the four agent Dockerfiles whose modules no longer exist; agents run in-process (#16361) (#16409)

  • (deps) Carry dependabot's npm security bumps onto main (hono 4.13.7 and transitive; supersedes #16171) (#16408)

  • (git) Rename Dev_new_gui to main and main to release across the repo (#16461) (#16487) (#16487)

  • (deps) Bump the all-dependencies group across 1 directory with 22 updates (#15980) (#15980)

  • (deps) Bump the all-dependencies group in /autobot-infrastructure/shared/docker/ai-stack with 12 updates (#15977) (#15977)

  • (deps) Bump the all-dependencies group in /autobot-tts-worker with 4 updates (#15978) (#15978)

  • (deps) Bump the all-dependencies group in /autobot-backend with 16 updates (#15972) (#15972)

  • (deps) Freeze the ansible-core pin against dependabot (#15983) (#15999) (#15999)

  • (deps) Bump the all-dependencies group across 1 directory with 21 updates (#15971) (#15971)

  • (deps) Bump pydantic (#15979) (#15979)

  • (deps) Bump the all-dependencies group (#15976) (#15976)

  • (deps) Update torch requirement (#15974) (#15974)

  • (deps) Bump the all-dependencies group (#15973) (#15973)

  • (deps) Bump the all-dependencies group with 2 updates (#15970) (#15970)

  • (deps-dev) Bump the oxlint group (#15969) (#15969)

  • (deps) Bump the all-dependencies group (#15968) (#15968)

  • (browser-worker) Retire the orphan playwright config, record why (#15695, #15694) (#15702) (#15702)

  • (ci) Configure CodeRabbit so it reviews the branch pull requests actually target (#15658) (#15658)

  • (deps) Resolve the nltk declaration and enforce ansible/requirements version parity (#15551, #15568) (#15599) (#15599)

  • (deps) Bump qs to 6.16.0 across the five npm workspaces (#15521) (#15546) (#15546)

  • (deps) Bump the all-dependencies group (#15381) (#15381)

  • (deps) Bump the all-dependencies group (#15384) (#15384)

  • (deps) Bump the all-dependencies group with 16 updates (#15385) (#15385)

  • (deps) Bump the all-dependencies group (#15383) (#15383)

  • (deps) Bump the all-dependencies group with 3 updates (#15382) (#15382)

  • (deps) Bump the all-dependencies group (#15380) (#15380)

  • (deps) Raise every guarded openvino pin to the SSOT floor (#15388) (#15406) (#15406)

  • (deps-dev) Bump the oxlint group (#15378) (#15378)

  • (deps) Bump the all-dependencies group (#15390) (#15390)

  • (deps) Bump the all-dependencies group (#15389) (#15389)

  • (deps) Bump the all-dependencies group (#15386) (#15386)

Other / Uncategorized

  • (api) Gate captcha, metrics and diagnostics routers (#16375)

  • (models) Pin 3 unpinned HF loads, widen bandit to npu-worker (#17087)

  • (ai-ml) Pin HuggingFace model revisions and verify weight integrity (#13034)

  • (secrets) Fix the live NPU worker's 422 payload echo too (#16444 review)

  • (secrets) Shared FastAPI validation-error handler, all 4 real apps (#16444 review item 1)

  • (secrets) Fix 5 findings from #16444's independent review

  • (kb) Re-scope #16985 to a guard -- every connector already reaches store_fact (#16985)

  • (security) Redact connector content at the base-class ingestion chokepoint (#16985)

  • (infra) Stop binding ChromaDB to every interface by default (#15317)

  • (a2a) Widen pii_pipeline credential/PEM detection (#16642)

  • (knowledge) Redact ssh command targets, widen redaction test coverage (#16642)

  • (knowledge) Redact secrets at import, scope imported facts to admin-only (#16642)

  • (kb) Multi-source relation-graph/citation expansion reads the wrong key shape from get_fact_relations() (#16708)

  • (websocket) Authenticate /api/intelligent_agent/stream before processing (#17000)

  • (knowledge) Close remaining credential-redaction gaps (#13708)

  • (secrets) Content-scanning credential redactor -- catches a credential in free text (#13708)

  • (rag) Route the chat's RAG path through the content firewall (#16771)

  • (kb) Ai-stack and RAG search routes filter results by the caller's access (#16665, #16654)

  • (deploy) Generate backend_secret_key and grafana_admin_password on first run (#16299)

  • (secrets) Guard every .secrets.baseline entry for a tracked reason (#16299)

  • (desktop) Authenticate to VNC server-side, close the VITE_* password leak (#16299)

  • (websocket) Throttle the fallback-usage warning per route (#16457)

  • (websocket) Stop leaking tokens into logs on read (#16457)

  • (websocket) Migrate two more clients, guard the rest (#16457)

  • (websocket) Close remaining echo gaps and fix red CI (#16457)

  • (websocket) Migrate LiveEventService's /ws/live to the subprotocol (#16457)

  • (websocket) Every authenticated WebSocket echoes the bearer subprotocol through one helper (#16457)

  • (websocket) Auth token travels via Sec-WebSocket-Protocol, not the URL (#16457)

  • (deps) Sync two non-shipping manifests to the fastapi/uvicorn security floor (#15661)

  • (skills) Route catalog fetch through fetch_safe_url, closing CodeQL alert 1030 (#16595)

  • (multimodal) _store_result no longer swallows every exception, including the tenancy refusal (#15234)

  • (collaboration) The REST presence read enforces its documented VIEWER check (#16580)

  • (ci) A malformed token cannot reach a CI log or a traceback (#15204)

  • (secrets) Get_secret returns the owner, unblocking connector credentials (#16579)

  • (secrets) Admin-gate infrastructure hosts, fix vault-backed template names (#16426, #16427)

  • A shallow code_source checkout no longer poisons the deletion-planner's bootstrap (#16310)

  • (kb) Sanitize every knowledge-base write at the store_fact chokepoint (#16770)

  • (kb) Backfill ownerless ingested documents as SYSTEM, frozen to the facts present at deploy (#16693)

  • (memory) Make UNSCOPED_ALL_USERS a non-str sentinel, not a comparable string (#16701)

  • (memory) /verbatim-memory/search and session delete are scoped to the caller (#16701, #16654)

  • (kb) The MCP knowledge tools return non-private facts only (#16666)

  • (settings) Record the real caller on /sync and /hardware-priority, and test the anonymous and cross-org refusals (#16278)

  • (kb) Admit knowledge search and the aggregator as explicit read APIs for the admin bypass (#16745)

  • (kb) The MCP add route drops a non-admin's org, group and share fields again -- keeping them let a caller file facts into orgs and groups they are not in (#16663)

  • (kb) The MCP add route refuses a non-admin's platform-wide request with 403 instead of silently stripping it (#16663)

  • (kb) Scope the category-count cache and drop admin-gated CRUD routes from the T3 allowlist (#16665, #16654)

  • (kb) The multi-source search/context/graph routes filter results by the caller's access (#16665, #16654)

  • (kb) The canonical POST /search route filters results by the caller's access (#16665, #16654)

  • (kb) The raw ChromaDB explorer is admin-only, and its link and route are hidden from non-admins (#16666)

  • (redis) Every Ansible-rendered client pairs its Redis password with a username, and the deploy scripts drop the hardcoded password (#16678, #16686, #16657)

  • (code-sync) Check the symlink parent's realpath so CodeQL sees the containment (#16713)

  • (code-sync) Fix two #16713 review findings (#16702)

  • (kb) Only admins make a fact platform-wide; visibility writes keep the store, ChromaDB and ownership indexes current (#16663, #16670) (#16677) (#16677)

  • (redis) Backend.env always sends a username with the Redis password (#16668) (#16679) (#16679)

  • (code-sync) Resolve py/path-injection CodeQL alerts in code_sync.py (#16713)

  • (mcp) External tool names can't shadow internal ones; fix owner_id drift (#16458)

  • (mcp) Gate external server tools through the real RBAC path, no bypass (#11542, owner decision on #16458)

  • (collaboration) Authenticate and authorize the session-presence WebSocket (#16455)

  • (auth) Fail closed when the password-epoch check cannot reach Redis (#16411) (#16433) (#16433)

  • (redis) The SLM generates the Redis password and every client sends it as default while the server stays nopass (#16627) (#16660) (#16660)

  • (kb) The ownership helpers fail closed and read list metadata as lists (#16662) (#16669) (#16669)

  • (redis) Optional ACL username in every Redis client, unset by default (#16626) (#16632) (#16632)

  • (routers) Gate knowledge_search, knowledge_search_aggregator, knowledge_suggestions and voice_stream (#16507) (#16508) (#16508)

  • (lint) Classify test_first_remediation.py as production, fix the 2 real gaps it surfaced (#16514) (#16518)

  • (chat) Finish #16545's PII/injection scan on /stream-ai-stack and resume (#16561) (#16567)

  • (collaboration) Authenticate and authorize the session-presence WebSocket (#16455) (#16456)

  • (imports) Every module under api/ and autobot_shared/ must import inertly (#16198) (#16199)

  • (research) Treat fetched repos and pages as untrusted data (#16488) (#16492)

  • (browser) Validate the URL in capture_screenshot (#13204) (#16544)

  • (auth) Authenticate every transcriber route, and stop anonymous callers owning every recording (#15758) (#16259)

  • (chat) Scan/redact PII and flag injection risk on every raw chat message (#16529, #16530) (#16545)

  • (auth) Admin-gate the open routers, settings, teams and user-account routes (#15745, #16278, #16276, #16277, #15738, #16279) (#16240) (#16240)

  • (voice) Make POST /check evaluate without touching the shared detector (#16247) (#16266) (#16266)

  • Untrack two committed key files and make secret scanning see the whole tree (#16275) (#16300) (#16300)

  • (reach) Raise the meta-floors to measured size and migrate four hand-rolled floors (#16147, #15928) (#16296) (#16296)

  • (git) Scrub the environment at six production git call sites (#16179) (#16184) (#16184)

  • (ci) The npm audit workspace loops word-split, so a path with a space would be skipped (#16190) (#16193) (#16193)

  • (git) Scrub shell git ls-files, and gate it so it stays scrubbed (#15506) (#16118) (#16118)

  • (ci) The npm audit gate scanned one workspace and read failed scans as clean (#16131, #16185) (#16169) (#16169)

  • (auth) Enumerate router gating by mechanism, before fixing anything (#15745) (#16170) (#16170)

  • (reach) Ratchet the hooksPath floor before it turns every open branch red (#15928) (#16181) (#16181)

  • (auth) Name the two password-change limiters for the surfaces they guard (#15757) (#16176) (#16176)

  • (prompts) No shipped prompt may instruct the model to refuse nothing (#16105) (#16117) (#16117)

  • (git) Refuse the hooksPath override that silently disables every hook (#15961) (#16097) (#16097)

  • (slm) The js-yaml advisory is live in an unaudited workspace (#16131) (#16132) (#16132)

  • Allow the two unfixable dev-only npm advisories (#16089) (#16103) (#16103)

  • (size) Count the oversized files the size hook's exclusions hide (#15897) (#16068) (#16068)

  • (reach) One measured TRACKED_PY_FLOOR instead of seven copies of 3000 (#15928) (#16073) (#16073)

  • (reach) Pin every declared floor to its population (#15928) (#16048) (#16048)

  • (repo_tests) Route nine ls-files sites through tracked_paths (#15926) (#16057) (#16057)

  • (hooks) A CLI entry point may print, and the exemption says which files it applied to (#16010) (#16010)

  • (repo) Five guards walked into other checkouts of this repository (#15955) (#15962) (#15962)

  • (mcp) Git_mcp ran git with the ambient environment, so GIT_DIR bypassed its validated repo_path (#15991) (#16003) (#16003)

  • (ci) Record glob-declared guard reads, and say what the green covers (#15900) (#15994) (#15994)

  • (primitive) Git-side exclusions on tracked_paths, and a shrink-only bypass baseline (#15926) (#15990) (#15990)

  • (primitive) One repo_root() for 161 hand-rolled tree roots (#15925) (#15984) (#15984)

  • (llc) Scope the goal ancestry walk, and stop it defaulting off (#15930) (#15944) (#15944)

  • (tasks) Discover the indexer's callers instead of naming two of them (#15902) (#15919) (#15919)

  • (config) Fail a dict literal that repeats a key, and fix the two that do (#15908) (#15913) (#15913)

  • (deploy) Four deploy facts stated twice, now stated once and checked (#15707, #15724, #15687, #15604) (#15901) (#15901)

  • Log-flood guard + unsaved-work guard on recursive sandbox delete (#15774, #15777) (#15782) (#15782)

  • (ci) Make the python filter reach the trees its guards read (#15713) (#15715) (#15715)

  • (ansible) Derive the git_repo_root aliases, keep the sudoers-bound literal (#15705, #15601) (#15706) (#15706)

  • (ansible) Derive every code_source_dir fallback from the SSOT (#15632, #15601) (#15704) (#15704)

  • (state) Give every persisted concept a declared system of record (#15663) (#15668) (#15668)

  • (infra) Make both generators dry-run by default, and prove the scheduler survives a missing store (#14563, #14479) (#15579) (#15579)

  • (agents) Gate extract_content and delegate at BEFORE_TOOL_EXECUTE, and record the three that stay ungated (#14529, #14491) (#15461) (#15461)

  • Consolidate cross-GUI composable/type duplication into @autobot/ui (#14907, #14908) (#15403) (#15403)

  • (enums) Collapse CausalSeverity, IngestVerdict/EgressVerdict, and verification_method into canonical types (#15404) (#15404)

  • (secrets) Close the final two #15276 tail sites in the vault-resolution sweep (#15355) (#15355)

Refactoring

  • (agents) Conversation-owner resolution gets its own module (#17053)

  • (ai-ml) Extract load_verified() to shrink ai_hardware_accelerator.py under its ratchet (#17087)

  • (approvals) Unify the general and LLC approval systems (#17043, #17056)

  • (orphan-storage) Consolidate safe_error_reason into safe_response (#17065)

  • (slm) Extract the service-remediation tracker helpers, trim reconciler.py back under its ratchet ceiling

  • (test) Extract a shared mock-result helper, fixing a file-size ratchet trip (#16990)

  • (knowledge) Re-derive the firewall guard through the new indirection (#16771)

  • (knowledge) Split three files back under their size ceilings (#16771)

  • (gpu) Build both collectors' GPU metrics from one mapping in gpu_telemetry (#16289)

  • (backend) Gpu_detection reads nvidia-smi and rocm-smi through gpu_telemetry (#16289)

  • (backend) Both GPU metrics collectors read rows through gpu_telemetry (#16289)

  • (backend) Worker_node and diagnostics read GPUs through gpu_telemetry (#16289)

  • (tests) Move conftest.py's module-loading helpers to testkit (#16480)

  • (frontend) Remove the unreachable user-GUI Redis client and SettingsPanel's unrendered health loader (#16245, #16252)

  • (slm-frontend) One useFleetTools for the tools ToolsView and FleetToolsTab share (#15665)

  • (mcp) Extract multi-server aggregation, add streamable-HTTP transport (#11542)

  • (slm) Derive the role list's names, units, health and ports from the role manifests (#16025) (#16441) (#16441)

  • (agents) Extract NPUCodeSearchAgent's pattern helpers, add declared_scopes (#16173) (#16496)

  • (lifespan) Split cleanup_services and _init_graph_rag_service into steps under the length limit (#16250) (#16509)

  • (slm-backend) Retire the 7 dead SLM monitoring modules whose function is live elsewhere (#16282) (#16308)

  • (api) Split analyze_diff so the last unscrubbed git call site could land (#16186, #16179) (#16212) (#16212)

  • (slm) Split four frozen modules so their ceilings stop blocking work (#15495, #15496) (#16099) (#16099)

  • (agents) Extract the exchanged data types so base_agent clears its ceiling (#15950) (#16106) (#16106)

  • (site) Remove the root-page copy, its source is now one repo (#16145) (#16149) (#16149)

  • (shared) Extract the model pricing table so it can grow (#15860) (#15910) (#15910)

  • (shared,npu-worker) Decompose http_client.py and the Windows npu_worker so their discarded task launches can be retained (#15641, #15642) (#15655) (#15655)

  • (guards) Split the budget ledger out of the detector that enforces it (#15590) (#15592) (#15592)

  • (config) Consolidate the orphaned settings module onto SSOT (#12750) (#15574) (#15574)

  • (config) Put four restated versions on the source of truth they already had (#15408, #13842, #13843, #15298) (#15567) (#15567)

  • (deploy) Split get_default_deployed_dir into a reader and a writer (#13539) (#15564) (#15564)

  • (slm) Collapse the forked SLM REST and node-proxy clients onto one each (#14039, #14886) (#15544) (#15544)

  • (slm-frontend) Consolidate /services and replication surfaces onto Orchestration (#15224, #15225) (#15405) ([#15405](https://