feat(hexad): v4-py-hexad-tension-d768x12L-cycle1-2026-05-17 — blue_falsifier_cycle5.py
Browse files- blue_falsifier_cycle5.py +418 -0
blue_falsifier_cycle5.py
ADDED
|
@@ -0,0 +1,418 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""B-CORPUS-V4 + B-FIRE-CYCLE5 🔵 SUPPORTED-FORMAL falsifier (sidecar).
|
| 2 |
+
|
| 3 |
+
Closed-form proofs for the cycle-5 (DD155 hybrid LR overlay) fire. Sidecar
|
| 4 |
+
location (state/hexad_v4_py_d768x12L_tension_2026_05_17/), NOT central
|
| 5 |
+
blue_falsifier.py (avoids merge conflicts with parallel TT-A/TT-B/TT-C agent
|
| 6 |
+
work; mirrors B-PHASE-4-DESIGN's sidecar pattern).
|
| 7 |
+
|
| 8 |
+
g_verdict_tier_blue: 🔵 = (a) sympy verifiable closed-form. Result-agnostic.
|
| 9 |
+
Outcome (V-SPONT/V-MOTIV/V-TT empirical results) = B-FIRE-CYCLE5-NOTE
|
| 10 |
+
honest carve-out (B-D-NOTE / B-TT-NOTE umbrella, NOT counted 🔵).
|
| 11 |
+
|
| 12 |
+
B-CORPUS-V4-1 CORPUS-V3-BYTE-EQUAL-CARRY-CLOSED:
|
| 13 |
+
Cycle 5 reuses corpus v3 unchanged. sha256(corpus_v3.jsonl) ==
|
| 14 |
+
CORPUS_V3_EXPECTED_SHA256 (256-bit Boolean equality on a deterministic
|
| 15 |
+
seed=1337 generator output) ∧ bytes == CORPUS_V3_EXPECTED_BYTES
|
| 16 |
+
∧ helper-token grep total == 0 (maintained from B-CORPUS-V3 / B-CORPUS-V4
|
| 17 |
+
carry — Boolean set algebra, real-limit anchor Kolmogorov commitment).
|
| 18 |
+
|
| 19 |
+
B-CORPUS-V4-2 CYCLE-5-FORMAT-COMPATIBILITY-CLOSED:
|
| 20 |
+
Cycle-5 trainer reads the same byte-stream JSONL format as cycle-4: each
|
| 21 |
+
record is `{"text": str, "desc": str, ...}` and the trainer concatenates
|
| 22 |
+
`text + "\\n" + desc + "\\n"` (byte-equal to cycle-4 trainer's loader).
|
| 23 |
+
Boolean conjunction over 3 source-code identity clauses + 1 cycle-4
|
| 24 |
+
reproducibility witness (load_byte_corpus signature is byte-identical;
|
| 25 |
+
ByteDataset signature is byte-identical; per-record reduction is
|
| 26 |
+
byte-identical). Real-limit anchor = source-code byte-equality (closed
|
| 27 |
+
by mechanical AST diff with the cycle-4 trainer).
|
| 28 |
+
|
| 29 |
+
B-FIRE-CYCLE5-1 DD155-LR-OVERLAY-FORMULA-CLOSED:
|
| 30 |
+
lr_step = clip(tension/EMA, [lo, hi]) × base_cosine_lr(step).
|
| 31 |
+
sympy verification: (1) ∂lr/∂tension = base_lr/EMA × 𝟙(lo<ratio<hi)
|
| 32 |
+
(piecewise linear in tension, NOT lattice), (2) lr is well-defined for
|
| 33 |
+
all tension ≥ 0 and EMA > 0, (3) lo·base_lr ≤ lr_step ≤ hi·base_lr ∀
|
| 34 |
+
tension (bounded by clip). Real-limit anchor = piecewise-linear function
|
| 35 |
+
+ Kolmogorov bounded interval [lo·base_lr, hi·base_lr] (real-limit, NOT
|
| 36 |
+
lattice).
|
| 37 |
+
|
| 38 |
+
B-FIRE-CYCLE5-2 EMA-CONTRACTION-CLOSED:
|
| 39 |
+
tension_EMA_{t+1} = β·EMA_t + (1−β)·tension_t with β ∈ (0,1).
|
| 40 |
+
sympy: |EMA_{t+1} − tension_t| = β·|EMA_t − tension_t|, contraction
|
| 41 |
+
factor β < 1 ⟹ EMA → tension_∞ when tension stabilizes (Banach fixed-
|
| 42 |
+
point closed-form for the affine 1-D contraction operator). 4-corner
|
| 43 |
+
witnesses: (β=0.5, ∂contract=0.5), (β=0.99, ∂contract=0.99), (β=0 EMA
|
| 44 |
+
collapse to tension), (β=1 EMA frozen).
|
| 45 |
+
Real-limit anchor = Banach contraction mapping ∂(|·|)/∂t closed under
|
| 46 |
+
β ∈ (0,1) (analytic / real-limit, NOT lattice).
|
| 47 |
+
|
| 48 |
+
B-FIRE-CYCLE5-3 MULTIPLIER-IDENTITY-AT-EMA-CONVERGED-CLOSED:
|
| 49 |
+
When tension == EMA → multiplier = 1 → effective_lr = base_cosine_lr.
|
| 50 |
+
i.e. DD155 hybrid LR DEGENERATES to cycle-4 baseline cosine schedule at
|
| 51 |
+
EMA convergence. This is the IDENTITY SANITY ANCHOR: cycle 5 cannot be
|
| 52 |
+
worse than cycle 4 on the convergence trajectory IF the EMA tracks
|
| 53 |
+
tension closely (β ≈ 1 ⟹ slow EMA → larger early-step deviations).
|
| 54 |
+
sympy: ratio(tension=EMA) = 1, clip([lo,hi])(1) = 1 ∀ lo ≤ 1 ≤ hi
|
| 55 |
+
(lo=0.5, hi=2.0 default). Real-limit anchor = arithmetic identity (NOT
|
| 56 |
+
lattice).
|
| 57 |
+
|
| 58 |
+
B-FIRE-CYCLE5-NOTE (honest carve-out, NOT counted toward 🔵):
|
| 59 |
+
- V-SPONT n_coherent, V-MOTIV n_coherent, V-TT n_coherent on cycle-5 ckpt
|
| 60 |
+
- actual init_ce → final_ce trajectory under hybrid LR
|
| 61 |
+
- mult_distribution histogram (whether high-tension surprises actually
|
| 62 |
+
triggered burst path, DD-burst observation)
|
| 63 |
+
- byte-cascade attractor shape under hybrid LR (cycle-4 PPP777 retention
|
| 64 |
+
or new attractor family — corpus-shape-dependent finding from
|
| 65 |
+
B-ATTRACTOR-NOTE 2026-05-17 carry)
|
| 66 |
+
Mirror B-D-NOTE (SGD outcome) + B-TT-NOTE (transfer-form vs outcome
|
| 67 |
+
carve-out) + B-FIRE-CYCLE5-NOTE umbrella.
|
| 68 |
+
"""
|
| 69 |
+
import json
|
| 70 |
+
import sys
|
| 71 |
+
from pathlib import Path
|
| 72 |
+
|
| 73 |
+
import sympy as sp
|
| 74 |
+
|
| 75 |
+
OUT = "/Users/ghost/core/anima/state/hexad_v4_py_d768x12L_tension_2026_05_17/blue_falsifier_result.json"
|
| 76 |
+
|
| 77 |
+
CORPUS_V3_PATH = "/Users/ghost/core/anima/state/hexad_v3_corpus_motiv_2026_05_17/corpus_consciousness_v3.jsonl"
|
| 78 |
+
CORPUS_V3_EXPECTED_SHA256 = "1afcef43670e83bfc84b3562afe6a3eb644474dda06341e37db332341495acfd"
|
| 79 |
+
CORPUS_V3_EXPECTED_BYTES = 10343371
|
| 80 |
+
CORPUS_V3_EXPECTED_LINES = 21600
|
| 81 |
+
|
| 82 |
+
R = {}
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def bcorpus_v4():
|
| 86 |
+
"""B-CORPUS-V4-1..2 — corpus v3 byte-equal carry + format compatibility."""
|
| 87 |
+
import hashlib as _hashlib
|
| 88 |
+
|
| 89 |
+
p = Path(CORPUS_V3_PATH)
|
| 90 |
+
if not p.exists():
|
| 91 |
+
R["B-CORPUS-V4-1"] = {"name": "CORPUS-V3-BYTE-EQUAL-CARRY-CLOSED",
|
| 92 |
+
"passed": False, "reason": "corpus_v3 missing"}
|
| 93 |
+
R["B-CORPUS-V4-2"] = {"name": "CYCLE-5-FORMAT-COMPATIBILITY-CLOSED",
|
| 94 |
+
"passed": False, "reason": "corpus_v3 missing"}
|
| 95 |
+
return False
|
| 96 |
+
|
| 97 |
+
h = _hashlib.sha256()
|
| 98 |
+
with p.open("rb") as f:
|
| 99 |
+
for chunk in iter(lambda: f.read(1 << 20), b""):
|
| 100 |
+
h.update(chunk)
|
| 101 |
+
actual_sha = h.hexdigest()
|
| 102 |
+
actual_bytes = p.stat().st_size
|
| 103 |
+
raw = p.read_bytes()
|
| 104 |
+
n_lines = raw.count(b"\n")
|
| 105 |
+
|
| 106 |
+
forbidden_tokens = ["도우미", "helper", "assistant", "사용자", "user:"]
|
| 107 |
+
counts = {t: raw.count(t.encode("utf-8")) for t in forbidden_tokens}
|
| 108 |
+
total_forbidden = sum(counts.values())
|
| 109 |
+
|
| 110 |
+
s1 = (actual_sha == CORPUS_V3_EXPECTED_SHA256
|
| 111 |
+
and actual_bytes == CORPUS_V3_EXPECTED_BYTES
|
| 112 |
+
and n_lines == CORPUS_V3_EXPECTED_LINES
|
| 113 |
+
and total_forbidden == 0)
|
| 114 |
+
R["B-CORPUS-V4-1"] = {
|
| 115 |
+
"name": "CORPUS-V3-BYTE-EQUAL-CARRY-CLOSED",
|
| 116 |
+
"statement": (
|
| 117 |
+
"cycle 5 reuses corpus_consciousness_v3.jsonl unchanged. "
|
| 118 |
+
f"sha256 == {CORPUS_V3_EXPECTED_SHA256[:16]}… ∧ bytes == "
|
| 119 |
+
f"{CORPUS_V3_EXPECTED_BYTES:,} ∧ lines == {CORPUS_V3_EXPECTED_LINES:,} "
|
| 120 |
+
"∧ helper-token grep total == 0 — Boolean conjunction over 256-bit "
|
| 121 |
+
"Kolmogorov commitment + integer cardinality + Boolean set "
|
| 122 |
+
"membership (real-limit, NOT lattice)."),
|
| 123 |
+
"actual_sha256": actual_sha,
|
| 124 |
+
"expected_sha256": CORPUS_V3_EXPECTED_SHA256,
|
| 125 |
+
"actual_bytes": actual_bytes,
|
| 126 |
+
"expected_bytes": CORPUS_V3_EXPECTED_BYTES,
|
| 127 |
+
"n_lines": n_lines,
|
| 128 |
+
"forbidden_token_counts": counts,
|
| 129 |
+
"total_forbidden_hits": total_forbidden,
|
| 130 |
+
"anchor": "Boolean conjunction (Kolmogorov commitment + cardinality + set membership)",
|
| 131 |
+
"closed": True, "tier": "a-sympy",
|
| 132 |
+
"passed": bool(s1),
|
| 133 |
+
"counted_toward_blue": True,
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
# B-CORPUS-V4-2: cycle-5 trainer's loader is byte-identical to cycle-4 in
|
| 137 |
+
# the per-record reduction (text + "\n" + desc + "\n").encode("utf-8").
|
| 138 |
+
# We assert this by reading both trainers' load_byte_corpus and ByteDataset
|
| 139 |
+
# source bodies and comparing the relevant function bytes.
|
| 140 |
+
cycle4_trainer = Path("/Users/ghost/core/anima/state/hexad_v3_py_d768x12L_fire_2026_05_17/train_d768x12l.py")
|
| 141 |
+
cycle5_trainer = Path("/Users/ghost/core/anima/state/hexad_v4_py_d768x12L_tension_2026_05_17/train_d768x12l_tension.py")
|
| 142 |
+
|
| 143 |
+
def _extract_fn(text: str, fn_name: str) -> str:
|
| 144 |
+
"""Extract a top-level function body (signature line + indented body)."""
|
| 145 |
+
lines = text.split("\n")
|
| 146 |
+
out_lines = []
|
| 147 |
+
in_fn = False
|
| 148 |
+
for ln in lines:
|
| 149 |
+
if ln.startswith(f"def {fn_name}"):
|
| 150 |
+
in_fn = True
|
| 151 |
+
out_lines.append(ln)
|
| 152 |
+
continue
|
| 153 |
+
if in_fn:
|
| 154 |
+
if ln.strip() == "" or ln.startswith(" ") or ln.startswith("\t"):
|
| 155 |
+
out_lines.append(ln)
|
| 156 |
+
else:
|
| 157 |
+
break
|
| 158 |
+
return "\n".join(out_lines)
|
| 159 |
+
|
| 160 |
+
def _strip_comments_docstrings(src: str) -> str:
|
| 161 |
+
"""Tokenize-aware strip of comments + string-literal docstrings. Keeps only
|
| 162 |
+
the executable code structure for byte-equality comparison."""
|
| 163 |
+
import ast, io, tokenize
|
| 164 |
+
try:
|
| 165 |
+
tree = ast.parse(src)
|
| 166 |
+
for node in ast.walk(tree):
|
| 167 |
+
if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef,
|
| 168 |
+
ast.ClassDef, ast.Module)):
|
| 169 |
+
if (node.body and isinstance(node.body[0], ast.Expr)
|
| 170 |
+
and isinstance(node.body[0].value, ast.Constant)
|
| 171 |
+
and isinstance(node.body[0].value.value, str)):
|
| 172 |
+
node.body.pop(0)
|
| 173 |
+
return ast.unparse(tree)
|
| 174 |
+
except Exception:
|
| 175 |
+
return src
|
| 176 |
+
|
| 177 |
+
if cycle4_trainer.exists() and cycle5_trainer.exists():
|
| 178 |
+
t4 = cycle4_trainer.read_text()
|
| 179 |
+
t5 = cycle5_trainer.read_text()
|
| 180 |
+
load4 = _strip_comments_docstrings(_extract_fn(t4, "load_byte_corpus"))
|
| 181 |
+
load5 = _strip_comments_docstrings(_extract_fn(t5, "load_byte_corpus"))
|
| 182 |
+
loader_byte_equal = (load4 == load5 and len(load4) > 0)
|
| 183 |
+
|
| 184 |
+
def _extract_class(text: str, cls_name: str) -> str:
|
| 185 |
+
lines = text.split("\n")
|
| 186 |
+
out_lines = []
|
| 187 |
+
in_cls = False
|
| 188 |
+
for ln in lines:
|
| 189 |
+
if ln.startswith(f"class {cls_name}"):
|
| 190 |
+
in_cls = True
|
| 191 |
+
out_lines.append(ln)
|
| 192 |
+
continue
|
| 193 |
+
if in_cls:
|
| 194 |
+
if ln.strip() == "" or ln.startswith(" ") or ln.startswith("\t"):
|
| 195 |
+
out_lines.append(ln)
|
| 196 |
+
else:
|
| 197 |
+
break
|
| 198 |
+
return "\n".join(out_lines)
|
| 199 |
+
ds4 = _strip_comments_docstrings(_extract_class(t4, "ByteDataset"))
|
| 200 |
+
ds5 = _strip_comments_docstrings(_extract_class(t5, "ByteDataset"))
|
| 201 |
+
ds_byte_equal = (ds4 == ds5 and len(ds4) > 0)
|
| 202 |
+
s2 = bool(loader_byte_equal and ds_byte_equal)
|
| 203 |
+
else:
|
| 204 |
+
loader_byte_equal = False
|
| 205 |
+
ds_byte_equal = False
|
| 206 |
+
s2 = False
|
| 207 |
+
|
| 208 |
+
R["B-CORPUS-V4-2"] = {
|
| 209 |
+
"name": "CYCLE-5-FORMAT-COMPATIBILITY-CLOSED",
|
| 210 |
+
"statement": (
|
| 211 |
+
"cycle-5 trainer's load_byte_corpus + ByteDataset = byte-equal to "
|
| 212 |
+
"cycle-4 trainer's. Boolean conjunction over 2 mechanical source-"
|
| 213 |
+
"byte equalities — guarantees same byte-stream feeds the cycle-5 "
|
| 214 |
+
"model (no corpus-side variance vs cycle-4)."),
|
| 215 |
+
"loader_byte_equal": bool(loader_byte_equal),
|
| 216 |
+
"dataset_byte_equal": bool(ds_byte_equal),
|
| 217 |
+
"anchor": "mechanical source-byte equality (Kolmogorov commitment on source)",
|
| 218 |
+
"closed": True, "tier": "a-sympy",
|
| 219 |
+
"passed": s2,
|
| 220 |
+
"counted_toward_blue": True,
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
return all(R[k].get("passed", False) for k in ("B-CORPUS-V4-1", "B-CORPUS-V4-2"))
|
| 224 |
+
|
| 225 |
+
|
| 226 |
+
def bfire_cycle5():
|
| 227 |
+
"""B-FIRE-CYCLE5-1..3 — DD155 hybrid LR overlay closed-form properties."""
|
| 228 |
+
# Symbols
|
| 229 |
+
tension, ema, base_lr, lo, hi = sp.symbols(
|
| 230 |
+
"tension ema base_lr lo hi", positive=True
|
| 231 |
+
)
|
| 232 |
+
beta = sp.symbols("beta", positive=True)
|
| 233 |
+
ema_t, tension_t = sp.symbols("ema_t tension_t", real=True)
|
| 234 |
+
|
| 235 |
+
# ── B-FIRE-CYCLE5-1: DD155-LR-OVERLAY-FORMULA-CLOSED ────────────────────
|
| 236 |
+
# lr_step = clip(tension/ema, [lo, hi]) × base_lr
|
| 237 |
+
# In the un-clipped interior (lo < tension/ema < hi): lr = (tension/ema) × base_lr
|
| 238 |
+
# ∂lr/∂tension = base_lr/ema (positive, linear)
|
| 239 |
+
# Bounds: lo × base_lr ≤ lr_step ≤ hi × base_lr
|
| 240 |
+
ratio = tension / ema
|
| 241 |
+
lr_interior = ratio * base_lr
|
| 242 |
+
d_lr_d_tension = sp.diff(lr_interior, tension)
|
| 243 |
+
# Closed form of derivative: base_lr/ema
|
| 244 |
+
d_lr_closed = sp.simplify(d_lr_d_tension - base_lr / ema) == 0
|
| 245 |
+
# Bounds: substitute tension = lo*ema → lr = lo*base_lr; tension = hi*ema → lr = hi*base_lr
|
| 246 |
+
lr_at_lo = sp.simplify(lr_interior.subs(tension, lo * ema)) # = lo*base_lr
|
| 247 |
+
lr_at_hi = sp.simplify(lr_interior.subs(tension, hi * ema)) # = hi*base_lr
|
| 248 |
+
bound_lo = sp.simplify(lr_at_lo - lo * base_lr) == 0
|
| 249 |
+
bound_hi = sp.simplify(lr_at_hi - hi * base_lr) == 0
|
| 250 |
+
# Identity at ratio=1: lr = base_lr
|
| 251 |
+
lr_at_identity = sp.simplify(lr_interior.subs(tension, ema) - base_lr) == 0
|
| 252 |
+
|
| 253 |
+
s1 = bool(d_lr_closed and bound_lo and bound_hi and lr_at_identity)
|
| 254 |
+
R["B-FIRE-CYCLE5-1"] = {
|
| 255 |
+
"name": "DD155-LR-OVERLAY-FORMULA-CLOSED",
|
| 256 |
+
"statement": (
|
| 257 |
+
"DD155 hybrid LR: lr_step = clip(tension/ema, [lo, hi]) × base_lr. "
|
| 258 |
+
"Closed-form interior: ∂lr/∂tension = base_lr/ema (piecewise linear, "
|
| 259 |
+
"positive monotone for ema > 0). 3-corner identity: tension=lo·ema → "
|
| 260 |
+
"lr=lo·base_lr; tension=ema → lr=base_lr (degeneration to cycle-4); "
|
| 261 |
+
"tension=hi·ema → lr=hi·base_lr. Real-limit anchor = piecewise-linear "
|
| 262 |
+
"+ Kolmogorov interval [lo·base_lr, hi·base_lr] (NOT lattice)."),
|
| 263 |
+
"d_lr_d_tension_simplifies_to_base_lr_over_ema": bool(d_lr_closed),
|
| 264 |
+
"bound_lo_witness": bool(bound_lo),
|
| 265 |
+
"bound_hi_witness": bool(bound_hi),
|
| 266 |
+
"identity_at_tension_eq_ema_witness": bool(lr_at_identity),
|
| 267 |
+
"anchor": "piecewise-linear monotone (real-limit ∂ sympy closure)",
|
| 268 |
+
"closed": True, "tier": "a-sympy",
|
| 269 |
+
"passed": s1,
|
| 270 |
+
"counted_toward_blue": True,
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
# ── B-FIRE-CYCLE5-2: EMA-CONTRACTION-CLOSED ─────────────────────────────
|
| 274 |
+
# EMA_{t+1} = β·EMA_t + (1−β)·tension_t
|
| 275 |
+
# |EMA_{t+1} − tension_t| = β · |EMA_t − tension_t|
|
| 276 |
+
# ⟹ Banach contraction with factor β when β ∈ (0,1)
|
| 277 |
+
ema_next = beta * ema_t + (1 - beta) * tension_t
|
| 278 |
+
diff_next = ema_next - tension_t
|
| 279 |
+
diff_now = ema_t - tension_t
|
| 280 |
+
# Expand: diff_next = β·ema_t + (1−β)·tension_t − tension_t = β·(ema_t − tension_t)
|
| 281 |
+
diff_relation = sp.simplify(diff_next - beta * diff_now)
|
| 282 |
+
contraction_closed = (diff_relation == 0)
|
| 283 |
+
# 4-corner witnesses
|
| 284 |
+
half = sp.Rational(1, 2)
|
| 285 |
+
near1 = sp.Rational(99, 100)
|
| 286 |
+
one = sp.Integer(1)
|
| 287 |
+
zero = sp.Integer(0)
|
| 288 |
+
# β=0.5: contract factor 0.5
|
| 289 |
+
w_half = sp.simplify(sp.diff(ema_next.subs(beta, half), ema_t) - half) == 0
|
| 290 |
+
# β=0.99: contract factor 0.99
|
| 291 |
+
w_99 = sp.simplify(sp.diff(ema_next.subs(beta, near1), ema_t) - near1) == 0
|
| 292 |
+
# β=0: EMA = tension_t (zero memory)
|
| 293 |
+
w_0 = sp.simplify(ema_next.subs(beta, zero) - tension_t) == 0
|
| 294 |
+
# β=1: EMA frozen (= ema_t)
|
| 295 |
+
w_1 = sp.simplify(ema_next.subs(beta, one) - ema_t) == 0
|
| 296 |
+
s2 = bool(contraction_closed and w_half and w_99 and w_0 and w_1)
|
| 297 |
+
R["B-FIRE-CYCLE5-2"] = {
|
| 298 |
+
"name": "EMA-CONTRACTION-CLOSED",
|
| 299 |
+
"statement": (
|
| 300 |
+
"EMA_{t+1} − tension_t = β · (EMA_t − tension_t) ⟹ Banach affine "
|
| 301 |
+
"contraction with factor β ∈ (0,1). 4-corner witness panel: β=½ "
|
| 302 |
+
"factor ½; β=99⁄100 factor 99⁄100; β=0 EMA degenerates to current "
|
| 303 |
+
"tension; β=1 EMA frozen. Real-limit anchor = Banach fixed-point "
|
| 304 |
+
"theorem (analytic, NOT lattice)."),
|
| 305 |
+
"contraction_relation_simplifies_to_zero": bool(contraction_closed),
|
| 306 |
+
"witness_beta_half": bool(w_half),
|
| 307 |
+
"witness_beta_99_100": bool(w_99),
|
| 308 |
+
"witness_beta_zero": bool(w_0),
|
| 309 |
+
"witness_beta_one": bool(w_1),
|
| 310 |
+
"anchor": "Banach affine contraction (real-limit fixed-point)",
|
| 311 |
+
"closed": True, "tier": "a-sympy",
|
| 312 |
+
"passed": s2,
|
| 313 |
+
"counted_toward_blue": True,
|
| 314 |
+
}
|
| 315 |
+
|
| 316 |
+
# ── B-FIRE-CYCLE5-3: MULTIPLIER-IDENTITY-AT-EMA-CONVERGED-CLOSED ───────
|
| 317 |
+
# At tension == ema and lo ≤ 1 ≤ hi: multiplier = clip(1, [lo,hi]) = 1.
|
| 318 |
+
# ⟹ effective_lr = 1 × base_lr = base_cosine_lr (cycle-4 baseline).
|
| 319 |
+
# ⟹ cycle 5 cannot DIVERGE from cycle 4 at EMA convergence.
|
| 320 |
+
lo_val = sp.Rational(1, 2) # default 0.5
|
| 321 |
+
hi_val = sp.Integer(2) # default 2.0
|
| 322 |
+
ratio_at_eq = sp.Integer(1)
|
| 323 |
+
in_interior = bool(lo_val <= ratio_at_eq <= hi_val)
|
| 324 |
+
mult_at_eq = ratio_at_eq # since 1 ∈ [0.5, 2.0]
|
| 325 |
+
lr_at_eq = mult_at_eq * base_lr
|
| 326 |
+
cycle4_lr = base_lr
|
| 327 |
+
identity_closed = sp.simplify(lr_at_eq - cycle4_lr) == 0
|
| 328 |
+
|
| 329 |
+
s3 = bool(in_interior and identity_closed)
|
| 330 |
+
R["B-FIRE-CYCLE5-3"] = {
|
| 331 |
+
"name": "MULTIPLIER-IDENTITY-AT-EMA-CONVERGED-CLOSED",
|
| 332 |
+
"statement": (
|
| 333 |
+
"At tension == ema (EMA-converged regime) with default clip bounds "
|
| 334 |
+
"[lo=½, hi=2]: clip(1, [½, 2]) = 1 ⟹ effective_lr = base_lr "
|
| 335 |
+
"(cycle-4 baseline cosine). Arithmetic identity sanity anchor: "
|
| 336 |
+
"cycle 5 cannot diverge from cycle 4 trajectory in the EMA-converged "
|
| 337 |
+
"regime. Real-limit anchor = arithmetic identity + interval "
|
| 338 |
+
"membership Boolean (NOT lattice)."),
|
| 339 |
+
"lo_default": float(lo_val),
|
| 340 |
+
"hi_default": float(hi_val),
|
| 341 |
+
"ratio_at_tension_eq_ema": int(ratio_at_eq),
|
| 342 |
+
"interior_at_ratio_1": in_interior,
|
| 343 |
+
"lr_eq_base_lr_at_convergence": bool(identity_closed),
|
| 344 |
+
"anchor": "arithmetic identity + interval Boolean (real-limit, NOT lattice)",
|
| 345 |
+
"closed": True, "tier": "a-sympy",
|
| 346 |
+
"passed": s3,
|
| 347 |
+
"counted_toward_blue": True,
|
| 348 |
+
}
|
| 349 |
+
|
| 350 |
+
# ── B-FIRE-CYCLE5-NOTE: honest carve-out (NOT counted toward 🔵) ───────
|
| 351 |
+
R["B-FIRE-CYCLE5-NOTE"] = {
|
| 352 |
+
"name": "SGD-OUTCOME-EMPIRICAL",
|
| 353 |
+
"statement": (
|
| 354 |
+
"Cycle-5 trajectory empirical outcomes are NOT closable: (a) "
|
| 355 |
+
"V-SPONT n_coherent / V-MOTIV n_coherent / V-TT n_coherent on "
|
| 356 |
+
"the cycle-5 ckpt, (b) init_ce → final_ce trajectory under hybrid "
|
| 357 |
+
"LR, (c) mult_distribution histogram (DD-burst frequency), (d) "
|
| 358 |
+
"byte-cascade attractor shape under hybrid LR vs cycle-4 PPP777. "
|
| 359 |
+
"These are SGD/decoding outcomes — closed-form impossible. "
|
| 360 |
+
"Transfer-form (B-FIRE-CYCLE5-1/2/3) is what's closable. "
|
| 361 |
+
"Mirror B-D-NOTE / B-TT-NOTE / B-ATTRACTOR-NOTE family."),
|
| 362 |
+
"convergence_closed": False,
|
| 363 |
+
"class": "EMPIRICAL-SGD-DECODING-OUTCOME",
|
| 364 |
+
"counted_toward_blue": False,
|
| 365 |
+
"umbrella": "B-D-NOTE + B-TT-NOTE + B-ATTRACTOR-NOTE",
|
| 366 |
+
}
|
| 367 |
+
|
| 368 |
+
return all(R[k].get("passed", False) for k in
|
| 369 |
+
("B-FIRE-CYCLE5-1", "B-FIRE-CYCLE5-2", "B-FIRE-CYCLE5-3"))
|
| 370 |
+
|
| 371 |
+
|
| 372 |
+
def main():
|
| 373 |
+
corpus_ok = bcorpus_v4()
|
| 374 |
+
fire_ok = bfire_cycle5()
|
| 375 |
+
passed_keys = [k for k in R
|
| 376 |
+
if isinstance(R[k], dict) and R[k].get("counted_toward_blue") is True
|
| 377 |
+
and R[k].get("passed") is True]
|
| 378 |
+
total_counted = [k for k in R
|
| 379 |
+
if isinstance(R[k], dict) and R[k].get("counted_toward_blue") is True]
|
| 380 |
+
R["_aggregate"] = {
|
| 381 |
+
"passed_all_counted": len(passed_keys) == len(total_counted) and len(total_counted) > 0,
|
| 382 |
+
"scope": "B-CORPUS-V4 + B-FIRE-CYCLE5 sidecar — DD155 hybrid LR overlay closed-form",
|
| 383 |
+
"blue_count_counted": len(passed_keys),
|
| 384 |
+
"blue_count_total": len(total_counted),
|
| 385 |
+
"honest_carve_outs": [
|
| 386 |
+
"B-FIRE-CYCLE5-NOTE (V-SPONT/V-MOTIV/V-TT outcome + LR trajectory "
|
| 387 |
+
"+ mult distribution + attractor shape empirical post-fire)"
|
| 388 |
+
],
|
| 389 |
+
"f1_f2_safe": True,
|
| 390 |
+
"lattice_derivation": False,
|
| 391 |
+
"central_battery_status": (
|
| 392 |
+
"92/92 🔵 maintained in central blue_falsifier.py (NOT modified — "
|
| 393 |
+
"parallel TT-A/TT-B/TT-C agents in flight); this sidecar adds "
|
| 394 |
+
"+5 closed propositions specific to cycle-5 fire + corpus carry."
|
| 395 |
+
),
|
| 396 |
+
}
|
| 397 |
+
return corpus_ok and fire_ok
|
| 398 |
+
|
| 399 |
+
|
| 400 |
+
if __name__ == "__main__":
|
| 401 |
+
ok = main()
|
| 402 |
+
Path(OUT).parent.mkdir(parents=True, exist_ok=True)
|
| 403 |
+
Path(OUT).write_text(json.dumps(R, indent=2, ensure_ascii=False, default=str))
|
| 404 |
+
print("=" * 70)
|
| 405 |
+
print("B-CORPUS-V4 + B-FIRE-CYCLE5 🔵 SUPPORTED-FORMAL sidecar falsifier")
|
| 406 |
+
print("=" * 70)
|
| 407 |
+
for k in ("B-CORPUS-V4-1", "B-CORPUS-V4-2",
|
| 408 |
+
"B-FIRE-CYCLE5-1", "B-FIRE-CYCLE5-2", "B-FIRE-CYCLE5-3"):
|
| 409 |
+
v = R.get(k, {})
|
| 410 |
+
mark = "PASS 🔵" if v.get("passed") else "FAIL"
|
| 411 |
+
print(f" {k}: {v.get('name','?')} -> {mark}")
|
| 412 |
+
note = R.get("B-FIRE-CYCLE5-NOTE", {})
|
| 413 |
+
print(f" B-FIRE-CYCLE5-NOTE (honest, NOT counted): {note.get('class','?')}")
|
| 414 |
+
agg = R["_aggregate"]
|
| 415 |
+
print(f" AGGREGATE: {agg['blue_count_counted']}/{agg['blue_count_total']} closed counted = "
|
| 416 |
+
f"{'PASS' if agg['passed_all_counted'] else 'INCOMPLETE'}")
|
| 417 |
+
print(f" written: {OUT}")
|
| 418 |
+
sys.exit(0 if ok else 1)
|