Repository navigation
chore(train): merge train 2026-10-11 #1 — 8 approved PRs, one CI run (#15068) - #18295
Conversation
…chet over unguarded outbound calls (#17576)
… stricter guarded detection (#17576)
… hosts, websocket kind, strict policy dispatch (#17576)
…r internal (#17576) ipaddress reports ::ffff:169.254.169.254 as neither link-local nor in the refused set until it is unwrapped; the never-internal check now unwraps ipv4_mapped first. Mutation without the unwrap fails both new mapped-address cases.
…4998 -> 5061 (#17576) Measured by the mechanism on this tree: population 5136, window [4986, 5136] (skips=0, growth=150), so 4998 sat in the bottom 15 and went red once this slice's new modules joined the population. Mid-window is 5061.
… symbol-fork baseline, satisfied by the shared middleware (#18088)
…eal tree, not only a monkeypatched one (#18088)
…binding its User and its own hooks (#15068)
…the generator and every cache key (#18143)
…r reaches its private hooks (#18185)
…fuses, never a different model's vectors (#18185)
…with its reason (#18185)
…so a model change never serves another model's vectors (#18143)
…00 with empty results (#18185)
…of reporting no matches (#18185)
…, so no request falls into the mock path (#18143)
…ed space, and a refused batch query keeps its reason (#18185)
…hree-space mismatch is tracked separately (#18185)
… refuses, never emits a vector in another space (#18185)
…ch refuses, and the refusal reaches the caller (#18185) - knowledge/index_embedding_space.py records, per searched index, the model and dimension that built it. The hybrid FAISS index and the four accelerator collections have no determinable space, so they refuse with the reason. The code index is CodeBERT/768. - NPUSemanticSearch: the hybrid index is searched only when populated, and only through the table. Otherwise the KB embeds the query in its own space, with the real query text (it used to send the literal "search query"), so enable_npu_acceleration=False works on hosts with no accelerator. - The L1 and L2 cache keys name the index space that produced the vector, via make_key (#18143 AC1). - The query dimension is asserted before every vector search. Cross-modal, batch and code-collection searches refuse instead of returning an empty result. - The code-search agent re-raises EmbeddingUnavailableError past every broad except on the semantic and hybrid paths, and the code-search and natural-language routes turn it into a 503 with the reason. - /test/connectivity: fallback_available is False on a refusal and None when it was not determined.
…etails move to one helper, within the 30-line rule (#15068)
… exported LLM_DEFAULTS, parity-tested against the SSOT (#15502)
…d divergences are pinned (#15502)
…ysis filter model is served by the backend (#15502) GET /api/analytics/codebase/env-analysis/default-model returns the quality-tier model the /env-analysis llm_model default binds to. useEnvironmentAnalysis fetches it once and omits llm_model while it is unknown. LLM_DEFAULTS, LLMConfig and config.llm are deleted along with their tests and the VITE_LLM_DEFAULT_MODEL / VITE_LLM_EMBEDDING_MODEL sync-env lines. A guard now fails any local-model string literal under autobot-frontend/src. Refs #15502
…els from the source-of-truth tier map (#15502) Visible change: the planner uses config.llm.planning_model (AUTOBOT_PLANNING_MODEL); the GUI-selected model no longer drives planning. settings.json drops the nested top-level settings duplicate, every model value and the gpt-3.5-turbo / DialoGPT-medium provider stubs. OrchestratorConfig no longer reads llm_config.orchestrator_llm. agents.yaml puts kb_librarian, knowledge_extraction and knowledge_retrieval on mistral:7b-instruct (the deployed ai-stack assignment). Backend startup logs one WARNING when a config.yaml selected_model disagrees with the tier map; nothing is rewritten. The guard pins settings.json model-free and the agents.yaml KB roles to the instruction tier. Refs #15502
…eckout + paths-filter (#15360)
… class and asserts they are present (#15502) llm_gpu_models gains mistral:7b-instruct and dolphin-llama3:8b, non-canonical gemma3:4b is dropped and embeddings are nomic-embed-text:latest. After the pulls the role lists what Ollama holds (:latest normalised), fails with the missing models named, and prints a WARNING naming the GPU-class tiers a CPU-only node skipped. agent_config and the two deploy playbooks use the normalised embedding name. The guard pins both node-class lists, their union against the canonical tiers, and the inline pull lists. The stale gemma3:4b hardcoded-value baseline entry is removed. Refs #15502
…tale frontend llm block in the SSOT architecture doc (#15502)
…from config, so user bundles stop carrying a copy (#13630)
|
Important Review skippedToo many files! This PR contains 219 files, which is 119 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configuration
⛔ Files ignored due to path filters (4)
📒 Files selected for processing (219)
You can disable this status message by setting the
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
✅ SSOT Configuration Compliance: Passing🎉 No new hardcoded values of either class — Known backlog in |
… the combined train (#15068) - api.ts: applied CI's own generated-types.patch (the oauth-bundle-strip routes from #18276, the env-analysis default-model route from #18274, and #18230's code-search docstring). - oauth_bundle_strip: the two failure logs name the bundle by record id (bundle_ref), never a 'secret' expression (py/clear-text-logging-sensitive-data). - credential_write: the envelope-mirror failure log carries the exception type, not its text, which can echo the value being written. - api/search: a refused embedding space returns the fixed REFUSED_SEARCH_ERROR to the client; the reason stays in the log (py/stack-trace-exposure). The test pins that the reason is absent.
Combination effects: - reach floors re-pinned mid-window from the measured populations: blanket-skip 2824, one-claim-registry 3065, enum-hand-copy-census 6349; EXCLUDED_TREE_DEBT 47 -> 46. - THREAT_MODEL anchors into credential_store.py: ConnectorCredentialStore :211, _require_owner :642. - reach_scope record for #18260 egress-default-outbound-call-sweep (declared, never recorded). - man-page guard: the #18288 allowlist names the indexer path as data, not an invocation. - egress baseline: #18287 folded three per-script probes into deployment_registry.py (deploy_autobot, deployment_rollback, metrics_collector -> deployment_registry); 459 -> 457. Constituent content, fixed in the train by owner decision: - #18276: the cancellation test waits with eventually() and zero-yields, not fixed sleeps; the preview response field is bundle_ids (record ids), not secret_ids, so no response model reaches a credential-shaped name. - #18260 SITE_FLOOR and #18287 MIN_FILES_SCANNED migrated to declare() (#16147), floors pinned mid-window: 443 call sites, 4676 scanned files. 321 passed locally across every failing test and every touched file.
…tifiers out of three log lines (#15068) - deployment-mode-detector-scan and egress-default-outbound-call-sites declare roots= and are recorded in reach_scope_claim (every declaration is scoped or listed UNSCOPED). - CodeQL py/clear-text-logging-sensitive-data follows the value from the callers secret_id, so renaming did not help: the strip failure logs and the envelope-mirror failure log now carry no identifiers. The strip report and audit trail keep the bundle id; the mirror log keeps the exception type. 621 passed locally (reach_declarations, reach_scope_claim, egress guard, detector, strip).
… longer fails in every pre-push (#17844) main went red on reach_scope_claim_17844 when run alone, which the pre-push hook does on any repo_tests change, so every push was blocked. Root cause: the test imported a hand-kept list of guard modules; the #18295 train fixups recorded scopes whose modules it never imported, and a full run hid it because other tests imported them first. Fixed as a class: the test imports repo_tests.reach_declarations_test, whose _import_every_guard() loads every guard, so the live set is the same alone as in a full run and no hand list can drift again. With the full registry visible, two gaps of #18310 surfaced and are recorded: the tool-effect-table-scan scope, and its ALLOWANCE_VERDICTS row. collectable-modules-inert-on-import re-pinned mid-window (population 2922, window [2722, 2922]) after the tree grew. reach_scope_claim alone: 10 passed; reach_declarations + reach_scope_claim: 505 passed.
Thinking Path
Owner decision (2026-10-11): approved PRs land as a merge train, one full CI run for several reviewed PRs instead of one run each. The train branches from current
mainand merges each constituent's reviewed head with--no-ff. It lands with a merge commit (never a squash), so every constituent head ends up inmainand GitHub marks that PR merged. If the train goes red, it is bisected by halves; the constituent that turns it red goes back to its owner and the rest re-train.Each constituent was reviewed and approved at the head listed below; the heads are frozen.
#18271was left out: its ownverify-generated-types-slmis red (stale generated SLM types), so it goes back to its owner for the next train.What Changed
Constituents (
#PR @ approved head), merged in this order:Train-only commits:
repo_tests/_reach_policy.py,repo_tests/reach_scope_claim_17844_test.py) are resolved as the union of entries:main's copy plus each constituent's own additions. Every key and import each constituent added is checked to be present.repo_tests/no_secret_in_response_model_17865_test.py: the floor is kept atmain's 5076 (refactor(speech): one pinned Whisper path, a bounded fallthrough policy, and providers that raise on failure (#17778) #18236). feat(egress): one SSOT internal-origin allowlist, an EGRESS_POLICY guard mode and a drop-only ratchet over every outbound call (#17576) #18260's 5061 re-pin is superseded, as agreed with its owner.repo_tests/infra_backend_imports_allowlist_18288.py: themonitor_services.pypending entry is dropped, because refactor(infra): one service-registry core, one health status and one deployment-mode detector for the backend and the deployment scripts (#18132, #12771) #18287 (in this train) removes its backend import. This is the refactor(infra): one service-registry core, one health status and one deployment-mode detector for the backend and the deployment scripts (#18132, #12771) #18287/fix(infra): infrastructure scripts stop depending on the caller's PYTHONPATH, one guard for the class, and one monitoring launcher (#18288, #17906) #18292 interlock.pipeline-scripts/hardcoded_values_baseline.txt: the 2 entries refactor(user-mgmt): one UserService in autobot_shared, and the fork baseline fails on stale entries (#15068, #18088) #18267 fixed are pruned (user_service.py|50in both backends). refactor(user-mgmt): one UserService in autobot_shared, and the fork baseline fails on stale entries (#15068, #18088) #18267's own SSOT check reported both as STALE.Closes #15068
Closes #17906
Closes #18143
Refs #12771
Refs #13630
Refs #15360
Refs #15502
Refs #17576
Refs #17822
Refs #17856
Refs #18088
Refs #18132
Refs #18185
Refs #18208
Refs #18229
Refs #18281
Refs #18288
Verification
Model Used
Claude Opus 5.5 (merge orchestration). Constituent reviews used Sonnet and Opus by risk tier, as recorded on each PR.
🤖 Generated with Claude Code