karlexmarin Claude Opus 4.7 (1M context) commited on
Commit
28ac122
·
1 Parent(s): cb542c8

v0.6: TAF Card hero+accordion UI + γ_check + Lean+Mathlib badges

Browse files

- Hero strip (arch class + meta + 3 pills: count breakdown, γ headline, Anti-Ising) + 4 accordions: Recipes, Diagnostics, Verification, Provenance
- New js/gamma_check.js: Padé closed-form + classifyRegime (normal/fraud/compressed/overpade/swa), browser-only
- New js/lean_badges.js + data/lean_status.json: manifest of 37 theorems in 7 groups + 1 substantive finding (V_derivative_ne_RG_beta factor-2). Sortable theorem table, hero Anti-Ising pill links to Taf/Identities.lean#L188 (beta_chi_closure)
- Verdict aggregation: count breakdown (✅ · ⚠ · ❌) replaces worst-of-N confusion when orthogonal recipes disagree
- ⓘ tooltips inline: hero pills (3), Profile form params (6), Diagnostics keys (6), γ_check results (5)
- Help v0.6 section: TAF Card layout + 5 regime use cases + Cardy ΔH + concrete Lean reverify command + 37/1 count, all 4 langs
- i18n EN/ES/FR/ZH parity: 295+ keys per lang, 0 missing
- gamma_check classifier verified 5/5 regimes via headless Chrome simulation

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files changed (7) hide show
  1. data/lean_status.json +506 -0
  2. index.html +31 -6
  3. js/gamma_check.js +70 -0
  4. js/i18n.js +424 -20
  5. js/lean_badges.js +119 -0
  6. js/main.js +189 -43
  7. style.css +179 -0
data/lean_status.json ADDED
@@ -0,0 +1,506 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "generated_at": "2026-05-06",
4
+ "lean_repo": {
5
+ "name": "karlesmarin/lean-taf",
6
+ "url": "https://github.com/karlesmarin/lean-taf",
7
+ "default_branch": "master",
8
+ "commit": "25c77fd2180b8e0d6bc9a634de36667f11597cae",
9
+ "commit_short": "25c77fd",
10
+ "commit_date": "2026-05-05T22:50:58+02:00",
11
+ "build_status": "ok",
12
+ "build_jobs": 1973,
13
+ "compile_time_seconds": 5,
14
+ "lean_toolchain": "leanprover/lean4:v4.30.0-rc2",
15
+ "mathlib_imports": [
16
+ "Mathlib.Data.Real.Basic",
17
+ "Mathlib.Analysis.SpecialFunctions.Pow.Real",
18
+ "Mathlib.Analysis.Calculus.Deriv.Pow",
19
+ "Mathlib.Analysis.Calculus.Deriv.Add",
20
+ "Mathlib.Tactic"
21
+ ],
22
+ "verification_report": "tmp/FORMULAS_LEAN_VERIFICATION_2026-05-05.md"
23
+ },
24
+ "summary": {
25
+ "theorems_total": 37,
26
+ "lean_verified": 37,
27
+ "lean_rejected": 0,
28
+ "skipped_sorry": 0,
29
+ "substantive_findings": 1
30
+ },
31
+ "findings": [
32
+ {
33
+ "id": "F1",
34
+ "title": "V/β factor-of-2 inconsistency in paper formula tables",
35
+ "severity": "substantive",
36
+ "detected_by": "V_derivative_ne_RG_beta",
37
+ "fixed_by": ["V_correct_derivative", "V_correct_matches_RG_beta"],
38
+ "summary": "Paper tables jointly state V(γ)=γ−γ³/3 + β=−V' + β(γ)=−(1−γ²)/2. Lean proves these inconsistent ∀γ∉{−1,+1} (residual factor 2). Corrected V_correct(γ)=γ/2−γ³/6 *does* integrate to the RG β.",
39
+ "recommendation": "Restate V as γ/2 − γ³/6, or rescale β to −(1−γ²), or document the Lagrangian-normalization convention."
40
+ }
41
+ ],
42
+ "groups": [
43
+ {
44
+ "id": "pade",
45
+ "title": "Padé approximant identities",
46
+ "theorems": [
47
+ {
48
+ "name": "pade_22_minus_pade_11",
49
+ "kind": "theorem",
50
+ "file": "Taf/RGFlow.lean",
51
+ "line": 31,
52
+ "claim": "Padé[2,2](z) − Padé[1,1](z) = 2z³ / ((z+2)(z²+6z+12))",
53
+ "preconditions": ["z + 2 ≠ 0", "z² + 6z + 12 ≠ 0"],
54
+ "tactic": "field_simp; ring",
55
+ "status": "ok",
56
+ "tags": ["pade", "exact"],
57
+ "source": { "doc": "FORMULA_TABLE.md", "line": 13, "label": "G-15 ★ EXACT" }
58
+ },
59
+ {
60
+ "name": "one_minus_pade_11",
61
+ "kind": "theorem",
62
+ "file": "Taf/RGFlow.lean",
63
+ "line": 50,
64
+ "claim": "1 − (2−z)/(2+z) = 2z/(2+z)",
65
+ "preconditions": ["2 + z ≠ 0"],
66
+ "tactic": "field_simp; ring",
67
+ "status": "ok",
68
+ "tags": ["pade", "exact"],
69
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "section": "§4.4", "line": 572, "label": "★ EXACT" }
70
+ },
71
+ {
72
+ "name": "pade_z_substitution",
73
+ "kind": "theorem",
74
+ "file": "Taf/RGFlow.lean",
75
+ "line": 207,
76
+ "claim": "γ_Padé canonical form: with z = T√2/θ, (2−z)/(2+z) = (2θ − T√2) / (2θ + T√2)",
77
+ "preconditions": ["θ ≠ 0", "2θ + T√2 ≠ 0"],
78
+ "tactic": "field_simp",
79
+ "status": "ok",
80
+ "tags": ["pade", "exact", "core"],
81
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "section": "§4.1", "line": 456, "label": "★ EXACT" }
82
+ },
83
+ {
84
+ "name": "theta_eff_pade",
85
+ "kind": "theorem",
86
+ "file": "Taf/RGFlow.lean",
87
+ "line": 61,
88
+ "claim": "θ_eff_Padé: T√2 / (1 − γ_Padé(T√2/θ)) = θ + T/√2",
89
+ "preconditions": ["θ ≠ 0", "T ≠ 0", "2θ + T√2 ≠ 0"],
90
+ "tactic": "field_simp; ring_nf + manual rewrite √2³ = √2·2",
91
+ "status": "ok",
92
+ "tags": ["pade", "exact", "core"],
93
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "line": 572, "label": "★ EXACT" }
94
+ },
95
+ {
96
+ "name": "pade_saturation_leading_coefficient",
97
+ "kind": "theorem",
98
+ "file": "Taf/AmGmPade.lean",
99
+ "line": 100,
100
+ "claim": "Padé[2,2] − Padé[1,1] leading coefficient at z=0 is 1/12",
101
+ "tactic": "norm_num + field_simp",
102
+ "status": "ok",
103
+ "tags": ["pade", "audit_finding"],
104
+ "source": { "doc": "FORMULA_TABLE.md", "label": "★ EXACT (Padé saturation, paper §sec:gamma_decomposition)" }
105
+ }
106
+ ]
107
+ },
108
+ {
109
+ "id": "rg_flow",
110
+ "title": "RG flow / β-function (with V/β factor-2 finding)",
111
+ "theorems": [
112
+ {
113
+ "name": "logistic_to_beta_algebraic",
114
+ "kind": "theorem",
115
+ "file": "Taf/RGFlow.lean",
116
+ "line": 91,
117
+ "claim": "Substitution x = (1−γ)/2 ⇒ x(1−x) = (1−γ²)/4",
118
+ "tactic": "ring",
119
+ "status": "ok",
120
+ "tags": ["rg", "exact"],
121
+ "source": { "doc": "FORMULA_TABLE.md", "line": 90, "label": "§23 ✅ ALGEBRAIC EXACT" }
122
+ },
123
+ {
124
+ "name": "V_derivative",
125
+ "kind": "theorem",
126
+ "file": "Taf/RGFlow.lean",
127
+ "line": 111,
128
+ "claim": "d/dγ (γ − γ³/3) = 1 − γ²",
129
+ "tactic": "HasDerivAt chain (id, pow, div_const, sub)",
130
+ "status": "ok",
131
+ "tags": ["rg", "exact"],
132
+ "source": { "doc": "FORMULA_TABLE.md", "line": 91, "label": "§23 ✅ ALGEBRAIC EXACT" }
133
+ },
134
+ {
135
+ "name": "V_derivative_ne_RG_beta",
136
+ "kind": "theorem",
137
+ "file": "Taf/RGFlow.lean",
138
+ "line": 122,
139
+ "claim": "−V'(γ) ≠ −(1 − γ²)/2 for all γ ∉ {−1, +1}",
140
+ "preconditions": ["γ ≠ 1", "γ ≠ −1"],
141
+ "tactic": "linarith after expanding V'(γ) = 1 − γ²",
142
+ "status": "ok",
143
+ "tags": ["rg", "audit_finding", "substantive"],
144
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "section": "§19", "line": 191, "label": "FINDING — factor-2 inconsistency" }
145
+ },
146
+ {
147
+ "name": "V_correct_derivative",
148
+ "kind": "theorem",
149
+ "file": "Taf/RGFlow.lean",
150
+ "line": 238,
151
+ "claim": "d/dγ (γ/2 − γ³/6) = (1 − γ²)/2",
152
+ "tactic": "HasDerivAt chain",
153
+ "status": "ok",
154
+ "tags": ["rg", "fix"],
155
+ "source": { "doc": "FORMULAS_LEAN_VERIFICATION_2026-05-05.md", "label": "Corrected V" }
156
+ },
157
+ {
158
+ "name": "V_correct_matches_RG_beta",
159
+ "kind": "theorem",
160
+ "file": "Taf/RGFlow.lean",
161
+ "line": 256,
162
+ "claim": "−d/dγ (γ/2 − γ³/6) = −(1 − γ²)/2 = β(γ)",
163
+ "tactic": "rw [V_correct_derivative]; ring",
164
+ "status": "ok",
165
+ "tags": ["rg", "fix"],
166
+ "source": { "doc": "FORMULAS_LEAN_VERIFICATION_2026-05-05.md", "label": "V_correct integrates to RG β" }
167
+ },
168
+ {
169
+ "name": "trajectory_sign_inversion",
170
+ "kind": "theorem",
171
+ "file": "Taf/RGFlow.lean",
172
+ "line": 344,
173
+ "claim": "Trajectory tanh sign convention check (paper used +t/2; correct is −t/2 from dγ/dt = −(1−γ²)/2)",
174
+ "tactic": "deriv computation + sign analysis",
175
+ "status": "ok",
176
+ "tags": ["rg", "audit_finding"]
177
+ }
178
+ ]
179
+ },
180
+ {
181
+ "id": "cayley",
182
+ "title": "Cayley fixed-point + χ susceptibility roots",
183
+ "theorems": [
184
+ {
185
+ "name": "cayley_fixed_point_iff",
186
+ "kind": "theorem",
187
+ "file": "Taf/RGFlow.lean",
188
+ "line": 139,
189
+ "claim": "−(z − 2)/(z + 2) = z ⟺ z² + 3z − 2 = 0",
190
+ "preconditions": ["z + 2 ≠ 0"],
191
+ "tactic": "nlinarith after clearing denominator",
192
+ "status": "ok",
193
+ "tags": ["cayley"],
194
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "line": 173 }
195
+ },
196
+ {
197
+ "name": "cayley_root",
198
+ "kind": "theorem",
199
+ "file": "Taf/RGFlow.lean",
200
+ "line": 151,
201
+ "claim": "z* = (√17 − 3)/2 satisfies z*² + 3z* − 2 = 0",
202
+ "tactic": "explicit Real.sq_sqrt expansion",
203
+ "status": "ok",
204
+ "tags": ["cayley", "exact"],
205
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "line": 174, "label": "Physical fixed point z*" }
206
+ },
207
+ {
208
+ "name": "chi_root",
209
+ "kind": "theorem",
210
+ "file": "Taf/RGFlow.lean",
211
+ "line": 170,
212
+ "claim": "χ = (5 + √17)/4 satisfies 2χ² − 5χ + 1 = 0",
213
+ "tactic": "explicit Real.sq_sqrt expansion",
214
+ "status": "ok",
215
+ "tags": ["cayley", "exact"],
216
+ "source": { "doc": "FORMULA_TABLE.md", "line": 92, "label": "§26 ✅ ALGEBRAIC EXACT" }
217
+ },
218
+ {
219
+ "name": "cayley_floquet_form_equivalence",
220
+ "kind": "theorem",
221
+ "file": "Taf/RGFlow.lean",
222
+ "line": 310,
223
+ "claim": "−4(√17+1)/(5√17+13) = (√17 − 9)/8 (equivalent forms; both ≈ −0.6096)",
224
+ "tactic": "nlinarith via div_eq_div_iff",
225
+ "status": "ok",
226
+ "tags": ["cayley", "exact"],
227
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "line": 177 }
228
+ },
229
+ {
230
+ "name": "cayley_floquet_stable",
231
+ "kind": "theorem",
232
+ "file": "Taf/RGFlow.lean",
233
+ "line": 290,
234
+ "claim": "|(√17 − 9)/8| < 1 (stable attractor, |μ| < 1)",
235
+ "tactic": "abs_of_neg + linarith with √17 < 5",
236
+ "status": "ok",
237
+ "tags": ["cayley", "stability"],
238
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "line": 178, "label": "STABLE attractor" }
239
+ }
240
+ ]
241
+ },
242
+ {
243
+ "id": "dsage",
244
+ "title": "D-SAGE algebraic identities (Sage Groebner + Lean)",
245
+ "theorems": [
246
+ {
247
+ "name": "D_SAGE_1",
248
+ "kind": "theorem",
249
+ "file": "Taf/Identities.lean",
250
+ "line": 47,
251
+ "claim": "2η² + η·γ_χ + 1 = 0 (★★ CORE quadratic identity)",
252
+ "preconditions": ["γ ≠ 1"],
253
+ "tactic": "field_simp; ring",
254
+ "status": "ok",
255
+ "tags": ["dsage", "core"],
256
+ "source": { "doc": "analysis/sage_recursive_sweep_2026-04-30.sage", "label": "Groebner-discovered" }
257
+ },
258
+ {
259
+ "name": "D_SAGE_2",
260
+ "kind": "theorem",
261
+ "file": "Taf/Identities.lean",
262
+ "line": 56,
263
+ "claim": "β·χ = −1 (Phase A signature, Anti-Ising marker)",
264
+ "preconditions": ["γ ≠ 1"],
265
+ "tactic": "field_simp; ring",
266
+ "status": "ok",
267
+ "tags": ["dsage", "anti_ising", "core"]
268
+ },
269
+ {
270
+ "name": "D_SAGE_4",
271
+ "kind": "theorem",
272
+ "file": "Taf/Identities.lean",
273
+ "line": 65,
274
+ "claim": "α + χ = 2 (Josephson hyperscaling consequence)",
275
+ "preconditions": ["γ ≠ 1"],
276
+ "tactic": "field_simp; ring",
277
+ "status": "ok",
278
+ "tags": ["dsage"]
279
+ },
280
+ {
281
+ "name": "D_SAGE_5",
282
+ "kind": "theorem",
283
+ "file": "Taf/Identities.lean",
284
+ "line": 74,
285
+ "claim": "α + γ_χ = 2(2 − γ) (linear sum identity)",
286
+ "preconditions": ["γ ≠ 1"],
287
+ "tactic": "field_simp; ring",
288
+ "status": "ok",
289
+ "tags": ["dsage"]
290
+ },
291
+ {
292
+ "name": "D_SAGE_7",
293
+ "kind": "theorem",
294
+ "file": "Taf/Identities.lean",
295
+ "line": 182,
296
+ "claim": "c · |ν_imprint| · 2π = 3 (CFT central charge × imprint slope dimensional closure)",
297
+ "tactic": "ring",
298
+ "status": "ok",
299
+ "tags": ["dsage", "imprint"]
300
+ },
301
+ {
302
+ "name": "rushbrooke_tautology",
303
+ "kind": "theorem",
304
+ "file": "Taf/Identities.lean",
305
+ "line": 92,
306
+ "claim": "2β + γ_χ = ν · d at d=1 (Rushbrooke hyperscaling, holds as TAUTOLOGY in TAF since γ_χ defined to satisfy)",
307
+ "preconditions": ["γ ≠ 1"],
308
+ "tactic": "field_simp; ring",
309
+ "status": "ok",
310
+ "tags": ["dsage", "tautology"]
311
+ },
312
+ {
313
+ "name": "josephson_tautology",
314
+ "kind": "theorem",
315
+ "file": "Taf/Identities.lean",
316
+ "line": 101,
317
+ "claim": "2 − α = ν · d at d=1 (Josephson hyperscaling, TAUTOLOGY in TAF)",
318
+ "preconditions": ["γ ≠ 1"],
319
+ "tactic": "field_simp; ring",
320
+ "status": "ok",
321
+ "tags": ["dsage", "tautology"]
322
+ },
323
+ {
324
+ "name": "fisher_zero_iff",
325
+ "kind": "theorem",
326
+ "file": "Taf/Identities.lean",
327
+ "line": 119,
328
+ "claim": "Fisher relation γ_χ = (2 − η)·ν holds iff residual γ(2γ−3)/(1−γ) = 0 (i.e. NEVER in Phase A)",
329
+ "preconditions": ["γ ≠ 1"],
330
+ "tactic": "field_simp; ring",
331
+ "status": "ok",
332
+ "tags": ["dsage", "independent"]
333
+ },
334
+ {
335
+ "name": "beta_chi_closure",
336
+ "kind": "theorem",
337
+ "file": "Taf/Identities.lean",
338
+ "line": 188,
339
+ "claim": "β · χ = −1 (Anti-Ising β=γ−1<0 closure, machine-verified)",
340
+ "preconditions": ["γ ≠ 1"],
341
+ "tactic": "field_simp; ring",
342
+ "status": "ok",
343
+ "tags": ["dsage", "anti_ising", "core"],
344
+ "ui_badge": "anti_ising"
345
+ },
346
+ {
347
+ "name": "nu_beta_id",
348
+ "kind": "theorem",
349
+ "file": "Taf/Identities.lean",
350
+ "line": 197,
351
+ "claim": "ν · β = −1 in Phase A (variant of D-SAGE-2)",
352
+ "preconditions": ["γ ≠ 1"],
353
+ "tactic": "field_simp; ring",
354
+ "status": "ok",
355
+ "tags": ["dsage", "anti_ising"]
356
+ }
357
+ ]
358
+ },
359
+ {
360
+ "id": "audit_findings",
361
+ "title": "Paper-1 audit findings (refutations + erratums)",
362
+ "theorems": [
363
+ {
364
+ "name": "eta_2gamma_residual",
365
+ "kind": "theorem",
366
+ "file": "Taf/Identities.lean",
367
+ "line": 148,
368
+ "claim": "Paper 1 claim η = 2γ has residual (−4γ³ + 5γ + 1)/(1−γ) — NOT identically zero",
369
+ "preconditions": ["γ ≠ 1"],
370
+ "tactic": "field_simp; ring",
371
+ "status": "ok",
372
+ "tags": ["audit_finding", "refutation"]
373
+ },
374
+ {
375
+ "name": "eta_2gamma_fails_phase_A",
376
+ "kind": "theorem",
377
+ "file": "Taf/Identities.lean",
378
+ "line": 156,
379
+ "claim": "η = 2γ fails throughout Phase A (residual > 0 ∀γ ∈ (0,1)) — paper 1 claim formally refuted",
380
+ "preconditions": ["0 < γ", "γ < 1"],
381
+ "tactic": "nlinarith with Phase A bounds",
382
+ "status": "ok",
383
+ "tags": ["audit_finding", "refutation", "substantive"]
384
+ },
385
+ {
386
+ "name": "AM_GM_gamma_chi",
387
+ "kind": "theorem",
388
+ "file": "Taf/AmGmPade.lean",
389
+ "line": 45,
390
+ "claim": "γ_χ = 1/(1−γ) + 2(1−γ) ≥ 2√2 with minimum at γ = 1 − 1/√2 ≈ 0.293",
391
+ "preconditions": ["0 < γ", "γ < 1"],
392
+ "tactic": "AM-GM on positive reals",
393
+ "status": "ok",
394
+ "tags": ["audit_finding", "amgm"]
395
+ }
396
+ ]
397
+ },
398
+ {
399
+ "id": "erratum_cv",
400
+ "title": "C_V coefficient erratum (paper §5.2 — 1/4 → 1/12)",
401
+ "theorems": [
402
+ {
403
+ "name": "log_one_plus_x_coefficient_24",
404
+ "kind": "theorem",
405
+ "file": "Taf/ErratumCV.lean",
406
+ "line": 55,
407
+ "claim": "log(1+x) Taylor coefficient at x²/2: 1/24 in cumulant expansion",
408
+ "tactic": "norm_num",
409
+ "status": "ok",
410
+ "tags": ["erratum"]
411
+ },
412
+ {
413
+ "name": "cv_corrected_at_hagedorn",
414
+ "kind": "theorem",
415
+ "file": "Taf/ErratumCV.lean",
416
+ "line": 93,
417
+ "claim": "C_V at Hagedorn limit = (log L)²/12 (CORRECTED — paper §5.2 had 1/4)",
418
+ "tactic": "field_simp; ring after cumulant identity",
419
+ "status": "ok",
420
+ "tags": ["erratum", "core"]
421
+ },
422
+ {
423
+ "name": "original_is_three_times_corrected",
424
+ "kind": "theorem",
425
+ "file": "Taf/ErratumCV.lean",
426
+ "line": 103,
427
+ "claim": "Paper's original (log L)²/4 = 3 × corrected (log L)²/12 (factor-3 quantification)",
428
+ "tactic": "ring",
429
+ "status": "ok",
430
+ "tags": ["erratum"]
431
+ },
432
+ {
433
+ "name": "original_ne_corrected",
434
+ "kind": "theorem",
435
+ "file": "Taf/ErratumCV.lean",
436
+ "line": 107,
437
+ "claim": "Original ≠ corrected for L ≠ 0 (formal statement of disagreement)",
438
+ "preconditions": ["L ≠ 0"],
439
+ "tactic": "linarith after factor-3 expansion",
440
+ "status": "ok",
441
+ "tags": ["erratum"]
442
+ },
443
+ {
444
+ "name": "cv_hagedorn_correct_coefficient",
445
+ "kind": "theorem",
446
+ "file": "Taf/CvHagedornCorrection.lean",
447
+ "line": 51,
448
+ "claim": "∫(log x)²/x dx from 1 to N = (log N)³ / 3 ⟹ C_V coefficient 1/12 (not 1/4)",
449
+ "preconditions": ["1 ≤ N"],
450
+ "tactic": "integral derivation via log_sq_half + integral_log_div_x",
451
+ "status": "ok",
452
+ "tags": ["erratum", "integral"]
453
+ }
454
+ ]
455
+ },
456
+ {
457
+ "id": "misc",
458
+ "title": "Misc identities + dimensional checks",
459
+ "theorems": [
460
+ {
461
+ "name": "rope_beta_form",
462
+ "kind": "theorem",
463
+ "file": "Taf/RGFlow.lean",
464
+ "line": 189,
465
+ "claim": "RoPE β-form: √3/6 = 1/√12",
466
+ "tactic": "field_simp; nlinarith with √12 = 2√3",
467
+ "status": "ok",
468
+ "tags": ["misc"],
469
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "line": 411 }
470
+ },
471
+ {
472
+ "name": "cft_nu_identity",
473
+ "kind": "theorem",
474
+ "file": "Taf/RGFlow.lean",
475
+ "line": 220,
476
+ "claim": "ν · (1 − γ) = 1 for ν = 1/(1−γ)",
477
+ "preconditions": ["1 − γ ≠ 0"],
478
+ "tactic": "field_simp",
479
+ "status": "ok",
480
+ "tags": ["misc", "cft"],
481
+ "source": { "doc": "FORMULAS_TOOLKIT.md", "section": "§15", "line": 265 }
482
+ },
483
+ {
484
+ "name": "D_14_nu_imprint",
485
+ "kind": "theorem",
486
+ "file": "Taf/Identities.lean",
487
+ "line": 176,
488
+ "claim": "ν_imprint × 2π = −1 (RoPE rotation period × imprint slope dimensional check)",
489
+ "preconditions": ["π > 0"],
490
+ "tactic": "ring",
491
+ "status": "ok",
492
+ "tags": ["imprint", "misc"]
493
+ }
494
+ ]
495
+ }
496
+ ],
497
+ "ui_bindings": {
498
+ "anti_ising_pill": "beta_chi_closure",
499
+ "gamma_pade_panel": "pade_z_substitution",
500
+ "theta_eff_panel": "theta_eff_pade",
501
+ "cardy_delta_h": null,
502
+ "algebraic_consistency_check": ["D_SAGE_1", "D_SAGE_2", "D_SAGE_4", "D_SAGE_5", "rushbrooke_tautology", "josephson_tautology", "beta_chi_closure", "nu_beta_id"],
503
+ "audit_findings_section": ["V_derivative_ne_RG_beta", "eta_2gamma_fails_phase_A", "cv_corrected_at_hagedorn", "trajectory_sign_inversion"],
504
+ "padé_saturation_diagnose": "pade_saturation_leading_coefficient"
505
+ }
506
+ }
index.html CHANGED
@@ -162,6 +162,31 @@
162
 
163
  <p><strong data-i18n="v05.repro.label">Reproducibility</strong> — <span data-i18n="v05.repro.desc">All 15 theorems machine-proof in Lean Mathlib4 (1973 jobs build success). Sage script: <code>analysis/sage_recursive_sweep_2026-04-30.sage</code>. Lean code: <code>lean_taf/taf/Taf/Identities.lean</code>.</span></p>
164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  <h3 data-i18n="help.add_models.title">Adding new models (3 ways)</h3>
166
  <ul>
167
  <li data-i18n="help.add_models.preset"><strong>Preset list</strong>: 11 popular models curated. Just select from dropdown.</li>
@@ -292,27 +317,27 @@
292
  <input type="number" id="profile-T_eval" value="32000" />
293
  </div>
294
  <div class="form-field">
295
- <label data-i18n="param.n_attn">n_attention_heads</label>
296
  <input type="number" id="profile-n_attn" value="32" />
297
  </div>
298
  <div class="form-field">
299
- <label data-i18n="param.n_kv">n_kv_heads</label>
300
  <input type="number" id="profile-n_kv" value="8" />
301
  </div>
302
  <div class="form-field">
303
- <label data-i18n="param.d_head">head_dim</label>
304
  <input type="number" id="profile-d_head" value="128" />
305
  </div>
306
  <div class="form-field">
307
- <label data-i18n="param.n_layers">n_layers</label>
308
  <input type="number" id="profile-n_layers" value="32" />
309
  </div>
310
  <div class="form-field">
311
- <label data-i18n="param.n_params">n_params (e.g. 8e9)</label>
312
  <input type="text" id="profile-n_params" value="8e9" />
313
  </div>
314
  <div class="form-field">
315
- <label data-i18n="param.has_swa">Has SWA?</label>
316
  <select id="profile-has_swa">
317
  <option value="false" selected data-i18n="common.no">No</option>
318
  <option value="true" data-i18n="common.yes">Yes</option>
 
162
 
163
  <p><strong data-i18n="v05.repro.label">Reproducibility</strong> — <span data-i18n="v05.repro.desc">All 15 theorems machine-proof in Lean Mathlib4 (1973 jobs build success). Sage script: <code>analysis/sage_recursive_sweep_2026-04-30.sage</code>. Lean code: <code>lean_taf/taf/Taf/Identities.lean</code>.</span></p>
164
 
165
+ <h3 style="margin-top: 1.5em;" data-i18n="help.v06.title">🆕 v0.6 — γ predicted-vs-observed + Cardy ΔH + Lean badges</h3>
166
+ <p style="opacity: 0.85;" data-i18n="help.v06.intro"><em>v0.6 (2026-05-06): three new diagnostics live in the TAF Card under <strong>🔬 Diagnostics</strong>. All run in your browser; γ_observed comes from the Diagnose CLI on real weights.</em></p>
167
+
168
+ <p><strong data-i18n="help.v06.layout.title">TAF Card layout (new in v0.6)</strong></p>
169
+ <p data-i18n="help.v06.layout.body">After clicking <strong>🚀 Generate full profile</strong> the card shows: a <strong>hero strip</strong> on top (architecture class + meta + 3 pills: aggregate verdict ✅/⚠/❌, γ headline, 🧲 Anti-Ising if Phase A) and four <strong>expandable sections</strong>: <strong>📋 Recipes</strong> (open by default — verdict per dimension), <strong>🔬 Diagnostics</strong> (key numbers, γ predicted vs observed, what-if explorer), <strong>✓ Verification</strong> (Sage+Lean algebraic consistency, falsification F1-F23), <strong>📂 Provenance &amp; share</strong> (calibration audit + JSON download / share link / registry submit). Click any header to expand. Every variable has an inline <strong>ⓘ</strong> tooltip.</p>
170
+
171
+ <p><strong data-i18n="help.v06.gamma_check.title">γ predicted vs observed</strong></p>
172
+ <p data-i18n="help.v06.gamma_check.body">Enter the empirically-measured γ from your model and the tool computes <strong>η = θ_eff_obs / θ_eff_Padé</strong> and classifies into one of 5 regimes:</p>
173
+ <ul style="font-size: 0.92em;">
174
+ <li data-i18n="help.v06.case.normal"><strong>Normal</strong> (η ∈ [0.85, 1.15]) — model uses its full nominal context. <em>Use case</em>: validate a new release before adopting it.</li>
175
+ <li data-i18n="help.v06.case.fraud"><strong>Fraud</strong> (η &lt; 0.01) — nominal θ inflated; model behaves as if θ ≪ advertised. <em>Use case</em>: detect YaRN/marketing inflation (CodeLlama / Mistral-Nemo pattern).</li>
176
+ <li data-i18n="help.v06.case.compressed"><strong>Compressed</strong> (η &lt; 0.5) — context compressed; model attends shorter than nominal θ. <em>Use case</em>: spot RLHF/instruction-tuning compression (LLaMA-2 pattern).</li>
177
+ <li data-i18n="help.v06.case.overpade"><strong>Over-Padé</strong> (η &gt; 1.5) — model attends farther than Padé predicts. <em>Use case</em>: identify Lerch-corrected regime or undertrained early checkpoints (pythia-1b pattern).</li>
178
+ <li data-i18n="help.v06.case.swa"><strong>SWA random-corpus</strong> (γ_obs &gt; 1.05 with random_corpus=Yes) — sliding-window attention signature. <em>Use case</em>: confirm Mistral / Gemma SWA on random tokens.</li>
179
+ </ul>
180
+
181
+ <p><strong data-i18n="help.v06.cardy.title">Cardy ΔH diagnostic</strong></p>
182
+ <p data-i18n="help.v06.cardy.body"><strong>ΔH_Cardy = log(θ_eff_obs / θ_nominal)</strong>. Entropy shift between observed effective θ and nominal θ. Strong negative = compression entropy; near zero = nominal match. Complements η for borderline cases.</p>
183
+
184
+ <p><strong data-i18n="help.v06.lean.title">Lean + Mathlib verification badges</strong></p>
185
+ <p data-i18n="help.v06.lean.body">TAF identities (Anti-Ising, D-SAGE-1 quadratic, Padé z-substitution, etc.) are formally machine-proven in Lean Mathlib4. Source: <a href="https://github.com/karlesmarin/lean-taf" target="_blank">github.com/karlesmarin/lean-taf</a>. Anyone can clone + <code>lake build</code> to re-verify. The 🧲 Anti-Ising pill in the hero strip is one such badge.</p>
186
+
187
+ <p><strong data-i18n="help.v06.glossary.title">Variable glossary (also embedded in TAF Card)</strong></p>
188
+ <p data-i18n="help.v06.glossary.body">Every variable in the TAF Card has an inline ⓘ tooltip. The complete list: γ, γ_Padé, γ_decomposed, γ_observed, θ, θ_eff_obs, θ_eff_Padé, η, ΔH_Cardy, χ, d_horizon, L_NIAH, KV memory, regime. Hover any ⓘ for the definition + paper section.</p>
189
+
190
  <h3 data-i18n="help.add_models.title">Adding new models (3 ways)</h3>
191
  <ul>
192
  <li data-i18n="help.add_models.preset"><strong>Preset list</strong>: 11 popular models curated. Just select from dropdown.</li>
 
317
  <input type="number" id="profile-T_eval" value="32000" />
318
  </div>
319
  <div class="form-field">
320
+ <label><span data-i18n="param.n_attn">n_attention_heads</span> <span class="info"><span class="tooltip" data-i18n="param.n_attn.tip">Number of attention heads per layer. From <code>num_attention_heads</code>.</span></span></label>
321
  <input type="number" id="profile-n_attn" value="32" />
322
  </div>
323
  <div class="form-field">
324
+ <label><span data-i18n="param.n_kv">n_kv_heads</span> <span class="info"><span class="tooltip" data-i18n="param.n_kv.tip">KV heads. If &lt; n_attention_heads → GQA (Grouped Query Attention). Reduces KV memory but pushes γ toward Hagedorn.</span></span></label>
325
  <input type="number" id="profile-n_kv" value="8" />
326
  </div>
327
  <div class="form-field">
328
+ <label><span data-i18n="param.d_head">head_dim</span> <span class="info"><span class="tooltip" data-i18n="param.d_head.tip">Per-head dimension. Typical 64, 96, 128. From <code>head_dim</code> or <code>hidden_size / num_attention_heads</code>.</span></span></label>
329
  <input type="number" id="profile-d_head" value="128" />
330
  </div>
331
  <div class="form-field">
332
+ <label><span data-i18n="param.n_layers">n_layers</span> <span class="info"><span class="tooltip" data-i18n="param.n_layers.tip">Number of transformer blocks. From <code>num_hidden_layers</code>.</span></span></label>
333
  <input type="number" id="profile-n_layers" value="32" />
334
  </div>
335
  <div class="form-field">
336
+ <label><span data-i18n="param.n_params">n_params (e.g. 8e9)</span> <span class="info"><span class="tooltip" data-i18n="param.n_params.tip">Total parameter count. Threshold ~400M for induction-head emergence. Affects KV memory and budget recipes.</span></span></label>
337
  <input type="text" id="profile-n_params" value="8e9" />
338
  </div>
339
  <div class="form-field">
340
+ <label><span data-i18n="param.has_swa">Has SWA?</span> <span class="info"><span class="tooltip" data-i18n="param.has_swa.tip">Sliding Window Attention. <code>true</code> for Mistral, gemma-2, phi-3. Calibration audit (v0.5.3) disabled the historical δ_SWA correction (n=1 fit).</span></span></label>
341
  <select id="profile-has_swa">
342
  <option value="false" selected data-i18n="common.no">No</option>
343
  <option value="true" data-i18n="common.yes">Yes</option>
js/gamma_check.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // γ predicted-vs-observed diagnostic — Padé closed-form + regime classifier.
2
+ // Pure functions ported from tools/taf/diagnose/gamma_check.py.
3
+ // All math is browser-only (no backend, no Python).
4
+
5
+ const SQRT2 = Math.SQRT2;
6
+
7
+ export function gammaPade(theta, T) {
8
+ if (!Number.isFinite(theta) || theta <= 0 || !Number.isFinite(T) || T < 0) return NaN;
9
+ const z = (T * SQRT2) / theta;
10
+ return (2 - z) / (2 + z);
11
+ }
12
+
13
+ export function thetaEffPade(theta, T) {
14
+ if (!Number.isFinite(theta) || !Number.isFinite(T)) return NaN;
15
+ return theta + T / SQRT2;
16
+ }
17
+
18
+ export function thetaEffObserved(gObs, T) {
19
+ if (!Number.isFinite(gObs) || !Number.isFinite(T) || T < 0) return NaN;
20
+ if (Math.abs(1 - gObs) < 1e-12) return Infinity;
21
+ return (T * SQRT2) / (1 - gObs);
22
+ }
23
+
24
+ export function efficiency(thEffObs, thEffPade) {
25
+ if (!Number.isFinite(thEffObs) || !Number.isFinite(thEffPade) || thEffPade === 0) return NaN;
26
+ return thEffObs / thEffPade;
27
+ }
28
+
29
+ export function deltaHCardy(thEffObs, thetaNominal) {
30
+ if (!Number.isFinite(thEffObs) || thEffObs <= 0) return NaN;
31
+ if (!Number.isFinite(thetaNominal) || thetaNominal <= 0) return NaN;
32
+ return Math.log(thEffObs / thetaNominal);
33
+ }
34
+
35
+ export function classifyRegime(eff, gObs, isRandom) {
36
+ if (!Number.isFinite(gObs)) return "unknown";
37
+ if (gObs > 1.05) return isRandom ? "swa" : "unknown";
38
+ if (!Number.isFinite(eff)) return "unknown";
39
+ if (eff < 0.01) return "fraud";
40
+ if (eff < 0.50) return "compressed";
41
+ if (eff > 1.50) return "overpade";
42
+ if (eff >= 0.85 && eff <= 1.15) return "normal";
43
+ return "unknown";
44
+ }
45
+
46
+ export function gammaCheckAll({ theta, T, gObs, isRandom }) {
47
+ const gPade = gammaPade(theta, T);
48
+ const thEffPade = thetaEffPade(theta, T);
49
+ const thEffObs = thetaEffObserved(gObs, T);
50
+ const eff = efficiency(thEffObs, thEffPade);
51
+ const dH = deltaHCardy(thEffObs, theta);
52
+ const regime = classifyRegime(eff, gObs, !!isRandom);
53
+ return {
54
+ gammaPade: gPade,
55
+ thetaEffPade: thEffPade,
56
+ thetaEffObs: thEffObs,
57
+ efficiency: eff,
58
+ deltaHCardy: dH,
59
+ regime,
60
+ };
61
+ }
62
+
63
+ export const REGIME_META = {
64
+ normal: { emoji: "✅", cls: "v-yes" },
65
+ fraud: { emoji: "🚨", cls: "v-no" },
66
+ compressed: { emoji: "📉", cls: "v-deg" },
67
+ overpade: { emoji: "📈", cls: "v-deg" },
68
+ swa: { emoji: "🪟", cls: "v-deg" },
69
+ unknown: { emoji: "❓", cls: "v-deg" },
70
+ };
js/i18n.js CHANGED
@@ -121,9 +121,18 @@ export const TRANSLATIONS = {
121
  "falsification.col.evidence": "Evidence",
122
 
123
  "tafcard.title": "📇 TAF Card — full model profile",
124
- "tafcard.recipes_title": "📋 Recipes (verdict per dimension)",
 
125
  "tafcard.numbers_title": "🔢 Key numbers (paper §26)",
126
- "tafcard.fals_title": "🔬 Falsification status (FALSIFICATION.md F1-F23)",
 
 
 
 
 
 
 
 
127
 
128
  "compare.title_out": "🆚 Comparison Table",
129
 
@@ -147,12 +156,18 @@ export const TRANSLATIONS = {
147
  "param.T_train.tip": "<strong>Max training context</strong>. From <code>max_position_embeddings</code>. Beyond this is extrapolation.",
148
  "param.T_eval": "T_eval (your target)",
149
  "param.T_eval.tip": "<strong>Your target inference context</strong>. The whole question is: will the model behave well at THIS length?",
150
- "param.n_attn": "num_attention_heads",
151
- "param.n_kv": "num_key_value_heads",
 
 
152
  "param.d_head": "head_dim",
153
- "param.n_layers": "num_hidden_layers",
 
 
154
  "param.n_params": "n_params (e.g. 8e9)",
 
155
  "param.has_swa": "Has SWA?",
 
156
  "common.yes": "Yes",
157
  "common.no": "No",
158
 
@@ -272,6 +287,92 @@ export const TRANSLATIONS = {
272
  "v053.calibration.title": "🔬 v0.5.3 — Calibration audit (2026-05-02)",
273
  "v053.calibration.note": "<strong>SWA correction disabled</strong> — original δ_SWA = -0.21 was fit on n=1 model (insufficient data; group-mean +0.355 with single yes-case). <strong>post_IH correction marked exploratory</strong> — group-mean ≈ 0 in re-audit (n=22 panel) does not replicate the OLS fit. <strong>GQA correction replicates</strong> (panel +0.115 vs hardcoded +0.11). <strong>D_f formula corrected for Phase B (γ&gt;1)</strong> — uses discrete cumulative sum instead of continuum approximation. LLaMA-3, Mistral, Gemma now report correct compression values.",
274
  "v053.release.banner": "🔧 v0.5.3 — Audit-driven fixes: KV compression D_f now uses discrete sum (correct for all γ); δ_SWA disabled (n=1 calibration); paper §5.2 C_V coefficient erratum (1/4 → 1/12).",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
  },
276
 
277
  // ────────────────────────────────────────────────────────────────────────
@@ -328,6 +429,92 @@ export const TRANSLATIONS = {
328
  "v053.calibration.note": "<strong>Corrección SWA desactivada</strong> — δ_SWA = -0.21 original se ajustó con n=1 modelo (datos insuficientes; promedio del único caso +0.355). <strong>Corrección post_IH marcada exploratoria</strong> — promedio de grupo ≈ 0 en re-auditoría (panel n=22) no replica el ajuste OLS. <strong>Corrección GQA replica</strong> (panel +0.115 vs hardcoded +0.11). <strong>Fórmula D_f corregida para Fase B (γ&gt;1)</strong> — usa suma cumulativa discreta en lugar de aproximación continua. LLaMA-3, Mistral, Gemma ahora reportan valores correctos de compresión.",
329
  "v053.release.banner": "🔧 v0.5.3 — Correcciones por audit: D_f de compresión KV ahora usa suma discreta (correcto para todo γ); δ_SWA desactivado (calibración n=1); erratum coeficiente C_V paper §5.2 (1/4 → 1/12).",
330
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  "hero.title": "🔬 TAF Agent",
332
  "hero.tagline": "Prueba <strong>CUALQUIER</strong> LLM transformer antes de gastar GPU/€.",
333
  "hero.subtitle": "Todo el cómputo corre localmente en tu navegador. Gratis. Sin límites. Auditable.",
@@ -438,9 +625,18 @@ export const TRANSLATIONS = {
438
  "falsification.col.evidence": "Evidencia",
439
 
440
  "tafcard.title": "📇 TAF Card — perfil completo del modelo",
441
- "tafcard.recipes_title": "📋 Recetas (veredicto por dimensión)",
 
442
  "tafcard.numbers_title": "🔢 Números clave (paper §26)",
443
- "tafcard.fals_title": "🔬 Estado de falsificación (FALSIFICATION.md F1-F23)",
 
 
 
 
 
 
 
 
444
 
445
  "compare.title_out": "🆚 Tabla comparativa",
446
 
@@ -464,12 +660,18 @@ export const TRANSLATIONS = {
464
  "param.T_train.tip": "<strong>Contexto máximo de entrenamiento</strong>. De <code>max_position_embeddings</code>. Más allá es extrapolación.",
465
  "param.T_eval": "T_eval (tu objetivo)",
466
  "param.T_eval.tip": "<strong>Tu contexto de inferencia objetivo</strong>. La pregunta clave: ¿se comportará bien el modelo a ESTA longitud?",
467
- "param.n_attn": "num_attention_heads",
468
- "param.n_kv": "num_key_value_heads",
 
 
469
  "param.d_head": "head_dim",
470
- "param.n_layers": "num_hidden_layers",
 
 
471
  "param.n_params": "n_params (ej. 8e9)",
 
472
  "param.has_swa": "¿Tiene SWA?",
 
473
  "common.yes": "Sí",
474
  "common.no": "No",
475
 
@@ -595,6 +797,92 @@ export const TRANSLATIONS = {
595
  "v053.calibration.note": "<strong>Correction SWA désactivée</strong> — δ_SWA = -0.21 d'origine était calibrée sur n=1 modèle (données insuffisantes ; moyenne du cas unique +0.355). <strong>Correction post_IH marquée exploratoire</strong> — moyenne de groupe ≈ 0 en ré-audit (panel n=22) ne réplique pas l'ajustement OLS. <strong>Correction GQA réplique</strong> (panel +0.115 vs hardcoded +0.11). <strong>Formule D_f corrigée pour Phase B (γ&gt;1)</strong> — utilise une somme cumulative discrète au lieu d'une approximation continue. LLaMA-3, Mistral, Gemma rapportent maintenant des valeurs de compression correctes.",
596
  "v053.release.banner": "🔧 v0.5.3 — Corrections issues d'audit : D_f de compression KV utilise maintenant la somme discrète (correct pour tout γ) ; δ_SWA désactivé (calibrage n=1) ; erratum du coefficient C_V paper §5.2 (1/4 → 1/12).",
597
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
598
  "hero.title": "🔬 TAF Agent",
599
  "hero.tagline": "Testez <strong>N'IMPORTE QUEL</strong> LLM transformer avant de dépenser du GPU/€.",
600
  "hero.subtitle": "Tout le calcul s'exécute localement dans votre navigateur. Gratuit. Illimité. Auditable.",
@@ -705,9 +993,18 @@ export const TRANSLATIONS = {
705
  "falsification.col.evidence": "Preuve",
706
 
707
  "tafcard.title": "📇 TAF Card — profil complet du modèle",
708
- "tafcard.recipes_title": "📋 Recettes (verdict par dimension)",
 
709
  "tafcard.numbers_title": "🔢 Nombres clés (paper §26)",
710
- "tafcard.fals_title": "🔬 État de falsification (FALSIFICATION.md F1-F23)",
 
 
 
 
 
 
 
 
711
 
712
  "compare.title_out": "🆚 Tableau comparatif",
713
 
@@ -731,12 +1028,18 @@ export const TRANSLATIONS = {
731
  "param.T_train.tip": "<strong>Contexte max d'entraînement</strong>. De <code>max_position_embeddings</code>. Au-delà c'est de l'extrapolation.",
732
  "param.T_eval": "T_eval (votre cible)",
733
  "param.T_eval.tip": "<strong>Votre contexte d'inférence cible</strong>. La question clé : le modèle se comportera-t-il bien à CETTE longueur ?",
734
- "param.n_attn": "num_attention_heads",
735
- "param.n_kv": "num_key_value_heads",
 
 
736
  "param.d_head": "head_dim",
737
- "param.n_layers": "num_hidden_layers",
 
 
738
  "param.n_params": "n_params (ex. 8e9)",
 
739
  "param.has_swa": "A SWA ?",
 
740
  "common.yes": "Oui",
741
  "common.no": "Non",
742
 
@@ -862,6 +1165,92 @@ export const TRANSLATIONS = {
862
  "v053.calibration.note": "<strong>SWA 修正已禁用</strong> — 原 δ_SWA = -0.21 基于 n=1 模型拟合(数据不足;唯一案例的均值为 +0.355)。<strong>post_IH 修正标记为探索性</strong> — 重审中组均值 ≈ 0(n=22 面板)未能复现 OLS 拟合。<strong>GQA 修正可复现</strong>(面板 +0.115 vs 硬编码 +0.11)。<strong>D_f 公式修正 Phase B (γ&gt;1)</strong> — 使用离散累积和代替连续近似。LLaMA-3、Mistral、Gemma 现在报告正确的压缩值。",
863
  "v053.release.banner": "🔧 v0.5.3 — 审计驱动的修复:KV 压缩 D_f 现使用离散和(适用于所有 γ);δ_SWA 禁用(n=1 校准);论文 §5.2 C_V 系数勘误 (1/4 → 1/12)。",
864
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
865
  "hero.title": "🔬 TAF Agent",
866
  "hero.tagline": "在花费 GPU/$ 之前,测试<strong>任意</strong> Transformer LLM。",
867
  "hero.subtitle": "所有计算在您的浏览器本地运行。免费。无限制。可审计。",
@@ -972,9 +1361,18 @@ export const TRANSLATIONS = {
972
  "falsification.col.evidence": "证据",
973
 
974
  "tafcard.title": "📇 TAF 卡 — 完整模型画像",
975
- "tafcard.recipes_title": "📋 配方(每个维度判定)",
 
976
  "tafcard.numbers_title": "🔢 关键数字 (paper §26)",
977
- "tafcard.fals_title": "🔬 可证伪状态 (FALSIFICATION.md F1-F23)",
 
 
 
 
 
 
 
 
978
 
979
  "compare.title_out": "🆚 比较表",
980
 
@@ -998,12 +1396,18 @@ export const TRANSLATIONS = {
998
  "param.T_train.tip": "<strong>训练最大上下文</strong>。来自 <code>max_position_embeddings</code>。超出此范围属于外推。",
999
  "param.T_eval": "T_eval (您的目标)",
1000
  "param.T_eval.tip": "<strong>您的目标推理上下文</strong>。关键问题: 模型在 <em>这个</em> 长度下表现是否良好?",
1001
- "param.n_attn": "num_attention_heads",
1002
- "param.n_kv": "num_key_value_heads",
 
 
1003
  "param.d_head": "head_dim",
1004
- "param.n_layers": "num_hidden_layers",
 
 
1005
  "param.n_params": "n_params (例如 8e9)",
 
1006
  "param.has_swa": "有 SWA 吗?",
 
1007
  "common.yes": "是",
1008
  "common.no": "否",
1009
 
 
121
  "falsification.col.evidence": "Evidence",
122
 
123
  "tafcard.title": "📇 TAF Card — full model profile",
124
+ "tafcard.recipes_title": "📋 Recipes verdict per dimension",
125
+ "tafcard.recipes_count_label": "dimensions",
126
  "tafcard.numbers_title": "🔢 Key numbers (paper §26)",
127
+ "tafcard.fals_title": "🔬 Falsification status (F1-F23)",
128
+ "tafcard.fals_none": "No falsifications applicable.",
129
+ "tafcard.diag_title": "🔬 Diagnostics — numbers · γ check · what-if",
130
+ "tafcard.verify_title": "✓ Verification — Lean + Sage + falsification",
131
+ "tafcard.share_title": "📂 Provenance & share",
132
+ "tafcard.whatif_title": "🎚️ What-if explorer",
133
+ "verdict.go": "GO",
134
+ "verdict.no": "NO",
135
+ "verdict.degraded": "DEGRADED",
136
 
137
  "compare.title_out": "🆚 Comparison Table",
138
 
 
156
  "param.T_train.tip": "<strong>Max training context</strong>. From <code>max_position_embeddings</code>. Beyond this is extrapolation.",
157
  "param.T_eval": "T_eval (your target)",
158
  "param.T_eval.tip": "<strong>Your target inference context</strong>. The whole question is: will the model behave well at THIS length?",
159
+ "param.n_attn": "n_attention_heads",
160
+ "param.n_attn.tip": "<strong>Number of attention heads</strong> per layer. From <code>num_attention_heads</code>.",
161
+ "param.n_kv": "n_kv_heads",
162
+ "param.n_kv.tip": "<strong>KV heads</strong>. If &lt; n_attention_heads → GQA (Grouped Query Attention). Reduces KV memory but pushes γ toward Hagedorn.",
163
  "param.d_head": "head_dim",
164
+ "param.d_head.tip": "<strong>Per-head dimension</strong>. Typical 64, 96, 128. From <code>head_dim</code> or <code>hidden_size / num_attention_heads</code>.",
165
+ "param.n_layers": "n_layers",
166
+ "param.n_layers.tip": "<strong>Number of transformer blocks</strong>. From <code>num_hidden_layers</code>.",
167
  "param.n_params": "n_params (e.g. 8e9)",
168
+ "param.n_params.tip": "<strong>Total parameter count</strong>. Threshold ~400M for induction-head emergence. Affects KV memory and budget recipes.",
169
  "param.has_swa": "Has SWA?",
170
+ "param.has_swa.tip": "<strong>Sliding Window Attention</strong>. <code>true</code> for Mistral, gemma-2, phi-3. v0.5.3 calibration audit disabled the historical δ_SWA correction (n=1 fit).",
171
  "common.yes": "Yes",
172
  "common.no": "No",
173
 
 
287
  "v053.calibration.title": "🔬 v0.5.3 — Calibration audit (2026-05-02)",
288
  "v053.calibration.note": "<strong>SWA correction disabled</strong> — original δ_SWA = -0.21 was fit on n=1 model (insufficient data; group-mean +0.355 with single yes-case). <strong>post_IH correction marked exploratory</strong> — group-mean ≈ 0 in re-audit (n=22 panel) does not replicate the OLS fit. <strong>GQA correction replicates</strong> (panel +0.115 vs hardcoded +0.11). <strong>D_f formula corrected for Phase B (γ&gt;1)</strong> — uses discrete cumulative sum instead of continuum approximation. LLaMA-3, Mistral, Gemma now report correct compression values.",
289
  "v053.release.banner": "🔧 v0.5.3 — Audit-driven fixes: KV compression D_f now uses discrete sum (correct for all γ); δ_SWA disabled (n=1 calibration); paper §5.2 C_V coefficient erratum (1/4 → 1/12).",
290
+
291
+ // §35 v0.6 — γ predicted-vs-observed diagnostic
292
+ "gamma_check.title": "🔍 γ predicted vs observed",
293
+ "gamma_check.desc": "Enter your empirically measured γ. Tool detects regime: fraud (θ inflated) / compressed / over-Padé / SWA-random / normal.",
294
+ "gamma_check.gobs_label": "γ_observed",
295
+ "gamma_check.gobs_tip": "Empirically measured γ from your model's attention scores. Use the Diagnose CLI to obtain this from real weights.",
296
+ "gamma_check.random_label": "Random corpus?",
297
+ "gamma_check.random_tip": "Tick if γ_observed was measured on random/unstructured tokens. Distinguishes SWA signature (γ_obs > 1) from anomaly.",
298
+ "gamma_check.regime": "Regime",
299
+ "gamma_check.regime.normal": "Normal",
300
+ "gamma_check.regime.fraud": "Fraud (θ inflated)",
301
+ "gamma_check.regime.compressed": "Compressed context",
302
+ "gamma_check.regime.overpade": "Over-Padé",
303
+ "gamma_check.regime.swa": "SWA random-corpus signature",
304
+ "gamma_check.regime.unknown": "Unknown",
305
+ "gamma_check.regime.normal.desc": "η ∈ [0.85, 1.15]: model uses its full nominal context, no anomaly.",
306
+ "gamma_check.regime.fraud.desc": "η < 0.01: nominal θ inflated. Model behaves as if θ ≪ advertised. Likely YaRN/marketing inflation without true context extension.",
307
+ "gamma_check.regime.compressed.desc":"η ∈ [0.01, 0.5): context is compressed (model attends less far than nominal θ predicts). Common in instruction-tuned / RLHF models.",
308
+ "gamma_check.regime.overpade.desc": "η > 1.5: model attends farther than Padé predicts. Possible Lerch-corrected regime or undertrained early-checkpoint.",
309
+ "gamma_check.regime.swa.desc": "γ_obs > 1.05 on random corpus = sliding-window attention signature (Mistral / Gemma family).",
310
+ "gamma_check.regime.unknown.desc": "Inputs out of range or γ_obs > 1 without random-corpus flag. Verify measurement.",
311
+ "gamma_check.glossary.title": "ⓘ Glossary — what these variables mean",
312
+ "gamma_check.glossary.gamma_pade": "<strong>γ_Padé</strong>: closed-form prediction (2−z)/(2+z), z = T√2/θ. Paper §sec:gamma_decomposition.",
313
+ "gamma_check.glossary.gamma_obs": "<strong>γ_observed</strong>: empirically measured from your model's attention scores (run the Diagnose CLI on real weights).",
314
+ "gamma_check.glossary.theta_eff_obs":"<strong>θ_eff (observed)</strong>: inverted from γ_obs via T√2 / (1 − γ_obs). Effective θ implied by your measurement.",
315
+ "gamma_check.glossary.theta_eff_pade":"<strong>θ_eff (Padé)</strong>: θ + T/√2. Effective θ predicted by closed-form.",
316
+ "gamma_check.glossary.efficiency": "<strong>η</strong>: ratio θ_eff_obs / θ_eff_Padé. ≈1 = normal · &lt;0.01 = fraud · &lt;0.5 = compressed · &gt;1.5 = over-Padé.",
317
+ "gamma_check.glossary.delta_h": "<strong>ΔH_Cardy</strong>: log(θ_eff_obs / θ_nominal). Cardy entropy shift. Negative = compression entropy. ~0 = nominal match.",
318
+ "gamma_check.glossary.regime": "<strong>Regime</strong>: automatic classifier from η + γ_obs + random_corpus flag.",
319
+
320
+ // §36 v0.6 — Tooltips for inline ⓘ icons (per-variable explanations)
321
+ "tooltip.gamma_pade": "<strong>γ_Padé(T_eval)</strong>: closed-form prediction (2−z)/(2+z), z = T√2/θ. Paper §sec:gamma_decomposition.",
322
+ "tooltip.gamma_decomposed": "<strong>γ_decomposed</strong>: γ from full architectural decomposition. Padé baseline + GQA shift + post-IH shift (calibrated audit-replicated subset).",
323
+ "tooltip.d_horizon": "<strong>d_horizon</strong>: effective attention horizon. Beyond this position, scores fall below noise floor (paper §26).",
324
+ "tooltip.L_NIAH": "<strong>L_NIAH ceiling</strong>: predicted ceiling for needle-in-a-haystack retrieval reliability at current d_horizon.",
325
+ "tooltip.chi": "<strong>χ susceptibility</strong>: χ = 1/(1−γ). Diverges at the Hagedorn line γ=1.",
326
+ "tooltip.kv_memory": "<strong>KV memory @ T_eval (BF16)</strong>: per-request KV cache = 2 · n_layers · n_kv_heads · d_head · T_eval bytes.",
327
+ "tooltip.theta_eff_obs": "<strong>θ_eff (observed)</strong>: effective θ implied by your γ_observed: T√2 / (1 − γ_obs).",
328
+ "tooltip.theta_eff_pade": "<strong>θ_eff (Padé)</strong>: effective θ predicted by closed-form: θ + T/√2.",
329
+ "tooltip.efficiency": "<strong>η = θ_eff_obs / θ_eff_Padé</strong>: efficiency ratio. ≈1 = normal · &lt;0.01 = fraud · &lt;0.5 = compressed · &gt;1.5 = over-Padé.",
330
+ "tooltip.delta_h_cardy": "<strong>ΔH_Cardy</strong>: log(θ_eff_obs / θ_nominal). Cardy entropy shift. Negative = compression entropy. ~0 = nominal match.",
331
+ "tooltip.verdict_aggregate": "<strong>Verdict</strong>: worst-of across all recipes. ✅ GO = all green · ⚠ DEGRADED = ≥1 yellow · ❌ NO = ≥1 red.",
332
+ "tooltip.verdict_breakdown": "<strong>Per-recipe breakdown</strong>: each recipe tests an <em>independent</em> decision axis (long-context · budget · hardware · custom-vs-API · KV-compression). A ❌ on X-1 means \"use the API for your volume\" not \"the model fails\" — open the Recipes section for per-axis context.",
333
+ "tooltip.gamma_pill": "<strong>γ headline</strong>: γ_decomposed (or γ_Padé fallback). Range (0,1) = Phase A (anti-Ising). γ ≥ 1 = Hagedorn / Phase B.",
334
+ "tooltip.anti_ising": "<strong>Anti-Ising class</strong>: Phase A → β = γ−1 &lt; 0. Machine-verified (Sage + Lean Mathlib4). See §35 v0.5.",
335
+
336
+ // §37 v0.6 — Lean+Mathlib theorem table
337
+ "lean.table.title": "📑 Lean+Mathlib theorem table",
338
+ "lean.table.desc": "Every entry below is machine-proven against Lean 4 + Mathlib4. Click any L# link to jump to the source line on GitHub. Grouped by topic — click a header to expand.",
339
+ "lean.table.theorem": "Theorem",
340
+ "lean.table.claim": "Claim",
341
+ "lean.table.tactic": "Tactic",
342
+ "lean.table.source": "Source",
343
+ "lean.table.lean": "Lean",
344
+ "lean.findings.title": "🔎 Substantive findings",
345
+ "lean.findings.detected_by": "Detected by",
346
+ "lean.findings.fixed_by": "Fixed by",
347
+ "lean.findings.recommendation":"Recommendation",
348
+ "lean.meta.repo": "Repo",
349
+ "lean.meta.build": "Build",
350
+ "lean.meta.theorems": "Theorems",
351
+ "lean.meta.verified": "verified",
352
+ "lean.meta.rejected": "rejected",
353
+ "lean.meta.sorry": "sorry",
354
+ "lean.meta.findings": "substantive findings",
355
+ "lean.manifest.loading": "Loading Lean manifest…",
356
+ "lean.manifest.error": "Lean manifest unavailable",
357
+
358
+ // Help modal — v0.6 section
359
+ "help.v06.title": "🆕 v0.6 — γ predicted-vs-observed + Cardy ΔH + Lean badges",
360
+ "help.v06.intro": "<em>v0.6 (2026-05-06): three new diagnostics live in the TAF Card under <strong>🔬 Diagnostics</strong>. All run in your browser; γ_observed comes from the Diagnose CLI on real weights.</em>",
361
+ "help.v06.layout.title": "TAF Card layout (new in v0.6)",
362
+ "help.v06.layout.body": "After clicking <strong>🚀 Generate full profile</strong> the card shows: a <strong>hero strip</strong> on top (architecture class + meta + 3 pills: aggregate verdict ✅/⚠/❌, γ headline, 🧲 Anti-Ising if Phase A) and four <strong>expandable sections</strong>: <strong>📋 Recipes</strong> (open by default — verdict per dimension), <strong>🔬 Diagnostics</strong> (key numbers, γ predicted vs observed, what-if explorer), <strong>✓ Verification</strong> (Sage+Lean algebraic consistency, falsification F1-F23), <strong>📂 Provenance &amp; share</strong> (calibration audit + JSON download / share link / registry submit). Click any header to expand. Every variable has an inline <strong>ⓘ</strong> tooltip.",
363
+ "help.v06.gamma_check.title": "γ predicted vs observed",
364
+ "help.v06.gamma_check.body": "Enter the empirically-measured γ from your model and the tool computes <strong>η = θ_eff_obs / θ_eff_Padé</strong> and classifies into one of 5 regimes:",
365
+ "help.v06.case.normal": "<strong>Normal</strong> (η ∈ [0.85, 1.15]) — model uses its full nominal context. <em>Use case</em>: validate a new release before adopting it.",
366
+ "help.v06.case.fraud": "<strong>Fraud</strong> (η &lt; 0.01) — nominal θ inflated; model behaves as if θ ≪ advertised. <em>Use case</em>: detect YaRN/marketing inflation (CodeLlama / Mistral-Nemo pattern).",
367
+ "help.v06.case.compressed": "<strong>Compressed</strong> (η &lt; 0.5) — context compressed; model attends shorter than nominal θ. <em>Use case</em>: spot RLHF/instruction-tuning compression (LLaMA-2 pattern).",
368
+ "help.v06.case.overpade": "<strong>Over-Padé</strong> (η &gt; 1.5) — model attends farther than Padé predicts. <em>Use case</em>: identify Lerch-corrected regime or undertrained early checkpoints (pythia-1b pattern).",
369
+ "help.v06.case.swa": "<strong>SWA random-corpus</strong> (γ_obs &gt; 1.05 with random_corpus=Yes) — sliding-window attention signature. <em>Use case</em>: confirm Mistral / Gemma SWA on random tokens.",
370
+ "help.v06.cardy.title": "Cardy ΔH diagnostic",
371
+ "help.v06.cardy.body": "<strong>ΔH_Cardy = log(θ_eff_obs / θ_nominal)</strong>. Entropy shift between observed effective θ and nominal θ. Strong negative = compression entropy; near zero = nominal match. Complements η for borderline cases.",
372
+ "help.v06.lean.title": "Lean + Mathlib verification badges",
373
+ "help.v06.lean.body": "TAF identities are formally machine-proven in Lean Mathlib4: <strong>37 theorems</strong> in 7 groups (Padé, RG flow, Cayley, D-SAGE, audit findings, erratum CV, misc) + <strong>1 substantive finding</strong> (V-derivative factor-2, theorem <code>V_derivative_ne_RG_beta</code>). Source: <a href=\"https://github.com/karlesmarin/lean-taf\" target=\"_blank\">github.com/karlesmarin/lean-taf</a> (commit 25c77fd). Re-verify locally: <code>git clone --depth=1 https://github.com/karlesmarin/lean-taf &amp;&amp; cd lean-taf &amp;&amp; lake exe cache get &amp;&amp; lake env lean Taf/Identities.lean</code>. The 🧲 Anti-Ising pill in the hero strip and the Verification accordion link to specific source lines.",
374
+ "help.v06.glossary.title": "Variable glossary (also embedded in TAF Card)",
375
+ "help.v06.glossary.body": "Every variable in the TAF Card has an inline ⓘ tooltip. The complete list: γ, γ_Padé, γ_decomposed, γ_observed, θ, θ_eff_obs, θ_eff_Padé, η, ΔH_Cardy, χ, d_horizon, L_NIAH, KV memory, regime. Hover any ⓘ for the definition + paper section.",
376
  },
377
 
378
  // ────────────────────────────────────────────────────────────────────────
 
429
  "v053.calibration.note": "<strong>Corrección SWA desactivada</strong> — δ_SWA = -0.21 original se ajustó con n=1 modelo (datos insuficientes; promedio del único caso +0.355). <strong>Corrección post_IH marcada exploratoria</strong> — promedio de grupo ≈ 0 en re-auditoría (panel n=22) no replica el ajuste OLS. <strong>Corrección GQA replica</strong> (panel +0.115 vs hardcoded +0.11). <strong>Fórmula D_f corregida para Fase B (γ&gt;1)</strong> — usa suma cumulativa discreta en lugar de aproximación continua. LLaMA-3, Mistral, Gemma ahora reportan valores correctos de compresión.",
430
  "v053.release.banner": "🔧 v0.5.3 — Correcciones por audit: D_f de compresión KV ahora usa suma discreta (correcto para todo γ); δ_SWA desactivado (calibración n=1); erratum coeficiente C_V paper §5.2 (1/4 → 1/12).",
431
 
432
+ // §35 v0.6 — Diagnóstico γ predicho vs observado
433
+ "gamma_check.title": "🔍 γ predicho vs observado",
434
+ "gamma_check.desc": "Introduce tu γ medido empíricamente. La herramienta detecta el régimen: fraude (θ inflado) / comprimido / sobre-Padé / SWA-aleatorio / normal.",
435
+ "gamma_check.gobs_label": "γ_observado",
436
+ "gamma_check.gobs_tip": "γ medido empíricamente desde los attention scores de tu modelo. Usa la CLI de Diagnose para obtenerlo desde pesos reales.",
437
+ "gamma_check.random_label": "¿Corpus aleatorio?",
438
+ "gamma_check.random_tip": "Marca sí si γ_observado se midió sobre tokens aleatorios/no estructurados. Distingue la firma SWA (γ_obs > 1) de una anomalía.",
439
+ "gamma_check.regime": "Régimen",
440
+ "gamma_check.regime.normal": "Normal",
441
+ "gamma_check.regime.fraud": "Fraude (θ inflado)",
442
+ "gamma_check.regime.compressed": "Contexto comprimido",
443
+ "gamma_check.regime.overpade": "Sobre-Padé",
444
+ "gamma_check.regime.swa": "Firma SWA (corpus aleatorio)",
445
+ "gamma_check.regime.unknown": "Desconocido",
446
+ "gamma_check.regime.normal.desc": "η ∈ [0.85, 1.15]: el modelo usa su contexto nominal completo, sin anomalías.",
447
+ "gamma_check.regime.fraud.desc": "η < 0.01: θ nominal inflado. El modelo se comporta como si θ ≪ del anunciado. Probable inflación tipo YaRN/marketing sin extensión real de contexto.",
448
+ "gamma_check.regime.compressed.desc":"η ∈ [0.01, 0.5): contexto comprimido (el modelo atiende menos lejos de lo que predice θ nominal). Común en modelos instruction-tuned / RLHF.",
449
+ "gamma_check.regime.overpade.desc": "η > 1.5: el modelo atiende más lejos de lo que Padé predice. Posible régimen Lerch-corregido o checkpoint temprano sub-entrenado.",
450
+ "gamma_check.regime.swa.desc": "γ_obs > 1.05 sobre corpus aleatorio = firma de sliding-window attention (familias Mistral / Gemma).",
451
+ "gamma_check.regime.unknown.desc": "Entradas fuera de rango o γ_obs > 1 sin flag de corpus aleatorio. Verifica la medición.",
452
+ "gamma_check.glossary.title": "ⓘ Glosario — significado de las variables",
453
+ "gamma_check.glossary.gamma_pade": "<strong>γ_Padé</strong>: predicción cerrada (2−z)/(2+z), z = T√2/θ. Paper §sec:gamma_decomposition.",
454
+ "gamma_check.glossary.gamma_obs": "<strong>γ_observado</strong>: medido empíricamente desde los attention scores (ejecuta Diagnose CLI sobre pesos reales).",
455
+ "gamma_check.glossary.theta_eff_obs":"<strong>θ_eff (observado)</strong>: invertido desde γ_obs vía T√2 / (1 − γ_obs). θ efectivo implicado por tu medición.",
456
+ "gamma_check.glossary.theta_eff_pade":"<strong>θ_eff (Padé)</strong>: θ + T/√2. θ efectivo predicho por la fórmula cerrada.",
457
+ "gamma_check.glossary.efficiency": "<strong>η</strong>: ratio θ_eff_obs / θ_eff_Padé. ≈1 = normal · &lt;0.01 = fraude · &lt;0.5 = comprimido · &gt;1.5 = sobre-Padé.",
458
+ "gamma_check.glossary.delta_h": "<strong>ΔH_Cardy</strong>: log(θ_eff_obs / θ_nominal). Cambio de entropía de Cardy. Negativo = entropía de compresión. ~0 = coincide con nominal.",
459
+ "gamma_check.glossary.regime": "<strong>Régimen</strong>: clasificador automático a partir de η + γ_obs + flag corpus_aleatorio.",
460
+
461
+ // §36 v0.6 — Tooltips para iconos ⓘ inline
462
+ "tooltip.gamma_pade": "<strong>γ_Padé(T_eval)</strong>: predicción cerrada (2−z)/(2+z), z = T√2/θ. Paper §sec:gamma_decomposition.",
463
+ "tooltip.gamma_decomposed": "<strong>γ_descompuesto</strong>: γ desde descomposición arquitectural completa. Línea base Padé + shift GQA + shift post-IH (subconjunto replicado en audit calibrado).",
464
+ "tooltip.d_horizon": "<strong>d_horizon</strong>: horizonte efectivo de atención. Más allá los scores caen bajo el suelo de ruido (paper §26).",
465
+ "tooltip.L_NIAH": "<strong>Techo L_NIAH</strong>: techo predicho de fiabilidad needle-in-a-haystack al d_horizon actual.",
466
+ "tooltip.chi": "<strong>χ susceptibilidad</strong>: χ = 1/(1−γ). Diverge en la línea Hagedorn γ=1.",
467
+ "tooltip.kv_memory": "<strong>Memoria KV @ T_eval (BF16)</strong>: caché KV por petición = 2 · n_layers · n_kv_heads · d_head · T_eval bytes.",
468
+ "tooltip.theta_eff_obs": "<strong>θ_eff (observado)</strong>: θ efectivo implicado por tu γ_observado: T√2 / (1 − γ_obs).",
469
+ "tooltip.theta_eff_pade": "<strong>θ_eff (Padé)</strong>: θ efectivo predicho por la fórmula cerrada: θ + T/√2.",
470
+ "tooltip.efficiency": "<strong>η = θ_eff_obs / θ_eff_Padé</strong>: ratio de eficiencia. ≈1 = normal · &lt;0.01 = fraude · &lt;0.5 = comprimido · &gt;1.5 = sobre-Padé.",
471
+ "tooltip.delta_h_cardy": "<strong>ΔH_Cardy</strong>: log(θ_eff_obs / θ_nominal). Cambio de entropía de Cardy. Negativo = entropía de compresión. ~0 = coincide con nominal.",
472
+ "tooltip.verdict_aggregate": "<strong>Veredicto</strong>: peor-de entre todas las recipes. ✅ ADELANTE = todo verde · ⚠ DEGRADADO = ≥1 amarillo · ❌ NO = ≥1 rojo.",
473
+ "tooltip.verdict_breakdown": "<strong>Desglose por recipe</strong>: cada recipe evalúa un eje de decisión <em>independiente</em> (contexto-largo · presupuesto · hardware · custom-vs-API · compresión-KV). Un ❌ en X-1 significa «usa la API para tu volumen» no «el modelo falla» — abre la sección Recipes para contexto por eje.",
474
+ "tooltip.gamma_pill": "<strong>γ titular</strong>: γ_descompuesto (o γ_Padé como fallback). Rango (0,1) = Fase A (anti-Ising). γ ≥ 1 = Hagedorn / Fase B.",
475
+ "tooltip.anti_ising": "<strong>Clase Anti-Ising</strong>: Fase A → β = γ−1 &lt; 0. Machine-verified (Sage + Lean Mathlib4). Ver §35 v0.5.",
476
+
477
+ // §37 v0.6 — Tabla de teoremas Lean+Mathlib
478
+ "lean.table.title": "📑 Tabla de teoremas Lean+Mathlib",
479
+ "lean.table.desc": "Cada entrada está machine-proven contra Lean 4 + Mathlib4. Click en cualquier link L# para saltar a la línea fuente en GitHub. Agrupado por tema — click en cabecera para expandir.",
480
+ "lean.table.theorem": "Teorema",
481
+ "lean.table.claim": "Afirmación",
482
+ "lean.table.tactic": "Táctica",
483
+ "lean.table.source": "Fuente",
484
+ "lean.table.lean": "Lean",
485
+ "lean.findings.title": "🔎 Findings sustantivos",
486
+ "lean.findings.detected_by": "Detectado por",
487
+ "lean.findings.fixed_by": "Arreglado por",
488
+ "lean.findings.recommendation":"Recomendación",
489
+ "lean.meta.repo": "Repo",
490
+ "lean.meta.build": "Build",
491
+ "lean.meta.theorems": "Teoremas",
492
+ "lean.meta.verified": "verificados",
493
+ "lean.meta.rejected": "rechazados",
494
+ "lean.meta.sorry": "sorry",
495
+ "lean.meta.findings": "findings sustantivos",
496
+ "lean.manifest.loading": "Cargando manifest Lean…",
497
+ "lean.manifest.error": "Manifest Lean no disponible",
498
+
499
+ // Help modal — sección v0.6
500
+ "help.v06.title": "🆕 v0.6 — γ predicho-vs-observado + Cardy ΔH + badges Lean",
501
+ "help.v06.intro": "<em>v0.6 (2026-05-06): tres diagnósticos nuevos viven en el TAF Card bajo <strong>🔬 Diagnósticos</strong>. Todo corre en tu navegador; γ_observado lo obtienes con la Diagnose CLI sobre pesos reales.</em>",
502
+ "help.v06.layout.title": "Layout del TAF Card (nuevo en v0.6)",
503
+ "help.v06.layout.body": "Tras click en <strong>🚀 Generar perfil completo</strong> la tarjeta muestra: una <strong>tira hero</strong> arriba (clase de arquitectura + meta + 3 pills: veredicto agregado ✅/⚠/❌, γ titular, 🧲 Anti-Ising si Fase A) y cuatro <strong>secciones plegables</strong>: <strong>📋 Recipes</strong> (abierto por defecto — veredicto por dimensión), <strong>🔬 Diagnósticos</strong> (números clave, γ predicho vs observado, explorador what-if), <strong>✓ Verificación</strong> (consistencia algebraica Sage+Lean, falsificación F1-F23), <strong>📂 Procedencia y compartir</strong> (auditoría de calibración + descarga JSON / enlace / submit al registro). Click en cualquier cabecera para expandir. Cada variable tiene tooltip <strong>ⓘ</strong> inline.",
504
+ "help.v06.gamma_check.title": "γ predicho vs observado",
505
+ "help.v06.gamma_check.body": "Introduces el γ medido empíricamente y la herramienta calcula <strong>η = θ_eff_obs / θ_eff_Padé</strong> y clasifica en uno de 5 regímenes:",
506
+ "help.v06.case.normal": "<strong>Normal</strong> (η ∈ [0.85, 1.15]) — el modelo usa su contexto nominal completo. <em>Caso de uso</em>: validar un release nuevo antes de adoptarlo.",
507
+ "help.v06.case.fraud": "<strong>Fraude</strong> (η &lt; 0.01) — θ nominal inflado; el modelo se comporta como si θ ≪ del anunciado. <em>Caso de uso</em>: detectar inflación YaRN/marketing (patrón CodeLlama / Mistral-Nemo).",
508
+ "help.v06.case.compressed": "<strong>Comprimido</strong> (η &lt; 0.5) — contexto comprimido; el modelo atiende menos lejos que θ nominal. <em>Caso de uso</em>: detectar compresión por RLHF/instruction-tuning (patrón LLaMA-2).",
509
+ "help.v06.case.overpade": "<strong>Sobre-Padé</strong> (η &gt; 1.5) — el modelo atiende más lejos que Padé predice. <em>Caso de uso</em>: identificar régimen Lerch-corregido o checkpoints tempranos sub-entrenados (patrón pythia-1b).",
510
+ "help.v06.case.swa": "<strong>SWA corpus aleatorio</strong> (γ_obs &gt; 1.05 con corpus_aleatorio=Sí) — firma de sliding-window attention. <em>Caso de uso</em>: confirmar SWA en Mistral / Gemma sobre tokens random.",
511
+ "help.v06.cardy.title": "Diagnóstico Cardy ΔH",
512
+ "help.v06.cardy.body": "<strong>ΔH_Cardy = log(θ_eff_obs / θ_nominal)</strong>. Cambio de entropía entre el θ efectivo observado y el θ nominal. Negativo fuerte = entropía de compresión; cerca de cero = coincide con nominal. Complementa a η para casos borderline.",
513
+ "help.v06.lean.title": "Badges de verificación Lean + Mathlib",
514
+ "help.v06.lean.body": "Las identidades TAF están formalmente machine-proven en Lean Mathlib4: <strong>37 teoremas</strong> en 7 grupos (Padé, flujo RG, Cayley, D-SAGE, hallazgos de auditoría, erratum CV, misc) + <strong>1 hallazgo sustantivo</strong> (factor 2 en derivada V, teorema <code>V_derivative_ne_RG_beta</code>). Fuente: <a href=\"https://github.com/karlesmarin/lean-taf\" target=\"_blank\">github.com/karlesmarin/lean-taf</a> (commit 25c77fd). Re-verifica localmente: <code>git clone --depth=1 https://github.com/karlesmarin/lean-taf &amp;&amp; cd lean-taf &amp;&amp; lake exe cache get &amp;&amp; lake env lean Taf/Identities.lean</code>. La pill 🧲 Anti-Ising del hero y la sección Verificación enlazan a líneas específicas del código fuente.",
515
+ "help.v06.glossary.title": "Glosario de variables (también embebido en TAF Card)",
516
+ "help.v06.glossary.body": "Cada variable del TAF Card tiene un tooltip ⓘ inline. Lista completa: γ, γ_Padé, γ_descompuesto, γ_observado, θ, θ_eff_obs, θ_eff_Padé, η, ΔH_Cardy, χ, d_horizon, L_NIAH, memoria KV, régimen. Pasa el ratón sobre cualquier ⓘ para la definición + sección del paper.",
517
+
518
  "hero.title": "🔬 TAF Agent",
519
  "hero.tagline": "Prueba <strong>CUALQUIER</strong> LLM transformer antes de gastar GPU/€.",
520
  "hero.subtitle": "Todo el cómputo corre localmente en tu navegador. Gratis. Sin límites. Auditable.",
 
625
  "falsification.col.evidence": "Evidencia",
626
 
627
  "tafcard.title": "📇 TAF Card — perfil completo del modelo",
628
+ "tafcard.recipes_title": "📋 Recetas veredicto por dimensión",
629
+ "tafcard.recipes_count_label": "dimensiones",
630
  "tafcard.numbers_title": "🔢 Números clave (paper §26)",
631
+ "tafcard.fals_title": "🔬 Estado de falsificación (F1-F23)",
632
+ "tafcard.fals_none": "Sin falsificaciones aplicables.",
633
+ "tafcard.diag_title": "🔬 Diagnósticos — números · γ check · what-if",
634
+ "tafcard.verify_title": "✓ Verificación — Lean + Sage + falsificación",
635
+ "tafcard.share_title": "📂 Procedencia y compartir",
636
+ "tafcard.whatif_title": "🎚️ Explorador what-if",
637
+ "verdict.go": "ADELANTE",
638
+ "verdict.no": "NO",
639
+ "verdict.degraded": "DEGRADADO",
640
 
641
  "compare.title_out": "🆚 Tabla comparativa",
642
 
 
660
  "param.T_train.tip": "<strong>Contexto máximo de entrenamiento</strong>. De <code>max_position_embeddings</code>. Más allá es extrapolación.",
661
  "param.T_eval": "T_eval (tu objetivo)",
662
  "param.T_eval.tip": "<strong>Tu contexto de inferencia objetivo</strong>. La pregunta clave: ¿se comportará bien el modelo a ESTA longitud?",
663
+ "param.n_attn": "n_attention_heads",
664
+ "param.n_attn.tip": "<strong>Número de attention heads</strong> por capa. De <code>num_attention_heads</code>.",
665
+ "param.n_kv": "n_kv_heads",
666
+ "param.n_kv.tip": "<strong>KV heads</strong>. Si &lt; n_attention_heads → GQA (Grouped Query Attention). Reduce memoria KV pero empuja γ hacia Hagedorn.",
667
  "param.d_head": "head_dim",
668
+ "param.d_head.tip": "<strong>Dimensión por head</strong>. Típico 64, 96, 128. De <code>head_dim</code> o <code>hidden_size / num_attention_heads</code>.",
669
+ "param.n_layers": "n_layers",
670
+ "param.n_layers.tip": "<strong>Número de bloques transformer</strong>. De <code>num_hidden_layers</code>.",
671
  "param.n_params": "n_params (ej. 8e9)",
672
+ "param.n_params.tip": "<strong>Número total de parámetros</strong>. Umbral ~400M para emergencia de induction heads. Afecta memoria KV y recipes de presupuesto.",
673
  "param.has_swa": "¿Tiene SWA?",
674
+ "param.has_swa.tip": "<strong>Sliding Window Attention</strong>. <code>true</code> para Mistral, gemma-2, phi-3. El audit de calibración v0.5.3 desactivó la corrección histórica δ_SWA (ajuste n=1).",
675
  "common.yes": "Sí",
676
  "common.no": "No",
677
 
 
797
  "v053.calibration.note": "<strong>Correction SWA désactivée</strong> — δ_SWA = -0.21 d'origine était calibrée sur n=1 modèle (données insuffisantes ; moyenne du cas unique +0.355). <strong>Correction post_IH marquée exploratoire</strong> — moyenne de groupe ≈ 0 en ré-audit (panel n=22) ne réplique pas l'ajustement OLS. <strong>Correction GQA réplique</strong> (panel +0.115 vs hardcoded +0.11). <strong>Formule D_f corrigée pour Phase B (γ&gt;1)</strong> — utilise une somme cumulative discrète au lieu d'une approximation continue. LLaMA-3, Mistral, Gemma rapportent maintenant des valeurs de compression correctes.",
798
  "v053.release.banner": "🔧 v0.5.3 — Corrections issues d'audit : D_f de compression KV utilise maintenant la somme discrète (correct pour tout γ) ; δ_SWA désactivé (calibrage n=1) ; erratum du coefficient C_V paper §5.2 (1/4 → 1/12).",
799
 
800
+ // §35 v0.6 — Diagnostic γ prédit vs observé
801
+ "gamma_check.title": "🔍 γ prédit vs observé",
802
+ "gamma_check.desc": "Saisissez votre γ mesuré empiriquement. L'outil détecte le régime : fraude (θ gonflé) / comprimé / sur-Padé / SWA-aléatoire / normal.",
803
+ "gamma_check.gobs_label": "γ_observé",
804
+ "gamma_check.gobs_tip": "γ mesuré empiriquement à partir des attention scores de votre modèle. Utilisez la CLI Diagnose pour l'obtenir depuis les poids réels.",
805
+ "gamma_check.random_label": "Corpus aléatoire ?",
806
+ "gamma_check.random_tip": "Cochez si γ_observé a été mesuré sur des tokens aléatoires/non structurés. Distingue la signature SWA (γ_obs > 1) d'une anomalie.",
807
+ "gamma_check.regime": "Régime",
808
+ "gamma_check.regime.normal": "Normal",
809
+ "gamma_check.regime.fraud": "Fraude (θ gonflé)",
810
+ "gamma_check.regime.compressed": "Contexte comprimé",
811
+ "gamma_check.regime.overpade": "Sur-Padé",
812
+ "gamma_check.regime.swa": "Signature SWA (corpus aléatoire)",
813
+ "gamma_check.regime.unknown": "Inconnu",
814
+ "gamma_check.regime.normal.desc": "η ∈ [0.85, 1.15] : le modèle utilise son contexte nominal complet, sans anomalie.",
815
+ "gamma_check.regime.fraud.desc": "η < 0.01 : θ nominal gonflé. Le modèle se comporte comme si θ ≪ annoncé. Probable inflation YaRN/marketing sans vraie extension de contexte.",
816
+ "gamma_check.regime.compressed.desc":"η ∈ [0.01, 0.5) : contexte comprimé (le modèle attend moins loin que ne le prédit θ nominal). Fréquent en instruction-tuned / RLHF.",
817
+ "gamma_check.regime.overpade.desc": "η > 1.5 : le modèle attend plus loin que Padé ne le prédit. Régime Lerch-corrigé possible ou checkpoint précoce sous-entraîné.",
818
+ "gamma_check.regime.swa.desc": "γ_obs > 1.05 sur corpus aléatoire = signature de sliding-window attention (familles Mistral / Gemma).",
819
+ "gamma_check.regime.unknown.desc": "Entrées hors plage ou γ_obs > 1 sans flag corpus_aléatoire. Vérifiez la mesure.",
820
+ "gamma_check.glossary.title": "ⓘ Glossaire — signification des variables",
821
+ "gamma_check.glossary.gamma_pade": "<strong>γ_Padé</strong> : prédiction fermée (2−z)/(2+z), z = T√2/θ. Paper §sec:gamma_decomposition.",
822
+ "gamma_check.glossary.gamma_obs": "<strong>γ_observé</strong> : mesuré empiriquement à partir des attention scores (exécutez Diagnose CLI sur poids réels).",
823
+ "gamma_check.glossary.theta_eff_obs":"<strong>θ_eff (observé)</strong> : inversé depuis γ_obs via T√2 / (1 − γ_obs). θ effectif impliqué par votre mesure.",
824
+ "gamma_check.glossary.theta_eff_pade":"<strong>θ_eff (Padé)</strong> : θ + T/√2. θ effectif prédit par la formule fermée.",
825
+ "gamma_check.glossary.efficiency": "<strong>η</strong> : rapport θ_eff_obs / θ_eff_Padé. ≈1 = normal · &lt;0.01 = fraude · &lt;0.5 = comprimé · &gt;1.5 = sur-Padé.",
826
+ "gamma_check.glossary.delta_h": "<strong>ΔH_Cardy</strong> : log(θ_eff_obs / θ_nominal). Variation d'entropie de Cardy. Négatif = entropie de compression. ~0 = correspondance nominale.",
827
+ "gamma_check.glossary.regime": "<strong>Régime</strong> : classifieur automatique à partir de η + γ_obs + flag corpus_aléatoire.",
828
+
829
+ // §36 v0.6 — Tooltips pour icônes ⓘ inline
830
+ "tooltip.gamma_pade": "<strong>γ_Padé(T_eval)</strong> : prédiction fermée (2−z)/(2+z), z = T√2/θ. Paper §sec:gamma_decomposition.",
831
+ "tooltip.gamma_decomposed": "<strong>γ_décomposé</strong> : γ depuis la décomposition architecturale complète. Ligne de base Padé + shift GQA + shift post-IH (sous-ensemble répliqué dans audit calibré).",
832
+ "tooltip.d_horizon": "<strong>d_horizon</strong> : horizon d'attention effectif. Au-delà, les scores tombent sous le plancher de bruit (paper §26).",
833
+ "tooltip.L_NIAH": "<strong>Plafond L_NIAH</strong> : plafond prédit de fiabilité needle-in-a-haystack au d_horizon courant.",
834
+ "tooltip.chi": "<strong>χ susceptibilité</strong> : χ = 1/(1−γ). Diverge à la ligne Hagedorn γ=1.",
835
+ "tooltip.kv_memory": "<strong>Mémoire KV @ T_eval (BF16)</strong> : cache KV par requête = 2 · n_layers · n_kv_heads · d_head · T_eval octets.",
836
+ "tooltip.theta_eff_obs": "<strong>θ_eff (observé)</strong> : θ effectif impliqué par votre γ_observé : T√2 / (1 − γ_obs).",
837
+ "tooltip.theta_eff_pade": "<strong>θ_eff (Padé)</strong> : θ effectif prédit par la formule fermée : θ + T/√2.",
838
+ "tooltip.efficiency": "<strong>η = θ_eff_obs / θ_eff_Padé</strong> : ratio d'efficacité. ≈1 = normal · &lt;0.01 = fraude · &lt;0.5 = comprimé · &gt;1.5 = sur-Padé.",
839
+ "tooltip.delta_h_cardy": "<strong>ΔH_Cardy</strong> : log(θ_eff_obs / θ_nominal). Variation d'entropie de Cardy. Négatif = entropie de compression. ~0 = correspondance nominale.",
840
+ "tooltip.verdict_aggregate": "<strong>Verdict</strong> : pire-de toutes les recettes. ✅ GO = tout vert · ⚠ DÉGRADÉ = ≥1 jaune · ❌ NON = ≥1 rouge.",
841
+ "tooltip.verdict_breakdown": "<strong>Décomposition par recette</strong> : chaque recette teste un axe de décision <em>indépendant</em> (contexte-long · budget · matériel · custom-vs-API · compression-KV). Un ❌ en X-1 signifie « utilisez l'API pour votre volume » et non « le modèle échoue » — ouvrez la section Recettes pour le contexte par axe.",
842
+ "tooltip.gamma_pill": "<strong>γ vedette</strong> : γ_décomposé (ou γ_Padé en fallback). Plage (0,1) = Phase A (anti-Ising). γ ≥ 1 = Hagedorn / Phase B.",
843
+ "tooltip.anti_ising": "<strong>Classe Anti-Ising</strong> : Phase A → β = γ−1 &lt; 0. Machine-verified (Sage + Lean Mathlib4). Voir §35 v0.5.",
844
+
845
+ // §37 v0.6 — Table des théorèmes Lean+Mathlib
846
+ "lean.table.title": "📑 Table des théorèmes Lean+Mathlib",
847
+ "lean.table.desc": "Chaque entrée ci-dessous est machine-proven contre Lean 4 + Mathlib4. Cliquez sur un lien L# pour aller à la ligne source sur GitHub. Groupé par thème — cliquez sur un en-tête pour déplier.",
848
+ "lean.table.theorem": "Théorème",
849
+ "lean.table.claim": "Énoncé",
850
+ "lean.table.tactic": "Tactique",
851
+ "lean.table.source": "Source",
852
+ "lean.table.lean": "Lean",
853
+ "lean.findings.title": "🔎 Findings substantiels",
854
+ "lean.findings.detected_by": "Détecté par",
855
+ "lean.findings.fixed_by": "Corrigé par",
856
+ "lean.findings.recommendation":"Recommandation",
857
+ "lean.meta.repo": "Repo",
858
+ "lean.meta.build": "Build",
859
+ "lean.meta.theorems": "Théorèmes",
860
+ "lean.meta.verified": "vérifiés",
861
+ "lean.meta.rejected": "rejetés",
862
+ "lean.meta.sorry": "sorry",
863
+ "lean.meta.findings": "findings substantiels",
864
+ "lean.manifest.loading": "Chargement du manifeste Lean…",
865
+ "lean.manifest.error": "Manifeste Lean indisponible",
866
+
867
+ // Help modal — section v0.6
868
+ "help.v06.title": "🆕 v0.6 — γ prédit-vs-observé + Cardy ΔH + badges Lean",
869
+ "help.v06.intro": "<em>v0.6 (2026-05-06) : trois nouveaux diagnostics vivent dans la TAF Card sous <strong>🔬 Diagnostics</strong>. Tout tourne dans votre navigateur ; γ_observé provient de la Diagnose CLI sur poids réels.</em>",
870
+ "help.v06.layout.title": "Disposition de la TAF Card (nouveau en v0.6)",
871
+ "help.v06.layout.body": "Après avoir cliqué <strong>🚀 Générer profil complet</strong>, la carte affiche : une <strong>bande hero</strong> en haut (classe d'architecture + méta + 3 pills : verdict agrégé ✅/⚠/❌, γ vedette, 🧲 Anti-Ising si Phase A) et quatre <strong>sections pliables</strong> : <strong>📋 Recettes</strong> (ouverte par défaut — verdict par dimension), <strong>🔬 Diagnostics</strong> (nombres clés, γ prédit vs observé, explorateur what-if), <strong>✓ Vérification</strong> (cohérence algébrique Sage+Lean, falsification F1-F23), <strong>📂 Provenance &amp; partage</strong> (audit de calibration + téléchargement JSON / lien / soumission registre). Cliquez sur n'importe quel en-tête pour déplier. Chaque variable a un tooltip <strong>ⓘ</strong> inline.",
872
+ "help.v06.gamma_check.title": "γ prédit vs observé",
873
+ "help.v06.gamma_check.body": "Saisissez le γ mesuré empiriquement et l'outil calcule <strong>η = θ_eff_obs / θ_eff_Padé</strong> et classe en l'un de 5 régimes :",
874
+ "help.v06.case.normal": "<strong>Normal</strong> (η ∈ [0.85, 1.15]) — le modèle utilise son contexte nominal complet. <em>Cas d'usage</em> : valider une nouvelle release avant adoption.",
875
+ "help.v06.case.fraud": "<strong>Fraude</strong> (η &lt; 0.01) — θ nominal gonflé ; le modèle se comporte comme si θ ≪ annoncé. <em>Cas d'usage</em> : détecter inflation YaRN/marketing (motif CodeLlama / Mistral-Nemo).",
876
+ "help.v06.case.compressed": "<strong>Comprimé</strong> (η &lt; 0.5) — contexte comprimé ; le modèle attend moins loin que θ nominal. <em>Cas d'usage</em> : repérer compression par RLHF/instruction-tuning (motif LLaMA-2).",
877
+ "help.v06.case.overpade": "<strong>Sur-Padé</strong> (η &gt; 1.5) — le modèle attend plus loin que Padé ne le prédit. <em>Cas d'usage</em> : identifier régime Lerch-corrigé ou checkpoints précoces sous-entraînés (motif pythia-1b).",
878
+ "help.v06.case.swa": "<strong>SWA corpus aléatoire</strong> (γ_obs &gt; 1.05 avec corpus_aléatoire=Oui) — signature de sliding-window attention. <em>Cas d'usage</em> : confirmer SWA Mistral / Gemma sur tokens aléatoires.",
879
+ "help.v06.cardy.title": "Diagnostic Cardy ΔH",
880
+ "help.v06.cardy.body": "<strong>ΔH_Cardy = log(θ_eff_obs / θ_nominal)</strong>. Variation d'entropie entre le θ effectif observé et le θ nominal. Fortement négatif = entropie de compression ; proche de zéro = correspondance nominale. Complète η pour les cas borderline.",
881
+ "help.v06.lean.title": "Badges de vérification Lean + Mathlib",
882
+ "help.v06.lean.body": "Les identités TAF sont formellement machine-proven en Lean Mathlib4 : <strong>37 théorèmes</strong> en 7 groupes (Padé, flot RG, Cayley, D-SAGE, résultats d'audit, erratum CV, divers) + <strong>1 résultat substantiel</strong> (facteur 2 dans la dérivée V, théorème <code>V_derivative_ne_RG_beta</code>). Source : <a href=\"https://github.com/karlesmarin/lean-taf\" target=\"_blank\">github.com/karlesmarin/lean-taf</a> (commit 25c77fd). Re-vérifier localement : <code>git clone --depth=1 https://github.com/karlesmarin/lean-taf &amp;&amp; cd lean-taf &amp;&amp; lake exe cache get &amp;&amp; lake env lean Taf/Identities.lean</code>. La pill 🧲 Anti-Ising du hero et la section Vérification renvoient à des lignes sources spécifiques.",
883
+ "help.v06.glossary.title": "Glossaire des variables (également intégré dans la TAF Card)",
884
+ "help.v06.glossary.body": "Chaque variable de la TAF Card a un tooltip ⓘ inline. Liste complète : γ, γ_Padé, γ_décomposé, γ_observé, θ, θ_eff_obs, θ_eff_Padé, η, ΔH_Cardy, χ, d_horizon, L_NIAH, mémoire KV, régime. Survolez n'importe quel ⓘ pour la définition + section du paper.",
885
+
886
  "hero.title": "🔬 TAF Agent",
887
  "hero.tagline": "Testez <strong>N'IMPORTE QUEL</strong> LLM transformer avant de dépenser du GPU/€.",
888
  "hero.subtitle": "Tout le calcul s'exécute localement dans votre navigateur. Gratuit. Illimité. Auditable.",
 
993
  "falsification.col.evidence": "Preuve",
994
 
995
  "tafcard.title": "📇 TAF Card — profil complet du modèle",
996
+ "tafcard.recipes_title": "📋 Recettes verdict par dimension",
997
+ "tafcard.recipes_count_label": "dimensions",
998
  "tafcard.numbers_title": "🔢 Nombres clés (paper §26)",
999
+ "tafcard.fals_title": "🔬 État de falsification (F1-F23)",
1000
+ "tafcard.fals_none": "Aucune falsification applicable.",
1001
+ "tafcard.diag_title": "🔬 Diagnostics — nombres · contrôle γ · what-if",
1002
+ "tafcard.verify_title": "✓ Vérification — Lean + Sage + falsification",
1003
+ "tafcard.share_title": "📂 Provenance & partage",
1004
+ "tafcard.whatif_title": "🎚️ Explorateur what-if",
1005
+ "verdict.go": "GO",
1006
+ "verdict.no": "NON",
1007
+ "verdict.degraded": "DÉGRADÉ",
1008
 
1009
  "compare.title_out": "🆚 Tableau comparatif",
1010
 
 
1028
  "param.T_train.tip": "<strong>Contexte max d'entraînement</strong>. De <code>max_position_embeddings</code>. Au-delà c'est de l'extrapolation.",
1029
  "param.T_eval": "T_eval (votre cible)",
1030
  "param.T_eval.tip": "<strong>Votre contexte d'inférence cible</strong>. La question clé : le modèle se comportera-t-il bien à CETTE longueur ?",
1031
+ "param.n_attn": "n_attention_heads",
1032
+ "param.n_attn.tip": "<strong>Nombre d'attention heads</strong> par couche. De <code>num_attention_heads</code>.",
1033
+ "param.n_kv": "n_kv_heads",
1034
+ "param.n_kv.tip": "<strong>KV heads</strong>. Si &lt; n_attention_heads → GQA (Grouped Query Attention). Réduit la mémoire KV mais pousse γ vers Hagedorn.",
1035
  "param.d_head": "head_dim",
1036
+ "param.d_head.tip": "<strong>Dimension par head</strong>. Typique 64, 96, 128. De <code>head_dim</code> ou <code>hidden_size / num_attention_heads</code>.",
1037
+ "param.n_layers": "n_layers",
1038
+ "param.n_layers.tip": "<strong>Nombre de blocs transformer</strong>. De <code>num_hidden_layers</code>.",
1039
  "param.n_params": "n_params (ex. 8e9)",
1040
+ "param.n_params.tip": "<strong>Nombre total de paramètres</strong>. Seuil ~400M pour l'émergence d'induction heads. Affecte la mémoire KV et les recettes de budget.",
1041
  "param.has_swa": "A SWA ?",
1042
+ "param.has_swa.tip": "<strong>Sliding Window Attention</strong>. <code>true</code> pour Mistral, gemma-2, phi-3. L'audit de calibration v0.5.3 a désactivé la correction historique δ_SWA (ajustement n=1).",
1043
  "common.yes": "Oui",
1044
  "common.no": "Non",
1045
 
 
1165
  "v053.calibration.note": "<strong>SWA 修正已禁用</strong> — 原 δ_SWA = -0.21 基于 n=1 模型拟合(数据不足;唯一案例的均值为 +0.355)。<strong>post_IH 修正标记为探索性</strong> — 重审中组均值 ≈ 0(n=22 面板)未能复现 OLS 拟合。<strong>GQA 修正可复现</strong>(面板 +0.115 vs 硬编码 +0.11)。<strong>D_f 公式修正 Phase B (γ&gt;1)</strong> — 使用离散累积和代替连续近似。LLaMA-3、Mistral、Gemma 现在报告正确的压缩值。",
1166
  "v053.release.banner": "🔧 v0.5.3 — 审计驱动的修复:KV 压缩 D_f 现使用离散和(适用于所有 γ);δ_SWA 禁用(n=1 校准);论文 §5.2 C_V 系数勘误 (1/4 → 1/12)。",
1167
 
1168
+ // §35 v0.6 — γ 预测 vs 观测 诊断
1169
+ "gamma_check.title": "🔍 γ 预测 vs 观测",
1170
+ "gamma_check.desc": "输入你经验测量的 γ。工具自动检测体制:欺诈 (θ 虚高) / 压缩 / 超 Padé / SWA-随机 / 正常。",
1171
+ "gamma_check.gobs_label": "γ_观测",
1172
+ "gamma_check.gobs_tip": "从模型注意力分数经验测量的 γ。使用 Diagnose CLI 从真实权重获取。",
1173
+ "gamma_check.random_label": "随机语料?",
1174
+ "gamma_check.random_tip": "若 γ_观测在随机/无结构 token 上测得请勾选。区分 SWA 签名 (γ_obs > 1) 与异常。",
1175
+ "gamma_check.regime": "体制",
1176
+ "gamma_check.regime.normal": "正常",
1177
+ "gamma_check.regime.fraud": "欺诈 (θ 虚高)",
1178
+ "gamma_check.regime.compressed": "上下文压缩",
1179
+ "gamma_check.regime.overpade": "超 Padé",
1180
+ "gamma_check.regime.swa": "SWA 签名 (随机语料)",
1181
+ "gamma_check.regime.unknown": "未知",
1182
+ "gamma_check.regime.normal.desc": "η ∈ [0.85, 1.15]:模型完全利用名义上下文,无异常。",
1183
+ "gamma_check.regime.fraud.desc": "η < 0.01:名义 θ 虚高。模型表现如同 θ 远小于宣称值。可能是 YaRN/营销虚标,无真实上下文扩展。",
1184
+ "gamma_check.regime.compressed.desc":"η ∈ [0.01, 0.5):上下文压缩 (模型注意距离比名义 θ 预测更短)。常见于 instruction-tuned / RLHF 模型。",
1185
+ "gamma_check.regime.overpade.desc": "η > 1.5:模型注意距离超过 Padé 预测。可能是 Lerch 修正体制或欠训练早期 checkpoint。",
1186
+ "gamma_check.regime.swa.desc": "随机语料上 γ_obs > 1.05 = 滑动窗口注意力签名 (Mistral / Gemma 系列)。",
1187
+ "gamma_check.regime.unknown.desc": "输入超范围或 γ_obs > 1 但未标记随机语料。请核验测量。",
1188
+ "gamma_check.glossary.title": "ⓘ 词汇表 — 变量含义",
1189
+ "gamma_check.glossary.gamma_pade": "<strong>γ_Padé</strong>:闭式预测 (2−z)/(2+z), z = T√2/θ。论文 §sec:gamma_decomposition。",
1190
+ "gamma_check.glossary.gamma_obs": "<strong>γ_观测</strong>:从注意力分数经验测得 (在真实权重上运行 Diagnose CLI)。",
1191
+ "gamma_check.glossary.theta_eff_obs":"<strong>θ_eff (观测)</strong>:由 γ_obs 反演 T√2 / (1 − γ_obs)。测量隐含的有效 θ。",
1192
+ "gamma_check.glossary.theta_eff_pade":"<strong>θ_eff (Padé)</strong>:θ + T/√2。闭式公式预测的有效 θ。",
1193
+ "gamma_check.glossary.efficiency": "<strong>η</strong>:θ_eff_obs / θ_eff_Padé 比值。≈1 = 正常 · &lt;0.01 = 欺诈 · &lt;0.5 = 压缩 · &gt;1.5 = 超 Padé。",
1194
+ "gamma_check.glossary.delta_h": "<strong>ΔH_Cardy</strong>:log(θ_eff_obs / θ_nominal)。Cardy 熵变。负值 = 压缩熵。~0 = 与名义匹配。",
1195
+ "gamma_check.glossary.regime": "<strong>体制</strong>:基于 η + γ_obs + 随机语料标志的自动分类器。",
1196
+
1197
+ // §36 v0.6 — 内联 ⓘ 图标提示
1198
+ "tooltip.gamma_pade": "<strong>γ_Padé(T_eval)</strong>:闭式预测 (2−z)/(2+z), z = T√2/θ。论文 §sec:gamma_decomposition。",
1199
+ "tooltip.gamma_decomposed": "<strong>γ_分解</strong>:基于完整架构分解的 γ。Padé 基线 + GQA 偏移 + post-IH 偏移 (校准审计已复制子集)。",
1200
+ "tooltip.d_horizon": "<strong>d_horizon</strong>:有效注意力视野。超过此位置分数低于噪声底 (论文 §26)。",
1201
+ "tooltip.L_NIAH": "<strong>L_NIAH 上限</strong>:当前 d_horizon 下针-在-干草堆检索可靠性的预测上限。",
1202
+ "tooltip.chi": "<strong>χ 易感性</strong>:χ = 1/(1−γ)。在 Hagedorn 线 γ=1 处发散。",
1203
+ "tooltip.kv_memory": "<strong>KV 内存 @ T_eval (BF16)</strong>:每请求 KV 缓存 = 2 · n_layers · n_kv_heads · d_head · T_eval 字节。",
1204
+ "tooltip.theta_eff_obs": "<strong>θ_eff (观测)</strong>:由 γ_观测 隐含的有效 θ:T√2 / (1 − γ_obs)。",
1205
+ "tooltip.theta_eff_pade": "<strong>θ_eff (Padé)</strong>:闭式公式预测的有效 θ:θ + T/√2。",
1206
+ "tooltip.efficiency": "<strong>η = θ_eff_obs / θ_eff_Padé</strong>:效率比。≈1 = 正常 · &lt;0.01 = 欺诈 · &lt;0.5 = 压缩 · &gt;1.5 = 超 Padé。",
1207
+ "tooltip.delta_h_cardy": "<strong>ΔH_Cardy</strong>:log(θ_eff_obs / θ_nominal)。Cardy 熵变。负值 = 压缩熵。~0 = 与名义匹配。",
1208
+ "tooltip.verdict_aggregate": "<strong>判定</strong>:所有配方中最差。✅ 通过 = 全绿 · ⚠ 降级 = ≥1 黄 · ❌ 否 = ≥1 红。",
1209
+ "tooltip.verdict_breakdown": "<strong>各配方分解</strong>:每个配方测试一个<em>独立</em>的决策轴 (长上下文 · 预算 · 硬件 · 自训 vs API · KV 压缩)。X-1 上的 ❌ 表示「按你的量级用 API」而非「模型失败」——展开 Recipes 节查看各轴上下文。",
1210
+ "tooltip.gamma_pill": "<strong>γ 头条</strong>:γ_分解 (或 γ_Padé 回退)。范围 (0,1) = 相位 A (反伊辛)。γ ≥ 1 = Hagedorn / 相位 B。",
1211
+ "tooltip.anti_ising": "<strong>反伊辛类</strong>:相位 A → β = γ−1 &lt; 0。机器证明 (Sage + Lean Mathlib4)。见 §35 v0.5。",
1212
+
1213
+ // §37 v0.6 — Lean+Mathlib 定理表
1214
+ "lean.table.title": "📑 Lean+Mathlib 定理表",
1215
+ "lean.table.desc": "下方每一项都已机器证明对 Lean 4 + Mathlib4。点击任意 L# 链接跳转到 GitHub 源码行。按主题分组——点击标题展开。",
1216
+ "lean.table.theorem": "定理",
1217
+ "lean.table.claim": "陈述",
1218
+ "lean.table.tactic": "策略",
1219
+ "lean.table.source": "出处",
1220
+ "lean.table.lean": "Lean",
1221
+ "lean.findings.title": "🔎 实质性发现",
1222
+ "lean.findings.detected_by": "检测于",
1223
+ "lean.findings.fixed_by": "修正于",
1224
+ "lean.findings.recommendation":"建议",
1225
+ "lean.meta.repo": "仓库",
1226
+ "lean.meta.build": "构建",
1227
+ "lean.meta.theorems": "定理",
1228
+ "lean.meta.verified": "已验证",
1229
+ "lean.meta.rejected": "已拒绝",
1230
+ "lean.meta.sorry": "sorry",
1231
+ "lean.meta.findings": "项实质性发现",
1232
+ "lean.manifest.loading": "正在加载 Lean 清单…",
1233
+ "lean.manifest.error": "Lean 清单不可用",
1234
+
1235
+ // 帮助弹窗 — v0.6 节
1236
+ "help.v06.title": "🆕 v0.6 — γ 预测-vs-观测 + Cardy ΔH + Lean 徽章",
1237
+ "help.v06.intro": "<em>v0.6 (2026-05-06):三个新诊断位于 TAF 卡的 <strong>🔬 诊断</strong> 下。全部在浏览器运行;γ_观测来自在真实权重上运行 Diagnose CLI。</em>",
1238
+ "help.v06.layout.title": "TAF 卡布局 (v0.6 新增)",
1239
+ "help.v06.layout.body": "点击 <strong>🚀 生成完整画像</strong> 后,卡片展示:顶部一条 <strong>hero 条</strong> (架构类 + 元信息 + 3 个 pill:聚合判定 ✅/⚠/❌、γ 头条、🧲 反伊辛若处于相位 A) 和四个 <strong>可展开节</strong>:<strong>📋 配方</strong> (默认展开 — 各维度判定)、<strong>🔬 诊断</strong> (关键数字、γ 预测 vs 观测、what-if 浏览器)、<strong>✓ 验证</strong> (Sage+Lean 代数一致性、可证伪 F1-F23)、<strong>📂 来源与分享</strong> (校准审计 + JSON 下载 / 链接 / 注册表提交)。点击任意标题展开。每个变量都有内联 <strong>ⓘ</strong> 提示。",
1240
+ "help.v06.gamma_check.title": "γ 预测 vs 观测",
1241
+ "help.v06.gamma_check.body": "输入经验测量的 γ,工具计算 <strong>η = θ_eff_obs / θ_eff_Padé</strong> 并分类到 5 种体制之一:",
1242
+ "help.v06.case.normal": "<strong>正常</strong> (η ∈ [0.85, 1.15]) — 模型完整使用名义上下文。<em>用例</em>:在采用前验证新发布。",
1243
+ "help.v06.case.fraud": "<strong>欺诈</strong> (η &lt; 0.01) — 名义 θ 虚高;模型表现如同 θ ≪ 宣称值。<em>用例</em>:检测 YaRN/营销虚标 (CodeLlama / Mistral-Nemo 模式)。",
1244
+ "help.v06.case.compressed": "<strong>压缩</strong> (η &lt; 0.5) — 上下文压缩;模型注意距离比名义 θ 短。<em>用例</em>:识别 RLHF/指令调优引起的压缩 (LLaMA-2 模式)。",
1245
+ "help.v06.case.overpade": "<strong>超 Padé</strong> (η &gt; 1.5) — 模型注意距离超过 Padé 预测。<em>用例</em>:识别 Lerch 修正体制或欠训练早期 checkpoint (pythia-1b 模式)。",
1246
+ "help.v06.case.swa": "<strong>SWA 随机语料</strong> (γ_obs &gt; 1.05 且 随机语料=是) — 滑动窗口注意力签名。<em>用例</em>:在随机 token 上确认 Mistral / Gemma SWA。",
1247
+ "help.v06.cardy.title": "Cardy ΔH 诊断",
1248
+ "help.v06.cardy.body": "<strong>ΔH_Cardy = log(θ_eff_obs / θ_nominal)</strong>。观测有效 θ 与名义 θ 之间的熵变。强负值 = 压缩熵;接近零 = 与名义匹配。在边界情况下补充 η。",
1249
+ "help.v06.lean.title": "Lean + Mathlib 验证徽章",
1250
+ "help.v06.lean.body": "TAF 恒等式在 Lean Mathlib4 中形式化机器证明:<strong>37 个定理</strong>分布于 7 组(Padé、RG 流、Cayley、D-SAGE、审计发现、CV 勘误、杂项)+ <strong>1 项实质性发现</strong>(V 导数 2 倍因子,定理 <code>V_derivative_ne_RG_beta</code>)。源:<a href=\"https://github.com/karlesmarin/lean-taf\" target=\"_blank\">github.com/karlesmarin/lean-taf</a>(commit 25c77fd)。本地重新验证:<code>git clone --depth=1 https://github.com/karlesmarin/lean-taf &amp;&amp; cd lean-taf &amp;&amp; lake exe cache get &amp;&amp; lake env lean Taf/Identities.lean</code>。Hero 中的 🧲 反伊辛 pill 与验证手风琴链接到具体源码行。",
1251
+ "help.v06.glossary.title": "变量词汇表 (亦嵌入 TAF 卡)",
1252
+ "help.v06.glossary.body": "TAF 卡中每个变量都有内联 ⓘ 提示。完整列表:γ、γ_Padé、γ_分解、γ_观测、θ、θ_eff_obs、θ_eff_Padé、η、ΔH_Cardy、χ、d_horizon、L_NIAH、KV 内存、体制。鼠标悬停任意 ⓘ 查看定义 + 论文章节。",
1253
+
1254
  "hero.title": "🔬 TAF Agent",
1255
  "hero.tagline": "在花费 GPU/$ 之前,测试<strong>任意</strong> Transformer LLM。",
1256
  "hero.subtitle": "所有计算在您的浏览器本地运行。免费。无限制。可审计。",
 
1361
  "falsification.col.evidence": "证据",
1362
 
1363
  "tafcard.title": "📇 TAF 卡 — 完整模型画像",
1364
+ "tafcard.recipes_title": "📋 配方 — 各维度判定",
1365
+ "tafcard.recipes_count_label": "维度",
1366
  "tafcard.numbers_title": "🔢 关键数字 (paper §26)",
1367
+ "tafcard.fals_title": "🔬 可证伪状态 (F1-F23)",
1368
+ "tafcard.fals_none": "无适用的可证伪。",
1369
+ "tafcard.diag_title": "🔬 诊断 — 数字 · γ 检验 · what-if",
1370
+ "tafcard.verify_title": "✓ 验证 — Lean + Sage + 可证伪",
1371
+ "tafcard.share_title": "📂 来源与分享",
1372
+ "tafcard.whatif_title": "🎚️ What-if 浏览器",
1373
+ "verdict.go": "通过",
1374
+ "verdict.no": "否",
1375
+ "verdict.degraded": "降级",
1376
 
1377
  "compare.title_out": "🆚 比较表",
1378
 
 
1396
  "param.T_train.tip": "<strong>训练最大上下文</strong>。来自 <code>max_position_embeddings</code>。超出此范围属于外推。",
1397
  "param.T_eval": "T_eval (您的目标)",
1398
  "param.T_eval.tip": "<strong>您的目标推理上下文</strong>。关键问题: 模型在 <em>这个</em> 长度下表现是否良好?",
1399
+ "param.n_attn": "n_attention_heads",
1400
+ "param.n_attn.tip": "<strong>每层 attention heads 数</strong>。来自 <code>num_attention_heads</code>。",
1401
+ "param.n_kv": "n_kv_heads",
1402
+ "param.n_kv.tip": "<strong>KV heads</strong>。若 &lt; n_attention_heads → GQA (Grouped Query Attention)。降低 KV 内存但将 γ 推向 Hagedorn。",
1403
  "param.d_head": "head_dim",
1404
+ "param.d_head.tip": "<strong>每 head 维度</strong>。典型 64、96、128。来自 <code>head_dim</code> 或 <code>hidden_size / num_attention_heads</code>。",
1405
+ "param.n_layers": "n_layers",
1406
+ "param.n_layers.tip": "<strong>Transformer 块数</strong>。来自 <code>num_hidden_layers</code>。",
1407
  "param.n_params": "n_params (例如 8e9)",
1408
+ "param.n_params.tip": "<strong>总参数量</strong>。约 400M 阈值出现 induction heads。影响 KV 内存和预算配方。",
1409
  "param.has_swa": "有 SWA 吗?",
1410
+ "param.has_swa.tip": "<strong>Sliding Window Attention</strong>。Mistral、gemma-2、phi-3 为 <code>true</code>。v0.5.3 校准审计禁用了历史 δ_SWA 校正 (n=1 拟合)。",
1411
  "common.yes": "是",
1412
  "common.no": "否",
1413
 
js/lean_badges.js ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Lean+Mathlib provenance — loads `data/lean_status.json`, exposes per-theorem
2
+ // badge HTML + a grouped table renderer for the Verification accordion.
3
+ // Pure browser-only: just fetches a static JSON manifest.
4
+
5
+ let _manifest = null;
6
+ let _byName = null;
7
+
8
+ export async function loadLeanManifest(url = "data/lean_status.json") {
9
+ if (_manifest) return _manifest;
10
+ const res = await fetch(url, { cache: "default" });
11
+ if (!res.ok) throw new Error(`lean manifest fetch failed: ${res.status}`);
12
+ _manifest = await res.json();
13
+ _byName = {};
14
+ for (const g of _manifest.groups) {
15
+ for (const t of g.theorems) {
16
+ t._group = g.id;
17
+ t._url = sourceUrl(_manifest, t);
18
+ _byName[t.name] = t;
19
+ }
20
+ }
21
+ return _manifest;
22
+ }
23
+
24
+ export function getManifest() { return _manifest; }
25
+ export function getTheorem(name) { return _byName ? _byName[name] : null; }
26
+
27
+ export function sourceUrl(manifest, theorem) {
28
+ const repo = manifest.lean_repo;
29
+ return `${repo.url}/blob/${repo.default_branch}/${theorem.file}#L${theorem.line}`;
30
+ }
31
+
32
+ const escapeHtml = (s) => String(s ?? "").replace(/[&<>"]/g, c => ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c]));
33
+ const escapeAttr = (s) => String(s ?? "").replace(/"/g, "&quot;");
34
+
35
+ export function badgeHtml(theoremName, label = "✓ Lean ↗") {
36
+ const t = getTheorem(theoremName);
37
+ if (!t) return "";
38
+ return `<a href="${escapeAttr(t._url)}" target="_blank" rel="noopener" class="lean-badge" title="Lean theorem: ${escapeAttr(t.name)} — ${escapeAttr(t.claim)} (tactic: ${escapeAttr(t.tactic || "")})">${escapeHtml(label)}</a>`;
39
+ }
40
+
41
+ export function badgesForUiBinding(bindingKey) {
42
+ // Returns concatenated badges for a UI binding (single string or array of names).
43
+ const manifest = getManifest();
44
+ if (!manifest || !manifest.ui_bindings) return "";
45
+ const binding = manifest.ui_bindings[bindingKey];
46
+ if (!binding) return "";
47
+ const names = Array.isArray(binding) ? binding : [binding];
48
+ return names.map(n => badgeHtml(n, "✓ Lean")).filter(Boolean).join(" ");
49
+ }
50
+
51
+ export function renderTheoremTable() {
52
+ const manifest = getManifest();
53
+ if (!manifest) return "<div class='subtle'>Lean manifest not loaded.</div>";
54
+
55
+ const repo = manifest.lean_repo;
56
+ const headerHtml = `
57
+ <div class="lean-meta">
58
+ <div><strong data-i18n="lean.meta.repo">Repo</strong>: <a href="${escapeAttr(repo.url)}" target="_blank">${escapeHtml(repo.name)}</a> @ <code>${escapeHtml(repo.commit_short)}</code></div>
59
+ <div class="subtle"><strong data-i18n="lean.meta.build">Build</strong>: ${repo.build_jobs} jobs · ${escapeHtml(repo.lean_toolchain)} · ${repo.compile_time_seconds}s compile (warm)</div>
60
+ <div class="subtle"><strong data-i18n="lean.meta.theorems">Theorems</strong>: ${manifest.summary.theorems_total} <span data-i18n="lean.meta.verified">verified</span> · ${manifest.summary.lean_rejected} <span data-i18n="lean.meta.rejected">rejected</span> · ${manifest.summary.skipped_sorry} <span data-i18n="lean.meta.sorry">sorry</span> · ${manifest.summary.substantive_findings} <span data-i18n="lean.meta.findings">substantive findings</span></div>
61
+ </div>`;
62
+
63
+ const findingsHtml = (manifest.findings && manifest.findings.length)
64
+ ? `<details class="lean-findings" open>
65
+ <summary><strong data-i18n="lean.findings.title">🔎 Substantive findings</strong> (${manifest.findings.length})</summary>
66
+ ${manifest.findings.map(f => `
67
+ <div class="lean-finding">
68
+ <div><strong>${escapeHtml(f.id)} — ${escapeHtml(f.title)}</strong>
69
+ <span class="lean-pill ${f.severity === "substantive" ? "v-deg" : ""}">${escapeHtml(f.severity)}</span></div>
70
+ <div class="subtle" style="margin-top:0.3em;">${escapeHtml(f.summary)}</div>
71
+ <div style="margin-top:0.3em;">
72
+ <span class="subtle"><span data-i18n="lean.findings.detected_by">Detected by</span>:</span> ${badgeHtml(f.detected_by, f.detected_by + " ↗")}
73
+ ${f.fixed_by && f.fixed_by.length ? ` · <span class="subtle"><span data-i18n="lean.findings.fixed_by">Fixed by</span>:</span> ${f.fixed_by.map(n => badgeHtml(n, n + " ↗")).join(" ")}` : ""}
74
+ </div>
75
+ <div class="subtle" style="margin-top:0.3em;"><strong data-i18n="lean.findings.recommendation">Recommendation</strong>: ${escapeHtml(f.recommendation)}</div>
76
+ </div>
77
+ `).join("")}
78
+ </details>`
79
+ : "";
80
+
81
+ const groupsHtml = manifest.groups.map(g => `
82
+ <details class="lean-group">
83
+ <summary><strong>${escapeHtml(g.title)}</strong> <span class="subtle">(${g.theorems.length})</span></summary>
84
+ <div class="lean-table-wrap">
85
+ <table class="lean-table">
86
+ <thead>
87
+ <tr>
88
+ <th data-i18n="lean.table.theorem">Theorem</th>
89
+ <th data-i18n="lean.table.claim">Claim</th>
90
+ <th data-i18n="lean.table.tactic">Tactic</th>
91
+ <th data-i18n="lean.table.source">Source</th>
92
+ <th data-i18n="lean.table.lean">Lean</th>
93
+ </tr>
94
+ </thead>
95
+ <tbody>
96
+ ${g.theorems.map(t => `
97
+ <tr>
98
+ <td><code>${escapeHtml(t.name)}</code></td>
99
+ <td>${escapeHtml(t.claim)}</td>
100
+ <td><code class="subtle">${escapeHtml(t.tactic || "")}</code></td>
101
+ <td class="subtle">${t.source ? renderSource(t.source) : "—"}</td>
102
+ <td>${badgeHtml(t.name, "L" + t.line + " ↗")}</td>
103
+ </tr>`).join("")}
104
+ </tbody>
105
+ </table>
106
+ </div>
107
+ </details>`).join("");
108
+
109
+ return `${headerHtml}${findingsHtml}<div class="lean-groups">${groupsHtml}</div>`;
110
+ }
111
+
112
+ function renderSource(src) {
113
+ const parts = [];
114
+ if (src.doc) parts.push(`<code>${escapeHtml(src.doc)}</code>`);
115
+ if (src.section) parts.push(escapeHtml(src.section));
116
+ if (src.line) parts.push(`L${src.line}`);
117
+ if (src.label) parts.push(`<em>${escapeHtml(src.label)}</em>`);
118
+ return parts.join(" · ");
119
+ }
js/main.js CHANGED
@@ -9,6 +9,8 @@
9
 
10
  import { initI18n, setLang, t } from "./i18n.js";
11
  import { initPhaseDiagram } from "./phase_diagram.js";
 
 
12
 
13
  const TAF_BROWSER_URL = "python/taf_browser.py";
14
  const ENABLE_WEBLLM = true;
@@ -1087,75 +1089,173 @@ function renderProfile(p, params) {
1087
  </div>
1088
  `).join("");
1089
 
 
 
 
 
1090
  const numbersHtml = `
1091
- <div class="num-row"><span class="num-label">γ_Padé(T_eval)</span><span class="num-value">${formatN(kn.gamma_pade)}</span></div>
1092
- <div class="num-row"><span class="num-label">γ_decomposed</span><span class="num-value">${formatN(kn.gamma_decomposed)}</span></div>
1093
- <div class="num-row"><span class="num-label">d_horizon</span><span class="num-value">${formatN(kn.d_horizon)}</span></div>
1094
- <div class="num-row"><span class="num-label">L_NIAH ceiling</span><span class="num-value">${formatN(kn.L_NIAH_ceiling)}</span></div>
1095
- <div class="num-row"><span class="num-label">χ susceptibility</span><span class="num-value">${formatN(kn.chi_susceptibility)}</span></div>
1096
- <div class="num-row"><span class="num-label">KV memory @ T_eval (BF16)</span><span class="num-value">${formatN(kn.kv_memory_per_request_GB)} GB</span></div>
1097
  `;
1098
 
1099
  const falsHtml = (p.falsification_status || []).map(f =>
1100
  `<div class="taf-falsification"><strong>${escapeHtml(f.id)}</strong> — ${escapeHtml(f.claim)}: ${escapeHtml(f.status)}</div>`
1101
  ).join("");
1102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1103
  $("profile-box").innerHTML = `
1104
  <div class="taf-card">
1105
- <div class="taf-card-summary">
1106
- <div style="font-size:1.2rem; font-weight:700;">${escapeHtml(ms.architecture_class)}</div>
1107
- <div class="subtle">
1108
  n_params=${formatN(ms.n_params)} ·
1109
  T_train=${ms.T_train} · T_eval=${ms.T_eval} ·
1110
  θ=${formatN(ms.rope_theta)} ·
1111
  ${ms.has_GQA ? "GQA" : "MHA"}${ms.has_SWA ? " + SWA" : ""}
1112
  </div>
1113
- ${(kn.gamma_decomposed ?? kn.gamma_pade) > 0 && (kn.gamma_decomposed ?? kn.gamma_pade) < 1
1114
- ? `<div class="taf-anti-ising-badge" style="margin-top:0.4em; display:inline-block; padding:0.25em 0.6em; border-radius:4px; background:rgba(110,80,200,0.15); border:1px solid rgba(110,80,200,0.4); font-size:0.85em;" data-i18n="v05.antiising.badge">
1115
- 🧲 Anti-Ising class (β=γ−1&lt;0, machine-verified)
1116
- </div>`
1117
- : ''}
 
 
 
 
1118
  </div>
1119
 
1120
- <h3 data-i18n="tafcard.recipes_title">📋 Recipes (verdict per dimension)</h3>
1121
- <div class="taf-recipes-grid">${recipesHtml}</div>
1122
-
1123
- <h3 data-i18n="tafcard.numbers_title">🔢 Key numbers (paper §26)</h3>
1124
- <div class="taf-key-numbers">${numbersHtml}</div>
1125
-
1126
- <details class="v053-audit-banner" style="margin:0.8em 0; padding:0.6em 0.8em; border:1px solid rgba(241,196,15,0.5); border-radius:6px; background:rgba(241,196,15,0.07); font-size:0.88em;">
1127
- <summary style="cursor:pointer; font-weight:600;" data-i18n="v053.calibration.title">🔬 v0.5.3 — Calibration audit (2026-05-02)</summary>
1128
- <div style="margin-top:0.5em; line-height:1.45;" data-i18n="v053.calibration.note"></div>
1129
  </details>
1130
 
1131
- <div id="whatif-container" class="whatif-box"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1132
 
1133
- <h3 data-i18n="tafcard.fals_title">🔬 Falsification status (FALSIFICATION.md F1-F23)</h3>
1134
- ${falsHtml || '<div class="subtle">No falsifications applicable.</div>'}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1135
 
1136
- <h3 style="margin-top: 1.5em;" data-i18n="v05.consistency.title">🔬 Algebraic consistency check (Sage + Lean v0.5)</h3>
1137
- <div style="margin-bottom: 0.6em; opacity: 0.85; font-size: 0.92em;" data-i18n="v05.consistency.desc">
1138
- Verifies 12 D-SAGE algebraic identities of TAF critical exponents (machine-proof
1139
- Sage Groebner basis + Lean Mathlib4). Pass = framework intact. Fail = bf16 outlier
1140
- / quantization artifact.
1141
- </div>
1142
- <button class="secondary" id="verify-consistency-btn" data-i18n="v05.consistency.btn">
1143
- 🔬 Verify algebraic consistency
1144
- </button>
1145
- <div id="consistency-result" style="margin-top: 0.8em;"></div>
1146
-
1147
- <div class="share-bar">
1148
- <button class="secondary" id="profile-share-btn" data-i18n="share.btn">🔗 Copy share link</button>
1149
- <button class="secondary" id="profile-download-btn" data-i18n="share.download">💾 Download JSON</button>
1150
- <button class="secondary" id="profile-submit-btn" data-i18n="share.submit">📤 Submit to registry</button>
1151
- <span id="profile-share-status" class="subtle"></span>
1152
- </div>
 
1153
  </div>
1154
  `;
1155
 
1156
  // Render the what-if slider for interactive exploration
1157
  renderWhatIfSlider(p, params, $("whatif-container"));
1158
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1159
  // Re-apply translations to dynamically inserted buttons
1160
  if (window.__taf_applyTranslations) window.__taf_applyTranslations();
1161
 
@@ -1175,6 +1275,49 @@ function renderProfile(p, params) {
1175
  setTimeout(() => $("profile-share-status").textContent = "", 6000);
1176
  });
1177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1178
  // v0.5.1: Algebraic consistency check button
1179
  $("verify-consistency-btn").addEventListener("click", () => {
1180
  const gammaVal = kn.gamma_decomposed ?? kn.gamma_pade;
@@ -1667,6 +1810,9 @@ document.addEventListener("DOMContentLoaded", () => {
1667
  if (file) importJSON(file, document.getElementById("import-status"));
1668
  });
1669
  }
 
 
 
1670
  });
1671
 
1672
  // ════════════════════════════════════════════════════════════════════
 
9
 
10
  import { initI18n, setLang, t } from "./i18n.js";
11
  import { initPhaseDiagram } from "./phase_diagram.js";
12
+ import { gammaCheckAll, REGIME_META } from "./gamma_check.js";
13
+ import { loadLeanManifest, badgeHtml, badgesForUiBinding, renderTheoremTable, getManifest } from "./lean_badges.js";
14
 
15
  const TAF_BROWSER_URL = "python/taf_browser.py";
16
  const ENABLE_WEBLLM = true;
 
1089
  </div>
1090
  `).join("");
1091
 
1092
+ // Reusable tooltip helper — keeps tooltip pattern uniform across the card
1093
+ const ttip = (key, fallback) =>
1094
+ `<span class="info"><span class="tooltip" data-i18n="${key}">${fallback}</span></span>`;
1095
+
1096
  const numbersHtml = `
1097
+ <div class="num-row"><span class="num-label">γ_Padé(T_eval) ${ttip("tooltip.gamma_pade", "Closed-form prediction (2−z)/(2+z), z = T√2/θ. Paper §sec:gamma_decomposition.")}</span><span class="num-value">${formatN(kn.gamma_pade)}</span></div>
1098
+ <div class="num-row"><span class="num-label">γ_decomposed ${ttip("tooltip.gamma_decomposed", "γ from full architectural decomposition: Padé baseline + GQA shift + SWA shift + post-IH shift.")}</span><span class="num-value">${formatN(kn.gamma_decomposed)}</span></div>
1099
+ <div class="num-row"><span class="num-label">d_horizon ${ttip("tooltip.d_horizon", "Effective attention horizon at T_eval. Beyond this, attention scores fall below the noise floor (paper §26).")}</span><span class="num-value">${formatN(kn.d_horizon)}</span></div>
1100
+ <div class="num-row"><span class="num-label">L_NIAH ceiling ${ttip("tooltip.L_NIAH", "Predicted ceiling for needle-in-a-haystack retrieval reliability at the current d_horizon.")}</span><span class="num-value">${formatN(kn.L_NIAH_ceiling)}</span></div>
1101
+ <div class="num-row"><span class="num-label">χ susceptibility ${ttip("tooltip.chi", "Susceptibility exponent χ = 1/(1−γ). Diverges at the Hagedorn line γ=1.")}</span><span class="num-value">${formatN(kn.chi_susceptibility)}</span></div>
1102
+ <div class="num-row"><span class="num-label">KV memory @ T_eval (BF16) ${ttip("tooltip.kv_memory", "Per-request KV cache memory at T_eval in BF16 = 2 · n_layers · n_kv_heads · d_head · T_eval bytes.")}</span><span class="num-value">${formatN(kn.kv_memory_per_request_GB)} GB</span></div>
1103
  `;
1104
 
1105
  const falsHtml = (p.falsification_status || []).map(f =>
1106
  `<div class="taf-falsification"><strong>${escapeHtml(f.id)}</strong> — ${escapeHtml(f.claim)}: ${escapeHtml(f.status)}</div>`
1107
  ).join("");
1108
 
1109
+ // Per-verdict count breakdown — recipes test orthogonal axes (long-context,
1110
+ // budget, hardware, custom-vs-API, KV-compression). Worst-of-N would conflate
1111
+ // a "use API" recommendation with a long-context failure, so we show counts.
1112
+ const verdictCounts = Object.values(p.recipes).reduce((acc, r) => {
1113
+ const c = verdictClass(r.verdict);
1114
+ acc[c] = (acc[c] || 0) + 1;
1115
+ return acc;
1116
+ }, {});
1117
+ const nYes = verdictCounts["v-yes"] || 0;
1118
+ const nDeg = verdictCounts["v-deg"] || 0;
1119
+ const nNo = verdictCounts["v-no"] || 0;
1120
+ const breakdownCls = nNo ? "v-no" : nDeg ? "v-deg" : "v-yes";
1121
+ const gammaForPill = kn.gamma_decomposed ?? kn.gamma_pade;
1122
+ const recipeCount = Object.keys(p.recipes).length;
1123
+
1124
  $("profile-box").innerHTML = `
1125
  <div class="taf-card">
1126
+ <div class="taf-hero">
1127
+ <div class="hero-arch">${escapeHtml(ms.architecture_class)}</div>
1128
+ <div class="hero-meta">
1129
  n_params=${formatN(ms.n_params)} ·
1130
  T_train=${ms.T_train} · T_eval=${ms.T_eval} ·
1131
  θ=${formatN(ms.rope_theta)} ·
1132
  ${ms.has_GQA ? "GQA" : "MHA"}${ms.has_SWA ? " + SWA" : ""}
1133
  </div>
1134
+ <div class="hero-row">
1135
+ <span class="hero-pill ${breakdownCls}">✅ ${nYes} · ⚠ ${nDeg} · ❌ ${nNo} ${ttip("tooltip.verdict_breakdown", "Per-recipe breakdown across the orthogonal axes (long-context, budget, hardware, custom-vs-API, KV-compression). Recipes are independent decisions — a ❌ on X-1 means \"use API\" not \"model fails\". Open the Recipes section for per-axis verdict.")}</span>
1136
+ ${gammaForPill !== null && gammaForPill !== undefined
1137
+ ? `<span class="hero-pill">γ = ${formatN(gammaForPill)} ${ttip("tooltip.gamma_pill", "γ_decomposed (full architectural decomposition) or γ_Padé as fallback. Range (0,1) = Phase A (anti-Ising). γ ≥ 1 = Hagedorn / Phase B.")}</span>`
1138
+ : ''}
1139
+ ${gammaForPill > 0 && gammaForPill < 1
1140
+ ? `<span class="hero-pill" style="background:rgba(110,80,200,0.15); border-color:rgba(110,80,200,0.45);"><span data-i18n="v05.antiising.badge">🧲 Anti-Ising (β=γ−1&lt;0, machine-verified)</span> ${ttip("tooltip.anti_ising", "Phase A class: β = γ−1 &lt; 0 (anti-Ising). Machine-verified by Sage Groebner basis + Lean Mathlib4. See §35 v0.5.")} ${badgesForUiBinding("anti_ising_pill")}</span>`
1141
+ : ''}
1142
+ </div>
1143
  </div>
1144
 
1145
+ <details class="taf-section" open>
1146
+ <summary>
1147
+ <span data-i18n="tafcard.recipes_title">📋 Recipes — verdict per dimension</span>
1148
+ <span class="section-count">${recipeCount} ${t("tafcard.recipes_count_label", "dimensions")}</span>
1149
+ </summary>
1150
+ <div class="taf-section-body">
1151
+ <div class="taf-recipes-grid">${recipesHtml}</div>
1152
+ </div>
 
1153
  </details>
1154
 
1155
+ <details class="taf-section">
1156
+ <summary>
1157
+ <span data-i18n="tafcard.diag_title">🔬 Diagnostics — numbers + γ check + what-if</span>
1158
+ </summary>
1159
+ <div class="taf-section-body">
1160
+ <h4 style="margin-top:0.3em;" data-i18n="tafcard.numbers_title">🔢 Key numbers (paper §26)</h4>
1161
+ <div class="taf-key-numbers">${numbersHtml}</div>
1162
+
1163
+ <h4 style="margin-top:1.2em;" data-i18n="gamma_check.title">🔍 γ predicted vs observed</h4>
1164
+ <div class="recipe-desc" data-i18n="gamma_check.desc">
1165
+ Enter your empirically measured γ. Tool detects regime: fraud (θ inflated) / compressed / over-Padé / SWA-random / normal.
1166
+ </div>
1167
+ <div class="form-grid" style="margin:0.5em 0 0.6em;">
1168
+ <div class="form-field">
1169
+ <label><span data-i18n="gamma_check.gobs_label">γ_observed</span>
1170
+ <span class="info"><span class="tooltip" data-i18n="gamma_check.gobs_tip">Empirically measured γ from your model's attention scores. Use the Diagnose CLI to obtain this from real weights.</span></span>
1171
+ </label>
1172
+ <input type="number" id="gc-gobs" step="0.0001" value="${formatN(kn.gamma_decomposed ?? kn.gamma_pade)}" />
1173
+ </div>
1174
+ <div class="form-field">
1175
+ <label><span data-i18n="gamma_check.random_label">Random corpus?</span>
1176
+ <span class="info"><span class="tooltip" data-i18n="gamma_check.random_tip">Tick if γ_observed was measured on random/unstructured tokens. Distinguishes SWA signature (γ_obs &gt; 1) from anomaly.</span></span>
1177
+ </label>
1178
+ <select id="gc-random">
1179
+ <option value="false" selected data-i18n="common.no">No</option>
1180
+ <option value="true" data-i18n="common.yes">Yes</option>
1181
+ </select>
1182
+ </div>
1183
+ </div>
1184
+ <div id="gamma-check-results"></div>
1185
+
1186
+ <h4 style="margin-top:1.2em;" data-i18n="tafcard.whatif_title">🎚️ What-if explorer</h4>
1187
+ <div id="whatif-container" class="whatif-box"></div>
1188
+ </div>
1189
+ </details>
1190
 
1191
+ <details class="taf-section">
1192
+ <summary>
1193
+ <span data-i18n="tafcard.verify_title">✓ Verification — Lean + Sage + falsification</span>
1194
+ </summary>
1195
+ <div class="taf-section-body">
1196
+ <h4 style="margin-top:0.3em;" data-i18n="lean.table.title">📑 Lean+Mathlib theorem table</h4>
1197
+ <div style="margin-bottom: 0.6em; opacity: 0.85; font-size: 0.92em;" data-i18n="lean.table.desc">
1198
+ Every entry below is machine-proven against Lean 4 + Mathlib4. Click any L# link to jump to the source line on GitHub. The table is grouped by topic; click a header to expand.
1199
+ </div>
1200
+ <div id="lean-table-host"></div>
1201
+
1202
+ <h4 style="margin-top:1.2em;" data-i18n="v05.consistency.title">🔬 Algebraic consistency (Sage + Lean v0.5)</h4>
1203
+ <div style="margin-bottom: 0.6em; opacity: 0.85; font-size: 0.92em;" data-i18n="v05.consistency.desc">
1204
+ Verifies 12 D-SAGE algebraic identities of TAF critical exponents (machine-proof Sage Groebner basis + Lean Mathlib4). Pass = framework intact. Fail = bf16 outlier / quantization artifact.
1205
+ </div>
1206
+ <div class="lean-badges-row">${badgesForUiBinding("algebraic_consistency_check")}</div>
1207
+ <button class="secondary" id="verify-consistency-btn" data-i18n="v05.consistency.btn">
1208
+ 🔬 Verify algebraic consistency
1209
+ </button>
1210
+ <div id="consistency-result" style="margin-top: 0.8em;"></div>
1211
+
1212
+ <h4 style="margin-top:1.2em;" data-i18n="tafcard.fals_title">🔬 Falsification status (F1-F23)</h4>
1213
+ ${falsHtml || '<div class="subtle" data-i18n="tafcard.fals_none">No falsifications applicable.</div>'}
1214
+ </div>
1215
+ </details>
1216
 
1217
+ <details class="taf-section">
1218
+ <summary>
1219
+ <span data-i18n="tafcard.share_title">📂 Provenance & share</span>
1220
+ </summary>
1221
+ <div class="taf-section-body">
1222
+ <details style="margin:0.4em 0 0.8em; padding:0.6em 0.8em; border:1px solid rgba(241,196,15,0.5); border-radius:6px; background:rgba(241,196,15,0.07); font-size:0.88em;">
1223
+ <summary style="cursor:pointer; font-weight:600;" data-i18n="v053.calibration.title">🔬 v0.5.3 — Calibration audit (2026-05-02)</summary>
1224
+ <div style="margin-top:0.5em; line-height:1.45;" data-i18n="v053.calibration.note"></div>
1225
+ </details>
1226
+
1227
+ <div class="share-bar">
1228
+ <button class="secondary" id="profile-share-btn" data-i18n="share.btn">🔗 Copy share link</button>
1229
+ <button class="secondary" id="profile-download-btn" data-i18n="share.download">💾 Download JSON</button>
1230
+ <button class="secondary" id="profile-submit-btn" data-i18n="share.submit">📤 Submit to registry</button>
1231
+ <span id="profile-share-status" class="subtle"></span>
1232
+ </div>
1233
+ </div>
1234
+ </details>
1235
  </div>
1236
  `;
1237
 
1238
  // Render the what-if slider for interactive exploration
1239
  renderWhatIfSlider(p, params, $("whatif-container"));
1240
 
1241
+ // Render Lean+Mathlib theorem table (graceful no-op if manifest missed).
1242
+ // Loaded async at bootstrap; if Profile clicked before fetch resolves we
1243
+ // wait once and then render.
1244
+ const renderLeanTable = () => {
1245
+ const host = $("lean-table-host");
1246
+ if (!host) return;
1247
+ if (getManifest()) {
1248
+ host.innerHTML = renderTheoremTable();
1249
+ if (window.__taf_applyTranslations) window.__taf_applyTranslations();
1250
+ } else {
1251
+ host.innerHTML = `<div class="subtle" data-i18n="lean.manifest.loading">Loading Lean manifest…</div>`;
1252
+ loadLeanManifest()
1253
+ .then(() => { host.innerHTML = renderTheoremTable(); if (window.__taf_applyTranslations) window.__taf_applyTranslations(); })
1254
+ .catch(err => { host.innerHTML = `<div class="subtle" data-i18n="lean.manifest.error">Lean manifest unavailable: ${err.message}</div>`; });
1255
+ }
1256
+ };
1257
+ renderLeanTable();
1258
+
1259
  // Re-apply translations to dynamically inserted buttons
1260
  if (window.__taf_applyTranslations) window.__taf_applyTranslations();
1261
 
 
1275
  setTimeout(() => $("profile-share-status").textContent = "", 6000);
1276
  });
1277
 
1278
+ // v0.6: γ predicted-vs-observed panel — interactive
1279
+ const updateGammaCheck = () => {
1280
+ const gObs = parseFloat($("gc-gobs").value);
1281
+ const isRandom = $("gc-random").value === "true";
1282
+ const r = gammaCheckAll({ theta: params.theta, T: params.T_eval, gObs, isRandom });
1283
+ const meta = REGIME_META[r.regime] || REGIME_META.unknown;
1284
+ const fmt = (x, d=4) => (x === null || x === undefined || Number.isNaN(x))
1285
+ ? "n/a"
1286
+ : (!Number.isFinite(x) ? "∞" : Number(x).toLocaleString(undefined, { maximumFractionDigits: d }));
1287
+ $("gamma-check-results").innerHTML = `
1288
+ <div class="taf-key-numbers">
1289
+ <div class="num-row"><span class="num-label">γ_Padé(T_eval) ${ttip("tooltip.gamma_pade", "Closed-form prediction (2−z)/(2+z), z = T√2/θ.")}</span><span class="num-value">${fmt(r.gammaPade)}</span></div>
1290
+ <div class="num-row"><span class="num-label">θ_eff (observed) ${ttip("tooltip.theta_eff_obs", "Effective θ implied by your γ_observed: T√2 / (1 − γ_obs).")}</span><span class="num-value">${fmt(r.thetaEffObs, 1)}</span></div>
1291
+ <div class="num-row"><span class="num-label">θ_eff (Padé) ${ttip("tooltip.theta_eff_pade", "Effective θ predicted by closed-form: θ + T/√2.")}</span><span class="num-value">${fmt(r.thetaEffPade, 1)}</span></div>
1292
+ <div class="num-row"><span class="num-label">η = θ_eff_obs / θ_eff_Padé ${ttip("tooltip.efficiency", "Efficiency ratio. ≈1 = normal · &lt;0.01 = fraud · &lt;0.5 = compressed · &gt;1.5 = over-Padé.")}</span><span class="num-value">${fmt(r.efficiency)}</span></div>
1293
+ <div class="num-row"><span class="num-label">ΔH_Cardy = log(θ_eff_obs / θ_nominal) ${ttip("tooltip.delta_h_cardy", "Cardy entropy shift. Negative = compression entropy. ~0 = nominal match.")}</span><span class="num-value">${fmt(r.deltaHCardy)}</span></div>
1294
+ </div>
1295
+ <div class="taf-recipe-tile ${meta.cls}" style="margin-top:0.6em;">
1296
+ <div class="tile-header">
1297
+ <span data-i18n="gamma_check.regime">Regime</span>
1298
+ <span class="tile-verdict">${meta.emoji} <span data-i18n="gamma_check.regime.${r.regime}">${r.regime}</span></span>
1299
+ </div>
1300
+ <div class="tile-reason" data-i18n="gamma_check.regime.${r.regime}.desc"></div>
1301
+ </div>
1302
+ <details style="margin-top:0.6em;">
1303
+ <summary style="cursor:pointer; font-weight:600;" data-i18n="gamma_check.glossary.title">ⓘ What do these mean?</summary>
1304
+ <ul class="gc-glossary" style="margin:0.5em 0 0 1.2em; line-height:1.55;">
1305
+ <li data-i18n="gamma_check.glossary.gamma_pade"></li>
1306
+ <li data-i18n="gamma_check.glossary.gamma_obs"></li>
1307
+ <li data-i18n="gamma_check.glossary.theta_eff_obs"></li>
1308
+ <li data-i18n="gamma_check.glossary.theta_eff_pade"></li>
1309
+ <li data-i18n="gamma_check.glossary.efficiency"></li>
1310
+ <li data-i18n="gamma_check.glossary.delta_h"></li>
1311
+ <li data-i18n="gamma_check.glossary.regime"></li>
1312
+ </ul>
1313
+ </details>
1314
+ `;
1315
+ if (window.__taf_applyTranslations) window.__taf_applyTranslations();
1316
+ };
1317
+ $("gc-gobs").addEventListener("input", updateGammaCheck);
1318
+ $("gc-random").addEventListener("change", updateGammaCheck);
1319
+ updateGammaCheck();
1320
+
1321
  // v0.5.1: Algebraic consistency check button
1322
  $("verify-consistency-btn").addEventListener("click", () => {
1323
  const gammaVal = kn.gamma_decomposed ?? kn.gamma_pade;
 
1810
  if (file) importJSON(file, document.getElementById("import-status"));
1811
  });
1812
  }
1813
+ // Lean+Mathlib manifest — load in parallel with everything else; badges
1814
+ // appear once it resolves, but app stays usable if it fails.
1815
+ loadLeanManifest().catch(err => console.warn("Lean manifest unavailable:", err));
1816
  });
1817
 
1818
  // ════════════════════════════════════════════════════════════════════
style.css CHANGED
@@ -590,3 +590,182 @@ footer a:hover { text-decoration: underline; }
590
  margin: 0.6em 0;
591
  overflow-x: auto;
592
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
590
  margin: 0.6em 0;
591
  overflow-x: auto;
592
  }
593
+
594
+ /* ─── TAF Card accordion sections (v0.6 — UX restructuring) ─── */
595
+ .taf-section {
596
+ margin: 0.7em 0;
597
+ border: 1px solid var(--border);
598
+ border-radius: 6px;
599
+ background: rgba(255,255,255,0.018);
600
+ overflow: hidden;
601
+ }
602
+ .taf-section > summary {
603
+ cursor: pointer;
604
+ list-style: none;
605
+ padding: 0.7em 0.95em;
606
+ font-weight: 600;
607
+ font-size: 1.02em;
608
+ user-select: none;
609
+ display: flex;
610
+ align-items: center;
611
+ gap: 0.5em;
612
+ transition: background 0.12s;
613
+ }
614
+ .taf-section > summary:hover { background: rgba(255,255,255,0.04); }
615
+ .taf-section > summary::-webkit-details-marker { display: none; }
616
+ .taf-section > summary::before {
617
+ content: "▶";
618
+ display: inline-block;
619
+ font-size: 0.7em;
620
+ color: var(--fg-dim);
621
+ transition: transform 0.15s ease;
622
+ width: 0.8em;
623
+ text-align: center;
624
+ }
625
+ .taf-section[open] > summary::before { transform: rotate(90deg); }
626
+ .taf-section > summary .section-count {
627
+ margin-left: auto;
628
+ font-size: 0.82em;
629
+ color: var(--fg-dim);
630
+ font-weight: 500;
631
+ }
632
+ .taf-section-body {
633
+ padding: 0.4em 1em 1em 1em;
634
+ border-top: 1px solid var(--border);
635
+ background: var(--bg);
636
+ }
637
+ /* Hero strip — always-visible top-line summary */
638
+ .taf-hero {
639
+ padding: 0.9em 1em;
640
+ border: 1px solid var(--border);
641
+ border-radius: 6px;
642
+ background: linear-gradient(135deg, rgba(110,80,200,0.06), rgba(255,255,255,0.02));
643
+ margin-bottom: 0.4em;
644
+ }
645
+ .taf-hero .hero-arch { font-size: 1.15rem; font-weight: 700; }
646
+ .taf-hero .hero-meta { color: var(--fg-dim); font-size: 0.88em; margin-top: 0.25em; }
647
+ .taf-hero .hero-row {
648
+ display: flex; flex-wrap: wrap; gap: 0.5em 1em;
649
+ align-items: center; margin-top: 0.5em;
650
+ }
651
+ .taf-hero .hero-pill {
652
+ display: inline-flex; align-items: center; gap: 0.35em;
653
+ padding: 0.2em 0.6em; border-radius: 999px;
654
+ font-size: 0.85em; font-weight: 600;
655
+ background: var(--bg-input);
656
+ border: 1px solid var(--border);
657
+ }
658
+ .taf-hero .hero-pill.v-yes { color: var(--success); border-color: var(--success); }
659
+ .taf-hero .hero-pill.v-no { color: var(--danger); border-color: var(--danger); }
660
+ .taf-hero .hero-pill.v-deg { color: var(--warning); border-color: var(--warning); }
661
+
662
+ /* ─── Lean+Mathlib provenance (v0.6) ─── */
663
+ .lean-badge {
664
+ display: inline-block;
665
+ padding: 0.08em 0.45em;
666
+ margin: 0 0.15em;
667
+ border: 1px solid rgba(110,80,200,0.45);
668
+ background: rgba(110,80,200,0.10);
669
+ border-radius: 4px;
670
+ color: var(--accent, #b48cff);
671
+ text-decoration: none;
672
+ font-size: 0.78em;
673
+ font-family: monospace;
674
+ vertical-align: middle;
675
+ white-space: nowrap;
676
+ }
677
+ .lean-badge:hover {
678
+ background: rgba(110,80,200,0.22);
679
+ text-decoration: none;
680
+ }
681
+ .lean-badges-row {
682
+ margin: 0.4em 0 0.6em;
683
+ line-height: 1.9;
684
+ }
685
+ .lean-meta {
686
+ font-size: 0.88em;
687
+ margin-bottom: 0.6em;
688
+ padding: 0.5em 0.7em;
689
+ background: rgba(255,255,255,0.02);
690
+ border-left: 3px solid var(--accent);
691
+ border-radius: 4px;
692
+ }
693
+ .lean-meta a { color: var(--accent); }
694
+ .lean-findings {
695
+ margin: 0.6em 0 0.8em;
696
+ padding: 0.5em 0.7em;
697
+ border: 1px solid rgba(241,196,15,0.4);
698
+ background: rgba(241,196,15,0.06);
699
+ border-radius: 6px;
700
+ }
701
+ .lean-findings > summary {
702
+ cursor: pointer;
703
+ font-size: 1em;
704
+ }
705
+ .lean-finding {
706
+ margin: 0.6em 0;
707
+ padding: 0.6em 0.7em;
708
+ border-left: 3px solid var(--warning);
709
+ background: rgba(255,255,255,0.025);
710
+ border-radius: 0 4px 4px 0;
711
+ }
712
+ .lean-pill {
713
+ display: inline-block;
714
+ margin-left: 0.4em;
715
+ padding: 0.05em 0.45em;
716
+ font-size: 0.75em;
717
+ border-radius: 999px;
718
+ border: 1px solid var(--border);
719
+ text-transform: uppercase;
720
+ letter-spacing: 0.04em;
721
+ }
722
+ .lean-pill.v-deg { color: var(--warning); border-color: var(--warning); }
723
+ .lean-groups .lean-group {
724
+ margin: 0.4em 0;
725
+ border: 1px solid var(--border);
726
+ border-radius: 4px;
727
+ background: var(--bg);
728
+ }
729
+ .lean-group > summary {
730
+ cursor: pointer;
731
+ padding: 0.5em 0.7em;
732
+ user-select: none;
733
+ font-weight: 600;
734
+ list-style: none;
735
+ }
736
+ .lean-group > summary::-webkit-details-marker { display: none; }
737
+ .lean-group > summary::before {
738
+ content: "▶ ";
739
+ font-size: 0.7em;
740
+ color: var(--fg-dim);
741
+ transition: transform 0.15s;
742
+ }
743
+ .lean-group[open] > summary::before {
744
+ content: "▼ ";
745
+ }
746
+ .lean-table-wrap {
747
+ max-height: 380px;
748
+ overflow: auto;
749
+ border-top: 1px solid var(--border);
750
+ }
751
+ .lean-table {
752
+ width: 100%;
753
+ border-collapse: collapse;
754
+ font-size: 0.85em;
755
+ }
756
+ .lean-table th, .lean-table td {
757
+ padding: 0.4em 0.6em;
758
+ text-align: left;
759
+ vertical-align: top;
760
+ border-bottom: 1px solid var(--border);
761
+ }
762
+ .lean-table th {
763
+ position: sticky;
764
+ top: 0;
765
+ background: var(--bg-input);
766
+ color: var(--accent);
767
+ font-family: monospace;
768
+ z-index: 1;
769
+ }
770
+ .lean-table tbody tr:hover { background: rgba(255,255,255,0.03); }
771
+ .lean-table code { font-size: 0.95em; }