core/scripts
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
..
benchmarks feat(evals): implement safe metadata and fail-closed evaluator check for GSM1K 2026-06-23 07:52:32 -07:00
ci ci(local): one-command local-first runner; fix a lane roster red on main 2026-07-25 12:51:17 +00:00
hooks feat(provenance,teaching): close the lateral gaps the assessment actually found 2026-07-25 04:51:15 +00:00
ops feat(telemetry): discovery-yield-per-served-turn baseline (ADR-0255) 2026-07-23 07:27:00 -07:00
probes chore: Refactor CLI and Governance Anchors (#926) 2026-07-03 12:34:56 -07:00
__init__.py
agent_startup.sh chore(dev): enforce fresh-base startup guard for CORE agents (#849) 2026-06-20 20:11:09 -07:00
build_refusal_taxonomy_cases.py
calibrate_ratification_threshold.py
dump-api-schemas.py
dump-enums.py feat(workbench): CORE-Logos Studio LG-2 — /logos route shell + Overview/Identity/Safety 2026-06-14 12:12:47 -07:00
dump-schemas.py
generate_claims.py feat(generalization): curriculum-grounded serving — exams answered from ratified curriculum (ADR-0262) 2026-07-24 14:38:08 -07:00
generate_discourse_paragraph.py
generate_en_numerics_v1.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
generate_english_fluency_ood.py
generate_grammatical_v2.py
generate_gsm8k_public_corpus.py feat(evals): Author 200-case GSM8K math evaluation corpus and verification script 2026-07-04 16:03:51 -07:00
generate_identity_curriculum.py
generate_identity_test_cases.py
generate_monotonic_cases.py
generate_phase5_domain_lanes.py
generate_phase5_language_lanes.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
gsm8k_experience_flywheel.py feat(gsm8k): add bounded experience flywheel for sealed practice 2026-06-17 21:05:02 -07:00
gsm8k_frontier_report.py feat(derivation): Workstream A inc 2 — frontier report + rate_with_currency apply_rate injection (#797) 2026-06-17 06:38:45 -07:00
gsm8k_microscope.py
gsm8k_post_gate_a1_frontier_microscope.py feat(derivation): Gate A2a unit partition injection (#809) 2026-06-17 18:14:24 -07:00
gsm8k_problem_frame_adequacy.py feat(kernel): implement ProblemFrame proportional-change closure (PR slice 1) (#835) 2026-06-20 10:58:43 -07:00
gsm8k_sealed_attempt_scout.py feat(evals): add GSM8K sealed attempt scout (#812) 2026-06-17 19:55:13 -07:00
gsm8k_substrate_morphology.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
measure_grammar_seam.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
measure_trackb_inc2.py fix(trackb): pure-S1 extract refuse multi-clause overmatch (0361 wrong=0) 2026-07-19 20:04:27 -07:00
measure_trackb_s1_slice.py feat(trackb): S1 symbolic structure-mapping vertical slice (off-serving) 2026-07-19 19:01:23 -07:00
package_apple_uma_demo.py feat(bench): add Apple UMA demo package builder (#913) 2026-06-24 15:51:45 -07:00
publish_pack_measurements.py
ratify_anchor_lens_packs.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
ratify_ethics_pack.py
ratify_identity_packs.py
ratify_register_packs.py
ratify_rhetorical_style_packs.py
ratify_safety_pack.py chore: Refactor CLI and Governance Anchors (#926) 2026-07-03 12:34:56 -07:00
review_trace.py
run_examples.py
run_pulse.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
scaffold_phase5_domain_lanes.py
score_phase5_holdouts.py
seal_gsm8k_test.py
seal_holdouts.py
setup_codex_environment.sh chore(dev): restore tracked agent session launchers (#903) 2026-06-24 12:19:53 -07:00
start-codex-session.zsh chore(dev): restore tracked agent session launchers (#903) 2026-06-24 12:19:53 -07:00
start-grok-session.zsh chore(dev): restore tracked agent session launchers (#903) 2026-06-24 12:19:53 -07:00
test_ffi_layout.py refactor(kernel): implement Lane 1 VersorBinding and Geometric ContractAssessment 2026-07-03 21:05:25 -07:00
verify_definitional_closure.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
verify_lane_shas.py fix(ci): re-pin public_demo lane — real content drift, not the env flake (S2) 2026-07-24 16:58:05 -07:00
verify_semantic_equivalence.py
workbench fix(core): lock python and extend rust cga surface (#925) 2026-07-02 15:32:08 -07:00