You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After a checksum-reused no-op index refresh, ordinary status says index stale while status --check says index fresh for the same database and workspace.
The ordinary summary ignores the successful workspace-freshening timestamp that check mode uses.
Reproduced with an isolated fixture using locally built cdidx v1.45.1 at 81861a14c9396cd74190edc91392ab11abfa86f8.
Reproduction
Touch an indexed file without changing its contents, then run an incremental index:
The two status modes must not produce contradictory freshness summaries from the same trusted metadata. A successful freshening newer than the latest observed modification should be honored consistently, or ordinary status should report an explicitly different unverified state rather than stale.
Existing issue relationship
This is a regression/residual case of #3238, which introduced the no-op indexing and last_workspace_freshened_at freshness contract.
Root-cause pointers
src/CodeIndex/Cli/QueryCommandRunner.Status.cs:1374-1388 builds the ordinary freshness label without LastWorkspaceFreshenedAt.
The summary is assembled in the same file around lines 1483-1491.
src/CodeIndex/Models/QueryResults.cs:1565-1571 documents the persisted freshening stamp.
PR scope and implementation guidance
Centralize freshness classification so ordinary status, check status, workspace health, and MCP status do not independently reinterpret the same timestamps.
Respect the trust conditions attached to the freshening stamp; do not blindly compare wall-clock values without the matching workspace/head context.
Preserve explicit distinctions among fresh, stale, unknown/unverified, head-changed, and clock-skew cases.
Keep --stale-after threshold behavior and check-only audit fields intact.
Do not force content reindexing for checksum-identical files merely to make the timestamps align.
Acceptance criteria
The reproducer no longer reports simultaneous stale and fresh summaries.
A checksum-identical no-op refresh remains cheap and records a usable freshening fact.
Real content changes after the freshening stamp still report stale.
Summary
After a checksum-reused no-op index refresh, ordinary
statussaysindex stalewhilestatus --checksaysindex freshfor the same database and workspace.The ordinary summary ignores the successful workspace-freshening timestamp that check mode uses.
Reproduced with an isolated fixture using locally built cdidx v1.45.1 at
81861a14c9396cd74190edc91392ab11abfa86f8.Reproduction
Touch an indexed file without changing its contents, then run an incremental index:
Observed timestamps:
indexed_at=2026-08-30T11:20:20Z;latest_modified=2026-08-30T11:20:35.039277Z;last_workspace_freshened_at=2026-08-30T11:20:35.413414Z.Actual:
index stale;index fresh;index_matches_workspace=true.Expected behavior
The two status modes must not produce contradictory freshness summaries from the same trusted metadata. A successful freshening newer than the latest observed modification should be honored consistently, or ordinary status should report an explicitly different unverified state rather than
stale.Existing issue relationship
This is a regression/residual case of #3238, which introduced the no-op indexing and
last_workspace_freshened_atfreshness contract.Root-cause pointers
src/CodeIndex/Cli/QueryCommandRunner.Status.cs:1374-1388builds the ordinary freshness label withoutLastWorkspaceFreshenedAt.src/CodeIndex/Models/QueryResults.cs:1565-1571documents the persisted freshening stamp.PR scope and implementation guidance
--stale-afterthreshold behavior and check-only audit fields intact.Acceptance criteria
Tests, documentation, and changelog
--check, workspace, and MCP surfaces.changelog.d/unreleased/fragment referencing status should clarify no-op update timestamps versus indexed_at #3238.