Research-2089: Archived issue-reference provenance after the repository migration¶
- Date: 2026-09-24
- Status: Active
- Scope: BUG-048 Section E issue-reference provenance only
- Base: collector
719ae5fc424d70e9a4612ca1db293e0568988ac6
Question¶
Which bare issue and pull-request numbers in the current tree describe the pre-migration lusoris/vmaf tracker, and how can the repository prevent those identities from silently becoming links in the newer VMAFx/vmafx number space without banning ordinary fork-local issue references?
Repository evidence¶
Commit 2581c7ba0 qualified five established historical identities in docs/state.md:
| Historical identity | Recorded subject | Resolving history |
|---|---|---|
lusoris/vmaf#239 | FFmpeg libvmaf_vulkan synchronous-fence serialisation | e266bf8e (lusoris/vmaf#241) |
lusoris/vmaf#310 | ADR-number collision sweep cited by the Vulkan row | af227b026 |
lusoris/vmaf#752 | second ADR-number collision sweep | fb14bc332 |
lusoris/vmaf#857 | cambi_cuda invalid kernel parameter / SIGSEGV | 37fcfea68 (lusoris/vmaf#866) and follow-up 8de50984a |
lusoris/vmaf#870 | CUDA CAMBI host-preprocessing correction | 8de50984a |
lusoris/vmaf#407 | BVI-DVC corpus ingestion and merge_corpora.py | a159ba9da |
The unrelated vendored-test commit d468c5bb4 later restored the prior bare spellings in docs/state.md; it did not explain or supersede the provenance decision. git show 2581c7ba0 -- docs/state.md and git show d468c5bb4 -- docs/state.md are a direct add/remove pair.
The active repository now reuses the original five ledger numbers for unrelated pull requests. The GitHub API on 2026-09-24 identifies, for example, active VMAFx/vmafx#239 as the Cython source-root rename, VMAFx/vmafx#241 as the legacy-runner test sunset, VMAFx/vmafx#310 as Go context propagation, VMAFx/vmafx#857 as a later medium/low fix bundle, and VMAFx/vmafx#870 as a later Python CodeQL cleanup. Active VMAFx/vmafx#866 is a later Fable defect bundle, not the CAMBI dispatch fix in historical lusoris/vmaf#866. The old repos/lusoris/vmaf endpoint returns 404, so a live URL is not a durable source. The repository-qualified plain-text identity remains the honest historical namespace, with the Git objects above as executable local evidence.
The original repair covered only the state ledger, two ADRs, and three research digests. A complete tracked-text audit found the same identities in the CUDA source comments and AGENTS invariant, CAMBI operator docs, sync reports, changelog fragments and their generated CHANGELOG.md contexts. It also found the adjacent archived lusoris/vmaf#866 and lusoris/vmaf#752 identities, plus two BVI-DVC pages that incorrectly called ADR-0310's implementation "PR 310"; commit a159ba9da proves the implementation actually landed as lusoris/vmaf#407.
Not every matching number is historical. Research-0870's Containerfile note still correctly says active PR #239: commit b0cfd6fb is the active fork's Cython source-root rename and the prose explicitly describes that work. That reference remains unchanged. This evidence-based split is why the gate is context-scoped rather than a repository-wide number rewrite.
Feedback loop¶
scripts/ci/check-issue-reference-provenance.py identifies one logical Markdown context through stable prose, then requires the proven repository-qualified lusoris/vmaf identities inside that context. It rejects both a bare form and an explicit VMAFx/vmafx qualified identity or GitHub URL for the same historical number. Logical blocks are whitespace normalised, so line wrapping and paragraph reflow do not disable the check.
The checker was added and run before the documentation repair. Against the exact collector base it exited 1 across the missed changelog, source, AGENTS, metric, sync-report, state, and research classes. After the repair it exits 0 over 48 contexts. Its unit suite proves:
- qualified archived references pass;
- the exact bare archived references fail;
- a wrong explicit
VMAFx/vmafxURL fails with a repository-specific finding; - an unrelated bare active-fork PR reference outside the historical context remains allowed;
- whitespace reflow does not disable a contract;
- missing or duplicated context anchors fail closed; and
- empty or missing files fail closed under repository root verification.
Decision matrix¶
| Option | Precision | Rebase durability | Decision |
|---|---|---|---|
| Ban every bare issue number in documentation | Low: ordinary active-fork references are valid | High, but creates broad churn and false positives | Rejected |
| Assert exact lines or occurrence counts | Medium | Low: harmless reflow breaks it; duplicated prose can evade counts | Rejected |
| Query GitHub during CI | Medium | Low: the archived endpoint is gone and network state is mutable | Rejected |
| Context-scoped repository-provenance contracts | High: only proven historical identities are governed | High: stable prose anchors, local evidence, fail-closed drift | Chosen |
Boundaries¶
This slice changes prose, source comments, and its regression gate only. It does not close BUG-048, change a Netflix golden assertion, alter a score, benchmark, tune performance, or retrain a model. Existing Netflix/vmaf references and ordinary active-fork issue references remain outside these contracts.