core/docs/analysis/verified-serving-wiring-scoping-2026-06-08.md
Shay 28cb42d0dd
docs(epistemic): scope ASK and VERIFIED serving gates
Accepts the ASK + VERIFIED serving-integration scoping briefs.

No served-surface code is introduced. ASK is identified as the next gated serving slice; VERIFIED remains blocked on a gold-free second reader and explicit eval-gold serving ban.
2026-06-08 22:22:35 -07:00

183 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# VERIFIED serving-wiring — `verified_serving_enabled` — scoping brief
**Date:** 2026-06-08 · **Status:** scoping (NO CODE) · **HOLD for review** ·
**Branch:** `docs/serving-integration-scoping`
**What this brief is.** The scope for the served-surface decision the VERIFIED lane
deferred. The off-serving VERIFIED lane is complete and on main:
```text
P1-A the VERIFIED contract (verified_contract.py — two independent reads converge)
P1-B gold-setup-backed producer (evals/constraint_oracle/verified_producer.py — OFF-SERVING)
P1-C bound_slots_digest (a separable, load-bearing proof obligation)
```
P1-B verifies 7/13 real R2 problems with wrong=0 — but it is **gold-setup-backed**, so
it is structurally off-serving: the independent read is the INV-25 hand-authored gold
SETUP, which is not available at serving time. This brief scopes what a *serving-time*
VERIFIED would require — and why it cannot reuse P1-B. **No code here.**
> Companions: [[ask-serving-integration-scoping-2026-06-08]] (the ASK half of the same
> "where off-serving stops" line), [[VERIFIED-canonical-comparison-scoping-2026-06-06]]
> (the validate-first probe that already KILLED the naive fold-reader producer),
> [[stage2-epistemic-disclosure-bus-verified-v1-scoping-2026-06-08]] (Doc 1).
---
## 1. The seam (grounded) — and why it is still inert by design
`generate/derivation/verify.py::_canonically_verified(verified, problem_text, policy)`
is the ADR-0206 §5 VERIFIED gate — *the only thing that may license a math answer past
gold* (resolve a disagreement STRICT refuses). It **returns `None` today**, so the
widening is structurally inert: disagreement refuses regardless of `policy`, preserving
absolute `wrong == 0`. Its own docstring states the bright line this brief must honour:
> "A reliability *license* (statistical) must NEVER substitute here: math serving is
> absolute-wrong=0, not disclosed like the cognition path."
So VERIFIED serving = replacing that `return None` with a producer that returns a
derivation **only when it is canonically VERIFIED** (proven correct, not merely sound),
behind a kill switch, proven on a holdout. Everything below is the eligibility bar for
that producer.
---
## 2. The five things this decision must pin
```text
1. the gold-free independent-reader requirement — the crux
2. verified_serving_enabled — the kill switch
3. holdout gates — validate-first, no quiet widening
4. proof-producer eligibility — what may plug into _canonically_verified
5. the explicit ban on eval-gold-backed serving — why P1-B cannot serve
```
---
## 3. The gold-free independent-reader requirement (the crux)
VERIFIED means **two independent reads that converge on one canonical structure**
(P1-A): a faithful solve of a *wrong read* is caught because the independent read
disagrees. P1-B's two reads are `read_constraint_problem` (the engine reader) vs the
**gold-authored setup**. At serving time there is no gold. So serving-time VERIFIED
needs a **second, gold-free reader** whose disagreement is the safety mechanism.
The hard constraints, from the killed-probe doc and CLAUDE.md:
- **Independence must be in the READING, not the solving.** Back-substitution catches
solve-errors, never read-errors. Two solvers over one reading is *fake* independence.
The second reader must parse the problem into the same `ConstraintProblem` structure
by a **genuinely different route** (different lineage, asserted by the
`SAME_READER_LINEAGE` firewall / INV-27 reader-disjointness), and converge on the
same canonical signature.
- **No eval gold in the read** (§7). The second reader may not consult, hash, or be
derived from any gold artifact — not the answer, not the setup. If it needs gold to
read, it is P1-B, and P1-B does not serve.
- **Conservative refuse-on-doubt carries wrong=0.** The second reader, like the first,
refuses when uncertain. VERIFIED fires only on *agreement of two confident,
independent reads*; any refusal or disagreement → STRICT refuses (today's behaviour).
**Eligibility, stated as a gate:** a serving-time VERIFIED producer is eligible **only
if** it exhibits two reads with (a) distinct, firewall-asserted lineages, (b) neither
read derived from gold, (c) convergence on one canonical `ConstraintProblem` signature,
(d) back-substitution + boundary-clear + bound-slots (the P1-A/P1-C obligations), and
(e) refuse-preferring failure. Absent any one, it stays `None`.
Whether such a second R2 reader *exists yet* is the open empirical question — the killed
fold-reader probe is the cautionary precedent: complementary readers were ~98% wrong on
the refused set. **This brief does not assume one exists; it sets the bar a candidate
must clear, validate-first, before any wiring.**
---
## 4. `verified_serving_enabled` — the kill switch
Add `verified_serving_enabled: bool = False` to `core/config.py` (sibling of
`estimation_enabled`). Default **off**. When off, `_canonically_verified` returns `None`
unconditionally (today's inert state) regardless of any producer being present. The
switch is the single audited place that lights the seam, and it stays off until §5.
---
## 5. Holdout gates — validate-first, no quiet widening
VERIFIED may not widen live until proven on a **held-out** set it never trained or
tuned on (INV-25 discipline; the killed-probe doc's validate-first rule). The gate, in
order:
1. **Holdout probe (off-serving):** run the candidate producer over a held-out R2 set
with gold answers withheld; require **wrong == 0** on everything it marks VERIFIED,
and that everything it cannot independently verify it *refuses* (over-refusal is
acceptable; one wrong is disqualifying).
2. **Seal byte-identity:** the GSM8K candidate-graph serving seal (pinned SHAs) stays
byte-identical — VERIFIED widens a *different* surface (R2 constraint answers), it
must not perturb the sealed lane.
3. **Disagreement-still-refuses:** a test proving that with the producer wired and the
switch ON, a faithful solve of a deliberately wrong read still refuses (the P1-A
poison test, now on the served path).
4. Only then does `verified_serving_enabled` go on, **one surface at a time** (R2
first; R4 second), each with its own holdout pass.
---
## 6. The served surface — a distinct `[verified]` disclosure
When wired and enabled, a VERIFIED R2 answer is served under its **own** disclosure
claim/marker — the locked decision from Doc 1's review: *VERIFIED gets a distinct
served disclosure mode + `[verified]` prefix, NEVER reused from `[approximate]`*.
VERIFIED is a *license* claim (more licensed than gold-strict), not a *speculation*
claim. The route to it is the only sanctioned one: `disclosure_for_verification(result)`
`(EpistemicState.VERIFIED, DisclosureClaim.VERIFIED)``ServedDisposition.DISCLOSE`
under the P0-3 guard (which already degrades an unbacked VERIFIED claim to COMMIT).
---
## 7. The explicit ban on eval-gold-backed serving (the load-bearing non-claim)
**P1-B must never become a serving producer.** It is gold-setup-backed: its independent
read is the hand-authored gold SETUP. Wiring it into `_canonically_verified` would mean
the engine "verifies" by consulting the answer key's structure — circular, and a
wrong=0 fiction (it would serve VERIFIED on exactly the problems it was handed the setup
for). The ban, stated so a test can enforce it:
- `_canonically_verified` (and any serving producer behind it) may import **nothing**
from `evals/` — no gold loader, no `gold_to_problem`, no `r2_gold`. An AST/import test
asserts the serving path is gold-free, the mirror of the off-serving AST tests.
- P1-B stays in `evals/` precisely so this boundary is structural: `evals → core` is the
allowed direction; `core/generate serving → evals` is forbidden.
- "Verified on a holdout" (§5) is **not** the same as "verified by gold at serving" —
the holdout *measures* a gold-free producer; it never *feeds* gold into one.
This is the VERIFIED analogue of the GSM8K "candidate-graph owns the metric; no bridge
re-enables without sealed/independent wrong=0" discipline.
---
## 8. What this is NOT
- **Not** a claim that a serving-time VERIFIED producer exists — §3 sets the eligibility
bar; whether an R2 second reader clears it is an open, validate-first question.
- **Not** a reliability/statistical license at the math seam — that path is the
cognition `[approximate]` disclosure; math serving is absolute wrong=0 (§1 bright line).
- **Not** a GSM8K-seal move — VERIFIED widens R2 constraint answers, seal stays
byte-identical (§5.2).
- **Not** P1-B promoted to serving — explicitly banned (§7); P1-B stays off-serving.
---
## 9. The questions for the ruling
1. **Eligibility bar:** adopt §3 (a)(e) as the gate any serving VERIFIED producer must
clear — gold-free second reader, independence-in-the-reading, refuse-preferring? (rec: yes)
2. **Gate:** add `verified_serving_enabled = False` (sibling of `estimation_enabled`),
`_canonically_verified` stays `None` while off? (rec: yes)
3. **Holdout:** require the §5 validate-first sequence (wrong=0 on holdout + seal
byte-identity + disagreement-still-refuses) before the switch, R2-first? (rec: yes)
4. **Gold ban:** enforce the §7 import ban (serving path imports nothing from `evals/`)
with a test, keeping P1-B off-serving forever? (rec: yes)
5. **Surface:** serve VERIFIED under its distinct `[verified]` marker via
`disclosure_for_verification` only? (rec: yes — the locked Doc 1 decision)
No served-surface code until this brief is reviewed. Pairs with
[[ask-serving-integration-scoping-2026-06-08]] — together they draw the full line where
off-serving stops.