| Field | Value |
|---|---|
| Decision ID | ADR-079 |
| Initiative | Fold in deterministic (sympy/template) solving as an optional provider — discussion #3217 direction #1 |
| Proposed By | Ocean (@ohdearquant), drafted by Leo |
| Date | 2026-06-20 |
| Status | Proposed |
Ocean’s runs produced a large set of template-* proofs that were deterministic sympy/Python solves, not LLM solves — disclosed publicly in #3217 (“not solved by LLM, solved by sympy”). They had been written into provenance as provider≜claude; model≜template-*, which the board renders as a model attribution. That record is being corrected to provider≜python; model≜sympy (the honest one), and Chris asked, as direction #1 of the thread, to “fold in your method for deterministic solving (optional, non-breaking).” This ADR contributes the method. It is scoped narrowly and on purpose: it adds a solver and an attribution convention, and it does not claim to add a new anti-farming guarantee — credit and provenance integrity stay with the ADRs that own them (ADR-035, ADR-078, ADR-023/037).
The method is deterministic and carries no model in the solve loop. It has two tiers:
rfl/decide/norm_num/ring/omega/…) closes it, emit by <tactic> and stop. The battery already exists in tools/sourcing/check_triviality.py; this reuses it the other way round. Every tier-1 output is trivial by ADR-035 by construction — a single battery tactic closed it.ZMod, polynomial/ring identities, linear_combination witnesses), compute the witness or normal form in sympy and emit the corresponding kernel-checkable Lean proof. This reaches a band the bare battery cannot — a specific large factorisation decide will not brute-force becomes a one-line proof once sympy hands over the witness. Tier-2 outputs are mechanical template work, but they are not all trivial-by-ADR-035: a linear_combination with a computed witness, for instance, is not in the ADR-035 set and need not fall to ADR-078’s fuller battery either. Where an output is a genuine non-trivial proof, the honest record of who found it is “a deterministic procedure”, and that is the attribution this ADR standardises.Whatever the tier, soundness is untouched: a candidate is just a by … block, and the existing path re-elaborates it and the kernel re-checks (ADR-006/048). Nothing is trusted on the provider’s word, exactly as ADR-013 already requires for every provider.
The reason to want this is cost and coverage. A goal a deterministic procedure closes instantly is a goal no LLM has to attempt, and ADR-013 records that a failed LLM attempt costs a full UNSORRY_WALL window plus a Lean build. The elementary families the Identity Engine (ADR-043) targets — ZMod-decide divisibility, SOS inequalities, telescoping identities — are exactly the band a deterministic provider clears for free, freeing model budget for the hard, credited obligations.
On credit, the honest accounting is narrow. This ADR does not decide what scores; ADR-035 (the triviality probe), ADR-078 (credited vs glue obligations of sponsor-registered targets), and ADR-023/037 (provenance) already do. A deterministic solve earns whatever those mechanisms grant any proof with the same statement and the same recorded provenance. What this ADR adds is the convention that such a solve is recorded provider≜python; model≜sympy, so the board is not told an LLM did it. That convention is the same kind of un-kernel-enforceable, spoofable record ADR-013 already lives with for model identity — a contributor can write a false provider, and defeating that is the job of the provenance subsystem (ADR-023/037), not this ADR. So this ADR neither closes nor widens the provenance-spoofing hole; it states the honest default and points at where spoof-resistance is owned.
One coupling must be named plainly, because it is the real risk. A free, fast proof factory for easy goals is a farming accelerant if credit attaches to easy or atomic goals. Under today’s advisory atomic model it partly does, so a deterministic factory pointed at the board would be a farm vector. That is precisely why this ADR is proposed as a companion to ADR-078: once credit attaches to non-trivial, sponsor-authored obligations and ADR-035 is blocking at registration, the factory can only discharge zero-credit glue and pre-pass work, which is its sanctioned use. The value of the deterministic provider is therefore real only alongside that credit reform; on its own it would need ADR-035 made blocking before it is safe to enable against the board.
In the context of a provider/model seam where model choice is a performance knob and never a soundness one and provider identity is explicitly not kernel-enforceable (ADR-013), an ADR-035 tactic battery already in the tree, the elementary-identity families the swarm is strongest at (ADR-043), and the companion proposal ADR-078 moving credit onto non-trivial sponsor-authored obligations,
facing a large class of goals (template-matchable identities and witness-constructible statements) that an LLM closes only after burning a full wall plus a build, while a deterministic procedure closes them instantly and for free — and our own runs showing deterministic solving works at scale but was mis-attributed to a model,
we decided for an optional, off-by-default deterministic provider (provider≜python; model≜sympy) with the two tiers above, re-verified by Gate A like any proof, recorded with honest python/sympy provenance, and used for a zero-LLM glue discharger on ADR-078 targets, a fast pre-pass before an LLM is dispatched, and Phase-1 autoformalisation coverage,
and neglected (a) claiming this ADR itself makes deterministic output non-creditable — it does not; credit is decided by ADR-035/078/023, and asserting a guarantee this layer cannot enforce would be the over-claim we are avoiding; (b) attributing deterministic solves to any LLM provider — the dishonest record we are fixing; (c) sourcing tier-2 output as standalone atoms through ADR-043 — most fail that pipeline’s triviality gate, and the rest should not be minted as atoms regardless; (d) enabling it against the board before ADR-035 is blocking or ADR-078 is in force — without one of those a free factory is a farm vector, named above; (e) building cryptographically attested, spoof-proof provenance scoring into this ADR — that is a separate subsystem belonging to ADR-023/037’s evolution, out of scope here; (f) making it on-by-default or coupling it to soundness — it is a cost/coverage knob, off unless asked for,
to achieve free, instant discharge of the elementary/template band so LLM budget is spent on hard credited obligations, on the existing provider seam, with an honest attribution standard,
accepting that coverage is bounded to template-matchable and witness-constructible families (no general reasoning); that the non-credit treatment of its output rides on honest, spoofable provenance (the ADR-013 residue, deferred to ADR-023/037), not on a new gate; that the deterministic factory is only safe against the board alongside ADR-078 or a blocking ADR-035; and that the family→template surface is a governed surface that must be reviewed as it grows.
provider≜python; model≜sympy as the honest record for deterministic solves, replacing the template-*/claude mis-attribution. It composes with the work already in the tree: a glue discharger for ADR-078, a pre-pass for ADR-013’s dispatch, a producer for ADR-043’s families and the plan’s Phase-1 on-ramp. Soundness is untouched — Gate A re-verifies in the kernel regardless of provider.prove(...) PR as a model’s work — but it is not created or widened by this ADR: sympy is public and provenance is spoofable today, so the path exists with or without an in-repo deterministic provider. What this ADR adds is the honest in-repo path plus a guard: enabling the provider against the board is gated on both the credit reform (ADR-078 / blocking ADR-035) and corroborated provenance (ADR-023/037), enforced by the SPEC §1 board-submission guard rather than left to operator discipline. End-to-end corroboration of an artifact’s origin is ADR-023/037’s surface, not built here. The tier-2 family surface is an abuse vector if it grows unreviewed, which is why §3 of the SPEC puts it under CODEOWNERS with a per-family credit-posture assertion.| Reference ID | Title | Type | Location |
|---|---|---|---|
| REF-1 | Model & Effort Policy (the provider/model seam; provider identity not kernel-enforceable) | Decision | ADR-013-Model-Effort-Policy.md |
| REF-2 | Non-Trivial Theorem Enforcement (the battery reused as a solver) | Decision | ADR-035-Non-Trivial-Theorem-Enforcement.md |
| REF-3 | The Identity Engine (the elementary families this discharges) | Decision | ADR-043-Identity-Engine.md |
| REF-4 | Sponsor-Registered Targets and Obligation-Discharge Credit (glue / non-credit; farm-bounding) | Decision (proposed) | ADR-078-Sponsor-Registered-Targets-And-Obligation-Discharge-Credit.md |
| REF-5 | Optional Proof Provenance and Leaderboard (attribution record; spoof-resistance owner) | Decision | ADR-023-Proof-Provenance-Leaderboard.md |
| REF-6 | Corroborated Solver Provenance — phantom-attribution guard | Decision | ADR-037-Corroborated-Solver-Provenance.md |
| REF-7 | Distributed Autonomous Research Swarm plan (Phase 1 autoformalisation) | Proposal | docs/proposals/distributed-research-swarm-plan.md |
| REF-8 | Discussion: fold in deterministic solving (direction #1) | Discussion | #3217 |
| Status | Approver | Date |
|---|---|---|
| Proposed | Ocean (@ohdearquant) | 2026-06-20 |