Skip to content

fix(LTX25-DIT-ATTN-FA2-HD128): pin the distilled NVFP4 DiT to the artefact every measurement loaded, and hash it - #1873

Merged
localai-bot merged 4 commits into
mainfrom
row/LTX25-DIT-ATTN-FA2-HD128-1723
Aug 25, 2026
Merged

fix(LTX25-DIT-ATTN-FA2-HD128): pin the distilled NVFP4 DiT to the artefact every measurement loaded, and hash it#1873
localai-bot merged 4 commits into
mainfrom
row/LTX25-DIT-ATTN-FA2-HD128-1723

Conversation

@localai-bot

Copy link
Copy Markdown
Collaborator

Lightricks/LTX-2.5 published two different files under
diffusion_models/ltx-2.5-22b-distilled-transformer-nvfp4.safetensors. The
docs/USAGE.md registry row named the one no run here has ever loaded.

Both value sets are real. Revision 6c7e5e57... gives 18,721,548,408 bytes and
7877 tensors, read from the HuggingFace tree listing on 17 August 2026 and
confirmed by an authenticated range request on 20 August 2026. Revision
8a4ff96f... gives 18,721,432,024 bytes and 7876 tensors, and that is the copy
on the shared checkout. main moved between 12 and 17 August 2026, and the file
gained 116,384 bytes and one tensor. Neither field was a transcription error, so
neither value was simply stale.

The registry names the checkpoints the recipes used, so the row must carry the
local artefact. nvfp4-nibble-order.md and benchmark-record.md both measured
18,721,432,024 bytes and 7876 tensors. Only the header of the 6c7e5e57...
artefact was ever read here.

The row now carries a SHA-256, which AGENTS.md requires for a quantized
artifact and which is what made the earlier disagreement unresolvable. It was
derived by hashing the local bytes, not reported: 66.1 MiB/s over 270 s. It
equals the etag the huggingface_hub .metadata sidecar recorded, so the
sidecar is corroborated rather than trusted. Hashing the audio VAE in the same
session reproduced its recorded value and is the control on the method.

The superseded revision and size stay in docs/USAGE.md beside the corrected
row, because earlier evidence cites them. docs/models/ltx-2-5.md told a
reader to fetch 6c7e5e57... for the first-party assets, which hands over a
different NVFP4 DiT, so it now warns and names both revisions.

Closes #1723.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]

mudler added 4 commits August 24, 2026 18:49
…efact every measurement loaded, and hash it

`Lightricks/LTX-2.5` published two different files under
`diffusion_models/ltx-2.5-22b-distilled-transformer-nvfp4.safetensors`. The
`docs/USAGE.md` registry row named the one no run here has ever loaded.

Both value sets are real. Revision `6c7e5e57...` gives 18,721,548,408 bytes and
7877 tensors, read from the HuggingFace tree listing on 17 August 2026 and
confirmed by an authenticated range request on 20 August 2026. Revision
`8a4ff96f...` gives 18,721,432,024 bytes and 7876 tensors, and that is the copy
on the shared checkout. `main` moved between 12 and 17 August 2026, and the file
gained 116,384 bytes and one tensor. Neither field was a transcription error, so
neither value was simply stale.

The registry names the checkpoints the recipes used, so the row must carry the
local artefact. `nvfp4-nibble-order.md` and `benchmark-record.md` both measured
18,721,432,024 bytes and 7876 tensors. Only the header of the `6c7e5e57...`
artefact was ever read here.

The row now carries a SHA-256, which AGENTS.md requires for a quantized
artifact and which is what made the earlier disagreement unresolvable. It was
derived by hashing the local bytes, not reported: 66.1 MiB/s over 270 s. It
equals the etag the `huggingface_hub` `.metadata` sidecar recorded, so the
sidecar is corroborated rather than trusted. Hashing the audio VAE in the same
session reproduced its recorded value and is the control on the method.

The superseded revision and size stay in `docs/USAGE.md` beside the corrected
row, because earlier evidence cites them. `docs/models/ltx-2-5.md` told a
reader to fetch `6c7e5e57...` for the first-party assets, which hands over a
different NVFP4 DiT, so it now warns and names both revisions.

Closes #1723.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
The branch was pinned at `c4ba829a3` and `origin/main` moved to `3359f4159`.
Merging first makes the local gate run on the tree that lands.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…ows actually rests on the tree listing

The new section claimed that the sizes of all three rows still pinned to
`6c7e5e57...` come from the HuggingFace tree listing. That is wrong for two of
them, and I found it while re-checking my own prose.

`.agents/specs/ltx25-checkpoint-class.md` §2 measured the full bf16 DiT and the
distilled LoRA on the shared checkout, not over the network, and both sit there
at exactly the recorded byte counts. Only the distilled bf16 DiT is absent from
the share, so it alone rests on the tree listing and a range request.

The revision claim is unchanged and was already correct: none of the three has a
`.metadata` sidecar, so nothing local confirms or contradicts the revision.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…4 pin is reported, not re-derived

The fresh review of this change raised three findings. All three are the same
defect in different places: prose that gives a reported value the standing of a
derived one.

The content half of the pin is re-derived. The SHA-256 comes from the bytes on
the shared checkout and anyone holding them can reproduce it. The revision half
is not. `8a4ff96f...` is what `huggingface_hub` recorded about where it fetched
the file on 12 August 2026, and nothing has fetched from that revision since to
confirm it. `docs/USAGE.md` and the spec now state the difference, and name the
circumstantial support for the revision as circumstantial: six agreeing
sidecars, one download log, and file times in two matching waves.

`docs/models/ltx-2-5.md` said revision `8a4ff96f...` "publishes" a byte count and
a hash, and told the reader to fetch it. That asserts remote state this change
never read. It now points the reader at the SHA-256 as the way to check an NVFP4
checkpoint. The same page attributed `792a2bad...` to the artifact published at
`6c7e5e57...`, when commit `40a796aa9` records it as a local hash never compared
against the published file. The table intro now separates the two columns.

The surviving `## Owed` bullet in the spec recorded a correction that is already
complete and cited #1723, which closes with this change. An `## Owed` bullet
pointing at a closed issue tracks nothing, which is the reasoning this change
already applied to the other bullet, so it moves to `## Outcome` as well. Its
six-sidecar census was re-derived again on 24 August 2026 and the count holds.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
@localai-bot
localai-bot merged commit e1b5df1 into main Aug 25, 2026
27 of 29 checks passed
localai-bot pushed a commit that referenced this pull request Aug 25, 2026
…, keeping both corrections

`main` advanced while this pull request's checks settled, so this branch
conflicted on two files rather than one.

`.agents/issue-index.md` resolved by AGENTS.md's rule for a concurrent edit to a
keyed record: take the complete target-branch version, then re-apply the scoped
edit. The union driver's output was discarded. Verified three ways -- 690 rows,
690 distinct, 0 duplicates; this branch's `#1885` row last; and sha256 of main's
complete file equal to sha256 of this file minus its last line.

`docs/USAGE.md` conflicted because #1873 landed the #1723 correction to the same
table. Both sides are kept and neither is dropped: main's corrected NVFP4 size
`18,721,432,024` at revision `8a4ff96f`, which #1723 established from the
artefact's own sidecar after the repository re-quantized that file in place, AND
this branch's distilled-LoRA row naming the five arms that require the adapter
and stating that a load omitting it is refused by name. Taking either side alone
would have silently reverted the other row.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
@localai-bot
localai-bot deleted the row/LTX25-DIT-ATTN-FA2-HD128-1723 branch August 25, 2026 07:50
localai-bot added a commit that referenced this pull request Aug 25, 2026
…ate, and #1567's blocker was never true (#1668, #1567, #1568, #1884)

FOLLOWING_AGENTS_PROTOCOL

`ced0ab639` landed the three anchors #1668 owed and left three siblings open. This
re-checks all four against the tree rather than against the record, closes the one
that is genuinely done, and measures the discriminator the row named as its next
step. No product code, no test code and no assertion changes: the gate is
byte-identical to `ced0ab639`.

## #1668 is closed, item by item

All four items are on `origin/main` and gated. `load.dit_config` at
`ltx2_video.cpp:979`, `artifacts.mux` at `:5440`, `denoise.update` at `:4576`,
`Ltx2ConditioningTrace::sampler_updates` at `:4577` and `ltx2_video.h:920`.
`Record::instrument_seconds` is at `render_phase_log.h:70` and landed as
`be432e8e3` (#1711), so the issue's own text is stale on that item.

Its scope note also asked that `denoise.update` reach "the phase names published in
`docs/models/ltx-2-5.md`". That document publishes no phase names -- a grep for a
leaf name over `docs/` returns MiniMax-Music3 and MiniMax-H3 rows only -- so the
obligation is void rather than skipped. Checked because a scope note is where an
owed edit hides.

## The seam-extent ratio is measured, and it is shut

`### M7`, `## Stop conditions` and #1884 all named one non-banned candidate for the
magnitude hole: the anchor's own extent against the seam its two neighbours define,
"near 1 honest, near 0 collapsed". It was measured before it was adopted, 67 honest
runs against 25 collapsed, one box and one binary pair, loadavg 39 to 84.

For `artifacts.mux` the collapsed range [0.1414, 0.4766] lies entirely INSIDE the
honest range [0.0156, 0.8779], so no constant separates them at all -- and in each
load regime separately, 11 honest reds in 44 quieter runs and 15 in 90 busier ones,
so the overlap is a property of the anchor and not of the box. For
`load.dit_config` a constant in (0.2122, 0.7187] catches every collapse and reds 2
of 67 honest renders, 0 of 22 quieter and 2 of 45 busier -- contention, and the
same order as the 4-in-45 that withdrew `residue <= 2 * instrument`.

The premise fails too, and without any tail: `artifacts.mux`'s honest MEDIAN extent
is 0.5977, because that anchor has a median duration of 14.5 us against a median
`instrument_seconds` of 7.0 us, and per record `instrument_seconds / duration` runs
0.394 to 0.997 with a median of 0.495. Half of what that anchor measures is this
instrument's own charge inside it.

The mechanism is the withdrawn bound's mechanism, visible in the table. The honest
outliers are ordinary anchors beside a preempted instrument boundary: a 234 us
`load.dit_config` beside a 3473 us gap, a 39 us `artifacts.mux` beside a 2446 us
gap, where both gaps are one `Close` stamp followed by one `Open` stamp and are
~3 us on a quiet run. `## Design` 3 already says the un-instrumented remainder of a
boundary dilates faster than the instrumented part under contention; the seam-extent
ratio puts that remainder in its denominator, so it inherits the same tail. It asks
a different QUESTION than the withdrawn bound and is conditioned on the same
QUANTITY, and the conditioning is what decided the earlier one.

Nothing is re-proposed and nothing is widened. The record now says to ask of any
successor what its denominator dilates with, not only what it means.

## ...and what the same data says to try next

A fresh review mutated that CONCLUSION rather than only checking its arithmetic,
and narrowed it: the negative result belongs to the DEFINITION, not to the family.
Subtract the record's own `instrument_seconds` from the numerator and
`net / (net + gap_after)` separates `load.dit_config` by two orders of magnitude
with 0 honest reds in 67, and leaves `artifacts.mux` with 1 in 134. That one red is
named rather than averaged away: `h2-38` render 2, where the anchor's whole 2968.0
us extent was its own 2957.8 us instrument charge, which is the same mechanism one
level in. One measurement, not a conclusion -- it still owes its own constant,
cross-box distribution, red-first mutation and fresh review, which is what #1884
asks of any candidate. Recorded so the next attempt starts from the definition that
worked rather than from the one that did not.

## #1567's recorded blocker was never true

Both the spec and the forge issue said no gate in this tree renders the res_2s arm,
so an anchor beside the first-order one would land dead. One command falsifies it.
`test_ltx2_video -tc="ltx2 video: the HQ pipeline evaluates the DiT twice per step"`
renders `res2s_two_stage` four times through `LoadVideoEngine` and
`VideoEngine::Generate`, and leaves `hq3/phase-log.json` and `hq5/phase-log.json`
carrying a `denoise` leaf and 7 and 11 `denoise.step` records -- the loop's own
2n+1 evaluation counts -- and no `denoise.update`. The instrument is already live
inside that loop and the arm already writes a table a gate can read. That case has
existed since `4d7748646` (#1125), which predates the issue, so the claim was never
true of any tree. #1567 stays open; what it owes is the hook and the assertion.

The same false sentence was also in the product tree, in the comment at
`test_ltx2_video.cpp:9079-9081` inside the very case that falsifies it. It is
corrected here in the same flow, because a record correction that leaves the false
sentence where a reader will meet it has repaired nothing. That comment is the only
edit outside `.agents/`; it changes no assertion and the suite is green at 105 of
105 cases either side of it. The forge issue body still carries the claim and is
answered by a comment rather than rewritten.

## #1568 stays open, and its own mutation says so

Mutation `T1`, the empty-sibling form of the issue's `R1b`: `denoise.update`
collapsed onto its own `Close()` at the same statement, line-count preserving, so
the record is still emitted once per step and still sits between two `denoise.step`
records while naming ~0 s. Focused case green 5 runs of 5. The anchor was
asserted unique before it was applied, the application was verified by hash, the
build exit code was read, and the tree was restored byte-for-byte and re-hashed. A
fresh review reproduced it independently at 3 of 3, after checking that the mutated
BINARY differed by hash from the unmutated one -- its first attempt built in a
copied tree whose `build/` was bound to the original path, exited 0 on
`ninja: no work to do`, and would have read as a pass.

## #1884 stays open

M7 reproduces here: both anchors collapsed onto their own `Close()`, line-count
preserving, green in 24 of 25 focused runs. The one red is `decode.audio`'s
coverage floor, which is the #1470 flake class and not an anchor clause. What
remains for it is the other repair the row already names -- an anchor inside the
callee -- because a position clause cannot bound a magnitude, so no further clause
on `CheckSeamAnchor` closes it. A MAGNITUDE clause there is not forbidden, and an
earlier draft of this change said it was; that non-sequitur is what the review
caught.

#1570 is CLOSED, by `be432e8e3` on 2026-08-23. Three passages written by this
change treated it as outstanding and are corrected, and `## Now`'s count of five
open issues under this spec is corrected to four.

Restored tree green: 105 of 105 cases, 4721 assertions.

## Issues

Closes #1668. #1567, #1568 and #1884 stay OPEN and each says what it still owes;
none of them is closed here, and none was closed because a neighbour landed.

## Review

One fresh review by an agent that did not write the change. It confirmed the
anchors, the doc check, the #1567 falsification, the T1 mutation and every cell of
the measurement table from its own extractor, and returned eight findings. All
eight are repaired above: the res_2s render count, the "no further clause closes
this" non-sequitur, #1570's forge state, the far-side citation, the mux magnitude
ranges, the k-interval endpoint, the un-matched load regimes, and the false comment
left in the product tree. The review's own process note is worth carrying: its
first mutation attempt read as a pass because the copied tree's `build/` was bound
to the original path and ninja had no work to do.

## Authority

NO merge authority is recorded for this row in `.agents/developer-preferences.md`.
The 2026-08-25 LTX-2.5 close-out grant is scoped to #1873, #1869, #1882, #1871 and
#1888 "and to no others". This pull request is prepared and not merged.

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
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.

The distilled NVFP4 LTX-2.5 DiT registry row disagrees with the artefact in BOTH revision and size

2 participants