Generalization arc Phase 1.1 (Tier F, docs/plans/generalization-arc-2026-07-24.md): "All philosophers teach. Socrates is a philosopher. Therefore Socrates teaches." now reads and decides — the ADR-0258 §6.3 verb-predicate scope-out, and the reading gate for Phase 2's subject serving. generate/proof_chain/verb.py extends v3-MEM's per-individual lowering with a second atom family in one shared space: membership atoms (v3-MEM's own parsers reused verbatim) + verb atoms (individual, verb-lemma-group, object-term). Verb universals instantiate as mem(i,C) -> [~]verb(i), so a copula-minted membership fact discharges a verb rule. The ONE new semantic identification is closed 3sg agreement (verb-specific irregular table + the three regular suffix rules — deliberately NOT the noun table, which would misroute "lives"/"leaves"). Scope-tight segmentation: single-token name/class/verb/object shapes only; everything longer refuses typed (tense_out_of_band joins the closed reason vocabulary). Rendered by render_entailment_verb (member surface, UNKNOWN scoping extended to the verb reading). Rides deduction_serving_enabled (default off); pure widening — every previously-served argument byte-identical, no existing lane case changed outcome. Earned: 4 en_verb_* bands x 720 arena wrong=0 (first seal), ledger resealed at 21 bands; corpus soundness asserted against the independent truth-table oracle over each template's intended lowering (15,120 cases, INV-25). Lane: v2_verb 28 hand-authored real cases 28/28 first run; full lane 134/134 wrong=0 across five splits. Surgical single-line pin update + CLAIMS regen. Stacked on feat/generalization-phase0 (merge that first — shared verify_lane_shas.py / CLAIMS.md / generate_claims.py lane-ADR mapping). [Verification]: verb reader tests 34/34; deduction battery 86/86 (surface +5, e2e +1, lane +1) in-worktree; arena seal + oracle cross-check green; smoke + warmed_session via pre-push gate.
4.3 KiB
Band v5-VP — verb-predicate arguments, decided (ADR-0260)
Date: 2026-07-24 · Branch: feat/verb-predicate-band (stacked on
feat/generalization-phase0) · Arc: generalization
(docs/plans/generalization-arc-2026-07-24.md, Phase 1.1 — Tier F)
What CORE can now do
> All philosophers teach. Socrates is a philosopher. Therefore Socrates teaches.
Given: all philosophers teach; socrates is a philosopher.
Your premises entail: socrates teaches.
Verb sentences — the shape in which every non-logic subject states its
rules — now read and decide. The cascade's earlier bands each guard this
territory out (v2-EN refuses quantifier leads / is-a clauses / does not;
v3-MEM and v4-CM refuse copula-free sentences), so the tier is pure
widening on the fall-through path.
Mechanism (ADR-0260 §2)
v3-MEM's per-individual lowering, extended with a second atom family in ONE
shared space: membership atoms (individual, class-group) — minted by
v3-MEM's own parsers reused verbatim — plus verb atoms (individual,
verb-lemma-group, object-term). A verb universal instantiates at every
named individual as mem(i,C) -> [~]verb(i), so a copula-minted membership
fact discharges a verb rule. The ONE new semantic identification is 3sg
agreement: a closed verb relation (irregular table has/goes/does first, then
+s / +es-after-sibilant / y↔ies) links "teach"↔"teaches". The noun table is
deliberately NOT reused — it would misroute "lives" (noun: life; verb:
live). Everything the relation cannot relate stays distinct: under-linking
costs coverage, never soundness.
Segmentation is scope-tight: single-token name/class/verb/object shapes
only (<name> <verb> [<obj>], does not, sentential-not, all|every|each| no [the] <class> <verb> [<obj>]); anything longer refuses typed — without a
lexicon there is no sound split of an arbitrary copula-free run.
Earned licenses
Four new bands — en_verb_universal, en_verb_chain, en_verb_negative,
en_verb_fact — each 720/720 committed, wrong=0, first seal run; ledger
resealed at 21 bands (12,240 + 2,880 committed). The synthetic verb pool
exercises every rule of the closed agreement relation, so the license
certifies the linking itself. Corpus soundness asserted case-by-case against
the independent truth-table oracle over each template's INTENDED lowering
(no reader in the loop, INV-25) before sealing.
Lane: evals/deduction_serve/v2_verb — 28 hand-authored real-English cases
(11 entailed / 4 refuted / 5 unknown / 8 declined), 28/28 first run; full
lane now 134/134 wrong=0 across five splits. Gates: verb reader tests 34,
deduction battery 86, smoke + warmed_session via pre-push.
Wrinkles worth surfacing
- Adverb-as-object misreading (disclosed, not fixed): "Lena runs quickly" parses as verb+object ("quickly" an opaque term). Never unsound — worst case an over-scoped UNKNOWN — but it is a real misreading the 3-token shape cannot detect without a lexicon. ADR-0260 §5.2 documents it; the vocab-boundary instrument (plan Phase 3.1) is where a principled fix would come from.
- Arity subsumption stays UNKNOWN: "teaches" ⊬ "teaches logic" and conversely — the face-value posture v2-EN already takes, now visible on verbs. A human reads the intransitive as subsuming; the scoped UNKNOWN phrasing carries the honesty.
- Plural verb-fact subjects read as individuals: "dogs bark" is an individual named "dogs" in this fragment (no copula ⇒ no plural signal in the closed grammar). The membership analogue stays refused by v3-MEM's bare-plural guard.
doesn'tis not expanded by the shared tokenizer's contraction table (only isn't/aren't/wasn't/weren't are) — so "The engine doesn't start" still refuses via then'tguard, preserving the e2e out-of-regime test byte-for-byte. Adding verb contractions is a deliberate non-goal until the tense scope-out is faced whole.
Stacking note
This branch stacks on feat/generalization-phase0 (merge that PR first):
both touch scripts/verify_lane_shas.py / CLAIMS.md, and the claims
generator's _LANE_ADR fix lands there.
Next (per the plan's tier assignment)
Tier O (Opus): Band v6-EX existential witnesses (Phase 1.2), then the Phase-2 physics lane against the §4 curriculum-entailment contract — for which this band was the gate.