Fix compressed rollout search path matching (#27407)

## Why

`thread/search` found content inside compressed rollouts but could drop
the result when joining it with SQLite-backed thread metadata. Search
returned the physical `.jsonl.zst` path while SQLite retained the
logical `.jsonl` path, so exact path matching failed.

## What changed

- Key rollout search matches by their canonical logical `.jsonl` path,
independent of the on-disk representation.
- Canonicalize thread-list paths before joining them with content-search
matches.
- Update compressed-rollout coverage to assert the logical-path
contract.

## Validation

- Ran `just fmt`.
- Ran `git diff --check`.
- Tests and Clippy were intentionally left to CI.
This commit is contained in:
jif
2026-06-10 18:23:42 +01:00
committed by GitHub
Unverified
parent 2ef007dc1a
commit d3abd8774e
3 changed files with 13 additions and 6 deletions
@@ -109,7 +109,8 @@ pub(super) async fn search_threads(
)
.await?;
for item in page.items {
let Some(snippet) = (match remaining_rollouts.remove(item.path.as_path()) {
let logical_path = codex_rollout::plain_rollout_path(item.path.as_path());
let Some(snippet) = (match remaining_rollouts.remove(logical_path.as_path()) {
Some(Some(snippet)) => Some(snippet),
Some(None) => first_rollout_content_match_snippet(item.path.as_path(), search_term)
.await