Skip to content

chore(train): merge train 2026-10-11 #1 — 8 approved PRs, one CI run (#15068) - #18295

Merged
mrveiss merged 74 commits into
mainfrom
train-2026-10-11-1r
Oct 11, 2026
Merged

mrveiss merged 74 commits into
mainfrom
train-2026-10-11-1r

Conversation

@mrveiss

@mrveiss mrveiss commented Oct 11, 2026

Copy link
Copy Markdown
Owner

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 main and merges each constituent's reviewed head with --no-ff. It lands with a merge commit (never a squash), so every constituent head ends up in main and 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. #18271 was left out: its own verify-generated-types-slm is 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:

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

  • Each constituent was reviewed at its listed head; the review verdicts are on each PR.
  • Each hub resolution parses, and the train contains every key and import each constituent added.
  • This PR's CI is the full-suite verification for the whole set. It is merged only if it is green. If it is red, it is bisected and never merged red.

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

… 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)
…so a model change never serves another model's vectors (#18143)
…ed space, and a refused batch query keeps its reason (#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)
…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
… 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)
@coderabbitai

coderabbitai Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too 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.

Check out review usage here.

⚙️ Run configuration
  • Configuration used: Repository: mrveiss/AutoBot-AI/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 083e73a6-5b23-4745-9325-7d40f51c0765

📥 Commits

Reviewing files that changed from the base of the PR and between 1349f43 and 87ef464.


⛔ Files ignored due to path filters (4)
  • autobot-frontend/src/types/generated/api.ts is excluded by !**/generated/**
  • pipeline-scripts/hardcoded_values_baseline.txt is excluded by !**/*_baseline.txt, !pipeline-scripts/hardcoded_values_baseline.txt
  • repo_tests/python_file_size_ratchet_baseline.py is excluded by !repo_tests/python_file_size_ratchet_baseline.py
  • scripts/python_file_size_known_large.py is excluded by !scripts/python_file_size_known_large.py

📒 Files selected for processing (219)
  • .github/filters/frontend-paths.yml
  • .github/filters/python-paths.yml
  • .github/workflows/_changes.yml
  • .github/workflows/ai-security-review.yml
  • .github/workflows/api-wiring.yml
  • .github/workflows/backend-required-context.yml
  • .github/workflows/ci.yml
  • .github/workflows/code-quality-required-context.yml
  • .github/workflows/code-quality.yml
  • .github/workflows/coverage.yml
  • .github/workflows/docker-smoke-required-context.yml
  • .github/workflows/docker-smoke-test.yml
  • .github/workflows/frontend-required-context.yml
  • .github/workflows/frontend-test.yml
  • .github/workflows/marker-tests.yml
  • .github/workflows/migration-gate.yml
  • .github/workflows/npm-package-tests.yml
  • .github/workflows/python-required-context.yml
  • .github/workflows/security.yml
  • .github/workflows/slm-frontend-check.yml
  • .github/workflows/startup-import-smoke.yml
  • .github/workflows/test-durations.yml
  • .github/workflows/verify-generated-types.yml
  • .secrets.baseline
  • autobot-backend/agents/npu_code_search_agent.py
  • autobot-backend/ai_hardware_accelerator.py
  • autobot-backend/api/admin_oauth_bundle_strip.py
  • autobot-backend/api/agent_config.py
  • autobot-backend/api/agent_config_models_15502_test.py
  • autobot-backend/api/auth.py
  • autobot-backend/api/code_search.py
  • autobot-backend/api/codebase_analytics/chromadb_storage.py
  • autobot-backend/api/codebase_analytics/endpoints/environment_default_model.py
  • autobot-backend/api/codebase_analytics/endpoints/environment_default_model_15502_test.py
  • autobot-backend/api/codebase_analytics/npu_embeddings.py
  • autobot-backend/api/codebase_analytics/router.py
  • autobot-backend/api/embedding_refusal.py
  • autobot-backend/api/knowledge_connector_oauth.py
  • autobot-backend/api/llm.py
  • autobot-backend/api/llm_config_redaction_18193_test.py
  • autobot-backend/api/natural_language_search.py
  • autobot-backend/api/schemas_agent.py
  • autobot-backend/api/schemas_oauth_bundle_strip.py
  • autobot-backend/api/search.py
  • autobot-backend/api/user_management/password_change.py
  • autobot-backend/api/user_management/password_change_test.py
  • autobot-backend/api/user_management/users.py
  • autobot-backend/api/user_management/users_duplicate_conflict_test.py
  • autobot-backend/autobot_memory_graph/semantic_search.py
  • autobot-backend/background_vectorization.py
  • autobot-backend/code_embedding_generator.py
  • autobot-backend/config/model_drift.py
  • autobot-backend/config/model_drift_15502_test.py
  • autobot-backend/config/test_no_logging_manager_on_init_path.py
  • autobot-backend/config/validation.py
  • autobot-backend/initialization/router_registry/core_routers.py
  • autobot-backend/knowledge/connectors/credential_store.py
  • autobot-backend/knowledge/connectors/oauth_flow.py
  • autobot-backend/knowledge/connectors/tests/test_credential_store.py
  • autobot-backend/knowledge/connectors/tests/test_oauth_app_credentials_13630.py
  • autobot-backend/knowledge/connectors/tests/test_oauth_flow.py
  • autobot-backend/knowledge/connectors/tests/test_oauth_provider_deviations_13630.py
  • autobot-backend/knowledge/embedding_cache.py
  • autobot-backend/knowledge/index_embedding_space.py
  • autobot-backend/knowledge/search.py
  • autobot-backend/knowledge/vector_search_engine.py
  • autobot-backend/models/settings.py
  • autobot-backend/npu_semantic_search.py
  • autobot-backend/orchestration/orchestrator_config.py
  • autobot-backend/orchestration/orchestrator_config_planner_15502_test.py
  • autobot-backend/services/credential_write.py
  • autobot-backend/services/embedding_model_resolver_18143_test.py
  • autobot-backend/services/npu_client.py
  • autobot-backend/services/npu_client_worker_model_name_18143_test.py
  • autobot-backend/services/oauth_bundle_strip.py
  • autobot-backend/services/oauth_bundle_strip_action.py
  • autobot-backend/services/oauth_bundle_strip_test.py
  • autobot-backend/tests/test_npu_embedding_fallback_refuses_18185.py
  • autobot-backend/tests/test_npu_redis_cache.py
  • autobot-backend/tests/test_search_api_refusal_error_18185.py
  • autobot-backend/tests/test_search_callers_surface_refusal_18185.py
  • autobot-backend/user_management/middleware/rbac_middleware.py
  • autobot-backend/user_management/services/seed.py
  • autobot-backend/user_management/services/seed_test.py
  • autobot-backend/user_management/services/user_service.py
  • autobot-backend/user_management/services/user_service_conflict_test.py
  • autobot-backend/user_management/services/user_service_test.py
  • autobot-backend/utils/semantic_chunker.py
  • autobot-backend/utils/semantic_chunker_base.py
  • autobot-backend/utils/service_registry.py
  • autobot-frontend/src/components/analytics/CodebaseAnalytics.vue
  • autobot-frontend/src/components/analytics/panels/CodebaseEnvironmentPanel.vue
  • autobot-frontend/src/components/analytics/panels/__tests__/CodebaseEnvironmentPanel.test.ts
  • autobot-frontend/src/composables/__tests__/useVectorStats.test.ts
  • autobot-frontend/src/composables/analytics/__tests__/useEnvironmentAnalysis.test.ts
  • autobot-frontend/src/composables/analytics/codeIntelTypes.ts
  • autobot-frontend/src/composables/analytics/useEnvironmentAnalysis.ts
  • autobot-frontend/src/composables/knowledge/useVectorStats.ts
  • autobot-frontend/src/config/__tests__/ssot-config.spec.ts
  • autobot-frontend/src/config/ssot-config.ts
  • autobot-frontend/src/i18n/locales/ar.json
  • autobot-frontend/src/i18n/locales/de.json
  • autobot-frontend/src/i18n/locales/en.json
  • autobot-frontend/src/i18n/locales/es.json
  • autobot-frontend/src/i18n/locales/fa.json
  • autobot-frontend/src/i18n/locales/fr.json
  • autobot-frontend/src/i18n/locales/he.json
  • autobot-frontend/src/i18n/locales/lv.json
  • autobot-frontend/src/i18n/locales/pl.json
  • autobot-frontend/src/i18n/locales/pt.json
  • autobot-frontend/src/i18n/locales/ur.json
  • autobot-frontend/src/types/knowledgeBase.ts
  • autobot-infrastructure/shared/config/agents.yaml
  • autobot-infrastructure/shared/config/complete.yaml
  • autobot-infrastructure/shared/config/settings.json
  • autobot-infrastructure/shared/scripts/analysis/npu_performance_measurement.py
  • autobot-infrastructure/shared/scripts/analysis/test_service_registry.py
  • autobot-infrastructure/shared/scripts/apply_memory_optimizations.py
  • autobot-infrastructure/shared/scripts/backup_manager.py
  • autobot-infrastructure/shared/scripts/deploy_autobot.py
  • autobot-infrastructure/shared/scripts/deployment_registry.py
  • autobot-infrastructure/shared/scripts/deployment_rollback.py
  • autobot-infrastructure/shared/scripts/log_aggregator.py
  • autobot-infrastructure/shared/scripts/metrics_collector.py
  • autobot-infrastructure/shared/scripts/monitor_services.py
  • autobot-infrastructure/shared/scripts/monitoring/monitoring_backends.py
  • autobot-infrastructure/shared/scripts/monitoring/start_hardware_monitoring.py
  • autobot-infrastructure/shared/scripts/monitoring/start_monitoring.py
  • autobot-infrastructure/shared/scripts/monitoring/start_monitoring_category_default_test.py
  • autobot-infrastructure/shared/scripts/performance_dashboard.py
  • autobot-infrastructure/shared/scripts/sync-env.sh
  • autobot-infrastructure/shared/scripts/test_long_running_operations.py
  • autobot-infrastructure/shared/scripts/test_phase5_cleanup.py
  • autobot-infrastructure/shared/scripts/validation_dashboard_generator.py
  • autobot-infrastructure/shared/scripts/verify_knowledge_consistency.py
  • autobot-infrastructure/shared/scripts/zero_downtime_deploy.py
  • autobot-slm-backend/ansible/_shared/tasks/read_deployed_embedding_model.yml
  • autobot-slm-backend/ansible/playbooks/deploy-backend-env.yml
  • autobot-slm-backend/ansible/playbooks/deploy-hybrid-docker.yml
  • autobot-slm-backend/ansible/playbooks/deploy-native-services.yml
  • autobot-slm-backend/ansible/playbooks/vars/backend-env.yml
  • autobot-slm-backend/ansible/roles/agent_config/defaults/main.yml
  • autobot-slm-backend/ansible/roles/backend/tasks/env_only.yml
  • autobot-slm-backend/ansible/roles/backend/tasks/main.yml
  • autobot-slm-backend/ansible/roles/backend/templates/backend.env.j2
  • autobot-slm-backend/ansible/roles/backend_services/defaults/main.yml
  • autobot-slm-backend/ansible/roles/backend_services/tasks/main.yml
  • autobot-slm-backend/ansible/roles/llm/defaults/main.yml
  • autobot-slm-backend/ansible/roles/llm/tasks/main.yml
  • autobot-slm-backend/api/autobot_users.py
  • autobot-slm-backend/api/scim.py
  • autobot-slm-backend/api/slm_users.py
  • autobot-slm-backend/main.py
  • autobot-slm-backend/user_management/middleware/rbac_middleware.py
  • autobot-slm-backend/user_management/services/user_service.py
  • autobot_shared/declared_egress.py
  • autobot_shared/declared_egress_test.py
  • autobot_shared/egress_allowlist.py
  • autobot_shared/egress_allowlist_test.py
  • autobot_shared/embedding_model.py
  • autobot_shared/env_registry_security.py
  • autobot_shared/http_client_manager.py
  • autobot_shared/http_egress_guard.py
  • autobot_shared/service_registry_core.py
  • autobot_shared/status_enums.py
  • autobot_shared/user_management/user_service.py
  • autobot_shared/user_management/user_service_access.py
  • autobot_shared/user_management/user_service_base.py
  • autobot_shared/user_management/user_service_conflict.py
  • autobot_shared/user_management/user_service_errors.py
  • autobot_shared/user_management/user_service_lifecycle.py
  • autobot_shared/user_management/user_service_test.py
  • docs/api/public-api-reference.md
  • docs/architecture/LONG_RUNNING_OPERATIONS_ARCHITECTURE.md
  • docs/architecture/SSOT_CONFIGURATION_ARCHITECTURE.md
  • docs/developer/03-api-reference.md
  • docs/developer/ENV_VARS.md
  • docs/developer/THREAT_MODEL.md
  • pipeline-scripts/check_workflow_path_filters.py
  • pipeline-scripts/check_workflow_path_filters_test.py
  • pytest.ini
  • repo_tests/_egress_default.py
  • repo_tests/_infra_backend_names.py
  • repo_tests/_reach_policy.py
  • repo_tests/blanket_skips_carry_a_reason_test.py
  • repo_tests/changes_job_equivalence_15360_test.py
  • repo_tests/chunker_private_embedding_hooks_18185_test.py
  • repo_tests/deploy_scripts_standalone_18132_test.py
  • repo_tests/egress_default_guard_17576_test.py
  • repo_tests/egress_unguarded_baseline_17576.json
  • repo_tests/embedding_model_preserved_15502_test.py
  • repo_tests/enum_hand_copy_guard_test.py
  • repo_tests/excluded_tree_size_debt_test.py
  • repo_tests/fixtures/issue_17822_migration_gate_entries.json
  • repo_tests/fixtures/pre_15360_changes_jobs.json
  • repo_tests/frontend_file_size_ratchet_baseline.py
  • repo_tests/frontend_file_size_ratchet_test.py
  • repo_tests/health_status_circuit_open_12771_test.py
  • repo_tests/infra_backend_imports_allowlist_18288.py
  • repo_tests/infra_monitoring_import_path_15643_test.py
  • repo_tests/infra_scripts_no_backend_imports_18288_test.py
  • repo_tests/job_name_names_what_it_runs_test.py
  • repo_tests/man_page_indexer_path_resolves_15853_test.py
  • repo_tests/migration_gate_filter_covers_what_its_tests_import_test.py
  • repo_tests/model_tier_single_definition_15502_test.py
  • repo_tests/monitoring_launcher_single_17906_test.py
  • repo_tests/oauth_bundle_no_app_secret_13630_test.py
  • repo_tests/one_claim_registry_16653_test.py
  • repo_tests/one_deployment_mode_detector_12771_test.py
  • repo_tests/one_deployment_service_registry_18132_test.py
  • repo_tests/one_paths_filter_job_15360_test.py
  • repo_tests/one_rbac_middleware_18088_test.py
  • repo_tests/one_user_service_15068_test.py
  • repo_tests/reach_scope_claim_17844_test.py
  • repo_tests/required_context_complements_test.py
  • repo_tests/symbol_fork_baseline.json
  • repo_tests/symbol_fork_ratchet_17312_test.py
  • repo_tests/test_infra_scripts_import_14129.py
  • scripts/frontend_file_size_known_large.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

✅ SSOT Configuration Compliance: Passing

🎉 No new hardcoded values of either class — ssot and other both block.

Known backlog in pipeline-scripts/hardcoded_values_baseline.txt is suppressed and tracked in #14371.

Comment thread autobot-backend/services/oauth_bundle_strip.py Fixed
Comment thread autobot-backend/services/oauth_bundle_strip.py Fixed
Comment thread autobot-backend/api/search.py Fixed
… 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.
Comment thread autobot-backend/services/credential_write.py Fixed
Comment thread autobot-backend/services/credential_write.py Fixed
Comment thread autobot-backend/services/oauth_bundle_strip.py Fixed
Comment thread autobot-backend/services/oauth_bundle_strip.py Fixed
…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).
@mrveiss
mrveiss merged commit 6c68345 into main Oct 11, 2026
96 checks passed
@mrveiss
mrveiss deleted the train-2026-10-11-1r branch October 11, 2026 17:21
mrveiss added a commit that referenced this pull request Oct 11, 2026
… 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.
mrveiss added a commit that referenced this pull request Oct 11, 2026
…e class fix (#14016)

chore(train): merge train 2026-10-11 #2 — 4 approved PRs, stacked on #18295 (#14016)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants