Skip to content

chore(train): merge train 2026-10-12 #6 — 5 approved PRs, stacked on #18358 (#18293) - #18364

Closed
mrveiss wants to merge 59 commits into
mainfrom
train-2026-10-12-6
Closed

mrveiss wants to merge 59 commits into
mainfrom
train-2026-10-12-6

Conversation

@mrveiss

@mrveiss mrveiss commented Oct 12, 2026

Copy link
Copy Markdown
Owner

Thinking Path

Merge train #6, under the owner decisions of 2026-10-11 and 2026-10-12 (every approved PR lands through a train). It is stacked on train #5 (#18358): this CI measures main + train #5 + this train. Merge it only after #18358. It lands with a merge commit, and the drift-prone guards were pre-run locally on the combined tree.

What Changed

Constituents (#PR @ approved head):

Train-only commits:

  • Hub unions in repo_tests/_reach_policy.py and repo_tests/reach_scope_claim_17844_test.py. The Python size baselines are set from measured line counts: analytics_service.py 835, and audit_logger.py (301, now under 600) is dropped.
  • Six floors re-pinned mid-window from measurements on this tree: import-hermeticity 687, one-claim-registry 3087, tracked-key-material 11044, chunker-private-hook-scan 5055, direct-secrets-service-callers 2681, store-fact-chokepoint 2674.

Closes #18013
Closes #18093
Closes #18124
Closes #18293
Closes #18316
Refs #15722
Refs #16375
Refs #17225
Refs #17982
Refs #18067
Refs #18315
Refs #18349

Verification

Model Used

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

🤖 Generated with Claude Code

…ssion delete clears the LLM-context cache, docs name chat_sessions the record (#18293)
…r does not durably own; admin route 403s; location from SSOT config (#18293)
…cy-only id cannot be taken, and deploy templates pin the location (#18293)
…no chat_sessions turns starts with empty context (#18293)
…ion-turn-store

# Conflicts:
#	repo_tests/reach_scope_claim_17844_test.py
…s, and re-pin three floors mid-window after the tree grew (#18293)
…18293-conversation-turn-store

# Conflicts:
#	repo_tests/collected_modules_inert_on_import_test.py
#	repo_tests/reach_scope_claim_17844_test.py
…sue-18293-conversation-turn-store

# Conflicts:
#	repo_tests/python_file_size_ratchet_baseline.py
#	scripts/python_file_size_known_large.py
… canonical delete, drive the e2e tests through the two-posture validator, and allowlist legacy ids at the path sink (#18293, #18316)
…, 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
…em validator exercises the canonical BM25+RRF HybridSearcher (#17599)
…ob cannot delete alice's chat, and one guard for un-awaited ChatHistoryManager coroutines in the API (#18316)
…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.
mrveiss and others added 21 commits October 12, 2026 01:14
…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
… detector, the cross-file pass says what it ran, duplicate_abstraction is wired, type coverage is a number (#18067)
…ines measured: analytics_service 835, audit_logger 301 < 600 dropped)
import-hermeticity 687 (population 717), one-claim-registry 3087 (3112),
tracked-key-material 11044 (11444), each mid-window from the measurement.
…8093)

chunker-private-hook-scan 5055 (population 5205), direct-secrets-service-callers 2681 (2781),
store-fact-chokepoint 2674 (2774), mid-window. reach_declarations + reach_scope: 565 passed.
@coderabbitai

coderabbitai Bot commented Oct 12, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 203 files, which is 103 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: bbbdb464-95b7-4eeb-91f1-d57297ab9029

📥 Commits

Reviewing files that changed from the base of the PR and between f194061 and 35bf160.


⛔ Files ignored due to path filters (2)
  • 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 (203)
  • .secrets.baseline
  • autobot-backend/agent_loop/fingerprint.py
  • autobot-backend/agent_loop/text_utils.py
  • autobot-backend/agents/browser/captcha_solver.py
  • autobot-backend/agents/scope_enforcement.py
  • autobot-backend/api/admin_retention_policies.py
  • autobot-backend/api/analytics_llm_patterns.py
  • autobot-backend/api/analytics_llm_prompt_patterns.py
  • autobot-backend/api/analytics_pattern_learning.py
  • autobot-backend/api/analytics_pattern_learning_records.py
  • autobot-backend/api/api_endpoint_migrations_test.py
  • autobot-backend/api/auth.py
  • autobot-backend/api/chat.py
  • autobot-backend/api/chat_delete_by_id_real_store_18316_test.py
  • autobot-backend/api/chat_delete_by_id_test.py
  • autobot-backend/api/chat_sessions.py
  • autobot-backend/api/chat_sessions_delete_cleanup.py
  • autobot-backend/api/code_search.py
  • autobot-backend/api/code_search_examples.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/data_storage.py
  • autobot-backend/api/data_storage_categories.py
  • autobot-backend/api/dev_speedup_analysis.py
  • autobot-backend/api/development_speedup.py
  • autobot-backend/api/error_resilience.py
  • autobot-backend/api/knowledge_audit.py
  • autobot-backend/api/knowledge_eval.py
  • autobot-backend/api/legacy_transcript_disposal.py
  • autobot-backend/api/legacy_transcript_location_18293_test.py
  • autobot-backend/api/natural_language_search.py
  • autobot-backend/api/phases.py
  • autobot-backend/api/search.py
  • autobot-backend/api/security.py
  • autobot-backend/api/security_api_test.py
  • autobot-backend/api/session_delete_legacy_transcript_18293_test.py
  • autobot-backend/api/system_validation.py
  • autobot-backend/api/validation_dashboard.py
  • autobot-backend/api/voice_bundle_admin.py
  • autobot-backend/app_factory.py
  • autobot-backend/auth_rbac_denial_audit_counted_test.py
  • autobot-backend/autobot_memory_graph/semantic_search.py
  • autobot-backend/chat_history/legacy_transcripts.py
  • autobot-backend/chat_history/persist_conversation_dedup_test.py
  • autobot-backend/chat_history/session.py
  • autobot-backend/chat_history/session_reply_backfill.py
  • autobot-backend/chat_history/session_reply_backfill_test.py
  • autobot-backend/chat_history/turn_projection.py
  • autobot-backend/chat_history/turn_projection_test.py
  • autobot-backend/chat_workflow/conversation.py
  • autobot-backend/chat_workflow/conversation_turn_store_18293_test.py
  • autobot-backend/chat_workflow/manager.py
  • autobot-backend/code_analysis/scripts/analyze_duplicates.py
  • autobot-backend/code_analysis/scripts/analyze_duplicates_template_18093_test.py
  • autobot-backend/code_analysis/src/env_analyzer.py
  • autobot-backend/code_intelligence/analytics_infrastructure.py
  • autobot-backend/code_intelligence/anti_pattern_detection/analyzer.py
  • autobot-backend/code_intelligence/anti_pattern_detection/detectors/dispensables.py
  • autobot-backend/initialization/registry_handlers.py
  • autobot-backend/knowledge/audit_log.py
  • autobot-backend/knowledge/backends/async_chromadb_adapter.py
  • autobot-backend/knowledge/search.py
  • autobot-backend/knowledge/search_components/bm25.py
  • autobot-backend/knowledge/search_quality.py
  • autobot-backend/llc/api/sprints.py
  • autobot-backend/llm_shared/tiered_routing/complexity_scorer.py
  • autobot-backend/markdown_reference_system.py
  • autobot-backend/migrations/versions/20261011_098_audit_logs_canonical_columns.py
  • autobot-backend/prepared_facts.py
  • autobot-backend/routers/code_completion.py
  • autobot-backend/routers/feedback.py
  • autobot-backend/routers/model_management.py
  • autobot-backend/security/enterprise/threat_detection/ingest_13562_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/captcha_solver.py
  • autobot-backend/services/event_log.py
  • autobot-backend/services/knowledge/doc_indexer.py
  • autobot-backend/services/legacy_transcript_disposal_action.py
  • autobot-backend/services/mcp_aggregation.py
  • autobot-backend/services/skill_management/skill_extractor.py
  • autobot-backend/services/terminal_secrets_service.py
  • autobot-backend/services/tool_output_filter.py
  • autobot-backend/skills/builtin/skill_router.py
  • autobot-backend/skills/text_tokens_equivalence_18093_test.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_router_auth_16375.py
  • autobot-backend/tests/fixtures/audit_trail.py
  • autobot-backend/tests/knowledge/search_components/bm25_shared_18183_test.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-backend/utils/hybrid_search.py
  • autobot-backend/utils/slug_equivalence_18093_test.py
  • autobot-backend/utils/system_validator.py
  • autobot-infrastructure/shared/config/complete.yaml
  • autobot-infrastructure/shared/scripts/utilities/init_memory_graph_redis.py
  • autobot-infrastructure/shared/tools/index_documentation.py
  • autobot-slm-backend/ansible/roles/backend/templates/backend.env.j2
  • autobot-slm-backend/api/venv_reconcile.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/tests/test_rbac_middleware_cache.py
  • autobot-slm-backend/tests/test_rbac_permission_denied_audit.py
  • autobot_shared/env_registry.py
  • autobot_shared/env_registry_analytics.py
  • autobot_shared/slug.py
  • autobot_shared/ssot_config.py
  • autobot_shared/store_authority.py
  • autobot_shared/symbol_forks.py
  • autobot_shared/text_tokens.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
  • docs/architecture/AUTOBOT_MEMORY_GRAPH_ARCHITECTURE.md
  • docs/architecture/CONTROL_PLANE_MAP.md
  • docs/database/REDIS_MEMORY_GRAPH_SPECIFICATION.md
  • docs/developer/AUDIT_SYSTEMS.md
  • docs/developer/ENV_VARS.md
  • docs/guides/chat-ollama-configuration.md
  • docs/security/OWNERSHIP_BACKFILL_ANALYSIS.md
  • repo_tests/_reach_policy.py
  • repo_tests/audio_extension_allowlist_test.py
  • repo_tests/audit_writer_single_source_17225_test.py
  • repo_tests/chat_history_async_calls_awaited_18316_test.py
  • repo_tests/chat_single_delete_implementation_18316_test.py
  • repo_tests/chunker_private_embedding_hooks_18185_test.py
  • repo_tests/config_router_auth_coverage_test.py
  • repo_tests/conversation_turn_single_store_18293_test.py
  • repo_tests/direct_secrets_service_callers_17773_test.py
  • repo_tests/import_hermeticity_test.py
  • repo_tests/kb_admin_read_bypass_guard_test.py
  • repo_tests/kb_read_visibility_allowlist.py
  • repo_tests/kb_read_visibility_guard_test.py
  • repo_tests/no_tracked_key_material_test.py
  • repo_tests/one_bm25_formula_18183_test.py
  • repo_tests/one_claim_registry_16653_test.py
  • repo_tests/one_content_digest_15722_test.py
  • repo_tests/one_hybrid_search_17599_test.py
  • repo_tests/reach_scope_claim_17844_test.py
  • repo_tests/redaction_concept_census_test.py
  • repo_tests/regex_concept_fork_guard_18093_test.py
  • repo_tests/source_scoping_guard_17758_test.py
  • repo_tests/store_fact_chokepoint_guard_test.py
  • repo_tests/symbol_fork_baseline.json
  • repo_tests/sys_modules_module_scope_restoration_test.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.

for name, create in _INDEX_SQL:
cursor.execute(_INVALID_INDEX_SQL, (name,))
if cursor.fetchone():
cursor.execute(f"DROP INDEX CONCURRENTLY IF EXISTS {name}") # nosec B608 -- name is a module constant
@mrveiss

mrveiss commented Oct 12, 2026

Copy link
Copy Markdown
Owner Author

Superseded: rebuilt as train #6b without #18362 (fixed sleeps at duplicate_scan_outcomes_18013_test.py:122/137/156, a router mounted ungated on a bare app in registry_unavailable_503_through_decorator_17982_test.py:27, severity literals in fork_findings.py, and module-level sys.path.insert(0, …) in check_symbol_forks.py:55 and fork_findings_18067_test.py:29, the probable cause of the scripts.* collection errors in all 12 shards) and without #18343 (its _RETIRED list trips the stranded-recorder census). Both are back with their owner.

@mrveiss

mrveiss commented Oct 12, 2026

Copy link
Copy Markdown
Owner Author

Correction to the comment above: #18362's sys.path.insert calls were not the cause of the scripts.* collection errors. Train #6b, which did not carry #18362, failed all 12 shards the same way. The cause is #18360's autobot-backend/code_analysis/scripts/analyze_duplicates_template_18093_test.py: a test inside a regular scripts package binds sys.modules['scripts'] under importlib mode. I reproduced it locally and fixed it in #18379 by moving the test. The class guard is 18388. The other #18362 findings (fixed sleeps, the ungated bare-app mount, severity literals) stand on their own.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment