Skip to content

chore(train): merge train 2026-10-12 #7b — 10 approved PRs incl. audit_logs SoR, SSO code exchange, sandbox hardening (#17225) - #18496

Merged
mrveiss merged 80 commits into
mainfrom
train-2026-10-12-7b
Oct 12, 2026
Merged

mrveiss merged 80 commits into
mainfrom
train-2026-10-12-7b

Conversation

@mrveiss

@mrveiss mrveiss commented Oct 12, 2026

Copy link
Copy Markdown
Owner

Thinking Path

Merge train #7b, under the owner decisions of 2026-10-11 and 2026-10-12 (every approved PR lands through a train). It replaces train #7 (#18401, closed):

The branch is built on current main (including train #6b, df211d3) and lands with a merge commit. The drift-prone guards were pre-run on the final tree: the reach declarations give 566 passed, and the one failure is local only (tomllib is missing from the local Python 3.10; CI runs 3.14).

What Changed

Constituents (#PR @ approved head):

Train-only commits:

Closes #18013
Closes #18368
Closes #17848
Closes #18345
Closes #18328
Closes #18394
Closes #15022
Closes #15028
Refs #17225
Refs #17267
Refs #18289
Refs #18067
Refs #17982
Refs #15722
Refs #16375
Refs #15026
Refs #15021
Refs #18397
Refs #12363
Refs #11682
Refs #18241
Refs #14776

Verification

Model Used

Claude Opus 5.5 (merge orchestration). Constituent reviews used Sonnet and Opus by risk tier.

🤖 Generated with Claude Code

…w-privileges and a pids limit from the shared hardening builder (#17267)

SECURITY-SENSITIVE: container runtime privileges; review on Opus.

Owner decision (c) on #17267: the non-behavioural subset only.

Changed:
- container_hardening: new baseline_hardening_kwargs() (security_opt
  no-new-privileges, cap_drop ALL, pids_limit); hardening_kwargs() now composes
  it, output byte-identical. CONTAINER_PIDS_LIMIT (env AUTOBOT_WORKSPACE_PIDS_LIMIT,
  default 512) moves here; the workspace constant aliases it.
- docker_backend.py: both containers.run sites (cold start, snapshot restore)
  add **baseline_hardening_kwargs().
- container_pool.py: its only caller passes no container kwargs, so pooled
  containers were unhardened; the same subset is applied, and the floor wins
  over caller kwargs.
- Guard extended: each docker_backend containers.run must spread the builder;
  pool and backend are consumers; contrast cases added.
- Pin tests assert the full kwargs of every run site; they pass on the parent
  with the old kwargs and now differ by exactly the three keys.

Unchanged: network, read_only, mounts/volumes, memory, cpus, user, environment.

Refs #17267 — option (b) full hardening stays open
…no network and a read-only root unless a named opt-in says otherwise (#17267)
…that widen their reach (privileged, devices, host namespaces, docker socket or host-root binds) (#17267)
…cker-py run kwarg and every cold start raised TypeError (#17267)
…led; main's entries plus this branch's one scope (#17267)
…, adapt audit_logger, route SecurityLayer, one retention table (#17225)

Owner decision 2026-10-10, D2/D3/D5/D6:
- D2: services/audit/audit_log.py, services/event_log.py and
  knowledge/audit_log.py are deleted; their vocabularies move to
  services/audit/taxonomy.py and every caller uses the canonical service
  (voice_bundle_admin and auth via emit_compliance; the knowledge audit API
  via services/audit/knowledge_view.py, which ends the double write). Old
  keys are left to expire by their TTL; no stored data is touched.
- D3: services/audit_logger.py is an adapter: an AuditEntry is recorded as a
  SECURITY AuditEvent and read back from the canonical trail.
- D5: services/audit/retention.py is the one retention table; projection TTLs
  and the one purge path (services/audit/purge.py) read it. The nightly task
  no longer trims every audit:* zset at one period.
- D6: SecurityLayer.audit_log records through emit_security; the JSONL file
  is no longer written or read.

Fixes found on the way: audit.emit was shadowed by an EventType bridge, so
emit(AuditEvent(...)) recorded a COMPLIANCE event named after the event's
repr (7 producers); a producer on a thread with no loop now hands its write
to the serving loop; reads scan newest-first; an unreadable trail raises
instead of reading as empty (#13258).

The writer guard detects audit ORM rows, INSERT INTO ...audit and file
writes in modules binding an audit path, which found five stores the first
inventory missed. D1 (which Postgres table) and D4 (daemon key move) are
open; see docs/developer/AUDIT_SYSTEMS.md.
…its projection (#17225)

Owner decision 2026-10-11 on D1: extend the existing Postgres audit_logs
table rather than add audit_event.

- Additive schema: category (NOT NULL, server default 'security'), actor,
  session_id, resource_ref and two indexes. Alembic 20261011_098 on the
  backend; add_audit_logs_canonical_columns on the SLM's slm_users database,
  which maps the same shared model. No existing row is rewritten; the
  pre-existing twelve columns are pinned unchanged.
- One row constructor, autobot_shared/user_management/audit_rows.audit_row,
  used by the canonical service and by the shared RBAC denial, organisation
  and team writers, so both processes write one schema. The backend and
  SLM user_service.py still construct AuditLog directly; they move onto
  audit_row after #18267, which rewrites both files.
- services/audit/store.py: record() writes the row, then the Redis
  projection; every query is one SQL statement on audit_logs;
  rebuild_projection() reconstructs the projection. store_authority declares
  audit_trail POSTGRES with a REDIS projection.
- .secrets.baseline: drop the entries for the two deleted legacy modules.
…ontrol plane map has an audit-trail row (#17225)

with audit_rows.audit_row, so every audit_logs row has one constructor.
The writer guard drops the two user_service allowances and fails on any
AuditLog(...) outside the row builder (the SLM's own node-audit model
excepted).

- CONTROL_PLANE_MAP.md: row 18, Audit trail, Enforced.
- AUDIT_SYSTEMS.md: D1 done; rows 5 and 10-12 point at #18284, #18285
  and #18286.
- symbol_fork_baseline.json: drop KnowledgeAuditLog, audit_record, emit
  and query_events, which are no longer fork clusters.
- audit_rows_test records the mapping without configuring the shared
  mapper registry, which needs each backend's concrete Organization.
…ound the orphan lock, lift the request cap off the background scan (#18013)

_run_duplicate_analysis signalled 'lock held' and 'deadline expired' with the
same None, so every caller reported 'timed out after 120s' - including a
request that returned in 0.2s because a scan was already running, with advice
(raise min_similarity) that cannot help. They are now ScanBusy (carrying the
holder's age) and ScanTimedOut (carrying the deadline that actually elapsed),
each with its own payload; report.py logs which.

The deferred lock release (#13602) relied on the orphaned executor thread
exiting. A thread that never exits left every later call declined for the life
of the process. Past AUTOBOT_DUPLICATE_ORPHAN_LEASE_SECONDS after the scan was
told to stop, the lock is reclaimed; the late callback releases the lock object
it captured, so it can never free one a newer scan owns.

The Celery task applied the 120s request deadline, so the queued path that
exists to escape it timed out the same way and reported completed. It is now
bounded by AUTOBOT_DUPLICATE_BACKGROUND_TIMEOUT_SECONDS and a timeout raises
instead of returning a partial result (#18067).

duplicates.py leaves its grandfathered ceiling (660 -> 470): result shaping and
config-duplicate helpers moved unchanged to duplicate_results.py.

Refs #18013, #18067
… failure, and a lookup that threw is not 'no such source' (#17982)

Celery records a RETURNED value as SUCCESS whatever it says, so the three
scan tasks that return a refusal dict (import_tree, duplicate, dependency, all
through _scan_root_or_refusal) surfaced as completed / progress 100 /
error None. celery_result_to_status now maps a payload whose own status is
'error' to failed and carries the reason to the status endpoint; this is the one
shared mapper, so all three are covered and asserted, not only the duplicate one.
The duplicate task also refuses a scan that examined zero files.

/duplicates/cached answered HTTP 200 for a failed scan, which is how a consumer
checking only the status code rendered it as 'no duplicates'. It is 409 now
with a fixed message; the task's exception text is logged and served by the
status endpoint, not echoed (CWE-209).

resolve_source_root swallowed every lookup failure into logger.debug and
returned None, and source_storage.get_source returned None when it could not
build its Redis client. A fault and an unknown id were therefore the same
observable, and the refusal asserted the id was unknown. Both now raise
RegistryUnavailable, logged at error with the cause chained; the default-source
lookup no longer falls through to AutoBot's own tree on a registry fault.

A structural guard fails if any broad handler around a source lookup
swallows instead of re-raising, anywhere in the package - the #2760 extraction
left a copy behind because nothing guarded more than one file.

Not established: why the source id did not resolve on the deployment that
produced the original report. The swallowed exception was never logged above
DEBUG, so the cause is unrecoverable; what is fixed is that the next occurrence
names its cause.

Refs #17982
…wn tree, and config-duplicates says when it read nothing (#18067)

Why the 120s timeout and the zero results. Measured on the deployment's own
backend log for the registered AutoBot source: 8,377 files -> 130,257 blocks
-> an LSH index of ALL 130k blocks -> 3.96M candidate pairs -> 2.54M reported
'duplicates' (2.43M of them 'low'), about 9 minutes end to end. The request
deadline (120s) always fired first, so the response was an empty 'partial'.
Three causes, each independent:
 1. LSH was built at a hardcoded 0.5 whatever min_similarity was, so the advice
    in every timeout message ('try a higher min_similarity') changed the answer
    but not the work.
 2. Half of the blocks have <= 17 distinct tokens. Token-set Jaccard on sets
    that small reaches 0.5 by coincidence; they flooded the candidate set.
 3. 'No artificial limit on returned pairs' (#609) meant 2.5M pairs were built,
    held, and returned - no panel, Redis result or JSON response can carry that.

Fix, in a new duplicate_lsh.py (duplicate_detector.py was grandfathered at its
size ceiling and shrinks 1326 -> 1120): the fuzzy pass takes blocks with >= 20
distinct tokens (exact-hash matching is unchanged and still covers every size);
the index is built LSH_RECALL_MARGIN (0.1) below min_similarity because
MinHash-LSH retrieves a pair AT the threshold only ~50% of the time; MinHash is
one update_batch call per block; the query loop is cancellable. The returned
list is capped at AUTOBOT_DUPLICATE_MAX_RETURNED (5000) while total_count and the
high/medium/low statistics still describe every pair, and `truncated` says so.
Measured on this repository after the change: 8,384 files, 175s, 56,557 pairs
found (25,491 high), 5,000 returned, truncated=true - on the background path,
which is bounded by AUTOBOT_DUPLICATE_BACKGROUND_TIMEOUT_SECONDS and not the
request deadline. The synchronous GET still exceeds 120s on this tree and now
says so honestly.

Also fixed: detect_duplicates_async had no min_similarity parameter, so the one
caller that passed it raised TypeError on every semantic request and silently
fell back to the standard scan.

config-duplicates: detect_config_duplicates scanned <root>/src and
<root>/backend. AutoBot has neither, so it read zero files and answered
'No configuration duplicates found!' in 0.7s. It also skipped any file whose
ABSOLUTE path contained 'test'. It now scans from the root when the legacy
directories are absent, prunes SKIP_DIRS, judges test files on the relative
path, counts files scanned and failed (parse failures were logged at DEBUG), and
the endpoint answers 422 when it read nothing. Its report states how many files
the zero is about.

Known-answer fixtures: a planted duplicate pair that must be found and a
near-miss that must not, for the block detector and for config-duplicates.

Not done here, still open on #18067: the symbol-fork detector reaching
analytics, the per-detector ran/zero/failed record for the cross-file rules, and
the problem-type counts.

Refs #18067, #18013, #17982
…an unreadable registry on purpose (#17982)

get_source and get_default_source_id now raise RegistryUnavailable where they
returned None. Audited every caller (backend, LLC, tasks; SLM and scripts have
none): authorization answers 503 instead of a false 404, HTTP handlers resolve
the default source through shared.default_source_id (503), an app-level handler
turns any remaining fault into 503 without echoing the cause, the LLC project
list degrades without the source summary, and project disposal aborts rather
than orphaning the clone. Celery tasks let it fail the task.

Refs #17982
…r indexes concurrently (#17225)

Review of #18343:
- 20261011_098 downgrade() dropped the four new columns, deleting every
  audit value written into them since the upgrade -- a deletion path in
  the audit store (#17038). It is now a documented no-op; the columns are
  additive and harmless to leave. The SLM migration has no down path and
  says it may not grow one that drops them.
- Both index builds were plain CREATE INDEX, which blocks writes to
  audit_logs for the whole build. Alembic now uses
  postgresql_concurrently=True inside autocommit_block(); the SLM runner
  commits the columns and builds CONCURRENTLY IF NOT EXISTS on an
  autocommit connection. Both drop and rebuild an INVALID index a failed
  concurrent build left behind, so a re-run repairs rather than skips it.
- Tests: downgrade has no statements; every create/drop index call is
  concurrent and inside autocommit_block; the SLM build runs in autocommit
  with CONCURRENTLY and rebuilds an invalid leftover.
…ound the orphan lock, lift the request cap off the background scan (#18013)

_run_duplicate_analysis signalled 'lock held' and 'deadline expired' with the
same None, so every caller reported 'timed out after 120s' - including a
request that returned in 0.2s because a scan was already running, with advice
(raise min_similarity) that cannot help. They are now ScanBusy (carrying the
holder's age) and ScanTimedOut (carrying the deadline that actually elapsed),
each with its own payload; report.py logs which.

The deferred lock release (#13602) relied on the orphaned executor thread
exiting. A thread that never exits left every later call declined for the life
of the process. Past AUTOBOT_DUPLICATE_ORPHAN_LEASE_SECONDS after the scan was
told to stop, the lock is reclaimed; the late callback releases the lock object
it captured, so it can never free one a newer scan owns.

The Celery task applied the 120s request deadline, so the queued path that
exists to escape it timed out the same way and reported completed. It is now
bounded by AUTOBOT_DUPLICATE_BACKGROUND_TIMEOUT_SECONDS and a timeout raises
instead of returning a partial result (#18067).

duplicates.py leaves its grandfathered ceiling (660 -> 470): result shaping and
config-duplicate helpers moved unchanged to duplicate_results.py.

Refs #18013, #18067
… failure, and a lookup that threw is not 'no such source' (#17982)

Celery records a RETURNED value as SUCCESS whatever it says, so the three
scan tasks that return a refusal dict (import_tree, duplicate, dependency, all
through _scan_root_or_refusal) surfaced as completed / progress 100 /
error None. celery_result_to_status now maps a payload whose own status is
'error' to failed and carries the reason to the status endpoint; this is the one
shared mapper, so all three are covered and asserted, not only the duplicate one.
The duplicate task also refuses a scan that examined zero files.

/duplicates/cached answered HTTP 200 for a failed scan, which is how a consumer
checking only the status code rendered it as 'no duplicates'. It is 409 now
with a fixed message; the task's exception text is logged and served by the
status endpoint, not echoed (CWE-209).

resolve_source_root swallowed every lookup failure into logger.debug and
returned None, and source_storage.get_source returned None when it could not
build its Redis client. A fault and an unknown id were therefore the same
observable, and the refusal asserted the id was unknown. Both now raise
RegistryUnavailable, logged at error with the cause chained; the default-source
lookup no longer falls through to AutoBot's own tree on a registry fault.

A structural guard fails if any broad handler around a source lookup
swallows instead of re-raising, anywhere in the package - the #2760 extraction
left a copy behind because nothing guarded more than one file.

Not established: why the source id did not resolve on the deployment that
produced the original report. The swallowed exception was never logged above
DEBUG, so the cause is unrecoverable; what is fixed is that the next occurrence
names its cause.

Refs #17982
…wn tree, and config-duplicates says when it read nothing (#18067)

Why the 120s timeout and the zero results. Measured on the deployment's own
backend log for the registered AutoBot source: 8,377 files -> 130,257 blocks
-> an LSH index of ALL 130k blocks -> 3.96M candidate pairs -> 2.54M reported
'duplicates' (2.43M of them 'low'), about 9 minutes end to end. The request
deadline (120s) always fired first, so the response was an empty 'partial'.
Three causes, each independent:
 1. LSH was built at a hardcoded 0.5 whatever min_similarity was, so the advice
    in every timeout message ('try a higher min_similarity') changed the answer
    but not the work.
 2. Half of the blocks have <= 17 distinct tokens. Token-set Jaccard on sets
    that small reaches 0.5 by coincidence; they flooded the candidate set.
 3. 'No artificial limit on returned pairs' (#609) meant 2.5M pairs were built,
    held, and returned - no panel, Redis result or JSON response can carry that.

Fix, in a new duplicate_lsh.py (duplicate_detector.py was grandfathered at its
size ceiling and shrinks 1326 -> 1120): the fuzzy pass takes blocks with >= 20
distinct tokens (exact-hash matching is unchanged and still covers every size);
the index is built LSH_RECALL_MARGIN (0.1) below min_similarity because
MinHash-LSH retrieves a pair AT the threshold only ~50% of the time; MinHash is
one update_batch call per block; the query loop is cancellable. The returned
list is capped at AUTOBOT_DUPLICATE_MAX_RETURNED (5000) while total_count and the
high/medium/low statistics still describe every pair, and `truncated` says so.
Measured on this repository after the change: 8,384 files, 175s, 56,557 pairs
found (25,491 high), 5,000 returned, truncated=true - on the background path,
which is bounded by AUTOBOT_DUPLICATE_BACKGROUND_TIMEOUT_SECONDS and not the
request deadline. The synchronous GET still exceeds 120s on this tree and now
says so honestly.

Also fixed: detect_duplicates_async had no min_similarity parameter, so the one
caller that passed it raised TypeError on every semantic request and silently
fell back to the standard scan.

config-duplicates: detect_config_duplicates scanned <root>/src and
<root>/backend. AutoBot has neither, so it read zero files and answered
'No configuration duplicates found!' in 0.7s. It also skipped any file whose
ABSOLUTE path contained 'test'. It now scans from the root when the legacy
directories are absent, prunes SKIP_DIRS, judges test files on the relative
path, counts files scanned and failed (parse failures were logged at DEBUG), and
the endpoint answers 422 when it read nothing. Its report states how many files
the zero is about.

Known-answer fixtures: a planted duplicate pair that must be found and a
near-miss that must not, for the block detector and for config-duplicates.

Not done here, still open on #18067: the symbol-fork detector reaching
analytics, the per-detector ran/zero/failed record for the cross-file rules, and
the problem-type counts.

Refs #18067, #18013, #17982
…an unreadable registry on purpose (#17982)

get_source and get_default_source_id now raise RegistryUnavailable where they
returned None. Audited every caller (backend, LLC, tasks; SLM and scripts have
none): authorization answers 503 instead of a false 404, HTTP handlers resolve
the default source through shared.default_source_id (503), an app-level handler
turns any remaining fault into 503 without echoing the cause, the LLC project
list degrades without the source summary, and project disposal aborts rather
than orphaning the clone. Celery tasks let it fail the task.

Refs #17982
test_container_hardening_17267: the legitimate /home bind case uses the allowed
sandbox home, not a developer-shaped /home/agent path the code-quality check refuses.
hardcoded_values_baseline: drop the audit_logger.py row #18343 left matching nothing.
# Conflicts:
#	autobot-infrastructure/shared/scripts/utilities/init_memory_graph_redis.py
#	repo_tests/_reach_policy.py
#	repo_tests/config_router_auth_coverage_test.py
#	repo_tests/python_file_size_ratchet_baseline.py
#	repo_tests/reach_scope_claim_17844_test.py
#	scripts/python_file_size_known_large.py
- THREAT_MODEL.md back to its 160-line cap: the scrape-token trust boundary is
  folded into the compare_digest invariant; record/delivery/rotation move,
  verbatim, to PROMETHEUS_SCRAPE_TOKEN_ROTATION.md.
- one_claim_registry: provider_degradation.py's nx replay is a state write-back,
  not a lock (#15022) -- allowed with its reason.
- Ten reach floors re-pinned mid-window on this tree; audio-extension-allowlist at
  6030, inside both the local window and CI's lower completed count.
@coderabbitai

coderabbitai Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 282 files, which is 182 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
  • Configuration used: Repository: mrveiss/AutoBot-AI/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 917bf40e-76d5-420c-91a7-b60098919293

📥 Commits

Reviewing files that changed from the base of the PR and between dbd8ac9 and 398bed9.


⛔ Files ignored due to path filters (5)
  • autobot-frontend/src/types/generated/api.ts is excluded by !**/generated/**
  • autobot-slm-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 (282)
  • .secrets.baseline
  • autobot-backend/api/a2a.py
  • autobot-backend/api/admin_retention_policies.py
  • autobot-backend/api/anthropic_compat.py
  • autobot-backend/api/api_endpoint_migrations_test.py
  • autobot-backend/api/auth.py
  • autobot-backend/api/chat_compare.py
  • autobot-backend/api/chat_embed.py
  • autobot-backend/api/codebase_analytics/config_duplicates_scanned_nothing_18067_test.py
  • autobot-backend/api/codebase_analytics/config_duplication_detector.py
  • autobot-backend/api/codebase_analytics/cross_file_analysis.py
  • autobot-backend/api/codebase_analytics/duplicate_detector.py
  • autobot-backend/api/codebase_analytics/duplicate_detector_known_answer_18067_test.py
  • autobot-backend/api/codebase_analytics/duplicate_lsh.py
  • autobot-backend/api/codebase_analytics/duplicate_scan_cancellation_12779_test.py
  • autobot-backend/api/codebase_analytics/endpoints/charts.py
  • autobot-backend/api/codebase_analytics/endpoints/dependencies.py
  • autobot-backend/api/codebase_analytics/endpoints/duplicate_results.py
  • autobot-backend/api/codebase_analytics/endpoints/duplicate_scan_outcomes_18013_test.py
  • autobot-backend/api/codebase_analytics/endpoints/duplicate_single_flight_13602_test.py
  • autobot-backend/api/codebase_analytics/endpoints/duplicates.py
  • autobot-backend/api/codebase_analytics/endpoints/duplicates_source_resolution_17982_test.py
  • autobot-backend/api/codebase_analytics/endpoints/import_tree.py
  • autobot-backend/api/codebase_analytics/endpoints/report.py
  • autobot-backend/api/codebase_analytics/endpoints/scan_responses.py
  • autobot-backend/api/codebase_analytics/endpoints/shared.py
  • autobot-backend/api/codebase_analytics/endpoints/stats.py
  • autobot-backend/api/codebase_analytics/fork_findings.py
  • autobot-backend/api/codebase_analytics/fork_findings_18067_test.py
  • autobot-backend/api/codebase_analytics/registry_unavailable_503_through_decorator_17982_test.py
  • autobot-backend/api/codebase_analytics/registry_unavailable_callers_17982_test.py
  • autobot-backend/api/codebase_analytics/scanner.py
  • autobot-backend/api/codebase_analytics/source_scope.py
  • autobot-backend/api/codebase_analytics/source_storage.py
  • autobot-backend/api/codebase_analytics/type_coverage.py
  • autobot-backend/api/knowledge.py
  • autobot-backend/api/knowledge_audit.py
  • autobot-backend/api/knowledge_category_counts_visibility_16665_test.py
  • autobot-backend/api/monitoring.py
  • autobot-backend/api/openai_compat.py
  • autobot-backend/api/prometheus_endpoint.py
  • autobot-backend/api/rum.py
  • autobot-backend/api/rum_body_cap.py
  • autobot-backend/api/rum_ingest_bounds.py
  • autobot-backend/api/rum_metrics_dispatch.py
  • autobot-backend/api/security.py
  • autobot-backend/api/security_api_test.py
  • autobot-backend/api/voice_bundle_admin.py
  • autobot-backend/app_factory.py
  • autobot-backend/auth_rbac_denial_audit_counted_test.py
  • autobot-backend/code_intelligence/anti_pattern_detection/analyzer.py
  • autobot-backend/code_intelligence/anti_pattern_detection/detectors/dispensables.py
  • autobot-backend/conftest.py
  • autobot-backend/initialization/registry_handlers.py
  • autobot-backend/knowledge/audit_log.py
  • autobot-backend/llc/api/sprints.py
  • autobot-backend/llc/tests/conftest.py
  • autobot-backend/llm_multi_provider.py
  • autobot-backend/llm_shared/base_provider.py
  • autobot-backend/llm_shared/cross_worker_rate_limiter.py
  • autobot-backend/llm_shared/headroom_routing.py
  • autobot-backend/llm_shared/model_fallback_coordinator.py
  • autobot-backend/llm_shared/provider_degradation.py
  • autobot-backend/llm_shared/provider_registry.py
  • autobot-backend/llm_shared/provider_registry_honours_provider_order_15500_test.py
  • autobot-backend/llm_shared/providers/anthropic.py
  • autobot-backend/llm_shared/providers/groq.py
  • autobot-backend/llm_shared/providers/openai_compatible.py
  • autobot-backend/llm_shared/rate_limit_headers.py
  • autobot-backend/llm_shared/tests/test_headroom_routing.py
  • autobot-backend/llm_shared/tests/test_provider_degradation_reauth_selection.py
  • autobot-backend/llm_shared/tests/test_rate_limit_headers.py
  • autobot-backend/migrations/versions/20261011_098_audit_logs_canonical_columns.py
  • autobot-backend/monitoring/prometheus_scrape_auth.py
  • autobot-backend/secure_sandbox_executor.py
  • autobot-backend/security/enterprise/threat_detection/ingest_13562_test.py
  • autobot-backend/security/prompt_injection_detector_strict_mode_test.py
  • autobot-backend/security/security_api_e2e_test.py
  • autobot-backend/security/security_edge_cases_test.py
  • autobot-backend/security/security_integration_test.py
  • autobot-backend/security_layer.py
  • autobot-backend/security_layer_audit_default_test.py
  • autobot-backend/security_layer_test.py
  • autobot-backend/services/audit/__init__.py
  • autobot-backend/services/audit/audit.py
  • autobot-backend/services/audit/audit_log.py
  • autobot-backend/services/audit/audit_log_test.py
  • autobot-backend/services/audit/audit_test.py
  • autobot-backend/services/audit/knowledge_view.py
  • autobot-backend/services/audit/knowledge_view_test.py
  • autobot-backend/services/audit/projection.py
  • autobot-backend/services/audit/purge.py
  • autobot-backend/services/audit/retention.py
  • autobot-backend/services/audit/store.py
  • autobot-backend/services/audit/taxonomy.py
  • autobot-backend/services/audit_logger.py
  • autobot-backend/services/audit_logger_test.py
  • autobot-backend/services/docker_task_workspace.py
  • autobot-backend/services/event_log.py
  • autobot-backend/services/execution/container_pool.py
  • autobot-backend/services/execution/docker_backend.py
  • autobot-backend/services/llm_fallback_chain.py
  • autobot-backend/services/llm_service.py
  • autobot-backend/system_integration_test.py
  • autobot-backend/tasks/analytics_refusal_status_17982_test.py
  • autobot-backend/tasks/analytics_tasks.py
  • autobot-backend/tasks/audit_log_retention.py
  • autobot-backend/tests/api/test_prometheus_scrape_token_16375.py
  • autobot-backend/tests/api/test_rum_access_16375.py
  • autobot-backend/tests/fixtures/audit_trail.py
  • autobot-backend/tests/test_container_hardening_17267.py
  • autobot-backend/tests/test_execution_backends.py
  • autobot-backend/tests/test_execution_hardening_pin_17267.py
  • autobot-backend/tests/unit/test_data_retention.py
  • autobot-backend/utils/celery_task_status.py
  • autobot-backend/utils/error_boundaries/decorators.py
  • autobot-backend/utils/error_boundaries/types.py
  • autobot-backend/utils/error_boundaries/with_error_handling_passthrough_17982_test.py
  • autobot-frontend/.storybook/main.js
  • autobot-frontend/src/components/ui/__tests__/BaseModal.test.ts
  • autobot-frontend/src/composables/__tests__/pollerCircuitBreaker.test.ts
  • autobot-frontend/src/composables/useErrorMonitoring.ts
  • autobot-frontend/src/composables/usePrometheusMetrics.ts
  • autobot-frontend/src/composables/useServiceMessages.ts
  • autobot-frontend/src/config/ssot-config.ts
  • autobot-frontend/src/router/index.ts
  • autobot-frontend/src/services/GlobalWebSocketService.ts
  • autobot-frontend/src/services/LiveEventService.ts
  • autobot-frontend/src/services/__tests__/rawFetchMigration.test.ts
  • autobot-frontend/src/stories/Welcome.stories.ts
  • autobot-frontend/src/utils/ApiCircuitBreaker.js
  • autobot-frontend/src/utils/ApiClient.ts
  • autobot-frontend/src/utils/ApiEndpointMapper.js
  • autobot-frontend/src/utils/ChatManager.js
  • autobot-frontend/src/utils/HealthMonitor.js
  • autobot-frontend/src/utils/__tests__/ApiClient.circuitBreaker.spec.ts
  • autobot-frontend/src/utils/__tests__/apiCircuitBreaker.spec.ts
  • autobot-frontend/src/utils/apiCircuitBreaker.ts
  • autobot-frontend/src/utils/apiErrorInfo.ts
  • autobot-infrastructure/autobot-backend/scripts/migrations/migrate_secrets_ownership.py
  • autobot-infrastructure/autobot-monitoring/README.md
  • autobot-infrastructure/shared/config/prometheus/prometheus.yml
  • autobot-infrastructure/shared/docker/monitoring/prometheus.yml
  • autobot-infrastructure/shared/scripts/ai-ml/model_reference_validator.py
  • autobot-infrastructure/shared/scripts/automated_testing_procedure.py
  • autobot-infrastructure/shared/scripts/comprehensive_log_aggregator.py
  • autobot-infrastructure/shared/scripts/demo/demo_codebase_indexing.py
  • autobot-infrastructure/shared/scripts/diagnose_backend.py
  • autobot-infrastructure/shared/scripts/fresh_kb_setup.py
  • autobot-infrastructure/shared/scripts/hooks/pre-commit-no-cross-gui-duplicate
  • autobot-infrastructure/shared/scripts/hooks/pre-commit-no-cross-gui-duplicate_test.py
  • autobot-infrastructure/shared/scripts/migrations/migrate_category_indexes.py
  • autobot-infrastructure/shared/scripts/migrations/migrate_config_users.py
  • autobot-infrastructure/shared/scripts/migrations/migrate_sessions_608.py
  • autobot-infrastructure/shared/scripts/monitoring/start_monitoring_category_default_test.py
  • autobot-infrastructure/shared/scripts/monitoring_system.py
  • autobot-infrastructure/shared/scripts/populate_kb_chromadb.py
  • autobot-infrastructure/shared/scripts/profile_api_endpoints.py
  • autobot-infrastructure/shared/scripts/profile_backend.py
  • autobot-infrastructure/shared/scripts/profile_startup.py
  • autobot-infrastructure/shared/scripts/security/backfill_session_ownership.py
  • autobot-infrastructure/shared/scripts/security/mtls-migrate.py
  • autobot-infrastructure/shared/scripts/seq_log_forwarder.py
  • autobot-infrastructure/shared/scripts/setup/knowledge/fresh_kb_setup.py
  • autobot-infrastructure/shared/scripts/startup_coordinator.py
  • autobot-infrastructure/shared/scripts/startup_timing_analysis.py
  • autobot-infrastructure/shared/scripts/test_configuration.py
  • autobot-infrastructure/shared/scripts/test_llm_awareness.py
  • autobot-infrastructure/shared/scripts/test_phase2_migration.py
  • autobot-infrastructure/shared/scripts/trace_backend.py
  • autobot-infrastructure/shared/scripts/utilities/demo_workflow_system.py
  • autobot-infrastructure/shared/scripts/utilities/diagnose_backend_timeout.py
  • autobot-infrastructure/shared/scripts/utilities/init_memory_graph_redis.py
  • autobot-infrastructure/shared/scripts/utilities/manage_classification.py
  • autobot-infrastructure/shared/scripts/utilities/manage_system_knowledge_category_default_test.py
  • autobot-infrastructure/shared/scripts/utilities/migrate_codebase_to_chromadb.py
  • autobot-infrastructure/shared/scripts/utilities/migrate_encryption.py
  • autobot-infrastructure/shared/scripts/utilities/optimize_gpu_usage.py
  • autobot-infrastructure/shared/scripts/utilities/settings_diagnostic_utility.py
  • autobot-infrastructure/shared/scripts/utilities/test_autobot_functionality.py
  • autobot-infrastructure/shared/scripts/utilities/validate-security-config.py
  • autobot-infrastructure/shared/scripts/utilities/validate_chat_knowledge.py
  • autobot-infrastructure/shared/scripts/validate_configuration.py
  • autobot-infrastructure/shared/scripts/validate_timeout_config.py
  • autobot-infrastructure/shared/tools/index_documentation.py
  • autobot-infrastructure/shared/tools/index_documentation_category_default_test.py
  • autobot-monitoring/prometheus.yml
  • autobot-slm-backend/ansible/_shared/tasks/keep_prometheus_scrape_token.yml
  • autobot-slm-backend/ansible/roles/backend/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/monitoring/defaults/main.yml
  • autobot-slm-backend/ansible/roles/monitoring/tasks/prometheus_config.yml
  • autobot-slm-backend/ansible/roles/monitoring/templates/prometheus.yml.j2
  • autobot-slm-backend/api/sso_auth.py
  • autobot-slm-backend/main.py
  • autobot-slm-backend/migrations/add_audit_logs_canonical_columns.py
  • autobot-slm-backend/migrations/add_audit_logs_canonical_columns_test.py
  • autobot-slm-backend/migrations/runner.py
  • autobot-slm-backend/migrations/runner_exit_code_test.py
  • autobot-slm-backend/services/ansible_secrets.py
  • autobot-slm-backend/services/generated_system_secrets.py
  • autobot-slm-backend/services/sso_exchange_code.py
  • autobot-slm-backend/tests/api/test_sso_auth.py
  • autobot-slm-backend/tests/api/test_sso_exchange_code_18394.py
  • autobot-slm-backend/tests/test_prometheus_scrape_token_provisioned_16375.py
  • autobot-slm-backend/tests/test_rbac_middleware_cache.py
  • autobot-slm-backend/tests/test_rbac_permission_denied_audit.py
  • autobot-slm-frontend/.storybook/main.js
  • autobot-slm-frontend/openapi.json
  • autobot-slm-frontend/src/views/SSOCallbackView.test.ts
  • autobot-slm-frontend/src/views/SSOCallbackView.vue
  • autobot_shared/container_hardening.py
  • autobot_shared/embedding_model.py
  • autobot_shared/env_registry.py
  • autobot_shared/env_registry_ai.py
  • autobot_shared/env_registry_analytics.py
  • autobot_shared/env_registry_security.py
  • autobot_shared/knowledge_categories.py
  • autobot_shared/monitoring/metrics/frontend.py
  • autobot_shared/monitoring/metrics/label_bounds.py
  • autobot_shared/monitoring/metrics/label_bounds_18368_test.py
  • autobot_shared/proxy_utils.py
  • autobot_shared/proxy_utils_17848_test.py
  • autobot_shared/ssot_config.py
  • autobot_shared/store_authority.py
  • autobot_shared/symbol_forks.py
  • autobot_shared/user_management/audit_rows.py
  • autobot_shared/user_management/audit_rows_test.py
  • autobot_shared/user_management/middleware/rbac_middleware.py
  • autobot_shared/user_management/models/audit.py
  • autobot_shared/user_management/models/audit_schema_17225_test.py
  • autobot_shared/user_management/organization_service.py
  • autobot_shared/user_management/team_service.py
  • autobot_shared/user_management/user_service_base.py
  • docker-compose.yml
  • docker/secrets-init.sh
  • docker/with-secrets.sh
  • docs/architecture/CONTROL_PLANE_MAP.md
  • docs/developer/ARCHITECTURE_EXCEPTIONS.md
  • docs/developer/AUDIT_SYSTEMS.md
  • docs/developer/ENV_VARS.md
  • docs/developer/FRONTEND_API_CLIENTS.md
  • docs/developer/PROMETHEUS_SCRAPE_TOKEN_ROTATION.md
  • docs/developer/THREAT_MODEL.md
  • libs/autobot-ui/src/components/BaseModal.stories.ts
  • libs/autobot-ui/src/components/__tests__/BaseModal.test.ts
  • pyproject.toml
  • repo_tests/_reach_policy.py
  • repo_tests/audio_extension_allowlist_test.py
  • repo_tests/audit_writer_single_source_17225_test.py
  • repo_tests/chunker_private_embedding_hooks_18185_test.py
  • repo_tests/config_router_auth_coverage_test.py
  • repo_tests/container_hardening_single_source_17267_test.py
  • repo_tests/credential_vault_resolution_allowlist.py
  • repo_tests/direct_secrets_service_callers_17773_test.py
  • repo_tests/docstring_restatement_baseline_17165.py
  • repo_tests/embedding_model_literal_guard_18143_test.py
  • repo_tests/env_var_bare_cast_allowlist.py
  • repo_tests/fastapi_validation_handler_guard_test.py
  • repo_tests/frontend_api_contract_ratchet_test.py
  • repo_tests/frontend_file_size_ratchet_baseline.py
  • repo_tests/frontend_file_size_ratchet_test.py
  • repo_tests/infra_analysis_backend_names_resolve_18289_test.py
  • repo_tests/infra_backend_imports_allowlist_18288.py
  • repo_tests/infra_scripts_no_backend_imports_18288_test.py
  • repo_tests/infra_validators_repaired_18289_test.py
  • repo_tests/mypy_enum_alias_resolution_18345_test.py
  • repo_tests/no_secret_in_response_model_17865_test.py
  • repo_tests/one_claim_registry_16653_test.py
  • repo_tests/one_content_digest_15722_test.py
  • repo_tests/one_deployment_mode_detector_12771_test.py
  • repo_tests/reach_scope_claim_17844_test.py
  • repo_tests/source_scoping_guard_17758_test.py
  • repo_tests/store_fact_chokepoint_guard_test.py
  • repo_tests/stranded_recorder_entries_test.py
  • repo_tests/symbol_fork_baseline.json
  • repo_tests/sys_modules_module_scope_restoration_test.py
  • repo_tests/undefined_css_var_ratchet_17552_test.py
  • scripts/frontend_file_size_known_large.py
  • tools/lint/check_symbol_forks.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

Notice: 29 open PRs — past the runaway threshold (25)

This is not a request to defer this PR. The actual limit is the open-PR cap (AUTOBOT_OPEN_PR_CAP, default 40), enforced at pre-push against NEW branches only -- pushing more commits to this PR's own branch is never blocked by it.

This notice only means the count is high enough to be worth a glance for a runaway — something opening PRs in a loop, or a merge pipeline that has stalled so nothing is draining.

Currently open:

If the queue is draining normally, ignore this. Otherwise:

  1. Check whether CI is dispatching at all — see the ci-dispatch-watchdog status on these PRs
  2. Merge the ones whose CI has finished and review has passed: gh pr merge <number> --squash --delete-branch
  3. Look for a loop opening near-identical PRs

Warn-only runaway detector — .github/workflows/pr-queue-gate.yml. It never blocks a merge.

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

Applied verbatim from CI's generated-types.patch (run 38284429693): #18372's RUM
and Prometheus docstrings plus the scrape-token header param were never
regenerated on its own branch.
Comment thread autobot-slm-backend/migrations/add_audit_logs_canonical_columns.py Fixed
…d of interpolating it (#17225)

Semgrep autobot-sql-string-format flagged #18343's SLM migration:
cursor.execute(f"DROP INDEX CONCURRENTLY IF EXISTS {name}"). name is a module
constant, but SQL is never built by string interpolation here: use
psycopg2.sql.Identifier, as rename_audit_logs_to_slm_node_audit_logs does
(#11223), and drop the nosec. The test's fake cursor renders Composed SQL the
way Postgres receives it. Semgrep: 0 findings; migration tests 2 passed.
- sso_exchange_code.py (#18399): SSO_CODE_TTL_SECONDS was a bare int(os.getenv())
  cast, which env_var_bare_cast_test refuses (a malformed value raises at import);
  env_int_clamped(5..600), default 60 unchanged.
- llc/tests/conftest.py: #18362 made llc/api/sprints.py read through
  get_source_or_none_if_unreadable; the llc source_storage stub only bound
  get_source, so test_project_repo_api failed to import. Same fake for both,
  on the existing line (the file is at its 832-line ceiling).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment