core/generate
Shay df6332fcb5 refactor(generate): one owner per linguistic fact (Phase 2A)
Collapses the duplicated closed English tables into generate/lexicon.py.
Measured on main @ 0948f7cd: the same facts were encoded up to five times
across the reading and writing paths, each copy written independently as a
successive deduction band landed.

The 2A/2B split is decided empirically per #129 — make the change, run the
11 pinned lanes, let byte-identity rule. Result: 11/11 byte-identical, so
this entire unit is 2A and nothing spilled into the authorization-gated 2B.

Collapsed to one object:
  - connectives    3 identical copies (member, verb, cond_member)
  - predicate display  2 identical 26-entry copies (semantic_templates,
                       templates)
  - be-form inventory  5 copies, not the 2 §1.3 counted. The structural
                       test found realizer_guard._BE_AUX and
                       chat/runtime._BE_FORMS, which a COPULA-shaped grep
                       could never see.

Derived rather than duplicated, so they can no longer drift:
  - STRUCTURAL = CONNECTIVES | {therefore}
  - QUANTIFIER_TOKENS = QUANTIFIER_LEAD | QUANTIFIER_NON_LEAD
  - NEGATION_BEARING_WITH_NOT = NEGATION_BEARING | {not}
  - READER_IRREGULAR_SINGULARS = IRREGULAR_SINGULARS restricted to 8 keys

§1.3 re-measured while doing this, and it overstated the disease (plan
§1.9). Almost nothing contradicts:
  - the "3 divergent plural tables" are 1 pluralizer + 2 singularizers,
    i.e. inverse directions; comparing them as copies is a category error
  - reader's 8 singulars are a STRICT SUBSET of member's 29 with the
    difference in reader's favour empty, so its values are all correct and
    only its coverage is short
  - the "3 divergent quantifier sets" are 3 distinct facts; every/each lead
    a clause but take singular nouns, so their absence from
    PLURAL_QUANTIFIERS is correct
  - english's negation set is a subset of member's, and the difference is
    principled: v2-EN normalizes "<copula> not", v3-MEM refuses it

Exactly one genuine contradiction exists in the whole inventory:
discourse_planner maps is_defined_as -> "is" where the others map it to
"is defined as". Preserved as a register choice, pinned by test.

Found while reading, pinned as current behaviour for 2B to flip:
reader._singularize does NOT refuse uncovered plurals despite a comment
claiming it does — it falls through to a bare -s strip, so news -> new and
species -> specy, exactly the corruptions member.py's table comment says
its table exists to prevent.

Two 2A exit criteria were unmeasurable as written and are replaced:
  - "Jaccard -> 1.00" cannot work. measure_grammar_seam.py scans source
    literals, so unifying a fact removes it from those files and Jaccard
    FELL, 0.083 -> 0.023 — the success direction reported by a metric
    shaped to read like failure. Replaced with an object-identity count:
    3 distinct objects behind 8 names, from 8-behind-8. Value comparison
    cannot tell a shared object from two equal copies.
  - "one table per fact" presumed §1.3's inventory was right. The report now
    separates must-be-one-object (all UNIFIED) from related-but-distinct
    (6 relations, all HOLD).

ADR-0258 §5 already decided morphology's destination is a ratified pack,
triggered by a grc/he member band. No such band exists, so the promotion is
correctly deferred and lexicon.py is a staging area, not a rival home — no
new ADR. Destination measured for whoever picks it up: packs/en/morphology
.jsonl has 9 records and zero irregular plurals, features.number has no
consumer, and _pack_morph_roots_for reads a top-level "root" key that 0 of
31 records across all four packs define, so it returns {} every call.

[Verification]: in-worktree on CPython 3.12.13, uv sync --locked —
smoke 621 unchanged; deductive 383 (364 + 19 new);
scripts/verify_lane_shas.py 11/11 byte-identical.
2026-07-26 17:45:27 -07:00
..
answer_choices
binding_graph Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
combined_rate_comprehension
composition
comprehension Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
constraint_comprehension
contemplation feat: 3lang depth PropGraph unification - phase refinements, wiring, tests + session pickup cleanups/governance 2026-07-08 07:07:11 -07:00
cue_precision
derivation feat: retire fraction_decrease prose regex — bind dilation from frame scale 2026-07-08 20:09:49 -07:00
determine feat(provenance,teaching): close the lateral gaps the assessment actually found 2026-07-25 04:51:15 +00:00
frame_verdict feat(frame-verdict): closed-world FrameVerdict substrate — PR-1..4 + hardening (ADR-0222 B4) (#787) 2026-06-16 06:23:03 -07:00
linguistic_pipeline feat(cognition): fail-closed linguistic governance + trilingual constraint pipeline 2026-07-20 16:16:56 -07:00
meaning_graph refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
observed_he_morph_v0 feat(logos): bulk live morph authority on turn + teaching seams 2026-07-20 16:35:04 -07:00
proof_chain refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
rate_comprehension
realize
structure_mapping fix(trackb): pure-S1 extract refuse multi-clause overmatch (0361 wrong=0) 2026-07-19 20:04:27 -07:00
__init__.py
admissibility.py
articulation.py
articulation_legality.py
attention.py
bridge_trace.py chore: Refactor CLI and Governance Anchors (#926) 2026-07-03 12:34:56 -07:00
candidate_operator.py style(kernel): place quantity-entity builder before exports 2026-06-23 05:43:17 -07:00
compute_budget.py feat(kernel): implement diagnostic-only ComputeBudgetDecision 2026-06-22 13:13:49 -07:00
construction_affordances.py chore(kernel): tighten construction_affordances catalog invariants (#930) 2026-07-06 08:38:23 -07:00
contract_residuals.py feat(kernel): add ContractResidual projection 2026-06-22 08:06:32 -07:00
dialogue.py
discourse_planner.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
epistemic_basis.py feat(frame-verdict): closed-world FrameVerdict substrate — PR-1..4 + hardening (ADR-0222 B4) (#787) 2026-06-16 06:23:03 -07:00
exhaustion.py
field_incidence_reader.py work done towards furthering comprehension, contemplation, learning, and also began working on fixing some failing tests 2026-06-16 12:27:59 -07:00
foundational_families.py fix(kernel): align unary-delta implementation with conformance decision 2026-06-21 20:19:53 -07:00
geometric_search_run.py feat(kernel): implement inert GeometricSearchRun trace shell 2026-06-22 14:09:52 -07:00
graph_constraint.py
graph_planner.py refactor: consolidate duplicate depth extraction — graph_planner.get_node_depths now delegates to build_node_depths (single source) 2026-07-08 07:21:17 -07:00
grounding_accessors.py
intent.py feat(deduction-serve): Phase 1 — deduction turn spine (flag-gated, propositional Band v1) 2026-07-23 12:14:28 -07:00
intent_bridge.py
intent_ratifier.py fix(cognition): pre-stage land repairs after L2/PASSTHROUGH excision 2026-07-20 13:34:59 -07:00
kernel_facts.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
lexicon.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
logic_canonical.py
logic_equivalence.py
math_candidate_graph.py fix: fold Gemini CGA/fraction_decrease compatibility into deck PR 2026-07-08 20:00:51 -07:00
math_candidate_parser.py feat(reader-arc): #78 positive-polarity allowlist substrate (seed + comparison) — foundations, band-solve=0 2026-07-18 21:18:02 -07:00
math_completeness.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
math_parser.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
math_problem_graph.py feat(derivation): Gate A2b case 0002 fractional rest composition (#810) 2026-06-17 19:08:24 -07:00
math_realizer.py feat(derivation): Gate A2b case 0002 fractional rest composition (#810) 2026-06-17 19:08:24 -07:00
math_roundtrip.py feat(reader-arc): #78 positive-polarity allowlist substrate (seed + comparison) — foundations, band-solve=0 2026-07-18 21:18:02 -07:00
math_solver.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
math_symbolic_equivalence.py
math_symbolic_normalizer.py
math_verifier.py feat(derivation): Gate A2b case 0002 fractional rest composition (#810) 2026-06-17 19:08:24 -07:00
morphology.py
ood_surface_generator.py
operators.py
perturbation_suite.py
problem_frame.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
problem_frame_bound_relations.py refactor(kernel): split ProblemFrame builder phases (#919) 2026-06-25 16:16:04 -07:00
problem_frame_builder.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
problem_frame_contracts.py fix(a2k): share fraction-decrease scale domain on geometric admission 2026-07-20 04:40:35 +00:00
problem_frame_extractors.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
problem_frame_mentions.py refactor(kernel): split ProblemFrame builder phases (#919) 2026-06-25 16:16:04 -07:00
problem_frame_proposals.py refactor(kernel): split ProblemFrame builder phases (#919) 2026-06-25 16:16:04 -07:00
process_frames.py feat: implement kernel substrate tranche 1 base-layer foundations (#829) 2026-06-18 18:46:20 -07:00
proposition.py
quantitative_comprehension.py
quantitative_expr.py
realizer.py feat: integrate 3-core-language depth into PropositionGraph spine for bidirectional unification 2026-07-06 09:01:43 -07:00
realizer_guard.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
recognizer_anchor_inject.py feat(derivation): Gate A2a unit partition injection (#809) 2026-06-17 18:14:24 -07:00
recognizer_match.py fix(reader-arc): compound extractor refuses no-digit compare clauses (wrong=0 hazard) 2026-07-18 21:44:34 -07:00
recognizer_registry.py
relational_field_reader.py
relational_operator_ablation.py feat(generate): deterministic relational operator ablation runners 2026-07-19 21:00:15 -07:00
relational_symbolic_reader.py
replay_adapter.py feat(kernel): add quantity-entity replay target shell 2026-06-23 06:13:28 -07:00
result.py
rotor_admissibility.py
run_attempt_binding.py feat(kernel): implement run-attempt binding shell 2026-06-22 23:12:16 -07:00
salience.py
sealed_practice_trace.py fix(kernel): fail-closed bound trace structural validation 2026-06-23 00:11:14 -07:00
search_gate.py feat(kernel): implement diagnostic-only SearchGateDecision 2026-06-22 11:36:05 -07:00
semantic_templates.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
stream.py fix(tests): clear pre-existing full-suite reds (INV-21 pins + rotor_power) 2026-07-15 15:39:09 -07:00
surface.py
templates.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00