Priority: P2 search correctness/provenance; needs an owner decision because it regenerates reviewed evidence.
What happened
8ecc5da76 (fix(search): publish canonical qualified-name fields) added qualified-name fields to the lexical projection and bumped QUERY_LEXICAL_RETRIEVER_REVISION_V1 from retriever.lexical.daemon.v1 to retriever.lexical.daemon.qualified-names.v1, with published_text_artifact_with_stale_search_revision_is_rebuilt pinning the old label as the stale one. The reconcile merge dd1ed055a kept the test but resolved the constant back to retriever.lexical.daemon.v1, so the test was red on the tip and the bump never shipped.
Why the bump is not a one-line fix
Restoring it on the tip (tried and reverted in d5a72b06c/9285bb470) cascades through the pinned evidence chain, because the lexical retriever revision is part of every ranked candidate's evidence identity:
expected_query_fallback_digests in both workload copies (tests/fixtures/search_quality/query-semantic-candidate-workload-v1.json, crates/tracedecay-query/assets/runtime-root/…) — train c540bcd0… → 0bb9a050…, validation 0dcb390d… → fee99346…;
packaged::WORKLOAD_SHA256 (file digest 1859c709… → 5b584c43…) and the canonical workload digest pins in crates/tracedecay/tests/search_quality_suite/workload_fixture.rs and tracedecay-search-eval-direct.rs (a4c7d68b… → 62125128…);
- the packaged native qualification (
packaged_native_qualification_bytes()), whose portable_evidence.report.workload_digest binds it to the old workload — accepted_profile_authority::validate_report_authority correctly rejects it once the workload digest moves (portable_report_requires_the_current_workload_digest). That artifact is reviewed qualification evidence produced by a real semantic run; it cannot be hand-edited.
Current state on the tip
The constant stays retriever.lexical.daemon.v1; the scheduler test now builds its stale artifact under retriever.lexical.daemon.v0 and asserts the label differs from the current constant, so the rebuild mechanism is still tested. Artifacts published before 8ecc5da76 therefore remain "current" and serve without qualified-name fields until they are rebuilt for another reason.
To close
- Decide whether pre-qualified-name artifacts must be retired eagerly. If yes: restore the bump, re-pin items 1–2 (the direct evaluator's
generate-candidates --profiles query-fallback prints the observed digests; the drift assertion now prints observed vs pinned), and regenerate the packaged native qualification through the real qualification journey — do not edit its digest by hand — then re-run tracedecay-search-eval --lib, tracedecay --test search_quality_suite, tracedecay-usecases --lib semantic_runtime.
- If no: document in
retrieval/mod.rs why the label is retained and what triggers the eventual rebuild.
Priority: P2 search correctness/provenance; needs an owner decision because it regenerates reviewed evidence.
What happened
8ecc5da76(fix(search): publish canonical qualified-name fields) added qualified-name fields to the lexical projection and bumpedQUERY_LEXICAL_RETRIEVER_REVISION_V1fromretriever.lexical.daemon.v1toretriever.lexical.daemon.qualified-names.v1, withpublished_text_artifact_with_stale_search_revision_is_rebuiltpinning the old label as the stale one. The reconcile mergedd1ed055akept the test but resolved the constant back toretriever.lexical.daemon.v1, so the test was red on the tip and the bump never shipped.Why the bump is not a one-line fix
Restoring it on the tip (tried and reverted in
d5a72b06c/9285bb470) cascades through the pinned evidence chain, because the lexical retriever revision is part of every ranked candidate's evidence identity:expected_query_fallback_digestsin both workload copies (tests/fixtures/search_quality/query-semantic-candidate-workload-v1.json,crates/tracedecay-query/assets/runtime-root/…) — trainc540bcd0…→0bb9a050…, validation0dcb390d…→fee99346…;packaged::WORKLOAD_SHA256(file digest1859c709…→5b584c43…) and the canonical workload digest pins incrates/tracedecay/tests/search_quality_suite/workload_fixture.rsandtracedecay-search-eval-direct.rs(a4c7d68b…→62125128…);packaged_native_qualification_bytes()), whoseportable_evidence.report.workload_digestbinds it to the old workload —accepted_profile_authority::validate_report_authoritycorrectly rejects it once the workload digest moves (portable_report_requires_the_current_workload_digest). That artifact is reviewed qualification evidence produced by a real semantic run; it cannot be hand-edited.Current state on the tip
The constant stays
retriever.lexical.daemon.v1; the scheduler test now builds its stale artifact underretriever.lexical.daemon.v0and asserts the label differs from the current constant, so the rebuild mechanism is still tested. Artifacts published before8ecc5da76therefore remain "current" and serve without qualified-name fields until they are rebuilt for another reason.To close
generate-candidates --profiles query-fallbackprints the observed digests; the drift assertion now prints observed vs pinned), and regenerate the packaged native qualification through the real qualification journey — do not edit its digest by hand — then re-runtracedecay-search-eval --lib,tracedecay --test search_quality_suite,tracedecay-usecases --lib semantic_runtime.retrieval/mod.rswhy the label is retained and what triggers the eventual rebuild.