R03: evidence displacement — one frozen exploratory coverage reranker This module uses unchanged public R02 evidence from ../../128: 6,257 corpus records and document vectors, 48 questions and query vectors, and the 666 previously judged task-document pairs. It does not modify 128. It adds no questions, judgments, corpus content, or holdout data. READ FIRST report.html Human-readable result, limitations, A21/B18 cases method.json Exact rule and all fixed design choices method-freeze.json Hashes made before opening qrels grades score-inputs.json All facet/document and document/document cosines label-free-rankings.json All selections and greedy marginal contributions requirement-vectors.npz 192 newly encoded original requirements encoding-record.json Pinned-model runtime and preparation access barrier results.json Every metric, pool item, selected set, and contrast outcome-freeze.json First outcomes and qrels hashes verification.json Independent numerical and coverage-bound checks Result: the single fixed reranker lowers embedding redundancy but has worse pooled nDCG. Across all 48 tasks its small mean agreed-coverage gain has an exploratory interval spanning both signs; the original final36 subset instead has a small mean coverage loss. Both subsets are exploratory here. Do not call this a successful replacement for dense retrieval or a fresh test. Irrelevant but dissimilar items can occupy late selection slots. No post-outcome tuning or method replacement was performed. METHOD For the question vector plus each separately encoded raw requirement, positive cosine is divided by that facet's maximum positive cosine over the whole same pool. Every facet has equal weight. Greedy selection maximizes the increase in sum of maximum facet similarities minus the sum of positive document pair cosines divided by ten, then divides by facet count. Choose five; tie on checked ID; keep greedy order. This is one policy, no grid or label-based tuning. This is pool-restricted selection: every method's selected set lies in the already judged pool. Dense top5 exactly matches the original whole-corpus R02 dense top5; typed is the unchanged R02 chosen typed:dense:1:0.1. New selection uses neither graph nor judgments. Its facets are embedding proxies, not factual evidence-verification labels. The labeled oracle is an exhaustive upper bound for agreed obligation coverage within this pool, never a deployable method or baseline. Its nDCG is high by design because mean grade orders its selected set and breaks coverage ties. Oracle coverage is not proof of sufficient answers. PROVENANCE R02 encode_tasks.py supplied the model/tokenizer/pooling convention; the new encoder directly implements that same convention. R02 metrics_r02.py supplies the declared nDCG definition. No R02 code is imported, no R02 vector is changed. Pinned local MiniLM revision: 1110a243fdf4706b3f48f1d95db1a4f5529b4d41. Preparation installed a Python file-open audit hook before reading inputs; filenames containing qrels, judgments, grades, results or diagnostics were forbidden. Original parameter-lock metadata was read to identify the historical comparator, but no label contents were available to selection. Scripts, method, score inputs, and all label-free selections were hashed before evaluation. This is a locally recorded chronology, not an external preregistration, and the public benchmark could already have informed upstream research decisions. REPRODUCE / VERIFY (PowerShell, from workspace root) $env:PYTHONPATH = 'D:/W/Unified/USS/127/runtime' $displacementPython = 'C:/Users/micha/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe' & $displacementPython 129/displacement/test_integrity.py & $displacementPython 129/displacement/verify.py --encode & $displacementPython 129/displacement/build_report.py Portable kit layout: ROOT/128 contains exactly source-allowlist.json entries; ROOT/129/displacement contains this module. No paths inside frozen scripts need editing after extraction. From ROOT, use any compatible Python 3.12 environment with requirements.txt installed and run python 129/displacement/verify.py --encode. The original runtime versions were NumPy 2.5.3, ONNX Runtime 1.30.0, and tokenizers 0.23.2. Different numerical runtimes or hardware may require separately reporting tolerances rather than claiming bit-identical vectors. Verification re-encodes every requirement with the pinned local model and requires exact float32 vector equality, reconstructs every score matrix, reproduces selection, verifies hashes, independently recomputes all nDCG and coverage values, and checks all coverage-oracle ceilings with a separate dynamic program over obligation sets. First-run workflow was prepare.py, then freeze notification, then evaluate.py. Both refuse to overwrite their respective freezes/results. To repeat first-run generation, copy method.json, core.py, prepare.py, evaluate.py and test_integrity.py to a NEW sibling of displacement under 129, retaining the same ../../128 source location, and run prepare.py then evaluate.py there. Never remove or overwrite the original evidence. Fresh NPZ container hashes can differ with archive metadata; compare vector values, score matrices and rankings. The provided verify.py checks numerical reproduction in place. No web calls, corpus edits, graph changes, answer generation, or deployment. Numbers inherit the limitations of R02's model-generated judgments, purposive questions, incomplete method pool, and possible public/pretraining exposure.