From 98d4106d0802776b01a102379755ac33fa29006e Mon Sep 17 00:00:00 2001 From: Daniel Meyer Date: Thu, 24 Sep 2026 12:01:04 -0700 Subject: [PATCH 1/3] feat(007): Hyperlexical card rename for seed-morph78 --- CHANGELOG.md | 5 +++++ NEXT_MOVES_007.md | 3 ++- README.md | 2 +- ROADMAP.md | 1 + STATUS.md | 4 ++-- docs/NAMING.md | 2 +- 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c26f2c3f..91810e1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +- **Card rename (Spec 007):** Hub card `hyperlex-structure-149m` for `seed-morph78`. + `name_gate.py` pins the approved checkpoint; `eval_unbind` sets `name_gate` + true only for a trunk-forward eval of that pin; eval schema field is boolean. + Training contract and HF dump writer unchanged (new checkpoints stay unnamed). + - **`name_gate` yes (`seed-morph78`):** Danny `flip name_gate` — pin may be called **Hyperlexical** (amendment A6; receipt `specs/007-hyperlexical-model/receipts/20260924-name-gate-yes-morph78.md`). Card IDs, packet/schema field, Hub, and T13 unchanged. diff --git a/NEXT_MOVES_007.md b/NEXT_MOVES_007.md index f945db0f..d0f4ab7f 100644 --- a/NEXT_MOVES_007.md +++ b/NEXT_MOVES_007.md @@ -6,6 +6,7 @@ - morph78 named phrases settled · force/hard **236/277** · soft_ceiling train complete. - **PROMOTE_BEST** (ceiling_escape): broad **0.9883** > PRIOR morph65 **0.8867** n=256 + E2 PASS. +- Card rename: Hub card `hyperlex-structure-149m`; eval packets set `name_gate` true only for a trunk-forward eval of `seed-morph78`. - Danny **`flip name_gate`** → `seed-morph78` may be called **Hyperlexical** (receipt `specs/007-hyperlexical-model/receipts/20260924-name-gate-yes-morph78.md`). ## Gate @@ -14,7 +15,7 @@ soft_ceiling **spent** for this climb (morph78 now PRIOR/BEST). Further climbs n ## Next (each a separate operator sentence) -1. Card rename: `hyperlex-encoder-*` identifiers → Hyperlexical / `hyperlex-structure-149m` (C31) and packet/schema `name_gate` field. +1. Real `seed-morph78` inference path (trunk-forward infer emitting the inference packet) — in progress. 2. Hub upload — still not authorized. 3. Optional T13 (promote `scripts/shadow/hyperlexical/` into `src/hyperlex/`). 4. HOLD morph78; no new climb without a new card. diff --git a/README.md b/README.md index 9b5c4c32..ad5cf8fe 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Repo **Hyperlex** is the transitional monorepo shell. Do not use bare public **H | **ne0l0gist** | Slang ingest tool (zeros spelling): Crawl4AI harvest, `ingest_tap`, export/settle — **operator-named 2026-09-24** | | **Hyperlex** (repo) | Transitional monorepo shell. GitHub repo name, `~/.hyperlex` paths, `HYPERLEX_*` env vars, and the `hyperlexical` Python package stay as-is | -`name_gate` **true** for `seed-morph78` (Danny `flip name_gate`, 2026-09-24, amendment A6). Naming **ne0l0gist** was a separate sentence and did not flip it. Card/package IDs stay `hyperlex-encoder-*`; Hub and T13 not authorized. +`name_gate` **true** for `seed-morph78` (Danny `flip name_gate`, 2026-09-24, amendment A6). Naming **ne0l0gist** was a separate sentence and did not flip it. Hub card `hyperlex-structure-149m`; Hub and T13 not authorized. ## What ships / what does not diff --git a/ROADMAP.md b/ROADMAP.md index febdb446..e998d4fe 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -102,6 +102,7 @@ The skill remains the operator surface while the encoder stays SHADOW. See [SPEC.md](SPEC.md) and [DESIGN.md](DESIGN.md) for the historical spine. Current operator snapshot: [STATUS.md](STATUS.md). ## Recent +- 2026-09-24: Card rename — Hub card `hyperlex-structure-149m`; eval packets set `name_gate` true only for trunk-forward eval of `seed-morph78`. - 2026-09-24: Danny `flip name_gate` — `seed-morph78` named **Hyperlexical** (amendment A6). Card rename, Hub, T13 still separate. - 2026-09-24: morph78 PROMOTE_BEST (soft_ceiling ceiling_escape; broad 0.9883 > 0.8867 n=256 + E2) after named-phrase settle. `name_gate` still false. - 2026-09-24: Hygiene — `pyproject.toml` aligned to `VERSION` 0.4.0; ROADMAP E2 line matches trained PASS; name_gate / named-phrases plan drafted. `#100` + `#99` on main. soft_ceiling ARMED; morph65 held. diff --git a/STATUS.md b/STATUS.md index 4d59fd1f..b4c90a8a 100644 --- a/STATUS.md +++ b/STATUS.md @@ -4,7 +4,7 @@ **Version:** 0.4.0 **Observed:** 2026-09-24 -**Posture:** Hermes skill = current operator surface. Spec 007 = model path (SHADOW). Spark BEST = `seed-morph78` (soft_ceiling PROMOTE_BEST 2026-09-24; broad **0.9883** n=256). Ingest product named **ne0l0gist** (as in repo). Naming lock: `docs/NAMING.md` + Notion Naming lock. **#101** merged to main. Org naming graft **#14** merged. morph78 settled `have fun staying poor` + `fr fr no cap`; force **236**/hard **277**. `name_gate` **true** for `seed-morph78` (Danny `flip name_gate`, 2026-09-24, amendment A6). Card/package IDs stay `hyperlex-encoder-*`; Hub and T13 not authorized. +**Posture:** Hermes skill = current operator surface. Spec 007 = model path (SHADOW). Spark BEST = `seed-morph78` (soft_ceiling PROMOTE_BEST 2026-09-24; broad **0.9883** n=256). Ingest product named **ne0l0gist** (as in repo). Naming lock: `docs/NAMING.md` + Notion Naming lock. **#101** merged to main. Org naming graft **#14** merged. morph78 settled `have fun staying poor` + `fr fr no cap`; force **236**/hard **277**. `name_gate` **true** for `seed-morph78` (Danny `flip name_gate`, 2026-09-24, amendment A6). Hub card `hyperlex-structure-149m`; Hub and T13 not authorized. **Install:** `bash install.sh` → `~/.hermes/skills/hyperlex` **Claude (optional):** `bash install.sh --claude` → `~/.claude/skills/hyperlex` **Track:** Phases 0–4 complete · Phase 5.0–5.3 · Pages static run history · Spec 007 SHADOW encoder on main @@ -54,7 +54,7 @@ Danny ~2500 candidate bar: **met**. Hermes **913** / “gap to 2500” is **supe | Spark BEST | **`seed-morph78`** — PROMOTE_BEST via soft_ceiling ceiling_escape: broad OBSERVED **0.9883** > morph65 **0.8867** n=256; E2 PASS; force fair 1.0 n=164 (advisory). LAST=8. Upsample freeze **11+**. | | E2 vs Spec 004 | Stub still FAIL (expected). **Trained trunk-forward E2 PASS** on morph19 (`unbind_exact=1.0`). Seed smoke ≠ T1. | | Hub publish | **No** — skeleton in-repo; weights stay on Spark. | -| T1 name | **Hyperlexical** approved for `seed-morph78`. Card/package IDs still `hyperlex-encoder-*` until a separate card-rename change. | +| T1 name | **Hyperlexical** approved for `seed-morph78`. Hub card `hyperlex-structure-149m` (C31). Local train-out paths keep `hyperlex-encoder-modernbert-base-seed-*`. | | Lineage families | **8** only. No ninth family. | | Brier | `null` on every 007 packet. | | Crawl | Crawl4AI **0.9.3** default. `--source firecrawl` aliases to `crawl4ai`. No paid Firecrawl without Danny yes. | diff --git a/docs/NAMING.md b/docs/NAMING.md index 5962ca49..4d214971 100644 --- a/docs/NAMING.md +++ b/docs/NAMING.md @@ -14,7 +14,7 @@ This file is the **durable naming SoT** for agents and operators. Copy it; do no | **ne0l0gist** | `ne` + `0` + `l` + `0` + `gist` (zeros, not letter O) | Public **slang ingest / harvest** product: Crawl4AI, `ingest_tap`, export/settle, civilian + live phrase harvest | **yes** (2026-09-24) | | **Hyperlexical** | Hyperlexical | Spec 007 **model / train / eval / E2 / `name_gate`** product claim | **yes** (2026-09-24) — pin `seed-morph78` only | -`name_gate` is **true** for `seed-morph78` (amendment A6). Naming **ne0l0gist** was a separate sentence. Neither authorizes Hub, T13, or renaming card/package identifiers (`hyperlex-encoder-*`). +`name_gate` is **true** for `seed-morph78` (amendment A6). Naming **ne0l0gist** was a separate sentence. Neither authorizes Hub or T13. Hub card name: `hyperlex-structure-149m`. Local paths / `HYPERLEX_*` / package names are unchanged (no hard-cut). ## Do not From e2de4d9f99ab1f43510487f8a75bb8ba5459c4eb Mon Sep 17 00:00:00 2001 From: Daniel Meyer Date: Thu, 24 Sep 2026 12:04:29 -0700 Subject: [PATCH 2/3] feat(007): Hyperlexical card rename for seed-morph78 --- docs/ROADMAP.md | 1 + docs/shadow-hyperlexical.md | 2 +- docs/start/glossary.md | 4 +- docs/status.md | 4 +- scripts/shadow/hyperlexical/name_gate.py | 32 ++++++++ specs/007-hyperlexical-model/status.md | 2 +- tests/shadow/test_hyperlexical_name_gate.py | 83 +++++++++++++++++++++ 7 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 scripts/shadow/hyperlexical/name_gate.py create mode 100644 tests/shadow/test_hyperlexical_name_gate.py diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index febdb446..e998d4fe 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -102,6 +102,7 @@ The skill remains the operator surface while the encoder stays SHADOW. See [SPEC.md](SPEC.md) and [DESIGN.md](DESIGN.md) for the historical spine. Current operator snapshot: [STATUS.md](STATUS.md). ## Recent +- 2026-09-24: Card rename — Hub card `hyperlex-structure-149m`; eval packets set `name_gate` true only for trunk-forward eval of `seed-morph78`. - 2026-09-24: Danny `flip name_gate` — `seed-morph78` named **Hyperlexical** (amendment A6). Card rename, Hub, T13 still separate. - 2026-09-24: morph78 PROMOTE_BEST (soft_ceiling ceiling_escape; broad 0.9883 > 0.8867 n=256 + E2) after named-phrase settle. `name_gate` still false. - 2026-09-24: Hygiene — `pyproject.toml` aligned to `VERSION` 0.4.0; ROADMAP E2 line matches trained PASS; name_gate / named-phrases plan drafted. `#100` + `#99` on main. soft_ceiling ARMED; morph65 held. diff --git a/docs/shadow-hyperlexical.md b/docs/shadow-hyperlexical.md index 77a60a17..63844061 100644 --- a/docs/shadow-hyperlexical.md +++ b/docs/shadow-hyperlexical.md @@ -14,7 +14,7 @@ Specify is locked C1–C52 plus A5 milestones. Implement on `main` is the stub, |------|---------|--------------|-------------| | Skill | Hermes CLI + package | Hyperlex (the skill) | Shipping v0.4.0 | | T0 | Base encoder + classify heads | `hyperlex-encoder-*` only | Specified. Not Hyperlexical. | -| T1 | Encoder + unbind heads; E2 vs Spec 004 | `hyperlex-structure-*` / Hyperlexical | **Earned** by `seed-morph78`: trained E2 PASS + `name_gate` yes (2026-09-24). Card rename pending. | +| T1 | Encoder + unbind heads; E2 vs Spec 004 | `hyperlex-structure-*` / Hyperlexical | **Earned** by `seed-morph78`: trained E2 PASS + `name_gate` yes (2026-09-24). Card `hyperlex-structure-149m`. | | T2 | Separate generative LoRA | out of this cycle | Not an implement target | `name_gate` is **true** for `seed-morph78` (Danny yes). E2 PASS alone ≠ name. Classify volume ready ≠ T1. diff --git a/docs/start/glossary.md b/docs/start/glossary.md index 16b597ac..cbb5a3f3 100644 --- a/docs/start/glossary.md +++ b/docs/start/glossary.md @@ -95,8 +95,8 @@ fails. ### Hyperlexical (name) Public **model** product claim for Spec 007 (train / eval / E2 / `name_gate`). -Approved for pin `seed-morph78` (Danny `name_gate` yes, 2026-09-24). Card/package IDs -are still `hyperlex-encoder-*` until a separate rename. Do not call a stub, harvest dump, +Approved for pin `seed-morph78` (Danny `name_gate` yes, 2026-09-24). Hub card name +is `hyperlex-structure-149m`. Do not call a stub, harvest dump, or seed smoke Hyperlexical-gated-true. Harvest / ingest is **ne0l0gist**. ### name_gate diff --git a/docs/status.md b/docs/status.md index fec51b87..07e09c9b 100644 --- a/docs/status.md +++ b/docs/status.md @@ -4,7 +4,7 @@ **Version:** 0.4.0 **Observed:** 2026-09-24 -**Posture:** Hermes skill = current operator surface. Spec 007 = model path (SHADOW). Spark BEST = `seed-morph78` (soft_ceiling PROMOTE_BEST 2026-09-24; broad **0.9883** n=256). Ingest product named **ne0l0gist** (as in repo). Naming lock: `docs/NAMING.md` + Notion Naming lock. **#101** merged to main. Org naming graft **#14** merged. morph78 settled `have fun staying poor` + `fr fr no cap`; force **236**/hard **277**. `name_gate` **true** for `seed-morph78` (Danny `flip name_gate`, 2026-09-24, amendment A6). Card/package IDs stay `hyperlex-encoder-*`; Hub and T13 not authorized. +**Posture:** Hermes skill = current operator surface. Spec 007 = model path (SHADOW). Spark BEST = `seed-morph78` (soft_ceiling PROMOTE_BEST 2026-09-24; broad **0.9883** n=256). Ingest product named **ne0l0gist** (as in repo). Naming lock: `docs/NAMING.md` + Notion Naming lock. **#101** merged to main. Org naming graft **#14** merged. morph78 settled `have fun staying poor` + `fr fr no cap`; force **236**/hard **277**. `name_gate` **true** for `seed-morph78` (Danny `flip name_gate`, 2026-09-24, amendment A6). Hub card `hyperlex-structure-149m`; Hub and T13 not authorized. **Install:** `bash install.sh` → `~/.hermes/skills/hyperlex` **Claude (optional):** `bash install.sh --claude` → `~/.claude/skills/hyperlex` **Track:** Phases 0–4 complete · Phase 5.0–5.3 · Pages static run history · Spec 007 SHADOW encoder on main @@ -54,7 +54,7 @@ Danny ~2500 candidate bar: **met**. Hermes **913** / “gap to 2500” is **supe | Spark BEST | **`seed-morph78`** — PROMOTE_BEST via soft_ceiling ceiling_escape: broad OBSERVED **0.9883** > morph65 **0.8867** n=256; E2 PASS; force fair 1.0 n=164 (advisory). LAST=8. Upsample freeze **11+**. | | E2 vs Spec 004 | Stub still FAIL (expected). **Trained trunk-forward E2 PASS** on morph19 (`unbind_exact=1.0`). Seed smoke ≠ T1. | | Hub publish | **No** — skeleton in-repo; weights stay on Spark. | -| T1 name | **Hyperlexical** approved for `seed-morph78`. Card/package IDs still `hyperlex-encoder-*` until a separate card-rename change. | +| T1 name | **Hyperlexical** approved for `seed-morph78`. Hub card `hyperlex-structure-149m` (C31). Local train-out paths keep `hyperlex-encoder-modernbert-base-seed-*`. | | Lineage families | **8** only. No ninth family. | | Brier | `null` on every 007 packet. | | Crawl | Crawl4AI **0.9.3** default. `--source firecrawl` aliases to `crawl4ai`. No paid Firecrawl without Danny yes. | diff --git a/scripts/shadow/hyperlexical/name_gate.py b/scripts/shadow/hyperlexical/name_gate.py new file mode 100644 index 00000000..f1e25143 --- /dev/null +++ b/scripts/shadow/hyperlexical/name_gate.py @@ -0,0 +1,32 @@ +"""Which checkpoints may carry the Hyperlexical name. No torch. No network. + +The product-level gate is Danny's sentence, recorded as Spec 007 amendment A6. +Only pins listed here are named; every other checkpoint stays ``name_gate=false``. +Identity is the resolved model directory, so a moved ``BEST`` symlink never +names a different checkpoint. +""" + +from __future__ import annotations + +import os +from pathlib import Path + +from .layout import MODEL_ID_SEED + +PUBLIC_CARD_NAME = "hyperlex-structure-149m" +APPROVED_PINS = {"seed-morph78": "A6"} + + +def pin_of(model_dir: str | os.PathLike | None) -> str | None: + """Return ``seed-`` for a train-out dir, resolving symlinks, else None.""" + if not model_dir: + return None + name = Path(os.path.realpath(model_dir)).name + prefix = MODEL_ID_SEED + "-" + if not name.startswith(prefix): + return None + return "seed-" + name[len(prefix):] + + +def name_gate_for(model_dir: str | os.PathLike | None) -> bool: + return pin_of(model_dir) in APPROVED_PINS diff --git a/specs/007-hyperlexical-model/status.md b/specs/007-hyperlexical-model/status.md index ae72bc94..164815d1 100644 --- a/specs/007-hyperlexical-model/status.md +++ b/specs/007-hyperlexical-model/status.md @@ -29,7 +29,7 @@ Operator scoreboard (Danny-locked harvest snapshot **2026-09-10**; climb pin **2 Next operator sentences that do work: - Default: **HOLD** `seed-morph78`; operator product review of `HYPERLEXICAL-PRODUCT-PLAN.md` -- Card rename decision; Hub decision; optional T13 decision (each separate). `name_gate` done. +- Real inference path; Hub decision; optional T13 decision (each separate). `name_gate` + card rename done. - A new climb only on a new named-phrase acquire card vs morph78 PRIOR — see `NAME-GATE-AND-NAMED-PHRASES.md` - `open 006 IsA` — separate spec diff --git a/tests/shadow/test_hyperlexical_name_gate.py b/tests/shadow/test_hyperlexical_name_gate.py new file mode 100644 index 00000000..c4776a49 --- /dev/null +++ b/tests/shadow/test_hyperlexical_name_gate.py @@ -0,0 +1,83 @@ +import json +import os +import pathlib +import sys + +import pytest + +ROOT = pathlib.Path(__file__).resolve().parents[2] +sys.path.insert(0, str(ROOT / "scripts" / "shadow")) + +from hyperlexical.eval_unbind import run_eval +from hyperlexical.layout import MODEL_ID_SEED +from hyperlexical.name_gate import APPROVED_PINS, PUBLIC_CARD_NAME, name_gate_for, pin_of + +SCHEMA = ROOT / "specs" / "007-hyperlexical-model" / "schemas" / "eval_unbind.v0.1.schema.json" +CARD_CONFIG = ROOT / "specs" / "007-hyperlexical-model" / "hf-package" / "config.json" + + +def test_only_morph78_is_approved(): + assert set(APPROVED_PINS) == {"seed-morph78"} + + +def test_pin_of_train_out_dirs(tmp_path): + assert pin_of(tmp_path / f"{MODEL_ID_SEED}-morph78") == "seed-morph78" + assert pin_of(tmp_path / f"{MODEL_ID_SEED}-morph65") == "seed-morph65" + assert pin_of(tmp_path / "some-other-model") is None + assert pin_of(None) is None + assert pin_of("") is None + + +def test_name_gate_true_only_for_approved_pin(tmp_path): + assert name_gate_for(tmp_path / f"{MODEL_ID_SEED}-morph78") is True + for morph in ("morph65", "morph79", "live", "morph78-copy"): + assert name_gate_for(tmp_path / f"{MODEL_ID_SEED}-{morph}") is False + assert name_gate_for(None) is False + + +def test_best_symlink_resolves_to_target(tmp_path): + named = tmp_path / f"{MODEL_ID_SEED}-morph78" + other = tmp_path / f"{MODEL_ID_SEED}-morph79" + named.mkdir() + other.mkdir() + best = tmp_path / "BEST" + best.symlink_to(named) + assert name_gate_for(best) is True + best.unlink() + best.symlink_to(other) + assert name_gate_for(best) is False + + +def test_digest_eval_of_pin_dir_is_not_named(tmp_path, monkeypatch): + monkeypatch.delenv("HYPERLEX_E2_TRUNK_FORWARD", raising=False) + pin = tmp_path / f"{MODEL_ID_SEED}-morph78" + pin.mkdir() + (pin / "heads.json").write_text( + json.dumps({"model_id": MODEL_ID_SEED, "weight_digest": "fixture"}) + "\n", + encoding="utf-8", + ) + report = run_eval(model_dir=pin) + assert report.get("trunk_forward") in (None, False) + assert report.get("name_gate", False) is False + + +def test_eval_schema_allows_boolean_name_gate(): + schema = json.loads(SCHEMA.read_text(encoding="utf-8")) + assert schema["properties"]["name_gate"] == {"type": "boolean"} + assert schema["properties"]["brier"] == {"type": "null"} + assert schema["properties"]["forecast_eligible"] == {"const": False} + + +def test_card_config_matches_pin(): + cfg = json.loads(CARD_CONFIG.read_text(encoding="utf-8")) + assert cfg["model_id"] == PUBLIC_CARD_NAME + assert cfg["name_gate"] is True + assert cfg["e2_pass"] is True + assert cfg["brier"] is None + assert cfg["last_trainable"] == 8 + + +def test_name_gate_module_is_torch_free(): + src = (ROOT / "scripts" / "shadow" / "hyperlexical" / "name_gate.py").read_text(encoding="utf-8") + assert "import torch" not in src + assert "transformers" not in src From a33ed38b51f28adfafb77299b960abeff580e4fa Mon Sep 17 00:00:00 2001 From: Daniel Meyer Date: Thu, 24 Sep 2026 12:07:19 -0700 Subject: [PATCH 3/3] feat(007): Hyperlexical card rename for seed-morph78 --- scripts/shadow/hyperlexical/eval_unbind.py | 8 +++++--- .../HYPERLEXICAL-PRODUCT-PLAN.md | 10 ++++++---- .../NAME-GATE-AND-NAMED-PHRASES.md | 2 +- specs/007-hyperlexical-model/NEXT_MOVES_007.md | 3 ++- specs/007-hyperlexical-model/hf-package/README.md | 7 ++++--- specs/007-hyperlexical-model/hf-package/config.json | 13 ++++++++----- specs/007-hyperlexical-model/model-card.draft.md | 2 +- .../schemas/eval_unbind.v0.1.schema.json | 2 +- 8 files changed, 28 insertions(+), 19 deletions(-) diff --git a/scripts/shadow/hyperlexical/eval_unbind.py b/scripts/shadow/hyperlexical/eval_unbind.py index 518c78fa..ac2cdc71 100644 --- a/scripts/shadow/hyperlexical/eval_unbind.py +++ b/scripts/shadow/hyperlexical/eval_unbind.py @@ -2,7 +2,8 @@ Stub/digest swap has no civilian filler lists, so unbind_token_f1 / unbind_slot_f1 stay null. Trunk-forward scores the same aligned filler -lists as train val and fills those fields. name_gate stays false. +lists as train val and fills those fields. name_gate is true only for a +trunk-forward eval of an approved pin (``name_gate.APPROVED_PINS``, A6). """ from __future__ import annotations @@ -15,6 +16,7 @@ import sys from pathlib import Path +from .name_gate import name_gate_for from .unbind_metrics import null_unbind_secondary HEAD_NAMES = ("heads.json", "model.safetensors", "heads.pt") @@ -294,14 +296,14 @@ def run_eval(model_dir: str | Path | None = None, trunk_forward: bool = False) - "trunk_forward": True, "trunk_dir": str(trunk), "model_dir": str(directory), - "name_gate": False, + "name_gate": name_gate_for(directory), "device": scored.get("device"), "encoder_trainable_loaded": scored.get("encoder_trainable_loaded", 0), "encoder_trainable_present": scored.get("encoder_trainable_present", 0), "note": ( f"Trunk-forward unbind_exact + token/slot F1 from {weight} vs 004 " "probe_swap_min. Stub/digest leaves F1 null (no civilian filler " - "lists). name_gate stays false. " + "lists). name_gate is true only for an approved pin (A6). " + scored.get( "encoder_note", "Encoder is the local trunk snapshot; heads from train out.", diff --git a/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md b/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md index e3f59688..5cbb1ecd 100644 --- a/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md +++ b/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md @@ -53,7 +53,7 @@ Hyperlexical is complete for this product cycle when: 5. any Hub upload is separately authorized; 6. any T13 promotion is separately authorized and tested. -Item 4 is done. Card/package identifiers stay `hyperlex-encoder-*` until a separate rename change. +Item 4 is done. Hub card name is `hyperlex-structure-149m`; local train-out paths keep `hyperlex-encoder-modernbert-base-seed-*`. ## Workstreams @@ -79,7 +79,8 @@ Item 4 is done. Card/package identifiers stay `hyperlex-encoder-*` until a separ - [ ] operator reviews this reconciled plan - [x] Danny explicit `flip name_gate` (2026-09-24) -- [ ] card/package identifier rename (`hyperlex-encoder-*` → C31 `hyperlex-structure-149m` / Hyperlexical) + packet/schema `name_gate` field +- [x] card rename → `hyperlex-structure-149m` + eval packet `name_gate` true only for trunk-forward eval of `seed-morph78` +- [ ] real `seed-morph78` inference path (trunk-forward infer → inference packet) - [ ] finalize public model card from pinned receipts - [ ] separately authorize Hub upload, or explicitly close the cycle with no Hub - [ ] optional T13 in a separate PR with tests @@ -96,7 +97,7 @@ Q1 status is not a substitute for Spec 007 product completion, and Spec 007 prog ## Default recommendation -**HOLD morph78.** NAME is done. Resolve card rename and PUBLISH before authorizing another training climb. +**HOLD morph78.** NAME is done. Resolve the inference path and PUBLISH before authorizing another training climb. ## Explicit non-goals @@ -117,7 +118,8 @@ Q1 status is not a substitute for Spec 007 product completion, and Spec 007 prog - [x] Notion Operator Hub parity - [ ] operator product review - [x] Danny `name_gate` decision — yes for `seed-morph78` -- [ ] card-rename decision +- [x] card rename +- [ ] real inference path - [ ] Hub decision: upload authorized, or explicit no-Hub this cycle - [ ] optional T13 decision diff --git a/specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md b/specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md index cb008337..561fee9e 100644 --- a/specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md +++ b/specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md @@ -72,7 +72,7 @@ Receipt: `receipts/20260924-name-gate-yes-morph78.md`. No agent flipped it witho Actions stay separate: 1. change governed `name_gate` surfaces — **done** (A6); -2. update public card naming (`hyperlex-encoder-*` → Hyperlexical per `model-card.draft.md`); +2. update public card naming → `hyperlex-structure-149m` — **done** (card + eval packet field); 3. Hub upload only on a separate named operator action; 4. optional T13 only on separate authorization + tests. diff --git a/specs/007-hyperlexical-model/NEXT_MOVES_007.md b/specs/007-hyperlexical-model/NEXT_MOVES_007.md index f945db0f..d0f4ab7f 100644 --- a/specs/007-hyperlexical-model/NEXT_MOVES_007.md +++ b/specs/007-hyperlexical-model/NEXT_MOVES_007.md @@ -6,6 +6,7 @@ - morph78 named phrases settled · force/hard **236/277** · soft_ceiling train complete. - **PROMOTE_BEST** (ceiling_escape): broad **0.9883** > PRIOR morph65 **0.8867** n=256 + E2 PASS. +- Card rename: Hub card `hyperlex-structure-149m`; eval packets set `name_gate` true only for a trunk-forward eval of `seed-morph78`. - Danny **`flip name_gate`** → `seed-morph78` may be called **Hyperlexical** (receipt `specs/007-hyperlexical-model/receipts/20260924-name-gate-yes-morph78.md`). ## Gate @@ -14,7 +15,7 @@ soft_ceiling **spent** for this climb (morph78 now PRIOR/BEST). Further climbs n ## Next (each a separate operator sentence) -1. Card rename: `hyperlex-encoder-*` identifiers → Hyperlexical / `hyperlex-structure-149m` (C31) and packet/schema `name_gate` field. +1. Real `seed-morph78` inference path (trunk-forward infer emitting the inference packet) — in progress. 2. Hub upload — still not authorized. 3. Optional T13 (promote `scripts/shadow/hyperlexical/` into `src/hyperlex/`). 4. HOLD morph78; no new climb without a new card. diff --git a/specs/007-hyperlexical-model/hf-package/README.md b/specs/007-hyperlexical-model/hf-package/README.md index a361a3d1..38a5ef6a 100644 --- a/specs/007-hyperlexical-model/hf-package/README.md +++ b/specs/007-hyperlexical-model/hf-package/README.md @@ -8,12 +8,13 @@ tags: - encoder - slang - hyperlex + - hyperlexical - not-chat --- -# hyperlex-encoder-modernbert-base-seed +# hyperlex-structure-149m — Hyperlexical -**Pin `seed-morph78` is named Hyperlexical** (trained trunk-forward E2 PASS + Danny `name_gate` yes, 2026-09-24). The identifiers on this card are still `hyperlex-encoder-*` until a separate rename, and it is **not** uploaded. This card is the publish *shape*. Weights are produced on Spark and are not in git. +**Pin `seed-morph78` is named Hyperlexical** (trained trunk-forward E2 PASS + Danny `name_gate` yes, 2026-09-24). Card name `hyperlex-structure-149m` (locked C31). It is **not** uploaded. Local train-out directories keep their `hyperlex-encoder-modernbert-base-seed-*` paths. This card is the publish *shape*. Weights are produced on Spark and are not in git. ## Current pin @@ -81,7 +82,7 @@ E2 source: `receipts/morph78-val-settle-20260924/e2-unbind-morph78.json`. That d ## Naming / publication gate -E2 PASS did not flip the name; Danny's sentence did. Card/package identifier rename, Hub upload, and optional T13 promotion remain separate operator actions. Keep weights off git. +E2 PASS did not flip the name; Danny's sentence did. Only `seed-morph78` carries this card (`scripts/shadow/hyperlexical/name_gate.py`). Hub upload and optional T13 promotion remain separate operator actions. Keep weights off git. ## Limitations diff --git a/specs/007-hyperlexical-model/hf-package/config.json b/specs/007-hyperlexical-model/hf-package/config.json index cebd3887..5606fab7 100644 --- a/specs/007-hyperlexical-model/hf-package/config.json +++ b/specs/007-hyperlexical-model/hf-package/config.json @@ -1,9 +1,11 @@ { - "architectures": ["HyperlexicalEncoder"], + "architectures": [ + "HyperlexicalEncoder" + ], "base_model": "answerdotai/ModernBERT-base", "base_model_relation": "adapter", "brier": null, - "e2_pass": false, + "e2_pass": true, "hidden_size": 768, "id2label": { "0": "betting-sharp", @@ -27,12 +29,13 @@ "political-status": 5, "workplace-corp": 7 }, - "last_trainable": 2, + "last_trainable": 8, "max_position_embeddings": 64, - "model_id": "hyperlex-encoder-modernbert-base-seed", + "model_id": "hyperlex-structure-149m", "model_type": "hyperlex-encoder", - "name_gate": false, + "name_gate": true, "num_hidden_layers": 22, + "pin": "seed-morph78", "pipeline_tag": "text-classification", "problem_type": "single_label_classification", "transformer_tag": "encoder" diff --git a/specs/007-hyperlexical-model/model-card.draft.md b/specs/007-hyperlexical-model/model-card.draft.md index 7964f09e..095b6624 100644 --- a/specs/007-hyperlexical-model/model-card.draft.md +++ b/specs/007-hyperlexical-model/model-card.draft.md @@ -6,4 +6,4 @@ Canonical draft for Hub shape: `hf-package/README.md`. **Name:** `name_gate` **true** for `seed-morph78` (Danny `flip name_gate`, 2026-09-24, amendment A6). This pin may be called **Hyperlexical**. -Do not upload (Hub not authorized). Publish-shape identifiers stay `hyperlex-encoder-*` until a separate card-rename change (locked C31 target: `hyperlex-structure-149m`). Weights stay off git. +Do not upload (Hub not authorized). Hub card name: `hyperlex-structure-149m` (locked C31). Local train-out paths keep `hyperlex-encoder-modernbert-base-seed-*`. Weights stay off git. diff --git a/specs/007-hyperlexical-model/schemas/eval_unbind.v0.1.schema.json b/specs/007-hyperlexical-model/schemas/eval_unbind.v0.1.schema.json index 13481553..8c6b1c94 100644 --- a/specs/007-hyperlexical-model/schemas/eval_unbind.v0.1.schema.json +++ b/specs/007-hyperlexical-model/schemas/eval_unbind.v0.1.schema.json @@ -29,7 +29,7 @@ "unbind_token_precision": { "type": ["number", "null"], "minimum": 0, "maximum": 1 }, "unbind_token_recall": { "type": ["number", "null"], "minimum": 0, "maximum": 1 }, "unbind_slot_f1": { "type": ["number", "null"], "minimum": 0, "maximum": 1 }, - "name_gate": { "const": false }, + "name_gate": { "type": "boolean" }, "device": { "type": ["string", "null"] }, "brier": { "type": "null" }, "forecast_eligible": { "const": false },