…ut at a time
The ledger and the residuals label a decision at its own node. Whether
being wrong there cost the root anything is a different question, and most
such errors cost nothing: a re-search recovers them, or the root's move
survives them. `arche forced` searches each root of a suite under the
default, samples the shortcut decisions it takes, and searches the root
again for each sampled decision with that one decision inverted, printing
what the root answered both times.
Four kinds can be inverted: the reverse futility margin answering a node,
the null move's cut, a late quiet skipped (by the model at depth four and
up, or a shallow rule below), and a reduced scout's fail low trusted. A
decision is addressed by its kind, a position key and the deciding node's
depth; a move decision is keyed by the position the move leaves, as the
ledger keys its rows. The inversion applies wherever the search meets the
address. `kinds` and `from <depth>` narrow the sampling, since shallow
decisions are most of them.
The hooks sit where each decision is taken, behind a bare is_some with the
body cold and out of line, as the sampler's are. While armed, the move loop
asks the shallow rules move by move as it does under the ledger, and
reduced scouts are staged so their features reach the row. The model's
score is exposed for the row where the gate reads one.
The default search is unchanged: the bench is 5965973, and callgrind over
`bench 5` reads 195,641,600 instructions against master's 195,202,622
(+0.22%), with the same nodes. The tests hold a recording arm's move,
score and nodes to an unarmed search's, an address never met to no visit
and no change, every kept decision to at least one visit, one row an
address, the kinds and depth filters, and the model's score to the depths
the gate reads it at. A session test runs the binary.
Bench: 5965973
Elo: not measured
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NgTGRjqAYAXR7VCxCRqhjh
arche forcedsearches each root of a suite under the default, samples the shortcut decisions it takes, and searches the root again for each sampled decision with that one decision inverted. It prints what the root answered both times. The ledger and the residuals say whether a decision was wrong at its own node; this says whether it cost the root anything.Four kinds can be inverted: a reverse futility cut, a null move cut, a skipped late quiet, and a trusted fail low of a reduced scout. A decision is addressed by its kind, a position key and the node's depth, and it is inverted wherever the search meets that address.
kindsandfrom <depth>narrow the sampling.docs/INSTRUMENTS.mdhas the rows and what each inversion does.The default search is unchanged. Bench is 5965973. Callgrind over
bench 5reads +0.22% instructions against master with the same nodes; the hooks are bareis_somechecks in front of cold calls.Tests: an armed recording search answers as an unarmed one does (move, score, nodes); an address never met changes nothing; every kept decision is met when forced; one row per address; the filters; the model's score only where the gate reads one; a session test against the binary. fmt, both clippy runs and both test profiles pass.
Elo: not measured (an instrument; no search change).
🤖 Generated with Claude Code
https://claude.ai/code/session_01NgTGRjqAYAXR7VCxCRqhjh
Generated by Claude Code