โ€บNavigation
Dashboard โ€บ Crypto candidates โ€บ Cost-Realism Labels โ€บ iter 04

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.

mise tasks7
slash wrappers7
check-fullGREEN
guards shippedA / E / G
test-full35 / 35
oracle drift0 bytes

Decisions made (for operator review at PR time)

#DecisionWhy
1labels:oracle runs via the project .venv, not uv --no-projectThe generator derives bar anchors with the real OpenDeviationBarProcessor (contract Q3) โ€” needs the built PyO3 module; fail-fast preamble points to mise run build
2Spec module NOT exported from opendeviationbar/__init__Labels are not consumer API; keeps the public surface + .pyi untouched in PR-A
3labels: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

Next fire picks up here

S5 โ€” adversarial pass + open PR-A. Non-regression sweep (full core test lane + clippy on touched crates), then an attackerโ†’defender panel over the full PR-A diff (independent refuters per finding, majority-kill), surviving findings + resolutions recorded as Challenged & Held in the PR body; open PR-A referencing #614 (author MD Nasim, no AI attribution) and STOP at the red step โ€” then proceed to PR-B authoring in a fresh worktree.