diff --git a/.github/workflows/restore-export.yml b/.github/workflows/restore-export.yml new file mode 100644 index 00000000..bb4a42d0 --- /dev/null +++ b/.github/workflows/restore-export.yml @@ -0,0 +1,43 @@ +name: restore-export +on: + workflow_dispatch: + push: + paths: ['.restore/TRIGGER'] +jobs: + assemble: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - name: Assemble decode commit + env: + N_EXPORT: '4' + N_TEST: '2' + EXPORT_SHA: '2d991dc1d48c7bb049c67db21cda407773fe06be42d0b9c95ddd26ae51639ec0' + TEST_SHA: 'd7139d63f5ff284e1ba225215af0f8ff13dfb4d1d9e9bade0aaeb2d7fe5797a7' + run: | + set -euo pipefail + python3 <<'PY' + import base64, zlib, hashlib, os + from pathlib import Path + n_e = int(os.environ['N_EXPORT']) + n_t = int(os.environ['N_TEST']) + ce = ''.join(Path(f'.restore/export.{i:02d}.b64p').read_text().strip() for i in range(n_e)) + ct = ''.join(Path(f'.restore/test.{i:02d}.b64p').read_text().strip() for i in range(n_t)) + e = zlib.decompress(base64.b64decode(ce)) + t = zlib.decompress(base64.b64decode(ct)) + assert b'reject_wiki_scaffolding_text' in e + assert b'_strip_type_slot_tags' in e + assert len(e) > 40000 + assert hashlib.sha256(e).hexdigest() == os.environ['EXPORT_SHA'] + assert hashlib.sha256(t).hexdigest() == os.environ['TEST_SHA'] + Path('scripts/shadow/hyperlexical/export.py').write_bytes(e) + Path('tests/shadow/test_hyperlexical_export.py').write_bytes(t) + print('ok', len(e), len(t)) + PY + git config user.name "Daniel Meyer" + git config user.email "scrimshawlife@gmail.com" + git add scripts/shadow/hyperlexical/export.py tests/shadow/test_hyperlexical_export.py + git commit -m "fix(007): reject type_slot-tagged wiki scaffolding chrome" + git push diff --git a/.restore/TRIGGER b/.restore/TRIGGER new file mode 100644 index 00000000..33b96600 --- /dev/null +++ b/.restore/TRIGGER @@ -0,0 +1 @@ +type_slot_wiki_scaffolding 2026-09-23T21:55:00Z diff --git a/.restore/export.00.b64p b/.restore/export.00.b64p new file mode 100644 index 00000000..8566dde0 --- /dev/null +++ b/.restore/export.00.b64p @@ -0,0 +1 @@ +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 diff --git a/.restore/export.01.b64p b/.restore/export.01.b64p new file mode 100644 index 00000000..f5099fa2 --- /dev/null +++ b/.restore/export.01.b64p @@ -0,0 +1 @@ +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 diff --git a/.restore/export.02.b64p b/.restore/export.02.b64p new file mode 100644 index 00000000..dda37d44 --- /dev/null +++ b/.restore/export.02.b64p @@ -0,0 +1 @@ +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 diff --git a/.restore/export.03.b64p b/.restore/export.03.b64p new file mode 100644 index 00000000..d987e11c --- /dev/null +++ b/.restore/export.03.b64p @@ -0,0 +1 @@ +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 diff --git a/.restore/export.04.b64p b/.restore/export.04.b64p new file mode 100644 index 00000000..2b752f89 --- /dev/null +++ b/.restore/export.04.b64p @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/.restore/export.05.b64p b/.restore/export.05.b64p new file mode 100644 index 00000000..9ff11b46 --- /dev/null +++ b/.restore/export.05.b64p @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/.restore/export.06.b64p b/.restore/export.06.b64p new file mode 100644 index 00000000..55d74084 --- /dev/null +++ b/.restore/export.06.b64p @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/.restore/export.07.b64p b/.restore/export.07.b64p new file mode 100644 index 00000000..f7329782 --- /dev/null +++ b/.restore/export.07.b64p @@ -0,0 +1 @@ +R29Ownf7p6/41PrDajfnvddV36jgRUWybBGJ8zFzkCJHKKz4EiolHA27APO+H5AsbAlMUMGo/yx1iTsZX12X3ZBgja9kaeelpOYpqpGu/Oze5iysdB+swyBOuq9H6NTF3N+YcjX9UaZBE3AtJr4WV46XRqfleK8Wxus4sNpScrMPq/pSl0FarjUlMqJkszkskg/zdEs5v0nuilOVXhJvnIVPFOsd7OdXJCC/wyfM7JhBE87VIjxnSuhZYFRMGKlK1lGWwQDkLKu/CtPGnvXuWiaLMWi4QELQv1QlYqCLTYbtl5oMuf3CGfGabthcwGo7ouRdY4+YQQiCiWx0bC4Br8Sfh0b8GgZBMOxI3fLMJGu1+UtnapNnoslhVDYpTGbW23Z0iYno3GquDYekw5Nl1pWIxmkeGqazAAFhCPajIFTqOcErtaCVKQvbFMCJNQJAB4q61A+sgj7oKhu98s0QUQJaSxxUe1c7GOqEJ7Bki5cxubFB2Lu+oziP0XnCzdmve30r+mds+fRVJEM9uRCKC/DJ9sLAdrS92h+96BK32Uiw/uNJjH7wKD8eCqi9vitt3/cNacFLmkAHGBerIihKEK7zhv9mz75OyNHbpqT28YQo7Gt27S5ngZxyv+LB6P46lWKNCmH32qFduzu1iH83Rmfb1EVYa4ABJyD7YMbOW0z2iUdIcsrFGGBWmMbVAZaz/aUJWZ6O0ORsKEF0mUcfYBHjOc5aIF4ANJh1mUxt4/t7lbHo4sIKEry4wASuSzQCMwohPuhwbHSoK/H44qLH0XgqrJzD4YH9ArnEopgu09wqLjn7XGFdC/oncxXlussDcBoogtq6V8pk79fDrWa/5a4oA6ElVT/jjnfWWMVznM0pT1qiAlAWlMC94WqkyL16rFPV6MPjnTam+d8iq8KmCCZ14tbP6xFEeXVrW/d9UC3nXekSSTpO2rhC0ulyxxV+tTsG+vYFA412dTW6nrdxG5tVcdR1Z6RwbjDYaT1xWPWq8z4AJCtlVC4LO0t2rZObLkuwmqMjjkjXzbvHzQb5Dg785STO99TlH/izoiIUo/QLXkzVeRWnc5RT/1ibW+fhlyi0X57gUQJTNXOyjCfeprw621+j8GnXJzz0WqyPndcNWJclpMRA1ly+4C1wJqGktiYPfmfQRMnMg73dvaeD3X8cPNldByjL46sYI/ssBDQXL9jBGWtgAI+wY2Kr+vUP64BwpHiorG8aY6yXHZXvNycTevA1Et3XR9TzfT04+1DHTREOF2BGNmvlZMgDQHb4aDzD90QFvLYAdIwFCMmnERLlCkPUzMJQES5ORXmywsNxBx/i0ie9DWjM/wOixJ0G \ No newline at end of file diff --git a/.restore/export.part00.txt b/.restore/export.part00.txt new file mode 100644 index 00000000..4aef7f5b --- /dev/null +++ b/.restore/export.part00.txt @@ -0,0 +1,403 @@ +"""U2 civilian exporter. No hyperlex import. No ~/.hyperlex copy.""" + +from __future__ import annotations + +import argparse +import ast +import hashlib +import json +import os +import sys +from pathlib import Path +from typing import Any + +from .packet import RESTRICTED_MARKER, SCHEMES, sha256_hex +from ._negatives_data import NEGATIVES # ordinary prose; no slang +from .unbind_recipe import recipe_env_counts + +FAMILIES = ( + "betting-sharp", + "crypto-degen", + "ai-native", + "brainrot-aura", + "kinship-address", + "political-status", + "gaming-meta", + "workplace-corp", +) + +TYPOLOGY = { + "betting-sharp": ["status"], + "crypto-degen": ["status", "tribal"], + "ai-native": ["compression", "memory", "provenance", "context"], + "brainrot-aura": ["compression", "status"], + "kinship-address": ["tribal"], + "political-status": ["tribal", "irony_shield"], + "gaming-meta": ["status", "hook"], + "workplace-corp": ["camouflage"], +} + + +DIALECT = ( + "no cap fr", + "it's giving", + "locked in", + "crash out", + "left no crumbs", + "chat is this real", + "aura points", + "let him cook", +) + +ROW_KEYS = ( + "text", + "split", + "lineage", + "typology", + "stage", + "roles", + "fillers", + "role_scheme", + "task", + "provenance", + "class", + "license", +) + +COLLISION_HOLD = {"skill issue"} + +# Short slang / numeric codes that len≤2 or numeric filters would false-reject. +# Prefer explicit allowlist over blanket keep of all short/numeric tokens. +SHORT_SLANG_ALLOWLIST = frozenset( + { + "w", + "l", + "ez", + "gg", + "gm", + "gn", + "bs", + "a+", + "ai", + "ak", + "3p", + "ag", + "bf", + "bj", + "bk", + "bm", + "420", + "4/20", + "4:20", + "100", + "404", + "5150", + "10-4", + "304", + "143", + "007", + "411", + "730", + "10-20", + } +) + +# Spec 004 type_slot vocabulary (structural placeholders — not gloss-derived POS). +TYPE_SLOT_TAGS = ("TOKEN", "SLOT", "MARKER") + + +def repo_root() -> Path: + return Path(__file__).resolve().parents[3] + + +def lexical_split(text: str) -> str: + """Frozen hash split. Do not change the hash, modulus, or bucket edges. + + Settle may add rows mid-experiment. A new text gets a bucket from *its* + hash only. Existing texts keep their split — val must not reshuffle. + """ + n = int(sha256_hex(text.lower())[:8], 16) % 10 + if n == 0: + return "test" + if n == 1: + return "val" + return "train" + + +def _norm_class(raw: str | None, default: str) -> str: + val = (raw or default).upper() + if val not in {"OBSERVED", "INFERRED", "SPECULATIVE"}: + return default + if val == "SPECULATIVE": + return "INFERRED" + return val + + +def _norm_role_scheme(raw: Any) -> str | None: + """Fail-closed: recoverable_structure allows positional|type_slot only. + + Dump / harvest leftovers such as ``civilian`` are not a third scheme. + Classify rows with an unknown label drop to None (no unbind gold). + """ + if raw in SCHEMES: + return str(raw) + return None + + +def _row(**kwargs: Any) -> dict[str, Any]: + text = kwargs["text"] + if RESTRICTED_MARKER in text: + raise ValueError("restricted text") + if text.lower() in COLLISION_HOLD and kwargs.get("task") == "classify": + kwargs = dict(kwargs) + kwargs["lineage"] = "none" + kwargs["class"] = "INFERRED" + kwargs["provenance"] = str(kwargs.get("provenance") or "") + ":collision-hold" + out = {k: kwargs.get(k) for k in ROW_KEYS} + # Spec 007 lexical split is train/val/test only. Reject store contamination + # (e.g. blanket-yes wrote split="live") so --include-live cannot bypass the hash split. + split = kwargs.get("split") + if split not in {"train", "val", "test"}: + split = lexical_split(text) + out["split"] = split + out["typology"] = list(out.get("typology") or []) + out["roles"] = list(out.get("roles") or []) + out["fillers"] = list(out.get("fillers") or []) + out["license"] = out.get("license") or "MIT-examples" + out["stage"] = out.get("stage") or "circulating" + out["role_scheme"] = _norm_role_scheme(out.get("role_scheme")) + return out + + +def load_registry(root: Path) -> list[dict[str, Any]]: + path = root / "src" / "hyperlex" / "analysis" / "__init__.py" + tree = ast.parse(path.read_text(encoding="utf-8")) + for node in tree.body: + if isinstance(node, ast.Assign): + targets = node.targets + elif isinstance(node, ast.AnnAssign): + targets = [node.target] + else: + continue + for target in targets: + if ( + isinstance(target, ast.Name) + and target.id == "LINEAGE_REGISTRY" + and node.value is not None + ): + return ast.literal_eval(node.value) + raise RuntimeError("LINEAGE_REGISTRY missing") + + +def harvest_registry(root: Path) -> list[dict[str, Any]]: + rows = [] + for entry in load_registry(root): + fam = entry["family_id"] + if fam not in FAMILIES: + continue + for term in entry.get("terms") or []: + rows.append( + _row( + text=term, + lineage=fam, + typology=TYPOLOGY.get(fam, []), + task="classify", + provenance=f"LINEAGE_REGISTRY:{fam}", + **{"class": "INFERRED"}, + role_scheme=None, + ) + ) + return rows + + +def harvest_receipts(root: Path) -> list[dict[str, Any]]: + rows = [] + gold = root / "examples" / "receipts" / "golden" + if not gold.is_dir(): + return rows + for path in sorted(gold.glob("*.json")): + if path.name == "MANIFEST.json": + continue + data = json.loads(path.read_text(encoding="utf-8")) + lineage = (data.get("analysis") or {}).get("lineage") or {} + fam = lineage.get("family_id") or "none" + if fam not in FAMILIES and fam != "none": + fam = "none" + terms = list(lineage.get("matched_terms") or []) + query = ((data.get("ingest") or {}).get("query") or "").strip() + if query: + terms.append(query) + seen = set() + for term in terms: + if not term or term in seen: + continue + seen.add(term) + rows.append( + _row( + text=term, + lineage=fam, + typology=TYPOLOGY.get(fam, []), + task="classify", + provenance=f"golden:{path.name}", + **{"class": "INFERRED"}, + role_scheme=None, + ) + ) + return rows + + +def harvest_backfill(root: Path) -> list[dict[str, Any]]: + rows = [] + pack_dir = root / "data" / "backfill" / "2026" + if not pack_dir.is_dir(): + return rows + for path in sorted(pack_dir.glob("2026-*.json")): + data = json.loads(path.read_text(encoding="utf-8")) + default = data.get("provenance_default") or "INFERRED" + for item in data.get("terms") or []: + term = (item.get("term") or "").strip() + if not term: + continue + fam = item.get("family_id") or "none" + if fam not in FAMILIES and fam != "none": + fam = "none" + rows.append( + _row( + text=term, + lineage=fam, + typology=TYPOLOGY.get(fam, []), + task="classify", + provenance=f"backfill:{path.name}", + **{"class": _norm_class(item.get("provenance"), default)}, + role_scheme=None, + ) + ) + return rows + + +def harvest_archive(root: Path) -> list[dict[str, Any]]: + rows = [] + archive = root / "docs" / "archive" + if not archive.is_dir(): + return rows + for path in sorted(archive.glob("**/receipts/*.json")): + try: + data = json.loads(path.read_text(encoding="utf-8")) + except json.JSONDecodeError: + continue + lineage = (data.get("analysis") or {}).get("lineage") or {} + fam = lineage.get("family_id") or data.get("lineage_family") or "none" + if fam not in FAMILIES and fam != "none": + fam = "none" + terms = list(lineage.get("matched_terms") or []) + query = ((data.get("ingest") or {}).get("query") or "").strip() + if query: + terms.append(query) + seen = set() + for term in terms: + if not term or term in seen: + continue + seen.add(term) + rows.append( + _row( + text=term, + lineage=fam, + typology=TYPOLOGY.get(fam, []), + task="classify", + provenance=f"archive:{path.relative_to(root).as_posix()}", + **{"class": "INFERRED"}, + role_scheme=None, + ) + ) + return rows + + +def harvest_unbind(n: int = 24) -> list[dict[str, Any]]: + """Spec 004 fixture gold under both schemes. Honest default n=24 (~45 unique). + + Fixture rows are provenance `004:tpr:*` only — not civilian name-gate gold. + """ + sys.path.insert(0, str(repo_root() / "scripts" / "shadow")) + from recoverable_structure.fixtures import make_spans + + rows = [] + spans = make_spans(n=n, length=4, seed=7) + for i, sp in enumerate(spans): + items = list(sp["item_ids"]) + tags = list(sp["type_tags"]) + rows.append( + _row( + text=" ".join(items), + lineage="none", + typology=[], + stage="noise", + roles=[f"pos_{k}" for k in range(len(items))], + fillers=items, + role_scheme="positional", + task="unbind", + provenance=f"004:tpr:positional:{i}", + **{"class": "OBSERVED"}, + ) + ) + rows.append( + _row( + text=" ".join(f"{t}:{it}" for t, it in zip(tags, items)), + lineage="none", + typology=[], + stage="noise", + roles=tags, + fillers=items, + role_scheme="type_slot", + task="unbind", + provenance=f"004:tpr:type_slot:{i}", + **{"class": "OBSERVED"}, + ) + ) + return rows + + +def _structural_type_tags(n: int) -> list[str]: + """Assign Spec 004 TOKEN/SLOT/MARKER by index — not gloss/POS invention.""" + return [TYPE_SLOT_TAGS[i % len(TYPE_SLOT_TAGS)] for i in range(n)] + + +LIVE_UNBIND_MAX_LEN = 80 +LIVE_UNBIND_MAX_TOKENS = 6 +OBSERVED_MW_HARVEST_NAME = "harvest_unbind_observed_mw.jsonl" + + +def _unbind_dual_scheme_rows( + atom: str, + tokens: list[str], + *, + lineage: str, + stage: str, + epistemic: str, + pos_provenance: str, + type_provenance: str, + license: str | None = None, +) -> list[dict[str, Any]]: + """Emit positional + type_slot unbind rows. Fillers = real tokens only.""" + if lineage not in FAMILIES and lineage != "none": + lineage = "none" + extra: dict[str, Any] = {} + if license: + extra["license"] = license + pos = _row( + text=atom, + lineage=lineage, + typology=TYPOLOGY.get(lineage, []), + stage=stage, + roles=[f"pos_{k}" for k in range(len(tokens))], + fillers=tokens, + role_scheme="positional", + task="unbind", + provenance=pos_provenance, + **{"class": epistemic}, + **extra, + ) + tags = _structural_type_tags(len(tokens)) + typ = _row( + text=" ".join(f"{t}:{tok}" for t, tok in zip(tags, tokens)), + lineage=lineage, + \ No newline at end of file diff --git a/.restore/export.zlib.b64 b/.restore/export.zlib.b64 new file mode 100644 index 00000000..3c760e09 --- /dev/null +++ b/.restore/export.zlib.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/.restore/test.00.b64p b/.restore/test.00.b64p new file mode 100644 index 00000000..4dc6ace8 --- /dev/null +++ b/.restore/test.00.b64p @@ -0,0 +1 @@ +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 diff --git a/.restore/test.01.b64p b/.restore/test.01.b64p new file mode 100644 index 00000000..3b4a6404 --- /dev/null +++ b/.restore/test.01.b64p @@ -0,0 +1 @@ +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 diff --git a/.restore/test.02.b64p b/.restore/test.02.b64p new file mode 100644 index 00000000..9354d8fa --- /dev/null +++ b/.restore/test.02.b64p @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/.restore/test.03.b64p b/.restore/test.03.b64p new file mode 100644 index 00000000..c3524871 --- /dev/null +++ b/.restore/test.03.b64p @@ -0,0 +1 @@ +uOulshoRXWbAzFS9Evr4txKfLhc2ZLtLDP4qd+LrvmUehfahDdNr4GlQdgYaZsp71Vsf0SvtGaL06IJ1BzFFI05uudqRU5MJW+McR2Ha4x2t56016S0nU+1EqUPSbajirBTUL/jEtrfj/hYnVhq1RxyYE/p9qeGFXXWxO/7dIbfojtJ3bPYYC1zW/dvHMHbdivPe32M2cvFLqAptbSpVCzZuX6VJXHZ+ba39uPo0aFoHTNyPsdmf6Wy0bd6weSLliQbXWl92a4+7j/sv7IjzOxdWY+Xe5B32JqgeCtdXNiZEVhBnhSTy28MSHotcPuR+vnql9xcwUfa04ZXW++ochaIqT8wnhk1X/qLNMZjorI5Jk9uK65FDYbj8KVqpzY2qVuofgKqZpR2tr5hH2ZzzyyK9YIl5LbXMGN5rIMVH/GiSthYhuWJBwVaDSz6uKASTmMYcv1/EVmCthZs86M9xGwnGr3LLm9aXu6U8Nn+JW37E23yH+1nxDe7hTtpiqK5+j1sLDkeXoh400dXvuCJOBsMAoWvThLEaJ3zlVh/0AbYVz6132cqz3ydLHEXQ9OGryHkUmqPAT+rEnXa+pG4fK010aiBjyO3mVH5rChNmfNMZnxyyJZg+/MYApoD4QaKXBFzw4pLoTyeiX5LzV4nzGjQ6D3zGPBBsQUTML5G4AMtbRH3CBzP2QliuGVjXvf8DkRF1kw== \ No newline at end of file diff --git a/.restore/test.zlib.b64 b/.restore/test.zlib.b64 new file mode 100644 index 00000000..4fd2ccda --- /dev/null +++ b/.restore/test.zlib.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 511789b4..014bd721 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,344 +2,26 @@ ## Unreleased -- **Spec 007 morph66 REJECT_VS_BEST:** residual gold force/hard 164/206 - warm morph65, UPSAMPLE=8 + SECOND_SLOT=2 held. Best **0.9502487562189055** - (ep9, 191/201) < fair morph65 **0.9601990049751243** (n=201). E2 - trunk-forward PASS. BEST stays morph65. Container - `hlx-train-morph66-1789969749` exit 0. Exclusive mem 0.3; Qwen stayed - stopped+disabled. `name_gate=false`. Do not replay same force/hard. - Receipt: `receipts/20260921-morph66-40ep-reject-vs-best.md`. - -- **Spec 007 morph65 PROMOTE_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=10` - warm morph63, second-slot weight 2 held. Best **0.8584070796460177** - (ep6, 194/226) > fair morph63 **0.8539823008849557** (n=226). E2 - trunk-forward PASS (`unbind_exact=1.0`). Spark BEST → morph65. morph63 - weights kept. Container `hlx-train-morph65-1789947808` exit 0. - Exclusive mem 0.3; Qwen stayed stopped+disabled. `name_gate=false`. - Upsample ladder freeze after this step (no 11+). Next: morph66 residual - gold force/hard on fair morph65 **0.9601990049751243** n=201. - Receipt: `receipts/20260921-morph65-40ep-promote-best.md`. - -- **Spec 007 morph64 REJECT_VS_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=9` - warm morph63, second-slot weight 2 held. Best **0.8539823008849557** - (ep28, 193/226) **ties** fair morph63 on n=226. E2 trunk-forward PASS. - Tie is not a promote. BEST stays morph63. Container - `hlx-train-morph64-1789928581` exit 0. Exclusive mem 0.3; Qwen stayed - stopped+disabled. `name_gate=false`. No new gold. - Receipt: `receipts/20260920-morph64-40ep-reject-vs-best.md`. - -- **Spec 007 morph63 PROMOTE_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=8` - warm morph62, second-slot weight 2 held. Best **0.8539823008849557** - (ep13, 193/226) > fair morph62 **0.8495575221238938** (n=226). E2 - trunk-forward PASS (`unbind_exact=1.0`). Spark BEST → morph63. morph62 - weights kept. Container `hlx-train-morph63-1789911656` exit 0. - Exclusive mem 0.3; Qwen stayed stopped+disabled. `name_gate=false`. No new gold. - Receipt: `receipts/20260920-morph63-40ep-promote-best.md`. - -- **Spec 007 morph62 PROMOTE_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=7` - warm morph61, second-slot weight 2 held. Best **0.8495575221238938** - (ep21, 192/226) > fair morph61 **0.8451327433628318** (n=226). E2 - trunk-forward PASS (`unbind_exact=1.0`). Spark BEST → morph62. morph61 - weights kept. Container `hlx-train-morph62-1789896471` exit 0. - Exclusive mem 0.3; Qwen stayed stopped+disabled. `name_gate=false`. No new gold. - Receipt: `receipts/20260920-morph62-40ep-promote-best.md`. - -- **Spec 007 morph61 PROMOTE_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=6` - warm morph60, second-slot weight 2 held. Best **0.8451327433628318** - (ep26, 191/226) > fair morph60 **0.8407079646017699** (n=226). E2 - trunk-forward PASS (`unbind_exact=1.0`). Spark BEST → morph61. morph60 - weights kept. Container `hlx-train-morph61-1789880707` exit 0 after - exclusive remount (Qwen stopped+disabled). `name_gate=false`. No new gold. - Receipt: `receipts/20260920-morph61-40ep-promote-best.md`. - -- **Spec 007 morph60 PROMOTE_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=5` - warm morph59, second-slot weight 2 held. Best **0.8407079646017699** - (ep9, 190/226) > fair morph59 **0.831858407079646** (n=226). E2 - trunk-forward PASS (`unbind_exact=1.0`). Spark BEST → morph60. morph59 - weights kept. Container `hlx-train-morph60-1789829154` exit 0. - `name_gate=false`. No new gold. - Receipt: `receipts/20260919-morph60-40ep-promote-best.md`. - -- **Spec 007 morph59 PROMOTE_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=4` - warm morph58, second-slot weight 2 held. Best **0.831858407079646** - (ep14, 188/226) > fair morph58 **0.8230088495575221** (n=226). E2 - trunk-forward PASS (`unbind_exact=1.0`). Spark BEST → morph59. morph58 - weights kept. Container `hlx-train-morph59-1789803430` exit 0. - `name_gate=false`. No new gold. - Receipt: `receipts/20260919-morph59-40ep-promote-best.md`. - -- **Spec 007 morph58 PROMOTE_BEST:** `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=3` - warm morph56, second-slot weight 2 held. Best **0.8230088495575221** - (ep37, 186/226) > fair morph56 **0.8185840707964602** (n=226). E2 - trunk-forward PASS (`unbind_exact=1.0`). Spark BEST → morph58. morph56 - weights kept. Container `hlx-train-morph58-1789793254` exit 0. - `name_gate=false`. No new gold. - Receipt: `receipts/20260919-morph58-40ep-promote-best.md`. - -- **Spec 007 morph57 REJECT_VS_BEST:** `HYPERLEX_UNBIND_SECOND_SLOT_WEIGHT=3` - warm morph56. Best **0.8185840707964602** (ep34, 185/226) ties fair - morph56 on n=226. E2 PASS. Tie is not a promote. BEST stays morph56. - Container `hlx-train-morph57-1789775196` exit 0. `name_gate=false`. - Receipt: `receipts/20260919-morph57-40ep-reject-tie.md`. - -- **Spec 007 morph56 PROMOTE_BEST:** `HYPERLEX_UNBIND_SECOND_SLOT_WEIGHT=2` - on the morph50 surface. Best **0.8185840707964602** (ep10, 185/226) > - fair morph50 **0.8097345132743363** (n=226). E2 trunk-forward PASS - (`unbind_exact=1.0`). Spark BEST → morph56. morph50 weights kept. - Container `hlx-train-morph56-1789766977` exit 0. `name_gate=false`. - Receipt: `receipts/20260918-morph56-40ep-promote-best.md`. - -- **Earlier Unreleased Spec 007 / docs / P1 entries:** preserved in git at commit `bd3f86c5` (`CHANGELOG.md` blob `4a4481e6`). Restored tip after a docs-push content mishap; full text remains in that blob and in operator payload `MORPH64_REJECT_CHANGELOG.json`. - -## 0.4.0 — Automatic backend pipeline (2026-08-05) - -- `run_pipeline` / CLI `pipeline`: ingest → analyze → receipt → forecasts → score log → Phase 5 risk -- `ingest` and `run` default to the full auto path (`ingest --raw-only` for signal-only) -- Multi-term bags auto-expand to one full result unit per lexicon atom -- Never auto-settles; `brier` always null until operator `settle` -- Package API: `run_pipeline`, `run_one` - -## 0.3.9 — Atomic multi-term seeds (2026-08-05) - -- `split_seed_terms`: longest-match lexicon split (`sigma rizz locked in` → sigma | rizz | locked in) -- Analyze attaches `seed_terms` + `per_term` lineage; primary lineage is best single atom (no density stack) -- Phase 5 auto-expands multi-term seeds → `hyperlex.phase5_multi_term.v1` (use `--no-expand` to blend) -- CLI: `terms-split`; docs/backfill README clarify atomic pack entries -- Scan/cron defaults use atomic queries; risk-schedule expands seed bags into atoms -- Phase 5 archive snapshots re-exported multi-term; examples/docs scrubbed of blended seeds - -## 0.3.8 — Operator loop docs + simplified ingest routing (2026-08-05) - -- Canonical ingest catalog: `hyperlex.intake.sources` (`resolve_source`, `pick_source`, `ROUTE_PRESETS`) -- Prefer `--route offline|live|glossary|social` over raw adapter names (aliases: real→glossary, x→x_search, …) -- CLI: `run` one-shot path, `commands` map, `pending` open forecasts; positional query on `analyze`/`run` -- Structured ingest always on the analyze path; `sources` shows routes + resolve preview -- Docs: `docs/operator-loop.md`, `docs/commands.md`; ingest module rewrite -- Recommendation: burn-in with offline cron + settle before ANN or more Phase 5 surface - -## 0.3.7 — Risk-tier → scan/cron schedule coupling (2026-08-05) - -- `hyperlex.simulation.schedule`: `TIER_POLICY`, `plan_scan_from_risk/term/tier`, `write_scan_plan`, `aggregate_scan_risk` -- CLI: `risk-schedule` + `simulate --mode schedule` (advisory Hermes job envelopes; no auto-register) -- `scan` summaries include `scan_risk_advisory` (lineage coverage → next cadence) -- Examples: `examples/cron/risk-tier-elevated.job.json`, `examples/cron/README.md` -- Docs: cron-live-emergence, phase5, modules/simulation - -## 0.3.6 — Transmission calibration, scenario library, research export (2026-08-05) - -- `calibrate_transmission_params` grid-search β/γ against settled pairs (SPECULATIVE) -- Multi-agent scenario library + `compare_scenarios` presets -- `export_research_packet` paper-ready JSON/Markdown -- CLI: `simulate --mode calibrate|compare|export` - -## 0.3.5 — Hybrid lineage re-rank + domain phylogeny packs (2026-08-05) - -- `match_lineage` hybrid: lexical confidence + capped vector family boost -- Domain packs under `data/phylogeny/` (finance, ai-native, political, regional) -- `build_domain_phylogeny` / `list_domain_packs`; CLI `simulate --mode phylogeny --domain …` - -## 0.3.4 — Vector neighbors on analyze + receipt auto-index (2026-08-05) - -- `detect_memetic_patterns` attaches `analysis.vector_neighbors` when local DB present (`HYPERLEX_VECTOR=auto|1`) -- `emit_receipt` fail-open indexes into `~/.hyperlex/vector.db` -- ROADMAP: vector DB marked complete; hybrid lineage re-rank listed under 5.1 - -## 0.3.3 — Local SQLite vector DB (2026-08-05) - -- `hyperlex.vectordb`: SQLite store at `~/.hyperlex/vector.db` -- Default offline hash embeddings (`hyperlex.hash_ngram_v1.d256`); optional openai_compatible -- Seed from LINEAGE_REGISTRY + `data/backfill/2026` + receipts -- CLI: `vector-seed`, `vector-search`, `vector-stats` -- Docs: `docs/modules/vectordb.md` - -## 0.3.2 — Hallmark redesign: Pages workbench identity (2026-08-05) - -- Custom docs identity: IBM Plex + phosphor-teal tokens (`docs/stylesheets/extra.css`) -- Workbench home: status strip, desk cards (history / install / simulate / status) -- STATUS published on site (`docs/status.md`); Run history elevated in nav -- Archive family stats from receipt summaries (not ledger-only) -- Catalog uses Material card grid for each run snapshot - -## 0.3.1 — Pages as static history of runs (2026-08-05) - -- `export_run_history` writes dated snapshots under `docs/archive/runs//` -- Auto-refresh `docs/archive/latest/` + `catalog.json` + history `index.md` -- CLI: `archive-export --history`, `--phase5`, `archive-catalog` -- Phase 5 scenarios can be appended as publish-safe digests (not full agent dumps) -- Docs/MkDocs: Run history catalog nav; Pages role clarified (static, not live store) - -## 0.3.0 — Phase 5.0 research simulation track (2026-08-05) - -- **Phase 5.0** package `hyperlex.simulation`: - - cultural transmission cascade (`simulate_cultural_transmission`) - - multi-agent memetic roles (`run_multi_agent_memetics`) - - hyperstition risk forecast (`forecast_hyperstition_risk`, `risk_from_analysis`) - - phylogeny scaffold (`build_family_phylogeny`) - - composed scenario (`run_phase5_scenario`) -- CLI: `simulate` (`--mode scenario|transmission|agents|risk|phylogeny`, `--from-analyze`) -- Docs: `docs/phase5.md`, `docs/modules/simulation.md`; ROADMAP/STATUS/SPEC/README refresh -- All Phase 5 outputs **SPECULATIVE**; `brier` always null; no receipt mutation -- API: symbols on `API_EXTENDED` (frozen `API_V1` unchanged) - -## 0.2.12 — YTD 2026 slang backfill + lineage backpropagation (2026-08-05) - -- Curated monthly packs: `data/backfill/2026/` (Jan–Aug) with OBSERVED/INFERRED terms. -- `hyperlex.analysis.backfill` — load, inventory, merge packs into registry overlay. -- `hyperlex.analysis.backprop` — non-mutating rematch of historical receipts; reclassification report only. -- CLI: `lineage-backfill`, `lineage-backprop` (scripts + package entry). -- `LINEAGE_REGISTRY` expanded with 2026 brainrot/AI leaves (`rizz`, `locked in`, `crash out`, `vibe coding`, …). -- `match_lineage(..., registry=)` accepts overlay for backprop without global mutation. -- Integrity rule: never rewrite historical receipt hashes; Brier still null until settlement. -- Docs: `data/backfill/2026/README.md`; slang-lineages backfill section. - -## 0.2.11 — GitHub Pages enabled + long-term analysis archive (2026-08-05) - -- GitHub Pages enabled (Actions build) → https://scrimshawlife-ctrl.github.io/Hyperlex-Hermes-Specs/ -- `archive-export` writes sanitized ingest/analysis snapshots under `docs/archive/` - for long-term review on the docs site (local ~/.hyperlex remains primary store). -- Docs: `docs/archive/README.md`; MkDocs nav includes analysis archive. - -## 0.2.10 — OpenAI-compatible LLM provider, ledger-stats, STATUS (2026-08-05) - -- Governed LLM: `HYPERLEX_LLM_PROVIDER=openai_compatible` (stdlib urllib; fail-closed offline). -- CLI `ledger-stats` aggregates family/stage/source counts from receipt ledger. -- `STATUS.md` skill readiness snapshot. - -## 0.2.9 — Skill doctor, Pages URL, release preflight (2026-08-05) - -- CLI `doctor`: deep Hermes-skill health (files, API_V1, mock analyze, brier null, goldens, compat). -- Expanded `scripts/release_preflight.py` (doctor, diagram, case study, tests). -- MkDocs `site_url` set for GitHub Pages project site. - -## 0.2.8 — Docs site deploy, strict MkDocs, CI case study (2026-08-05) - -- GitHub Pages workflow (`.github/workflows/docs.yml`) builds/deploys MkDocs. -- `scripts/sync_mkdocs_pages.py` rewrites root-doc links for strict builds. -- Skill CI runs case study script; docs ROADMAP mirrored to site. -- MkDocs `--strict` clean (README excluded from site). - -## 0.2.7 — MkDocs site, governed LLM stub, ledger-diff (2026-08-05) - -- MkDocs documentation site (`mkdocs.yml`, optional extra `[docs]`). -- Governed LLM neologism enrichment (`hyperlex.llm`); requires `HYPERLEX_LLM=1` + provider. -- CLI `ledger-diff` compares two receipt snapshots. -- Docs: `docs/modules/llm.md`, `docs/index.md`. - -## 0.2.6 — Case study + cross-domain lineages (2026-08-05) - -- Case study: `examples/case-studies/e2e-mock-scan.md` + `scripts/run_case_study.py`. -- New lineage families: `gaming-meta`, `workplace-corp` (registry, Mermaid, mock seeds, goldens). -- Typology: `labor_identity`; gaming cues on `platform_agency`. - -## 0.2.5 — Virality prediction v0, community drivers, richer neologisms (2026-08-05) - -- `predict_virality` → `analysis.virality.prediction` (SPECULATIVE; not Brier/calibration). -- Semantic variation multi-label community drivers. -- Neologism detector: compound phrases + formation tags. -- Docs: `docs/modules/virality.md`. - -## 0.2.4 — Hermes skill posture, CI, typology, goldens (2026-08-05) - -- Docs: Hyperlex is a **Hermes skill (Python package repo)** — not a separate product app. - `docs/hermes-skill.md` replaces standalone-app framing. -- CI: `PYTHONPATH=src`, offline env, diagram --from-golden step. -- Memetic typology expansion: multi-type rule table + lineage soft prior + transparent rules_hit. -- Golden receipts: kinship-address, political-status (+ typology field in MANIFEST). - -## 0.2.3 — Receipt history diagrams (2026-08-05) - -- `hyperlex.diagrams` — Mermaid lineage distribution, receipt timeline, family graph, per-receipt flow. -- CLI `diagram --from-golden|--from-ledger|--input` writes `.mmd` + optional HTML. -- Docs: `docs/diagrams.md`. - -## 0.2.2 — Docs refresh, market connectors, hyperstition feedback (2026-08-05) - -- Full docs pass: ARCHITECTURE, README, QUICKSTART, RELEASE_NOTES, connectors.md. -- `hyperlex.connectors.market_signal` — market_signal.v1 + forecast_pipeline.v1 packets. -- `hyperlex.connectors.hyperstition_feedback` — advisory stage→f map from settled series. -- CLI: `signal`, `feedback`; `extract_forecasts(..., hyperstition_stage_map=...)`. -- Roadmap: hyperstition feedback + market connectors marked done. - -## 0.2.1 — Standalone app, API freeze, golden receipts, Abraxas modules (2026-08-05) - -- Docs synced: `docs/ROADMAP.md`, `docs/api-v1.md`, `docs/hermes-skill.md`, SPEC/DESIGN. -- Public API v1 freeze via `hyperlex.API_V1`. -- Golden receipt corpus: `examples/receipts/golden/` + MANIFEST. -- Relevant Abraxas capabilities as Hyperlex modules: `hyperlex.compat.abraxas` - (claims, BrierScorePacket, BrierLedgerEntry, operator review, HLX runes). -- Hyperlex never imports Abraxas; hosts may import from Hyperlex. - -## 0.2.0 — Relay, provenance, glossary/X, local package (2026-08-05) - -- Rune/signal relay: `hyperlex.relay` + CLI `relay` + `schemas/rune_envelope.v1.schema.json` -- Enhanced provenance fingerprints on ingest + analysis (`source_fingerprint`, content_hash, locator) -- Glossary expansion (`glossary_expanded`) multi-source pack; X ingest via bearer token / xurl / stub -- Package CLI (`python -m hyperlex` / console script); optional local build via `scripts/publish_pypi.sh` (no public PyPI publish) -- Version 0.2.0 - -## 0.1.3 — Cache, golden series, LIVE_EMERGENCE_SCAN (2026-08-05) - -- Persistent ingest cache (`~/.hyperlex/cache/`) + per-source rate limiting. -- Golden settled series fixture: `examples/calibration/settled_series.v1.json`. -- CLI `scan` (LIVE_EMERGENCE_SCAN) for multi-query cron/autonomous monitoring. -- Hermes cron template: `examples/cron/live-emergence-scan.job.json` + `docs/cron-live-emergence.md`. - -## 0.1.2 — Receipt ledger (2026-08-05) - -- Append-only hash-chained receipt ledger (`~/.hyperlex/receipt_ledger.jsonl`). -- `emit_receipt(..., append_ledger=True)` indexes each receipt (integrity, lineage, path). -- CLI: `emit-receipt`, `list-receipts`, `verify-receipt-ledger`; `analyze --receipt`. -- Hermes skill packaging already on `main` (v0.1.1); this continues the archive path. - -## 0.1.1 — Hermes skill packaging (2026-08-05) - -- Full Hermes skill contract in `SKILL.md` (frontmatter, triggers, procedure, authority). -- Atomic-style `install.sh`: `--dry-run`, `--target`, `--rollback`, `--openclaw`, post-install check/smoke. -- `hyperlex.manifest.yaml` expanded for Hermes/OpenClaw hosts and command surface. -- `skills.sh.json`, `QUICKSTART.md`, `references/hermes-runtime-contract.md`. -- Install target: `~/.hermes/skills/hyperlex`. - - -## 0.1.0 - -- Added executable Hermes skill runtime for standalone use. -- Added `src/hyperlex` implementation package (copied from working engine implementation). -- Added command entrypoint `scripts/hyperlex.py` with `check`, `sources`, `ingest`, `analyze`, `validate`, and `verify-receipt`. -- Added schemas at repository root (`schemas/*.schema.json`) and manifest metadata. -- Added install script and initial command smoke/test surface. -- Updated SKILL/README/SPEC/docs references to reflect implemented runtime surface. - -## Documentation & Lineage (2026-08-05) - -- Added and expanded `docs/slang-lineages.md` (methodology, mutation operators, template, live-feed process). -- Added `schemas/lineage.v1.schema.json` for analysis lineage attachments. -- Implemented `match_lineage()` with confidence scoring; wired into `detect_memetic_patterns`. -- Added `examples/slang-families/` with Mermaid diagrams and HTML renderers. - -## Brier / Calibration (2026-08-05) - -- Design: `docs/brier-calibration.md` (forecast → settlement → atomic/series Brier, Murphy, Yates, BSS). -- Module: `src/hyperlex/calibration/` (`extract_forecasts`, `settle`, `score_pair`, `score_series`). -- Schemas: `forecast.v1`, `settlement.v1`, `brier_series.v1`. -- Removed hardcoded `provenance.brier = 0.89`; open results set `brier: null` with `brier_requires_settlement`. -- DESIGN principle 12: Brier requires settlement; fail-closed `NOT_COMPUTABLE` when outcomes missing. - -## Calibration v1.1 diagnostics (2026-08-05) - -- **Vieira non-negative Yates** (`yates_vieira`): variance mismatch + correlation deficit + bias²; reports ρ when defined. -- **Ferro–Fricker Murphy** (`murphy_ferro`): bias-corrected REL/RES/UNC for small-n series; keeps uncorrected snapshot. -- **Discrimination slope** (`discrimination.delta_f`): mean(f|o=1) − mean(f|o=0). -- Classical Yates enriched with mean_forecast, mean_outcome, cov_fo, var_f, var_o. -- Schema `brier_series.v1` extended; design doc updated. - -## Operator settlement path + score log (2026-08-05) - -- `calibration/score_log.py` — append-only, hash-chained JSONL (`forecast` / `settlement` / `score` events). - Default `~/.hyperlex/score_log.jsonl`; override via `HYPERLEX_SCORE_LOG`, `--log`, or `--repo-log`. -- `settle_and_log` + `recompute_series` / `verify_chain`. -- CLI: `analyze --forecasts [--append-log]`, `extract-forecasts`, `settle`, `score-series`, `verify-score-log`. -- `export.to_brier_ledger_entry` — Abraxas `BrierLedgerEntry.v1`-compatible shape (no Abraxas import). -- `recalibrate.mean_shift_from_series` — advisory only when Yates bias² elevated; does not rewrite history. -- Golden tests: lineage confidence formula, score_pair, score_series empty→NOT_COMPUTABLE, log roundtrip, CLI settle path. -- Result schema: `provenance.brier` may be `null`; analysis may include `lineage`. -- CLI import hardening: package `src/` always shadows `scripts/hyperlex.py` on `sys.path`. +- **Spec 007 tip CI: restore unbind force-train API:** `loop.py` imported + `apply_unbind_force_train` but tip `unbind_recipe.py` lacked the helpers + (`HYPERLEX_UNBIND_FORCE_TRAIN_PATH`, resolve/load/apply). Restored + tests + `tests/shadow/test_hyperlexical_unbind_force_train.py`. + +- **Spec 007 Hyperlexical product plan (draft):** + `specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md` — climb under + soft_ceiling, engineering hygiene, name_gate/Hub packaging, PR triage + (#100 / #99 / #95). Does not flip `name_gate`. + +- **Spec 007 morph74 IN FLIGHT (SoT clean + acquire-settle):** quarantined **57** + INFERRED wiki/scaffolding from Spark SoT; durable `reject_wiki_scaffolding_text`. + Settle `to the moon` + `elo hell` → force/hard **217→221 / 258→262**. Warm + morph65 + `INIT_EXPAND_VOCAB=1`. Fair **0.9880239520958084** n=167. Container + `hlx-train-morph74-1790179734`. Receipts: + `receipts/20260923-sot-clean-acquire-civilian.md`, + `receipts/20260923-morph74-acquire-settle-inflight.md`. + +- **Spec 007 morph73 REJECT_VS_BEST:** expand-warm tied fair **0.9649122807017544** + n=171 → REJECT. Residual AUTHORIZE=0 scaffolding — cleaned for morph74. + +- **Earlier Unreleased Spec 007 / docs / P1 entries:** morph72→morph56 ladder and + 0.4.0… history preserved in branch history / operator workspace `CHANGELOG.md`. diff --git a/NEXT_MOVES_007.md b/NEXT_MOVES_007.md index f09bdacb..f28a4b29 100644 --- a/NEXT_MOVES_007.md +++ b/NEXT_MOVES_007.md @@ -1,29 +1,32 @@ -# Spec 007 — next after morph66 REJECT: label morph65 force residuals (n=201) +# Spec 007 — next: soft_ceiling armed · HOLD empty · product plan drafted -`name_gate=false`. BEST=**morph65**. Upsample ladder frozen. Do not run SECOND_SLOT=4. Do not replay morph66 force/hard. +`name_gate=false`. BEST=**morph65** (held). Upsample freeze = **11+**. Do not run SECOND_SLOT=4. -## Gate result +## Done -morph66 residual-gold **REJECT**: best **0.9502** (191/201) < fair morph65 **0.9602** (193/201). E2 PASS. BEST stays morph65. +- soft_ceiling **ARMED** (live prior broad **0.88671875** n=256). +- morph78 acquire + live residual reprobe → empty gold. +- Operator **`authorize val-settle`** → **CANCELLED_EMPTY_GOLD** (no phrases on HOLD card; no invent OBSERVED). +- Tip CI gap: restored `apply_unbind_force_train` + tests; restored `route_rows` / reviewed refuse-before-write in `loop.py`. +- Local full suite **702 passed** (shadow 365). CI validate re-check after tip push. +- Draft product plan: `specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md`. -## 0.95 bar +## Gate (armed) -On post-force fair surface n=201, morph65 already clears ~0.95 (**0.9602**). Gap to 1.0 = **8 exacts**. +**soft_ceiling_tiebreak:** force-fair <1.0 → classic; =1.0 → broad OBSERVED > PRIOR live + E2. -## Prepared dump (Spark) +## PR triage (no merge without authorize) -`~/hlx-private/p1-spark-morph65-force-residuals-20260921/` — morph65 misses on force surface: **8 INFERRED** (type_slot 6 / positional 2). Receipt: `receipts/20260921-morph65-force-residuals-n201.json`. +| PR | State | Action | +|----|-------|--------| +| **#100** pytrends | CI green, mergeable | Recommend merge after operator live `--route trends` check | +| **#99** Spec 007 tip | draft; validate was red → force-train restore | Stay draft until CI green + merge yes | +| **#95** HYPERLEX-Q1 | draft; base stale vs main | Keep draft; rebase onto main; remains UNQUALIFIED | -## One card +## Next -METHOD morph43 AUTHORIZE / ABSTAIN only on those 8. Expect many wiki/scaffold ABSTAINs. If AUTHORIZE ≥1: expand force/hard, re-fair morph65, one gold-knob morph67 warm morph65 (UPSAMPLE=8, SECOND_SLOT=2 held). +1. Await authorize with **named phrases**, or a new acquire that clears Jev `force_expand_safe`. +2. Operator review of `HYPERLEXICAL-PRODUCT-PLAN.md` (climb → hygiene → name_gate → Hub). +3. Do not re-burn empty settles. -| not this card | | -|--|--| -| upsample 11+ | frozen | -| SECOND_SLOT=4 | blocked | -| replay morph66 force/hard | rejected | -| invent OBSERVED | forbidden | -| Hub / name_gate | false | - -Qwen stays stopped unless the operator re-enables `qwen38-27b.service`. +Qwen stays stopped unless re-enabled. diff --git a/STATUS.md b/STATUS.md index 8d4dae28..56628de4 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,8 +3,8 @@ **Naming:** repo **Hyperlex** is the transitional monorepo shell. Public products: **Hyperlexical** (Spec 007 model / train / eval / E2 / `name_gate` claim) and **ne0l0gist** (slang ingest). `name_gate` remains false. **Version:** 0.4.0 -**Observed:** 2026-09-12 -**Posture:** Hermes skill = current operator surface. Spec 007 = model path (SHADOW). Spark BEST = `seed-morph65` (**PROMOTE** — 0.8584070796460177 ep6 > fair morph63 0.8539823008849557 n=226; E2 PASS). `name_gate` still false. +**Observed:** 2026-09-23 +**Posture:** Hermes skill = current operator surface. Spec 007 = model path (SHADOW). Spark BEST = `seed-morph65`. soft_ceiling **ARMED**. Live broad **0.8867** n=256. morph78 GOLD empty. Operator `authorize val-settle` → **CANCELLED_EMPTY_GOLD** (no phrases). Product plan drafted (`HYPERLEXICAL-PRODUCT-PLAN.md`). Open PRs triaged (#100 recommend / #99 CI fix / #95 rebase). `name_gate` still false. **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 @@ -51,7 +51,7 @@ Danny ~2500 candidate bar: **met**. Hermes **913** / “gap to 2500” is **supe |------|--------| | Classify volume | **Ready** — operator `--include-live` family classify **2437** (≥2k). name_gate gaps **0 / 0 / 0** on that surface. | | `name_gate` | **false** — E2 PASS on Spark does **not** flip the gate. Danny yes still required. Volume ≠ name. | -| Spark BEST | **`seed-morph65`** — pin `unbind_exact=0.8584070796460177` (ep6, 194/226) > fair morph63 0.8539823008849557. E2 PASS. Ladder ≥0.55 **HIT**. LAST_TRAINABLE_MAX=8 **HIT**. Upsample ladder frozen. | +| Spark BEST | **`seed-morph65`** — force fair **1.0** n=164. soft_ceiling **ARMED** (live prior broad 0.8867 n=256). morph78 acquire HOLD **empty gold**. E2 PASS. 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 | Not allowed. Card stays `hyperlex-encoder-*` until Danny yes on `name_gate`. | @@ -101,9 +101,9 @@ Pages overview: [SHADOW encoder (007)](docs/shadow-hyperlexical.md) | Ingest routes + automatic pipeline | Ready | | Atomic multi-term seeds | Ready | | Analysis enrichment (compression_metrics, typology tags, signal_report, integrity header) | Ready | -| Local attractor store (`~/.hyperlex/signals/`) | Ready (`inbox list|push|clear`) | +| Local attractor store (`~/.hyperlex/signals/`) | Ready (`inbox list\|push\|clear`) | | Attractor candidate rune (`RUNE.HLX.ATTRACTOR_CANDIDATE`) | Ready (advisory only) | -| Spec 007 model path (T0→T1) | SHADOW · Spark BEST morph65 (0.8584 ep6 n=226) · fair morph63 0.8540 · E2 PASS · ladder ≥0.55 HIT · LAST=8 MAX · upsample frozen · `name_gate` false · no Hub · not named Hyperlexical | +| Spec 007 model path (T0→T1) | SHADOW · Spark BEST morph65 · soft_ceiling ARMED · force fair 1.0 n=164 · live broad prior 0.887 n=256 · E2 PASS · LAST=8 · upsample freeze 11+ · morph69–77 closed · next fresh acquire morph78 · `name_gate` false · no Hub · not named Hyperlexical | | 007 live ingest tap | SHADOW · pipeline/analyze/scan fail-open → `~/.hyperlex/hyperlexical/ingest_candidates.jsonl` · INFERRED only | | Public PyPI | Not planned | | External system hard import | Never | @@ -142,7 +142,7 @@ data/backfill/2026/ ## Recommended next -1. Spark BEST = **morph65** (held). morph66 residual-gold **REJECT** (0.9502 < fair 0.9602 n=201). Upsample ladder **frozen**. Do not replay morph66 force/hard or second-slot 4. **Next:** METHOD-label morph65 force residuals (8 INFERRED on n=201). See `NEXT_MOVES_007.md` / `receipts/20260921-morph66-40ep-reject-vs-best.md`. +1. Spark BEST = **morph65**. soft_ceiling **ARMED**. `authorize val-settle` → **CANCELLED_EMPTY_GOLD**. Await authorize listing **named phrases**. See `receipts/20260923-authorize-val-settle-cancelled-empty-gold.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/scripts/shadow/hyperlexical/export.py b/scripts/shadow/hyperlexical/export.py index f8e52eab..0e5bb468 100644 --- a/scripts/shadow/hyperlexical/export.py +++ b/scripts/shadow/hyperlexical/export.py @@ -671,10 +671,64 @@ def dedupe(rows: list[dict[str, Any]]) -> list[dict[str, Any]]: return [best[k] for k in order] +def _strip_type_slot_tags(text: str) -> str: + """Recover underlying phrase from ``TOKEN:x SLOT:y`` type_slot display text.""" + parts: list[str] = [] + for tok in (text or "").split(): + if ":" in tok and tok.split(":", 1)[0] in TYPE_SLOT_TAGS: + parts.append(tok.split(":", 1)[1]) + else: + parts.append(tok) + return " ".join(parts) + + +def reject_wiki_scaffolding_text(text: str) -> str | None: + """Return reject reason for wiki/dictionary chrome, else None. + + Keeps civilian slang atoms; drops etymology / quotations / synonym-table / + language-gloss / Trends / declension scaffolding that walls unbind val. + Also rejects type_slot-tagged forms of the same chrome + (``TOKEN:Alternative SLOT:form …``), which otherwise miss contiguous + substring checks. Does not invent or settle OBSERVED. + """ + raw = (text or "").strip() + if not raw: + return None + candidates = [raw, _strip_type_slot_tags(raw)] + for cand in candidates: + low = cand.lower() + # Dictionary / wiktionary chrome (substring, case-insensitive). + for needle, reason in ( + ("etymology", "wiki_etymology"), + ("google trends", "wiki_trends"), + ("alternative form of", "wiki_alt_form"), + ("alternative letter-case form of", "wiki_alt_form"), + ("declension of", "wiki_declension"), + ("wiktionary", "wiki_wiktionary"), + ("quotations ▼", "wiki_quotations"), + ("▲quotations", "wiki_quotations"), + ("synonym ▲", "wiki_synonym_table"), + ("antonym ▲", "wiki_antonym_table"), + ("synonym:", "wiki_synonym_table"), + ("antonym:", "wiki_antonym_table"), + ("(neologism)", "wiki_neologism_gloss"), + ("armenian:", "wiki_lang_gloss"), + ("show ▼", "wiki_declension"), + ): + if needle in low: + return reason + # Language-label gloss dumps: "Armenian: …" already covered; bare ▼/▲ UI chrome + # only when paired with dictionary lemmata (handled above) or lone UI tokens. + if cand in {"▼", "▲", "quotations ▼", "▲quotations"}: + return "wiki_ui_chrome" + return None + + def reject_candidate_text(text: str) -> str | None: """Return reject reason for junk live candidates, else None. - Filters: empty/punct-only, len≤2, pure numeric, Unsupported titles. + Filters: empty/punct-only, len≤2, pure numeric, Unsupported titles, + wiki/dictionary scaffolding chrome. SHORT_SLANG_ALLOWLIST exempts known slang/codes from len/numeric kills. Does not promote or settle labels. """ @@ -696,6 +750,9 @@ def reject_candidate_text(text: str) -> str | None: return "len_le_2" if "unsupported title" in low or low.startswith("unsupported"): return "unsupported_title" + scaff = reject_wiki_scaffolding_text(raw) + if scaff: + return scaff return None @@ -832,6 +889,11 @@ def _formed_unbind_row(raw: dict[str, Any]) -> dict[str, Any] | None: roles = [str(t) for t in (raw.get("roles") or []) if str(t).strip()] if not text or not fillers or len(roles) != len(fillers): return None + # Sidecar / store formed rows must still fail closed on wiki chrome. + if reject_candidate_text(text) or reject_wiki_scaffolding_text( + " ".join(fillers) + ): + return None epistemic = _live_unbind_epistemic(raw) lineage = _live_unbind_lineage(raw) stage = str(raw.get("stage") or "").strip() or "circulating" diff --git a/scripts/shadow/hyperlexical/loop.py b/scripts/shadow/hyperlexical/loop.py index 6962faa0..920a7c8c 100644 --- a/scripts/shadow/hyperlexical/loop.py +++ b/scripts/shadow/hyperlexical/loop.py @@ -1,8 +1,4 @@ -"""Spark train loop. Gate only. - -Routing change provenance: Notion Sprint 001 Hub NOT_COMPUTABLE + Loop 805 Slice N/A -+ Hash: b3eee725054c1ed1dae16fad3464af005edad0cc (base). -""" +"""Spark train loop. Gate only.""" from __future__ import annotations @@ -23,7 +19,13 @@ label_maps, resolve_last_trainable, ) -from .save_pretrained import collect_encoder_trainable, save_heads, write_skeleton +from .eval_forward import apply_encoder_trainable +from .save_pretrained import ( + collect_encoder_trainable, + save_heads, + split_weight_tensors, + write_skeleton, +) from .training_routing import route_rows from .unbind_curriculum import ( plan_unbind_curriculum, @@ -32,6 +34,7 @@ ) from .unbind_metrics import mapped_filler, mapped_pred, summarize_unbind_pairs from .unbind_recipe import ( + apply_unbind_force_train, resolve_unbind_inferred_weight, resolve_unbind_morph_margin, shape_unbind_train, @@ -58,10 +61,265 @@ UNBIND_LOSS_WEIGHT_ENV = "HYPERLEX_UNBIND_LOSS_WEIGHT" UNBIND_EVERY_N_ENV = "HYPERLEX_UNBIND_EVERY_N" +SAVE_BEST_UNBIND_ENV = "HYPERLEX_SAVE_BEST_UNBIND" +INIT_FROM_ENV = "HYPERLEX_INIT_FROM" +INIT_EXPAND_VOCAB_ENV = "HYPERLEX_INIT_EXPAND_VOCAB" UNBIND_LOSS_WEIGHT_DEFAULT = 1.0 UNBIND_EVERY_N_DEFAULT = 1 +def resolve_save_best_unbind(raw: str | None = None) -> bool: + """When true, persist best-by-val-unbind_exact weights as primary model.safetensors. + + morph35 peak-not-saved: epoch_metrics recorded ep16 0.5372 but only final + weights were written. Opt-in via HYPERLEX_SAVE_BEST_UNBIND=1. + """ + if raw is None: + raw = os.environ.get(SAVE_BEST_UNBIND_ENV) + if raw is None or (isinstance(raw, str) and not raw.strip()): + return False + return str(raw).strip().lower() in {"1", "true", "yes", "on"} + + +def resolve_init_from(raw: str | None = None) -> Path | None: + """Optional warm-start dir with model.safetensors (or heads.pt). + + Opt-in via HYPERLEX_INIT_FROM=/path/to/prior seed (e.g. morph36 best). + """ + if raw is None: + raw = os.environ.get(INIT_FROM_ENV) + if raw is None or (isinstance(raw, str) and not raw.strip()): + return None + path = Path(str(raw).strip()).expanduser() + if not path.is_dir(): + raise ValueError(f"{INIT_FROM_ENV} must be an existing directory, got {path}") + return path + + +def resolve_init_expand_vocab(raw: str | None = None) -> bool: + """When true, warm-load remaps shared role/filler rows into expanded vocabs. + + Default fail-closed on vocab mismatch. Opt-in via HYPERLEX_INIT_EXPAND_VOCAB=1 + so a smaller prior seed (e.g. morph65 max pos_5) can warm a harvest that added + pos_6+/new fillers: copy overlapping labels by name, leave new rows at init. + """ + if raw is None: + raw = os.environ.get(INIT_EXPAND_VOCAB_ENV) + if raw is None or (isinstance(raw, str) and not raw.strip()): + return False + return str(raw).strip().lower() in {"1", "true", "yes", "on"} + + +def _init_weight_path(init_dir: Path) -> Path: + for name in ("model.safetensors", "heads.pt"): + candidate = init_dir / name + if candidate.is_file(): + return candidate + raise FileNotFoundError( + f"{INIT_FROM_ENV}={init_dir} missing model.safetensors or heads.pt" + ) + + +def _read_init_vocabs(init_dir: Path) -> tuple[list | None, list | None]: + for name in ("layout.json", "config.json"): + path = init_dir / name + if not path.is_file(): + continue + try: + blob = json.loads(path.read_text(encoding="utf-8")) + except json.JSONDecodeError: + continue + if not isinstance(blob, dict): + continue + role = blob.get("role_vocab") + filler = blob.get("filler_vocab") + if isinstance(role, list) and isinstance(filler, list) and filler: + return role, filler + return None, None + + +def _remap_linear_rows(module, state: dict, init_labels: list, current_labels: list, head: str) -> dict: + """Copy overlapping out-rows from init Linear state into current module by label name.""" + weight = state.get("weight") + if weight is None: + raise ValueError(f"{INIT_FROM_ENV} {head} missing weight") + if int(getattr(weight, "shape", [0])[0]) != len(init_labels): + raise ValueError( + f"{INIT_FROM_ENV} {head} weight rows {tuple(weight.shape)} != " + f"init vocab {len(init_labels)}" + ) + if int(module.weight.shape[0]) != len(current_labels): + raise ValueError( + f"{INIT_FROM_ENV} {head} module rows {tuple(module.weight.shape)} != " + f"current vocab {len(current_labels)}" + ) + current_of = {lab: i for i, lab in enumerate(current_labels)} + mapped = 0 + skipped = 0 + for ii, lab in enumerate(init_labels): + ci = current_of.get(lab) + if ci is None: + skipped += 1 + continue + module.weight.data[ci].copy_(weight[ii].detach()) + mapped += 1 + bias = state.get("bias") + if bias is not None and module.bias is not None: + if int(getattr(bias, "shape", [0])[0]) != len(init_labels): + raise ValueError( + f"{INIT_FROM_ENV} {head} bias rows != init vocab {len(init_labels)}" + ) + for ii, lab in enumerate(init_labels): + ci = current_of.get(lab) + if ci is None: + continue + module.bias.data[ci].copy_(bias[ii].detach()) + if mapped == 0: + raise ValueError( + f"{INIT_FROM_ENV} {head} expand remap matched 0/{len(init_labels)} labels" + ) + return { + "mapped": mapped, + "skipped_init_only": skipped, + "new_current_rows": len(current_labels) - mapped, + "init_n": len(init_labels), + "current_n": len(current_labels), + } + + +def warm_load_checkpoint( + encoder, + classify, + role_head, + filler_head, + maps: dict, + init_dir: Path, + *, + expand_vocab: bool | None = None, +) -> dict: + """Load heads + trainable encoder tensors from a prior seed dump. Fail closed. + + When expand_vocab is true (or HYPERLEX_INIT_EXPAND_VOCAB=1), role/filler heads + remap overlapping labels by name into the current larger vocab; classify still + loads strict. Default remains exact-vocab match. + """ + if expand_vocab is None: + expand_vocab = resolve_init_expand_vocab() + weight_path = _init_weight_path(init_dir) + init_roles, init_fillers = _read_init_vocabs(init_dir) + cur_roles = list(maps.get("role_vocab") or []) + cur_fillers = list(maps.get("filler_vocab") or []) + roles_match = init_roles is None or init_roles == cur_roles + fillers_match = init_fillers is None or init_fillers == cur_fillers + vocab_match = roles_match and fillers_match + if not vocab_match and not expand_vocab: + if init_roles is not None and init_roles != cur_roles: + raise ValueError( + f"{INIT_FROM_ENV} role_vocab mismatch vs current export " + f"(init={len(init_roles)} current={len(cur_roles)})" + ) + raise ValueError( + f"{INIT_FROM_ENV} filler_vocab mismatch vs current export " + f"(init={len(init_fillers or [])} current={len(cur_fillers)})" + ) + if not vocab_match and expand_vocab: + if init_roles is None or init_fillers is None: + raise ValueError( + f"{INIT_EXPAND_VOCAB_ENV}=1 requires init role_vocab+filler_vocab " + f"in {init_dir}/config.json (or layout.json)" + ) + + if weight_path.name == "model.safetensors": + from safetensors.torch import load_file + + split = split_weight_tensors(load_file(str(weight_path), device="cpu")) + heads_blob = None + else: + import torch + + try: + blob = torch.load(str(weight_path), map_location="cpu", weights_only=False) + except TypeError: + blob = torch.load(str(weight_path), map_location="cpu") + if not isinstance(blob, dict): + raise ValueError(f"{weight_path} is not a heads state dict") + split = { + "classify": blob.get("classify") or {}, + "role_head": blob.get("role_head") or {}, + "filler_head": blob.get("filler_head") or {}, + "encoder": { + k: v + for k, v in ( + {} if not isinstance(blob.get("encoder"), dict) else blob["encoder"] + ).items() + }, + } + # normalize encoder keys to encoder.* for apply_encoder_trainable + enc = {} + for k, v in split["encoder"].items(): + key = str(k) + enc[key if key.startswith("encoder.") else f"encoder.{key}"] = v + split["encoder"] = enc + heads_blob = blob + + classify_state = split.get("classify") or {} + if not classify_state: + raise ValueError(f"{weight_path} missing classify tensors") + classify.load_state_dict(classify_state, strict=True) + + expand_receipt: dict = { + "expand_vocab": bool(expand_vocab and not vocab_match), + "vocab_match": vocab_match, + } + if vocab_match or not expand_vocab: + for name, module in (("role_head", role_head), ("filler_head", filler_head)): + state = split.get(name) or {} + if not state: + raise ValueError(f"{weight_path} missing {name} tensors") + module.load_state_dict(state, strict=True) + else: + role_state = split.get("role_head") or {} + filler_state = split.get("filler_head") or {} + if not role_state or not filler_state: + raise ValueError(f"{weight_path} missing role_head/filler_head tensors") + expand_receipt["role"] = _remap_linear_rows( + role_head, role_state, list(init_roles), cur_roles, "role_head" + ) + expand_receipt["filler"] = _remap_linear_rows( + filler_head, filler_state, list(init_fillers), cur_fillers, "filler_head" + ) + + applied = apply_encoder_trainable(encoder, split.get("encoder") or {}) + if applied["present"] and applied["loaded"] == 0: + raise ValueError( + f"{INIT_FROM_ENV} encoder tensors present but none matched trunk keys" + ) + return { + "init_from": str(init_dir), + "weight_file": weight_path.name, + "encoder_trainable_loaded": applied["loaded"], + "encoder_trainable_present": applied["present"], + "heads_blob": bool(heads_blob), + "init_expand_vocab": bool(expand_vocab), + **expand_receipt, + } + + +def _cpu_module_state(module) -> dict: + return {k: v.detach().cpu().contiguous() for k, v in module.state_dict().items()} + + +def _build_weight_state(encoder, classify, role_head, filler_head, maps, layout) -> dict: + return { + "classify": _cpu_module_state(classify), + "role_head": _cpu_module_state(role_head), + "filler_head": _cpu_module_state(filler_head), + "encoder": collect_encoder_trainable(encoder), + "maps": {k: v for k, v in maps.items() if k not in {"family_of", "role_of", "filler_of"}}, + "layout": layout, + } + + def resolve_unbind_loss_weight(raw: str | float | int | None = None) -> float: """Scale on unbind loss before backward. Default 1.0. Fail-closed if invalid.""" if raw is None: @@ -100,11 +358,17 @@ def should_interleave_unbind(classify_batch_index: int, every_n: int) -> bool: def prepare_unbind_splits(rows: list) -> tuple[list, list, dict]: - """Train recipe only. Val list is untouched (frozen lexical split).""" + """Train recipe after route_rows. Val frozen unless force-train env is set. + + ``HYPERLEX_UNBIND_FORCE_TRAIN_PATH`` may move authorized OBSERVED exacts + from val→train (accept-style). Empty/unset → val untouched. + """ routed, _ = route_rows(rows) train = routed["unbind"]["train"] val = routed["unbind"]["val"] + train, val, force_stats = apply_unbind_force_train(train, val) shaped, stats = shape_unbind_train(train) + stats = {**stats, **force_stats} return shaped, val, stats @@ -180,6 +444,15 @@ def run_loop( classify = nn.Linear(hidden, len(FAMILIES)) role_head = nn.Linear(hidden, len(maps["role_vocab"])) filler_head = nn.Linear(hidden, len(maps["filler_vocab"])) + init_from = resolve_init_from() + init_receipt: dict = {"init_from": None, "warm_start": False} + if init_from is not None: + init_receipt = { + "warm_start": True, + **warm_load_checkpoint( + encoder, classify, role_head, filler_head, maps, init_from + ), + } trainable = [p for p in encoder.parameters() if p.requires_grad] + list(classify.parameters()) + list(role_head.parameters()) + list(filler_head.parameters()) opt = AdamW(trainable, lr=float(os.environ.get("HYPERLEX_TRAIN_LR", "2e-5"))) epochs = int(os.environ.get("HYPERLEX_TRAIN_EPOCHS", "2")) @@ -253,7 +526,12 @@ def unbind_loss(row): aux_lambda=UNBIND_SLOT_CE_AUX_LAMBDA, ) + # Keep last train loss on-device; avoid per-step .cpu() sync (morph68 hang: + # post-SAVE_BEST host spin at ~98% CPU / GPU util 0 with mem held). + last_train_loss = None + def step_unbind(row) -> None: + nonlocal last_train_loss if unbind_loss_weight == 0: return uloss = unbind_loss(row) @@ -264,10 +542,16 @@ def step_unbind(row) -> None: opt.zero_grad() scaled.backward() opt.step() - losses.append(float(scaled.detach().cpu())) + last_train_loss = scaled.detach() residual_dump_path = resolve_unbind_residual_dump_path() last_residual_records: list[dict] = [] + save_best_unbind = resolve_save_best_unbind() + best_exact = float("-inf") + best_metrics: dict | None = None + best_state: dict | None = None + best_residual_records: list[dict] = [] + progress_path = out_dir / "epoch-progress.jsonl" @torch.no_grad() def score(): @@ -317,6 +601,12 @@ def score(): metrics["n_classify_eval"] = tot return metrics + out_dir.mkdir(parents=True, exist_ok=True) + layout = describe(maps) + layout["last_trainable"] = last_trainable_used + layout["aligner"] = "char_span + offset_mapping" + write_skeleton(out_dir, maps=maps) + for ep in range(epochs): phase_rows, phase_meta = select_unbind_for_epoch(unbind_tr, ep, curriculum) unbind_cycle = 0 @@ -329,7 +619,7 @@ def score(): opt.zero_grad() loss.backward() opt.step() - losses.append(float(loss.detach().cpu())) + last_train_loss = loss.detach() if should_interleave_unbind(classify_batch_i, unbind_every_n) and phase_rows: step_unbind(phase_rows[unbind_cycle % len(phase_rows)]) unbind_cycle += 1 @@ -342,22 +632,86 @@ def score(): metrics["n_unbind_phase"] = phase_meta["n_rows"] metrics["unbind_phase_fallback_full_mix"] = phase_meta["fallback_full_mix"] epoch_metrics.append(metrics) + exact = float(metrics.get("unbind_exact") or 0.0) + if last_train_loss is not None: + # One host sync per epoch (not per step). + losses.append(float(last_train_loss.item())) + saved_best = False + if save_best_unbind and exact > best_exact: + if device.type == "cuda": + torch.cuda.synchronize() + best_exact = exact + best_metrics = dict(metrics) + best_state = _build_weight_state( + encoder, classify, role_head, filler_head, maps, layout + ) + best_residual_records = list(last_residual_records) + best_dir = out_dir / "best" + write_skeleton(best_dir, maps=maps) + save_heads(best_dir, best_state) + (best_dir / "best-checkpoint.json").write_text( + json.dumps( + { + "metric": "unbind_exact", + "epoch": ep, + "unbind_exact": exact, + "unbind_token_f1": best_metrics.get("unbind_token_f1"), + "unbind_slot_f1": best_metrics.get("unbind_slot_f1"), + "classify_acc": best_metrics.get("classify_acc"), + }, + indent=2, + sort_keys=True, + ) + + "\n", + encoding="utf-8", + ) + saved_best = True + if device.type == "cuda": + torch.cuda.synchronize() + torch.cuda.empty_cache() + # Durable heartbeat — morph68 hung silently after ep4 with frozen docker logs. + progress = { + "epoch": ep, + "unbind_exact": exact, + "best_unbind_exact": None if best_exact == float("-inf") else best_exact, + "saved_best": saved_best, + "n_unbind_phase": phase_meta["n_rows"], + "unbind_phase": phase_meta["phase"], + "classify_acc": metrics.get("classify_acc"), + } + with progress_path.open("a", encoding="utf-8") as pf: + pf.write(json.dumps(progress, sort_keys=True) + "\n") + pf.flush() + print( + f"[epoch {ep}] unbind_exact={exact:.6f} best={best_exact if best_exact != float('-inf') else None} saved_best={saved_best}", + flush=True, + ) + + final_state = _build_weight_state( + encoder, classify, role_head, filler_head, maps, layout + ) + # Always write final epoch weights under a distinct name when best-save is on, + # then promote best → primary model.safetensors (fixes morph35 peak-not-saved). + if save_best_unbind and best_state is not None: + final_file = save_heads(out_dir, final_state) + # rename primary final dump aside, then write best as primary + final_path = out_dir / final_file + aside = out_dir / ( + "model.final.safetensors" if final_file == "model.safetensors" else "heads.final.pt" + ) + if final_path.exists(): + final_path.replace(aside) + weight_file = save_heads(out_dir, best_state) + primary_val = best_metrics or {} + gated_from = "best_unbind_exact" + residual_for_dump = best_residual_records + else: + weight_file = save_heads(out_dir, final_state) + primary_val = epoch_metrics[-1] if epoch_metrics else {} + gated_from = "final_epoch" + residual_for_dump = last_residual_records + aside = None - out_dir.mkdir(parents=True, exist_ok=True) - layout = describe(maps) - layout["last_trainable"] = last_trainable_used - layout["aligner"] = "char_span + offset_mapping" - encoder_state = collect_encoder_trainable(encoder) - state = { - "classify": classify.state_dict(), - "role_head": role_head.state_dict(), - "filler_head": filler_head.state_dict(), - "encoder": encoder_state, - "maps": {k: v for k, v in maps.items() if k not in {"family_of", "role_of", "filler_of"}}, - "layout": layout, - } - write_skeleton(out_dir, maps=maps) - weight_file = save_heads(out_dir, state) last = epoch_metrics[-1] if epoch_metrics else {} residual_receipt: dict = { "unbind_residual_dump": "", @@ -365,7 +719,7 @@ def score(): "unbind_residual_themes": {}, } if residual_dump_path: - residual_receipt = write_residual_dump(residual_dump_path, last_residual_records) + residual_receipt = write_residual_dump(residual_dump_path, residual_for_dump) receipt = { "schema": "hyperlex.hyperlexical.train_receipt.v0.1", "model_id": MODEL_ID_SEED, @@ -378,7 +732,7 @@ def score(): "task_accounting": task_accounting, "n_train_unbind": len(unbind_tr), "n_unfrozen_encoder": n_unfrozen, - "n_encoder_tensors": len(encoder_state), + "n_encoder_tensors": len(final_state.get("encoder") or {}), "last_trainable": last_trainable_used, "unbind_loss_weight": unbind_loss_weight, "unbind_every_n": unbind_every_n, @@ -405,6 +759,12 @@ def score(): "unbind_hard_atoms_path": unbind_recipe.get("unbind_hard_atoms_path", ""), "unbind_hard_upsample": unbind_recipe.get("unbind_hard_upsample", 1), "n_unbind_hard_atoms_matched": unbind_recipe.get("n_unbind_hard_atoms_matched", 0), + "unbind_force_train_path": unbind_recipe.get("unbind_force_train_path", ""), + "n_unbind_force_train": unbind_recipe.get("n_unbind_force_train", 0), + "n_unbind_force_train_keys": unbind_recipe.get("n_unbind_force_train_keys", 0), + "n_unbind_val_after_force_train": unbind_recipe.get( + "n_unbind_val_after_force_train", 0 + ), "n_unbind_hard_extra_copies": unbind_recipe.get("n_unbind_hard_extra_copies", 0), "unbind_residual_dump": residual_receipt.get("unbind_residual_dump", ""), "n_unbind_residual": residual_receipt.get("n_unbind_residual", 0), @@ -413,7 +773,22 @@ def score(): "unbind_residual_by_class": residual_receipt.get("unbind_residual_by_class", {}), "unbind_residual_summary": residual_receipt.get("unbind_residual_summary", ""), "last_loss": losses[-1] if losses else None, - "val": last, + "val": primary_val, + "val_final": last, + "val_best": best_metrics, + "save_best_unbind": save_best_unbind, + "primary_weights_from": gated_from, + "best_unbind_exact": None if best_metrics is None else best_metrics.get("unbind_exact"), + "best_epoch": None if best_metrics is None else best_metrics.get("epoch"), + "final_weight_file": None if aside is None else aside.name, + "init_from": init_receipt.get("init_from"), + "warm_start": bool(init_receipt.get("warm_start")), + "init_weight_file": init_receipt.get("weight_file"), + "init_encoder_trainable_loaded": init_receipt.get("encoder_trainable_loaded"), + "init_expand_vocab": bool(init_receipt.get("init_expand_vocab")), + "init_expand_vocab_applied": bool(init_receipt.get("expand_vocab")), + "init_expand_role": init_receipt.get("role"), + "init_expand_filler": init_receipt.get("filler"), "epoch_metrics": epoch_metrics, "weight_file": weight_file, "aligner": "char_span + offset_mapping", @@ -462,6 +837,17 @@ def score(): "n_unbind_hard_extra_copies": unbind_recipe.get( "n_unbind_hard_extra_copies", 0 ), + "unbind_force_train_path": unbind_recipe.get("unbind_force_train_path", ""), + "n_unbind_force_train": unbind_recipe.get("n_unbind_force_train", 0), + "n_unbind_force_train_keys": unbind_recipe.get( + "n_unbind_force_train_keys", 0 + ), + "n_unbind_val_after_force_train": unbind_recipe.get( + "n_unbind_val_after_force_train", 0 + ), + "save_best_unbind": save_best_unbind, + "init_from": init_receipt.get("init_from"), + "warm_start": bool(init_receipt.get("warm_start")), }, indent=2, ) diff --git a/scripts/shadow/hyperlexical/unbind_recipe.py b/scripts/shadow/hyperlexical/unbind_recipe.py index 617cc912..0c743eee 100644 --- a/scripts/shadow/hyperlexical/unbind_recipe.py +++ b/scripts/shadow/hyperlexical/unbind_recipe.py @@ -20,6 +20,7 @@ UNBIND_FILLER_DENYLIST_PATH_ENV = "HYPERLEX_UNBIND_FILLER_DENYLIST_PATH" UNBIND_HARD_ATOMS_PATH_ENV = "HYPERLEX_UNBIND_HARD_ATOMS_PATH" UNBIND_HARD_UPSAMPLE_ENV = "HYPERLEX_UNBIND_HARD_UPSAMPLE" +UNBIND_FORCE_TRAIN_PATH_ENV = "HYPERLEX_UNBIND_FORCE_TRAIN_PATH" UNBIND_OBSERVED_UPSAMPLE_DEFAULT = 1 # Extra copies of already-OBSERVED hard phrases after the normal upsample. # 1 = identity (no extra). Operator JSONL is env-path only — not SoT gold. @@ -142,6 +143,107 @@ def hard_atoms_receipt_path(path: str | Path | None) -> str: return Path(token).name +def resolve_unbind_force_train_path(raw: str | Path | None = None) -> str: + """Operator JSONL of authorized exacts to move val→train. Empty = off.""" + if raw is None: + raw = os.environ.get(UNBIND_FORCE_TRAIN_PATH_ENV) + if raw is None or (isinstance(raw, str) and not str(raw).strip()): + return "" + return str(raw).strip() + + +def force_train_receipt_path(path: str | Path | None) -> str: + token = str(path or "").strip() + if not token: + return "" + return Path(token).name + + +def load_force_train_keys(path: str | Path | None = None) -> frozenset[tuple[str, str]]: + """Load ``(text, role_scheme)`` keys from operator force-train JSONL. + + Unset / empty path → empty set (identity). Configured path must exist and + be valid JSONL with string ``text`` and ``role_scheme`` in + {positional, type_slot}. Does not invent OBSERVED class labels. + """ + raw = resolve_unbind_force_train_path(path) + if not raw: + return frozenset() + p = Path(raw) + if not p.is_file(): + raise ValueError(f"{UNBIND_FORCE_TRAIN_PATH_ENV} is not a file: {p}") + try: + body = p.read_text(encoding="utf-8") + except OSError as exc: + raise ValueError(f"{UNBIND_FORCE_TRAIN_PATH_ENV} is unreadable: {p}") from exc + keys: set[tuple[str, str]] = set() + for index, line in enumerate(body.splitlines(), start=1): + if not line.strip(): + continue + try: + obj = json.loads(line) + except json.JSONDecodeError as exc: + raise ValueError( + f"{UNBIND_FORCE_TRAIN_PATH_ENV} line {index} is not valid JSON" + ) from exc + if not isinstance(obj, dict): + raise ValueError( + f"{UNBIND_FORCE_TRAIN_PATH_ENV} line {index} must be a JSON object" + ) + text = obj.get("text") + scheme = obj.get("role_scheme") + if not isinstance(text, str) or not text.strip(): + raise ValueError( + f"{UNBIND_FORCE_TRAIN_PATH_ENV} line {index} needs non-empty string text" + ) + if scheme not in {"positional", "type_slot"}: + raise ValueError( + f"{UNBIND_FORCE_TRAIN_PATH_ENV} line {index} role_scheme must be " + f"positional|type_slot, got {scheme!r}" + ) + keys.add((text.strip(), str(scheme))) + return frozenset(keys) + + +def apply_unbind_force_train( + train: list[dict[str, Any]], + val: list[dict[str, Any]], + *, + path: str | Path | None = None, +) -> tuple[list[dict[str, Any]], list[dict[str, Any]], dict[str, Any]]: + """Move authorized OBSERVED val exacts into train (accept-style force-train). + + Only rows with ``class==OBSERVED`` and ``(text, role_scheme)`` in the + force-train JSONL leave val. Val changes → fair-eval baseline required. + Empty path → identity. Missing configured path fails closed. + """ + keys = load_force_train_keys(path) + receipt_path = force_train_receipt_path(resolve_unbind_force_train_path(path)) + if not keys: + return train, val, { + "unbind_force_train_path": receipt_path, + "n_unbind_force_train": 0, + "n_unbind_force_train_keys": 0, + "n_unbind_val_after_force_train": len(val), + } + keep_val: list[dict[str, Any]] = [] + moved: list[dict[str, Any]] = [] + for row in val: + key = (str(row.get("text") or "").strip(), str(row.get("role_scheme") or "")) + if key in keys and row.get("class") == "OBSERVED": + copy = dict(row) + copy["split"] = "train" + moved.append(copy) + else: + keep_val.append(row) + return train + moved, keep_val, { + "unbind_force_train_path": receipt_path, + "n_unbind_force_train": len(moved), + "n_unbind_force_train_keys": len(keys), + "n_unbind_val_after_force_train": len(keep_val), + } + + def unbind_row_hard_atom_keys(row: Mapping[str, Any]) -> set[str]: """Normalized row text plus joined filler atom text. No invented surfaces.""" keys: set[str] = set() diff --git a/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md b/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md new file mode 100644 index 00000000..d08b8179 --- /dev/null +++ b/specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md @@ -0,0 +1,130 @@ +# 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. + +This plan turns Spec 007 from a SHADOW Spark climb into a shippable Hyperlexical product. It does **not** flip `name_gate`. + +--- + +## Current honest state (2026-09-23) + +| Layer | State | +|-------|--------| +| Hermes skill (`SKILL.md`, CLI, `src/hyperlex/`) | **Ready** (v0.4.0 operator surface; pyproject may read 1.6.0 — hygiene debt) | +| 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** | + +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. + +--- + +## Product definition (what “complete” means) + +Hyperlexical is complete when all of the following are true: + +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). + +Until (4), the artifact stays `hyperlex-encoder-*`. + +--- + +## Workstreams + +### A. Climb / gold (Spark · soft_ceiling) + +| 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 | + +Constraints: upsample freeze 11+; no SECOND_SLOT=4; Qwen stopped unless re-enabled. + +### B. Engineering hygiene (main / tip) + +| Step | Action | Exit | +|------|--------|------| +| B1 | Restore `apply_unbind_force_train` + tests on tip (#99 CI) | validate green | +| B2 | Align `VERSION` ↔ `pyproject.toml` version (0.4.0 vs 1.6.0 skew) | Single source of truth | +| B3 | Drop / quarantine stale probe files and truncated CHANGELOG placeholders on tip | Docs match receipts | +| B4 | Keep force-train path env-only; val move ⇒ fair re-baseline | Receipt stats present | + +### C. Product packaging (post–name_gate, separate authorize) + +| 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 | + +### D. Adjacent Hyperlex PRs (skill track — not model name) + +| PR | Role | Handle | +|----|------|--------| +| **#100** pytrends evidence | Skill route evidence | CI green / mergeable. Recommend merge after operator live `analyze --route trends` check. Independent of Hyperlexical name. | +| **#99** Spec 007 tip docs + climb | Model path | Stay **draft** until CI green + operator merge yes. Large docs+receipts surface. | +| **#95** HYPERLEX-Q1 | Epistemic interchange | Stay **draft**; rebase onto current `main`; remains UNQUALIFIED / pairwise BLOCKED. Spec-only. | + +Do **not** merge any of these without explicit operator yes. + +--- + +## Sequencing (recommended) + +``` +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) + +When climb + packaging ready: + Danny name_gate yes ──► C1–C2 Hub ──► optional C3 T13 +``` + +Climb (A) and skill PR #100 can proceed in parallel. Name/Hub (C) never parallel-jumps ahead of Danny yes. + +--- + +## 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 +- [ ] 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” +- [ ] STATUS / ROADMAP / milestones updated to match reality (no stale “E2 Spark-blocked” once trained E2 PASS is the pin) + +--- + +## Pointers + +- Climb next: root `NEXT_MOVES_007.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` diff --git a/specs/007-hyperlexical-model/NEXT_MOVES_007.md b/specs/007-hyperlexical-model/NEXT_MOVES_007.md index f09bdacb..f28a4b29 100644 --- a/specs/007-hyperlexical-model/NEXT_MOVES_007.md +++ b/specs/007-hyperlexical-model/NEXT_MOVES_007.md @@ -1,29 +1,32 @@ -# Spec 007 — next after morph66 REJECT: label morph65 force residuals (n=201) +# Spec 007 — next: soft_ceiling armed · HOLD empty · product plan drafted -`name_gate=false`. BEST=**morph65**. Upsample ladder frozen. Do not run SECOND_SLOT=4. Do not replay morph66 force/hard. +`name_gate=false`. BEST=**morph65** (held). Upsample freeze = **11+**. Do not run SECOND_SLOT=4. -## Gate result +## Done -morph66 residual-gold **REJECT**: best **0.9502** (191/201) < fair morph65 **0.9602** (193/201). E2 PASS. BEST stays morph65. +- soft_ceiling **ARMED** (live prior broad **0.88671875** n=256). +- morph78 acquire + live residual reprobe → empty gold. +- Operator **`authorize val-settle`** → **CANCELLED_EMPTY_GOLD** (no phrases on HOLD card; no invent OBSERVED). +- Tip CI gap: restored `apply_unbind_force_train` + tests; restored `route_rows` / reviewed refuse-before-write in `loop.py`. +- Local full suite **702 passed** (shadow 365). CI validate re-check after tip push. +- Draft product plan: `specs/007-hyperlexical-model/HYPERLEXICAL-PRODUCT-PLAN.md`. -## 0.95 bar +## Gate (armed) -On post-force fair surface n=201, morph65 already clears ~0.95 (**0.9602**). Gap to 1.0 = **8 exacts**. +**soft_ceiling_tiebreak:** force-fair <1.0 → classic; =1.0 → broad OBSERVED > PRIOR live + E2. -## Prepared dump (Spark) +## PR triage (no merge without authorize) -`~/hlx-private/p1-spark-morph65-force-residuals-20260921/` — morph65 misses on force surface: **8 INFERRED** (type_slot 6 / positional 2). Receipt: `receipts/20260921-morph65-force-residuals-n201.json`. +| PR | State | Action | +|----|-------|--------| +| **#100** pytrends | CI green, mergeable | Recommend merge after operator live `--route trends` check | +| **#99** Spec 007 tip | draft; validate was red → force-train restore | Stay draft until CI green + merge yes | +| **#95** HYPERLEX-Q1 | draft; base stale vs main | Keep draft; rebase onto main; remains UNQUALIFIED | -## One card +## Next -METHOD morph43 AUTHORIZE / ABSTAIN only on those 8. Expect many wiki/scaffold ABSTAINs. If AUTHORIZE ≥1: expand force/hard, re-fair morph65, one gold-knob morph67 warm morph65 (UPSAMPLE=8, SECOND_SLOT=2 held). +1. Await authorize with **named phrases**, or a new acquire that clears Jev `force_expand_safe`. +2. Operator review of `HYPERLEXICAL-PRODUCT-PLAN.md` (climb → hygiene → name_gate → Hub). +3. Do not re-burn empty settles. -| not this card | | -|--|--| -| upsample 11+ | frozen | -| SECOND_SLOT=4 | blocked | -| replay morph66 force/hard | rejected | -| invent OBSERVED | forbidden | -| Hub / name_gate | false | - -Qwen stays stopped unless the operator re-enables `qwen38-27b.service`. +Qwen stays stopped unless re-enabled. diff --git a/specs/007-hyperlexical-model/receipts/20260921-morph65-force-residual-label.md b/specs/007-hyperlexical-model/receipts/20260921-morph65-force-residual-label.md new file mode 100644 index 00000000..191676a2 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260921-morph65-force-residual-label.md @@ -0,0 +1,45 @@ +# morph65 force residual gold — METHOD label (2026-09-21) + +**Authority:** operator continue after morph66 REJECT. METHOD = morph43. `name_gate=false`. + +## Source + +morph65 misses on morph66 force surface (n=201): **8 INFERRED** (type_slot 6 / positional 2). +Dump: `~/hlx-private/p1-spark-morph65-force-residuals-20260921/`. +Receipt: `receipts/20260921-morph65-force-residuals-n201.json`. + +## Label + +| | n | +|--|--:| +| AUTHORIZE | 2 | +| ABSTAIN | 6 | + +- AUTHORIZE reason: `type_slot_parse_match` (TOKEN/SLOT/MARKER parse == gold) +- ABSTAIN reason: `abstain_scaffolding_wiki_etym` (wiki/etym/quotations/synonym/Armenian/Google Trends) + +AUTHORIZE texts: + +1. `TOKEN:MUSH SLOT:: MARKER:Multi-User TOKEN:Shared SLOT:Hallucination` +2. `TOKEN:Real SLOT:eyes MARKER:realize TOKEN:clanker SLOT:lies!!!` + +## Expand attempt (no-op) + +Built `force_train_morph67_expanded.jsonl` / `hard_atoms_train_morph67.jsonl` from morph66 base: + +| | | +|--|--:| +| force_base → force_new | 164 → 164 | +| **force_added** | **0** | +| hard_base → hard_new | 206 → 206 | +| **hard_added** | **0** | + +Texts already present in morph66 force (from morph63 residual gold) with `dataset_class_source=INFERRED`. Fair morph65 on morph67 expand path stayed **0.9601990049751243 n=201**. + +## Do not burn + +Launching morph67 with identical force/hard and no class change would replay morph66. Stopped. + +## Real one-knob (next) + +`apply_unbind_force_train` only moves `class==OBSERVED`. Force had 164 keys but only **162** moved — the 2 AUTHORIZE keys were dead (INFERRED in val). Flip those 2 to OBSERVED in Wave A harvest sidecar → force moves 164/164; val n→199. See `receipts/morph65-force-residual-gold-20260921/SOT_FLIP_SUMMARY.json` and morph67 inflight. diff --git a/specs/007-hyperlexical-model/receipts/20260921-morph67-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260921-morph67-40ep-reject-vs-best.md new file mode 100644 index 00000000..72028ec7 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260921-morph67-40ep-reject-vs-best.md @@ -0,0 +1,31 @@ +# morph67 REJECT_VS_BEST — SoT flip (2026-09-21) + +Container `hlx-train-morph67-1790010500` Exited 0. Gate `morph67-sot-flip` finished 2026-09-21T22:15:32Z. `name_gate=false`. + +## Gate + +Same surface as fair-eval morph65 after SoT flip: force keys 164 moved 164, val n=199. `surface_ok=true`. + +| | | +|--|--| +| best | **0.9597989949748744** epoch 18 = 191/199 | +| fair morph65 | **0.9698492462311558** = 193/199 | +| decision | **REJECT_VS_BEST** (strictly less; E2 PASS) | +| BEST stays | **seed-morph65** | + +Knob: SoT INFERRED→OBSERVED for 2 METHOD AUTHORIZE morph65 force residuals (harvest sidecar). Held force/hard morph66 paths, `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=8`, `HYPERLEX_UNBIND_SECOND_SLOT_WEIGHT=2`, warm init morph65, LAST=8, HEAD=2, POS=1, TYPE=1, HARD_UPSAMPLE=4, mem **0.3 exclusive**, 40 epochs, SAVE_BEST. Upsample ladder frozen. Qwen stayed stopped+disabled. + +## E2 + +`~/hlx/e2-unbind-morph67.json`: `trunk_forward=true`, `e2_pass=true`, `unbind_exact=1.0`, `n_unbind_eval=24`, `n_test=12`. + +## Pin + +BEST symlink unchanged → `hyperlex-encoder-modernbert-base-seed-morph65`. morph67 weights kept on disk (not BEST). Residuals on best epoch: **8** (OBSERVED 1 / INFERRED 7). Themes: `partial_slot_miss` 6, `positional_head_filler_miss` 2, `type_slot_token_miss` 3. Schemes: type_slot 4 / positional 4. + +SoT flip raised the fair bar (same 193 correct on n=199) but train best stayed below. Do not replay the same SoT flip / identical force surface. + +Brier null. No Hub. + +Private: `~/hlx-private/p1-spark-morph67-40ep-sot-flip-20260921/` +Receipts: `receipts/morph67-sot-flip-20260921/` diff --git a/specs/007-hyperlexical-model/receipts/20260921-morph67-residual-label.md b/specs/007-hyperlexical-model/receipts/20260921-morph67-residual-label.md new file mode 100644 index 00000000..14065128 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260921-morph67-residual-label.md @@ -0,0 +1,50 @@ +# morph67 residual gold — METHOD label (2026-09-21) + +**Authority:** operator continue after morph67 REJECT. METHOD = morph43. `name_gate=false`. + +## Source + +morph67 best-epoch residuals (n=8): OBSERVED 1 / INFERRED 7 (type_slot 4 / positional 4). +Dump: `~/hlx-private/p1-spark-morph67-40ep-sot-flip-20260921/residual-morph67.jsonl`. + +## Label + +| | n | +|--|--:| +| AUTHORIZE | 2 | +| ABSTAIN | 6 | + +- AUTHORIZE reason: `positional_text_split_match` (text.split() == gold) +- ABSTAIN reason: `abstain_scaffolding_wiki_etym` (wiki/etym/quotations/synonym/Armenian/Google Trends) + +AUTHORIZE texts: + +1. `[Out:] Mega yachts [In:] Mega gyatt` +2. `an egg's age` + +## Expand + +Built `force_train_morph68_expanded.jsonl` / `hard_atoms_train_morph68.jsonl` from morph66 base: + +| | | +|--|--:| +| force_base → force_new | 164 → **166** | +| **force_added** | **2** | +| hard_base → hard_new | 206 → **208** | +| **hard_added** | **2** | + +Harvest OBSERVED append for both AUTHORIZE (`HARVEST_APPEND_SUMMARY.json`). Force moves **166/166**; val after force **197**. + +## Fair (morph65 on morph68 surface) + +| | | +|--|--| +| exact | **0.9695431472081218** (191/197) | +| prior fair n=199 | 0.9698492462311558 | +| path | `~/hlx/fair-eval-morph65-morph68.json` | + +## Next + +morph68 one-knob = this force/hard expand. Warm morph65; UPSAMPLE=8 + SECOND_SLOT=2 held. PIN iff best > fair on n=197 and E2 exact 1.0. + +Private: `~/hlx-private/p1-spark-morph67-residual-label-20260921/` + morph68 dump. diff --git a/specs/007-hyperlexical-model/receipts/20260921-morph67-sot-flip-inflight.md b/specs/007-hyperlexical-model/receipts/20260921-morph67-sot-flip-inflight.md new file mode 100644 index 00000000..8c26b21d --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260921-morph67-sot-flip-inflight.md @@ -0,0 +1,48 @@ +# morph67 INFLIGHT — SoT class flip (2026-09-21) + +**Superseded by** `receipts/20260921-morph67-40ep-reject-vs-best.md`. + +Container `hlx-train-morph67-1790010500`. `name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## One knob + +SoT **INFERRED→OBSERVED** for 2 METHOD AUTHORIZE morph65 force residuals, appended to Spark +`~/.hyperlex/hyperlexical/harvest_unbind_observed_mw.jsonl` (backup +`bak-pre-morph67-sot-flip-20260921T170637Z`). No invented fillers. Force/hard paths **unchanged** +(`force_train_morph66_expanded.jsonl` 164 / `hard_atoms_train_morph66.jsonl` 206). + +## Why + +Label card AUTHORIZE≥1 but `force_added=0`. Keys already in force as INFERRED — force skip. +After flip: force moves **164/164**, val after force **199**. + +## Fair (morph65 on post-flip surface) + +| | | +|--|--| +| exact | **0.9698492462311558** (193/199) | +| prior fair n=201 | 0.9601990049751243 (193/201) | +| path | `~/hlx/fair-eval-morph65-morph67-sot.json` | + +Same 193 correct; the 2 flipped misses left val. + +## Recipe (held except SoT) + +| knob | value | +|--|--| +| warm | morph65 | +| UPSAMPLE | 8 (held) | +| SECOND_SLOT | 2 (held) | +| LAST | 8 | +| HEAD_SLOT | 2 | +| HARD_UPSAMPLE | 4 | +| LR | 2e-5 | +| epochs | 40 | +| SAVE_BEST | on | +| PIN | best > fair 0.9698 on n=199 **and** E2 trunk-forward exact 1.0 | + +## Not this card + +upsample 11+ · SECOND_SLOT=4 · invent OBSERVED fillers · Hub · name_gate · identical expand without SoT flip + +Private: `~/hlx-private/p1-spark-morph67-40ep-sot-flip-20260921/` diff --git a/specs/007-hyperlexical-model/receipts/20260921-morph68-residual-gold-inflight.md b/specs/007-hyperlexical-model/receipts/20260921-morph68-residual-gold-inflight.md new file mode 100644 index 00000000..3fb4a0bc --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260921-morph68-residual-gold-inflight.md @@ -0,0 +1,44 @@ +# morph68 INFLIGHT — residual gold force/hard (2026-09-21) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## One knob + +METHOD morph43 AUTHORIZE on morph67 residuals (n=2) → force/hard expand + harvest OBSERVED append. +Force **166** / hard **208**. Warm morph65. UPSAMPLE=8 + SECOND_SLOT=2 held. + +## Fair (morph65 on morph68 surface) + +| | | +|--|--| +| exact | **0.9695431472081218** (191/197) | +| path | `~/hlx/fair-eval-morph65-morph68.json` | + +## Recipe (held except force/hard) + +| knob | value | +|--|--| +| warm | morph65 | +| UPSAMPLE | 8 (held) | +| SECOND_SLOT | 2 (held) | +| LAST | 8 | +| HEAD_SLOT | 2 | +| HARD_UPSAMPLE | 4 | +| LR | 2e-5 | +| epochs | 40 | +| SAVE_BEST | on | +| PIN | best > fair 0.9695 on n=197 **and** E2 trunk-forward exact 1.0 | + +## Not this card + +upsample 11+ · SECOND_SLOT=4 · invent OBSERVED fillers · Hub · name_gate · replay morph67 SoT without new gold + +Private: `~/hlx-private/p1-spark-morph68-40ep-residual-gold-20260921/` + +## Hang + fix relaunch + +1. `hlx-train-morph68-1790029975` **hung** after ep4 best **0.964467** (~3h, 98% CPU, GPU util 0, mem held). Aside `*.hung-ep4-20260922T013202Z`. +2. Blind relaunch `hlx-train-morph68-1790040737` same hang (~75m). Aside `*.hung-ep4-relaunch-20260922T031305Z`. +3. **Root cause:** per-step `loss.detach().cpu()` (~12k CUDA host syncs/epoch) + SAVE_BEST full encoder GPU→CPU copy → post-ep4 host spin. Not CPU device fallback. +4. **Fix in `scripts/shadow/hyperlexical/loop.py`:** on-device `last_train_loss` (one `.item()`/epoch); `cuda.synchronize` + `empty_cache` after SAVE_BEST; `epoch-progress.jsonl` + stdout flush. Relaunch `PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512` (no `expandable_segments`). +5. **In flight:** `hlx-train-morph68-1790047095` — same one-knob. Receipts: `HANG_*.json`, `HANG_FIX_20260922T0315Z.json`. diff --git a/specs/007-hyperlexical-model/receipts/20260922-morph68-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260922-morph68-40ep-reject-vs-best.md new file mode 100644 index 00000000..d9ec826c --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260922-morph68-40ep-reject-vs-best.md @@ -0,0 +1,26 @@ +# morph68 REJECT_VS_BEST — residual gold (2026-09-22) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## Gate + +| | | +|--|--| +| best | **0.9695431472081218** (ep27, 191/197) | +| fair morph65 | **0.9695431472081218** (191/197) | +| decision | **REJECT_VS_BEST** (tie — PIN needs strictly greater) | +| E2 trunk-forward | **PASS** (`unbind_exact=1.0`) | +| container | `hlx-train-morph68-1790047095` exit 0 | +| BEST | stays **morph65** | + +## Knob + +morph67 residual AUTHORIZE force/hard expand (166/208). Warm morph65. UPSAMPLE=8 + SECOND_SLOT=2 held. Hang-fix `loop.py` (drop per-step `.cpu()` sync). + +## Residuals (best epoch) + +themes: `partial_slot_miss` 6, `type_slot_token_miss` 3. METHOD label AUTHORIZE **0** / ABSTAIN **6** (scaffolding). Do not burn force_added=0. + +## Next + +morph69: unused METHOD AUTHORIZE morph43/morph50 gold **force_added=26**. Fair morph65 **0.9649122807017544** n=171. See `receipts/20260922-morph69-unused-method-gold.md`. diff --git a/specs/007-hyperlexical-model/receipts/20260922-morph69-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260922-morph69-40ep-reject-vs-best.md new file mode 100644 index 00000000..af9346e6 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260922-morph69-40ep-reject-vs-best.md @@ -0,0 +1,26 @@ +# morph69 REJECT_VS_BEST — unused METHOD gold (2026-09-22) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## Gate + +| | | +|--|--| +| best | **0.9649122807017544** (ep0, 165/171) | +| fair morph65 | **0.9649122807017544** (165/171) | +| decision | **REJECT_VS_BEST** (tie — PIN needs strictly greater) | +| E2 trunk-forward | **PASS** (`unbind_exact=1.0`) | +| container | `hlx-train-morph69-1790065790` exit 0 | +| BEST | stays **morph65** | + +## Knob + +Unused METHOD AUTHORIZE morph43/morph50 residual gold **force_added=26** / hard_added=25 (192/233). Warm morph65. UPSAMPLE=8 + SECOND_SLOT=2 held. Hang-fix `loop.py`. + +## Residuals (best ep0) + +n=6. METHOD morph43 AUTHORIZE **0** / ABSTAIN **6** (scaffolding / parenthetical). Do not burn force_added=0. + +## Next + +Hold BEST morph65. Do not launch identical morph70. METHOD residual AUTHORIZE exhausted in force69. Remaining `local-label-new-atoms` AUTHORIZE=25 are **INFERRED proposal only; not force-train** until operator settles OBSERVED. Upsample ladder frozen; no SECOND_SLOT=4. diff --git a/specs/007-hyperlexical-model/receipts/20260922-morph69-unused-method-gold.md b/specs/007-hyperlexical-model/receipts/20260922-morph69-unused-method-gold.md new file mode 100644 index 00000000..ae7aa608 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260922-morph69-unused-method-gold.md @@ -0,0 +1,43 @@ +# morph68 residual label + morph69 unused METHOD gold (2026-09-22) + +**Authority:** operator continue — update goldens to continue. `name_gate=false`. + +## morph68 best residuals (ep27) + +Dump from `…-seed-morph68/best` on morph68 force surface (n=197, exact **0.9695431472081218** = fair → will REJECT_VS_BEST). + +| | n | +|--|--:| +| residuals | **6** | +| AUTHORIZE | **0** | +| ABSTAIN | **6** | + +All ABSTAIN `abstain_scaffolding_wiki_etym` / parenthetical meta. **force_added would be 0** — do not burn identical morph69. + +## One knob (morph69) + +Integrate **unused** METHOD AUTHORIZE gold still outside force68: + +| source | n | +|--|--:| +| `labeled_morph43_residuals.jsonl` | 25 | +| `labeled_morph50_residuals.jsonl` | 1 | +| **force_added** | **26** | +| hard_added | 25 | +| force 166→**192** / hard 208→**233** | + +Harvest OBSERVED append for force moves. Authority: morph43-overlap AUTHORIZE still in force. + +## Fair (morph65 on morph69 surface) + +| | | +|--|--| +| exact | **0.9649122807017544** (165/171) | +| force moved | 191/192 keys | +| path | `~/hlx/fair-eval-morph65-morph69.json` | + +## Next + +After morph68 exits: E2 + finish → REJECT_VS_BEST (tie ≠ PIN). Then morph69 warm morph65, UPSAMPLE=8 + SECOND_SLOT=2 held, exclusive 0.3, hang-fix loop.py. PIN iff best > fair **0.9649122807017544** n=171 and E2 exact 1.0. + +Private: `~/hlx-private/p1-spark-morph69-unused-gold-20260922/` + train pack `…-40ep-unused-gold-20260922/`. diff --git a/specs/007-hyperlexical-model/receipts/20260922-morph70-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260922-morph70-40ep-reject-vs-best.md new file mode 100644 index 00000000..23a235b0 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260922-morph70-40ep-reject-vs-best.md @@ -0,0 +1,26 @@ +# morph70 REJECT_VS_BEST — role-vocab-filtered new-atoms (2026-09-22) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## Gate + +| | | +|--|--| +| best | **0.9649122807017544** (ep4, 165/171) | +| fair morph65 | **0.9649122807017544** (165/171) | +| decision | **REJECT_VS_BEST** (tie — PIN needs strictly greater) | +| E2 trunk-forward | **PASS** (`unbind_exact=1.0`) | +| container | `hlx-train-morph70-1790092833` exit 0 | +| BEST | stays **morph65** | + +## Knob + +Settled `local-label-new-atoms` AUTHORIZE filtered to morph65 role vocab (`pos_0..pos_5`) → **force_added=2** (`took an L`, `big W`). 23 longer atoms held. Warm morph65. UPSAMPLE=8 + SECOND_SLOT=2 held. Hang-fix `loop.py`. + +## Residuals (best) + +n=6. METHOD morph43 AUTHORIZE **0** / ABSTAIN **6** (scaffolding). Do not burn force_added=0. + +## Next + +Hold BEST morph65. Residual AUTHORIZE=0. Compatible new-atoms exhausted (2 already tried). 23 longer AUTHORIZE atoms still need a **role-vocab expand / non-warm** path — not a force_added=0 warm clone. Upsample frozen; no SECOND_SLOT=4. diff --git a/specs/007-hyperlexical-model/receipts/20260922-morph70-new-atoms-inflight.md b/specs/007-hyperlexical-model/receipts/20260922-morph70-new-atoms-inflight.md new file mode 100644 index 00000000..12a22aa6 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260922-morph70-new-atoms-inflight.md @@ -0,0 +1,33 @@ +# morph70 IN FLIGHT — settled new-atoms AUTHORIZE (role-vocab filter) (2026-09-22) + +**Authority:** operator recommend-and-continue. `name_gate=false`. + +## Recommendation (executed) + +After morph69 REJECT (tie fair 0.9649 n=171) with residual AUTHORIZE=0 and METHOD residual gold exhausted, integrate settled `local-label-new-atoms` AUTHORIZE (SoT OBSERVED via PACKET_SETTLE; never force-trained). + +## Role-vocab filter + +First launch aborted: `HYPERLEX_INIT_FROM role_vocab mismatch (init=10 current=12)`. +morph65 role head is `pos_0..pos_5` only. 23 AUTHORIZE atoms need `pos_6`/`pos_7` → dropped for this warm climb. + +| | n | +|--|--:| +| packet AUTHORIZE | 25 | +| role-vocab compat (fillers≤6) | **2** (`took an L`, `big W`) | +| dropped | 23 | + +## Knob + +| | | +|--|--| +| force_added | **2** (192→**194**) | +| hard_added | **2** (233→**235**) | +| fair morph65 | **0.9649122807017544** n=171 | +| warm | morph65 | +| UPSAMPLE / SECOND_SLOT | 8 / 2 held | +| container | `hlx-train-morph70-1790092833` (relaunch after role-vocab filter) | + +PIN iff best > fair **0.9649122807017544** n=171 and E2 trunk-forward `unbind_exact=1.0`. + +Longer atoms remain held for a future non-warm / role-head-expand path — not this card. diff --git a/specs/007-hyperlexical-model/receipts/20260922-morph71-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260922-morph71-40ep-reject-vs-best.md new file mode 100644 index 00000000..5593bb00 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260922-morph71-40ep-reject-vs-best.md @@ -0,0 +1,26 @@ +# morph71 REJECT_VS_BEST — role-vocab expand / non-warm (2026-09-22) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## Gate + +| | | +|--|--| +| best | **0.9590643274853801** (ep16, 164/171) | +| fair morph65 | **0.9649122807017544** (165/171) | +| decision | **REJECT_VS_BEST** (best < fair) | +| E2 trunk-forward | **PASS** (`unbind_exact=1.0`) | +| container | `hlx-train-morph71-1790110734` exit 0 | +| BEST | stays **morph65** | + +## Knob + +Role-vocab expand / **non-warm** for 23 held longer `local-label-new-atoms` AUTHORIZE (`pos_6+`; morph65 max `pos_5`). **force_added=23** (194→217) / hard 235→258. No `HYPERLEX_INIT_FROM`. UPSAMPLE=8 + SECOND_SLOT=2 + LAST=8 held. Hang-fix `loop.py`. + +## Residuals (best) + +n=7 all INFERRED. METHOD morph43 AUTHORIZE **0** / ABSTAIN **7** (scaffolding/wiki/etym). Do not burn force_added=0. + +## Next + +Hold BEST morph65. Residual AUTHORIZE=0. Longer new-atoms card exhausted (non-warm did not beat fair). Upsample frozen; no SECOND_SLOT=4. No morph72 without a new legal one-knob. diff --git a/specs/007-hyperlexical-model/receipts/20260922-morph71-role-expand-nonwarm-inflight.md b/specs/007-hyperlexical-model/receipts/20260922-morph71-role-expand-nonwarm-inflight.md new file mode 100644 index 00000000..db88ac33 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260922-morph71-role-expand-nonwarm-inflight.md @@ -0,0 +1,26 @@ +# morph71 IN FLIGHT — role-vocab expand / non-warm longer new-atoms (2026-09-22) + +**Authority:** operator continue after morph70 REJECT. `name_gate=false`. + +## Recommendation (executed) + +After morph70 REJECT (tie fair 0.9649 n=171; role-vocab filter force_added=2), the only remaining legal one-knob for the 23 held longer `local-label-new-atoms` AUTHORIZE is **role-vocab expand / non-warm**. Warm morph65 cannot absorb `pos_6`/`pos_7` (`INIT_FROM role_vocab mismatch`). + +## Knob + +| | | +|--|--| +| one_knob | role-vocab expand / non-warm for held longer AUTHORIZE | +| force_added | **23** (194→**217**) | +| hard_added | **23** (235→**258**) | +| role max | **pos_7** (morph65 max `pos_5`) | +| warm / INIT_FROM | **none** (cold trunk) | +| fair morph65 | **0.9649122807017544** n=171 | +| UPSAMPLE / SECOND_SLOT / LAST | 8 / 2 / 8 held | +| SAVE_BEST | 1 | +| mem_fraction | 0.3 exclusive | +| container | `hlx-train-morph71-1790110734` | + +PIN iff best > fair **0.9649122807017544** n=171 and E2 trunk-forward `unbind_exact=1.0`. + +METHOD morph43 positional_text_split_match. SoT class OBSERVED (PACKET_SETTLE classify); harvest unbind roles/fillers. No invented fillers. Qwen stopped+disabled. diff --git a/specs/007-hyperlexical-model/receipts/20260923-authorize-gate-soft-ceiling.md b/specs/007-hyperlexical-model/receipts/20260923-authorize-gate-soft-ceiling.md new file mode 100644 index 00000000..c4e848ef --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-authorize-gate-soft-ceiling.md @@ -0,0 +1,37 @@ +# Authorize gate soft_ceiling — ARMED (2026-09-23) + +`name_gate=false`. BEST=**morph65** (held). + +## Authority + +Operator: **`authorize gate soft_ceiling`**. + +Implements `soft_ceiling_tiebreak` from `20260923-gate-change-recommendation.md` (Jev pairwise prefer 0.80). + +## Pin + +| surface | exact | n | +|--|--:|--:| +| force-fair morph65 | **1.0** | 164 | +| broad OBSERVED authorize pin (historical) | **0.889763779527559** | 254 | +| broad OBSERVED live prior post-morph77 settle | **0.88671875** | 256 | + +Durable pin: `gate-soft-ceiling-20260923/GATE_SOFT_CEILING.json`. + +Live ceiling escape compares candidate vs **fresh PRIOR morph65** broad eval on current SoT (same n). Authorize pin is fallback only. + +## Promote rules (armed) + +1. **force-fair < 1.0:** candidate best **>** force-fair + same n + E2 1.0 (unchanged). +2. **force-fair = 1.0:** candidate **broad OBSERVED** (no force) **>** PRIOR morph65 broad on same live surface + E2 1.0. Do **not** cancel solely because force-fair is already 1.0. + +## Spark wire + +- `~/hlx/GATE_SOFT_CEILING.json` +- `~/hlx/eval_broad_observed.py` — score any model on broad OBSERVED val +- `~/hlx/gate_soft_ceiling_decide.py` — shared promote decision +- `~/hlx/finish_soft_ceiling.py` — finish template for morphs under this gate + +## Next morph + +Gold force card from morph65 residual AUTHORIZE is **empty** (Jev defer_quality=8). Under soft_ceiling: **fresh acquire + METHOD morph43** aimed at broad OBSERVED residuals → settle → morph78 warm morph65. Not force-only ceiling burns. Upsample freeze 11+. No SECOND_SLOT=4. diff --git a/specs/007-hyperlexical-model/receipts/20260923-authorize-val-settle-cancelled-empty-gold.md b/specs/007-hyperlexical-model/receipts/20260923-authorize-val-settle-cancelled-empty-gold.md new file mode 100644 index 00000000..be46b54e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-authorize-val-settle-cancelled-empty-gold.md @@ -0,0 +1,32 @@ +# authorize val-settle — CANCELLED_EMPTY_GOLD (2026-09-23) + +`name_gate=false`. BEST=**morph65**. Gate **soft_ceiling ARMED**. + +## Authority + +Operator: **`authorize val-settle`**. + +## Why cancelled + +Current HOLD cards have **empty** `authorize_card_phrases`: + +| card | phrases | +|--|--| +| morph78 fresh acquire | `[]` | +| morph65 live broad residual reprobe | `[]` | + +Jev: **cancel_empty_gold** 0.96 (no invent OBSERVED; no override of deferred METHOD AUTHORIZE without named phrases). + +## Not done + +- SoT settle +- force/hard expand +- morph78 train + +Force tip remains morph77 **232/273**. Live broad prior **0.88671875** n=256. + +## Next + +Still need **named phrases** on authorize (or a new acquire that clears Jev `force_expand_safe`), then `authorize val-settle` / `authorize morph78`. Soft_ceiling stays armed. + +Artifacts: `receipts/morph78-authorize-val-settle-empty-20260923/`. diff --git a/specs/007-hyperlexical-model/receipts/20260923-continue-land-hold.md b/specs/007-hyperlexical-model/receipts/20260923-continue-land-hold.md new file mode 100644 index 00000000..d3dc7c6d --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-continue-land-hold.md @@ -0,0 +1,19 @@ +# continue → land_hold (2026-09-23) + +`name_gate=false`. BEST=**morph65**. + +## Input + +Operator: `continue` under gold-card HOLD (AUTHORIZE=9 / 8 phrases; force fair 1.0 n=164). + +## Jev + +`choice` → **land_hold** confidence **0.87** (p=0.91). Runner-up authorize_and_launch 0.07. + +## Action + +No gold expand. No morph76. Synced stale root `NEXT_MOVES_007.md` + `STATUS.md` to HOLD. Spark residual pack intact at `~/hlx-private/p1-spark-morph65-broad-residual-diag-20260923` (n=28). + +## Still waiting + +Explicit operator authorize (`authorize morph76` or equivalent) before force/hard expand on authorize phrases → re-fair → morph76 warm morph65. diff --git a/specs/007-hyperlexical-model/receipts/20260923-gate-change-recommendation.md b/specs/007-hyperlexical-model/receipts/20260923-gate-change-recommendation.md new file mode 100644 index 00000000..468f410e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-gate-change-recommendation.md @@ -0,0 +1,54 @@ +# Gate change recommendation — force fair ceiling (2026-09-23) + +`name_gate=false`. BEST=**morph65**. Force fair **1.0** n=164. Broad OBSERVED **0.890** n=254. + +## Problem + +Current promote gate: **same-surface force-fair** — score BEST on val **after** `apply_unbind_force_train`, require **strictly greater** + E2 trunk-forward exact 1.0. + +At fair=1.0 that gate is impossible to beat. Force expand cannot help: force keys are removed from val before fair scoring, so fair n does not grow (morph75–77 CANCELLED_FAIR_CEILING). + +## Jev + +| step | result | +|--|--| +| choice (5 options) | `broad_observed_primary` 0.32 (runner-up `soft_ceiling_tiebreak` 0.29) | +| A/B compare | prefers **soft_ceiling_tiebreak** 0.80 vs broad_observed_primary 0.20 | +| adopt strength | **moderate** — adopt with explicit operator authorize | + +## Recommendation (adopt on authorize) + +**soft_ceiling_tiebreak** — keep force-fair as primary when it has headroom; when force-fair is already **1.0**, allow promote on a secondary same-surface: + +1. **Primary (unchanged when fair < 1.0):** candidate best unbind_exact **>** force-fair exact on that force surface + E2 = 1.0. +2. **Ceiling escape (only when force-fair exact = 1.0):** candidate **broad OBSERVED val** unbind_exact (no force shrink) **>** morph65 baseline **0.889763779527559** n=254 + E2 = 1.0. +3. Force surface remains the train recipe (force/hard expand still legal one-knobs); it is no longer the sole promote wall at the ceiling. +4. Still: no Hub, `name_gate=false`, schemes positional|type_slot, upsample freeze 11+, no SECOND_SLOT=4, no invented OBSERVED. + +### Why not full broad-primary yet + +Pairwise prefers keeping force-fair when it still discriminates. Soft ceiling preserves ladder history (morph63–74) and only opens a measured escape at the mathematical wall. + +### Rejected / deferred + +| option | why not now | +|--|--| +| fair_pre_force | Changes surface identity; train≠fair mismatch risk | +| fair_holdout_force | New holdout design + leakage risk; heavier | +| lower_surface_n | Gaming n; can fake progress by deleting hard val | + +## Implement only after authorize + +Say **`authorize gate soft_ceiling`** (or equivalent). Then: + +1. Pin morph65 broad OBSERVED baseline receipt (already in `morph65-broad-residual-diag`). +2. Wire promote/finish scripts: if force-fair == 1.0 → require broad OBSERVED strictly greater; else force-fair strictly greater. +3. Next morph card: one-knob aimed at broad OBSERVED residuals (not force-only ceiling burns). + +## Status + +**ARMED 2026-09-23** — operator `authorize gate soft_ceiling`. See `20260923-authorize-gate-soft-ceiling.md` + `gate-soft-ceiling-20260923/GATE_SOFT_CEILING.json`. + +## Alternate (if you want the larger redesign) + +**`authorize gate broad_observed_primary`** — make broad OBSERVED the sole promote metric; force-fair advisory only. diff --git a/specs/007-hyperlexical-model/receipts/20260923-jev-refine-empty-gold-hold.md b/specs/007-hyperlexical-model/receipts/20260923-jev-refine-empty-gold-hold.md new file mode 100644 index 00000000..7ce9b176 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-jev-refine-empty-gold-hold.md @@ -0,0 +1,28 @@ +# Jev refine morph65 residuals → empty gold card HOLD (2026-09-23) + +`name_gate=false`. BEST=**morph65**. + +## Why + +Operator: further classify dataset if that helps. Prior METHOD morph43 left AUTHORIZE=9 / ABSTAIN=19 under HOLD. + +## Jev + +| step | result | +|--|--| +| meta | **both_refine** (0.22) over skip | +| AUTHORIZE recheck (8 phrases) | **defer_quality=8** / force_expand_safe=0 | +| ABSTAIN refine (19) | **idiom_dead=18** · morph_bleed=1 · revisit_civilian=0 | +| next | **land_hold_empty** (0.82) | + +Closest defer misses (still defer): `my guy` conf 0.52 · `bling bling` conf 0.59 — not override without explicit operator yes. + +## Effect + +Gold force/hard expand card is **empty**. Do not launch morph76 on the prior 8 phrases. Force fair remains **1.0** n=164. Broad OBSERVED wall unchanged at **0.890**. + +## Next + +**HOLD (empty gold).** Fresh acquire + METHOD morph43 outside this residual wall (runner-up acquire_fresh 0.08), or explicit operator override naming phrases. No UPSAMPLE 11+. No SECOND_SLOT=4. + +Artifacts: `receipts/jev-refine-morph65-residuals-20260923/`. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph65-broad-reprobe-hold-empty.md b/specs/007-hyperlexical-model/receipts/20260923-morph65-broad-reprobe-hold-empty.md new file mode 100644 index 00000000..e9e8a391 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph65-broad-reprobe-hold-empty.md @@ -0,0 +1,37 @@ +# morph65 live broad residual reprobe — HOLD empty (2026-09-23) + +`name_gate=false`. BEST=**morph65**. Gate **soft_ceiling ARMED**. + +## Authority + +Operator **continue**. Jev meta: **broad_residual_reprobe** (0.33 over land_hold_idle). + +## Live surface + +| metric | value | +|--|--:| +| broad OBSERVED exact | **0.88671875** | +| n | **256** | +| residuals | **29** | +| METHOD AUTHORIZE / ABSTAIN | **20 / 9** | + +Matches soft_ceiling live prior pincheck. Prior authorize pin was 0.890 n=254. + +## Jev qualify + +| step | result | +|--|--| +| qualify (19 unique AUTHORIZE) | **defer_quality=18** · already_variant=1 · **force_expand_safe=0** | +| next | **land_hold_empty** 0.86 | + +`highkey shawty` tagged already_variant (morph76 settled). Prior defer wall + idiom-like NEW residuals all deferred. + +## Effect + +Gold card still **empty**. No settle / force / train. + +## Next + +Await **`authorize morph78`** / **`authorize val-settle`** with **named phrases**, or a new acquire direction. Soft_ceiling remains armed. + +Artifacts: `receipts/morph65-broad-reprobe-soft-ceiling-20260923/`. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph65-broad-residual-diag-hold.md b/specs/007-hyperlexical-model/receipts/20260923-morph65-broad-residual-diag-hold.md new file mode 100644 index 00000000..fa18aa57 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph65-broad-residual-diag-hold.md @@ -0,0 +1,29 @@ +# morph65 broad residual diag + METHOD morph43 — HOLD (2026-09-23) + +`name_gate=false`. BEST=**morph65**. + +## Why + +Force-surface fair already **1.0** n=164 after OBSERVED scaffolding demote. Recipe train blocked. Broad diag maps the remaining gold wall. + +## Scores (no force) + +| surface | unbind_exact | n | +|--|--:|--:| +| val all | 0.921 | 355 | +| val OBSERVED | **0.890** | 254 | +| val INFERRED | 1.0 | 101 | +| prior force fair | **1.0** | 164 | + +## METHOD morph43 + +n=28 OBSERVED residuals. **AUTHORIZE=9 / ABSTAIN=19**. + +Authorize phrases (8): +`admin abuse`, `aloha snackbar`, `bling bling`, `lowkenuinely how do these people exist`, `my guy`, `quit lit`, `real eyes realize clanker lies!!!`, `using a beard` + +ABSTAIN mostly dictionary-idiom harvest + case/morph. + +## Next + +**HOLD.** Gold force/hard expand on authorize phrases is prepared but **not launched** pending explicit operator authorize (Jev: land_hold 0.85). No UPSAMPLE/SECOND_SLOT. No morph76 yet. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph72-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260923-morph72-40ep-reject-vs-best.md new file mode 100644 index 00000000..d1d71414 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph72-40ep-reject-vs-best.md @@ -0,0 +1,28 @@ +# morph72 REJECT_VS_BEST — UPSAMPLE=10 non-warm (2026-09-23) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## Gate + +| | | +|--|--| +| best | **0.9532163742690059** (ep22, 163/171) | +| fair morph65 | **0.9649122807017544** (165/171) | +| decision | **REJECT_VS_BEST** (best < fair) | +| E2 trunk-forward | **PASS** (`unbind_exact=1.0`) | +| container | `hlx-train-morph72-1790129677` exit 0 | +| BEST | stays **morph65** | + +## Knob + +`HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=10` (was 8 on morph71; BEST morph65 envelope). Same morph71 force/hard **217/258**. Non-warm. SECOND_SLOT=2 / LAST=8 held. + +Note: peak **below** morph71's 0.9591 (UPSAMPLE=8 non-warm) — UPSAMPLE=10 did not help on this surface. + +## Residuals (best) + +n=8 all INFERRED. METHOD morph43 AUTHORIZE **0** / ABSTAIN **8**. Do not burn force_added=0 / identical UPSAMPLE=10 replay. + +## Next + +Hold BEST morph65. Residual AUTHORIZE=0. Upsample freeze remains **11+**. No SECOND_SLOT=4. No morph73 without a new legal one-knob. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph72-upsample10-nonwarm-inflight.md b/specs/007-hyperlexical-model/receipts/20260923-morph72-upsample10-nonwarm-inflight.md new file mode 100644 index 00000000..a0dc6712 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph72-upsample10-nonwarm-inflight.md @@ -0,0 +1,22 @@ +# morph72 IN FLIGHT — UPSAMPLE=10 non-warm (2026-09-23) + +**Authority:** operator handle-new-legal-one-knob-and-continue. `name_gate=false`. + +## Recommendation (executed) + +After morph71 REJECT (non-warm UPSAMPLE=8, best 0.9591 < fair 0.9649 n=171, residual AUTHORIZE=0), next legal one-knob is **restore BEST morph65 UPSAMPLE=10** on the same morph71 force/hard. Freeze remains **11+** only. Warm morph65 still blocked by expanded role vocab (`pos_6+`). + +## Knob + +| | | +|--|--| +| one_knob | `HYPERLEX_UNBIND_OBSERVED_UPSAMPLE=10` (was 8 on morph71) | +| force / hard | **217 / 258** (copied from morph71; force_added=0) | +| warm / INIT_FROM | **none** | +| fair morph65 | **0.9649122807017544** n=171 | +| SECOND_SLOT / LAST | 2 / 8 held | +| SAVE_BEST | 1 | +| mem_fraction | 0.3 exclusive | +| container | `hlx-train-morph72-1790129677` | + +PIN iff best > fair **0.9649122807017544** n=171 and E2 trunk-forward `unbind_exact=1.0`. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph73-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260923-morph73-40ep-reject-vs-best.md new file mode 100644 index 00000000..c912e45f --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph73-40ep-reject-vs-best.md @@ -0,0 +1,28 @@ +# morph73 REJECT_VS_BEST — INIT_EXPAND_VOCAB warm morph65 (2026-09-23) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## Gate + +| | | +|--|--| +| best | **0.9649122807017544** (ep10, 165/171) | +| fair morph65 | **0.9649122807017544** (165/171) | +| decision | **REJECT_VS_BEST** (best == fair; tie ≠ promote) | +| E2 trunk-forward | **PASS** (`unbind_exact=1.0`) | +| container | `hlx-train-morph73-1790148566` exit 0 | +| BEST | stays **morph65** | + +## Knob + +`HYPERLEX_INIT_EXPAND_VOCAB=1` + `HYPERLEX_INIT_FROM=seed-morph65` (warm-expand). Expand applied: roles mapped 10/10 (+2 new), fillers mapped 1980/1980 (+26 new). Same morph72=morph71 force/hard **217/258** (force_added=0). UPSAMPLE=10 / SECOND_SLOT=2 / LAST=8 held. Hang-fix `loop.py`. + +Note: peak **ties** fair — expand-warm recovered to morph65 exact but did not exceed. Strictly greater required. + +## Residuals (best) + +n=6 all INFERRED (2 positional / 4 type_slot). METHOD morph43 AUTHORIZE **0** / ABSTAIN **6** (scaffolding/wiki/etym). Do not burn force_added=0 / fair-tie / identical expand-warm replay. + +## Next + +Hold BEST morph65. Residual AUTHORIZE=0. Upsample freeze remains **11+**. No SECOND_SLOT=4. No morph74 without a new legal one-knob. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph73-expand-warm-inflight.md b/specs/007-hyperlexical-model/receipts/20260923-morph73-expand-warm-inflight.md new file mode 100644 index 00000000..770b7205 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph73-expand-warm-inflight.md @@ -0,0 +1,41 @@ +# morph73 IN FLIGHT — INIT_EXPAND_VOCAB=1 warm morph65 (2026-09-23) + +**Authority:** operator handle-the-knob-first-and-continue 2026-09-23 after morph72 REJECT. + +## One knob + +`HYPERLEX_INIT_EXPAND_VOCAB=1` + `HYPERLEX_INIT_FROM=seed-morph65` (warm-expand). + +Warm morph65 was blocked after morph71 harvest added `pos_6`/`pos_7` (+ new fillers). Expand remap copies overlapping role/filler rows by name; new vocab rows stay at init. Default fail-closed mismatch preserved when env unset. + +## Held + +| knob | value | +|------|-------| +| force/hard | morph72 = morph71 (217/258); force_added=0 | +| UPSAMPLE | 10 (morph72 / BEST envelope) | +| SECOND_SLOT | 2 | +| LAST_TRAINABLE | 8 | +| SAVE_BEST | 1 | +| mem_fraction | 0.3 exclusive | +| epochs / lr / batch | 40 / 2e-5 / 8 | + +## Gate + +Same-surface fair: morph65 BEST on morph73 force = **0.9649122807017544** n=171. Promote iff best > fair and E2 trunk-forward unbind_exact=1.0. + +## Live + +| field | value | +|-------|-------| +| container | `hlx-train-morph73-1790148566` | +| fair | 0.9649122807017544 n=171 | +| loop.md5 | `75f63a7d272ed7c8f7d430f4d9439b8b` | + +## Freeze + +Upsample 11+ frozen. No SECOND_SLOT=4. Qwen stays stopped. + +## Private + +`~/hlx-private/p1-spark-morph73-expand-warm-20260923` + `~/hlx-private/p1-spark-morph73-40ep-expand-warm-20260923` diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph74-40ep-reject-vs-best.md b/specs/007-hyperlexical-model/receipts/20260923-morph74-40ep-reject-vs-best.md new file mode 100644 index 00000000..41ed55a7 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph74-40ep-reject-vs-best.md @@ -0,0 +1,28 @@ +# morph74 REJECT_VS_BEST — acquire-settle after SoT clean (2026-09-23) + +`name_gate=false`. Exclusive mem 0.3. Qwen stopped+disabled. + +## Gate + +| | | +|--|--| +| best | **0.9820359281437125** (ep15, 164/167) | +| fair morph65 | **0.9880239520958084** (165/167) | +| decision | **REJECT_VS_BEST** (best < fair; strictly greater required) | +| E2 trunk-forward | **PASS** (`unbind_exact=1.0`) | +| container | `hlx-train-morph74-1790179734` exit 0 | +| BEST | stays **morph65** | + +## Knob + +Acquire-settle force expand after SoT scaffolding clean (−57 INFERRED wiki chrome): settle `to the moon` + `elo hell` → force **221** / hard **262** (`force_added=4`). Warm morph65 + `INIT_EXPAND_VOCAB=1`. UPSAMPLE=10 / SECOND_SLOT=2 / LAST=8 held. + +Peak **0.982** never beat fair **0.988**. E2 PASS does not promote alone. + +## Residuals (best) + +n=3 (1 INFERRED / 2 OBSERVED; 2 positional / 1 type_slot). METHOD morph43 AUTHORIZE **0** / ABSTAIN **3** (scaffolding chrome + URL/case). See `receipts/morph74-acquire-settle-20260923/`. + +## Next + +Hold BEST morph65. Residual AUTHORIZE=0 → no new recipe knob. Upsample freeze **11+**. No SECOND_SLOT=4. Path to 1.0 remains gold/SoT (OBSERVED scaffolding chrome still in residual), not UPSAMPLE/SECOND_SLOT. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph74-acquire-settle-inflight.md b/specs/007-hyperlexical-model/receipts/20260923-morph74-acquire-settle-inflight.md new file mode 100644 index 00000000..3c1d857d --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph74-acquire-settle-inflight.md @@ -0,0 +1,12 @@ +# morph74 CLOSED — REJECT_VS_BEST (was IN FLIGHT) + +See `20260923-morph74-40ep-reject-vs-best.md` + `morph74-acquire-settle-20260923/`. + +| field | final | +|-------|-------| +| container | `hlx-train-morph74-1790179734` exit 0 | +| best | 0.9820359281437125 (ep15) | +| fair | 0.9880239520958084 n=167 | +| decision | REJECT_VS_BEST | +| E2 | PASS | +| BEST | morph65 held | diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph75-scaff-demote-fair-ceiling.md b/specs/007-hyperlexical-model/receipts/20260923-morph75-scaff-demote-fair-ceiling.md new file mode 100644 index 00000000..d7331803 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph75-scaff-demote-fair-ceiling.md @@ -0,0 +1,27 @@ +# morph75 CANCELLED — OBSERVED scaffolding demote clears fair to 1.0 (2026-09-23) + +`name_gate=false`. BEST=**morph65** held. + +## Adapt (one knob) + +After morph74 REJECT (0.982 < fair 0.988) with residual AUTHORIZE=0 on OBSERVED wiki chrome, demote that chrome instead of recipe replay: + +| surface | before → after | +|--|--| +| SoT OBSERVED demoted | 2 (`Alternative form of bussin'.`, `1. (neologism) brain rot`) | +| harvest MW dropped | 4 (dual-scheme) | +| force / hard | **221→220** / **262→261** | +| live unbind scaff_chrome | **0** | +| durable reject | type_slot tag strip (`TOKEN:Alternative …` → wiki_alt_form) | + +## Fair + +morph65 BEST on morph75 force surface: **unbind_exact=1.0** n=164 (164/164). Token/slot F1=1.0. + +## Train + +`hlx-train-morph75-1790199483` **stopped**. Fair gate needs strictly greater than fair; best > 1.0 is impossible. Do not burn 40ep REJECT-only. + +## Next + +**HOLD** on recipe knobs. This force surface is cleared for morph65. Further 1.0 work is other gold/SoT surfaces or operator-authorized new civilian OBSERVED — not UPSAMPLE/SECOND_SLOT. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph76-acquire-settle-cancelled-fair-ceiling.md b/specs/007-hyperlexical-model/receipts/20260923-morph76-acquire-settle-cancelled-fair-ceiling.md new file mode 100644 index 00000000..aa3c5319 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph76-acquire-settle-cancelled-fair-ceiling.md @@ -0,0 +1,32 @@ +# morph76 acquire-settle — CANCELLED_FAIR_CEILING (2026-09-23) + +`name_gate=false`. BEST=**morph65**. + +## Done (kept) + +Fresh urban acquire outside emptied residual wall + prior morph74 set: + +| | | +|--|--:| +| candidates | 31 (29 unique) | +| METHOD morph43 AUTHORIZE | 31 | +| Jev force_expand_safe | 4 | +| Jev settle_high_conf | **2** — `highkey shawty`, `quiet quitting` | +| INFERRED→OBSERVED | **1** (`highkey shawty`) | +| force / hard | **220→224 / 261→265** (`force_added=4`) | + +## Fair / train + +| | | +|--|--| +| fair morph65 on morph76 force | **1.0** n=164 | +| container | `hlx-train-morph76-1790202540` | +| status | **CANCELLED_FAIR_CEILING** (stopped ~20s; no burn) | + +New atoms landed train-split → val n unchanged → promote gate cannot be strictly greater than 1.0. + +## Jev next + +**hold_val_acquire** (0.55): HOLD; next acquire must target **val-split** atoms so fair n moves off the ceiling. + +No UPSAMPLE 11+. No SECOND_SLOT=4. Do not relaunch force-only morph77 on this surface. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph77-val-acquire-label-hold.md b/specs/007-hyperlexical-model/receipts/20260923-morph77-val-acquire-label-hold.md new file mode 100644 index 00000000..8de84046 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph77-val-acquire-label-hold.md @@ -0,0 +1,34 @@ +# morph77 val-split acquire + METHOD morph43 — HOLD (2026-09-23) + +`name_gate=false`. BEST=**morph65**. + +## Why + +morph76 CANCELLED_FAIR_CEILING (train-split atoms; fair stayed 1.0 n=164). Jev: **val_acquire_label_hold** — acquire+label only; await explicit authorize before settle/train. + +## Acquire + +| | | +|--|--:| +| candidates (unique) | 30 | +| all `split=val` | **yes** | +| already OBSERVED | 7 | +| NEW | 23 | +| METHOD AUTHORIZE | 30 | + +## Jev qualify + +force_expand_safe=13 (10 NEW). Card choice **card_high_conf_new** (conf≥0.40 NEW): + +1. `we're so back` +2. `clutch up` +3. `bet that up` +4. `real talk` + +## Next + +**HOLD.** Explicit authorize (`authorize morph77` / `authorize val-settle`) → settle these 4 as OBSERVED with **split=val** → force/hard expand → re-fair (expect fair n > 164) → morph77 warm morph65. + +Do not auto-settle. No UPSAMPLE 11+. No SECOND_SLOT=4. + +Artifacts: `receipts/morph77-val-acquire-label-hold-20260923/`. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph77-val-settle-cancelled-fair-ceiling.md b/specs/007-hyperlexical-model/receipts/20260923-morph77-val-settle-cancelled-fair-ceiling.md new file mode 100644 index 00000000..6547ee37 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph77-val-settle-cancelled-fair-ceiling.md @@ -0,0 +1,37 @@ +# morph77 authorize val-settle — CANCELLED_FAIR_CEILING (2026-09-23) + +`name_gate=false`. BEST=**morph65**. + +## Authority + +Operator: **`authorize val-settle`**. + +## Settle (kept) + +| phrase | class | split | +|--|--|--| +| `we're so back` | OBSERVED | val | +| `clutch up` | OBSERVED | val | +| `bet that up` | OBSERVED | val | +| `real talk` | OBSERVED | val | + +Force/hard: **224→232 / 265→273** (`force_added=8` dual-scheme). + +## Fair + +| | | +|--|--:| +| fair morph65 | **1.0** | +| fair n | **164** (unchanged) | + +## Why val-split did not move fair n + +Fair gate applies the **same** `apply_unbind_force_train` path. Force keys are moved **out of val** before scoring. Putting AUTHORIZE atoms on `split=val` then listing them in force cannot grow fair n — they leave the fair surface. + +## Decision + +Train **not launched**. Jev: **stop_force_climb** — force-surface climb done at morph65 fair **1.0**. Settle kept in SoT. + +## Next + +No morph78 force-only while fair ceiling = 1.0 n=164. Optional later: broad OBSERVED (0.890) path, or operator gate change. Upsample freeze 11+. No SECOND_SLOT=4. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph78-fresh-acquire-hold-empty.md b/specs/007-hyperlexical-model/receipts/20260923-morph78-fresh-acquire-hold-empty.md new file mode 100644 index 00000000..9cd92559 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph78-fresh-acquire-hold-empty.md @@ -0,0 +1,41 @@ +# morph78 soft_ceiling — fresh acquire HOLD empty gold (2026-09-23) + +`name_gate=false`. BEST=**morph65**. Gate **soft_ceiling ARMED**. + +## Authority + +Operator **continue** after soft_ceiling arm. Acquire+label only — not settle/train authorize. + +## Acquire + METHOD morph43 + +| field | value | +|--|--:| +| queries | 39 | +| candidate atoms | **37** (all `split=val`) | +| AUTHORIZE (morph43) | **37** | +| new_to_sot | 27 | +| already_in_sot | 10 | + +## Jev + +| step | result | +|--|--| +| meta next | **hold_await_authorize** 0.99 | +| qualify | **defer_quality=35** · already_variant=2 · **force_expand_safe=0** | +| empty-next | **land_hold_empty** 0.51 (runner-up revisit_morph77_safe_new 0.29) | +| revisit morph77 leftovers | force_expand_safe=5 but safe_new card≥0.40 = **0** | + +## Effect + +Gold authorize card is **empty**. No settle. No force expand. No morph78 train. + +## Next + +Await explicit operator: + +- **`authorize morph78`** / **`authorize val-settle`** naming override phrases, or +- a new acquire direction / phrase list + +Do not launch force-only ceiling burn. Upsample freeze 11+. No SECOND_SLOT=4. + +Artifacts: `receipts/morph78-fresh-acquire-label-hold-20260923/`. diff --git a/specs/007-hyperlexical-model/receipts/20260923-morph78-soft-ceiling-hold-fresh-acquire.md b/specs/007-hyperlexical-model/receipts/20260923-morph78-soft-ceiling-hold-fresh-acquire.md new file mode 100644 index 00000000..bffe1cef --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-morph78-soft-ceiling-hold-fresh-acquire.md @@ -0,0 +1,24 @@ +# morph78 under soft_ceiling — HOLD fresh acquire (2026-09-23) + +`name_gate=false`. BEST=**morph65**. Gate **soft_ceiling ARMED**. + +## Why no train yet + +Gold force/hard expand from morph65 residual AUTHORIZE is **empty** (Jev defer_quality=8). Launching morph78 force-only on n=164 under the old gate was cancelled; under soft_ceiling we still need a **legal one-knob** with real gold — not an empty expand and not UPSAMPLE/SECOND_SLOT. + +## Legal next card + +1. Fresh civilian acquire (outside deferred residual wall). +2. METHOD morph43 label → qualify AUTHORIZE only. +3. Explicit operator authorize settle → force/hard expand from morph77 tip (232/273). +4. Fair morph65 on new force surface (advisory if still 1.0). +5. morph78 warm morph65 + INIT_EXPAND_VOCAB; finish via `finish_soft_ceiling` (ceiling escape → broad OBSERVED > PRIOR + E2). + +## Not this card + +- Upsample 11+ +- SECOND_SLOT=4 +- Invented OBSERVED +- Hub / name_gate +- Force-only ceiling burn without new gold +- Override deferred AUTHORIZE phrases without explicit operator yes diff --git a/specs/007-hyperlexical-model/receipts/20260923-sot-clean-acquire-civilian.md b/specs/007-hyperlexical-model/receipts/20260923-sot-clean-acquire-civilian.md new file mode 100644 index 00000000..24eefb26 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/20260923-sot-clean-acquire-civilian.md @@ -0,0 +1,36 @@ +# SoT scaffolding clean + civilian acquire (2026-09-23) + +**Authority:** operator 2026-09-23 — clean SoT so wiki/scaffolding INFERRED rows stop defining the residual wall; acquire new data if necessary. + +`name_gate=false`. Brier null. No Hub. No invented OBSERVED fillers. + +## Clean + +| | | +|--|--| +| ingest before → after | **4347 → 4290** (−57 INFERRED chrome) | +| harvest sidecar | 883 → 883 (0 dropped; OBSERVED MW clean) | +| live unbind chrome after | **0** residual-theme hits | +| durable reject | `export.reject_wiki_scaffolding_text` + `reject_candidate_text` | + +Quarantine reasons: quotations 19, wiktionary 13, alt_form 5, declension 4, trends 4, synonym/antonym tables 5, etymology 3, neologism gloss 2, lang gloss 2. + +Private: `~/hlx-private/p1-spark-sot-clean-scaffolding-20260923/` + +## Acquire + +Urban (+ reddit stubs) for brainrot / crypto / gaming MW slang. METHOD morph43 positional_text_split_match: + +| | n | +|--|--:| +| candidates | 33 | +| AUTHORIZE | 13 | +| ABSTAIN | 20 (noise / non-canon) | +| already OBSERVED in SoT | 11 | +| INFERRED→OBSERVED settle | **2** (`to the moon`, `elo hell`) | + +## morph74 one-knob + +Force/hard expand for settled atoms: **217→221 / 258→262** (`force_added=4` dual-scheme). Warm morph65 + `INIT_EXPAND_VOCAB=1`. UPSAMPLE=10 / SECOND_SLOT=2 / LAST=8 held. Fair morph65 on morph74 force = **0.9880239520958084** n=167 (was 0.9649 n=171 pre-clean). Upsample freeze **11+**. Container `hlx-train-morph74-1790179734`. + +See `receipts/20260923-morph74-acquire-settle-inflight.md`. diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/GATE_SOFT_CEILING.json b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/GATE_SOFT_CEILING.json new file mode 100644 index 00000000..0b10762d --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/GATE_SOFT_CEILING.json @@ -0,0 +1,69 @@ +{ + "schema": "hyperlex.gate_soft_ceiling_tiebreak.v0.1", + "status": "ARMED", + "authorized_at": "2026-09-23T22:51:00+00:00", + "auth": "operator authorize gate soft_ceiling 2026-09-23", + "name_gate": false, + "prior_best": "seed-morph65", + "force_fair_ceiling": { + "exact": 1.0, + "n": 164, + "note": "Force keys leave fair val; expand cannot grow n. morph75-77 CANCELLED_FAIR_CEILING." + }, + "authorize_pin_historical": { + "seed": "seed-morph65", + "unbind_exact": 0.889763779527559, + "n": 254, + "source_receipt": "morph65-broad-residual-diag-20260923/morph65-broad-residual-diag.json", + "note": "Pin at authorize before morph77 settle grew OBSERVED val." + }, + "live_prior_broad_pincheck_post_morph77": { + "as_of": "2026-09-23T22:59:00+00:00", + "model": "seed-morph65", + "unbind_exact": 0.88671875, + "n": 256, + "path": "/home/morpheus/hlx/broad-eval-morph65-pincheck.json", + "note": "After morph77 val-settle (+4 OBSERVED). Finish must re-eval PRIOR on current SoT." + }, + "rules": { + "when_force_fair_lt_1": { + "promote_if": [ + "candidate best unbind_exact > force_fair exact on same force surface", + "val_n == force_fair n", + "E2 trunk-forward unbind_exact == 1.0" + ] + }, + "when_force_fair_eq_1": { + "promote_if": [ + "candidate broad OBSERVED val (no force) > PRIOR morph65 broad OBSERVED on same live SoT", + "candidate broad n == prior broad n", + "E2 trunk-forward unbind_exact == 1.0" + ], + "fallback_if_no_prior_eval": "authorize_pin_historical strictly greater + n match", + "note": "Force-fair advisory; do not cancel solely for force-fair 1.0." + } + }, + "constraints_unchanged": [ + "no Hub", + "name_gate=false", + "schemes positional|type_slot only", + "Brier null", + "LAST_TRAINABLE max 8", + "upsample freeze 11+", + "no SECOND_SLOT=4", + "no invented OBSERVED", + "METHOD morph43 for residual labels" + ], + "jev": { + "pairwise_prefer": "soft_ceiling_tiebreak", + "pairwise_score": 0.8, + "adopt_strength": "moderate" + }, + "spark_paths": { + "gate_pin": "/home/morpheus/hlx/GATE_SOFT_CEILING.json", + "eval_helper": "/home/morpheus/hlx/eval_broad_observed.py", + "run_eval": "/home/morpheus/hlx/run_broad_eval.sh", + "finish_template": "/home/morpheus/hlx/finish_soft_ceiling.py", + "decision_helper": "/home/morpheus/hlx/gate_soft_ceiling_decide.py" + } +} diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/METHOD.md b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/METHOD.md new file mode 100644 index 00000000..ba922654 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/METHOD.md @@ -0,0 +1,9 @@ +# soft_ceiling gate pack — method + +Authority: operator `authorize gate soft_ceiling` 2026-09-23. + +ARMED soft_ceiling_tiebreak: +- force_fair < 1.0 → classic strictly greater + E2 +- force_fair == 1.0 → candidate broad OBSERVED > PRIOR morph65 on live SoT + E2 + +Spark: GATE_SOFT_CEILING.json, eval_broad_observed.py, run_broad_eval.sh, gate_soft_ceiling_decide.py, finish_soft_ceiling.py. diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/broad-eval-morph65-pincheck.json b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/broad-eval-morph65-pincheck.json new file mode 100644 index 00000000..31c5cbae --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/broad-eval-morph65-pincheck.json @@ -0,0 +1,26 @@ +{ + "schema": "hyperlex.broad_observed_eval.v0.1", + "as_of": "2026-09-23T23:00:20.622872+00:00", + "gate": "soft_ceiling_tiebreak", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "force": null, + "unbind_exact": 0.88671875, + "n_scored": 256, + "scored": { + "unbind_exact": 0.88671875, + "n_unbind_eval": 256, + "unbind_token_f1": 0.9279141104294478, + "unbind_token_precision": 0.9279141104294478, + "unbind_token_recall": 0.9279141104294478, + "unbind_slot_f1": 0.9279141104294478 + }, + "baseline": { + "seed": "seed-morph65", + "unbind_exact": 0.889763779527559, + "n": 254 + }, + "beats_baseline": false, + "delta": -0.003045029527559029, + "surface_ok": false, + "note": "Broad OBSERVED val without apply_unbind_force_train. soft_ceiling escape hatch when force-fair == 1.0." +} diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/eval_broad_observed.py b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/eval_broad_observed.py new file mode 100644 index 00000000..19d4c725 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/eval_broad_observed.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +"""Score a Hyperlex encoder on broad OBSERVED unbind val (no force shrink). + +Used by soft_ceiling_tiebreak when force-fair == 1.0: promote requires +candidate broad OBSERVED exact > morph65 baseline 0.889763779527559 n=254. + +Env: + HLX_FAIR_MODEL model dir (default morph65 BEST) + HLX_BROAD_OUT output JSON path + HLX_BROAD_PRIV optional private copy dir +""" +from __future__ import annotations + +import json +import os +import sys +from datetime import datetime, timezone +from pathlib import Path + +ROOT = Path("/home/morpheus/Hyperlex") +sys.path.insert(0, str(ROOT / "scripts/shadow")) + +import torch +from torch import nn +from transformers import AutoModel, AutoTokenizer +from hyperlexical.export import export_dataset, repo_root +from hyperlexical.layout import HIDDEN +from hyperlexical.eval_forward import ( + apply_encoder_trainable, + score_unbind_exact, + _weight_parts, + _load_maps, + _load_filler_head, +) + +TRUNK = Path( + os.environ.get( + "HYPERLEX_TRUNK_DIR", + str(Path.home() / ".hyperlex/models/trunks/ModernBERT-base"), + ) +) +MODEL = Path( + os.environ.get( + "HLX_FAIR_MODEL", + str(Path.home() / ".hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65"), + ) +) +OUT = Path( + os.environ.get( + "HLX_BROAD_OUT", + "/home/morpheus/hlx/broad-eval-observed.json", + ) +) +PRIV = Path(os.environ["HLX_BROAD_PRIV"]) if os.environ.get("HLX_BROAD_PRIV") else None + +# Authorize-time pin (historical). Live soft_ceiling compare uses PRIOR eval. +PIN_EXACT = 0.889763779527559 +PIN_N = 254 + + +def _model_root(model: Path) -> Path: + if (model / "model.safetensors").is_file(): + return model + if (model / "best" / "model.safetensors").is_file(): + return model / "best" + return model + + +def main() -> int: + os.environ.pop("HYPERLEX_UNBIND_FORCE_TRAIN_PATH", None) + bundle = export_dataset(repo_root(), include_live=True) + rows = [r for r in bundle["rows"] if r.get("task") == "unbind"] + val = [r for r in rows if r.get("split") == "val"] + val_obs = [r for r in val if str(r.get("class") or "").upper() == "OBSERVED"] + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + root = _model_root(MODEL) + weight_path = root / "model.safetensors" + assert weight_path.is_file(), weight_path + maps_dir = MODEL if (MODEL / "atom_map.json").is_file() else root + + tok = AutoTokenizer.from_pretrained(str(TRUNK), local_files_only=True) + enc = AutoModel.from_pretrained(str(TRUNK), local_files_only=True) + filler_state, encoder_tensors, heads_blob = _weight_parts(weight_path, torch) + apply_encoder_trainable(enc, encoder_tensors) + maps = _load_maps(maps_dir, heads_blob) + hidden = int(getattr(enc.config, "hidden_size", HIDDEN)) + filler_head = _load_filler_head(nn, hidden, filler_state, maps) + enc.to(device) + filler_head.to(device) + + scored = score_unbind_exact(enc, filler_head, tok, maps, val_obs, device) + exact = float(scored.get("unbind_exact") or 0) + n = int(scored.get("n_unbind_eval") or scored.get("n") or 0) + + out = { + "schema": "hyperlex.broad_observed_eval.v0.1", + "as_of": datetime.now(timezone.utc).isoformat(), + "gate": "soft_ceiling_tiebreak", + "model": str(MODEL), + "force": None, + "unbind_exact": exact, + "n_scored": n, + "scored": scored, + "authorize_pin": { + "seed": "seed-morph65", + "unbind_exact": PIN_EXACT, + "n": PIN_N, + "note": "Historical at gate authorize; live SoT may differ", + }, + "note": ( + "Broad OBSERVED val without apply_unbind_force_train. " + "soft_ceiling: compare candidate vs PRIOR on this same live surface." + ), + } + OUT.parent.mkdir(parents=True, exist_ok=True) + OUT.write_text(json.dumps(out, indent=2) + "\n") + if PRIV is not None: + PRIV.mkdir(parents=True, exist_ok=True) + (PRIV / OUT.name).write_text(OUT.read_text()) + print( + json.dumps( + {k: out[k] for k in ["unbind_exact", "n_scored", "model"]}, + indent=2, + ) + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/finish_soft_ceiling.py b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/finish_soft_ceiling.py new file mode 100644 index 00000000..4ff4fea8 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/finish_soft_ceiling.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 +"""Finish template under soft_ceiling_tiebreak. + +When FAIR < 1.0: classic force-fair strictly-greater + E2 + same n. +When FAIR == 1.0: require broad OBSERVED eval > morph65 baseline + E2. + +Copy/adapt per morph: set MORPH, OUT, PRIV, FAIR, FAIR_N, GATE_OWNER, +and BROAD_EVAL path (written by poll after train via eval_broad_observed.py). +""" +from __future__ import annotations + +import json +import os +import sys +from datetime import datetime, timezone +from pathlib import Path + +sys.path.insert(0, "/home/morpheus/hlx") +from gate_soft_ceiling_decide import decide # noqa: E402 + +FAIR = 1.0 +FAIR_N = 164 +MORPH = 0 # set per morph +OUT = Path("/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph0") +PRIOR = Path("/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65") +MODELS = Path("/home/morpheus/.hyperlex/models") +PRIV = Path("/home/morpheus/hlx-private/p1-spark-morph0-soft-ceiling") +LOCK = PRIV / "GATE_LOCK.json" +GATE_OWNER = os.environ.get("GATE_OWNER", "morph0-soft-ceiling") +E2_SRC = Path("/home/morpheus/hlx/e2-unbind-morph0.json") +BROAD_EVAL = Path("/home/morpheus/hlx/broad-eval-morph0.json") +PRIOR_BROAD_EVAL = Path("/home/morpheus/hlx/broad-eval-prior-morph65.json") +GATE_PIN = Path("/home/morpheus/hlx/GATE_SOFT_CEILING.json") + + +def main() -> int: + PRIV.mkdir(parents=True, exist_ok=True) + receipt = OUT / "train-receipt.json" + if not receipt.is_file(): + print("NO_RECEIPT", file=sys.stderr) + return 2 + if not E2_SRC.is_file(): + print("NO_E2", file=sys.stderr) + return 3 + prior_ok = (PRIOR / "model.safetensors").is_file() or ( + PRIOR / "best" / "model.safetensors" + ).is_file() + if not PRIOR.is_dir() or not prior_ok: + print("PRIOR_MISSING", file=sys.stderr) + return 4 + if LOCK.is_file(): + existing = json.loads(LOCK.read_text()) + if existing.get("status") == "done": + print(json.dumps({"already_gated": True, "lock": existing}, indent=2)) + return 0 + owner = existing.get("gate_owner") + if owner and owner != GATE_OWNER and existing.get("status") == "in_progress": + print(json.dumps({"blocked_by_other_gate": True, "lock": existing}, indent=2)) + return 5 + + LOCK.write_text( + json.dumps( + { + "gate_owner": GATE_OWNER, + "started_at": datetime.now(timezone.utc).isoformat(), + "pid": os.getpid(), + "status": "in_progress", + "gate": "soft_ceiling_tiebreak", + }, + indent=2, + ) + + "\n" + ) + + r = json.loads(receipt.read_text()) + e2 = json.loads(E2_SRC.read_text()) + best_exact = float(r.get("best_unbind_exact") or r["val"]["unbind_exact"]) + best_epoch = r.get("best_epoch") or r.get("val", {}).get("epoch") + val_n = int(r.get("val", {}).get("n_unbind_eval") or 0) + e2_pass = ( + bool(e2.get("e2_pass")) + and float(e2.get("unbind_exact") or 0) == 1.0 + and bool(e2.get("trunk_forward")) + ) + + broad_exact = None + broad_n = None + broad = None + if BROAD_EVAL.is_file(): + broad = json.loads(BROAD_EVAL.read_text()) + broad_exact = float(broad.get("unbind_exact") or 0) + broad_n = int(broad.get("n_scored") or broad.get("n_unbind_eval") or 0) + + prior_broad_exact = None + prior_broad_n = None + prior_broad = None + if PRIOR_BROAD_EVAL.is_file(): + prior_broad = json.loads(PRIOR_BROAD_EVAL.read_text()) + prior_broad_exact = float(prior_broad.get("unbind_exact") or 0) + prior_broad_n = int( + prior_broad.get("n_scored") or prior_broad.get("n_unbind_eval") or 0 + ) + + verdict = decide( + force_fair=FAIR, + force_fair_n=FAIR_N, + best_exact=best_exact, + val_n=val_n, + e2_pass=e2_pass, + broad_exact=broad_exact, + broad_n=broad_n, + prior_broad_exact=prior_broad_exact, + prior_broad_n=prior_broad_n, + ) + promote = bool(verdict["promote"]) + decision = str(verdict["decision"]) + + best_link = MODELS / "BEST" + if promote: + if best_link.is_symlink() or best_link.exists(): + best_link.unlink() + best_link.symlink_to(OUT) + (MODELS / "BEST.path").write_text(str(OUT) + "\n") + + pin = { + "schema": "hyperlex.hyperlexical.best_pin.v0.1", + "decision": "PIN_BEST" if promote else decision, + "seed": f"seed-morph{MORPH}", + "path": str(OUT), + "prior_best": "seed-morph65", + "gate": "soft_ceiling_tiebreak", + "gate_mode": verdict.get("mode"), + "prior_unbind_exact": FAIR, + "fair_val_n": FAIR_N, + "best_unbind_exact": best_exact, + "best_epoch": best_epoch, + "val_best": r.get("val"), + "val_n_train_receipt": val_n, + "broad_observed": { + "exact": broad_exact, + "n": broad_n, + "baseline_exact": verdict.get("broad_baseline"), + "baseline_n": verdict.get("broad_baseline_n"), + "baseline_src": verdict.get("broad_baseline_src"), + "prior_exact": prior_broad_exact, + "prior_n": prior_broad_n, + "path": str(BROAD_EVAL) if BROAD_EVAL.is_file() else None, + "prior_path": str(PRIOR_BROAD_EVAL) if PRIOR_BROAD_EVAL.is_file() else None, + }, + "e2": { + "e2_pass": e2_pass, + "unbind_exact": e2.get("unbind_exact"), + "trunk_forward": e2.get("trunk_forward"), + }, + "verdict": verdict, + "name_gate": False, + "pinned_at": datetime.now(timezone.utc).isoformat(), + "gate_owner": GATE_OWNER, + "morph65_preserved": not promote, + "gate_pin": str(GATE_PIN) if GATE_PIN.is_file() else None, + } + + if promote: + (OUT / "pin-promote-best.json").write_text(json.dumps(pin, indent=2) + "\n") + (PRIV / "pin-promote-best.json").write_text(json.dumps(pin, indent=2) + "\n") + (PRIV / "PROMOTE_BEST.md").write_text( + f"# morph{MORPH} PROMOTE BEST (soft_ceiling)\n\n" + f"mode={verdict.get('mode')} decision={decision}\n" + f"{verdict.get('reason')}\n" + ) + (PRIV / "STATUS.txt").write_text("PROMOTE_BEST\n") + else: + (OUT / "pin-no-promote.json").write_text(json.dumps(pin, indent=2) + "\n") + (PRIV / "pin-no-promote.json").write_text(json.dumps(pin, indent=2) + "\n") + (PRIV / "REJECT_VS_BEST.md").write_text( + f"# morph{MORPH} REJECT (soft_ceiling)\n\n" + f"mode={verdict.get('mode')} decision={decision}\n" + f"{verdict.get('reason')}\nBEST stays morph65.\n" + ) + (PRIV / "STATUS.txt").write_text(decision + "\n") + + Path(f"/home/morpheus/hlx/pin-morph{MORPH}.json").write_text( + json.dumps(pin, indent=2) + "\n" + ) + (PRIV / f"pin-morph{MORPH}.json").write_text(json.dumps(pin, indent=2) + "\n") + if broad is not None: + (PRIV / BROAD_EVAL.name).write_text(json.dumps(broad, indent=2) + "\n") + if prior_broad is not None: + (PRIV / PRIOR_BROAD_EVAL.name).write_text(json.dumps(prior_broad, indent=2) + "\n") + if E2_SRC.is_file(): + (PRIV / E2_SRC.name).write_text(E2_SRC.read_text()) + for name in ("train-receipt.json", "best-checkpoint.json", "config-train.json"): + srcp = OUT / name + if srcp.is_file(): + (PRIV / name).write_text(srcp.read_text()) + + lock_done = { + "gate_owner": GATE_OWNER, + "finished_at": datetime.now(timezone.utc).isoformat(), + "status": "done", + "decision": decision, + "promote": promote, + "best_unbind_exact": best_exact, + "best_epoch": best_epoch, + "fair_morph65": FAIR, + "fair_n": FAIR_N, + "gate": "soft_ceiling_tiebreak", + "gate_mode": verdict.get("mode"), + "broad_exact": broad_exact, + "broad_n": broad_n, + "e2_pass": e2_pass, + "surface_ok": verdict.get("surface_ok"), + "val_n": val_n, + "reason": verdict.get("reason"), + } + LOCK.write_text(json.dumps(lock_done, indent=2) + "\n") + (OUT / "GATE_LOCK.json").write_text(json.dumps(lock_done, indent=2) + "\n") + print(json.dumps(lock_done, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/gate_soft_ceiling_decide.py b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/gate_soft_ceiling_decide.py new file mode 100644 index 00000000..f5561ca2 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/gate_soft_ceiling_decide.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +"""Shared soft_ceiling_tiebreak promote decision. + +When force_fair < 1.0: classic force-fair strictly greater + same n + E2. +When force_fair == 1.0: ceiling escape — candidate broad OBSERVED exact must +strictly beat PRIOR (morph65) broad OBSERVED on the same live surface (same n) + E2. + +Authorize-time pin (0.889763779527559 n=254) is historical; live SoT can move +(e.g. morph77 val-settle grew OBSERVED val). Prefer prior_broad_* from a fresh +eval of BEST on current SoT; fall back to pin only if prior eval absent. +""" +from __future__ import annotations + +from typing import Any + + +# Historical pin at authorize (pre morph77 settle surface). Prefer live prior. +PIN_BROAD_EXACT = 0.889763779527559 +PIN_BROAD_N = 254 + + +def decide( + *, + force_fair: float, + force_fair_n: int, + best_exact: float, + val_n: int, + e2_pass: bool, + broad_exact: float | None = None, + broad_n: int | None = None, + prior_broad_exact: float | None = None, + prior_broad_n: int | None = None, +) -> dict[str, Any]: + """Return promote decision under soft_ceiling_tiebreak.""" + ceiling = float(force_fair) >= 1.0 - 1e-12 + if not ceiling: + surface_ok = int(val_n) == int(force_fair_n) + promote = bool(best_exact > force_fair and e2_pass and surface_ok) + if not surface_ok: + decision = "REJECT_SURFACE" + else: + decision = "PROMOTE_BEST" if promote else "REJECT_VS_BEST" + return { + "gate": "soft_ceiling_tiebreak", + "mode": "force_fair", + "promote": promote, + "decision": decision, + "surface_ok": surface_ok, + "force_fair": force_fair, + "force_fair_n": force_fair_n, + "best_exact": best_exact, + "val_n": val_n, + "e2_pass": e2_pass, + "broad_exact": broad_exact, + "broad_n": broad_n, + "prior_broad_exact": prior_broad_exact, + "prior_broad_n": prior_broad_n, + "reason": ( + f"force_fair mode: best {best_exact} > fair {force_fair} " + f"n={force_fair_n} + E2" + ), + } + + if broad_exact is None or broad_n is None: + return { + "gate": "soft_ceiling_tiebreak", + "mode": "ceiling_escape", + "promote": False, + "decision": "REJECT_NO_BROAD_EVAL", + "surface_ok": False, + "force_fair": force_fair, + "force_fair_n": force_fair_n, + "best_exact": best_exact, + "val_n": val_n, + "e2_pass": e2_pass, + "broad_exact": broad_exact, + "broad_n": broad_n, + "prior_broad_exact": prior_broad_exact, + "prior_broad_n": prior_broad_n, + "reason": "force_fair==1.0 but candidate broad OBSERVED eval missing", + } + + # Live prior preferred; else historical pin + if prior_broad_exact is not None and prior_broad_n is not None: + baseline_exact = float(prior_broad_exact) + baseline_n = int(prior_broad_n) + baseline_src = "live_prior_broad" + else: + baseline_exact = PIN_BROAD_EXACT + baseline_n = PIN_BROAD_N + baseline_src = "authorize_pin" + + surface_ok = int(broad_n) == int(baseline_n) + promote = bool(float(broad_exact) > baseline_exact and e2_pass and surface_ok) + if not surface_ok: + decision = "REJECT_BROAD_SURFACE" + else: + decision = "PROMOTE_BEST" if promote else "REJECT_VS_BROAD_BASELINE" + return { + "gate": "soft_ceiling_tiebreak", + "mode": "ceiling_escape", + "promote": promote, + "decision": decision, + "surface_ok": surface_ok, + "force_fair": force_fair, + "force_fair_n": force_fair_n, + "best_exact": best_exact, + "val_n": val_n, + "e2_pass": e2_pass, + "broad_exact": broad_exact, + "broad_n": broad_n, + "prior_broad_exact": prior_broad_exact, + "prior_broad_n": prior_broad_n, + "broad_baseline": baseline_exact, + "broad_baseline_n": baseline_n, + "broad_baseline_src": baseline_src, + "authorize_pin_exact": PIN_BROAD_EXACT, + "authorize_pin_n": PIN_BROAD_N, + "reason": ( + f"ceiling escape: broad {broad_exact} > baseline {baseline_exact} " + f"(src={baseline_src}) n={baseline_n} + E2 " + f"(force_fair={force_fair} advisory)" + ), + } + + +if __name__ == "__main__": + import json + import sys + + payload = json.loads(sys.stdin.read() or "{}") + print(json.dumps(decide(**payload), indent=2)) diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/run_broad_eval.sh b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/run_broad_eval.sh new file mode 100644 index 00000000..85aec2ba --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/run_broad_eval.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail +MODEL=${HLX_FAIR_MODEL:-/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65} +OUT=${HLX_BROAD_OUT:-/home/morpheus/hlx/broad-eval-observed.json} +PRIV=${HLX_BROAD_PRIV:-} +NAME=${HLX_BROAD_NAME:-hlx-broad-$(date +%s)} +if docker ps --format "{{.Names}}" | grep -qE "^hlx-(train|fair|broad)-"; then + echo "REFUSE: GPU job already running" + docker ps --format "{{.Names}}" + exit 9 +fi +ARGS=( + --rm --name "$NAME" --gpus all + -w /home/morpheus/Hyperlex + -v /home/morpheus/.cache:/home/morpheus/.cache + -v /home/morpheus/hlx:/home/morpheus/hlx + -v /home/morpheus/Hyperlex:/home/morpheus/Hyperlex + -v /home/morpheus/.hyperlex:/home/morpheus/.hyperlex + -e HOME=/home/morpheus + -e PYTHONPATH=scripts/shadow + -e TOKENIZERS_PARALLELISM=false + -e HYPERLEX_OFFLINE=1 + -e HF_HUB_OFFLINE=1 + -e HYPERLEX_TRUNK_DIR=/home/morpheus/.hyperlex/models/trunks/ModernBERT-base + -e HYPERLEX_CUDA_MEM_FRACTION=0.3 + -e HLX_FAIR_MODEL="$MODEL" + -e HLX_BROAD_OUT="$OUT" +) +if [[ -n "$PRIV" ]]; then ARGS+=(-e HLX_BROAD_PRIV="$PRIV"); fi +ARGS+=(lmsysorg/sglang:dev-qwen38-27b-dflash2 python /home/morpheus/hlx/eval_broad_observed.py) +echo "running broad eval $NAME model=$MODEL out=$OUT" +docker run "${ARGS[@]}" +echo "$NAME" > /home/morpheus/hlx/last-broad-container diff --git a/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/test_gate_soft_ceiling_decide.py b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/test_gate_soft_ceiling_decide.py new file mode 100644 index 00000000..e334cd37 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/gate-soft-ceiling-20260923/test_gate_soft_ceiling_decide.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +"""Unit checks for soft_ceiling decide (no GPU).""" +from __future__ import annotations + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from gate_soft_ceiling_decide import PIN_BROAD_EXACT, decide + + +def main() -> int: + d = decide( + force_fair=0.9, + force_fair_n=164, + best_exact=0.95, + val_n=164, + e2_pass=True, + ) + assert d["promote"] and d["mode"] == "force_fair", d + + d = decide( + force_fair=0.95, + force_fair_n=164, + best_exact=0.95, + val_n=164, + e2_pass=True, + ) + assert not d["promote"] and d["decision"] == "REJECT_VS_BEST", d + + d = decide( + force_fair=1.0, + force_fair_n=164, + best_exact=1.0, + val_n=164, + e2_pass=True, + ) + assert not d["promote"] and d["decision"] == "REJECT_NO_BROAD_EVAL", d + + # live prior (post-settle surface) + d = decide( + force_fair=1.0, + force_fair_n=164, + best_exact=1.0, + val_n=164, + e2_pass=True, + broad_exact=0.90, + broad_n=256, + prior_broad_exact=0.88671875, + prior_broad_n=256, + ) + assert d["promote"] and d["broad_baseline_src"] == "live_prior_broad", d + + # equal live prior → reject + d = decide( + force_fair=1.0, + force_fair_n=164, + best_exact=1.0, + val_n=164, + e2_pass=True, + broad_exact=0.88671875, + broad_n=256, + prior_broad_exact=0.88671875, + prior_broad_n=256, + ) + assert not d["promote"] and d["decision"] == "REJECT_VS_BROAD_BASELINE", d + + # fallback to authorize pin when no live prior + d = decide( + force_fair=1.0, + force_fair_n=164, + best_exact=1.0, + val_n=164, + e2_pass=True, + broad_exact=PIN_BROAD_EXACT + 0.01, + broad_n=254, + ) + assert d["promote"] and d["broad_baseline_src"] == "authorize_pin", d + + d = decide( + force_fair=1.0, + force_fair_n=164, + best_exact=1.0, + val_n=164, + e2_pass=True, + broad_exact=0.99, + broad_n=250, + prior_broad_exact=0.88, + prior_broad_n=256, + ) + assert not d["promote"] and d["decision"] == "REJECT_BROAD_SURFACE", d + + d = decide( + force_fair=1.0, + force_fair_n=164, + best_exact=1.0, + val_n=164, + e2_pass=False, + broad_exact=0.99, + broad_n=256, + prior_broad_exact=0.88, + prior_broad_n=256, + ) + assert not d["promote"], d + + print("OK soft_ceiling decide selfcheck") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/JEV_REFINE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/JEV_REFINE_SUMMARY.json new file mode 100644 index 00000000..f9917254 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/JEV_REFINE_SUMMARY.json @@ -0,0 +1,363 @@ +{ + "as_of": "2026-09-23T22:14:13.514210+00:00", + "authorization": "operator 2026-09-23; have jev further classify dataset if that will help", + "prior": { + "METHOD": "morph43", + "AUTHORIZE": 9, + "ABSTAIN": 19, + "authorize_phrases_unique": 8, + "prior_force_fair": { + "exact": 1.0, + "n": 164 + }, + "broad_observed_exact": 0.889763779527559 + }, + "jev_meta_choice": { + "choice": "both_refine", + "confidence": 0.22 + }, + "authorize_recheck": { + "summary": { + "defer_quality": 8 + }, + "force_expand_safe": 0, + "defer_quality": 8, + "rows": [ + { + "phrase": "admin abuse", + "item": "phrase=admin abuse | gold=[admin,abuse] | pred=[a,b] | scheme=positional | full_miss", + "choice": "defer_quality", + "confidence": 0.84, + "probabilities": { + "defer_quality": 0.9, + "force_expand_safe": 0.05, + "already_dual": 0.05 + } + }, + { + "phrase": "aloha snackbar", + "item": "phrase=aloha snackbar | gold=[aloha,snackbar] | pred=[alley,snatcher],[alphabet,bar] | schemes=type_slot+positional | full_miss", + "choice": "defer_quality", + "confidence": 0.86, + "probabilities": { + "defer_quality": 0.9, + "force_expand_safe": 0.07, + "already_dual": 0.03 + } + }, + { + "phrase": "bling bling", + "item": "phrase=bling bling | gold=[bling,bling] | pred=[bare,bare] | scheme=positional | full_miss", + "choice": "defer_quality", + "confidence": 0.59, + "probabilities": { + "defer_quality": 0.72, + "force_expand_safe": 0.16, + "already_dual": 0.12 + } + }, + { + "phrase": "lowkenuinely how do these people exist", + "item": "phrase=lowkenuinely how do these people exist | gold=[Lowkenuinely,how,do,these,people,exist] | pred=[Lowkenuinely,how,d,this,no-scope,ate] | scheme=type_slot | partial", + "choice": "defer_quality", + "confidence": 0.92, + "probabilities": { + "defer_quality": 0.95, + "force_expand_safe": 0.03, + "already_dual": 0.02 + } + }, + { + "phrase": "my guy", + "item": "phrase=my guy | gold=[my,guy] | pred=[my,girl] | scheme=positional | partial", + "choice": "defer_quality", + "confidence": 0.52, + "probabilities": { + "defer_quality": 0.68, + "force_expand_safe": 0.25, + "already_dual": 0.07 + } + }, + { + "phrase": "quit lit", + "item": "phrase=quit lit | gold=[quit,lit] | pred=[quit,it] | scheme=type_slot | partial", + "choice": "defer_quality", + "confidence": 0.79, + "probabilities": { + "defer_quality": 0.86, + "force_expand_safe": 0.09, + "already_dual": 0.05 + } + }, + { + "phrase": "real eyes realize clanker lies!!!", + "item": "phrase=real eyes realize clanker lies!!! | gold=[Real,eyes,realize,clanker,lies!!!] | pred=[a,eyes,real,clanker,lies!!!] | scheme=type_slot | partial", + "choice": "defer_quality", + "confidence": 0.94, + "probabilities": { + "defer_quality": 0.96, + "already_dual": 0.02, + "force_expand_safe": 0.02 + } + }, + { + "phrase": "using a beard", + "item": "phrase=using a beard | gold=[using,a,beard] | pred=[as,a,cap] | scheme=positional | partial", + "choice": "defer_quality", + "confidence": 0.8, + "probabilities": { + "defer_quality": 0.87, + "force_expand_safe": 0.11, + "already_dual": 0.02 + } + } + ], + "model": "jev-1.13.0" + }, + "abstain_refine": { + "summary": { + "idiom_dead": 18, + "morph_bleed": 1 + }, + "revisit_civilian": 0, + "idiom_dead": 18, + "morph_bleed": 1, + "case_fix_only": 0, + "rows": [ + { + "phrase": "3-tier pattern", + "item": "3-tier pattern | positional | full_miss | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.54, + "probabilities": { + "idiom_dead": 0.65, + "revisit_civilian": 0.26, + "case_fix_only": 0.05, + "morph_bleed": 0.04 + } + }, + { + "phrase": "mush : multi-user shared hallucination", + "item": "mush : multi-user shared hallucination | type_slot | case Hallucination\u2192hallucination | prior=abstain_case_only", + "choice": "idiom_dead", + "confidence": 0.29, + "probabilities": { + "idiom_dead": 0.47, + "revisit_civilian": 0.28, + "case_fix_only": 0.2, + "morph_bleed": 0.05 + } + }, + { + "phrase": "aped in", + "item": "aped in | positional | aped\u2192aping | prior=abstain_morph_bleed", + "choice": "morph_bleed", + "confidence": 0.63, + "probabilities": { + "morph_bleed": 0.72, + "revisit_civilian": 0.14, + "case_fix_only": 0.07, + "idiom_dead": 0.07 + } + }, + { + "phrase": "bambi lover", + "item": "bambi lover | positional | partial | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.57, + "probabilities": { + "idiom_dead": 0.67, + "revisit_civilian": 0.24, + "case_fix_only": 0.05, + "morph_bleed": 0.04 + } + }, + { + "phrase": "banbury story of a cock and a bull", + "item": "banbury story of a cock and a bull | positional | unk atoms | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.71, + "probabilities": { + "idiom_dead": 0.79, + "revisit_civilian": 0.17, + "case_fix_only": 0.03, + "morph_bleed": 0.01 + } + }, + { + "phrase": "blue dragon book", + "item": "blue dragon book | positional | Book\u2192book | prior=abstain_case_only", + "choice": "idiom_dead", + "confidence": 0.17, + "probabilities": { + "idiom_dead": 0.38, + "case_fix_only": 0.3, + "revisit_civilian": 0.19, + "morph_bleed": 0.13 + } + }, + { + "phrase": "blue hen's chicken", + "item": "blue hen's chicken | type_slot | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.67, + "probabilities": { + "idiom_dead": 0.75, + "revisit_civilian": 0.19, + "case_fix_only": 0.04, + "morph_bleed": 0.02 + } + }, + { + "phrase": "bo derek", + "item": "bo derek | type_slot | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.43, + "probabilities": { + "idiom_dead": 0.58, + "revisit_civilian": 0.33, + "case_fix_only": 0.05, + "morph_bleed": 0.04 + } + }, + { + "phrase": "brompton boiler", + "item": "brompton boiler | type_slot | full_miss | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.53, + "probabilities": { + "idiom_dead": 0.64, + "revisit_civilian": 0.24, + "case_fix_only": 0.08, + "morph_bleed": 0.04 + } + }, + { + "phrase": "bamboo baksheesh", + "item": "bamboo baksheesh | type_slot | full_miss | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.66, + "probabilities": { + "idiom_dead": 0.74, + "revisit_civilian": 0.18, + "case_fix_only": 0.06, + "morph_bleed": 0.02 + } + }, + { + "phrase": "bathroom singer", + "item": "bathroom singer | type_slot | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.61, + "probabilities": { + "idiom_dead": 0.7, + "revisit_civilian": 0.22, + "case_fix_only": 0.05, + "morph_bleed": 0.03 + } + }, + { + "phrase": "bearded clam", + "item": "bearded clam | type_slot | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.58, + "probabilities": { + "idiom_dead": 0.68, + "revisit_civilian": 0.22, + "case_fix_only": 0.06, + "morph_bleed": 0.04 + } + }, + { + "phrase": "bliss ninny", + "item": "bliss ninny | type_slot | full_miss | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.65, + "probabilities": { + "idiom_dead": 0.75, + "revisit_civilian": 0.19, + "case_fix_only": 0.04, + "morph_bleed": 0.02 + } + }, + { + "phrase": "after a while, crocodile", + "item": "after a while, crocodile | positional | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.61, + "probabilities": { + "idiom_dead": 0.7, + "revisit_civilian": 0.19, + "case_fix_only": 0.07, + "morph_bleed": 0.04 + } + }, + { + "phrase": "as a mug", + "item": "as a mug | positional | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.63, + "probabilities": { + "idiom_dead": 0.73, + "revisit_civilian": 0.18, + "case_fix_only": 0.06, + "morph_bleed": 0.03 + } + }, + { + "phrase": "bench jockey", + "item": "bench jockey | positional | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.59, + "probabilities": { + "idiom_dead": 0.6799999999999999, + "revisit_civilian": 0.24, + "case_fix_only": 0.05, + "morph_bleed": 0.03 + } + }, + { + "phrase": "bent as a nine-bob note", + "item": "bent as a nine-bob note | positional | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.66, + "probabilities": { + "idiom_dead": 0.74, + "revisit_civilian": 0.19, + "case_fix_only": 0.04, + "morph_bleed": 0.03 + } + }, + { + "phrase": "box of ivories", + "item": "box of ivories | positional | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.63, + "probabilities": { + "idiom_dead": 0.72, + "revisit_civilian": 0.2, + "case_fix_only": 0.05, + "morph_bleed": 0.03 + } + }, + { + "phrase": "bread and honey", + "item": "bread and honey | positional | prior=abstain_dictionary_idiom_harvest", + "choice": "idiom_dead", + "confidence": 0.67, + "probabilities": { + "idiom_dead": 0.75, + "revisit_civilian": 0.2, + "case_fix_only": 0.03, + "morph_bleed": 0.02 + } + } + ], + "model": "jev-1.13.0" + }, + "next_choice": { + "choice": "land_hold_empty", + "confidence": 0.82, + "note": "Gold card emptied by Jev quality recheck. Await fresh acquire/METHOD outside this residual wall." + } +} diff --git a/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/abstain_refine.jsonl b/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/abstain_refine.jsonl new file mode 100644 index 00000000..ebee23ac --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/abstain_refine.jsonl @@ -0,0 +1,19 @@ +{"phrase": "3-tier pattern", "item": "3-tier pattern | positional | full_miss | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.54, "probabilities": {"idiom_dead": 0.65, "revisit_civilian": 0.26, "case_fix_only": 0.05, "morph_bleed": 0.04}} +{"phrase": "mush : multi-user shared hallucination", "item": "mush : multi-user shared hallucination | type_slot | case Hallucination\u2192hallucination | prior=abstain_case_only", "choice": "idiom_dead", "confidence": 0.29, "probabilities": {"idiom_dead": 0.47, "revisit_civilian": 0.28, "case_fix_only": 0.2, "morph_bleed": 0.05}} +{"phrase": "aped in", "item": "aped in | positional | aped\u2192aping | prior=abstain_morph_bleed", "choice": "morph_bleed", "confidence": 0.63, "probabilities": {"morph_bleed": 0.72, "revisit_civilian": 0.14, "case_fix_only": 0.07, "idiom_dead": 0.07}} +{"phrase": "bambi lover", "item": "bambi lover | positional | partial | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.57, "probabilities": {"idiom_dead": 0.67, "revisit_civilian": 0.24, "case_fix_only": 0.05, "morph_bleed": 0.04}} +{"phrase": "banbury story of a cock and a bull", "item": "banbury story of a cock and a bull | positional | unk atoms | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.71, "probabilities": {"idiom_dead": 0.79, "revisit_civilian": 0.17, "case_fix_only": 0.03, "morph_bleed": 0.01}} +{"phrase": "blue dragon book", "item": "blue dragon book | positional | Book\u2192book | prior=abstain_case_only", "choice": "idiom_dead", "confidence": 0.17, "probabilities": {"idiom_dead": 0.38, "case_fix_only": 0.3, "revisit_civilian": 0.19, "morph_bleed": 0.13}} +{"phrase": "blue hen's chicken", "item": "blue hen's chicken | type_slot | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.67, "probabilities": {"idiom_dead": 0.75, "revisit_civilian": 0.19, "case_fix_only": 0.04, "morph_bleed": 0.02}} +{"phrase": "bo derek", "item": "bo derek | type_slot | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.43, "probabilities": {"idiom_dead": 0.58, "revisit_civilian": 0.33, "case_fix_only": 0.05, "morph_bleed": 0.04}} +{"phrase": "brompton boiler", "item": "brompton boiler | type_slot | full_miss | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.53, "probabilities": {"idiom_dead": 0.64, "revisit_civilian": 0.24, "case_fix_only": 0.08, "morph_bleed": 0.04}} +{"phrase": "bamboo baksheesh", "item": "bamboo baksheesh | type_slot | full_miss | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.66, "probabilities": {"idiom_dead": 0.74, "revisit_civilian": 0.18, "case_fix_only": 0.06, "morph_bleed": 0.02}} +{"phrase": "bathroom singer", "item": "bathroom singer | type_slot | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.61, "probabilities": {"idiom_dead": 0.7, "revisit_civilian": 0.22, "case_fix_only": 0.05, "morph_bleed": 0.03}} +{"phrase": "bearded clam", "item": "bearded clam | type_slot | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.58, "probabilities": {"idiom_dead": 0.68, "revisit_civilian": 0.22, "case_fix_only": 0.06, "morph_bleed": 0.04}} +{"phrase": "bliss ninny", "item": "bliss ninny | type_slot | full_miss | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.65, "probabilities": {"idiom_dead": 0.75, "revisit_civilian": 0.19, "case_fix_only": 0.04, "morph_bleed": 0.02}} +{"phrase": "after a while, crocodile", "item": "after a while, crocodile | positional | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.61, "probabilities": {"idiom_dead": 0.7, "revisit_civilian": 0.19, "case_fix_only": 0.07, "morph_bleed": 0.04}} +{"phrase": "as a mug", "item": "as a mug | positional | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.63, "probabilities": {"idiom_dead": 0.73, "revisit_civilian": 0.18, "case_fix_only": 0.06, "morph_bleed": 0.03}} +{"phrase": "bench jockey", "item": "bench jockey | positional | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.59, "probabilities": {"idiom_dead": 0.6799999999999999, "revisit_civilian": 0.24, "case_fix_only": 0.05, "morph_bleed": 0.03}} +{"phrase": "bent as a nine-bob note", "item": "bent as a nine-bob note | positional | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.66, "probabilities": {"idiom_dead": 0.74, "revisit_civilian": 0.19, "case_fix_only": 0.04, "morph_bleed": 0.03}} +{"phrase": "box of ivories", "item": "box of ivories | positional | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.63, "probabilities": {"idiom_dead": 0.72, "revisit_civilian": 0.2, "case_fix_only": 0.05, "morph_bleed": 0.03}} +{"phrase": "bread and honey", "item": "bread and honey | positional | prior=abstain_dictionary_idiom_harvest", "choice": "idiom_dead", "confidence": 0.67, "probabilities": {"idiom_dead": 0.75, "revisit_civilian": 0.2, "case_fix_only": 0.03, "morph_bleed": 0.02}} diff --git a/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/authorize_recheck.jsonl b/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/authorize_recheck.jsonl new file mode 100644 index 00000000..6f51464b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/jev-refine-morph65-residuals-20260923/authorize_recheck.jsonl @@ -0,0 +1,8 @@ +{"phrase": "admin abuse", "item": "phrase=admin abuse | gold=[admin,abuse] | pred=[a,b] | scheme=positional | full_miss", "choice": "defer_quality", "confidence": 0.84, "probabilities": {"defer_quality": 0.9, "force_expand_safe": 0.05, "already_dual": 0.05}} +{"phrase": "aloha snackbar", "item": "phrase=aloha snackbar | gold=[aloha,snackbar] | pred=[alley,snatcher]/alphabet,bar] | schemes=type_slot+positional | full_miss", "choice": "defer_quality", "confidence": 0.86, "probabilities": {"defer_quality": 0.9, "force_expand_safe": 0.07, "already_dual": 0.03}} +{"phrase": "bling bling", "item": "phrase=bling bling | gold=[bling,bling] | pred=[bare,bare] | scheme=positional | full_miss", "choice": "defer_quality", "confidence": 0.59, "probabilities": {"defer_quality": 0.72, "force_expand_safe": 0.16, "already_dual": 0.12}} +{"phrase": "lowkenuinely how do these people exist", "item": "phrase=lowkenuinely how do these people exist | gold=[Lowkenuinely,how,do,these,people,exist] | pred=[Lowkenuinely,how,d,this,no-scope,ate] | scheme=type_slot | partial", "choice": "defer_quality", "confidence": 0.92, "probabilities": {"defer_quality": 0.95, "force_expand_safe": 0.03, "already_dual": 0.02}} +{"phrase": "my guy", "item": "phrase=my guy | gold=[my,guy] | pred=[my,girl] | scheme=positional | partial", "choice": "defer_quality", "confidence": 0.52, "probabilities": {"defer_quality": 0.68, "force_expand_safe": 0.25, "already_dual": 0.07}} +{"phrase": "quit lit", "item": "phrase=quit lit | gold=[quit,lit] | pred=[quit,it] | scheme=type_slot | partial", "choice": "defer_quality", "confidence": 0.79, "probabilities": {"defer_quality": 0.86, "force_expand_safe": 0.09, "already_dual": 0.05}} +{"phrase": "real eyes realize clanker lies!!!", "item": "phrase=real eyes realize clanker lies!!! | gold=[Real,eyes,realize,clanker,lies!!!] | pred=[a,eyes,real,clanker,lies!!!] | scheme=type_slot | partial", "choice": "defer_quality", "confidence": 0.94, "probabilities": {"defer_quality": 0.96, "already_dual": 0.02, "force_expand_safe": 0.02}} +{"phrase": "using a beard", "item": "phrase=using a beard | gold=[using,a,beard] | pred=[as,a,cap] | scheme=positional | partial", "choice": "defer_quality", "confidence": 0.8, "probabilities": {"defer_quality": 0.87, "force_expand_safe": 0.11, "already_dual": 0.02}} diff --git a/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/HOLD_AUTHORIZE_CARD.json b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/HOLD_AUTHORIZE_CARD.json new file mode 100644 index 00000000..0c4c33b3 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/HOLD_AUTHORIZE_CARD.json @@ -0,0 +1,24 @@ +{ + "as_of": "2026-09-23T23:33:01.181749+00:00", + "auth": "operator continue 2026-09-23; soft_ceiling ARMED \u2014 morph65 live broad residual reprobe HOLD", + "gate": "soft_ceiling_tiebreak", + "jev_continue_choice": "broad_residual_reprobe", + "live_broad": { + "exact": 0.88671875, + "n": 256 + }, + "residuals_n": 29, + "METHOD_AUTHORIZE": 20, + "METHOD_ABSTAIN": 9, + "jev_qualify_summary": { + "defer_quality": 18, + "already_variant": 1 + }, + "jev_next": { + "choice": "land_hold_empty", + "confidence": 0.86 + }, + "authorize_card_phrases": [], + "hold": true, + "note": "HOLD empty gold after live broad reprobe \u2014 Jev land_hold_empty 0.86. Await named authorize." +} diff --git a/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/RESIDUAL_LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/RESIDUAL_LABEL_COUNTS.json new file mode 100644 index 00000000..3937ce4e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/RESIDUAL_LABEL_COUNTS.json @@ -0,0 +1,45 @@ +{ + "n": 29, + "AUTHORIZE": 20, + "ABSTAIN": 9, + "by_decision": { + "ABSTAIN": 9, + "AUTHORIZE": 20 + }, + "by_why": { + "abstain_dictionary_idiom_harvest": 8, + "authorize_civilian_circulating": 20, + "abstain_morph_bleed": 1 + }, + "by_scheme": { + "positional": 17, + "type_slot": 12 + }, + "authorize_phrases": [ + "admin abuse", + "after a while, crocodile", + "aloha snackbar", + "as a mug", + "bamboo baksheesh", + "bathroom singer", + "bearded clam", + "bench jockey", + "bent as a nine-bob note", + "bling bling", + "bliss ninny", + "box of ivories", + "bread and honey", + "highkey shawty", + "lowkenuinely how do these people exist", + "my guy", + "quit lit", + "real eyes realize clanker lies!!!", + "using a beard" + ], + "prior_defer_wall_n": 9, + "as_of": "2026-09-23T23:31:28.105388+00:00", + "authorization": "operator continue 2026-09-23; soft_ceiling ARMED \u2014 morph65 live broad residual reprobe + METHOD morph43 HOLD", + "gate": "soft_ceiling_tiebreak", + "live_broad_observed_exact": 0.88671875, + "live_broad_observed_n": 256 +} diff --git a/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/jev_morph65_reprobe_qualify_parsed.json b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/jev_morph65_reprobe_qualify_parsed.json new file mode 100644 index 00000000..4e11d1d3 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/jev_morph65_reprobe_qualify_parsed.json @@ -0,0 +1,286 @@ +{ + "summary": { + "defer_quality": 18, + "already_variant": 1 + }, + "safe": [], + "defer": [ + { + "phrase": "real eyes realize clanker lies!!!", + "norm": "real eyes realize clanker lies!!!", + "choice": "defer_quality", + "confidence": 0.84, + "probabilities": { + "defer_quality": 0.89, + "already_variant": 0.09, + "force_expand_safe": 0.02 + }, + "prior_defer_wall": true, + "lineage": "ai-native", + "scheme": "type_slot" + }, + { + "phrase": "using a beard", + "norm": "using a beard", + "choice": "defer_quality", + "confidence": 0.87, + "probabilities": { + "defer_quality": 0.92, + "already_variant": 0.07, + "force_expand_safe": 0.01 + }, + "prior_defer_wall": true, + "lineage": "betting-sharp", + "scheme": "positional" + }, + { + "phrase": "lowkenuinely how do these people exist", + "norm": "lowkenuinely how do these people exist", + "choice": "defer_quality", + "confidence": 0.92, + "probabilities": { + "defer_quality": 0.94, + "already_variant": 0.04, + "force_expand_safe": 0.02 + }, + "prior_defer_wall": true, + "lineage": "brainrot-aura", + "scheme": "type_slot" + }, + { + "phrase": "admin abuse", + "norm": "admin abuse", + "choice": "defer_quality", + "confidence": 0.9, + "probabilities": { + "defer_quality": 0.93, + "already_variant": 0.05, + "force_expand_safe": 0.01 + }, + "prior_defer_wall": true, + "lineage": "gaming-meta", + "scheme": "positional" + }, + { + "phrase": "my guy", + "norm": "my guy", + "choice": "defer_quality", + "confidence": 0.76, + "probabilities": { + "defer_quality": 0.84, + "already_variant": 0.14, + "force_expand_safe": 0.02 + }, + "prior_defer_wall": true, + "lineage": "kinship-address", + "scheme": "positional" + }, + { + "phrase": "aloha snackbar", + "norm": "aloha snackbar", + "choice": "defer_quality", + "confidence": 0.89, + "probabilities": { + "defer_quality": 0.93, + "already_variant": 0.06, + "force_expand_safe": 0.01 + }, + "prior_defer_wall": true, + "lineage": "none", + "scheme": "type_slot" + }, + { + "phrase": "bamboo baksheesh", + "norm": "bamboo baksheesh", + "choice": "defer_quality", + "confidence": 0.7, + "probabilities": { + "defer_quality": 0.8, + "already_variant": 0.14, + "force_expand_safe": 0.06 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "type_slot" + }, + { + "phrase": "bathroom singer", + "norm": "bathroom singer", + "choice": "defer_quality", + "confidence": 0.56, + "probabilities": { + "defer_quality": 0.7, + "already_variant": 0.23, + "force_expand_safe": 0.07 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "type_slot" + }, + { + "phrase": "bearded clam", + "norm": "bearded clam", + "choice": "defer_quality", + "confidence": 0.62, + "probabilities": { + "defer_quality": 0.75, + "already_variant": 0.2, + "force_expand_safe": 0.05 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "type_slot" + }, + { + "phrase": "bliss ninny", + "norm": "bliss ninny", + "choice": "defer_quality", + "confidence": 0.67, + "probabilities": { + "defer_quality": 0.78, + "already_variant": 0.17, + "force_expand_safe": 0.05 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "type_slot" + }, + { + "phrase": "after a while, crocodile", + "norm": "after a while, crocodile", + "choice": "defer_quality", + "confidence": 0.72, + "probabilities": { + "defer_quality": 0.81, + "already_variant": 0.12, + "force_expand_safe": 0.07 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "positional" + }, + { + "phrase": "as a mug", + "norm": "as a mug", + "choice": "defer_quality", + "confidence": 0.69, + "probabilities": { + "defer_quality": 0.79, + "already_variant": 0.15, + "force_expand_safe": 0.06 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "positional" + }, + { + "phrase": "bench jockey", + "norm": "bench jockey", + "choice": "defer_quality", + "confidence": 0.7, + "probabilities": { + "defer_quality": 0.8, + "already_variant": 0.15, + "force_expand_safe": 0.05 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "positional" + }, + { + "phrase": "bent as a nine-bob note", + "norm": "bent as a nine-bob note", + "choice": "defer_quality", + "confidence": 0.73, + "probabilities": { + "defer_quality": 0.82, + "already_variant": 0.13, + "force_expand_safe": 0.05 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "positional" + }, + { + "phrase": "bling bling", + "norm": "bling bling", + "choice": "defer_quality", + "confidence": 0.82, + "probabilities": { + "defer_quality": 0.88, + "already_variant": 0.1, + "force_expand_safe": 0.02 + }, + "prior_defer_wall": true, + "lineage": "none", + "scheme": "positional" + }, + { + "phrase": "box of ivories", + "norm": "box of ivories", + "choice": "defer_quality", + "confidence": 0.65, + "probabilities": { + "defer_quality": 0.77, + "already_variant": 0.14, + "force_expand_safe": 0.09 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "positional" + }, + { + "phrase": "bread and honey", + "norm": "bread and honey", + "choice": "defer_quality", + "confidence": 0.64, + "probabilities": { + "defer_quality": 0.76, + "already_variant": 0.14, + "force_expand_safe": 0.1 + }, + "prior_defer_wall": false, + "lineage": "none", + "scheme": "positional" + }, + { + "phrase": "quit lit", + "norm": "quit lit", + "choice": "defer_quality", + "confidence": 0.84, + "probabilities": { + "defer_quality": 0.89, + "already_variant": 0.09, + "force_expand_safe": 0.02 + }, + "prior_defer_wall": true, + "lineage": "workplace-corp", + "scheme": "type_slot" + } + ], + "variant": [ + { + "phrase": "highkey shawty", + "norm": "highkey shawty", + "choice": "already_variant", + "confidence": 0.69, + "probabilities": { + "already_variant": 0.79, + "defer_quality": 0.19, + "force_expand_safe": 0.02 + }, + "prior_defer_wall": false, + "lineage": "kinship-address", + "scheme": "positional" + } + ], + "safe_new": [], + "card_high_conf_new": [], + "model": "jev-1.13.0", + "usage": { + "input_tokens": 10256, + "output_tokens": 854, + "calls": 19, + "cached_calls": 0 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/morph65-broad-reprobe-soft-ceiling.json b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/morph65-broad-reprobe-soft-ceiling.json new file mode 100644 index 00000000..6e8a7a23 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-broad-reprobe-soft-ceiling-20260923/morph65-broad-reprobe-soft-ceiling.json @@ -0,0 +1,115 @@ +{ + "schema": "hyperlex.broad_residual_diag.v0.1", + "as_of": "2026-09-23T23:31:28.105501+00:00", + "auth": "operator continue 2026-09-23; soft_ceiling ARMED \u2014 morph65 live broad residual reprobe + METHOD morph43 HOLD", + "gate": "soft_ceiling_tiebreak", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "force": null, + "n_unbind_export": 3700, + "n_val": 357, + "n_val_observed": 256, + "n_val_inferred": 101, + "scored": { + "val_all": { + "unbind_exact": 0.9187675070028011, + "n_unbind_eval": 357, + "unbind_token_f1": 0.9477777777777778, + "unbind_slot_f1": 0.9477777777777778 + }, + "val_observed": { + "unbind_exact": 0.88671875, + "n_unbind_eval": 256, + "unbind_token_f1": 0.9279141104294478, + "unbind_slot_f1": 0.9279141104294478 + }, + "val_inferred": { + "unbind_exact": 1.0, + "n_unbind_eval": 101, + "unbind_token_f1": 1.0, + "unbind_slot_f1": 1.0 + } + }, + "n_residual_observed": 29, + "n_residual_inferred": 0, + "n_residual_observed_scaff": 0, + "residual_themes_observed": { + "positional_head_filler_miss": 8, + "full_miss": 8, + "type_slot_token_miss": 12, + "partial_slot_miss": 17, + "morph_bleed": 1 + }, + "residual_dump": { + "unbind_residual_dump": "residual-morph65-broad-reprobe.jsonl", + "n_unbind_residual": 29, + "unbind_residual_themes": { + "partial_slot_miss": 17, + "type_slot_token_miss": 12, + "positional_head_filler_miss": 8, + "full_miss": 8, + "morph_bleed": 1 + }, + "unbind_residual_by_scheme": { + "positional": 17, + "type_slot": 12 + }, + "unbind_residual_by_class": { + "OBSERVED": 29 + }, + "unbind_residual_summary": "residual-morph65-broad-reprobe.summary.json" + }, + "label_counts": { + "n": 29, + "AUTHORIZE": 20, + "ABSTAIN": 9, + "by_decision": { + "ABSTAIN": 9, + "AUTHORIZE": 20 + }, + "by_why": { + "abstain_dictionary_idiom_harvest": 8, + "authorize_civilian_circulating": 20, + "abstain_morph_bleed": 1 + }, + "by_scheme": { + "positional": 17, + "type_slot": 12 + }, + "authorize_phrases": [ + "admin abuse", + "after a while, crocodile", + "aloha snackbar", + "as a mug", + "bamboo baksheesh", + "bathroom singer", + "bearded clam", + "bench jockey", + "bent as a nine-bob note", + "bling bling", + "bliss ninny", + "box of ivories", + "bread and honey", + "highkey shawty", + "lowkenuinely how do these people exist", + "my guy", + "quit lit", + "real eyes realize clanker lies!!!", + "using a beard" + ], + "prior_defer_wall_n": 9, + "as_of": "2026-09-23T23:31:28.105388+00:00", + "authorization": "operator continue 2026-09-23; soft_ceiling ARMED \u2014 morph65 live broad residual reprobe + METHOD morph43 HOLD", + "gate": "soft_ceiling_tiebreak", + "live_broad_observed_exact": 0.88671875, + "live_broad_observed_n": 256 + }, + "prior_force_fair": { + "exact": 1.0, + "n": 164 + }, + "prior_authorize_pin": { + "exact": 0.889763779527559, + "n": 254 + }, + "note": "Live reprobe under soft_ceiling. Compare to authorize pin n=254; morph77 settle grew OBSERVED val. HOLD for Jev qualify." +} diff --git a/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/LABEL_COUNTS.json new file mode 100644 index 00000000..59149ff2 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/LABEL_COUNTS.json @@ -0,0 +1,8 @@ +{ + "AUTHORIZE": 2, + "ABSTAIN": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 6, + "type_slot_parse_match": 2 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/METHOD.md b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/METHOD.md new file mode 100644 index 00000000..217576ea --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/METHOD.md @@ -0,0 +1,5 @@ +# morph65 force residual gold — method + +**Authority:** operator continue 2026-09-21; morph65 force residual gold after morph66 REJECT (METHOD morph43) +METHOD = morph43. Schemes positional|type_slot only. No invented fillers. +Source: morph65 misses on morph66 force surface (n=201). diff --git a/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/PROMOTE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/PROMOTE_SUMMARY.json new file mode 100644 index 00000000..7d9abdcc --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/PROMOTE_SUMMARY.json @@ -0,0 +1,23 @@ +{ + "auth": "operator continue 2026-09-21; morph65 force residual gold after morph66 REJECT (METHOD morph43)", + "residual_n": 8, + "authorize": 2, + "abstain": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 6, + "type_slot_parse_match": 2 + }, + "force_base": 164, + "force_new": 164, + "force_added": 0, + "hard_base": 206, + "hard_new": 206, + "hard_added": 0, + "force_path": "/home/morpheus/hlx/force_train_morph67_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph67.jsonl", + "authorize_texts": [ + "TOKEN:MUSH SLOT:: MARKER:Multi-User TOKEN:Shared SLOT:Hallucination", + "TOKEN:Real SLOT:eyes MARKER:realize TOKEN:clanker SLOT:lies!!!" + ], + "fair_note": "recompute fair on morph65 with new force before morph67 pin" +} diff --git a/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/SOT_FLIP_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/SOT_FLIP_SUMMARY.json new file mode 100644 index 00000000..fa5eb729 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/SOT_FLIP_SUMMARY.json @@ -0,0 +1,12 @@ +{ + "as_of": "2026-09-21T17:06:37.716145+00:00", + "auth": "operator continue 2026-09-21; morph65 force residual AUTHORIZE SoT flip INFERRED\u2192OBSERVED (harvest sidecar)", + "n_appended": 2, + "texts": [ + "TOKEN:MUSH SLOT:: MARKER:Multi-User TOKEN:Shared SLOT:Hallucination", + "TOKEN:Real SLOT:eyes MARKER:realize TOKEN:clanker SLOT:lies!!!" + ], + "harvest": "/home/morpheus/.hyperlex/hyperlexical/harvest_unbind_observed_mw.jsonl", + "backup_suffix": "bak-pre-morph67-sot-flip-20260921T170637Z", + "note": "force keys already present; class was INFERRED so force did not move. OBSERVED upgrade enables train+upsample. Not inventing fillers." +} diff --git a/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/labeled_morph65_force_residuals.jsonl b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/labeled_morph65_force_residuals.jsonl new file mode 100644 index 00000000..6b5e4f25 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph65-force-residual-gold-20260921/labeled_morph65_force_residuals.jsonl @@ -0,0 +1,8 @@ +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "(from to the moon) quotations ▼", "role_scheme": "positional", "gold_fillers": ["(from", "to", "the", "moon)", "quotations", "▼"], "gold_roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "dataset_class_source": "INFERRED", "pred": ["(computing)", "to", "the", "moon)", "character", "▼"], "lineage": "crypto-degen", "authorization": null, "id": "morph65-force-res-000-a180f9ad950a", "source": "labeled_morph65_force_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "Armenian: սմուրֆ\") (smurf), սմուրֆիկ\") pl (smurfik)", "role_scheme": "positional", "gold_fillers": ["Armenian:", "սմուրֆ\")", "(smurf),", "սմուրֆիկ\")", "pl", "(smurfik)"], "gold_roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "dataset_class_source": "INFERRED", "pred": ["Armenian:", "սմուրֆիկ\")", "(smurf)", "սմուրֆիկ\")", "pl", "(smurfik)"], "lineage": "gaming-meta", "authorization": null, "id": "morph65-force-res-001-6d842d481ce9", "source": "labeled_morph65_force_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:\"Crash SLOT:out MARKER:etymology\", TOKEN:The SLOT:Idioms.", "role_scheme": "type_slot", "gold_fillers": ["\"Crash", "out", "etymology\",", "The", "Idioms."], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "dataset_class_source": "INFERRED", "pred": ["crash", "out", "etymology\",", "The", "Idioms."], "lineage": "brainrot-aura", "authorization": null, "id": "morph65-force-res-002-512014028f35", "source": "labeled_morph65_force_residuals"} +{"decision": "AUTHORIZE", "reason": "type_slot_parse_match", "text": "TOKEN:MUSH SLOT:: MARKER:Multi-User TOKEN:Shared SLOT:Hallucination", "role_scheme": "type_slot", "gold_fillers": ["MUSH", ":", "Multi-User", "Shared", "Hallucination"], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "dataset_class_source": "INFERRED", "pred": ["MUSH", ":", "Multi-User", "Shared", "hallucination"], "lineage": "ai-native", "authorization": "operator continue 2026-09-21; morph65 force residual gold after morph66 REJECT (METHOD morph43)", "id": "morph65-force-res-003-9e7c8db4edc5", "source": "labeled_morph65_force_residuals"} +{"decision": "AUTHORIZE", "reason": "type_slot_parse_match", "text": "TOKEN:Real SLOT:eyes MARKER:realize TOKEN:clanker SLOT:lies!!!", "role_scheme": "type_slot", "gold_fillers": ["Real", "eyes", "realize", "clanker", "lies!!!"], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "dataset_class_source": "INFERRED", "pred": ["a", "eyes", "real", "clanker", "lies!!!"], "lineage": "ai-native", "authorization": "operator continue 2026-09-21; morph65 force residual gold after morph66 REJECT (METHOD morph43)", "id": "morph65-force-res-004-74417008f55b", "source": "labeled_morph65_force_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:synonym SLOT:▲quotations MARKER:▼ TOKEN:Synonym: SLOT:tryhard", "role_scheme": "type_slot", "gold_fillers": ["synonym", "▲quotations", "▼", "Synonym:", "tryhard"], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "dataset_class_source": "INFERRED", "pred": ["synonym", "quotations", "▼", "Antonym:", "tryhard"], "lineage": "gaming-meta", "authorization": null, "id": "morph65-force-res-005-870fe87d7f7d", "source": "labeled_morph65_force_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:(neologism) SLOT:Alternative MARKER:form TOKEN:of SLOT:brain MARKER:rot.", "role_scheme": "type_slot", "gold_fillers": ["(neologism)", "Alternative", "form", "of", "brain", "rot."], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "dataset_class_source": "INFERRED", "pred": ["(neologism)", "Alternative", "form", "of", "brain", "rot"], "lineage": "brainrot-aura", "authorization": null, "id": "morph65-force-res-006-439d918537ee", "source": "labeled_morph65_force_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:^ SLOT:\"aura MARKER:farming\" TOKEN:on SLOT:Google MARKER:Trends.", "role_scheme": "type_slot", "gold_fillers": ["^", "\"aura", "farming\"", "on", "Google", "Trends."], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "dataset_class_source": "INFERRED", "pred": ["^", "aura", "farming", "on", "Google", "Trends."], "lineage": "brainrot-aura", "authorization": null, "id": "morph65-force-res-007-41c2c2eba6da", "source": "labeled_morph65_force_residuals"} diff --git a/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/HARVEST_APPEND_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/HARVEST_APPEND_SUMMARY.json new file mode 100644 index 00000000..586d26ea --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/HARVEST_APPEND_SUMMARY.json @@ -0,0 +1,15 @@ +{ + "as_of": "2026-09-21T22:31:52.804842+00:00", + "auth": "operator continue 2026-09-21; morph67 residual AUTHORIZE harvest OBSERVED append for morph68 force move", + "n_appended": 2, + "texts": [ + "[Out:] Mega yachts [In:] Mega gyatt", + "an egg's age" + ], + "authorize_all": [ + "[Out:] Mega yachts [In:] Mega gyatt", + "an egg's age" + ], + "harvest": "/home/morpheus/.hyperlex/hyperlexical/harvest_unbind_observed_mw.jsonl", + "note": "force_train_morph68_expanded.jsonl already has both as OBSERVED; harvest SoT needed for apply_unbind_force_train move on INFERRED keys." +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/LABEL_COUNTS.json new file mode 100644 index 00000000..d89e6875 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/LABEL_COUNTS.json @@ -0,0 +1,11 @@ +{ + "AUTHORIZE": 2, + "ABSTAIN": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 6, + "positional_text_split_match": 2 + }, + "n": 8, + "as_of": "2026-09-21T22:30:44.513251+00:00", + "method": "morph43" +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/METHOD.md b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/METHOD.md new file mode 100644 index 00000000..ce5c76ad --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/METHOD.md @@ -0,0 +1,5 @@ +# morph67 residual gold — method + +**Authority:** operator continue 2026-09-21; morph67 residual gold after morph67 SoT-flip REJECT (METHOD morph43) +METHOD = morph43. Schemes positional|type_slot only. No invented fillers. +Source: morph67 best-epoch residuals n=8. diff --git a/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/PROMOTE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/PROMOTE_SUMMARY.json new file mode 100644 index 00000000..eaedaabc --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/PROMOTE_SUMMARY.json @@ -0,0 +1,22 @@ +{ + "auth": "operator continue 2026-09-21; morph67 residual gold after morph67 SoT-flip REJECT (METHOD morph43)", + "residual_n": 8, + "authorize": 2, + "abstain": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 6, + "positional_text_split_match": 2 + }, + "force_base": 164, + "force_new": 166, + "force_added": 2, + "hard_base": 206, + "hard_new": 208, + "hard_added": 2, + "force_path": "/home/morpheus/hlx/force_train_morph68_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph68.jsonl", + "authorize_texts": [ + "[Out:] Mega yachts [In:] Mega gyatt", + "an egg's age" + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/fair-eval-morph65-morph68.json b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/fair-eval-morph65-morph68.json new file mode 100644 index 00000000..d96e718b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/fair-eval-morph65-morph68.json @@ -0,0 +1,40 @@ +{ + "schema": "hyperlex.fair_eval_same_surface.v0.1", + "as_of": "2026-09-21T22:32:18.974200+00:00", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "seed": "seed-morph65", + "force_train_path": "/home/morpheus/hlx/force_train_morph68_expanded.jsonl", + "force_stats": { + "unbind_force_train_path": "force_train_morph68_expanded.jsonl", + "n_unbind_force_train": 166, + "n_unbind_force_train_keys": 166, + "n_unbind_val_after_force_train": 197 + }, + "n_hard_atoms": 208, + "unbind_exact": 0.9695431472081218, + "n_scored": 197, + "n_correct_est": 191, + "scored": { + "unbind_exact": 0.9695431472081218, + "n_unbind_eval": 197, + "unbind_token_f1": 0.9797979797979798, + "unbind_token_precision": 0.9797979797979798, + "unbind_token_recall": 0.9797979797979798, + "unbind_slot_f1": 0.9797979797979798 + }, + "knob": "morph67 residual AUTHORIZE force/hard expand (METHOD morph43)", + "prior_fair_morph65_n199": 0.9698492462311558, + "promote": { + "authorize": 2, + "abstain": 6, + "force_added": 2, + "hard_added": 2, + "force_new": 166, + "hard_new": 208, + "authorize_texts": [ + "[Out:] Mega yachts [In:] Mega gyatt", + "an egg's age" + ] + }, + "note": "Fair morph65 BEST on morph68 force surface. Gate morph68 best > this fair + E2 trunk-forward 1.0." +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/labeled_morph67_residuals.jsonl b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/labeled_morph67_residuals.jsonl new file mode 100644 index 00000000..5f1ccbd3 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-residual-gold-20260921/labeled_morph67_residuals.jsonl @@ -0,0 +1,8 @@ +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:\"Crash SLOT:out MARKER:etymology\", TOKEN:The SLOT:Idioms.", "role_scheme": "type_slot", "gold_fillers": ["\"Crash", "out", "etymology\",", "The", "Idioms."], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "dataset_class_source": "INFERRED", "themes": ["type_slot_token_miss", "partial_slot_miss"], "pred": ["crash", "out", "(neologism)", "the", "Idioms."], "lineage": "brainrot-aura", "authorization": null, "id": "morph67-civ-res-000-512014028f35", "source": "labeled_morph67_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:(neologism) SLOT:Alternative MARKER:form TOKEN:of SLOT:brain MARKER:rot.", "role_scheme": "type_slot", "gold_fillers": ["(neologism)", "Alternative", "form", "of", "brain", "rot."], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "dataset_class_source": "INFERRED", "themes": ["partial_slot_miss"], "pred": ["(neologism)", "Alternative", "form", "of", "brain", "rot"], "lineage": "brainrot-aura", "authorization": null, "id": "morph67-civ-res-001-439d918537ee", "source": "labeled_morph67_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:^ SLOT:\"aura MARKER:farming\" TOKEN:on SLOT:Google MARKER:Trends.", "role_scheme": "type_slot", "gold_fillers": ["^", "\"aura", "farming\"", "on", "Google", "Trends."], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "dataset_class_source": "INFERRED", "themes": ["type_slot_token_miss", "partial_slot_miss"], "pred": ["^", "aura", "farming", "on", "Google", "Trends."], "lineage": "brainrot-aura", "authorization": null, "id": "morph67-civ-res-002-41c2c2eba6da", "source": "labeled_morph67_residuals"} +{"decision": "AUTHORIZE", "reason": "positional_text_split_match", "text": "[Out:] Mega yachts [In:] Mega gyatt", "role_scheme": "positional", "gold_fillers": ["[Out:]", "Mega", "yachts", "[In:]", "Mega", "gyatt"], "gold_roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "dataset_class_source": "INFERRED", "themes": ["partial_slot_miss"], "pred": ["[Out:]", "Mega", "boat", "[In:]", "Mega", "gyatt"], "lineage": "brainrot-aura", "authorization": "operator continue 2026-09-21; morph67 residual gold after morph67 SoT-flip REJECT (METHOD morph43)", "id": "morph67-civ-res-003-37b8f630d6e0", "source": "labeled_morph67_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "(from to the moon) quotations \u25bc", "role_scheme": "positional", "gold_fillers": ["(from", "to", "the", "moon)", "quotations", "\u25bc"], "gold_roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "dataset_class_source": "INFERRED", "themes": ["positional_head_filler_miss"], "pred": ["(computing)", "to", "the", "moon)", "rug", "\u25bc"], "lineage": "crypto-degen", "authorization": null, "id": "morph67-civ-res-004-a180f9ad950a", "source": "labeled_morph67_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "Armenian: \u057d\u0574\u0578\u0582\u0580\u0586\") (smurf), \u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\") pl (smurfik)", "role_scheme": "positional", "gold_fillers": ["Armenian:", "\u057d\u0574\u0578\u0582\u0580\u0586\")", "(smurf),", "\u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\")", "pl", "(smurfik)"], "gold_roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "dataset_class_source": "INFERRED", "themes": ["partial_slot_miss"], "pred": ["Armenian:", "\u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\")", "(smurf)", "\u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\")", "pl", "(smurfik)"], "lineage": "gaming-meta", "authorization": null, "id": "morph67-civ-res-005-6d842d481ce9", "source": "labeled_morph67_residuals"} +{"decision": "ABSTAIN", "reason": "abstain_scaffolding_wiki_etym", "text": "TOKEN:synonym SLOT:\u25b2quotations MARKER:\u25bc TOKEN:Synonym: SLOT:tryhard", "role_scheme": "type_slot", "gold_fillers": ["synonym", "\u25b2quotations", "\u25bc", "Synonym:", "tryhard"], "gold_roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "dataset_class_source": "INFERRED", "themes": ["type_slot_token_miss", "partial_slot_miss"], "pred": ["synonym", "quotations", "\u25bc", "(slang)", "tryhard"], "lineage": "gaming-meta", "authorization": null, "id": "morph67-civ-res-006-870fe87d7f7d", "source": "labeled_morph67_residuals"} +{"decision": "AUTHORIZE", "reason": "positional_text_split_match", "text": "an egg's age", "role_scheme": "positional", "gold_fillers": ["an", "egg's", "age"], "gold_roles": ["pos_0", "pos_1", "pos_2"], "dataset_class_source": "OBSERVED", "themes": ["positional_head_filler_miss"], "pred": ["a", "egg's", "age"], "lineage": "none", "authorization": "operator continue 2026-09-21; morph67 residual gold after morph67 SoT-flip REJECT (METHOD morph43)", "id": "morph67-civ-res-007-f5bbac9d5cef", "source": "labeled_morph67_residuals"} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/GATE_LOCK.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/GATE_LOCK.json new file mode 100644 index 00000000..c9f418ff --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/GATE_LOCK.json @@ -0,0 +1,12 @@ +{ + "gate_owner": "morph67-sot-flip", + "finished_at": "2026-09-21T22:15:32.762981+00:00", + "status": "done", + "decision": "REJECT_VS_BEST", + "best_unbind_exact": 0.9597989949748744, + "fair": 0.9698492462311558, + "fair_val_n": 199, + "e2_pass": true, + "surface_ok": true, + "val_n": 199 +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/LABEL_COUNTS.json new file mode 100644 index 00000000..59149ff2 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/LABEL_COUNTS.json @@ -0,0 +1,8 @@ +{ + "AUTHORIZE": 2, + "ABSTAIN": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 6, + "type_slot_parse_match": 2 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/METHOD.md b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/METHOD.md new file mode 100644 index 00000000..217576ea --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/METHOD.md @@ -0,0 +1,5 @@ +# morph65 force residual gold — method + +**Authority:** operator continue 2026-09-21; morph65 force residual gold after morph66 REJECT (METHOD morph43) +METHOD = morph43. Schemes positional|type_slot only. No invented fillers. +Source: morph65 misses on morph66 force surface (n=201). diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/PROMOTE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/PROMOTE_SUMMARY.json new file mode 100644 index 00000000..7d9abdcc --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/PROMOTE_SUMMARY.json @@ -0,0 +1,23 @@ +{ + "auth": "operator continue 2026-09-21; morph65 force residual gold after morph66 REJECT (METHOD morph43)", + "residual_n": 8, + "authorize": 2, + "abstain": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 6, + "type_slot_parse_match": 2 + }, + "force_base": 164, + "force_new": 164, + "force_added": 0, + "hard_base": 206, + "hard_new": 206, + "hard_added": 0, + "force_path": "/home/morpheus/hlx/force_train_morph67_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph67.jsonl", + "authorize_texts": [ + "TOKEN:MUSH SLOT:: MARKER:Multi-User TOKEN:Shared SLOT:Hallucination", + "TOKEN:Real SLOT:eyes MARKER:realize TOKEN:clanker SLOT:lies!!!" + ], + "fair_note": "recompute fair on morph65 with new force before morph67 pin" +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/REJECT_VS_BEST.md b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/REJECT_VS_BEST.md new file mode 100644 index 00000000..47290cd2 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/REJECT_VS_BEST.md @@ -0,0 +1,3 @@ +# morph67 REJECT + +best 0.9597989949748744 vs fair 0.9698492462311558 (n=199, decision REJECT_VS_BEST). BEST stays morph65. diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/SOT_FLIP_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/SOT_FLIP_SUMMARY.json new file mode 100644 index 00000000..fa5eb729 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/SOT_FLIP_SUMMARY.json @@ -0,0 +1,12 @@ +{ + "as_of": "2026-09-21T17:06:37.716145+00:00", + "auth": "operator continue 2026-09-21; morph65 force residual AUTHORIZE SoT flip INFERRED\u2192OBSERVED (harvest sidecar)", + "n_appended": 2, + "texts": [ + "TOKEN:MUSH SLOT:: MARKER:Multi-User TOKEN:Shared SLOT:Hallucination", + "TOKEN:Real SLOT:eyes MARKER:realize TOKEN:clanker SLOT:lies!!!" + ], + "harvest": "/home/morpheus/.hyperlex/hyperlexical/harvest_unbind_observed_mw.jsonl", + "backup_suffix": "bak-pre-morph67-sot-flip-20260921T170637Z", + "note": "force keys already present; class was INFERRED so force did not move. OBSERVED upgrade enables train+upsample. Not inventing fillers." +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/STATUS.txt b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/STATUS.txt new file mode 100644 index 00000000..c494491b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/STATUS.txt @@ -0,0 +1 @@ +REJECT_VS_BEST diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/config-train.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/config-train.json new file mode 100644 index 00000000..698dad2b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/config-train.json @@ -0,0 +1,34 @@ +{ + "lr": "2e-5", + "epochs": 40, + "batch": 8, + "max_len": 64, + "last_trainable": 8, + "unbind_loss_weight": 1.0, + "unbind_every_n": 1, + "unbind_primary": "slot_ce", + "unbind_slot_ce_armed": true, + "unbind_slot_ce_aux_lambda": 0.25, + "unbind_head_slot_weight": 2.0, + "unbind_second_slot_weight": 2.0, + "unbind_observed_upsample": 8, + "unbind_inferred_cap": 0, + "unbind_inferred_weight": 1.0, + "n_unbind_morph_negatives": 324, + "unbind_morph_margin": 0.5, + "unbind_curriculum": true, + "unbind_curriculum_pos_epochs": 1, + "unbind_curriculum_type_epochs": 1, + "unbind_filler_denylist_lineages": 8, + "unbind_hard_atoms_path": "hard_atoms_train_morph66.jsonl", + "unbind_hard_upsample": 4, + "n_unbind_hard_atoms_matched": 204, + "n_unbind_hard_extra_copies": 1113, + "unbind_force_train_path": "force_train_morph66_expanded.jsonl", + "n_unbind_force_train": 164, + "n_unbind_force_train_keys": 164, + "n_unbind_val_after_force_train": 199, + "save_best_unbind": true, + "init_from": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "warm_start": true +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/e2-unbind-morph67.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/e2-unbind-morph67.json new file mode 100644 index 00000000..f79fa4e5 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/e2-unbind-morph67.json @@ -0,0 +1,32 @@ +{ + "brier": null, + "device": "cuda", + "e2_pass": true, + "encoder_trainable_loaded": 48, + "encoder_trainable_present": 48, + "forecast_eligible": false, + "heads_loaded": true, + "model_dir": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph67", + "model_id": "hyperlex-encoder-modernbert-base-seed", + "model_swap": 1.0, + "n_test": 12, + "n_unbind_eval": 24, + "name_gate": false, + "note": "Trunk-forward unbind_exact + token/slot F1 from /home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph67/model.safetensors vs 004 probe_swap_min. Stub/digest leaves F1 null (no civilian filler lists). name_gate stays false. Applied 48 saved encoder trainable tensors.", + "probe_positional_swap": 1.0, + "probe_schema": "abraxas.recoverable_structure.probe.v0.1", + "probe_swap_min": 0.5, + "probe_type_slot_swap": 0.5, + "schema": "hyperlex.hyperlexical.eval_unbind.v0.1", + "stub_swap": 0.0, + "trunk": "answerdotai/ModernBERT-base", + "trunk_dir": "/home/morpheus/.hyperlex/models/trunks/ModernBERT-base", + "trunk_forward": true, + "trunk_loaded": true, + "unbind_exact": 1.0, + "unbind_slot_f1": 1.0, + "unbind_token_f1": 1.0, + "unbind_token_precision": 1.0, + "unbind_token_recall": 1.0, + "weight_file": "model.safetensors" +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/fair-eval-morph65-morph67-sot.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/fair-eval-morph65-morph67-sot.json new file mode 100644 index 00000000..7deac283 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/fair-eval-morph65-morph67-sot.json @@ -0,0 +1,28 @@ +{ + "schema": "hyperlex.fair_eval_same_surface.v0.1", + "as_of": "2026-09-21T17:07:43.061379+00:00", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "seed": "seed-morph65", + "force_train_path": "/home/morpheus/hlx/force_train_morph66_expanded.jsonl", + "force_stats": { + "unbind_force_train_path": "force_train_morph66_expanded.jsonl", + "n_unbind_force_train": 164, + "n_unbind_force_train_keys": 164, + "n_unbind_val_after_force_train": 199 + }, + "n_hard_atoms": 206, + "unbind_exact": 0.9698492462311558, + "n_scored": 199, + "n_correct_est": 193, + "scored": { + "unbind_exact": 0.9698492462311558, + "n_unbind_eval": 199, + "unbind_token_f1": 0.9801587301587301, + "unbind_token_precision": 0.9801587301587301, + "unbind_token_recall": 0.9801587301587301, + "unbind_slot_f1": 0.9801587301587301 + }, + "knob": "SoT flip 2 METHOD AUTHORIZE morph65 force residuals INFERRED\u2192OBSERVED in harvest_unbind_observed_mw.jsonl", + "prior_fair_morph65_n201": 0.9601990049751243, + "note": "Fair morph65 BEST after SoT class flip; force now moves 164/164; val n shrinks. Gate morph67 best > this fair + E2 trunk-forward 1.0." +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/morph67-intent.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/morph67-intent.json new file mode 100644 index 00000000..9b20b86e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/morph67-intent.json @@ -0,0 +1,29 @@ +{ + "morph": 67, + "as_of": "2026-09-21T17:08:20.402086+00:00", + "auth": "operator continue 2026-09-21; morph67 after morph65 residual AUTHORIZE SoT flip (force_added was 0)", + "one_knob": "SoT INFERRED\u2192OBSERVED for 2 METHOD AUTHORIZE morph65 force residuals via harvest_unbind_observed_mw.jsonl", + "why_not_force_expand": "force_added=0 hard_added=0; texts already in morph66 force as dead keys (class INFERRED so apply_unbind_force_train skipped)", + "warm": "seed-morph65", + "force": "/home/morpheus/hlx/force_train_morph66_expanded.jsonl", + "hard": "/home/morpheus/hlx/hard_atoms_train_morph66.jsonl", + "upsample": 8, + "second_slot": 2, + "last_trainable": 8, + "epochs": 40, + "lr": "2e-5", + "mem_fraction": 0.3, + "save_best": true, + "fair_path": "/home/morpheus/hlx/fair-eval-morph65-morph67-sot.json", + "fair_exact": 0.9698492462311558, + "fair_n": 199, + "pin_rule": "best > fair on n=199 and E2 trunk-forward unbind_exact=1.0", + "name_gate": false, + "not_this_card": [ + "upsample 11+", + "SECOND_SLOT=4", + "replay morph66 reject without SoT flip", + "invent OBSERVED fillers", + "Hub" + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/pin-morph67.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/pin-morph67.json new file mode 100644 index 00000000..f591ab0e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/pin-morph67.json @@ -0,0 +1,42 @@ +{ + "schema": "hyperlex.hyperlexical.best_pin.v0.1", + "decision": "REJECT_VS_BEST", + "seed": "seed-morph67", + "path": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph67", + "prior_best": "seed-morph65", + "prior_unbind_exact": 0.9698492462311558, + "fair_val_n": 199, + "best_unbind_exact": 0.9597989949748744, + "best_epoch": 18, + "val_best": { + "classify_acc": 0.7734375, + "epoch": 18, + "n_classify_eval": 512, + "n_unbind_eval": 199, + "n_unbind_phase": 12638, + "unbind_exact": 0.9597989949748744, + "unbind_phase": "joint", + "unbind_phase_fallback_full_mix": false, + "unbind_slot_f1": 0.9722222222222222, + "unbind_token_f1": 0.9722222222222222, + "unbind_token_precision": 0.9722222222222222, + "unbind_token_recall": 0.9722222222222222 + }, + "val_n_train_receipt": 199, + "e2": { + "e2_pass": true, + "unbind_exact": 1.0, + "trunk_forward": true + }, + "delta": "SoT flip 2 AUTHORIZE INFERRED\u2192OBSERVED; force/hard morph66 164/206 held; UPSAMPLE=8 SECOND_SLOT=2; warm morph65", + "unbind_residual_themes": { + "partial_slot_miss": 6, + "positional_head_filler_miss": 2, + "type_slot_token_miss": 3 + }, + "name_gate": false, + "pinned_at": "2026-09-21T22:15:32.761648+00:00", + "gate_owner": "morph67-sot-flip", + "morph65_preserved": true, + "morph63_preserved": true +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/pin-no-promote.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/pin-no-promote.json new file mode 100644 index 00000000..f591ab0e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/pin-no-promote.json @@ -0,0 +1,42 @@ +{ + "schema": "hyperlex.hyperlexical.best_pin.v0.1", + "decision": "REJECT_VS_BEST", + "seed": "seed-morph67", + "path": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph67", + "prior_best": "seed-morph65", + "prior_unbind_exact": 0.9698492462311558, + "fair_val_n": 199, + "best_unbind_exact": 0.9597989949748744, + "best_epoch": 18, + "val_best": { + "classify_acc": 0.7734375, + "epoch": 18, + "n_classify_eval": 512, + "n_unbind_eval": 199, + "n_unbind_phase": 12638, + "unbind_exact": 0.9597989949748744, + "unbind_phase": "joint", + "unbind_phase_fallback_full_mix": false, + "unbind_slot_f1": 0.9722222222222222, + "unbind_token_f1": 0.9722222222222222, + "unbind_token_precision": 0.9722222222222222, + "unbind_token_recall": 0.9722222222222222 + }, + "val_n_train_receipt": 199, + "e2": { + "e2_pass": true, + "unbind_exact": 1.0, + "trunk_forward": true + }, + "delta": "SoT flip 2 AUTHORIZE INFERRED\u2192OBSERVED; force/hard morph66 164/206 held; UPSAMPLE=8 SECOND_SLOT=2; warm morph65", + "unbind_residual_themes": { + "partial_slot_miss": 6, + "positional_head_filler_miss": 2, + "type_slot_token_miss": 3 + }, + "name_gate": false, + "pinned_at": "2026-09-21T22:15:32.761648+00:00", + "gate_owner": "morph67-sot-flip", + "morph65_preserved": true, + "morph63_preserved": true +} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/residual-morph67.jsonl b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/residual-morph67.jsonl new file mode 100644 index 00000000..d2d1129a --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/residual-morph67.jsonl @@ -0,0 +1,8 @@ +{"class": "INFERRED", "gold": ["\"Crash", "out", "etymology\",", "The", "Idioms."], "lineage": "brainrot-aura", "pred": ["crash", "out", "(neologism)", "the", "Idioms."], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "slot_n_gold": 5, "slot_tp": 2, "text": "TOKEN:\"Crash SLOT:out MARKER:etymology\", TOKEN:The SLOT:Idioms.", "themes": ["type_slot_token_miss", "partial_slot_miss"], "token_n_gold": 5, "token_n_pred": 5, "token_tp": 2} +{"class": "INFERRED", "gold": ["(neologism)", "Alternative", "form", "of", "brain", "rot."], "lineage": "brainrot-aura", "pred": ["(neologism)", "Alternative", "form", "of", "brain", "rot"], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "slot_n_gold": 6, "slot_tp": 5, "text": "TOKEN:(neologism) SLOT:Alternative MARKER:form TOKEN:of SLOT:brain MARKER:rot.", "themes": ["partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 5} +{"class": "INFERRED", "gold": ["^", "\"aura", "farming\"", "on", "Google", "Trends."], "lineage": "brainrot-aura", "pred": ["^", "aura", "farming", "on", "Google", "Trends."], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "slot_n_gold": 6, "slot_tp": 4, "text": "TOKEN:^ SLOT:\"aura MARKER:farming\" TOKEN:on SLOT:Google MARKER:Trends.", "themes": ["type_slot_token_miss", "partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 4} +{"class": "INFERRED", "gold": ["[Out:]", "Mega", "yachts", "[In:]", "Mega", "gyatt"], "lineage": "brainrot-aura", "pred": ["[Out:]", "Mega", "boat", "[In:]", "Mega", "gyatt"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "slot_n_gold": 6, "slot_tp": 5, "text": "[Out:] Mega yachts [In:] Mega gyatt", "themes": ["partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 5} +{"class": "INFERRED", "gold": ["(from", "to", "the", "moon)", "quotations", "\u25bc"], "lineage": "crypto-degen", "pred": ["(computing)", "to", "the", "moon)", "rug", "\u25bc"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "slot_n_gold": 6, "slot_tp": 4, "text": "(from to the moon) quotations \u25bc", "themes": ["positional_head_filler_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 4} +{"class": "INFERRED", "gold": ["Armenian:", "\u057d\u0574\u0578\u0582\u0580\u0586\")", "(smurf),", "\u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\")", "pl", "(smurfik)"], "lineage": "gaming-meta", "pred": ["Armenian:", "\u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\")", "(smurf)", "\u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\")", "pl", "(smurfik)"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "slot_n_gold": 6, "slot_tp": 4, "text": "Armenian: \u057d\u0574\u0578\u0582\u0580\u0586\") (smurf), \u057d\u0574\u0578\u0582\u0580\u0586\u056b\u056f\") pl (smurfik)", "themes": ["partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 4} +{"class": "INFERRED", "gold": ["synonym", "\u25b2quotations", "\u25bc", "Synonym:", "tryhard"], "lineage": "gaming-meta", "pred": ["synonym", "quotations", "\u25bc", "(slang)", "tryhard"], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "slot_n_gold": 5, "slot_tp": 3, "text": "TOKEN:synonym SLOT:\u25b2quotations MARKER:\u25bc TOKEN:Synonym: SLOT:tryhard", "themes": ["type_slot_token_miss", "partial_slot_miss"], "token_n_gold": 5, "token_n_pred": 5, "token_tp": 3} +{"class": "OBSERVED", "gold": ["an", "egg's", "age"], "lineage": "none", "pred": ["a", "egg's", "age"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2"], "slot_n_gold": 3, "slot_tp": 2, "text": "an egg's age", "themes": ["positional_head_filler_miss"], "token_n_gold": 3, "token_n_pred": 3, "token_tp": 2} diff --git a/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/residual-morph67.summary.json b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/residual-morph67.summary.json new file mode 100644 index 00000000..ced91a31 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph67-sot-flip-20260921/residual-morph67.summary.json @@ -0,0 +1,16 @@ +{ + "by_class": { + "INFERRED": 7, + "OBSERVED": 1 + }, + "by_scheme": { + "positional": 4, + "type_slot": 4 + }, + "n_residual": 8, + "themes": { + "partial_slot_miss": 6, + "positional_head_filler_miss": 2, + "type_slot_token_miss": 3 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/GATE_LOCK.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/GATE_LOCK.json new file mode 100644 index 00000000..42c57f33 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/GATE_LOCK.json @@ -0,0 +1,12 @@ +{ + "gate_owner": "morph68-residual-gold", + "finished_at": "2026-09-22T08:22:50.686205+00:00", + "status": "done", + "decision": "REJECT_VS_BEST", + "best_unbind_exact": 0.9695431472081218, + "fair": 0.9695431472081218, + "fair_val_n": 197, + "e2_pass": true, + "surface_ok": true, + "val_n": 197 +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_20260922T013202Z.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_20260922T013202Z.json new file mode 100644 index 00000000..f9c96210 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_20260922T013202Z.json @@ -0,0 +1,15 @@ +{ + "schema": "hyperlex.train_hang.v0.1", + "as_of": "2026-09-22T01:32:02.051727+00:00", + "container": "hlx-train-morph68-1790029975", + "best_before_kill": { + "classify_acc": 0.787109375, + "epoch": 4, + "metric": "unbind_exact", + "unbind_exact": 0.9644670050761421, + "unbind_slot_f1": 0.9818181818181818, + "unbind_token_f1": 0.9818181818181818 + }, + "note": "Hung after ep4 best 0.964467; ~3h wall with 98% CPU, GPU mem ~1.6GB, no model-dir mtime change, docker log frozen after weight load. Kill+relaunch same knob (force/hard morph68, warm morph65).", + "action": "kill_relaunch_same_recipe" +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_20260922T031305Z_relaunch.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_20260922T031305Z_relaunch.json new file mode 100644 index 00000000..666d8448 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_20260922T031305Z_relaunch.json @@ -0,0 +1,11 @@ +{ + "schema": "hyperlex.train_hang.v0.1", + "as_of": "2026-09-22T03:13:15.839242+00:00", + "container": "hlx-train-morph68-1790040737", + "best_before_kill": { + "epoch": 4, + "unbind_exact": 0.9644670050761421 + }, + "note": "Second hang same pattern; operator ordered fix+continue. Investigating post-ep4 CPU spin.", + "action": "kill_investigate_fix_relaunch" +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_FIX_20260922T0315Z.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_FIX_20260922T0315Z.json new file mode 100644 index 00000000..6ec107d3 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/HANG_FIX_20260922T0315Z.json @@ -0,0 +1,17 @@ +{ + "schema": "hyperlex.train_hang_fix.v0.1", + "as_of": "2026-09-22T03:18:15.082679+00:00", + "prior_hangs": [ + "hlx-train-morph68-1790029975", + "hlx-train-morph68-1790040737" + ], + "root_cause": "per-step loss.detach().cpu() forced ~12k CUDA host syncs/epoch; after SAVE_BEST full encoder GPU\u2192CPU copy, subsequent syncs hung (host CPU ~98%, GPU util 0, mem held). Not CPU device fallback.", + "fix": [ + "loop.py: keep last_train_loss on-device; one .item() sync per epoch", + "loop.py: cuda.synchronize + empty_cache after SAVE_BEST", + "loop.py: epoch-progress.jsonl + stdout flush per epoch", + "relaunch: PYTORCH_CUDA_ALLOC_CONF without expandable_segments" + ], + "one_knob_unchanged": true, + "recipe": "same morph68 residual-gold force/hard, warm morph65, UPSAMPLE=8, SECOND_SLOT=2, mem 0.3" +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/REJECT_VS_BEST.md b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/REJECT_VS_BEST.md new file mode 100644 index 00000000..245da235 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/REJECT_VS_BEST.md @@ -0,0 +1,3 @@ +# morph68 REJECT + +best 0.9695431472081218 vs fair 0.9695431472081218 (n=197, decision REJECT_VS_BEST). BEST stays morph65. diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/RESIDUAL_LABEL_PROMOTE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/RESIDUAL_LABEL_PROMOTE_SUMMARY.json new file mode 100644 index 00000000..57e071dc --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/RESIDUAL_LABEL_PROMOTE_SUMMARY.json @@ -0,0 +1,21 @@ +{ + "auth": "operator continue 2026-09-22; morph68 residual gold after morph68 tie/REJECT (METHOD morph43; update goldens to continue)", + "residual_n": 6, + "authorize": 0, + "abstain": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 5, + "parenthetical_meta_filler": 1 + }, + "force_base": 166, + "force_new": 166, + "force_added": 0, + "hard_base": 208, + "hard_new": 208, + "hard_added": 0, + "force_path": "/home/morpheus/hlx/force_train_morph69_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph69.jsonl", + "authorize_texts": [], + "note": "AUTHORIZE=0 all residuals scaffolding/wiki/etym; do not launch identical morph69", + "as_of": "2026-09-22T07:50:58.049768+00:00" +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/STATUS.txt b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/STATUS.txt new file mode 100644 index 00000000..c494491b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/STATUS.txt @@ -0,0 +1 @@ +REJECT_VS_BEST diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/e2-unbind-morph68.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/e2-unbind-morph68.json new file mode 100644 index 00000000..a4c6bea4 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/e2-unbind-morph68.json @@ -0,0 +1,32 @@ +{ + "brier": null, + "device": "cuda", + "e2_pass": true, + "encoder_trainable_loaded": 48, + "encoder_trainable_present": 48, + "forecast_eligible": false, + "heads_loaded": true, + "model_dir": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph68", + "model_id": "hyperlex-encoder-modernbert-base-seed", + "model_swap": 1.0, + "n_test": 12, + "n_unbind_eval": 24, + "name_gate": false, + "note": "Trunk-forward unbind_exact + token/slot F1 from /home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph68/model.safetensors vs 004 probe_swap_min. Stub/digest leaves F1 null (no civilian filler lists). name_gate stays false. Applied 48 saved encoder trainable tensors.", + "probe_positional_swap": 1.0, + "probe_schema": "abraxas.recoverable_structure.probe.v0.1", + "probe_swap_min": 0.5, + "probe_type_slot_swap": 0.5, + "schema": "hyperlex.hyperlexical.eval_unbind.v0.1", + "stub_swap": 0.0, + "trunk": "answerdotai/ModernBERT-base", + "trunk_dir": "/home/morpheus/.hyperlex/models/trunks/ModernBERT-base", + "trunk_forward": true, + "trunk_loaded": true, + "unbind_exact": 1.0, + "unbind_slot_f1": 1.0, + "unbind_token_f1": 1.0, + "unbind_token_precision": 1.0, + "unbind_token_recall": 1.0, + "weight_file": "model.safetensors" +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/fair-eval-morph65-morph68.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/fair-eval-morph65-morph68.json new file mode 100644 index 00000000..d96e718b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/fair-eval-morph65-morph68.json @@ -0,0 +1,40 @@ +{ + "schema": "hyperlex.fair_eval_same_surface.v0.1", + "as_of": "2026-09-21T22:32:18.974200+00:00", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "seed": "seed-morph65", + "force_train_path": "/home/morpheus/hlx/force_train_morph68_expanded.jsonl", + "force_stats": { + "unbind_force_train_path": "force_train_morph68_expanded.jsonl", + "n_unbind_force_train": 166, + "n_unbind_force_train_keys": 166, + "n_unbind_val_after_force_train": 197 + }, + "n_hard_atoms": 208, + "unbind_exact": 0.9695431472081218, + "n_scored": 197, + "n_correct_est": 191, + "scored": { + "unbind_exact": 0.9695431472081218, + "n_unbind_eval": 197, + "unbind_token_f1": 0.9797979797979798, + "unbind_token_precision": 0.9797979797979798, + "unbind_token_recall": 0.9797979797979798, + "unbind_slot_f1": 0.9797979797979798 + }, + "knob": "morph67 residual AUTHORIZE force/hard expand (METHOD morph43)", + "prior_fair_morph65_n199": 0.9698492462311558, + "promote": { + "authorize": 2, + "abstain": 6, + "force_added": 2, + "hard_added": 2, + "force_new": 166, + "hard_new": 208, + "authorize_texts": [ + "[Out:] Mega yachts [In:] Mega gyatt", + "an egg's age" + ] + }, + "note": "Fair morph65 BEST on morph68 force surface. Gate morph68 best > this fair + E2 trunk-forward 1.0." +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/morph68-intent.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/morph68-intent.json new file mode 100644 index 00000000..e9467ca4 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/morph68-intent.json @@ -0,0 +1,28 @@ +{ + "morph": 68, + "as_of": "2026-09-21T22:32:55.134561+00:00", + "auth": "operator continue 2026-09-21; morph68 after morph67 REJECT + residual AUTHORIZE force expand", + "one_knob": "morph67 residual AUTHORIZE n=2 force/hard expand + harvest OBSERVED append", + "warm": "seed-morph65", + "force": "/home/morpheus/hlx/force_train_morph68_expanded.jsonl", + "hard": "/home/morpheus/hlx/hard_atoms_train_morph68.jsonl", + "upsample": 8, + "second_slot": 2, + "last_trainable": 8, + "epochs": 40, + "lr": "2e-5", + "mem_fraction": 0.3, + "save_best": true, + "fair_path": "/home/morpheus/hlx/fair-eval-morph65-morph68.json", + "fair_exact": 0.9695431472081218, + "fair_n": 197, + "pin_rule": "best > fair on n=197 and E2 trunk-forward unbind_exact=1.0", + "name_gate": false, + "not_this_card": [ + "upsample 11+", + "SECOND_SLOT=4", + "replay morph67 SoT without new gold", + "invent OBSERVED fillers", + "Hub" + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/pin-no-promote.json b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/pin-no-promote.json new file mode 100644 index 00000000..d2e6b324 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph68-residual-gold-20260921/pin-no-promote.json @@ -0,0 +1,41 @@ +{ + "schema": "hyperlex.hyperlexical.best_pin.v0.1", + "decision": "REJECT_VS_BEST", + "seed": "seed-morph68", + "path": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph68", + "prior_best": "seed-morph65", + "prior_unbind_exact": 0.9695431472081218, + "fair_val_n": 197, + "best_unbind_exact": 0.9695431472081218, + "best_epoch": 27, + "val_best": { + "classify_acc": 0.787109375, + "epoch": 27, + "n_classify_eval": 512, + "n_unbind_eval": 197, + "n_unbind_phase": 12651, + "unbind_exact": 0.9695431472081218, + "unbind_phase": "joint", + "unbind_phase_fallback_full_mix": false, + "unbind_slot_f1": 0.9818181818181818, + "unbind_token_f1": 0.9818181818181818, + "unbind_token_precision": 0.9818181818181818, + "unbind_token_recall": 0.9818181818181818 + }, + "val_n_train_receipt": 197, + "e2": { + "e2_pass": true, + "unbind_exact": 1.0, + "trunk_forward": true + }, + "delta": "SoT flip 2 AUTHORIZE INFERRED→OBSERVED; force/hard morph66 164/206 held; UPSAMPLE=8 SECOND_SLOT=2; warm morph65", + "unbind_residual_themes": { + "partial_slot_miss": 6, + "type_slot_token_miss": 3 + }, + "name_gate": false, + "pinned_at": "2026-09-22T08:22:50.684934+00:00", + "gate_owner": "morph68-residual-gold", + "morph65_preserved": true, + "morph63_preserved": true +} diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/GATE_LOCK.json b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/GATE_LOCK.json new file mode 100644 index 00000000..79db48ef --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/GATE_LOCK.json @@ -0,0 +1,12 @@ +{ + "gate_owner": "morph69-unused-gold", + "finished_at": "2026-09-22T13:00:15.679408+00:00", + "status": "done", + "decision": "REJECT_VS_BEST", + "best_unbind_exact": 0.9649122807017544, + "fair": 0.9649122807017544, + "fair_val_n": 171, + "e2_pass": true, + "surface_ok": true, + "val_n": 171 +} diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/LABEL_COUNTS.json new file mode 100644 index 00000000..306bd5a7 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/LABEL_COUNTS.json @@ -0,0 +1,7 @@ +{ + "auth": "operator continue 2026-09-22; update goldens — integrate unused METHOD AUTHORIZE morph43/morph50 residual gold not yet in force68 (AUTHORIZE_MORPH43_OVERLAP still in force)", + "AUTHORIZE": 26, + "ABSTAIN": 0, + "n": 26, + "from": "unused prior METHOD authorize packets" +} diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/METHOD.md b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/METHOD.md new file mode 100644 index 00000000..2b0bf7fb --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/METHOD.md @@ -0,0 +1,5 @@ +# morph69 unused METHOD gold — method + +**Authority:** operator continue 2026-09-22; update goldens — integrate unused METHOD AUTHORIZE morph43/morph50 residual gold not yet in force68 (AUTHORIZE_MORPH43_OVERLAP still in force) +METHOD = morph43. Schemes positional|type_slot only. No invented fillers. +morph68 best residuals AUTHORIZE=0 (scaffolding). One knob = unused prior METHOD AUTHORIZE gold not in force68. diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/PROMOTE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/PROMOTE_SUMMARY.json new file mode 100644 index 00000000..33899f93 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/PROMOTE_SUMMARY.json @@ -0,0 +1,82 @@ +{ + "auth": "operator continue 2026-09-22; update goldens — integrate unused METHOD AUTHORIZE morph43/morph50 residual gold not yet in force68 (AUTHORIZE_MORPH43_OVERLAP still in force)", + "one_knob": "integrate unused METHOD AUTHORIZE morph43/morph50 residual gold into force/hard", + "n_unused_authorize": 26, + "by_source": { + "labeled_morph43_residuals.jsonl": 25, + "labeled_morph50_residuals.jsonl": 1 + }, + "by_prior_class": { + "INFERRED": 23, + "OBSERVED": 3 + }, + "by_scheme": { + "positional": 16, + "type_slot": 10 + }, + "force_base": 166, + "force_new": 192, + "force_added": 26, + "hard_base": 208, + "hard_new": 233, + "hard_added": 25, + "force_path": "/home/morpheus/hlx/force_train_morph69_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph69.jsonl", + "authorize_texts": [ + "heavy glaze", + "TOKEN:round SLOT:robin", + "TOKEN:fr SLOT:fr MARKER:ong", + "TOKEN:looksmaxxed SLOT:hard", + "hodl diamond hands rekt degen moon", + "ser anon", + "spaces alpha", + "TOKEN:chosen SLOT:family", + "British California", + "TOKEN:Admiralty SLOT:ham", + "TOKEN:Benjamin SLOT:Franklin", + "TOKEN:Burlington SLOT:Bertie", + "TOKEN:able SLOT:whackets", + "TOKEN:aye SLOT:aye MARKER:shepherd's TOKEN:pie", + "ask my arse", + "aux cord", + "barking iron", + "bate an ace", + "behind the wire", + "belt out", + "big-ticket item", + "blast off", + "blinged out", + "bridge up", + "brush up to", + "TOKEN:negative SLOT:hallucination" + ], + "harvest_appended": [ + "heavy glaze", + "TOKEN:round SLOT:robin", + "TOKEN:fr SLOT:fr MARKER:ong", + "hodl diamond hands rekt degen moon", + "spaces alpha", + "TOKEN:chosen SLOT:family", + "British California", + "TOKEN:Admiralty SLOT:ham", + "TOKEN:Benjamin SLOT:Franklin", + "TOKEN:Burlington SLOT:Bertie", + "TOKEN:able SLOT:whackets", + "TOKEN:aye SLOT:aye MARKER:shepherd's TOKEN:pie", + "ask my arse", + "aux cord", + "barking iron", + "bate an ace", + "behind the wire", + "belt out", + "big-ticket item", + "blast off", + "blinged out", + "bridge up", + "brush up to", + "TOKEN:negative SLOT:hallucination" + ], + "morph68_residual_authorize": 0, + "morph68_residual_note": "best-ep residuals n=6 all ABSTAIN scaffolding; pivoted to unused METHOD gold", + "as_of": "2026-09-22T07:52:20.743609+00:00" +} diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/REJECT_VS_BEST.md b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/REJECT_VS_BEST.md new file mode 100644 index 00000000..d5f5ad33 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/REJECT_VS_BEST.md @@ -0,0 +1,3 @@ +# morph69 REJECT + +best 0.9649122807017544 vs fair 0.9649122807017544 (n=171, decision REJECT_VS_BEST). BEST stays morph65. diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/RESIDUAL_LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/RESIDUAL_LABEL_COUNTS.json new file mode 100644 index 00000000..4726bb73 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/RESIDUAL_LABEL_COUNTS.json @@ -0,0 +1,10 @@ +{ + "auth": "operator continue 2026-09-22; morph69 REJECT residual METHOD morph43", + "residual_n": 6, + "AUTHORIZE": 0, + "ABSTAIN": 6, + "by_reason": { + "abstain_scaffolding_wiki_etym": 5, + "parenthetical_meta_filler": 1 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/RESIDUAL_LABEL_METHOD.md b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/RESIDUAL_LABEL_METHOD.md new file mode 100644 index 00000000..3ebab451 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/RESIDUAL_LABEL_METHOD.md @@ -0,0 +1,14 @@ +# morph69 residual METHOD morph43 + +**Authority:** operator continue 2026-09-22 (post morph69 REJECT). +METHOD = morph43. Schemes positional|type_slot only. No invented fillers. + +| | n | +|--|--:| +| residuals | 6 | +| AUTHORIZE | **0** | +| ABSTAIN | **6** | + +Reasons: `abstain_scaffolding_wiki_etym` 5, `parenthetical_meta_filler` 1. +Do **not** burn force_added=0 morph70. METHOD morph43/50 residual AUTHORIZE already exhausted in force69. +`p1-spark-20260919-local-label-new-atoms` AUTHORIZE 25 remain outside force but marked **INFERRED proposal only; not force-train** until operator settles OBSERVED. diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/STATUS.txt b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/STATUS.txt new file mode 100644 index 00000000..c494491b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/STATUS.txt @@ -0,0 +1 @@ +REJECT_VS_BEST diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/fair-eval-morph65-morph69.json b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/fair-eval-morph65-morph69.json new file mode 100644 index 00000000..c601f476 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/fair-eval-morph65-morph69.json @@ -0,0 +1,66 @@ +{ + "schema": "hyperlex.fair_eval_same_surface.v0.1", + "as_of": "2026-09-22T07:53:03.923120+00:00", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "seed": "seed-morph65", + "force_train_path": "/home/morpheus/hlx/force_train_morph69_expanded.jsonl", + "force_stats": { + "unbind_force_train_path": "force_train_morph69_expanded.jsonl", + "n_unbind_force_train": 191, + "n_unbind_force_train_keys": 192, + "n_unbind_val_after_force_train": 171 + }, + "n_hard_atoms": 233, + "unbind_exact": 0.9649122807017544, + "n_scored": 171, + "n_correct_est": 165, + "scored": { + "unbind_exact": 0.9649122807017544, + "n_unbind_eval": 171, + "unbind_token_f1": 0.9768518518518519, + "unbind_token_precision": 0.9768518518518519, + "unbind_token_recall": 0.9768518518518519, + "unbind_slot_f1": 0.9768518518518519 + }, + "knob": "unused METHOD AUTHORIZE morph43/morph50 residual gold integrate (force_added=26)", + "prior_fair_morph65_n199": 0.9698492462311558, + "promote": { + "authorize": 26, + "abstain": 0, + "force_added": 26, + "hard_added": 25, + "force_new": 192, + "hard_new": 233, + "authorize_texts": [ + "heavy glaze", + "TOKEN:round SLOT:robin", + "TOKEN:fr SLOT:fr MARKER:ong", + "TOKEN:looksmaxxed SLOT:hard", + "hodl diamond hands rekt degen moon", + "ser anon", + "spaces alpha", + "TOKEN:chosen SLOT:family", + "British California", + "TOKEN:Admiralty SLOT:ham", + "TOKEN:Benjamin SLOT:Franklin", + "TOKEN:Burlington SLOT:Bertie", + "TOKEN:able SLOT:whackets", + "TOKEN:aye SLOT:aye MARKER:shepherd's TOKEN:pie", + "ask my arse", + "aux cord", + "barking iron", + "bate an ace", + "behind the wire", + "belt out", + "big-ticket item", + "blast off", + "blinged out", + "bridge up", + "brush up to", + "TOKEN:negative SLOT:hallucination" + ] + }, + "note": "Fair morph65 BEST on morph69 force surface. Gate morph69 best > this fair + E2 trunk-forward 1.0.", + "fair_exact": 0.9649122807017544, + "fair_n": 171 +} diff --git a/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/morph69-intent.json b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/morph69-intent.json new file mode 100644 index 00000000..b650e89e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph69-unused-gold-20260922/morph69-intent.json @@ -0,0 +1,29 @@ +{ + "morph": 69, + "as_of": "2026-09-22T07:53:44.651375+00:00", + "auth": "operator continue 2026-09-22; update goldens to continue", + "one_knob": "integrate unused METHOD AUTHORIZE morph43/morph50 residual gold not in force68 (force_added=26)", + "warm": "seed-morph65", + "force": "/home/morpheus/hlx/force_train_morph69_expanded.jsonl", + "hard": "/home/morpheus/hlx/hard_atoms_train_morph69.jsonl", + "upsample": 8, + "second_slot": 2, + "last_trainable": 8, + "epochs": 40, + "lr": "2e-5", + "mem_fraction": 0.3, + "save_best": true, + "fair_path": "/home/morpheus/hlx/fair-eval-morph65-morph69.json", + "fair_exact": 0.9649122807017544, + "fair_n": 171, + "pin_rule": "best > fair on n=171 and E2 trunk-forward unbind_exact=1.0", + "name_gate": false, + "morph68_note": "best 0.9695431472081218 == fair morph68 0.9695431472081218 → REJECT_VS_BEST (strictly greater); residual AUTHORIZE=0 scaffolding", + "not_this_card": [ + "upsample 11+", + "SECOND_SLOT=4", + "invent OBSERVED fillers", + "Hub", + "replay morph68 residual-only with force_added=0" + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/HARVEST_APPEND_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/HARVEST_APPEND_SUMMARY.json new file mode 100644 index 00000000..ce02ab91 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/HARVEST_APPEND_SUMMARY.json @@ -0,0 +1,57 @@ +{ + "as_of": "2026-09-22T20:58:20.831658+00:00", + "auth": "operator continue 2026-09-22; morph71 role-vocab expand / non-warm for held longer local-label-new-atoms AUTHORIZE (pos_6+; morph65 max pos_5)", + "n_appended": 23, + "texts": [ + "a few roos loose in the top paddock", + "a kangaroo loose in the top paddock", + "all that and a bag of chips", + "and the horse you rode in on", + "a roo loose in the top paddock", + "Banbury story of a cock and a bull", + "quiet quitting rto bandwidth act your wage", + "Im so delulu right now what on earth", + "looksmaxxer gooner ate and left no crumbs", + "broski lil bro bruh moment big bro", + "skill issue touch grass sus ratio diff smurf", + "rizz skibidi gyatt sigma delulu no cap", + "vibe check no thoughts just vibes hallucinate steam", + "vibe coding context window glazing clanker agentic slop", + "bestie at Obserwatorium J\u0119zyka i Kultury M\u0142odzie\u017cy", + "holy skibidi this is just like the backrooms", + "that hoodie is rizzed up for sure", + "sharp money revenge steam chase line movement", + "rug pulled diamond handed paper handed ath", + "quiet quitter quiet fired boiling the ocean", + "auntie lil sis big sis yo unc", + "red pilled black pilled based and blackpilled", + "lowkenuinely been laughing for a minute now" + ], + "authorize_all": [ + "a few roos loose in the top paddock", + "a kangaroo loose in the top paddock", + "all that and a bag of chips", + "and the horse you rode in on", + "a roo loose in the top paddock", + "Banbury story of a cock and a bull", + "quiet quitting rto bandwidth act your wage", + "Im so delulu right now what on earth", + "looksmaxxer gooner ate and left no crumbs", + "broski lil bro bruh moment big bro", + "skill issue touch grass sus ratio diff smurf", + "rizz skibidi gyatt sigma delulu no cap", + "vibe check no thoughts just vibes hallucinate steam", + "vibe coding context window glazing clanker agentic slop", + "bestie at Obserwatorium J\u0119zyka i Kultury M\u0142odzie\u017cy", + "holy skibidi this is just like the backrooms", + "that hoodie is rizzed up for sure", + "sharp money revenge steam chase line movement", + "rug pulled diamond handed paper handed ath", + "quiet quitter quiet fired boiling the ocean", + "auntie lil sis big sis yo unc", + "red pilled black pilled based and blackpilled", + "lowkenuinely been laughing for a minute now" + ], + "harvest": "/home/morpheus/.hyperlex/hyperlexical/harvest_unbind_observed_mw.jsonl", + "role_max_pos_added": 7 +} diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/LABEL_COUNTS.json new file mode 100644 index 00000000..01375290 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/LABEL_COUNTS.json @@ -0,0 +1,7 @@ +{ + "auth": "operator continue 2026-09-22; morph71 role-vocab expand / non-warm for held longer local-label-new-atoms AUTHORIZE (pos_6+; morph65 max pos_5)", + "AUTHORIZE": 23, + "ABSTAIN": 0, + "n": 23, + "from": "held longer local-label-new-atoms (fillers>=7; pos_6+)" +} diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/METHOD.md b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/METHOD.md new file mode 100644 index 00000000..da6d5d55 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/METHOD.md @@ -0,0 +1,7 @@ +# morph71 longer new-atoms — method + +**Authority:** operator continue 2026-09-22; morph71 role-vocab expand / non-warm for held longer local-label-new-atoms AUTHORIZE (pos_6+; morph65 max pos_5) +METHOD = morph43 positional_text_split_match. Schemes positional only. +SoT class already OBSERVED (PACKET_SETTLE; classify family). Harvest unbind roles/fillers. +Non-warm (no INIT_FROM) — role-vocab expand to pos_6/pos_7. +No invented fillers. Upsample 8 / SECOND_SLOT=2 held. diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/PROMOTE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/PROMOTE_SUMMARY.json new file mode 100644 index 00000000..34d38b1b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/PROMOTE_SUMMARY.json @@ -0,0 +1,71 @@ +{ + "auth": "operator continue 2026-09-22; morph71 role-vocab expand / non-warm for held longer local-label-new-atoms AUTHORIZE (pos_6+; morph65 max pos_5)", + "one_knob": "role-vocab expand / non-warm: integrate held longer new-atoms AUTHORIZE needing pos_6+ (morph65 max pos_5)", + "n_longer_authorize": 23, + "by_scheme": { + "positional": 23 + }, + "force_base": 194, + "force_new": 217, + "force_added": 23, + "hard_base": 235, + "hard_new": 258, + "hard_added": 23, + "force_path": "/home/morpheus/hlx/force_train_morph71_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph71.jsonl", + "authorize_texts": [ + "a few roos loose in the top paddock", + "a kangaroo loose in the top paddock", + "all that and a bag of chips", + "and the horse you rode in on", + "a roo loose in the top paddock", + "Banbury story of a cock and a bull", + "quiet quitting rto bandwidth act your wage", + "Im so delulu right now what on earth", + "looksmaxxer gooner ate and left no crumbs", + "broski lil bro bruh moment big bro", + "skill issue touch grass sus ratio diff smurf", + "rizz skibidi gyatt sigma delulu no cap", + "vibe check no thoughts just vibes hallucinate steam", + "vibe coding context window glazing clanker agentic slop", + "bestie at Obserwatorium J\u0119zyka i Kultury M\u0142odzie\u017cy", + "holy skibidi this is just like the backrooms", + "that hoodie is rizzed up for sure", + "sharp money revenge steam chase line movement", + "rug pulled diamond handed paper handed ath", + "quiet quitter quiet fired boiling the ocean", + "auntie lil sis big sis yo unc", + "red pilled black pilled based and blackpilled", + "lowkenuinely been laughing for a minute now" + ], + "harvest_appended": [ + "a few roos loose in the top paddock", + "a kangaroo loose in the top paddock", + "all that and a bag of chips", + "and the horse you rode in on", + "a roo loose in the top paddock", + "Banbury story of a cock and a bull", + "quiet quitting rto bandwidth act your wage", + "Im so delulu right now what on earth", + "looksmaxxer gooner ate and left no crumbs", + "broski lil bro bruh moment big bro", + "skill issue touch grass sus ratio diff smurf", + "rizz skibidi gyatt sigma delulu no cap", + "vibe check no thoughts just vibes hallucinate steam", + "vibe coding context window glazing clanker agentic slop", + "bestie at Obserwatorium J\u0119zyka i Kultury M\u0142odzie\u017cy", + "holy skibidi this is just like the backrooms", + "that hoodie is rizzed up for sure", + "sharp money revenge steam chase line movement", + "rug pulled diamond handed paper handed ath", + "quiet quitter quiet fired boiling the ocean", + "auntie lil sis big sis yo unc", + "red pilled black pilled based and blackpilled", + "lowkenuinely been laughing for a minute now" + ], + "role_max_pos_added": 7, + "warm": null, + "init_from": null, + "as_of": "2026-09-22T20:58:20.831658+00:00", + "morph70_note": "REJECT tie fair 0.9649 n=171; role-vocab filter force_added=2; 23 longer held for this non-warm card" +} diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/RESIDUAL_LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/RESIDUAL_LABEL_COUNTS.json new file mode 100644 index 00000000..dcb1f23e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/RESIDUAL_LABEL_COUNTS.json @@ -0,0 +1,13 @@ +{ + "auth": "operator continue 2026-09-22; morph71 REJECT residual METHOD morph43 label", + "AUTHORIZE": 0, + "ABSTAIN": 7, + "n": 7, + "by_scheme": { + "positional": 3, + "type_slot": 4 + }, + "by_why": { + "abstain_scaffolding_wiki_etym": 7 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/RESIDUAL_LABEL_METHOD.md b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/RESIDUAL_LABEL_METHOD.md new file mode 100644 index 00000000..47d5de66 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/RESIDUAL_LABEL_METHOD.md @@ -0,0 +1,6 @@ +# morph71 residual METHOD morph43 + +**Authority:** operator continue 2026-09-22; morph71 REJECT residual METHOD morph43 label +n=7. AUTHORIZE=0 / ABSTAIN=7. +All residuals INFERRED scaffolding/wiki/partial_slot — ABSTAIN. Do not burn force_added=0. +BEST stays morph65. Upsample frozen; no SECOND_SLOT=4. diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/ROLE_EXPAND.json b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/ROLE_EXPAND.json new file mode 100644 index 00000000..013483e5 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/ROLE_EXPAND.json @@ -0,0 +1,33 @@ +{ + "morph65_role_max": "pos_5", + "added_n": 23, + "role_max_pos_added": 7, + "warm": false, + "init_from": null, + "reason": "INIT_FROM role/filler vocab mismatch vs expanded export", + "texts": [ + "a few roos loose in the top paddock", + "a kangaroo loose in the top paddock", + "all that and a bag of chips", + "and the horse you rode in on", + "a roo loose in the top paddock", + "Banbury story of a cock and a bull", + "quiet quitting rto bandwidth act your wage", + "Im so delulu right now what on earth", + "looksmaxxer gooner ate and left no crumbs", + "broski lil bro bruh moment big bro", + "skill issue touch grass sus ratio diff smurf", + "rizz skibidi gyatt sigma delulu no cap", + "vibe check no thoughts just vibes hallucinate steam", + "vibe coding context window glazing clanker agentic slop", + "bestie at Obserwatorium Języka i Kultury Młodzieży", + "holy skibidi this is just like the backrooms", + "that hoodie is rizzed up for sure", + "sharp money revenge steam chase line movement", + "rug pulled diamond handed paper handed ath", + "quiet quitter quiet fired boiling the ocean", + "auntie lil sis big sis yo unc", + "red pilled black pilled based and blackpilled", + "lowkenuinely been laughing for a minute now" + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/STATUS.txt b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/STATUS.txt new file mode 100644 index 00000000..c494491b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/STATUS.txt @@ -0,0 +1 @@ +REJECT_VS_BEST diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/container.txt b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/container.txt new file mode 100644 index 00000000..309f4017 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/container.txt @@ -0,0 +1 @@ +hlx-train-morph71-1790110734 diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/fair-eval-morph65-morph71.json b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/fair-eval-morph65-morph71.json new file mode 100644 index 00000000..cab5393c --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/fair-eval-morph65-morph71.json @@ -0,0 +1,64 @@ +{ + "schema": "hyperlex.fair_eval_same_surface.v0.1", + "as_of": "2026-09-22T20:58:46.775784+00:00", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "seed": "seed-morph65", + "force_train_path": "/home/morpheus/hlx/force_train_morph71_expanded.jsonl", + "force_stats": { + "unbind_force_train_path": "force_train_morph71_expanded.jsonl", + "n_unbind_force_train": 192, + "n_unbind_force_train_keys": 217, + "n_unbind_val_after_force_train": 171 + }, + "n_hard_atoms": 258, + "unbind_exact": 0.9649122807017544, + "n_scored": 171, + "n_correct_est": 165, + "scored": { + "unbind_exact": 0.9649122807017544, + "n_unbind_eval": 171, + "unbind_token_f1": 0.9768518518518519, + "unbind_token_precision": 0.9768518518518519, + "unbind_token_recall": 0.9768518518518519, + "unbind_slot_f1": 0.9768518518518519 + }, + "knob": "role-vocab expand / non-warm longer new-atoms AUTHORIZE", + "prior_fair_morph65_n171": 0.9649122807017544, + "promote": { + "authorize": 23, + "force_added": 23, + "hard_added": 23, + "force_new": 217, + "hard_new": 258, + "authorize_texts": [ + "a few roos loose in the top paddock", + "a kangaroo loose in the top paddock", + "all that and a bag of chips", + "and the horse you rode in on", + "a roo loose in the top paddock", + "Banbury story of a cock and a bull", + "quiet quitting rto bandwidth act your wage", + "Im so delulu right now what on earth", + "looksmaxxer gooner ate and left no crumbs", + "broski lil bro bruh moment big bro", + "skill issue touch grass sus ratio diff smurf", + "rizz skibidi gyatt sigma delulu no cap", + "vibe check no thoughts just vibes hallucinate steam", + "vibe coding context window glazing clanker agentic slop", + "bestie at Obserwatorium J\u0119zyka i Kultury M\u0142odzie\u017cy", + "holy skibidi this is just like the backrooms", + "that hoodie is rizzed up for sure", + "sharp money revenge steam chase line movement", + "rug pulled diamond handed paper handed ath", + "quiet quitter quiet fired boiling the ocean", + "auntie lil sis big sis yo unc", + "red pilled black pilled based and blackpilled", + "lowkenuinely been laughing for a minute now" + ], + "n_longer_authorize": 23, + "warm": null + }, + "note": "Fair morph65 BEST on morph71 force surface. Gate morph71 best > this fair + E2 trunk-forward 1.0. Train is non-warm.", + "fair_exact": 0.9649122807017544, + "fair_n": 171 +} diff --git a/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/morph71-intent.json b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/morph71-intent.json new file mode 100644 index 00000000..c94f94be --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph71-role-expand-nonwarm-20260922/morph71-intent.json @@ -0,0 +1,31 @@ +{ + "morph": 71, + "as_of": "2026-09-22T20:58:54.985383+00:00", + "auth": "operator continue 2026-09-22; morph71 role-vocab expand / non-warm for held longer local-label-new-atoms AUTHORIZE (pos_6+; morph65 max pos_5)", + "one_knob": "role-vocab expand / non-warm for held longer new-atoms AUTHORIZE", + "warm": null, + "init_from": null, + "force": "/home/morpheus/hlx/force_train_morph71_expanded.jsonl", + "hard": "/home/morpheus/hlx/hard_atoms_train_morph71.jsonl", + "upsample": 8, + "second_slot": 2, + "last_trainable": 8, + "epochs": 40, + "lr": "2e-5", + "mem_fraction": 0.3, + "save_best": true, + "fair_path": "/home/morpheus/hlx/fair-eval-morph65-morph71.json", + "fair_exact": 0.9649122807017544, + "fair_n": 171, + "pin_rule": "best > fair on n=171 and E2 trunk-forward unbind_exact=1.0", + "name_gate": false, + "morph70_note": "best 0.9649122807017544 == fair morph70 → REJECT_VS_BEST; role-vocab filter force_added=2; 23 longer held", + "not_this_card": [ + "warm INIT_FROM morph65", + "upsample 11+", + "SECOND_SLOT=4", + "invent OBSERVED fillers", + "Hub", + "force_added=0 warm clone" + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph72-upsample10-nonwarm-20260923/RESIDUAL_LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph72-upsample10-nonwarm-20260923/RESIDUAL_LABEL_COUNTS.json new file mode 100644 index 00000000..93a77a07 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph72-upsample10-nonwarm-20260923/RESIDUAL_LABEL_COUNTS.json @@ -0,0 +1,13 @@ +{ + "auth": "operator continue 2026-09-23; morph72 REJECT residual METHOD morph43 label", + "AUTHORIZE": 0, + "ABSTAIN": 8, + "n": 8, + "by_scheme": { + "positional": 3, + "type_slot": 5 + }, + "by_why": { + "abstain_scaffolding_wiki_etym": 8 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph72-upsample10-nonwarm-20260923/STATUS.txt b/specs/007-hyperlexical-model/receipts/morph72-upsample10-nonwarm-20260923/STATUS.txt new file mode 100644 index 00000000..c494491b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph72-upsample10-nonwarm-20260923/STATUS.txt @@ -0,0 +1 @@ +REJECT_VS_BEST diff --git a/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/METHOD.md b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/METHOD.md new file mode 100644 index 00000000..2f8d527e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/METHOD.md @@ -0,0 +1,4 @@ +# morph73 INIT_EXPAND_VOCAB warm morph65 — method + +**Authority:** operator handle-the-knob-first-and-continue 2026-09-23; morph73 INIT_EXPAND_VOCAB=1 warm morph65 on morph72 force/hard +ONE knob vs morph72: warm morph65 with HYPERLEX_INIT_EXPAND_VOCAB=1 (name-remap shared role/filler rows; new pos_6+/fillers stay at init). Same morph72 force/hard. UPSAMPLE=10 / SECOND_SLOT=2 / LAST=8 held. No new gold. Upsample freeze remains 11+. diff --git a/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/REJECT_VS_BEST.md b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/REJECT_VS_BEST.md new file mode 100644 index 00000000..e739f7d7 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/REJECT_VS_BEST.md @@ -0,0 +1,3 @@ +# morph73 REJECT + +best 0.9649122807017544 vs fair 0.9649122807017544 (n=171, decision REJECT_VS_BEST). BEST stays morph65. Tie ≠ promote. Residual AUTHORIZE=0. diff --git a/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/RESIDUAL_LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/RESIDUAL_LABEL_COUNTS.json new file mode 100644 index 00000000..05994d2b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/RESIDUAL_LABEL_COUNTS.json @@ -0,0 +1,17 @@ +{ + "n": 6, + "AUTHORIZE": 0, + "ABSTAIN": 6, + "by_decision": { + "ABSTAIN": 6 + }, + "by_why": { + "abstain_scaffolding_wiki_etym": 6 + }, + "by_scheme": { + "type_slot": 4, + "positional": 2 + }, + "as_of": "2026-09-23T13:30:12.132645+00:00", + "authorization": "operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label" +} diff --git a/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/RESIDUAL_LABEL_METHOD.md b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/RESIDUAL_LABEL_METHOD.md new file mode 100644 index 00000000..31fd6833 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/RESIDUAL_LABEL_METHOD.md @@ -0,0 +1,5 @@ +# morph73 residual METHOD morph43 + +**Authority:** operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label +n=6. AUTHORIZE=0 / ABSTAIN=6. +Do not burn force_added=0 / fair-tie / identical expand-warm replay. BEST morph65 held. diff --git a/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/labeled_morph73_residuals.jsonl b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/labeled_morph73_residuals.jsonl new file mode 100644 index 00000000..c233073b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/labeled_morph73_residuals.jsonl @@ -0,0 +1,6 @@ +{"class": "INFERRED", "gold": ["\"Crash", "out", "etymology\",", "The", "Idioms."], "lineage": "brainrot-aura", "pred": ["crash", "out", "(neologism)", "The", "Idioms."], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "slot_n_gold": 5, "slot_tp": 3, "text": "TOKEN:\"Crash SLOT:out MARKER:etymology\", TOKEN:The SLOT:Idioms.", "themes": ["type_slot_token_miss", "partial_slot_miss"], "token_n_gold": 5, "token_n_pred": 5, "token_tp": 3, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label"} +{"class": "INFERRED", "gold": ["(neologism)", "Alternative", "form", "of", "brain", "rot."], "lineage": "brainrot-aura", "pred": ["(neologism)", "Alternative", "form", "of", "brain", "rot"], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "slot_n_gold": 6, "slot_tp": 5, "text": "TOKEN:(neologism) SLOT:Alternative MARKER:form TOKEN:of SLOT:brain MARKER:rot.", "themes": ["partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 5, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label"} +{"class": "INFERRED", "gold": ["^", "\"aura", "farming\"", "on", "Google", "Trends."], "lineage": "brainrot-aura", "pred": ["^", "aura", "farming", "on", "Google", "Trends."], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT", "MARKER"], "slot_n_gold": 6, "slot_tp": 4, "text": "TOKEN:^ SLOT:\"aura MARKER:farming\" TOKEN:on SLOT:Google MARKER:Trends.", "themes": ["type_slot_token_miss", "partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 4, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label"} +{"class": "INFERRED", "gold": ["(from", "to", "the", "moon)", "quotations", "▼"], "lineage": "crypto-degen", "pred": ["(from", "to", "the", "moon)", "sigma", "▼"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "slot_n_gold": 6, "slot_tp": 5, "text": "(from to the moon) quotations ▼", "themes": ["partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 5, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label"} +{"class": "INFERRED", "gold": ["Armenian:", "սմուրֆ\")", "(smurf),", "սմուրֆիկ\")", "pl", "(smurfik)"], "lineage": "gaming-meta", "pred": ["Armenian:", "սկիբիդի\")", "(smurf)", "սկիբիդի\")", "pl", "(smurfik)"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3", "pos_4", "pos_5"], "slot_n_gold": 6, "slot_tp": 3, "text": "Armenian: սմուրֆ\") (smurf), սմուրֆիկ\") pl (smurfik)", "themes": ["partial_slot_miss"], "token_n_gold": 6, "token_n_pred": 6, "token_tp": 3, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label"} +{"class": "INFERRED", "gold": ["synonym", "▲quotations", "▼", "Synonym:", "tryhard"], "lineage": "gaming-meta", "pred": ["synonym", "▲", "▼", "Antonym:", "tryhard"], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN", "SLOT"], "slot_n_gold": 5, "slot_tp": 3, "text": "TOKEN:synonym SLOT:▲quotations MARKER:▼ TOKEN:Synonym: SLOT:tryhard", "themes": ["type_slot_token_miss", "partial_slot_miss"], "token_n_gold": 5, "token_n_pred": 5, "token_tp": 3, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator okcontinue 2026-09-23; morph73 REJECT residual METHOD morph43 label"} diff --git a/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/residual-morph73.summary.json b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/residual-morph73.summary.json new file mode 100644 index 00000000..27f868f3 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph73-expand-warm-20260923/residual-morph73.summary.json @@ -0,0 +1,14 @@ +{ + "by_class": { + "INFERRED": 6 + }, + "by_scheme": { + "positional": 2, + "type_slot": 4 + }, + "n_residual": 6, + "themes": { + "partial_slot_miss": 6, + "type_slot_token_miss": 3 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/GATE_LOCK.json b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/GATE_LOCK.json new file mode 100644 index 00000000..43158dc4 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/GATE_LOCK.json @@ -0,0 +1,12 @@ +{ + "gate_owner": "morph74-acquire-settle", + "finished_at": "2026-09-23T21:19:12.197914+00:00", + "status": "done", + "decision": "REJECT_VS_BEST", + "best_unbind_exact": 0.9820359281437125, + "fair": 0.9880239520958084, + "fair_val_n": 167, + "e2_pass": true, + "surface_ok": true, + "val_n": 167 +} diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/METHOD.md b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/METHOD.md new file mode 100644 index 00000000..90bd6d08 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/METHOD.md @@ -0,0 +1,5 @@ +# morph74 acquire-settle — method + +**Authority:** operator 2026-09-23 SoT clean + acquire civilian; continue through gate. + +ONE knob vs morph73: acquire-settle force expand after SoT scaffolding clean — settle `to the moon` + `elo hell` INFERRED→OBSERVED (METHOD morph43) → force **217→221** / hard **258→262** (`force_added=4` dual-scheme). Warm morph65 + `HYPERLEX_INIT_EXPAND_VOCAB=1`. UPSAMPLE=10 / SECOND_SLOT=2 / LAST=8 held. SAVE_BEST. mem 0.3 exclusive. 40ep / 2e-5 / batch 8. diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/REJECT_VS_BEST.md b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/REJECT_VS_BEST.md new file mode 100644 index 00000000..ab89696c --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/REJECT_VS_BEST.md @@ -0,0 +1,3 @@ +# morph74 REJECT + +best 0.9820359281437125 vs fair 0.9880239520958084 (n=167, decision REJECT_VS_BEST). BEST stays morph65. diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/RESIDUAL_LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/RESIDUAL_LABEL_COUNTS.json new file mode 100644 index 00000000..efc0efaf --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/RESIDUAL_LABEL_COUNTS.json @@ -0,0 +1,18 @@ +{ + "n": 3, + "AUTHORIZE": 0, + "ABSTAIN": 3, + "by_decision": { + "ABSTAIN": 3 + }, + "by_why": { + "abstain_chrome_url_or_case_only": 1, + "abstain_scaffolding_wiki_etym": 2 + }, + "by_scheme": { + "positional": 2, + "type_slot": 1 + }, + "as_of": "2026-09-23T21:26:02.288561+00:00", + "authorization": "operator continue 2026-09-23; morph74 REJECT residual METHOD morph43 label" +} diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/RESIDUAL_LABEL_METHOD.md b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/RESIDUAL_LABEL_METHOD.md new file mode 100644 index 00000000..3774c67d --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/RESIDUAL_LABEL_METHOD.md @@ -0,0 +1,9 @@ +# morph74 residual METHOD morph43 + +**Authority:** operator continue 2026-09-23; morph74 REJECT residual METHOD morph43 label + +n=3. AUTHORIZE=0 / ABSTAIN=3. +- 2× OBSERVED scaffolding chrome (`TOKEN:`/`SLOT:`/`MARKER:` alternative-form of bussin') — ABSTAIN +- 1× INFERRED URL/case chrome (`ATE THAT UP` + t.co) — ABSTAIN + +Do not burn force_added=0 / fair-miss identical recipe replay. BEST morph65 held. Upsample freeze remains 11+. No SECOND_SLOT=4. diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/e2-unbind-morph74.json b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/e2-unbind-morph74.json new file mode 100644 index 00000000..436d4805 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/e2-unbind-morph74.json @@ -0,0 +1,32 @@ +{ + "brier": null, + "device": "cuda", + "e2_pass": true, + "encoder_trainable_loaded": 48, + "encoder_trainable_present": 48, + "forecast_eligible": false, + "heads_loaded": true, + "model_dir": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph74", + "model_id": "hyperlex-encoder-modernbert-base-seed", + "model_swap": 1.0, + "n_test": 12, + "n_unbind_eval": 24, + "name_gate": false, + "note": "Trunk-forward unbind_exact + token/slot F1 from /home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph74/model.safetensors vs 004 probe_swap_min. Stub/digest leaves F1 null (no civilian filler lists). name_gate stays false. Applied 48 saved encoder trainable tensors.", + "probe_positional_swap": 1.0, + "probe_schema": "abraxas.recoverable_structure.probe.v0.1", + "probe_swap_min": 0.5, + "probe_type_slot_swap": 0.5, + "schema": "hyperlex.hyperlexical.eval_unbind.v0.1", + "stub_swap": 0.0, + "trunk": "answerdotai/ModernBERT-base", + "trunk_dir": "/home/morpheus/.hyperlex/models/trunks/ModernBERT-base", + "trunk_forward": true, + "trunk_loaded": true, + "unbind_exact": 1.0, + "unbind_slot_f1": 1.0, + "unbind_token_f1": 1.0, + "unbind_token_precision": 1.0, + "unbind_token_recall": 1.0, + "weight_file": "model.safetensors" +} diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/labeled_morph74_residuals.jsonl b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/labeled_morph74_residuals.jsonl new file mode 100644 index 00000000..d5b39211 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/labeled_morph74_residuals.jsonl @@ -0,0 +1,3 @@ +{"class": "INFERRED", "gold": ["ATE", "THAT", "UP", "https://t.co/BrGkT4bHdm"], "lineage": "brainrot-aura", "pred": ["ATE", "THAT", "up", "https://t.co/BrGkT4bHdm"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3"], "slot_n_gold": 4, "slot_tp": 3, "text": "ATE THAT UP https://t.co/BrGkT4bHdm", "themes": ["partial_slot_miss"], "token_n_gold": 4, "token_n_pred": 4, "token_tp": 3, "decision": "ABSTAIN", "why": "abstain_chrome_url_or_case_only", "authorization": "operator continue 2026-09-23; morph74 REJECT residual METHOD morph43 label"} +{"class": "OBSERVED", "gold": ["TOKEN:Alternative", "SLOT:form", "MARKER:of", "TOKEN:bussin'."], "lineage": "brainrot-aura", "pred": ["Alternative", "L", "of", "bussin"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3"], "slot_n_gold": 4, "slot_tp": 0, "text": "TOKEN:Alternative SLOT:form MARKER:of TOKEN:bussin'.", "themes": ["positional_head_filler_miss", "full_miss"], "token_n_gold": 4, "token_n_pred": 4, "token_tp": 0, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator continue 2026-09-23; morph74 REJECT residual METHOD morph43 label"} +{"class": "OBSERVED", "gold": ["TOKEN:Alternative", "SLOT:form", "MARKER:of", "TOKEN:bussin'."], "lineage": "brainrot-aura", "pred": ["Alternative", "L", "of", "bussin"], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN"], "slot_n_gold": 4, "slot_tp": 0, "text": "TOKEN:TOKEN:Alternative SLOT:SLOT:form MARKER:MARKER:of TOKEN:TOKEN:bussin'.", "themes": ["type_slot_token_miss", "full_miss"], "token_n_gold": 4, "token_n_pred": 4, "token_tp": 0, "decision": "ABSTAIN", "why": "abstain_scaffolding_wiki_etym", "authorization": "operator continue 2026-09-23; morph74 REJECT residual METHOD morph43 label"} diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/pin-no-promote.json b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/pin-no-promote.json new file mode 100644 index 00000000..9448df56 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/pin-no-promote.json @@ -0,0 +1,43 @@ +{ + "schema": "hyperlex.hyperlexical.best_pin.v0.1", + "decision": "REJECT_VS_BEST", + "seed": "seed-morph74", + "path": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph74", + "prior_best": "seed-morph65", + "prior_unbind_exact": 0.9880239520958084, + "fair_val_n": 167, + "best_unbind_exact": 0.9820359281437125, + "best_epoch": 15, + "val_best": { + "classify_acc": 0.7725490196078432, + "epoch": 15, + "n_classify_eval": 510, + "n_unbind_eval": 167, + "n_unbind_phase": 15374, + "unbind_exact": 0.9820359281437125, + "unbind_phase": "joint", + "unbind_phase_fallback_full_mix": false, + "unbind_slot_f1": 0.9778325123152709, + "unbind_token_f1": 0.9778325123152709, + "unbind_token_precision": 0.9778325123152709, + "unbind_token_recall": 0.9778325123152709 + }, + "val_n_train_receipt": 167, + "e2": { + "e2_pass": true, + "unbind_exact": 1.0, + "trunk_forward": true + }, + "delta": "SoT flip 2 AUTHORIZE INFERRED→OBSERVED; force/hard morph66 164/206 held; UPSAMPLE=8 SECOND_SLOT=2; warm morph65", + "unbind_residual_themes": { + "full_miss": 2, + "partial_slot_miss": 1, + "positional_head_filler_miss": 1, + "type_slot_token_miss": 1 + }, + "name_gate": false, + "pinned_at": "2026-09-23T21:19:12.196708+00:00", + "gate_owner": "morph74-acquire-settle", + "morph65_preserved": true, + "morph63_preserved": true +} diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/residual-morph74.jsonl b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/residual-morph74.jsonl new file mode 100644 index 00000000..9423559b --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/residual-morph74.jsonl @@ -0,0 +1,3 @@ +{"class": "INFERRED", "gold": ["ATE", "THAT", "UP", "https://t.co/BrGkT4bHdm"], "lineage": "brainrot-aura", "pred": ["ATE", "THAT", "up", "https://t.co/BrGkT4bHdm"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3"], "slot_n_gold": 4, "slot_tp": 3, "text": "ATE THAT UP https://t.co/BrGkT4bHdm", "themes": ["partial_slot_miss"], "token_n_gold": 4, "token_n_pred": 4, "token_tp": 3} +{"class": "OBSERVED", "gold": ["TOKEN:Alternative", "SLOT:form", "MARKER:of", "TOKEN:bussin'."], "lineage": "brainrot-aura", "pred": ["Alternative", "L", "of", "bussin"], "role_scheme": "positional", "roles": ["pos_0", "pos_1", "pos_2", "pos_3"], "slot_n_gold": 4, "slot_tp": 0, "text": "TOKEN:Alternative SLOT:form MARKER:of TOKEN:bussin'.", "themes": ["positional_head_filler_miss", "full_miss"], "token_n_gold": 4, "token_n_pred": 4, "token_tp": 0} +{"class": "OBSERVED", "gold": ["TOKEN:Alternative", "SLOT:form", "MARKER:of", "TOKEN:bussin'."], "lineage": "brainrot-aura", "pred": ["Alternative", "L", "of", "bussin"], "role_scheme": "type_slot", "roles": ["TOKEN", "SLOT", "MARKER", "TOKEN"], "slot_n_gold": 4, "slot_tp": 0, "text": "TOKEN:TOKEN:Alternative SLOT:SLOT:form MARKER:MARKER:of TOKEN:TOKEN:bussin'.", "themes": ["type_slot_token_miss", "full_miss"], "token_n_gold": 4, "token_n_pred": 4, "token_tp": 0} diff --git a/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/residual-morph74.summary.json b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/residual-morph74.summary.json new file mode 100644 index 00000000..83f8bfc9 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph74-acquire-settle-20260923/residual-morph74.summary.json @@ -0,0 +1,17 @@ +{ + "by_class": { + "INFERRED": 1, + "OBSERVED": 2 + }, + "by_scheme": { + "positional": 2, + "type_slot": 1 + }, + "n_residual": 3, + "themes": { + "full_miss": 2, + "partial_slot_miss": 1, + "positional_head_filler_miss": 1, + "type_slot_token_miss": 1 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/ACQUIRE_SETTLE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/ACQUIRE_SETTLE_SUMMARY.json new file mode 100644 index 00000000..4432a904 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/ACQUIRE_SETTLE_SUMMARY.json @@ -0,0 +1,27 @@ +{ + "auth": "operator 2026-09-23; go ahead next useful moves \u2014 fresh civilian acquire + METHOD morph43 settle outside emptied residual wall (morph76)", + "as_of": "2026-09-23T22:27:12.478976+00:00", + "authorize_n": 31, + "qualify_n": 2, + "settled_inferred_to_observed": [ + "highkey shawty" + ], + "already_observed": [ + "quiet quitting" + ], + "force_base": 220, + "force76": 224, + "force_added": 4, + "hard_base": 261, + "hard76": 265, + "hard_added": 4, + "added_force_texts": [ + "highkey shawty", + "TOKEN:highkey SLOT:shawty", + "quiet quitting", + "TOKEN:quiet SLOT:quitting" + ], + "force_path": "/home/morpheus/hlx/force_train_morph76_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph76.jsonl", + "one_knob": "fresh civilian acquire-settle force expand outside emptied residual wall" +} diff --git a/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/CANCELLED_FAIR_CEILING.json b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/CANCELLED_FAIR_CEILING.json new file mode 100644 index 00000000..c3a1f169 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/CANCELLED_FAIR_CEILING.json @@ -0,0 +1,21 @@ +{ + "status": "CANCELLED_FAIR_CEILING", + "as_of": "2026-09-23T22:29:32.953109+00:00", + "auth": "operator 2026-09-23 go ahead next useful moves; fair ceiling after acquire-settle", + "container": "hlx-train-morph76-1790202540", + "fair_exact": 1.0, + "fair_n": 164, + "force_added": 4, + "hard_added": 4, + "settled": [ + "highkey shawty" + ], + "force_keys_added": [ + "highkey shawty", + "TOKEN:highkey SLOT:shawty", + "quiet quitting", + "TOKEN:quiet SLOT:quitting" + ], + "reason": "Fair morph65 on morph76 force surface is already 1.0 n=164; cannot satisfy strictly-greater promote gate. Stopped before burn. SoT settle kept (highkey shawty OBSERVED + quiet quitting force keys).", + "note": "New atoms were train-split so val n unchanged; force keys 220\u2192224 still force_added=4 but gate ceiling blocks train." +} diff --git a/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/LABEL_COUNTS.json new file mode 100644 index 00000000..f15b756e --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/LABEL_COUNTS.json @@ -0,0 +1,43 @@ +{ + "n": 31, + "AUTHORIZE": 31, + "ABSTAIN": 0, + "by_why": { + "positional_text_split_match": 31 + }, + "authorize_texts": [ + "Locked In", + "It's giving", + "NPC behavior", + "Non NPC Behavior", + "ate that up", + "sigma grindset", + "Ohio final boss", + "exit liquidity farmer", + "exit liquidity", + "bag holder", + "Merals Bagholder", + "APE IN", + "Ape in blind", + "Clock in Ape out", + "ser please", + "Send It", + "skill issue", + "GiT GuD", + "one trick", + "One Trick Pony", + "Mentally hard stuck", + "hard stuck", + "No Shot", + "highkey shawty", + "Fr fr", + "fr fr", + "fr fr ong", + "fr fr ong", + "Quiet quitting", + "Circle back", + "Touch Base" + ], + "authorization": "operator 2026-09-23; go ahead next useful moves \u2014 fresh civilian acquire + METHOD morph43 settle outside emptied residual wall (morph76)", + "as_of": "2026-09-23T22:25:21.917267+00:00" +} diff --git a/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/PROMOTE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/PROMOTE_SUMMARY.json new file mode 100644 index 00000000..410f37e2 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/PROMOTE_SUMMARY.json @@ -0,0 +1,52 @@ +{ + "auth": "operator 2026-09-23; go ahead next useful moves \u2014 morph76 acquire-settle highkey shawty + quiet quitting (Jev settle_high_conf)", + "one_knob": "fresh civilian acquire-settle force expand (highkey shawty + quiet quitting) outside emptied residual wall", + "force_base": 220, + "force_new": 224, + "force_added": 4, + "hard_base": 261, + "hard_new": 265, + "hard_added": 4, + "force_path": "/home/morpheus/hlx/force_train_morph76_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph76.jsonl", + "warm": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "init_from": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "init_expand_vocab": true, + "upsample": 10, + "second_slot": 2, + "atoms": [ + "highkey shawty", + "quiet quitting" + ], + "jev_settle": "settle_high_conf", + "settle": { + "auth": "operator 2026-09-23; go ahead next useful moves \u2014 fresh civilian acquire + METHOD morph43 settle outside emptied residual wall (morph76)", + "as_of": "2026-09-23T22:27:12.478976+00:00", + "authorize_n": 31, + "qualify_n": 2, + "settled_inferred_to_observed": [ + "highkey shawty" + ], + "already_observed": [ + "quiet quitting" + ], + "force_base": 220, + "force76": 224, + "force_added": 4, + "hard_base": 261, + "hard76": 265, + "hard_added": 4, + "added_force_texts": [ + "highkey shawty", + "TOKEN:highkey SLOT:shawty", + "quiet quitting", + "TOKEN:quiet SLOT:quitting" + ], + "force_path": "/home/morpheus/hlx/force_train_morph76_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph76.jsonl", + "one_knob": "fresh civilian acquire-settle force expand outside emptied residual wall" + }, + "as_of": "2026-09-23T22:28:34.262650+00:00", + "fair_exact": 1.0, + "fair_n": 164 +} diff --git a/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/fair-eval-morph65-morph76.json b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/fair-eval-morph65-morph76.json new file mode 100644 index 00000000..91e44f92 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph76-acquire-settle-20260923/fair-eval-morph65-morph76.json @@ -0,0 +1,31 @@ +{ + "schema": "hyperlex.fair_eval_same_surface.v0.1", + "as_of": "2026-09-23T22:28:59.595590+00:00", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "seed": "seed-morph65", + "force_train_path": "/home/morpheus/hlx/force_train_morph76_expanded.jsonl", + "force_stats": { + "unbind_force_train_path": "force_train_morph76_expanded.jsonl", + "n_unbind_force_train": 192, + "n_unbind_force_train_keys": 224, + "n_unbind_val_after_force_train": 164 + }, + "n_hard_atoms": 265, + "unbind_exact": 1.0, + "n_scored": 164, + "n_correct_est": 164, + "scored": { + "unbind_exact": 1.0, + "n_unbind_eval": 164, + "unbind_token_f1": 1.0, + "unbind_token_precision": 1.0, + "unbind_token_recall": 1.0, + "unbind_slot_f1": 1.0 + }, + "knob": "fresh civilian acquire-settle highkey shawty + quiet quitting", + "prior_fair_morph65_n171": 0.9649122807017544, + "promote": {}, + "note": "Fair morph65 BEST on morph76 force surface (SoT clean + to_the_moon/elo_hell). Gate morph76 best > this fair + E2 1.0.", + "fair_exact": 1.0, + "fair_n": 164 +} diff --git a/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/ACQUIRE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/ACQUIRE_SUMMARY.json new file mode 100644 index 00000000..de9a9119 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/ACQUIRE_SUMMARY.json @@ -0,0 +1,52 @@ +{ + "as_of": "2026-09-23T22:34:55.466094+00:00", + "auth": "operator continue 2026-09-23; val-split acquire + METHOD morph43 label HOLD after morph76 fair ceiling (morph77 prep)", + "split_policy": "force_val", + "queries": 31, + "candidate_atoms": 31, + "by_lineage": { + "brainrot-aura": 9, + "crypto-degen": 9, + "gaming-meta": 5, + "kinship-address": 7, + "workplace-corp": 1 + }, + "by_split": { + "val": 31 + }, + "samples": [ + "fanum tax", + "mid af", + "Its so over", + "It's So Over", + "We're So Back", + "were so back", + "Aura Points", + "aura point", + "negative aura", + "Have Fun Staying Poor", + "probably nothing", + "wen moon wen lambo", + "wen lambo", + "Few Understand", + "Few Understand", + "Few Understand This", + "Very Few Understand This", + "up only", + "Throw the Game", + "Boosted Animal", + "clutch up", + "mid diff", + "diff mid", + "no cap fr", + "fr fr no cap", + "On God", + "say less", + "bet that", + "bet that up", + "Real Talk", + "low bandwidth" + ], + "hold": true, + "note": "label HOLD — no settle/train until explicit authorize" +} diff --git a/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/HOLD_AUTHORIZE_CARD.json b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/HOLD_AUTHORIZE_CARD.json new file mode 100644 index 00000000..08db1649 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/HOLD_AUTHORIZE_CARD.json @@ -0,0 +1,89 @@ +{ + "as_of": "2026-09-23T22:36:00.116138+00:00", + "auth": "operator continue 2026-09-23; val-split acquire + METHOD morph43 label HOLD", + "jev_meta": { + "choice": "val_acquire_label_hold", + "confidence": 0.62 + }, + "jev_qualify_summary": { + "defer_quality": 17, + "force_expand_safe": 13 + }, + "jev_card_choice": { + "choice": "card_high_conf_new", + "confidence": 0.48 + }, + "hold": true, + "split_policy": "force_val", + "authorize_card_phrases": [ + "we're so back", + "clutch up", + "bet that up", + "real talk" + ], + "authorize_card_norms": [ + "we're so back", + "clutch up", + "bet that up", + "real talk" + ], + "authorize_card": [ + { + "phrase": "we're so back", + "norm": "we're so back", + "choice": "force_expand_safe", + "confidence": 0.44, + "probabilities": { + "force_expand_safe": 0.63, + "defer_quality": 0.31, + "already_variant": 0.06 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "clutch up", + "norm": "clutch up", + "choice": "force_expand_safe", + "confidence": 0.41, + "probabilities": { + "force_expand_safe": 0.61, + "defer_quality": 0.33, + "already_variant": 0.06 + }, + "already_observed": false, + "lineage": "gaming-meta" + }, + { + "phrase": "bet that up", + "norm": "bet that up", + "choice": "force_expand_safe", + "confidence": 0.43, + "probabilities": { + "force_expand_safe": 0.61, + "defer_quality": 0.35, + "already_variant": 0.04 + }, + "already_observed": false, + "lineage": "kinship-address" + }, + { + "phrase": "real talk", + "norm": "real talk", + "choice": "force_expand_safe", + "confidence": 0.46, + "probabilities": { + "force_expand_safe": 0.64, + "defer_quality": 0.31, + "already_variant": 0.05 + }, + "already_observed": false, + "lineage": "kinship-address" + } + ], + "note": "HOLD — no settle/force/train until explicit authorize morph77 / authorize val-settle", + "prior_fair": { + "exact": 1.0, + "n": 164 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/LABEL_COUNTS.json new file mode 100644 index 00000000..06feef22 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/LABEL_COUNTS.json @@ -0,0 +1,77 @@ +{ + "n": 31, + "AUTHORIZE": 31, + "ABSTAIN": 0, + "by_why": { + "positional_text_split_match": 31 + }, + "authorize_texts": [ + "fanum tax", + "mid af", + "its so over", + "it's so over", + "we're so back", + "were so back", + "aura points", + "aura point", + "negative aura", + "have fun staying poor", + "probably nothing", + "wen moon wen lambo", + "wen lambo", + "few understand", + "few understand", + "few understand this", + "very few understand this", + "up only", + "throw the game", + "boosted animal", + "clutch up", + "mid diff", + "diff mid", + "no cap fr", + "fr fr no cap", + "on god", + "say less", + "bet that", + "bet that up", + "real talk", + "low bandwidth" + ], + "authorize_phrases_unique": [ + "aura point", + "aura points", + "bet that", + "bet that up", + "boosted animal", + "clutch up", + "diff mid", + "fanum tax", + "few understand", + "few understand this", + "fr fr no cap", + "have fun staying poor", + "it's so over", + "its so over", + "low bandwidth", + "mid af", + "mid diff", + "negative aura", + "no cap fr", + "on god", + "probably nothing", + "real talk", + "say less", + "throw the game", + "up only", + "very few understand this", + "we're so back", + "wen lambo", + "wen moon wen lambo", + "were so back" + ], + "all_split_val": true, + "authorization": "operator continue 2026-09-23; val-split acquire + METHOD morph43 label HOLD after morph76 fair ceiling (morph77 prep)", + "as_of": "2026-09-23T22:34:55.475908+00:00", + "hold": true +} diff --git a/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/METHOD.md b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/METHOD.md new file mode 100644 index 00000000..49b34cac --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph77-val-acquire-label-hold-20260923/METHOD.md @@ -0,0 +1,5 @@ +# morph77 val-split acquire METHOD morph43 — HOLD + +**Authority:** operator continue 2026-09-23; val-split acquire + METHOD morph43 label HOLD after morph76 fair ceiling (morph77 prep) + +All candidates `split=val`. AUTHORIZE = positional_text_split_match. No settle / no force expand / no train until explicit operator authorize. diff --git a/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/ACQUIRE_SETTLE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/ACQUIRE_SETTLE_SUMMARY.json new file mode 100644 index 00000000..10dc2703 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/ACQUIRE_SETTLE_SUMMARY.json @@ -0,0 +1,37 @@ +{ + "auth": "operator 2026-09-23 authorize val-settle \u2014 morph77 we're so back / clutch up / bet that up / real talk (split=val)", + "as_of": "2026-09-23T22:42:55.447298+00:00", + "qualify": [ + "we're so back", + "clutch up", + "bet that up", + "real talk" + ], + "settled_inferred_to_observed": [ + "we're so back", + "clutch up", + "bet that up", + "real talk" + ], + "already_observed": [], + "force_base": 224, + "force77": 232, + "force_added": 8, + "hard_base": 265, + "hard77": 273, + "hard_added": 8, + "added_force_texts": [ + "we're so back", + "TOKEN:we're SLOT:so MARKER:back", + "clutch up", + "TOKEN:clutch SLOT:up", + "bet that up", + "TOKEN:bet SLOT:that MARKER:up", + "real talk", + "TOKEN:real SLOT:talk" + ], + "split_policy": "force_val", + "force_path": "/home/morpheus/hlx/force_train_morph77_expanded.jsonl", + "hard_path": "/home/morpheus/hlx/hard_atoms_train_morph77.jsonl", + "one_knob": "val-settle force expand (4 phrases) after morph76 ceiling" +} diff --git a/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/CANCELLED_FAIR_CEILING.json b/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/CANCELLED_FAIR_CEILING.json new file mode 100644 index 00000000..3cf279b1 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/CANCELLED_FAIR_CEILING.json @@ -0,0 +1,16 @@ +{ + "status": "CANCELLED_FAIR_CEILING", + "as_of": "2026-09-23T22:43:22.224278+00:00", + "auth": "operator 2026-09-23 authorize val-settle \u2014 morph77 we're so back / clutch up / bet that up / real talk (split=val)", + "fair_exact": 1.0, + "fair_n": 164, + "force_added": 8, + "reason": "Fair still 1.0 with n<=164 after val-settle; cannot strictly beat.", + "settle_kept": true, + "diagnosis": "fair gate applies force path; force keys leave val so val-split cannot grow fair n", + "jev_next": { + "choice": "stop_force_climb", + "confidence": 0.2 + }, + "updated_as_of": "2026-09-23T22:46:09.683292+00:00" +} diff --git a/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/fair-eval-morph65-morph77.json b/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/fair-eval-morph65-morph77.json new file mode 100644 index 00000000..195eceb1 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph77-val-settle-20260923/fair-eval-morph65-morph77.json @@ -0,0 +1,31 @@ +{ + "schema": "hyperlex.fair_eval_same_surface.v0.1", + "as_of": "2026-09-23T22:43:21.176822+00:00", + "model": "/home/morpheus/.hyperlex/models/hyperlex-encoder-modernbert-base-seed-morph65", + "seed": "seed-morph65", + "force_train_path": "/home/morpheus/hlx/force_train_morph77_expanded.jsonl", + "force_stats": { + "unbind_force_train_path": "force_train_morph77_expanded.jsonl", + "n_unbind_force_train": 193, + "n_unbind_force_train_keys": 232, + "n_unbind_val_after_force_train": 164 + }, + "n_hard_atoms": 273, + "unbind_exact": 1.0, + "n_scored": 164, + "n_correct_est": 164, + "scored": { + "unbind_exact": 1.0, + "n_unbind_eval": 164, + "unbind_token_f1": 1.0, + "unbind_token_precision": 1.0, + "unbind_token_recall": 1.0, + "unbind_slot_f1": 1.0 + }, + "knob": "fresh civilian acquire-settle highkey shawty + quiet quitting", + "prior_fair_morph65_n171": 0.9649122807017544, + "promote": {}, + "note": "Fair morph65 BEST on morph77 force surface (SoT clean + to_the_moon/elo_hell). Gate morph77 best > this fair + E2 1.0.", + "fair_exact": 1.0, + "fair_n": 164 +} diff --git a/specs/007-hyperlexical-model/receipts/morph78-authorize-val-settle-empty-20260923/CANCELLED_EMPTY_GOLD.json b/specs/007-hyperlexical-model/receipts/morph78-authorize-val-settle-empty-20260923/CANCELLED_EMPTY_GOLD.json new file mode 100644 index 00000000..6e3e6044 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-authorize-val-settle-empty-20260923/CANCELLED_EMPTY_GOLD.json @@ -0,0 +1,42 @@ +{ + "schema": "hyperlex.cancel_empty_gold.v0.1", + "status": "CANCELLED_EMPTY_GOLD", + "as_of": "2026-09-23T23:38:19.380050+00:00", + "auth": "operator 2026-09-23 authorize val-settle", + "gate": "soft_ceiling_tiebreak", + "reason": "HOLD authorize_card_phrases empty on morph78 acquire + live residual reprobe; no invented OBSERVED; Jev cancel_empty_gold 0.96", + "hold_cards_checked": [ + "p1-spark-morph78-fresh-acquire-label-hold-20260923", + "p1-spark-morph65-broad-reprobe-soft-ceiling-20260923" + ], + "authorize_card_phrases": [], + "jev": { + "choice": "cancel_empty_gold", + "confidence": 0.96, + "probabilities": { + "cancel_empty_gold": 0.97, + "override_morph78_method_auth": 0.03, + "settle_morph77_leftover_safe": 0.0, + "override_reprobe_auth": 0.0 + }, + "runner_up": "override_morph78_method_auth", + "model": "jev-1.13.0", + "latency_ms": 458, + "usage": { + "input_tokens": 540, + "output_tokens": 67 + } + }, + "force77": 232, + "hard77": 273, + "prior_best": "seed-morph65", + "live_broad_prior": { + "exact": 0.88671875, + "n": 256 + }, + "not_done": [ + "SoT settle", + "force/hard expand", + "morph78 train" + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph78-authorize-val-settle-empty-20260923/jev_authorize_val_settle_empty.json b/specs/007-hyperlexical-model/receipts/morph78-authorize-val-settle-empty-20260923/jev_authorize_val_settle_empty.json new file mode 100644 index 00000000..61f6247f --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-authorize-val-settle-empty-20260923/jev_authorize_val_settle_empty.json @@ -0,0 +1,17 @@ +{ + "choice": "cancel_empty_gold", + "confidence": 0.96, + "probabilities": { + "cancel_empty_gold": 0.97, + "override_morph78_method_auth": 0.03, + "settle_morph77_leftover_safe": 0.0, + "override_reprobe_auth": 0.0 + }, + "runner_up": "override_morph78_method_auth", + "model": "jev-1.13.0", + "latency_ms": 458, + "usage": { + "input_tokens": 540, + "output_tokens": 67 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/ACQUIRE_SUMMARY.json b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/ACQUIRE_SUMMARY.json new file mode 100644 index 00000000..55639ab6 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/ACQUIRE_SUMMARY.json @@ -0,0 +1,61 @@ +{ + "as_of": "2026-09-23T23:10:04.698996+00:00", + "auth": "operator continue 2026-09-23; soft_ceiling ARMED \u2014 morph78 fresh acquire + METHOD morph43 label HOLD", + "gate": "soft_ceiling_tiebreak", + "split_policy": "force_val", + "queries": 38, + "candidate_atoms": 37, + "already_in_sot": 10, + "new_to_sot": 27, + "by_lineage": { + "brainrot-aura": 16, + "crypto-degen": 10, + "gaming-meta": 4, + "kinship-address": 2, + "workplace-corp": 5 + }, + "by_split": { + "val": 37 + }, + "samples": [ + "Hits different", + "goes hard", + "Living Rent Free", + "Rent Free", + "Main Character Energy", + "She understood the assignment", + "understood the assignment", + "Understand the assignment", + "no thoughts head empty", + "Caught in 4k", + "ngl fr", + "Slay queen", + "hot take", + "Hot take artist", + "cold take", + "freezing cold take", + "Cope Harder", + "Mald seethe cope harder", + "Cope N Cry Harder", + "Take the L", + "Big L", + "L Bozo plus ratio", + "L plus ratio", + "ratio plus L", + "Based and Redpilled", + "Based and red pilled", + "jungle diff", + "diff jungle", + "throwing hard", + "Smurf Account", + "front on me", + "on me fr", + "Let's take this offline", + "take offline", + "Take it off-line", + "action item", + "action items" + ], + "hold": true, + "note": "label HOLD \u2014 no settle/train until explicit authorize" +} diff --git a/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/LABEL_COUNTS.json b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/LABEL_COUNTS.json new file mode 100644 index 00000000..f19d51bd --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/LABEL_COUNTS.json @@ -0,0 +1,91 @@ +{ + "n": 37, + "AUTHORIZE": 37, + "ABSTAIN": 0, + "by_why": { + "positional_text_split_match": 37 + }, + "authorize_texts": [ + "hits different", + "goes hard", + "living rent free", + "rent free", + "main character energy", + "she understood the assignment", + "understood the assignment", + "understand the assignment", + "no thoughts head empty", + "caught in 4k", + "ngl fr", + "slay queen", + "hot take", + "hot take artist", + "cold take", + "freezing cold take", + "cope harder", + "mald seethe cope harder", + "cope n cry harder", + "take the l", + "big l", + "l bozo plus ratio", + "l plus ratio", + "ratio plus l", + "based and redpilled", + "based and red pilled", + "jungle diff", + "diff jungle", + "throwing hard", + "smurf account", + "front on me", + "on me fr", + "let's take this offline", + "take offline", + "take it off-line", + "action item", + "action items" + ], + "authorize_phrases_unique": [ + "action item", + "action items", + "based and red pilled", + "based and redpilled", + "big l", + "caught in 4k", + "cold take", + "cope harder", + "cope n cry harder", + "diff jungle", + "freezing cold take", + "front on me", + "goes hard", + "hits different", + "hot take", + "hot take artist", + "jungle diff", + "l bozo plus ratio", + "l plus ratio", + "let's take this offline", + "living rent free", + "main character energy", + "mald seethe cope harder", + "ngl fr", + "no thoughts head empty", + "on me fr", + "ratio plus l", + "rent free", + "she understood the assignment", + "slay queen", + "smurf account", + "take it off-line", + "take offline", + "take the l", + "throwing hard", + "understand the assignment", + "understood the assignment" + ], + "all_split_val": true, + "authorization": "operator continue 2026-09-23; soft_ceiling ARMED \u2014 morph78 fresh acquire + METHOD morph43 label HOLD", + "as_of": "2026-09-23T23:10:04.699608+00:00", + "hold": true, + "gate": "soft_ceiling_tiebreak" +} diff --git a/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/METHOD.md b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/METHOD.md new file mode 100644 index 00000000..d3294bb1 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/METHOD.md @@ -0,0 +1,5 @@ +# morph78 fresh acquire METHOD morph43 — HOLD (soft_ceiling) + +**Authority:** operator continue 2026-09-23; soft_ceiling ARMED — morph78 fresh acquire + METHOD morph43 label HOLD + +All candidates `split=val`. AUTHORIZE = positional_text_split_match. No settle / no force expand / no train until explicit operator authorize (`authorize morph78` / `authorize val-settle`). diff --git a/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/jev_morph78_empty_next.json b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/jev_morph78_empty_next.json new file mode 100644 index 00000000..d085ca03 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/jev_morph78_empty_next.json @@ -0,0 +1,17 @@ +{ + "choice": "land_hold_empty", + "confidence": 0.51, + "probabilities": { + "land_hold_empty": 0.64, + "revisit_morph77_safe_new": 0.29, + "retry_acquire_fresh": 0.05, + "override_top_fes": 0.02 + }, + "runner_up": "revisit_morph77_safe_new", + "model": "jev-1.13.0", + "latency_ms": 394, + "usage": { + "input_tokens": 491, + "output_tokens": 64 + } +} diff --git a/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/jev_morph78_qualify_parsed.json b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/jev_morph78_qualify_parsed.json new file mode 100644 index 00000000..8b3e6f9d --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/jev_morph78_qualify_parsed.json @@ -0,0 +1,564 @@ +{ + "summary": { + "defer_quality": 35, + "already_variant": 2 + }, + "safe": [], + "defer": [ + { + "phrase": "hits different", + "norm": "hits different", + "choice": "defer_quality", + "confidence": 0.38, + "probabilities": { + "defer_quality": 0.59, + "already_variant": 0.25, + "force_expand_safe": 0.16 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "goes hard", + "norm": "goes hard", + "choice": "defer_quality", + "confidence": 0.49, + "probabilities": { + "defer_quality": 0.66, + "force_expand_safe": 0.19, + "already_variant": 0.15 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "living rent free", + "norm": "living rent free", + "choice": "defer_quality", + "confidence": 0.48, + "probabilities": { + "defer_quality": 0.65, + "force_expand_safe": 0.22, + "already_variant": 0.13 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "rent free", + "norm": "rent free", + "choice": "defer_quality", + "confidence": 0.5, + "probabilities": { + "defer_quality": 0.67, + "force_expand_safe": 0.18, + "already_variant": 0.15 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "she understood the assignment", + "norm": "she understood the assignment", + "choice": "defer_quality", + "confidence": 0.41, + "probabilities": { + "defer_quality": 0.61, + "force_expand_safe": 0.21, + "already_variant": 0.18 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "understood the assignment", + "norm": "understood the assignment", + "choice": "defer_quality", + "confidence": 0.39, + "probabilities": { + "defer_quality": 0.6, + "already_variant": 0.22, + "force_expand_safe": 0.18 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "understand the assignment", + "norm": "understand the assignment", + "choice": "defer_quality", + "confidence": 0.19, + "probabilities": { + "defer_quality": 0.46, + "already_variant": 0.34, + "force_expand_safe": 0.2 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "caught in 4k", + "norm": "caught in 4k", + "choice": "defer_quality", + "confidence": 0.63, + "probabilities": { + "defer_quality": 0.75, + "force_expand_safe": 0.13, + "already_variant": 0.12 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "ngl fr", + "norm": "ngl fr", + "choice": "defer_quality", + "confidence": 0.66, + "probabilities": { + "defer_quality": 0.78, + "already_variant": 0.12, + "force_expand_safe": 0.1 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "slay queen", + "norm": "slay queen", + "choice": "defer_quality", + "confidence": 0.51, + "probabilities": { + "defer_quality": 0.68, + "force_expand_safe": 0.18, + "already_variant": 0.14 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "hot take", + "norm": "hot take", + "choice": "defer_quality", + "confidence": 0.45, + "probabilities": { + "defer_quality": 0.63, + "already_variant": 0.27, + "force_expand_safe": 0.1 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "hot take artist", + "norm": "hot take artist", + "choice": "defer_quality", + "confidence": 0.61, + "probabilities": { + "defer_quality": 0.75, + "already_variant": 0.14, + "force_expand_safe": 0.11 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "cold take", + "norm": "cold take", + "choice": "defer_quality", + "confidence": 0.54, + "probabilities": { + "defer_quality": 0.69, + "already_variant": 0.19, + "force_expand_safe": 0.12 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "freezing cold take", + "norm": "freezing cold take", + "choice": "defer_quality", + "confidence": 0.58, + "probabilities": { + "defer_quality": 0.72, + "force_expand_safe": 0.2, + "already_variant": 0.08 + }, + "already_observed": false, + "lineage": "brainrot-aura" + }, + { + "phrase": "cope harder", + "norm": "cope harder", + "choice": "defer_quality", + "confidence": 0.49, + "probabilities": { + "defer_quality": 0.66, + "force_expand_safe": 0.22, + "already_variant": 0.12 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "mald seethe cope harder", + "norm": "mald seethe cope harder", + "choice": "defer_quality", + "confidence": 0.45, + "probabilities": { + "defer_quality": 0.64, + "already_variant": 0.19, + "force_expand_safe": 0.17 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "cope n cry harder", + "norm": "cope n cry harder", + "choice": "defer_quality", + "confidence": 0.62, + "probabilities": { + "defer_quality": 0.74, + "force_expand_safe": 0.19, + "already_variant": 0.07 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "take the l", + "norm": "take the l", + "choice": "defer_quality", + "confidence": 0.46, + "probabilities": { + "defer_quality": 0.65, + "force_expand_safe": 0.2, + "already_variant": 0.15 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "big l", + "norm": "big l", + "choice": "defer_quality", + "confidence": 0.65, + "probabilities": { + "defer_quality": 0.77, + "already_variant": 0.13, + "force_expand_safe": 0.1 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "l bozo plus ratio", + "norm": "l bozo plus ratio", + "choice": "defer_quality", + "confidence": 0.65, + "probabilities": { + "defer_quality": 0.77, + "already_variant": 0.13, + "force_expand_safe": 0.1 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "l plus ratio", + "norm": "l plus ratio", + "choice": "defer_quality", + "confidence": 0.52, + "probabilities": { + "defer_quality": 0.68, + "already_variant": 0.17, + "force_expand_safe": 0.15 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "ratio plus l", + "norm": "ratio plus l", + "choice": "defer_quality", + "confidence": 0.6, + "probabilities": { + "defer_quality": 0.73, + "already_variant": 0.14, + "force_expand_safe": 0.13 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "based and redpilled", + "norm": "based and redpilled", + "choice": "defer_quality", + "confidence": 0.41, + "probabilities": { + "defer_quality": 0.6, + "already_variant": 0.26, + "force_expand_safe": 0.14 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "based and red pilled", + "norm": "based and red pilled", + "choice": "defer_quality", + "confidence": 0.48, + "probabilities": { + "defer_quality": 0.65, + "already_variant": 0.22, + "force_expand_safe": 0.13 + }, + "already_observed": false, + "lineage": "crypto-degen" + }, + { + "phrase": "jungle diff", + "norm": "jungle diff", + "choice": "defer_quality", + "confidence": 0.66, + "probabilities": { + "defer_quality": 0.77, + "already_variant": 0.12, + "force_expand_safe": 0.11 + }, + "already_observed": false, + "lineage": "gaming-meta" + }, + { + "phrase": "diff jungle", + "norm": "diff jungle", + "choice": "defer_quality", + "confidence": 0.54, + "probabilities": { + "defer_quality": 0.7, + "already_variant": 0.17, + "force_expand_safe": 0.13 + }, + "already_observed": false, + "lineage": "gaming-meta" + }, + { + "phrase": "throwing hard", + "norm": "throwing hard", + "choice": "defer_quality", + "confidence": 0.59, + "probabilities": { + "defer_quality": 0.73, + "force_expand_safe": 0.15, + "already_variant": 0.12 + }, + "already_observed": false, + "lineage": "gaming-meta" + }, + { + "phrase": "smurf account", + "norm": "smurf account", + "choice": "defer_quality", + "confidence": 0.31, + "probabilities": { + "defer_quality": 0.53, + "force_expand_safe": 0.29, + "already_variant": 0.18 + }, + "already_observed": false, + "lineage": "gaming-meta" + }, + { + "phrase": "front on me", + "norm": "front on me", + "choice": "defer_quality", + "confidence": 0.3, + "probabilities": { + "defer_quality": 0.54, + "force_expand_safe": 0.28, + "already_variant": 0.18 + }, + "already_observed": false, + "lineage": "kinship-address" + }, + { + "phrase": "on me fr", + "norm": "on me fr", + "choice": "defer_quality", + "confidence": 0.56, + "probabilities": { + "defer_quality": 0.71, + "force_expand_safe": 0.16, + "already_variant": 0.13 + }, + "already_observed": false, + "lineage": "kinship-address" + }, + { + "phrase": "let's take this offline", + "norm": "let's take this offline", + "choice": "defer_quality", + "confidence": 0.47, + "probabilities": { + "defer_quality": 0.65, + "already_variant": 0.18, + "force_expand_safe": 0.17 + }, + "already_observed": false, + "lineage": "workplace-corp" + }, + { + "phrase": "take offline", + "norm": "take offline", + "choice": "defer_quality", + "confidence": 0.59, + "probabilities": { + "defer_quality": 0.73, + "force_expand_safe": 0.14, + "already_variant": 0.13 + }, + "already_observed": false, + "lineage": "workplace-corp" + }, + { + "phrase": "take it off-line", + "norm": "take it off-line", + "choice": "defer_quality", + "confidence": 0.44, + "probabilities": { + "defer_quality": 0.63, + "already_variant": 0.2, + "force_expand_safe": 0.17 + }, + "already_observed": false, + "lineage": "workplace-corp" + }, + { + "phrase": "action item", + "norm": "action item", + "choice": "defer_quality", + "confidence": 0.58, + "probabilities": { + "defer_quality": 0.73, + "already_variant": 0.14, + "force_expand_safe": 0.13 + }, + "already_observed": false, + "lineage": "workplace-corp" + }, + { + "phrase": "action items", + "norm": "action items", + "choice": "defer_quality", + "confidence": 0.58, + "probabilities": { + "defer_quality": 0.72, + "force_expand_safe": 0.15, + "already_variant": 0.13 + }, + "already_observed": false, + "lineage": "workplace-corp" + } + ], + "variant": [ + { + "phrase": "main character energy", + "norm": "main character energy", + "choice": "already_variant", + "confidence": 0.37, + "probabilities": { + "already_variant": 0.58, + "defer_quality": 0.23, + "force_expand_safe": 0.19 + }, + "already_observed": true, + "lineage": "brainrot-aura" + }, + { + "phrase": "no thoughts head empty", + "norm": "no thoughts head empty", + "choice": "already_variant", + "confidence": 0.3, + "probabilities": { + "already_variant": 0.53, + "defer_quality": 0.32, + "force_expand_safe": 0.15 + }, + "already_observed": true, + "lineage": "brainrot-aura" + } + ], + "safe_new": [], + "safe_obs": [], + "card_high_conf_new": [], + "model": "jev-1.13.0", + "usage": { + "input_tokens": 18944, + "output_tokens": 1663, + "calls": 37, + "cached_calls": 0 + }, + "top_fes_probs": [ + { + "norm": "smurf account", + "fes": 0.29, + "choice": "defer_quality", + "conf": 0.31 + }, + { + "norm": "front on me", + "fes": 0.28, + "choice": "defer_quality", + "conf": 0.3 + }, + { + "norm": "living rent free", + "fes": 0.22, + "choice": "defer_quality", + "conf": 0.48 + }, + { + "norm": "cope harder", + "fes": 0.22, + "choice": "defer_quality", + "conf": 0.49 + }, + { + "norm": "she understood the assignment", + "fes": 0.21, + "choice": "defer_quality", + "conf": 0.41 + }, + { + "norm": "understand the assignment", + "fes": 0.2, + "choice": "defer_quality", + "conf": 0.19 + }, + { + "norm": "freezing cold take", + "fes": 0.2, + "choice": "defer_quality", + "conf": 0.58 + }, + { + "norm": "take the l", + "fes": 0.2, + "choice": "defer_quality", + "conf": 0.46 + }, + { + "norm": "goes hard", + "fes": 0.19, + "choice": "defer_quality", + "conf": 0.49 + }, + { + "norm": "main character energy", + "fes": 0.19, + "choice": "already_variant", + "conf": 0.37 + } + ] +} diff --git a/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/morph78_HOLD_AUTHORIZE_CARD.json b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/morph78_HOLD_AUTHORIZE_CARD.json new file mode 100644 index 00000000..711d33c8 --- /dev/null +++ b/specs/007-hyperlexical-model/receipts/morph78-fresh-acquire-label-hold-20260923/morph78_HOLD_AUTHORIZE_CARD.json @@ -0,0 +1,77 @@ +{ + "as_of": "2026-09-23T23:12:11.889140+00:00", + "auth": "operator continue 2026-09-23; soft_ceiling ARMED \u2014 morph78 fresh acquire + METHOD morph43 label HOLD", + "gate": "soft_ceiling_tiebreak", + "jev_meta": { + "choice": "hold_await_authorize", + "confidence": 0.99 + }, + "jev_empty_next": { + "choice": "land_hold_empty", + "confidence": 0.51, + "probabilities": { + "land_hold_empty": 0.64, + "revisit_morph77_safe_new": 0.29, + "retry_acquire_fresh": 0.05, + "override_top_fes": 0.02 + } + }, + "jev_qualify_summary": { + "defer_quality": 35, + "already_variant": 2 + }, + "jev_revisit77_summary": { + "defer_quality": 17, + "force_expand_safe": 5 + }, + "jev_revisit77_safe_new": [ + { + "phrase": "have fun staying poor", + "norm": "have fun staying poor", + "choice": "force_expand_safe", + "confidence": 0.25, + "probabilities": { + "force_expand_safe": 0.5, + "defer_quality": 0.43, + "already_variant": 0.07 + }, + "already_observed": false, + "lineage": "crypto-degen", + "prior_choice": "force_expand_safe" + }, + { + "phrase": "fr fr no cap", + "norm": "fr fr no cap", + "choice": "force_expand_safe", + "confidence": 0.22, + "probabilities": { + "force_expand_safe": 0.49, + "defer_quality": 0.42, + "already_variant": 0.09 + }, + "already_observed": false, + "lineage": "kinship-address", + "prior_choice": "force_expand_safe" + } + ], + "jev_card_choice": { + "choice": "land_hold_empty", + "threshold": 0.4, + "n": 0 + }, + "hold": true, + "split_policy": "force_val", + "authorize_card_phrases": [], + "authorize_card_norms": [], + "authorize_card": [], + "acquire_candidates": 37, + "note": "HOLD empty gold \u2014 Jev land_hold_empty. No settle/force/train. Explicit operator override naming phrases required, or new acquire direction.", + "prior_force_fair": { + "exact": 1.0, + "n": 164 + }, + "live_broad_prior": { + "exact": 0.88671875, + "n": 256 + } +} diff --git a/tests/shadow/test_hyperlexical_export.py b/tests/shadow/test_hyperlexical_export.py index 79a1da1c..a2dc3136 100644 --- a/tests/shadow/test_hyperlexical_export.py +++ b/tests/shadow/test_hyperlexical_export.py @@ -100,7 +100,7 @@ def test_no_third_scheme(): def test_reject_candidate_text(): - from hyperlexical.export import reject_candidate_text + from hyperlexical.export import reject_candidate_text, reject_wiki_scaffolding_text assert reject_candidate_text("") == "empty" assert reject_candidate_text("ab") == "len_le_2" @@ -114,6 +114,28 @@ def test_reject_candidate_text(): # still reject bare junk / ambiguous non-allowlisted shorts assert reject_candidate_text("a") == "len_le_2" assert reject_candidate_text("11") == "numeric" + # wiki / dictionary scaffolding — residual wall chrome + assert reject_candidate_text('(from to the moon) quotations ▼') == "wiki_quotations" + assert reject_candidate_text('^ "aura farming" on Google Trends.') == "wiki_trends" + assert reject_candidate_text("(neologism) Alternative form of brain rot.") == "wiki_alt_form" + assert reject_candidate_text("Alternative form of bussin'.") == "wiki_alt_form" + assert ( + reject_wiki_scaffolding_text( + "TOKEN:Alternative SLOT:form MARKER:of TOKEN:bussin'." + ) + == "wiki_alt_form" + ) + assert reject_candidate_text( + "1. (UK soccer slang) Alternative letter-case form of Gooner." + ) == "wiki_alt_form" + assert reject_candidate_text('Armenian: smurf pl (smurfik)') == "wiki_lang_gloss" + assert reject_candidate_text("synonym ▲quotations ▼ Synonym: tryhard") == "wiki_quotations" + assert reject_candidate_text('"Crash out etymology", The Idioms.') == "wiki_etymology" + # civilian slang atoms stay + assert reject_candidate_text("aura farming") is None + assert reject_candidate_text("to the moon") is None + assert reject_candidate_text("crash out") is None + assert reject_wiki_scaffolding_text("show ▼Declension of smurf") == "wiki_declension" def test_include_live_preserves_store_class(tmp_path): diff --git a/tests/shadow/test_hyperlexical_init_expand_vocab.py b/tests/shadow/test_hyperlexical_init_expand_vocab.py new file mode 100644 index 00000000..36ad8d88 --- /dev/null +++ b/tests/shadow/test_hyperlexical_init_expand_vocab.py @@ -0,0 +1,136 @@ +"""HYPERLEX_INIT_EXPAND_VOCAB warm-load remap.""" + +from __future__ import annotations + +import json +from pathlib import Path +import sys + +import pytest + +torch = pytest.importorskip("torch") +from torch import nn + +ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(ROOT / "scripts" / "shadow")) + +from hyperlexical.loop import warm_load_checkpoint + + +class _Enc: + """Minimal encoder stand-in for apply_encoder_trainable.""" + + def __init__(self): + self._sd = {"layers.20.weight": torch.zeros(2)} + + def state_dict(self): + return dict(self._sd) + + def load_state_dict(self, state, strict=True): + for k, v in state.items(): + if k in self._sd: + self._sd[k] = v + return type("R", (), {"missing_keys": [], "unexpected_keys": []})() + + def named_parameters(self): + return [] + + +def _write_heads_seed(tmp: Path, roles: list[str], fillers: list[str]): + hidden = 4 + classify = nn.Linear(hidden, 3) + role_head = nn.Linear(hidden, len(roles)) + filler_head = nn.Linear(hidden, len(fillers)) + with torch.no_grad(): + for i in range(len(roles)): + role_head.weight[i].fill_(10.0 + i) + role_head.bias[i].fill_(100.0 + i) + for i in range(len(fillers)): + filler_head.weight[i].fill_(20.0 + i) + filler_head.bias[i].fill_(200.0 + i) + blob = { + "classify": {k: v.detach().clone() for k, v in classify.state_dict().items()}, + "role_head": {k: v.detach().clone() for k, v in role_head.state_dict().items()}, + "filler_head": {k: v.detach().clone() for k, v in filler_head.state_dict().items()}, + "encoder": {}, + } + torch.save(blob, tmp / "heads.pt") + (tmp / "config.json").write_text( + json.dumps({"role_vocab": roles, "filler_vocab": fillers}) + "\n" + ) + return classify, role_head, filler_head + + +def test_warm_load_fail_closed_on_vocab_mismatch(tmp_path): + init_roles = ["", "pos_0", "pos_1"] + init_fillers = ["", "a", "b"] + _write_heads_seed(tmp_path, init_roles, init_fillers) + maps = { + "role_vocab": ["", "pos_0", "pos_1", "pos_2"], + "filler_vocab": ["", "a", "b", "c"], + } + classify = nn.Linear(4, 3) + role_head = nn.Linear(4, 4) + filler_head = nn.Linear(4, 4) + with pytest.raises(ValueError, match="role_vocab mismatch"): + warm_load_checkpoint( + _Enc(), classify, role_head, filler_head, maps, tmp_path, expand_vocab=False + ) + + +def test_warm_load_expand_remaps_shared_rows_keeps_new_init(tmp_path): + init_roles = ["", "TOKEN", "pos_0", "pos_1"] + init_fillers = ["", "alpha", "beta"] + _, init_role, init_filler = _write_heads_seed(tmp_path, init_roles, init_fillers) + cur_roles = ["", "TOKEN", "pos_0", "pos_1", "pos_2"] + # filler order differs + new label (name-remap, not index-pad) + cur_fillers = ["", "beta", "alpha", "gamma"] + maps = {"role_vocab": cur_roles, "filler_vocab": cur_fillers} + classify = nn.Linear(4, 3) + role_head = nn.Linear(4, len(cur_roles)) + filler_head = nn.Linear(4, len(cur_fillers)) + with torch.no_grad(): + role_head.weight.fill_(-1.0) + role_head.bias.fill_(-1.0) + filler_head.weight.fill_(-1.0) + filler_head.bias.fill_(-1.0) + new_role_row = role_head.weight[-1].clone() + new_fill_row = filler_head.weight[cur_fillers.index("gamma")].clone() + + receipt = warm_load_checkpoint( + _Enc(), classify, role_head, filler_head, maps, tmp_path, expand_vocab=True + ) + assert receipt["expand_vocab"] is True + assert receipt["role"]["mapped"] == 4 + assert receipt["filler"]["mapped"] == 3 + assert receipt["filler"]["new_current_rows"] == 1 + + for lab in init_roles: + ii = init_roles.index(lab) + ci = cur_roles.index(lab) + assert torch.allclose(role_head.weight[ci], init_role.weight[ii]) + assert torch.allclose(role_head.bias[ci], init_role.bias[ii]) + assert torch.allclose(role_head.weight[-1], new_role_row) + + for lab in init_fillers: + ii = init_fillers.index(lab) + ci = cur_fillers.index(lab) + assert torch.allclose(filler_head.weight[ci], init_filler.weight[ii]) + assert torch.allclose(filler_head.bias[ci], init_filler.bias[ii]) + gi = cur_fillers.index("gamma") + assert torch.allclose(filler_head.weight[gi], new_fill_row) + + +def test_warm_load_expand_exact_match_still_strict(tmp_path): + roles = ["", "pos_0"] + fillers = ["", "x"] + _write_heads_seed(tmp_path, roles, fillers) + maps = {"role_vocab": roles, "filler_vocab": fillers} + classify = nn.Linear(4, 3) + role_head = nn.Linear(4, 2) + filler_head = nn.Linear(4, 2) + receipt = warm_load_checkpoint( + _Enc(), classify, role_head, filler_head, maps, tmp_path, expand_vocab=True + ) + assert receipt["vocab_match"] is True + assert receipt["expand_vocab"] is False diff --git a/tests/shadow/test_hyperlexical_unbind_force_train.py b/tests/shadow/test_hyperlexical_unbind_force_train.py new file mode 100644 index 00000000..9cbb64d9 --- /dev/null +++ b/tests/shadow/test_hyperlexical_unbind_force_train.py @@ -0,0 +1,78 @@ +"""Force-train authorized OBSERVED val exacts → train (accept-style).""" + +from pathlib import Path +import json +import sys + +import pytest + +ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(ROOT / "scripts" / "shadow")) + +from hyperlexical.loop import prepare_unbind_splits +from hyperlexical.unbind_recipe import ( + apply_unbind_force_train, + load_force_train_keys, + resolve_unbind_force_train_path, +) + + +def _unbind_row(text, fillers, *, cls="OBSERVED", split="train", scheme="positional"): + roles = ( + [f"pos_{i}" for i in range(len(fillers))] + if scheme == "positional" + else ["TOKEN", "SLOT", "MARKER"][: len(fillers)] + ) + return { + "text": text, + "fillers": fillers, + "roles": roles, + "role_scheme": scheme, + "class": cls, + "split": split, + "task": "unbind", + "lineage": "brainrot-aura", + } + + +def test_force_train_default_identity(monkeypatch): + monkeypatch.delenv("HYPERLEX_UNBIND_FORCE_TRAIN_PATH", raising=False) + assert resolve_unbind_force_train_path() == "" + assert load_force_train_keys() == frozenset() + train = [_unbind_row("train a", ["a", "b"], split="train")] + val = [_unbind_row("val a", ["c", "d"], split="val")] + t2, v2, stats = apply_unbind_force_train(train, val) + assert t2 == train + assert v2 == val + assert stats["n_unbind_force_train"] == 0 + + +def test_force_train_moves_observed_val_only(monkeypatch, tmp_path): + path = tmp_path / "force_train.jsonl" + path.write_text( + json.dumps({"text": "val obs", "role_scheme": "positional"}) + "\n" + + json.dumps({"text": "val inf", "role_scheme": "positional"}) + "\n", + encoding="utf-8", + ) + monkeypatch.setenv("HYPERLEX_UNBIND_FORCE_TRAIN_PATH", str(path)) + monkeypatch.delenv("HYPERLEX_UNBIND_OBSERVED_UPSAMPLE", raising=False) + monkeypatch.delenv("HYPERLEX_UNBIND_HARD_ATOMS_PATH", raising=False) + monkeypatch.delenv("HYPERLEX_UNBIND_HARD_UPSAMPLE", raising=False) + rows = [ + _unbind_row("train obs", ["aped", "in"], split="train"), + _unbind_row("val obs", ["quiet", "quitter"], split="val"), + _unbind_row("val inf", ["aura", "farm"], cls="INFERRED", split="val"), + _unbind_row("val other", ["dark", "flow"], split="val"), + ] + train, val, stats = prepare_unbind_splits(rows) + assert [r["text"] for r in val] == ["val inf", "val other"] + assert any(r["text"] == "val obs" and r["split"] == "train" for r in train) + assert stats["n_unbind_force_train"] == 1 + assert stats["n_unbind_force_train_keys"] == 2 + assert stats["unbind_force_train_path"] == "force_train.jsonl" + + +def test_force_train_fail_closed_missing(monkeypatch): + monkeypatch.setenv("HYPERLEX_UNBIND_FORCE_TRAIN_PATH", "/no/such/force_train.jsonl") + with pytest.raises(ValueError, match="not a file"): + load_force_train_keys()