Pre-registered · immutable
The protocol
Written down before any number was measured. That is the only thing that makes the numbers mean anything. A rule chosen after seeing the results is not a rule.
The rules
Perception. P4 priors only. Objecthood (4-connected same-colour components), position, adjacency, counting. Colours are channel values, never meanings. "Background is the most frequent colour" is a prior, not a law: when the output says otherwise, the canvas colour is learned from the output.
Induction. Corroborate on every pair. A declared, closed transformation family. A candidate is believed only if it reproduces every training pair. Fewer than two pairs and the answer is a refusal: one witness is provisional, and provisional answers nothing here.
Composition. Depth capped at 2. Each member may be applied after one structural pre-transform (crop, dihedral, downscale, detile, border-trim, crop-largest), with the whole family required to corroborate on the transformed pairs. More than two corroborated chains and the answer is a refusal.
Restraint. The refusal is the product. More than two distinct corroborated proposals means refuse as ambiguous. Two or fewer gives the official pass@2. Wrong-with-confidence is the failure that matters.
Sets. Training is calibration, the half ARC designed for it. The evaluation set is sealed and unread. The seal is single-use per code state.
The three refusal reasons
A refusal always names one of these, and they are always separately countable. You can count them without asking us.
- single_pair
- Fewer than two training pairs, so nothing can be corroborated.
- no_corroborated_rule
- No declared member reproduced every training pair.
- ambiguous
- More than two distinct proposals corroborated; we do not know which.
A refusal is never an empty body and never a 204. A malformed task comes back as an error, not a refusal. Folding an input problem into the refusal counts would corrupt the very number this protocol exists to report.
What the solver never does
- It never scores. It does not see a test output, does not accept a claimed answer, and never reports whether you were right.
- It answers only from a corroborated rule. Refusal is a correct answer. Note the scope: this is a property of the ARC adapter's search, not a general claim that the model cannot produce an unsupported statement. See what this does not claim.
- It never special-cases a task. No detectors aimed at specific benchmark tasks, no hardcoded answers. Correct behaviour emerges from the declared family or it does not happen.
- It uses no transformers, neural nets, gradient descent or LLM calls. Anywhere. Not in the solver, not in a helper, not "just for a heuristic".
- It has no training phase. There is nothing to train: the family is declared, not learned.
On the depth-3 branch (v0.16)
Depth-3 composition was measured and reverted: two-tenths of a point at roughly fifteen times the solve cost. Its code state no longer exists and it was never published. It is named here, and drawn on the chart, because a protocol that hides its abandoned branches is not pre-registered in any useful sense.
