fix(LTX25-DIT-ATTN-FA2-HD128): pin the distilled NVFP4 DiT to the artefact every measurement loaded, and hash it - #1873
Merged
Conversation
…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
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
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]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lightricks/LTX-2.5published two different files underdiffusion_models/ltx-2.5-22b-distilled-transformer-nvfp4.safetensors. Thedocs/USAGE.mdregistry row named the one no run here has ever loaded.Both value sets are real. Revision
6c7e5e57...gives 18,721,548,408 bytes and7877 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 copyon the shared checkout.
mainmoved between 12 and 17 August 2026, and the filegained 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.mdandbenchmark-record.mdboth measured18,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.metadatasidecar recorded, so thesidecar 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.mdbeside the correctedrow, because earlier evidence cites them.
docs/models/ltx-2-5.mdtold areader to fetch
6c7e5e57...for the first-party assets, which hands over adifferent 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]