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.
