feat(deduction-serve): Band v2-EN — natural-English argument serving, earned licenses (ADR-0257) #107
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/english-argument-band"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
CORE now decides natural-English deductive arguments end-to-end:
'If it rains then the ground is wet. It rains. Therefore the ground
is wet.' -> ENTAILED, rendered over the user's own clauses. Both of
ADR-0256's documented boundary cases (multiword conditional, nested-
negation contraposition) are now decided; their lane gold updated
declined->entailed.
over OPAQUE clause-atoms (minted ids); if/then, [either] or, and,
three negation forms (leading not / sentential / copular incl.
contractions); typed refusals; honesty caps. Soundness: positive
verdicts are substitution-closed; UNKNOWN is scoped + guarded
(quantifier-led, is-a membership, unnormalizable negation refuse
out of the opaque band).
phrasing explicitly scoped to the opaque reading.
monotone widening, byte-identical on previously-served arguments.
wrong=0, reliability 0.99087 >= 0.99); 9-band ledger re-sealed.
(content disjoint from the synthetic lexicon), wrong=0; report
re-pinned.
templates are not slot-composed articulations (pack 'open'=VERB
was rejecting an honest quoted 'the door is not open'); pinned
cold+warm in e2e.
[Verification]: deductive 84 passed; smoke 180 passed; cognition 122
passed 1 skipped; arena 9x720 wrong=0 all SERVE; lanes v1 28/28,
v2_en 26/26.
What this ships
CORE now decides natural-English deductive arguments end-to-end through
core chat:Every one of these declined before this PR. Both boundary cases ADR-0256's completion
doc recorded as "the future acceptance tests" — the multiword conditional
(
reserved_word_in_np) and nested-negation contraposition (If p then q. Therefore if not q then not p.) — are now decided; their v1 lane gold is promoteddeclined → entailed.Governing decision:
docs/adr/ADR-0257-english-clause-argument-band.md(Proposed).How it works
generate/proof_chain/english.py(new) — a dedicated English argument reader usedONLY by the deduction serving path. Whole English clauses become opaque atoms (minted
ids
a0, a1, …; identity = normalized exact text); structure is recognized by a closedfunction-word grammar:
if <A> then <B>(junctions on both sides),[either] <A> or <B>(n-ary), top-level
and(premise-splitting / conjunctive conclusions), and three negationforms — leading
not, sententialit is not the case that, copular<L> is|are|was|were not <R>(contractionsisn't/aren't/wasn't/weren'texpanded). Clause content is neverinterpreted — only quoted back.
generate/proof_chain/entail.py, sound+complete);render_entailment_englishrenders verdicts over the user's own clause text.chat/deduction_surface.py::_english_band_surface) — triedstrictly AFTER Band v1 (single-token propositional) and v1b (categorical). Everything
previously served is served byte-identically; this band only widens. The shared
7-lane comprehension reader is untouched (its guards are load-bearing elsewhere).
Why the opaque reading is sound (ADR-0257 §3)
Propositional entailment is closed under uniform substitution, so ENTAILED / REFUTED /
inconsistent-premises verdicts over opaque clause-atoms remain true under ANY deeper reading
of the clauses — served at full strength. UNKNOWN is the one non-substitution-safe verdict,
so it gets (a) explicitly scoped phrasing ("Reading each clause as one indivisible claim…"),
and (b) structural guards: quantifier-led categorical clauses,
is a/anmembershipclauses, and unnormalizable negation (
never,doesn't, …) refuse OUT of the opaque bandwith typed reasons — a genuine syllogism can never be flattened into a misleading "doesn't
follow". Ambiguous scope (mixed top-level
and+or, nested conditionals) refuses ratherthan guesses. Honesty caps (16 premises / 24 atoms) refuse rather than truncate.
Earned, not granted (ADR-0256 machinery, zero changes needed)
en_conditional_single,en_conditional_chain,en_disjunctive,en_atomic— each earnedAction.SERVEthrough the ADR-0199 practice arena:720 cases/band, wrong=0, reliability 0.99087 ≥ θ_SERVE=0.99; 9-band ledger re-sealed
(
chat/data/deduction_serve_ledger.json, self-verifyingcontent_sha256).truth-table oracle with no reader in the loop (the template's intended logical form is
checked directly) — stronger independence than the v1 path; INV-25 preserved.
is content-blind; the license certifies structural fidelity). The new eval lane
evals/deduction_serve/v2_en/(26 hand-authored REAL-English cases, content disjointfrom the synthetic lexicon) keeps that claim honest: 26/26, wrong=0.
deduction_serving_enabled=Falsedefault; no new flag.Bug found live and fixed: realizer-guard category error
The ADR-0075 C1 slot-type guard was silently replacing a correct entailment with the
disclosure fallback: pack lists
openas VERB (its composed sense), so R3 rejected thehonest quoted copular "the door is not open" ("dry"/"broken" passed only by being unknown
to the pack — fail-open). A deduction surface is a fixed, test-audited template quoting the
user's clauses verbatim — not a slot-composed articulation — so C1's pack-POS rules are
out of regime for it. Fix: deduction-grounded surfaces are exempt at both runtime call
sites (
QUOTED_TEMPLATE_EXEMPT_VERDICT, mirroring the existing empty-surface exemption);regression pinned cold AND warm in e2e.
Tri-language posture (ADR-0257 §5, per direction)
The atom table, soundness argument, caps, refusal discipline, license machinery, and engine
are language-neutral; only the structural lexicon is English. A
grc_*/he_*band is asibling reader module + its own earned licenses via pack ratification (ADR-0253 boundary
respected) — NOT a premature lexicon parameter (ἄρα is postpositive; a lexicon swap alone
cannot read real Greek). The en-band refusal telemetry (
internal_negation_unread,ambiguous_and_or) is the instrumented trigger marking exactly where English is thebottleneck.
Honest scope-outs (deliberate)
member_chainband — "Socrates is a man. All men are mortal. Therefore Socrates ismortal." — guarded out (
membership_shape_out_of_band); designed next band(per-individual propositional lowering, same pattern as
categorical.py).work or the tri-language path.
Files
generate/proof_chain/english.py,evals/deduction_serve/v2_en/cases.jsonl,tests/test_english_argument_reader.py,docs/adr/ADR-0257-english-clause-argument-band.md,docs/research/english-argument-band-2026-07-23.mdchat/deduction_surface.py,chat/runtime.py(guard exemption),generate/proof_chain/{render,shape}.py,generate/realizer_guard.py,evals/deduction_serve/{runner.py,report.json,v1/cases.jsonl,practice/gold.py},chat/data/deduction_serve_ledger.json(re-sealed, 9 bands),core/cli_test.py,scripts/verify_lane_shas.py(deduction_serve_v1 pin), + 4 test files extended[Verification]:
uv run core test --suite deductive -q→ 84 passed ·--suite smoke→ 180 passed ·--suite cognition→ 122 passed, 1 skipped ·practice arena 9×720 wrong=0, all bands SERVE · lanes v1 28/28, v2_en 26/26 ·
ledger self-verifies
content_sha256· report re-pinned inverify_lane_shas.pyBoth are also durably in the repo: the title is commit a83b35de's subject line, and this body tracks docs/research/english-argument-band-2026-07-23.md (with the guard-fix section expanded for the record).