Skip to content

feat(numeric): rename the ladder GF-T -> TEF (Ternary-Exponent Float) (Refs #2001) - #2008

Merged
gHashTag merged 11 commits into
masterfrom
feat/rename-gft-to-tf
Aug 9, 2026
Merged

feat(numeric): rename the ladder GF-T -> TEF (Ternary-Exponent Float) (Refs #2001)#2008
gHashTag merged 11 commits into
masterfrom
feat/rename-gft-to-tf

Conversation

@gHashTag

@gHashTag gHashTag commented Aug 9, 2026

Copy link
Copy Markdown
Owner

Why the old name had to go

"GF" claimed a lineage this format does not have. GF sizes its exponent by e = round((N−1)/φ²), which puts e/m at 1/φ by construction. This ladder sizes its exponent for range and takes M = N−1−E_t — and its φ-distance rises toward 1/φ as N grows. It is maximally far from the φ split, not near it.

The last tie to GF16 was an inherited M = 9, and #2005 severed it by moving the 16-bit rung to M = 11.

Why TEF and not TF

An intermediate pass named the ladder TF. That collided head-on with NVIDIA TensorFloat-32, which holds id=tf32 and the file tf32_conformance_v0.json — I overwrote its pack before the WP-18 gate caught it as a sha drift.

TEF removes the collision rather than working around it. NVIDIA keeps tf32, its filename and its name, and the pack is byte-identical to the pre-rename tree — verified by SHA-256 against HEAD~1, not by inspection. Nothing of theirs moved.

TEF also says exactly what is true and nothing more:

the exponent field is balanced ternary; the radix is binary.

That distinction is not pedantry. A genuine ternary-radix float — scaling by 3^e, as Ternary27 does — measures 0.331 positions per number worse at equal width. A name claiming a ternary radix would claim the one thing this format deliberately declines. "GF" failed in the other direction.

What landed

specs/numeric/tef*.t27 · catalog ids tefN · modules triformat_tefN · packs tef*_conformance_v0.json · the numeric SSOT document · the erratum.

Gates

gate result
catalog count SSOT == fresh regen == 92
WP-18 conformance integrity CLEAN
t27c check, nine TEF specs 0 errors
NVIDIA pack vs pre-rename SHA-256 identical

specs/numeric/tf3.t27 still fails t27c with a type mismatch at line 255. That is a different, pre-existing format (8-bit, ternary NN weights) and predates this change — verified by stashing.

🤖 Generated with Claude Code

Dmitrii Vasilev and others added 8 commits August 9, 2026 00:54
… rungs

GF-T was absent from specs/numeric/formats_catalog.t27 entirely. The only id
matching "gft" was gfternary, which is a different format -- a 2-bit
{-phi, 0, +phi} alphabet, not the ternary-EXPONENT ladder. So the ladder had spec
files for four rungs, no catalog rows, and no conformance packs, while a sibling
repo's specs/gft.tri named this directory as its own source of truth. The rows and
the five missing rungs are added here, where they belong.

The ladder follows the width rule 1 + E_t + M = N, counting one position per trit
-- the rule gft4, gft8 and gft32 already satisfy exactly. GF-T64 (7 trits, 56
bits), GF-T128 (8, 119), GF-T256 (9, 246), GF-T512 (10, 501), GF-T1024 (11, 1012)
follow it. gft16 keeps its historical M = 9 and therefore 14 of its 16 positions;
that gap is recorded rather than silently closed, because spending it invalidates
the conformance vectors and the published silicon numbers.

Two fields in the new rows need reading with care and the block comment says so.
e= counts TRITS, not bits, with the bit-equivalent E_t*log2(3) spelled out in each
row. And phi_distance, computed by the catalog's own |e/m - 1/phi| on that
equivalent, rises toward 1/phi as N grows. That is structural, not a defect: GF
sizes its exponent by e = round((N-1)/phi^2), which puts e/m at 1/phi by
construction, while GF-T sizes its exponent for range and takes M = N-1-E_t. The
two ladders optimise different axes and the field now makes that visible instead
of implying GF-T is a worse GF.

Conformance packs for all nine rungs are generated from the reference oracle. The
probes are powers of two and 1.5*2^e chosen inside each rung's own exponent range,
so every value is exactly representable in both the rung and f64 and every
abs_error is exactly zero by construction -- no allowlist entries needed. An
earlier attempt used fixed probes including 100.0, which GF-T4 cannot represent at
all (its exponent reaches 4); the integrity gate caught it as undisclosed nonzero
error, which is the gate working.

Gates: catalog count SSOT == fresh regen == 92 (the paper's declared 84 was
already stale at 83 before this change; the errata reminder now reads 92).
WP-18 conformance integrity CLEAN. t27c typechecks all nine specs.

Two of my own errors are worth recording. I first extended the derived
zig-golden-float/specs/gft.tri instead of this catalog, though that file's own
provenance field points here. And my regeneration filter matched the prefix "gft"
and dropped gfternary from the pack index; the gate caught that too, after a
baseline run on stashed changes showed it had been CLEAN before I touched it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The catalog now carries all nine GF-T rows but NUMERIC_FORMATS_SSOT.md still
described only the binary GF ladder, TF3 and GFTernary. Anyone reading the
document rather than the catalog would conclude the ternary-exponent ladder does
not exist, and section 4 is precisely where that confusion is supposed to be
prevented -- it already exists to keep TF3 and GFTernary apart.

Section 4a adds the third object. GF-T is not a ternary alphabet: it is an
ordinary binary-radix float whose exponent FIELD is a balanced-ternary integer.
Only the encoding is ternary; the scale is a power of two. A format that scales by
3^e -- Ternary27 is the published example -- is a different design and measurably
a worse one at equal width, by 0.33 positions per number, and the section gives
the closed form.

The table carries all nine rungs with the width rule, the range, the measured
post-route figures where they exist, and an explicit "fits rule" column so
GF-T16's two unallocated positions are visible rather than buried.

Two columns are read wrong without help, so the section explains both. E is a
count of trits; the bit-equivalent is given. And phi-distance rises toward 1/phi
as N grows, which is structural: GF sizes its exponent by round((N-1)/phi^2),
putting E/M at 1/phi by construction, while GF-T sizes its exponent for range.
Without that note GF-T reads as a progressively worse GF, which it is not -- the
two ladders optimise different axes.

The section states what the fixed field buys and what it does not, because the
second half is what keeps the first half honest. It buys the regime codec: 438
LUTs for a unary one, 40 for a length-prefixed one, 0 here, which through the
measured area law A(M) = 141 + 2.4455 M^2 is 9.95 mantissa bits of silicon at the
16-bit class and 1.00 at M = 90. It does not buy unbounded range: by Kraft no
prefix code on the integers beats l(e) = log2|e| infinitely often, so takum's
regime is asymptotically optimal and nothing including GF-T beats it beyond GF-T's
own range. The 2.83x and 5.46x hold inside that range and are marked as such.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…than miscounted

The 2026-06-14 erratum set the canonical count at 83 and superseded the paper's
84. That number has moved again, and for a different reason than last time.

Last time was a miscount. This time GF-T -- the ternary-exponent ladder -- had
zero rows in the catalog. The only id matching `gft` was `gfternary`, a different
object entirely: a 2-bit {-phi, 0, +phi} alphabet, not a float with a
balanced-ternary exponent field. Four rungs existed as .t27 specs with no catalog
row and no conformance pack; five more did not exist at all. A sibling
repository's specs/gft.tri named this directory as its own source of truth, so the
ladder was being maintained downstream of a catalog that had never heard of it.

Registering all nine rungs with their packs is the whole of the +9. Canonical
count going forward is 92; both 84 and 83 are superseded. The amendment carries
the cluster breakdown at 92 and states what did not change: no pack, SHA-256 or
bit-exact vector from the 83 is affected, nothing was renumbered or re-hashed.

The recommendation from June stands and this is the second time it has needed
acting on. The paper's count is a constant in the gate rather than a derived
number, which is exactly what lets the two drift; quote the live SSOT count with
the commit that produced it, not a number frozen into a title.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ome back (Refs #2001)

Two things, one of them a defect I shipped in #1955.

gft4/8/16/32.t27 existed only in an unpushed local commit and were never on
master. #1955 added nine catalog rows pointing at them, so four source= pointers
have been dangling since it merged. Recovered from ff0b8de83; all nine specs now
exist where the catalog says they do, and t27c typechecks each.

gft16 then spends the two positions it was carrying unallocated. It used 14 of its
16: it inherited GF16's phi-optimal M = 9 and replaced GF16's six-bit exponent
with four trits, and nobody re-spent what that freed. It was the only rung derived
from its parent rather than from the ladder's width rule.

Spent on mantissa rather than exponent, and the reason is a measurement rather
than a preference. At this class the extra range is not consumed: quantised
inference tensors span roughly 2^-14 to 2^14, and E_t = 4 already clips nothing at
+/-40 binades -- 0 clips in 2000 values. E_t = 6 would have bought +/-364 binades
at bit-identical error, which is range nobody spends at 16 bits.

Measured effect: error 3.45e-4 -> 8.63e-5, a factor of 4.00 exactly as the
precision law requires, since the exponent cancels and only M moves. Against
takum16 the rung goes from 0.92x / 2.88x / 5.49x to 3.70x / 11.37x / 22.28x and
stops losing the near bin. Silicon 372 -> 443 LUTs, +19%, at 131.73 -> 136.44 MHz:
no frequency penalty.

Conformance re-run in full rather than assumed: round-trip with sign 2000/2000,
encoding monotone with 0 inversions, +/- symmetry 0/500 mismatches, lower boundary
decodes. The gft16 pack is regenerated at M = 11 and a width_rule test added to
the spec, so the position count is now asserted rather than remembered.

All nine rungs satisfy 1 + E_t + M = N. Catalog count 92, WP-18 CLEAN, t27c clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Four conflicts, all from the squash-merge of #1955: master carries the M = 9 rung
this branch changes to M = 11.

  formats_catalog.t27   take this branch's row -- M = 11 is the PR's subject
  gft16_conformance_v0  take this branch's pack, regenerated at M = 11
  INDEX_all_formats     take master's index, recompute the gft16 entry's hash
  docs/NOW.md           keep both entries, this branch's on top

Gates after resolution: catalog count 92, WP-18 CLEAN, t27c clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… id (Refs #2001)

"GF" claimed a lineage this format does not have. GF sizes its exponent by
e = round((N-1)/phi^2), which puts e/m at 1/phi by construction. This ladder sizes
its exponent for RANGE and takes M = N-1-E_t, and its phi-distance RISES toward
1/phi as N grows -- it is maximally far from the phi split, not near it. The last
tie to GF16 was an inherited M = 9, and that was severed when the 16-bit rung went
to M = 11.

Renamed throughout: specs/numeric/gft*.t27 -> tf*.t27, catalog ids gftN -> tfN,
modules triformat_gftN -> triformat_tfN, conformance packs, INDEX entries, the
numeric SSOT document and the erratum.

The collision, and what I did to it. NVIDIA TensorFloat-32 held id=tf32 AND the
filename tf32_conformance_v0.json. Its internal id moves to tensorfloat32 and its
pack to tensorfloat32_conformance_v0.json; its human-readable name,
"TensorFloat-32 (TF32)", is unchanged, because that is NVIDIA's name and not ours
to alter. Only the internal identifier moved.

I overwrote NVIDIA's pack during the rename before noticing, and restored it from
git. The WP-18 gate caught it as a sha drift on tf32_conformance_v0.json rather
than letting it through, and a second run caught that I had added a pack without
bumping bitexact_packs in the index header. Both are the gate doing its job; I am
recording them rather than presenting a clean sweep.

One thing worth stating plainly: after this rename the catalog contains two
formats whose short name reads TF32 -- ours and NVIDIA's. Their ids, files and
display names all differ, so nothing is ambiguous to a tool, but a human skimming
will need the context. That is a known cost of the name and was accepted
deliberately.

Gates: catalog count SSOT == fresh regen == 92; WP-18 CLEAN; t27c clean on all
nine TF specs. specs/numeric/tf3.t27 still fails t27c with a type mismatch at line
255 -- that predates this change and is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-09 05:19:13 UTC

Summary

Status Count
Total Open PRs 15
PRs with Failing Checks 3
PRs with All Checks Green 12
READY 5
FAILING 3
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=6c30e43706ec != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

#2001)

The previous commit renamed the ladder TF, which collided head-on with NVIDIA
TensorFloat-32: it holds id=tf32 and the file tf32_conformance_v0.json, and I
overwrote its pack before the gate caught it. TEF removes the collision rather
than working around it.

NVIDIA keeps tf32, its filename and its name, and the pack is byte-identical to
the pre-rename tree -- verified by SHA-256 against HEAD~1, not by inspection.
Nothing of theirs moved.

TEF -- Ternary-Exponent Float -- also says exactly what is true and nothing more.
The exponent FIELD is balanced ternary; the radix is BINARY. That distinction is
not pedantry: a genuine ternary-radix float, scaling by 3^e as Ternary27 does,
measures 0.331 positions per number WORSE at equal width, so a name claiming a
ternary radix would claim the one thing this format deliberately declines. "GF"
failed in the other direction, claiming a phi-optimal lineage the ladder does not
have.

specs/numeric/tef*.t27, catalog ids tefN, modules triformat_tefN, packs
tef*_conformance_v0.json, plus the numeric SSOT document and the erratum.

Gates: catalog count SSOT == fresh regen == 92; WP-18 CLEAN; t27c clean on all
nine TEF specs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-09 05:24:49 UTC

Summary

Status Count
Total Open PRs 15
PRs with Failing Checks 2
PRs with All Checks Green 13
READY 5
FAILING 2
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=6c30e43706ec != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag gHashTag changed the title feat(numeric): rename the ladder GF-T -> TF, and give NVIDIA back its id (Refs #2001) feat(numeric): rename the ladder GF-T -> TEF (Ternary-Exponent Float) (Refs #2001) Aug 9, 2026
master carries the M = 11 change from #2005 under the old gft names; this branch
carries the same change under tef. Verified the conflicting hunks differ ONLY by
naming before taking this side, rather than assuming it.

  formats_catalog   this branch (TEF), sides confirmed name-identical otherwise
  tef16 pack        this branch, already at M = 11
  INDEX             master's, ids remapped gft* -> tef*, hashes recomputed from
                    the files actually on disk rather than carried over
  docs/NOW.md       both entries kept

Gates: catalog count 92, WP-18 CLEAN, t27c clean on all nine TEF specs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-09 05:28:40 UTC

Summary

Status Count
Total Open PRs 14
PRs with Failing Checks 1
PRs with All Checks Green 13
READY 5
FAILING 1
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=6c30e43706ec != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

…(Refs #2001)

I deleted specs/numeric/gfternary.t27 with my own `rm -f specs/numeric/gft*.t27`
during the TEF rename. It is a different object -- a 2-bit {-phi, 0, +phi}
alphabet, not a float -- that merely shares a prefix with the old GF-T names. The
catalog row survived while the spec file did not, so nothing noticed. Restored
from origin/master, byte-identical by SHA-256, and it typechecks.

The same glob had already dropped gfternary from the pack index a few hours
earlier. Twice is a pattern, so it gets a gate rather than more care.

Renaming the ladder is not retracting its measurements. arXiv:2606.05017 and
arXiv:2606.09686 cite GF-T, and it labels every published comparison against
takum, tekum and posit -- those are the same nine rungs under a different name.
former_name="GF-T{N}" now rides on every TEF row, and the catalog header states
why, along with the two neighbours a bare gft* glob will swallow.

tools/check_catalog_integrity.py asserts four things: every source= resolves; the
three prefix-sharing neighbours are each present ON DISK, not merely as a catalog
row; they are distinct families rather than aliases; and the former name survives.

Verified red on each failure individually rather than green on the happy path --
removing gfternary.t27 exits 1 with MISSING, removing gf16.t27 exits 1 with
DANGLING, and both go back to 0 when restored. A gate seen only green is not
evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-09 05:38:53 UTC

Summary

Status Count
Total Open PRs 14
PRs with Failing Checks 1
PRs with All Checks Green 13
READY 5
FAILING 1
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=6c30e43706ec != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@gHashTag
gHashTag merged commit 77ca79d into master Aug 9, 2026
20 of 21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant