The merge series 9fe26cc5 -> 63533a35 -> 47332ca5 integrated a June-26-era
stale working line (56020f59..71938040, the v0.6.12 line) into main and
resolved conflicts by keeping the stale blobs wholesale. That silently
reverted ~2 months of released work on 86 files, including:
- Cargo.toml/package identity regressed 0.6.23 -> 0.6.12, asupersync pin
regressed =0.3.9 -> =0.3.4, and the dependency graph no longer resolved
(cargo could not select a version for asupersync) — main was unbuildable.
- src/lib.rs lost ~38 module declarations and the entire post-v0.6.23
triage wave, including the GH #353 forever-defer fix (aa03fd06), the
GH #374 doctor/authority fixes (7327191f, 56bf1a01, 43ab9235), the
GH #364 false-OOM quarantine fix (ef7e2595), and the GH #368 series.
- src/indexer/mod.rs lost the quarantine_retry module wiring.
- Golden robot fixtures, doctor/health schemas, and install scripts
regressed to their June shapes.
This commit restores all 86 clobbered paths to their state at 8e308ea3
(the last good main commit, v0.6.23 lineage), with three exceptions kept
from the merged side: .beads/cli-robot-enhancements.md (new note),
tests/e2e_resilience_scenario_runner.rs (new suite), and
.beads/issues.jsonl (merged as a union by bead id, newer updated_at wins,
preserving the local kupq4 bead alongside the remote gh-wave beads).
Additional repairs required to make --all-targets compile again:
- tests/connector_{aider,amp,antigravity,claude,cline,codex,gemini,
opencode,pi_agent}.rs, tests/{fs_errors,logging,parse_errors}.rs: add
`progress_tick: None` to every franken_agent_detection ScanContext
struct literal. The restored FAD pin (dd2c694, 0.1.10) added the
cass#373 progress_tick field, and these suites still used the
three-field literal — `cargo check --tests` was red on main even
before the bad merges (independently reported in PR #376).
- tests/e2e_resilience_scenario_runner.rs: temporarily disabled via
`#![cfg(any())]` with an explanatory header. It was authored against
the e2e_runner artifact APIs from f6cd6376, which are not on the
restored line yet.
NOT restored (needs deliberate re-landing, tracked in beads): the genuine
feature work from f6cd6376 (CLI wall-clock budgets --timeout/budget_ms/
per_host_budget_ms, robot budget envelopes, search refresh-order rework,
encrypt metadata taxonomy tests). Its diff remains intact in history at
f6cd6376 and must be rebased onto this repaired line rather than merged
blob-wise.
Verification: cargo check --all-targets exits 0 (previously failed at
dependency resolution); version string back at 0.6.23 matching the
latest release tag.
Co-Authored-By: Claude <noreply@anthropic.com>
parse_errors.rs - Invalid UTF-8 Resilience:
- Update claude_returns_error_on_invalid_utf8 test to expect success
rather than failure when encountering invalid UTF-8 bytes
- The scanner implementation uses BufRead::lines() which returns
Err for invalid UTF-8 lines, but the implementation correctly
silently skips these lines rather than propagating errors
- This is the correct resilient behavior for real-world data that
may contain corrupted bytes from encoding issues, truncated
writes, or filesystem problems
- Test now verifies that scanning succeeds and either returns no
conversations or conversations with no messages (the invalid
line is skipped)
time_parser.rs - DST Tolerance:
- Update test_keywords test to tolerate 23-25 hour differences
between "today" and "yesterday" instead of exactly 24 hours
- During DST transitions, a calendar day can be 23 hours (spring
forward) or 25 hours (fall back)
- This fixes test failures that would occur when tests run during
DST transition periods
- local_midnight_to_utc() already handles DST correctly by using
LocalResult::Ambiguous (picks earliest) and LocalResult::None
(falls back to UTC interpretation)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add ScanRoot struct for multi-root scanning with provenance:
- ScanRoot bundles path, origin, platform hint, and workspace rewrites
- ScanRoot::local() creates default local provenance
- ScanRoot::remote() creates remote origin with platform hint
- ScanRoot::with_rewrite() adds workspace path mapping rules
Extend ScanContext for multi-root support:
- Rename data_root to data_dir (where cass stores DB/index)
- Add scan_roots: Vec<ScanRoot> for explicit scan paths
- ScanContext::local_default() for backward-compatible local scanning
- ScanContext::with_roots() for explicit multi-root scanning
- use_default_detection() checks if connectors should auto-detect
Update all connectors and tests to use new structure:
- All connectors now use ctx.data_dir instead of ctx.data_root
- All tests updated with scan_roots: Vec::new() for compatibility
- Indexer uses ScanContext::local_default() for local-only scanning
Adds 5 unit tests for ScanRoot and ScanContext.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
**New test utilities (tests/util/mod.rs):**
Added CwdGuard - an RAII guard for changing the current working
directory that automatically restores the previous directory on drop,
even if a test panics. This prevents test pollution where a failed
test could leave the process in an unexpected directory.
**E2E incremental indexing tests (tests/e2e_search_index.rs):**
- Re-enabled incremental_reindex_preserves_and_appends_messages and
reindex_does_not_drop_messages_in_db_or_search tests that were
previously marked #[ignore] due to flakiness
- Added strategic sleep() calls (1.2s) between operations to ensure
file mtimes are strictly different, accounting for filesystem mtime
granularity (some filesystems have 1-second resolution)
- Added trailing newline to test fixtures for correct append behavior
- These tests verify the critical invariant that incremental re-indexing
never loses previously indexed messages
**Codex connector test path fixes (tests/fs_errors.rs, tests/parse_errors.rs):**
Fixed test directory naming to use "codex" instead of "codex-home".
The CodexConnector uses path matching to determine if a directory is
a codex home (must contain ".codex" or end with "/codex"), and
"codex-home" doesn't match either pattern, causing tests to
accidentally use the real ~/.codex directory.
**Aider connector test cleanup (tests/connector_aider.rs):**
- Use CARGO_MANIFEST_DIR for fixture paths to work correctly when
tests are run from different directories
- Refactor tests to use CwdGuard and EnvGuard for proper cleanup,
replacing manual save/restore patterns that could leak on panic
**New behavioral regression test suite (tests/regression_behavioral.rs):**
Added comprehensive regression tests organized by USER-FACING BEHAVIOR:
Performance tests:
- detect_must_complete_within_100ms_all_connectors: Ensures all
connector detect() methods are O(1), not O(files). Would have
caught the Aider detect() bug where it accidentally scanned
the entire directory tree.
- aider_detect_must_not_scan_recursively: Stress test with deep
nested directories to catch any accidental recursive scanning.
Data integrity tests (to be expanded):
- Tests verifying that indexed data is never silently lost
- Tests verifying search results match indexed content
These tests catch CLASSES of bugs, not just specific instances.
**CLI contract fixture update:**
Updated tests/fixtures/cli_contract/introspect.json to reflect
current CLI output format.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>