diff --git a/README.md b/README.md
index 8e2f14e8..62082894 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ Hermes skill is what you **run today**. Spec 007 Hyperlexical encoder is **SHADO
| **Owns** | memetic ingest · classify · receipts · virality / hyperstition signals · Spec 007 encoder specify |
| **Honesty** | `OBSERVED` / `INFERRED` / `SPECULATIVE` (+ provenance; settled Brier only where calibrated) |
| **Shape** | Hermes skill **live** (v0.4.0). Spec 007 T0→T1 **gated**. Not a chatbot mind. |
-| **Anti** | Efficacy theater · inventing Brier · naming artifacts **Hyperlexical** before E2 · Hub without `ALLOW_HUB` |
+| **Anti** | Efficacy theater · inventing Brier · naming artifacts **Hyperlexical** before `name_gate` · Hub without `ALLOW_HUB` |
| **Lane** | Skill ready · encoder SHADOW · `name_gate` **false** · Hub not published |
| **Version** | `0.4.0` — prefer [`STATUS.md`](STATUS.md) |
@@ -24,7 +24,7 @@ Docs site: [scrimshawlife-ctrl.github.io/Hyperlex](https://scrimshawlife-ctrl.gi
**OBSERVED dual-home:** this repository (`scrimshawlife-ctrl/Hyperlex`) is the canonical train and work remote. [`Zero-State-LLC/Hyperlex`](https://github.com/Zero-State-LLC/Hyperlex) is the company mirror and may lag. Do not treat the org Hyperlex as the train source of truth.
-Pinned BEST receipt on `main`: [`specs/007-hyperlexical-model/receipts/20260915-morph36-promote-best.md`](specs/007-hyperlexical-model/receipts/20260915-morph36-promote-best.md) (`name_gate=false` / no Hub).
+Pinned BEST receipt on `main`: [`specs/007-hyperlexical-model/receipts/20260924-morph78-soft-ceiling-promote-best.md`](specs/007-hyperlexical-model/receipts/20260924-morph78-soft-ceiling-promote-best.md) — `seed-morph78`, 2026-09-24 (`name_gate=false` / no Hub). Earlier pins (morph36, morph65) stay in `receipts/` as history.
Funding and demo language must match Zero State [Public Claims & Boundaries](https://app.notion.com/p/ecd794b1226b4dd89abe1ccd928dd35c) (Notion) and [Core Model Spine](https://app.notion.com/p/3dc3e8ba2f5c810db2f6f72a8ffe50eb). Do not claim: Nemotron integrated, Hub Hyperlexical card, Abraxas-named 7B, or free Inception GPUs.
@@ -53,14 +53,14 @@ Repo **Hyperlex** is the transitional monorepo shell. Do not use bare public **H
| Local SoT classify volume (operator machine) | Full SoT in git |
| Pages static run history / Phase 5 research hooks | Paid Firecrawl by default (Crawl4AI is default) |
-## Current state (OBSERVED 2026-09-10/11 PT)
+## Current state (harvest rows OBSERVED 2026-09-10/11 PT · Spec 007 row 2026-09-24)
Snapshot — full scoreboard in [`STATUS.md`](STATUS.md).
| Area | State |
|------|-------|
| Hermes skill | Ready **v0.4.0** |
-| Spec 007 | SHADOW on main · T0 specified · T1 blocked on Spark E2 |
+| Spec 007 | SHADOW · BEST `seed-morph78` (PROMOTE_BEST 2026-09-24) · trained E2 **PASS** · public T1 name blocked on `name_gate` |
| `name_gate` | **false** (volume ≠ name) |
| Hub | Not published |
| Local SoT | `~/.hyperlex/hyperlexical/ingest_candidates.jsonl` — **4333** (**not in git**) |
diff --git a/STATUS.md b/STATUS.md
index 7a9bfc51..b55f637b 100644
--- a/STATUS.md
+++ b/STATUS.md
@@ -142,7 +142,7 @@ data/backfill/2026/
## Recommended next
-1. Spark BEST = **morph78**. Operator review `HYPERLEXICAL-PRODUCT-PLAN.md`; hold BEST or authorize a new acquire with named phrases (soft_ceiling compare vs morph78 broad 0.9883 n=256). `name_gate` needs Danny yes. Plan: `specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md`.
+1. Spark BEST = **morph78**. Default **HOLD**. Operator review `specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md`; a new climb needs a new named-phrase acquire card (compare vs morph78 broad 0.9883 n=256). `name_gate` needs Danny yes. Plan: `specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md`.
2. Burn-in offline runs + settle path (this is how Brier becomes real).
3. Do not Hub-upload. Do not promote `scripts/shadow/hyperlexical/` into `src/hyperlex/` (T13). Do not flip `name_gate`.
diff --git a/docs/CANONICAL.md b/docs/CANONICAL.md
index 8c85d431..05e5530e 100644
--- a/docs/CANONICAL.md
+++ b/docs/CANONICAL.md
@@ -26,7 +26,10 @@ see [Remotes](remotes.md).
## Current BEST receipt
The pinned BEST promote receipt on `main` is
-[20260915-morph36-promote-best.md](https://github.com/scrimshawlife-ctrl/Hyperlex/blob/main/specs/007-hyperlexical-model/receipts/20260915-morph36-promote-best.md).
+[20260924-morph78-soft-ceiling-promote-best.md](https://github.com/scrimshawlife-ctrl/Hyperlex/blob/main/specs/007-hyperlexical-model/receipts/20260924-morph78-soft-ceiling-promote-best.md)
+(`seed-morph78`, 2026-09-24). Earlier pins such as
+[20260915-morph36-promote-best.md](https://github.com/scrimshawlife-ctrl/Hyperlex/blob/main/specs/007-hyperlexical-model/receipts/20260915-morph36-promote-best.md)
+are history.
That receipt records **`name_gate=false`** and **no Hub** publish.
diff --git a/docs/index.md b/docs/index.md
index 65401b7f..d57da8b1 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -29,10 +29,10 @@ Repo Hyperlex is the transitional monorepo shell. Public produc
|-------|--------|
| **Hermes skill** | Shipping v0.4.0 — ingest, 8-family lineage, receipts, settle → Brier |
| **T0 encoder** | Specified baseline (`hyperlex-encoder-*`). Not a Hyperlexical name. |
-| **T1 encoder** | Allowed to take the Hyperlexical name **only after E2** on Spark. Not there. |
+| **T1 encoder** | Hyperlexical name needs trained E2 **and** Danny's `name_gate` yes. E2 passed on `seed-morph78` (2026-09-24); `name_gate` still false. |
| **`name_gate` / Hub** | **false** / not published |
-Classify volume is ready. E2 is Spark-blocked. [SHADOW encoder (007)](shadow-hyperlexical.md) · [Status](status.md).
+Classify volume is ready. Spark BEST `seed-morph78` passes trained E2; the name is still gated. [SHADOW encoder (007)](shadow-hyperlexical.md) · [Status](status.md).
## What happens on a run
@@ -47,7 +47,7 @@ flowchart LR
B -.-> H[007 model path]
```
-Phase 5 is optional and always **SPECULATIVE** with `brier: null` — see [glossary](start/glossary.md#phase-5). Spec 007 is **SHADOW / advisory**: classify volume is ready; `name_gate` is false; E2 is Spark-blocked. Do not call the encoder Hyperlexical.
+Phase 5 is optional and always **SPECULATIVE** with `brier: null` — see [glossary](start/glossary.md#phase-5). Spec 007 is **SHADOW / advisory**: classify volume is ready; trained E2 passed on `seed-morph78`; `name_gate` is false. Do not call the encoder Hyperlexical.
| Stage | What you get |
|-------|----------------|
diff --git a/docs/shadow-hyperlexical.md b/docs/shadow-hyperlexical.md
index 611d551a..19793ff1 100644
--- a/docs/shadow-hyperlexical.md
+++ b/docs/shadow-hyperlexical.md
@@ -1,10 +1,10 @@
# SHADOW — Spec 007 model path
-**Naming:** this page is **Hyperlexical** (model / train / eval / E2 / `name_gate` claim). Harvest and live ingest are **ne0l0gist**. Repo **Hyperlex** is the transitional shell. The earned Hub name still requires E2 (`name_gate` is **false**).
+**Naming:** this page is **Hyperlexical** (model / train / eval / E2 / `name_gate` claim). Harvest and live ingest are **ne0l0gist**. Repo **Hyperlex** is the transitional shell. Trained E2 passed on `seed-morph78` (2026-09-24). The public name still requires Danny's `name_gate` yes (`name_gate` is **false**).
The Hermes skill is the **current operator surface**. This page is the **model path**: a learned encoder that starts as T0 and may become T1 after E2.
-Not on Hyperlex `API_V1`. Not a Hugging Face model. Not named **Hyperlexical** until eval gate E2 passes on Spark.
+Not on Hyperlex `API_V1`. Not a Hugging Face model. Not named **Hyperlexical** until Danny's `name_gate` yes. Trained E2 PASS alone does not name it.
Specify is locked C1–C52 plus A5 milestones. Implement on `main` is the stub, harvest, eval harness, and gated Spark loop.
@@ -14,10 +14,10 @@ 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 | **Not earned.** E2 Spark-blocked. |
+| T1 | Encoder + unbind heads; E2 vs Spec 004 | `hyperlex-structure-*` / Hyperlexical | Trained E2 **PASS** on `seed-morph78`; name **not** granted (`name_gate` false). |
| T2 | Separate generative LoRA | out of this cycle | Not an implement target |
-`name_gate` stays **false** until E2. Classify volume ready ≠ T1.
+`name_gate` stays **false** until Danny yes. E2 PASS ≠ name. Classify volume ready ≠ T1.
## Honest gates (2026-09-10 PT evening)
@@ -32,8 +32,8 @@ Danny ~2500 candidate bar: **met**. Hermes 913 / “gap to 2500” is **supersed
| Gate | State |
|------|--------|
| Classify volume | **Ready** — operator `--include-live` family classify **2437**. |
-| `name_gate` | **false**. Volume does not name the model. Gate stays false until E2 passes on Spark. |
-| E2 vs Spec 004 | **FAIL** on the stub (expected). A trained E2 is Spark-blocked. Seed smoke is not a pass. |
+| `name_gate` | **false**. Volume does not name the model. E2 PASS does not flip it; Danny yes required. |
+| E2 vs Spec 004 | **FAIL** on the stub (expected). Trained E2 **PASS** on Spark BEST `seed-morph78` (updated 2026-09-24). Seed smoke is not a pass. |
| Hub | No upload. Skeleton only. Weights stay on Spark. |
| Families | **8**. No ninth family. |
| Brier | `null` on every packet. |
@@ -64,7 +64,7 @@ Bring-up is procedure, not a product card. A seed smoke that ends with E2 failin
| [HERMES-SPARK-RUN.md](https://github.com/scrimshawlife-ctrl/Hyperlex/blob/main/specs/007-hyperlexical-model/HERMES-SPARK-RUN.md) | Hermes run order |
| [milestones.md](https://github.com/scrimshawlife-ctrl/Hyperlex/blob/main/specs/007-hyperlexical-model/milestones.md) | A5 name-gate / tier table (#33) |
-Trunk: `answerdotai/ModernBERT-base`. Local snapshot only. Last 2 layers trainable. Span aligner + val metrics. HF-shaped dump (`config.json`, `model.safetensors` or `heads.pt`). No Hub upload from the recipe. Card name stays `hyperlex-encoder-modernbert-base-seed` until E2.
+Trunk: `answerdotai/ModernBERT-base`. Local snapshot only. Recipe default: last 2 layers trainable (climb pins such as `seed-morph78` use LAST_TRAINABLE=8). Span aligner + val metrics. HF-shaped dump (`config.json`, `model.safetensors` or `heads.pt`). No Hub upload from the recipe. Card name stays `hyperlex-encoder-modernbert-base-seed` until `name_gate` yes.
## Eval table (stub)
diff --git a/docs/specs/index.md b/docs/specs/index.md
index d2a65189..d6e91a75 100644
--- a/docs/specs/index.md
+++ b/docs/specs/index.md
@@ -17,11 +17,11 @@ Constitution: [`.specify/memory/constitution.md`](https://github.com/scrimshawli
| 004 | Recoverable-structure probe | SPECIFY locked · implement SHADOW | `scripts/shadow/recoverable_structure/` |
| 005 | Route labels | SPECIFY locked (Notion + branch `005-route-labels`) | not on main — [PR 18](https://github.com/scrimshawlife-ctrl/Hyperlex/pull/18) |
| 006 | IsA | reserved — do not open from 007 | — |
-| 007 | Hyperlexical model | SPECIFY locked C1–C52 · A5 milestones · SHADOW implement on main | `scripts/shadow/hyperlexical/` · E2 fail · `name_gate` false · no Hub |
+| 007 | Hyperlexical model | SPECIFY locked C1–C52 · A5 milestones · SHADOW implement on main | `scripts/shadow/hyperlexical/` · stub E2 fail (expected) · trained E2 PASS on BEST `seed-morph78` · `name_gate` false · no Hub |
## Spec 007 (SHADOW)
-Not on `API_V1`. Not a Hugging Face model. Not named **Hyperlexical** until E2 passes on Spark.
+Not on `API_V1`. Not a Hugging Face model. Not named **Hyperlexical** until Danny's `name_gate` yes (trained E2 PASS on `seed-morph78` does not flip it).
- Pages overview: [SHADOW encoder (007)](../shadow-hyperlexical.md)
- Operator snapshot: [Status](../status.md)
diff --git a/docs/status.md b/docs/status.md
index 0041bfa1..4abaac0e 100644
--- a/docs/status.md
+++ b/docs/status.md
@@ -142,7 +142,7 @@ data/backfill/2026/
## Recommended next
-1. Spark BEST = **morph78**. Operator review `HYPERLEXICAL-PRODUCT-PLAN.md`; hold BEST or authorize a new acquire with named phrases (soft_ceiling compare vs morph78 broad 0.9883 n=256). `name_gate` needs Danny yes. Plan: `specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md`.
+1. Spark BEST = **morph78**. Default **HOLD**. Operator review `specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md`; a new climb needs a new named-phrase acquire card (compare vs morph78 broad 0.9883 n=256). `name_gate` needs Danny yes. Plan: `specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md`.
2. Burn-in offline runs + settle path (this is how Brier becomes real).
3. Do not Hub-upload. Do not promote `scripts/shadow/hyperlexical/` into `src/hyperlex/` (T13). Do not flip `name_gate`.
diff --git a/specs/007-hyperlexical-model/AARON-SPARK-TRAIN.md b/specs/007-hyperlexical-model/AARON-SPARK-TRAIN.md
index bbfe3924..fc793c23 100644
--- a/specs/007-hyperlexical-model/AARON-SPARK-TRAIN.md
+++ b/specs/007-hyperlexical-model/AARON-SPARK-TRAIN.md
@@ -6,7 +6,7 @@ Owner of this run: Aaron on the DGX Spark.
Owner of the spec: Danny.
Use current **`main`**. Do not use the old `007-hyperlexical-model` branch.
-This is a **seed smoke** for harness wiring, not a Hyperlexical card. E2 has not passed. Name-gate is false. Do not upload to Hugging Face. Do not say the model is Hyperlexical.
+This is a **seed smoke** for harness wiring, not a Hyperlexical card. A seed smoke is not an E2 result (trained E2 PASS lives on the climb BEST — see `STATUS.md`). Name-gate is false. Do not upload to Hugging Face. Do not say the model is Hyperlexical.
**Train data:** T1 / E2 work uses the **local SoT** (`~/.hyperlex/hyperlexical/ingest_candidates.jsonl`). Export it with `PYTHONPATH=scripts/shadow python3 -m hyperlexical.export --include-live`. Train the same rows with an explicit opt-in — default remains the tracked/seed export (smoke-safe):
diff --git a/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md b/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md
index 583ee0f4..ced93850 100644
--- a/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md
+++ b/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md
@@ -1,131 +1,127 @@
# Hyperlexical model product — completion plan
-**Status:** DRAFT (operator review) · **Date:** 2026-09-23
-**Naming:** repo **Hyperlex** = transitional shell. Public products: **Hyperlexical** (this plan) and **ne0l0gist** (ingest). Hermes skill ≠ Hyperlexical.
-**Hard locks (unchanged):** `name_gate=false` until Danny yes · no Hub upload · no invented OBSERVED · upsample freeze **11+** · no `SECOND_SLOT=4` · schemes `positional|type_slot` only · Brier `null` on every 007 packet.
+**Status:** DRAFT (operator review) · **Reconciled:** 2026-09-24 (PR #102)
-This plan turns Spec 007 from a SHADOW Spark climb into a shippable Hyperlexical product. It does **not** flip `name_gate`.
+**Naming:** repo **Hyperlex** = transitional shell. Public ingest = **ne0l0gist** (named). Public trained-model product = **Hyperlexical**, still gated. Hermes skill ≠ Hyperlexical. SoT: `docs/NAMING.md`.
----
+**Hard locks:** `name_gate=false` until Danny explicit yes · no Hub upload · no invented OBSERVED · upsample freeze **11+** · no `SECOND_SLOT=4` · schemes `positional|type_slot` only · Brier `null` on every 007 packet.
-## Current honest state (2026-09-23)
+This plan supersedes the 2026-09-23 draft (morph65 BEST, soft_ceiling ARMED, morph78 acquire empty). That draft was accurate on 2026-09-23 and remains in git history. This plan does not flip `name_gate`.
-| Layer | State |
-|-------|--------|
-| Hermes skill (`SKILL.md`, CLI, `src/hyperlex/`) | **Ready** (v0.4.0; `pyproject.toml` aligned to `VERSION`) |
-| Spec 007 shadow train/eval | **Ready enough to climb** — BEST=`seed-morph65`, E2 PASS on trained trunk |
-| Force fair | **1.0** n=164 (classic promote wall) |
-| soft_ceiling | **ARMED** — at fair 1.0, promote only if live broad OBSERVED **>** PRIOR morph65 (**0.88671875** n=256) + E2 |
-| Gold path | morph78 acquire + residual reprobe → **empty gold**; `authorize val-settle` → **CANCELLED_EMPTY_GOLD** |
-| Hyperlexical name / Hub / T13 promote into `src/hyperlex/` | **Blocked** |
+## Current honest state
-Verdict: skill is production-ready as a Hermes skill. The **Hyperlexical model product** is not — name wall, Hub, packaging, and live-gold path still open.
+| Layer | State | Evidence |
+|---|---|---|
+| Hermes skill | **Ready** v0.4.0 | `VERSION`, `pyproject.toml` |
+| Spec 007 lane | **SHADOW** | `spec.md`; code under `scripts/shadow/hyperlexical/` |
+| Trained pin | **BEST=`seed-morph78`** | `receipts/morph78-val-settle-20260924/pin-promote-best.json` |
+| Promotion | **PROMOTE_BEST**, soft_ceiling `ceiling_escape`, 2026-09-24 | `receipts/morph78-val-settle-20260924/GATE_LOCK.json` |
+| Broad OBSERVED | **0.98828125** n=256 | `receipts/morph78-val-settle-20260924/broad-eval-morph78.json` |
+| PRIOR | morph65 **0.88671875** n=256 (same live surface) | `receipts/morph78-val-settle-20260924/broad-eval-prior-morph65-at-finish.json` |
+| E2 | **PASS** — trained trunk-forward, unbind_exact 1.0, n_unbind_eval 24 | `receipts/morph78-val-settle-20260924/e2-unbind-morph78.json` |
+| Force fair (advisory at ceiling) | 1.0 n=164 | `receipts/morph78-val-settle-20260924/fair-eval-morph65-morph78.json` |
+| Force/hard | **236 / 277** | `receipts/morph78-val-settle-20260924/ACQUIRE_SETTLE_SUMMARY.json` |
+| soft_ceiling | **SPENT / CLOSED** for this climb | `receipts/20260924-morph78-soft-ceiling-promote-best.md` |
+| E1 / E3 on `seed-morph78` | **NOT_COMPUTABLE** — no receipt | — |
+| `name_gate` | **false** | STATUS, pin, E2 JSON |
+| Hub | unpublished | — |
+| T13 | not authorized | — |
----
+Verdict: training produced a pinned candidate that passes E2. What is left is naming, publication and integration authority. Training is no longer the blocker.
-## Product definition (what “complete” means)
+## Product state machines
-Hyperlexical is complete when all of the following are true:
+These are independent. Do not collapse them into one "product ready" flag.
-1. **Train artifact** — pinned BEST checkpoint on Spark with receipts (fair surface + E2 + soft_ceiling decide if armed).
-2. **Eval gates** — E2 PASS on the pin; stub FAIL still expected; seed smoke ≠ T1.
-3. **Dataset honesty** — OBSERVED only from settled/authorized gold; no invent; force-train / hard-atoms are operator JSONL, not SoT.
-4. **Name** — Danny explicit yes flips `name_gate`; card may then be called Hyperlexical (not before).
-5. **Publish** — Hub upload is a **named** operator action after name_gate; weights stay out of git until then.
-6. **Operator surface** — infer CLI + packet schema + model card shipped; optional later T13 promote into `src/hyperlex/` (separate sentence).
+| Machine | Path | Current |
+|---|---|---|
+| TRAIN | `UNTRAINED → TRAINED → E2_PASS → BEST_PINNED` | `BEST_PINNED(seed-morph78)` |
+| NAME | `UNNAMED_PUBLICLY → NAME_GATE_APPROVED` | `UNNAMED_PUBLICLY` |
+| PUBLISH | `LOCAL_ONLY → CARD_READY → HUB_AUTHORIZED → HUB_PUBLISHED` | `LOCAL_ONLY` |
+| INTEGRATION | `SHADOW → T13_AUTHORIZED → SRC_PROMOTED` | `SHADOW` |
-Until (4), the artifact stays `hyperlex-encoder-*`.
+Only an operator sentence advances NAME, PUBLISH past `CARD_READY`, or INTEGRATION. TRAIN advancing does not advance any other machine.
----
+## Definition of complete
-## Workstreams
-
-### A. Climb / gold (Spark · soft_ceiling)
+Hyperlexical is complete for this product cycle when:
-| Step | Action | Exit |
-|------|--------|------|
-| A1 | Idle: do **not** re-burn empty settle / empty acquire | HOLD until named phrases |
-| A2 | Operator `authorize morph78 …` or `authorize val-settle` **listing phrases**, **or** acquire that clears Jev `force_expand_safe` | Non-empty authorize card |
-| A3 | Val-settle → force tip expand → fair baseline on new tip | Fair surface receipt |
-| A4 | Train next morph under soft_ceiling; decide via `gate_soft_ceiling_decide.py` | PROMOTE or REJECT_VS_BEST |
-| A5 | If PROMOTE: update BEST pin + PRIOR broad for next soft_ceiling compare | New BEST held |
+1. a pinned BEST has receipts and E2 PASS;
+2. dataset provenance remains honest (OBSERVED only from settled/authorized gold);
+3. the model card reflects the live pin without inventing metrics;
+4. Danny explicitly approves `name_gate`;
+5. any Hub upload is separately authorized;
+6. any T13 promotion is separately authorized and tested.
-Constraints: upsample freeze 11+; no SECOND_SLOT=4; Qwen stopped unless re-enabled.
+Until item 4, artifact naming remains `hyperlex-encoder-*`.
-### B. Engineering hygiene (main / tip)
+## Workstreams
-| Step | Action | Exit |
-|------|--------|------|
-| B1 | Restore `apply_unbind_force_train` + tests on tip (#99 CI) | validate green (**done** · merged) |
-| B2 | Align `VERSION` ↔ `pyproject.toml` version (0.4.0 vs 1.6.0 skew) | Single source of truth (**done** · 0.4.0) |
-| B3 | Drop / quarantine stale probe files; scrub “E2 Spark-blocked” once trained E2 PASS is the pin | Docs match receipts (**done** on hygiene branch) |
-| B4 | Keep force-train path env-only; val move ⇒ fair re-baseline | Receipt stats present |
+### A. Training / gold — CLOSED FOR CURRENT CLIMB
-### C. Product packaging (post–name_gate, separate authorize)
+- [x] morph78 phrases settled OBSERVED `split=val`: `have fun staying poor`, `fr fr no cap`
+- [x] force/hard 232/273 → 236/277
+- [x] broad comparison on the same n=256 surface: 0.98828125 > 0.88671875
+- [x] E2 PASS on `seed-morph78`
+- [x] PROMOTE_BEST; Spark `BEST` → `seed-morph78`
-| Step | Action | Exit |
-|------|--------|------|
-| C1 | Finalize `model-card.draft.md` / `hf-package/README.md` with pin metrics | Card ready, still no upload |
-| C2 | Operator Hub upload sentence | Weights + card on Hub |
-| C3 | Optional T13: promote shadow package into `src/hyperlex/` | Separate PR + tests |
-| C4 | Flip `name_gate` only on Danny yes | Public Hyperlexical name |
+**Rule:** do not start another climb without a new operator-authorized acquire/card. A future climb compares against morph78 as PRIOR.
-### D. Adjacent Hyperlex PRs (skill track — not model name)
+### B. Engineering hygiene
-| PR | Role | Handle |
-|----|------|--------|
-| **#100** pytrends evidence | Skill route evidence | **Merged** to main. Independent of Hyperlexical name. |
-| **#99** Spec 007 tip docs + climb | Model path | **Merged** to main. |
-| **#95** HYPERLEX-Q1 | Epistemic interchange | Stay **draft**; rebase onto current `main`; remains UNQUALIFIED / pairwise BLOCKED. Spec-only. |
+- [x] `VERSION` ↔ `pyproject.toml` = 0.4.0
+- [x] STATUS / NEXT_MOVES show morph78
+- [x] model-card publish shape updated from pre-train E2 wording (PR #102)
+- [x] Notion Operator Hub has a 2026-09-24 morph78 block; 2026-09-23 block kept as history
+- [x] operator-facing pages no longer present morph65 as current BEST (PR #102 audit)
-Do **not** merge **#95** without explicit operator yes.
+### C. Product packaging — post-`name_gate`
----
+- [ ] operator reviews this reconciled plan
+- [ ] Danny explicit `name_gate yes` / "name Hyperlexical"
+- [ ] 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
-## Sequencing (recommended)
+### D. Adjacent tracks (not product naming)
-```
-B1 (CI fix) ──► #100 operator check + merge authorize
- │
- ├──► A2–A5 climb under soft_ceiling (needs gold)
- │
- ├──► B2–B3 hygiene on tip / follow-up PR
- │
- └──► #95 rebase only (no qualify claim)
+| Track | State |
+|---|---|
+| HYPERLEX-Q1 (#95) | draft · **UNQUALIFIED** until its own evidence/review gate clears |
+| Hyperlex → Noesis pairwise qualification | **BLOCKED** on Q1 |
+| #99 / #100 / #101 | merged |
-When climb + packaging ready:
- Danny name_gate yes ──► C1–C2 Hub ──► optional C3 T13
-```
+Q1 status is not a substitute for Spec 007 product completion, and Spec 007 progress does not qualify Q1.
-Climb (A) and skill PR #100 can proceed in parallel. Name/Hub (C) never parallel-jumps ahead of Danny yes.
+## Default recommendation
----
+**HOLD morph78.** Resolve NAME and PUBLISH decisions before authorizing another training climb.
## Explicit non-goals
-- Inventing OBSERVED fillers or empty-gold settles
-- Hub upload or `name_gate` flip without Danny
-- Warm-clone spam / upsample 11+ / SECOND_SLOT=4
-- Treating Hermes skill readiness as Hyperlexical product readiness
-- Calling stub or seed smoke a T1 pass
-
----
-
-## Definition of done (product)
-
-- [ ] soft_ceiling path either PROMOTE’s a new BEST or operator closes climb with held morph65
-- [x] Tip CI green; force-train API present; version skew fixed
-- [ ] Model card filled from live pin metrics
-- [ ] Danny `name_gate` yes (or explicit hold)
-- [ ] Hub upload done **or** explicit “no Hub this cycle”
-- [x] STATUS / ROADMAP updated to match reality (no stale “E2 Spark-blocked” on operator ROADMAP once trained E2 PASS is the pin)
-
----
+- restarting the completed morph78 climb
+- inventing OBSERVED fillers or recycling settled phrases as new gold
+- treating E2 PASS as naming authority
+- Hub upload without a named operator action
+- T13 without separate authorization
+- changing Brier from `null` on 007 packets
+
+## Definition of done — current cycle
+
+- [x] BEST pinned: morph78
+- [x] trained E2 PASS
+- [x] soft_ceiling climb closed
+- [x] version hygiene
+- [x] model card reflects live morph78 evidence (E1/E3 marked NOT_COMPUTABLE)
+- [x] Notion Operator Hub parity
+- [ ] operator product review
+- [ ] Danny `name_gate` decision
+- [ ] Hub decision: upload authorized, or explicit no-Hub this cycle
+- [ ] optional T13 decision
## Pointers
-- Climb next: root `NEXT_MOVES_007.md`
-- Name gate / named phrases: `NAME-GATE-AND-NAMED-PHRASES.md`
-- Soft_ceiling receipts: `receipts/20260923-authorize-gate-soft-ceiling.md`, `receipts/gate-soft-ceiling-20260923/`
-- Empty gold: `receipts/20260923-authorize-val-settle-cancelled-empty-gold.md`
-- Gates: `milestones.md`, `spec.md`, `dual-use-gate.md`
+- Name gate + phrases: `NAME-GATE-AND-NAMED-PHRASES.md`
+- Next moves: root `NEXT_MOVES_007.md`
+- Promote receipt: `receipts/20260924-morph78-soft-ceiling-promote-best.md`
+- Historical gate authorize: `receipts/20260923-authorize-gate-soft-ceiling.md`
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 dd09979d..615f6ac6 100644
--- a/specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md
+++ b/specs/007-hyperlexical-model/NAME-GATE-AND-NAMED-PHRASES.md
@@ -3,111 +3,81 @@
**Status:** DRAFT (does **not** flip `name_gate`) · **Date:** 2026-09-24
**Locks:** `name_gate=false` · no Hub · no invented OBSERVED · upsample freeze **11+** · no `SECOND_SLOT=4` · soft_ceiling spent (morph78 BEST)
-Companion to `HYPERLEXICAL-PRODUCT-PLAN.md` workstreams A (climb/gold) and C (post–name_gate packaging).
+Companion to `HYPERLEXICAL-PRODUCT-PLAN.md`.
-### Operator name (ingest) — 2026-09-24
+## Current product boundary — 2026-09-24
-Danny: **`name neologist as in repo`**. Public ingest product = **`ne0l0gist`** (repo spelling with zeros). Receipt: `receipts/20260924-name-ne0l0gist-as-in-repo.md`. This does **not** flip Hyperlexical `name_gate`.
-
----
-
-## Two walls (do not conflate)
-
-| Wall | What it gates | Current state |
-|------|----------------|---------------|
-| **Dataset name-gate buckets** (`milestones.md`) | Settled gold floors before *planning* a T1 name | Gaps **0 / 0 / 0** on operator `--include-live` (classify ≥2k / unbind ≥200 / negatives ≥200) |
-| **`name_gate` flag** | Public **Hyperlexical** name + Hub/T13 packaging | **false** — Danny explicit yes required. Trained E2 PASS on Spark does **not** flip this. Ingest **`ne0l0gist`** is already named (separate product). |
-
-Volume readiness ≠ name. Seed smoke ≠ T1. Stub E2 FAIL remains expected.
-
----
-
-## Named phrases (gold authorize)
-
-Empty `authorize_card_phrases` → Jev **`cancel_empty_gold`**. Do not invent OBSERVED to fill a card.
+- BEST = `seed-morph78`
+- soft_ceiling climb = **CLOSED / SPENT**
+- broad OBSERVED = **0.9883** n=256
+- PRIOR morph65 = **0.8867** n=256
+- trained trunk-forward E2 = **PASS**
+- next climb = **not authorized**
+- `name_gate=false`
+- Hub = unpublished
+- T13 = not authorized
-### Last non-empty HOLD card (morph77 · already settled)
+Receipt: `receipts/20260924-morph78-soft-ceiling-promote-best.md`. Do not re-run the completed morph78 climb as if it were pending work.
-Receipt: `receipts/20260923-morph77-val-acquire-label-hold.md` · card `receipts/morph77-val-acquire-label-hold-20260923/HOLD_AUTHORIZE_CARD.json`.
+### Operator name (ingest)
-| # | phrase | lineage (card) |
-|--:|--------|----------------|
-| 1 | `we're so back` | brainrot-aura |
-| 2 | `clutch up` | gaming-meta |
-| 3 | `bet that up` | kinship-address |
-| 4 | `real talk` | kinship-address |
+Danny: **`name neologist as in repo`**. Public ingest product = **`ne0l0gist`** (repo spelling with zeros). Receipt: `receipts/20260924-name-ne0l0gist-as-in-repo.md`. This does **not** flip Hyperlexical `name_gate`.
-`authorize val-settle` on morph77 **kept** these as OBSERVED `split=val` and grew force/hard **224→232 / 265→273**. Train was **CANCELLED_FAIR_CEILING** (fair stayed 1.0 n=164). See `receipts/20260923-morph77-val-settle-cancelled-fair-ceiling.md`.
+## Two walls
-**Do not re-authorize / re-settle these four** — they are already OBSERVED. Re-listing them as “new gold” would be inventing progress.
+| Wall | Current state |
+|------|---------------|
+| Dataset readiness (`milestones.md`) | bucket gaps 0/0/0 on the operator `--include-live` surface |
+| Public model name / publish | **BLOCKED** until Danny explicit `name_gate yes` or explicit Hyperlexical naming |
-### Cards after morph77
+Volume readiness ≠ public naming. E2 PASS ≠ public naming.
-| card | `authorize_card_phrases` |
-|------|--------------------------|
-| morph78 fresh acquire | **PROMOTE_BEST 2026-09-24:** settled phrases + soft_ceiling ceiling_escape (broad 0.9883 > 0.8867) |
-| morph65 live broad residual reprobe | `[]` |
+## Gold / climb
-Operator bare `authorize val-settle` → **CANCELLED_EMPTY_GOLD** (`receipts/20260923-authorize-val-settle-cancelled-empty-gold.md`). Force tip remains morph77 **232/273**. Live broad prior **0.88671875** n=256.
+morph78 is settled and promoted. Earlier empty-gold and morph77 cards are evidence, not reusable progress.
-### Authorize sentence shapes (required)
+### Already OBSERVED — do not re-settle as new gold
-One of:
+| phrase | settled by | receipt |
+|--------|-----------|---------|
+| `we're so back` | morph77 val-settle | `receipts/20260923-morph77-val-settle-cancelled-fair-ceiling.md` |
+| `clutch up` | morph77 val-settle | same |
+| `bet that up` | morph77 val-settle | same |
+| `real talk` | morph77 val-settle | same |
+| `have fun staying poor` | morph78 val-settle | `receipts/20260924-morph78-val-settle-soft-ceiling-inflight.md` |
+| `fr fr no cap` | morph78 val-settle | same |
-1. **Named phrases on a live empty card** — operator lists exact norms from that card’s acquire/qualify pool (not from memory, not morph77’s already-settled four unless the new card independently contains them as unsettled AUTHORIZE):
- - `authorize val-settle: , , …`
- - `authorize morph78: , , …`
-2. **New acquire** that clears Jev `force_expand_safe` with a non-empty `authorize_card_phrases` after `card_high_conf_new` (or equivalent), then explicit authorize listing those phrases.
-3. **Climb without new force-only gold** — under soft_ceiling, fair = 1.0 path is **broad OBSERVED > PRIOR** live + E2 (`gate_soft_ceiling_decide.py`), not another force-only morph at n=164.
+### Future climb (not authorized)
-Still forbidden: empty settle, invented OBSERVED, UPSAMPLE 11+, `SECOND_SLOT=4`.
+A future climb needs a **new** acquire/authorize card and compares against morph78 as PRIOR (broad 0.9883 n=256 + E2). Accepted sentence shapes:
----
+1. Named phrases from that new card's acquire/qualify pool: `authorize val-settle: , , …`
+2. A new acquire that clears Jev `force_expand_safe` with non-empty `authorize_card_phrases`, then explicit authorize listing those phrases.
-## `name_gate` flip plan (Danny only)
+Still forbidden: empty settle, invented OBSERVED, recycled settled phrases, UPSAMPLE 11+, `SECOND_SLOT=4`.
-This section is a checklist. **No agent flips the flag.**
+## `name_gate` flip plan — Danny only
-### Preconditions (all must already be true or explicitly waved)
+No agent flips the flag.
-- [x] Dataset bucket gaps 0/0/0 on the harvest surface (met 2026-09-10)
-- [x] Trained trunk-forward E2 PASS on pinned BEST (`seed-morph78`)
-- [x] Soft_ceiling climb closed: morph78 PROMOTE_BEST 2026-09-24
+- [x] Dataset bucket gaps 0/0/0 (met 2026-09-10)
+- [x] Trained trunk-forward E2 PASS on `seed-morph78`
+- [x] soft_ceiling climb closed with morph78 PROMOTE_BEST
+- [x] Hygiene: `VERSION` ↔ `pyproject.toml`; stale "E2 Spark-blocked" current-state wording scrubbed (PR #102)
+- [x] Product-state reconciliation drafted (PR #102)
- [ ] Operator product review of `HYPERLEXICAL-PRODUCT-PLAN.md`
-- [x] Hygiene B2–B3 landed (`VERSION` ↔ `pyproject.toml`; stale “E2 Spark-blocked” scrubbed from operator ROADMAP/STATUS copies)
-- [ ] Danny sentence that explicitly says **`name_gate` yes** (or “name Hyperlexical”)
-
-### On Danny yes (separate PRs / sentences)
-
-1. Set `name_gate` true in the locked operator surfaces only (STATUS / milestones note / dual-use gate as required by engineering.md) — not by silent agent edit.
-2. Allow card rename path: `hyperlex-encoder-*` → Hyperlexical naming per `model-card.draft.md`.
-3. Hub upload = **named** operator action (C2). Weights stay out of git until then.
-4. Optional T13 promote of `scripts/shadow/hyperlexical/` into `src/hyperlex/` = separate authorize + tests.
-
-### Explicit non-goals
-
-- Flipping `name_gate` because E2 PASS, volume, or soft_ceiling ARMED
-- Treating morph77’s four settled phrases as a name_gate unlock
-- Hub / T13 without Danny
-
----
-
-## Sequencing
+- [ ] Danny explicit `name_gate yes` / "name Hyperlexical"
-```
-Hygiene (this branch) ──► operator review product plan
- │
- ├──► named-phrase authorize OR new force_expand_safe acquire ──► soft_ceiling decide
- │
- └──► Danny name_gate yes (only when ready) ──► card / Hub / optional T13
-```
+On Danny yes, keep actions separate:
----
+1. change governed `name_gate` surfaces;
+2. update public card naming (`hyperlex-encoder-*` → Hyperlexical per `model-card.draft.md`);
+3. Hub upload only on a separate named operator action;
+4. optional T13 only on separate authorization + tests.
## Pointers
- Product plan: `HYPERLEXICAL-PRODUCT-PLAN.md`
-- Climb next: root `NEXT_MOVES_007.md` · this pack `NEXT_MOVES_007.md`
-- morph77 card: `receipts/morph77-val-acquire-label-hold-20260923/`
-- Empty morph78: `receipts/20260923-morph78-fresh-acquire-hold-empty.md`
-- Soft ceiling: `receipts/20260923-authorize-gate-soft-ceiling.md`
+- Current climb state: root `NEXT_MOVES_007.md`
+- Naming SoT: `docs/NAMING.md`
+- Historical (2026-09-23): `receipts/20260923-authorize-gate-soft-ceiling.md` · `receipts/20260923-morph78-fresh-acquire-hold-empty.md` · `receipts/morph77-val-acquire-label-hold-20260923/`
diff --git a/specs/007-hyperlexical-model/hf-package/README.md b/specs/007-hyperlexical-model/hf-package/README.md
index 04ccd165..af499c8f 100644
--- a/specs/007-hyperlexical-model/hf-package/README.md
+++ b/specs/007-hyperlexical-model/hf-package/README.md
@@ -13,19 +13,34 @@ tags:
# hyperlex-encoder-modernbert-base-seed
-**Do not treat this as Hyperlexical.** E2 has not passed. Name-gate is false. This card is the publish *shape*. Weights are produced on Spark and are not in git.
+**Do not treat this as a publicly named Hyperlexical artifact yet.** Trained trunk-forward E2 has **PASSED**, but `name_gate=false` remains the explicit public-name/publish wall. This card is the publish *shape*. Weights are produced on Spark and are not in git.
+
+## Current pin
+
+- BEST: `seed-morph78`
+- Promotion: `PROMOTE_BEST` via soft_ceiling ceiling escape on 2026-09-24
+- Broad OBSERVED: **0.9883**, n=256
+- PRIOR: morph65 **0.8867**, n=256
+- Train val (force surface): best unbind_exact **1.0** n=164 at epoch 15
+- E2: **PASS** (trained trunk-forward, unbind_exact 1.0, n_unbind_eval 24)
+- Force/hard: **236 / 277**
+- This pin: observed upsample **10**, second-slot weight **2.0**, LAST_TRAINABLE **8**, 40 epochs, warm from morph65
+- Upsample freeze: **11+** · `SECOND_SLOT=4`: forbidden
+- `name_gate`: **false**
+- Brier: **null**
+- Hub: unpublished
## Model details
- Trunk: [`answerdotai/ModernBERT-base`](https://huggingface.co/answerdotai/ModernBERT-base) (~149M, Apache-2.0)
- Adapter: classify `Linear(768, 9)` + unbind role/filler heads on last-layer token states
-- Freeze: last 2 encoder layers trainable
+- Freeze: last 8 encoder layers trainable on `seed-morph78` (recipe default for seed smoke is last 2)
- Tokenizer: official ModernBERT BPE (`local_files_only`)
- Train box: NVIDIA DGX Spark (GB10), aarch64, `sm_121`
- Packet: `hyperlex.hyperlexical.inference.v0.1`
- Brier: always null. Not a forecast.
-Load the trunk from a local snapshot. Load heads from this directory (`model.safetensors` or `heads.pt`). There is no chat template.
+Load the trunk from a local snapshot. Load heads from the pinned artifact directory (`model.safetensors`). Weights are on Spark only until a Hub upload is authorized. There is no chat template.
```python
from transformers import AutoModel, AutoTokenizer
@@ -48,27 +63,29 @@ Uncensored in the Hyperlex sense: no refusal head on civilian dialect. Dual-use
## Training data
-Git-tracked seed `civilian.v0.1.jsonl` is an 883-row snapshot from fixtures, dialect atoms, registry (INFERRED), golden (INFERRED), and archive (INFERRED). It is **not** the train SoT. T1 train uses the local store / `--include-live` (operator 2026-09-10 PT evening: classify 2437). `name_gate` stays false until E2.
+Git-tracked seed `civilian.v0.1.jsonl` is an 883-row snapshot and is **not** the train SoT. T1 training uses the local store / `--include-live` under operator settlement rules (`seed-morph78`: live rows included 4258, train classify 4062, train unbind 15536). INFERRED typology/stage does not become gold merely by inclusion.
-Do not treat INFERRED typology/stage as gold.
-
-## Eval (pre-train / stub)
+## Eval
| Gate | Status | Note |
|------|--------|------|
-| E0 packet on `rizz` | PASS | stub infer, brier null |
-| E1 classify vs fixture | NOT RUN | needs Spark weights |
-| E2 unbind vs Spec 004 probe | FAIL | stub swap < probe swap. Required for the word Hyperlexical |
-| E3 MiniLM control | NOT RUN | control only, not the card |
-| E4 restricted surface drop | PASS | `__RESTRICTED_FIXTURE__` |
-| E5 schema / walls | PASS | no semantic, no symbolic |
-| E6 dialect no refusal | PASS | `no cap fr` |
+| E0 packet on `rizz` | PASS (stub harness) | not re-run against `seed-morph78` weights |
+| E1 classify vs fixture | NOT_COMPUTABLE | no E1 receipt for `seed-morph78`. Train-receipt val `classify_acc` 0.7733 n=516 is a train metric, not E1 |
+| E2 unbind vs Spec 004 probe | **PASS** | `seed-morph78` trunk-forward: unbind_exact 1.0, token/slot F1 1.0, model_swap 1.0 ≥ probe_swap_min 0.5 |
+| E3 MiniLM control | NOT_COMPUTABLE | control only; no receipt |
+| E4 restricted surface drop | PASS (stub harness) | `__RESTRICTED_FIXTURE__`; not re-run against `seed-morph78` weights |
+| E5 schema / walls | PASS (stub harness) | no semantic, no symbolic |
+| E6 dialect no refusal | PASS (stub harness) | `no cap fr`; not re-run against `seed-morph78` weights |
+
+E2 source: `receipts/morph78-val-settle-20260924/e2-unbind-morph78.json`. That directory's `train-receipt.json` carries `e2_pass: false` because train does not run E2. The separate E2 eval and `GATE_LOCK.json` record the pass. Do not flip any gate by editing this card.
+
+## Naming / publication gate
-After Spark `--run`, replace this table with `train-receipt.json` val metrics and a new `eval_unbind` JSON. Do not flip E2 by editing the card.
+E2 PASS does **not** flip the product name. Public `Hyperlexical` naming, Hub upload, and optional T13 promotion remain separate operator actions. Until explicit `name_gate` authorization, retain `hyperlex-encoder-*` naming and keep weights off git.
## Limitations
-Small seed. Crude first-occurrence aligner if offset mapping is missing. Last-2 freeze not ablated. Encoded slang is US-internet heavy. Not a general NLU encoder.
+First-occurrence aligner fallback if offset mapping is missing (`seed-morph78` used `char_span + offset_mapping`). Small/curated slang surface; US-internet-heavy distribution; registry families are project taxonomies, not demographic labels; no general NLU claim; no forecast authority.
## Bias
diff --git a/specs/007-hyperlexical-model/model-card.draft.md b/specs/007-hyperlexical-model/model-card.draft.md
index b409deca..a4e059b0 100644
--- a/specs/007-hyperlexical-model/model-card.draft.md
+++ b/specs/007-hyperlexical-model/model-card.draft.md
@@ -1,4 +1,9 @@
# Model card
Canonical draft for Hub shape: `hf-package/README.md`.
-Do not upload. Name stays `hyperlex-encoder-modernbert-base-seed` until E2.
+
+**Current trained pin:** `seed-morph78` · soft_ceiling `PROMOTE_BEST` 2026-09-24 · broad OBSERVED **0.9883** n=256 vs PRIOR morph65 **0.8867** n=256 · trained trunk-forward E2 **PASS**. Receipt: `receipts/20260924-morph78-soft-ceiling-promote-best.md`. E1/E3 on this pin: NOT_COMPUTABLE.
+
+Do not upload. Do not rename the public model product yet. The remaining naming wall is explicit operator authorization: `name_gate=false` until Danny says `name_gate yes` or explicitly names Hyperlexical.
+
+Until that authorization, publish-shape identifiers remain `hyperlex-encoder-*`; weights stay off git.
diff --git a/specs/007-hyperlexical-model/spec.md b/specs/007-hyperlexical-model/spec.md
index 764315f5..cb2a5d3a 100644
--- a/specs/007-hyperlexical-model/spec.md
+++ b/specs/007-hyperlexical-model/spec.md
@@ -2,7 +2,7 @@
**Feature**: Learned recoverable-structure encoder for slang atoms
**Date**: 2026-09-09
-**Status**: SPECIFY locked C1–C52 / A5 milestones+engineering / SHADOW implement on main / E2 fail / no Hub
+**Status**: SPECIFY locked C1–C52 / A5 milestones+engineering / SHADOW implement on main / stub E2 fail (expected) / trained E2 PASS on BEST `seed-morph78` (2026-09-24) / `name_gate` false / no Hub
**Depends on**: constitution v1.0.0 I–X; specs 000, 001, 003, 004; 005 route-labels (do not claim `semantic`)
**Does not open**: 006 IsA (reserved)
**Clarify**: `clarify.md` + `locks-a4.md` + `locks-a5.md`
@@ -15,7 +15,7 @@
**Packet**: `hyperlex.hyperlexical.inference.v0.1`
**HF name reserved**: `hyperlex-encoder-*` until unbind gate passes; `hyperlex-structure-*` only after gate
-**Naming:** this spec is the **Hyperlexical** model / train / eval / E2 / `name_gate` claim. Slang harvest and live ingest are **ne0l0gist**. Repo **Hyperlex** is the transitional monorepo shell. `name_gate` stays false until E2.
+**Naming:** this spec is the **Hyperlexical** model / train / eval / E2 / `name_gate` claim. Slang harvest and live ingest are **ne0l0gist**. Repo **Hyperlex** is the transitional monorepo shell. `name_gate` stays false until Danny explicit yes; trained E2 PASS does not flip it.
## Intent
diff --git a/specs/007-hyperlexical-model/status.md b/specs/007-hyperlexical-model/status.md
index ca3f518d..f486b5b1 100644
--- a/specs/007-hyperlexical-model/status.md
+++ b/specs/007-hyperlexical-model/status.md
@@ -28,8 +28,9 @@ Operator scoreboard (Danny-locked harvest snapshot **2026-09-10**; climb pin **2
Next operator sentences that do work:
-- Authorize with **named phrases** on a live empty card, or new `force_expand_safe` acquire — see `NAME-GATE-AND-NAMED-PHRASES.md`
-- soft_ceiling decide / broad OBSERVED path (not force-only at fair 1.0 n=164)
+- Default: **HOLD** `seed-morph78`; operator product review of `HYPERLEXICAL-PRODUCT-PLAN.md`
+- Danny `name_gate` decision; Hub decision; optional T13 decision (each separate)
+- 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
There is no further specify work on 007 without an amendment.
diff --git a/specs/007-hyperlexical-model/tasks.md b/specs/007-hyperlexical-model/tasks.md
index b31fe784..eaaeb068 100644
--- a/specs/007-hyperlexical-model/tasks.md
+++ b/specs/007-hyperlexical-model/tasks.md
@@ -39,4 +39,4 @@ Live counts stay on Notion Tasks 007. Do not rewrite gates when a harvest number
- Load ModernBERT in CI
- Flip `name_gate` (Danny yes)
- Open 006
-- Force-only climb past morph65 fair 1.0 n=164 (soft_ceiling armed instead)
+- Force-only climb at fair 1.0 n=164 (soft_ceiling used instead; that climb closed with morph78 PROMOTE_BEST 2026-09-24)
diff --git a/specs/007-hyperlexical-model/u3-recipe.md b/specs/007-hyperlexical-model/u3-recipe.md
index bbe5f35a..48033474 100644
--- a/specs/007-hyperlexical-model/u3-recipe.md
+++ b/specs/007-hyperlexical-model/u3-recipe.md
@@ -1,6 +1,6 @@
# U3 recipe — Spark train / 004 eval (SHADOW)
-Status: recipe + harness landed. Weights not trained. E2 not passed.
+Status: recipe + harness landed. Trained climb pins exist on Spark; current BEST `seed-morph78` passes trained E2 (2026-09-24). See `STATUS.md`.
## Box
@@ -22,7 +22,7 @@ PYTHONPATH=scripts/shadow python3 -m hyperlexical.export --include-live
T1 / E2 trains from the **local SoT** (`~/.hyperlex/hyperlexical/ingest_candidates.jsonl`) via `--include-live`. Omit `--include-live` only for harness wiring against the tracked seed. Operator `--include-live` (2026-09-10 PT evening): n=6506 · classify 2437 · unbind 1345 · negatives 208 · gaps 0/0/0.
-Name-gate is still false (E2 Spark-blocked). The word Hyperlexical stays off the card until E2 beats 004 on shared fixtures **and** civilian unbind rows exist.
+Name-gate is still false (trained E2 PASS does not flip it; Danny yes required). The word Hyperlexical stays off the card until E2 beats 004 on shared fixtures **and** civilian unbind rows exist.
Do not train on `split=reject`. Do not treat INFERRED typology/stage as OBSERVED gold.
diff --git a/specs/README.md b/specs/README.md
index 0374d997..d8b43599 100644
--- a/specs/README.md
+++ b/specs/README.md
@@ -11,7 +11,7 @@ Constitution: `.specify/memory/constitution.md` (v1.0.0, **SHADOW** until operat
| 004 | Recoverable-structure probe | SPECIFY locked · implement SHADOW | `scripts/shadow/recoverable_structure/` |
| 005 | Route labels | SPECIFY locked (Notion + branch `005-route-labels`) | not on main — PR 18 |
| 006 | IsA | reserved — do not open from 007 | — |
-| 007 | Hyperlexical model | SPECIFY locked C1–C52 · A5 milestones/engineering · SHADOW implement on main | `scripts/shadow/hyperlexical/` + Aaron Spark handoff. E2 fail. No Hub. |
+| 007 | Hyperlexical model | SPECIFY locked C1–C52 · A5 milestones/engineering · SHADOW implement on main | `scripts/shadow/hyperlexical/` + Aaron Spark handoff. Stub E2 fail (expected); trained E2 PASS on BEST `seed-morph78`. `name_gate` false. No Hub. |
007 extras: `clarify.md`, `locks-a4.md`, `locks-a5.md`, `weights.md`, `hardware.md`, `uncensored.md`, `trunk.md`, `AARON-SPARK-TRAIN.md`, `milestones.md`, `engineering.md`, `hf-package/`, `schemas/`, `contracts/`.