iteration 04 ยท S4 wiring + guards ยท crypto cost-realism labels ยท 2026-07-14
One-keystroke proofs and the first anti-cheating fences S4 DONE ยท check-full GREEN
← campaign board ยท ← iter 03 ยท issue #614
In plain language โ what happened this iteration
Making the proofs one keystroke away. All the verification we built in iterations 02โ03 is now wired into the team's standard command set: typing /labels:check-full reruns everything โ the Rust test battery, the guard tests, and a "drift guard" that regenerates the oracle from scratch and refuses to pass if even a single byte differs from the committed answer sheets. Seven commands (oracle, oracle-fresh, test, test-full, guards, check-full, doctor) now exist, discoverable by anyone on the project. Nothing relies on memory or good intentions: if a future edit breaks anything, the commands scream.
The anti-cheating fences. These labels literally see the future โ that's their job (they measure what a trade WOULD have cost). But if one ever leaked into the machine-learning feature set, the model would be "predicting" with tomorrow's newspaper. Today we shipped the first three structural fences: every label name must start with label_fwd_ (the exact prefix all our screening tools filter out); every database column description must follow a strict grammar ending in "NOT A FEATURE" plus a link to tracking ticket #614; and no label may ever be named like a feature (bar_*). These are automated tests, not guidelines โ they fail the build if violated.
One source of truth. The 8 column names and their full descriptions now live in exactly ONE file. The Python oracle, the Rust tests, and (next) the database schema all cross-check against it automatically โ the class of bug where one surface gets updated and another silently doesn't (which bit this project once before, in #544โ#556) is designed out.
What's next: the adversarial review โ a panel of independent challengers tries to break everything we built โ then pull request A opens for the supervisor's review. The loop stops there; merging is a human decision.
Grounded this iteration
.mise/tasks/labels.toml (7 tasks, registered in .mise.toml includes before the cross-cutting entries): oracle/oracle-fresh run the generator via the project .venv (fail-fast if unbuilt โ unlike bartels' --no-project pattern, the labels oracle needs the real processor); test/test-full use explicit nextest filtersets with --no-tests=fail (test-full unions binary(bar_close_robustness_test) + binary(schema_contract_test)); guards runs hermetic pytest; check-full is depends-only over all four; doctor enumerates + asset-checks + runs the parity gate. Seven .claude/commands/labels/*.md wrappers, descriptions mirrored verbatim. python/opendeviationbar/cost_realism_labels.py: the R5 single column list + full COMMENT grammar (LOOKAHEAD_US 3000000 entry / 6000000 exit+roundtrip, NOT A FEATURE suffix, #614 link, fee provenance) โ deliberately NOT exported from __init__. tests/test_cost_realism_labels.py: guards A (naming law + frozen 8-column set + generator/Rust lockstep cross-checks), E (COMMENT taxonomy incl. per-column LOOKAHEAD mapping + fee provenance pin), G (no bar_* names) โ 6/6 green. Full labels:check-full: 35/35 Rust + 6/6 pytest + oracle-fresh no-drift.
Decisions made (for operator review at PR time)
| # | Decision | Why |
|---|---|---|
| 1 | labels:oracle runs via the project .venv, not uv --no-project | The generator derives bar anchors with the real OpenDeviationBarProcessor (contract Q3) โ needs the built PyO3 module; fail-fast preamble points to mise run build |
| 2 | Spec module NOT exported from opendeviationbar/__init__ | Labels are not consumer API; keeps the public surface + .pyi untouched in PR-A |
| 3 | labels:guards added as a 7th task (beyond the bartels 6) | Guard suite A/E/G is pytest-side; the Rust filterset can't run it; check-full depends on it explicitly |