Arctic oracle provenance and reconstruction
The Arctic pin preserves the upstream oracle’s per-utterance scoring rows. The
oracle is historically attributed to stock SphinxTrain, subject to the
provenance limits below. Its rows are stored in
oracle-sidecar.json. Those
rows make the recorded comparison checkable: they retain the reference-word
and error counts for each decoded utterance, the aggregate scores, the
PocketSphinx and Python identities used for decoding, hashes of the decode
dictionary and language model, and hashes of the preserved model files.
That is tamper evidence for the recorded comparison, not independent provenance for the stock training run. The sidecar does not name a SphinxTrain source revision, build toolchain or build command. It does not contain the stock training configuration, corpus archives or training-file list, training log, decode command, or scoring command. Its original model paths point outside the repository. Recomputing the rows from preserved model bytes would check decoding, but would not reconstruct the models.
Keeping the live comparison resource-matched
A paired comparison across two lexicons measures the lexicon as much as the
model, so the live oracle cells are decoded again from the preserved model
bytes whenever the pinned decode resources change.
scripts/regenerate_arctic_oracle.py does that: it authenticates the preserved
model directories against the manifest digests already in the sidecar, decodes
the preserved multipron-on model through
pstrain.benchmarks.arctic.score_model under the current pinned dictionary,
language model, and decoder settings, and refuses to emit a sidecar whose
stated resource match disagrees with the record. make pin-check reruns that
authentication without decoding, and
scripts/regenerate_arctic_paired_analysis.py fails outright if the two arms
name different dictionary or language-model bytes.
Staging is isolated. Each arm is copied into a directory created empty for that arm, so no artifact from an earlier run can survive into the model the decoder consumes, and the sidecar records an identity for the staged directory that was actually decoded alongside the preserved source digests. Regeneration refuses to proceed unless the staged directory carries exactly the authenticated file set and differs from the source only in the one file it declares it replaced.
Why the sidecar names a different commit than the one carrying it
The sidecar’s engine.git_describe names the commit whose working tree produced
the rows, and its tracked_modifications_sha256 is the digest of an empty
git status, so that tree was clean when the run started. That is never the
commit the finished sidecar is committed as. An artifact cannot record the hash
of the commit that carries it, because adding the artifact changes that hash;
the producing commit is always an earlier tree, either the carrying commit’s
ancestor or its sibling one amend behind.
The current sidecar was generated by the tree at 8b1ebf4 and is carried by a
descendant of it, whose only differences from that tree are the generated
evidence under evidence/arctic-pin/ and the documentation reporting it.
Read the recorded commit as the producing tree, and check the relationship rather than assuming it. Everything the measurement depends on should be byte-identical between the two, so this should be empty:
git diff "$(jq -r .engine.git_describe evidence/arctic-pin/oracle-sidecar.json)" HEAD \
-- pstrain scripts tests Makefile benchmarks evidence/arctic-pin/record.json
What legitimately differs is the generated evidence under evidence/arctic-pin/
and the prose that reports it. If anything else differs, the recorded identity
no longer authenticates the code that produced the rows, and the oracle should
be regenerated rather than explained.
Two properties of the re-decode are measured rather than asserted, and both
leave result and row digests in the sidecar that --check recomputes.
The preserved oracle models carry a nine-field SphinxTrain feat.params, and
the current complete-model contract requires twenty-three fields. The
regeneration completes the staged copy with PocketSphinx’s own built-in
defaults, which are the values the absent fields already had. It then decodes
the preserved model both ways — once with the original nine-field record and
once with the completed record — and refuses to emit a sidecar unless every
per-utterance row agrees. front_end_reconstruction.neutrality_control holds
both arms’ counts and digests together with the dictionary and engine the
control ran under, and the completed arm’s digests are recomputable from the
emitted rows. The preserved bytes themselves are never modified, and the
recorded preserved-model digests are computed from the originals.
The re-decode is not a reproduction of the 2026-08-11 oracle rows. Decoding the
same preserved model with the same historical dictionary on the current engine
yields 144 errors on on/slt55 against the historical 138, and 22,638 on
on/big against the historical 22,487; that control is rerun during every
regeneration and retained in historical_dictionary_control, which keeps the
historical rows themselves alongside the digests, so the difference stays
checkable from this repository alone. The oracle arm is therefore engine
sensitive, and the historical rows are an attested measurement on their
producing engine rather than a fixed reference point. That is as far as the
evidence goes: it does not establish that the two arms move by the same amount
or in the same direction, and it does not allocate any earlier reported
difference to the engine alone, since the pstrain arm was also retrained under
a different dictionary over the same interval. The same control also shows that
the dictionary deduplication did not move the oracle arm at all: decoded under
the earlier dictionary the preserved model produces the same rows as under the
current one, which is recorded as dictionary_change_moved_rows. The retired
off cells keep those
historical rows and their producing identity in the sidecar’s
historical_provenance; they are reported on their own resources and are never
presented as resource-matched to the live pin.
The retired arms are comparable as paired historical decode measurements on their own recorded path, NOT COMPARABLE to the live pin, and NOT COMPARABLE for implementation attribution because their model-producing identities are missing or incomplete.
The live arms are comparable as paired decode measurements because they share the current decode and scoring path, but they are NOT COMPARABLE for implementation attribution because the oracle model’s producing host, architecture, build, training configuration, inputs, and full lineage are unknown. Under that resource-matched comparison SLT-55 sits below the oracle on the point estimate and big sits above it, and both paired 95% intervals include zero, so neither cell shows a statistically significant difference. The measured deltas and intervals are in the pin’s generated baseline table, which is rebuilt from the checked-in evidence and is not restated here.
Procedure for an independently derived stock arm
The following is the work required to create a comparable arm. It is not a record of a procedure executed for the checked-in oracle.
Pin a clean stock SphinxTrain checkout by full commit and record the compiler, compiler version, build flags, platform, and hashes of the resulting programs. Development records name
694c10099a50d11fd31ca824044bbe957ba650bdas a stock revision that was rebuilt successfully on a narrower CI-training rung. The oracle sidecar does not bind its models to that revision, so it is a reconstruction candidate, not established oracle provenance. If another revision is used, record why and keep its full identity with the result.Reconstruct the CMU Arctic SLT training project from the corpus identities and 1,043-utterance training-file-list hash in the pin record. The checked-in record supplies archive, transcript, and file-list hashes, but not a stock project tree or a mapping from those inputs to a complete
sphinx_train.cfg. Recover or recreate that configuration, then check it in or preserve it verbatim with a digest. Do not treat a configuration inferred only from final model dimensions as the producing configuration.Produce separate stock multipron-off and multipron-on models, recording every effective stock setting, stage input, realized pass count, omitted utterance, and output-model hash. The historical development notes refer to external
run.shandetc/sphinx_train.cfgfiles and identifyCFG_MULTIPRON_TRAINING=yesas the on-arm change, but those files are not in this repository. Until they are recovered or replaced by a complete, reviewed configuration, the historical oracle recipe remains incomplete.For a pstrain comparison intended to mirror stock alignment behavior, set
training.retry_beam_factor=1,training.failed_alignment=omit, andtraining.optional_final_silence=false, as required by the parity and deviations register. Also select the stock-compatible inventory and sharding postures described there, and pin the front-end difference rather than assuming the two arms consume identical feature bytes. These are comparison controls for the pstrain arm, not claims about stock configuration keys.Decode the reconstructed models under the pin’s recorded PocketSphinx, language-model, dictionary, filler-dictionary, beam, language-weight, and word-insertion-penalty identities. Preserve the exact decode and scoring commands. Emit per-utterance rows in the sidecar schema and compare both rows and model hashes with the checked-in oracle. A mismatch is a new measured arm unless the missing producing-run provenance is recovered; it must not silently replace or relabel the preserved oracle.
This procedure becomes a reproduction of the checked-in oracle only when the missing source/configuration/toolchain link is supplied and the resulting models and rows agree. At present it is a route to an independently derived, comparable stock baseline. The preserved oracle remains an attested historical measurement rather than a fully reproducible build.