Skip to content

record(LTX25-PROMPT-ADALN): the ~138x understatement stands, the keyframes claim next door is now main's, and nothing enters through the door (#644, #658, #900) - #663

Merged
localai-bot merged 16 commits into
mainfrom
row/LTX25-ADALN-CLAIMS
Aug 15, 2026

Conversation

@localai-bot

@localai-bot localai-bot commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Claims-and-records repair for #644, reconciled onto main on 2026-08-15. This branch authors 8 files, +684/−40, none of them under src/ or include/git diff $(git merge-base origin/main HEAD) HEAD --name-only -- src/ include/ returns zero paths, against a positive control of 8 paths for the same command without the pathspec.

Read that against the merge base, not against origin/main. A bare git diff origin/main HEAD today lists 44 files, 30 of them under src/. Every one of those 30 is main moving ahead of this branch's merge base e8048ef63 — most recently #901, which this branch does not carry — and not a change this branch made. Measured at origin/main = b5f27c9a4; the count moves whenever main does, which is several times an hour, so re-measure rather than quote it. The runtime this repair talks about landed as 65e79eee5 (#654) and 98f8e046d (#658).

Three things happened between the review and this head, and each of them changed what the branch should say.

The branch was 120 commits behind, and half of what it asserts is now false

baa92ccf7 (spec) and 020381676 (implementation) reached main on 2026-08-13 as the squash 65e79eee5. Then 98f8e046d (#880, issue #658) ported keyframes_abs_pos_embedding and retired BOTH refusals this branch reasoned about. Ten files conflicted — five source, five keyed records.

Four of the five source conflicts were this branch re-asserting retired refusals, and each takes main's side wholesale. Taking HEAD on src/vllm/model_executor/models/ltx2.cpp would have re-added the use_keyframes_abs_pos_embedding VT_CHECK that #880 deleted, re-refusing BOTH shipped DiTs. ltx2.h's 57-line corrected bullet hung off an "unported modules" list entry that no longer exists — and main already carries this branch's own meta-device finding, in a better place, on the FIELD where it decides behaviour (ltx2.h:144-153: "upstream builds on the meta device (loader/helpers.py:84-95) and loads with strict=False, assign=True, so the absent parameter stays on meta and the add is never reached"). Same for ltx2_loader.h and ltx2_loader.cpp, whose text explained a tensor-keyed refusal that is gone.

tests/vllm/models/ltx2_goldens.inc is generated and was not hand-merged. Regenerated with the committed command, python3 scripts/gen-ltx2-goldens.py --ltx2 ~/_git/LTX-2 --out tests/vllm/models/ltx2_goldens.inc, against Lightricks/LTX-2 at the pinned fd4ded7f (checkout clean, REGEN_EXIT=0). It differs from main by 12 insertions and 7 deletions, all of them comment lines in the prompt-AdaLN magnitude block: every golden VALUE on both sides — including #880's new keyframe arrays — byte-identical.

The five keyed records were resolved the way AGENTS.md ## Records says — take the complete target-branch version, apply the scoped edit again, verify unrelated keys are byte-for-byte equal — and re-verified against origin/main a second time after main moved again mid-gate:

file changed lines vs origin/main key this row owns
.agents/model-matrix.md 1 +, 1 − MODEL-DIFFUSION-ltx-2-5-ltx2-video-transformer-3d-model
.agents/roadmap_v1.md 0 none — the surface moved
docs/FEATURES.md 0 none
docs/STATUS.md 0 none
docs/USAGE.md 0 none

model-matrix.md is the one record main is stale on: its LTX-2.5 cell still read "timestep-INDEPENDENT prompt K/V (cacheable once per request)", which this campaign retracted on 2026-08-12 and #654 ported away on 2026-08-13. git diff --numstat origin/main reports exactly 1 1, so every other key in a 500-row file is byte-identical.

The four zero-line resolutions are the finding, not an omission. This branch changes no lifecycle state, so AGENTS.md ## Public documents owes it no STATUS / FEATURES / USAGE edit at all. Its edits there were length compressions plus an allow_unported-era sentence that #880 has since replaced with a truer one — "BOTH DiTs load, NO allow_unported". Reapplying them would have reintroduced a retired opt-in. roadmap_v1.md needs no reapplication because main retired its inline issue table into .agents/issue-index.md; the #673 row goes there instead.

#673 was never in the issue index — on this branch or on main

AGENTS.md requires the number in three places that agree: the index, the row's spec, and the pull request body. It was in two. Appended now, with #900 below it; nothing edited, nothing removed. scripts/check-issue-index-append-only.py --base origin/main --head HEAD exits 0, scripts/check-agent-record.py exits 0 at ENGINE=156 MODEL=377 QUANT=82 KERNEL=51 BACKEND=82, unowned high-water untouched.

Nothing lands dead: reached, but nothing enters through the door — #900

AGENTS.md ## Nothing lands dead and .agents/reachability.md landed in 8f49ac3be (#886) after this branch was written, so the question is answered rather than assumed. It ships no checker8f49ac3be touches seven files, all documents, and ls scripts/ | grep -iE 'reach|dead' returns nothing against a positive control of 37 check-* scripts — so there is no exit code to report, and the guide says why.

Reached: YES. Chain followed by hand, every anchor re-derived at this head and asserted UNIQUE (matches exactly once in its file) against a positive control that reports STALE on a deliberately wrong line:

include/vllm.h:962 (vllm_video_generate) → src/capi/vllm_c.cpp:1646src/vllm/multimodal/ltx2_video.cpp:1063 (Ltx2VideoEngine::Generate) → :1730/:1732src/vllm/model_executor/models/ltx2_dit.cpp:785 and ltx2_device.cpp:1152, where use_prompt_adaln_single defaults TRUE at include/vllm/model_executor/models/ltx2.h:133ltx2_dit.cpp:581:205:140. Loader half: ltx2_video.cpp:533:624. Default configuration, not an opt-in.

Entered by the smallest failing test: NO. The reachability mutation from the guide — delete the production call site, ltx2_dit.cpp:140 if (prompt_mod != nullptr) {if (false) {BUILT=YES, compile_err=NO, so this is a test result:

suite enters through result
test_ltx2 Ltx2DitForward, by hand RED — 3 of 43 cases, 6 of 4388 assertions, exit 1
test_ltx2_video vllm_video_generate / the ABI GREEN — 37 of 37, 784 of 784, exit 0

test_ltx2_video's fixture sets the flag TRUE (ltx2_video_fixture.h:258) and every render it drives executes the path. It just asserts no value the term can move. Filed as #900, listed under ## Owed in the spec, and not fixed in flow: closing it needs an ABI-level value oracle designed red-first, which is a row with a spec rather than a record repair. The LOADER half passes both halves of the rule, and the same harness shows it — M3 takes test_ltx2_video to 29 of 37 cases failing.

Every number re-measured on the merged tree, and two of them moved

Nothing was carried forward. scripts/measure-ltx2-prompt-adaln.py against the shipped NVFP4 DiT (ltx_core fd4ded7f, __file__ asserted, exit 0):

video (4096) audio (2048)
rms|table|, 48 blocks 0.017553 0.021925
rms|term|, uniform σ∈[0,1] 0.236446 0.347171
term/table, RMS 1347% 1583%
max|term| / max|table| 7119% 2817%
term/table RMS, the file's own LinearQuadratic sampler, 8 steps 1275% 1492%
modulated context, unit-rms 1.0035 → 1.0915 (+8.8%) 1.0033 → 1.3170 (+31.3%)

Audio fixture denominator by importing the generator so no weight is re-drawn: max|term| 0.0201763 / max|table| 0.0496868 = 40.6068%, giving 2817 / 40.61 = 69.4x; video 0.0252012 / 0.0487142 = 51.7327%, 7119 / 51.73 = 137.6x. The ~138x headline stands exactly as written.

What DID move is the test_ltx2_video counts, and #658 moved them. 37 cases / 784 assertions with LTX2_CHECKPOINT_ROOT unset, 37 / 9031 with it set — where the row recorded 30 / 502 and 30 / 8734. So #673's figure is 784 of 9031, 8.7%, not 5.7%. Corrected in the spec, in the index row and at the skip site in test_ltx2_video.cpp, each now carrying its date. Note the CASE count is identical in both configurations, so the "unchanged case count" reading the original note relied on no longer distinguishes them.

The review's meta-device probe already exists on main. scripts/measure-ltx2-keyframes-meta.py, committed by #658, re-runs the whole observation. Executed here against BOTH shipped files, exit 0: it reproduces every line of the transcript this branch quoted, and it carries its own positive control — a neighbour (scale_shift_table) materialising device=cpu is_meta=False on the same load, so is_meta=True on keyframes_abs_pos_embedding is the parameter's state and not a loader that never ran. It settles the FP8 half by execution too: 2 of 6124 keys match, [1, 4096] F8_E4M3 with 4096 of 4096 bytes non-zero plus a rank-0 F32 scale, against __metadata__ keys : NONE. Writing a second probe here would have duplicated it.

Mutations — all five, all BUILT, all restored byte-for-byte

# Mutation BUILT Result
M1 host ModulateContext ignores prompt_mod YES RED — test_ltx2 3/43 cases, 6/4388 assertions, exit 1
M2 device path takes the static-only branch always YES RED — test_ltx2_device 1/18, 6/546, exit 1
M3 re-add use_prompt_adaln_single = false before the guard YES RED — test_ltx2_loader 1/28 cases exit 1; test_ltx2_video 29/37 exit 1
M4 prompt AdaLN driven by m.timesteps instead of m.sigma YES RED — test_ltx2 2/43, 4/4388, exit 1
M5 shift and scale rows swapped in the [2, width] row YES RED — test_ltx2 2/43, 4/4388, exit 1

M5's first attempt was a silent NO-OP and is reported rather than dropped. Its substitution spanned two lines and never matched, so the tree was unchanged, the build succeeded and test_ltx2 printed 43/43 SUCCESS — a green that says nothing about the guarantee. It was caught only because the harness prints git diff --stat for every mutation and that line was absent. Re-applied as a real edit (1 file changed, 2 insertions(+), 2 deletions(-)) it is red.

M3 shows the doctest counting trap. The case THROWS, so its assertions stop being counted and the total DROPS 4978 → 4967 while the summary prints 0 failed. The exit code and the test cases: line are the authority.

git status --porcelain on the three mutated source files was empty after each restore, and the final whole-tree status is clean.

Gate

Release, VLLM_CPP_CUDA=OFF, -j6, on the merged head.

CONFIGURE_EXIT=0
BUILD_EXIT=0
': error:' count = 0      (positive controls: Building CXX = 929, Linking CXX = 479 on the full build)
'No space left'  = 0      'BFD assertion' = 0      'warning:' = 0
ctest -N         = 477

Suite counts on this head, exit 0 each, against the 2026-08-13 figures:

Suite 2026-08-13 this head
test_ltx2 35 / 2435 43 / 4388
test_ltx2_loader 26 / 4826 28 / 4978
test_ltx2_device 15 / 523 18 / 546
test_ltx2_video 30 / 502 unset, 30 / 8734 set 37 / 784 unset, 37 / 9031 set

The growth is #658's, not this branch's: this branch authors no src/ and no include/ change at all — git diff $(git merge-base origin/main HEAD) HEAD --name-only -- src/ include/ returns zero paths. (Comparing against origin/main instead answers a different question, because main has advanced past the merge base; see the note at the top.)

Full ctest --test-dir build -j4 --output-on-failure on this head:

100% tests passed, 0 tests failed out of 477
Total Test time (real) = 234.44 sec
CTEST_EXIT=0

The following tests did not run:
	 19 - test_modelopt_mixed_precision_checkpoint (Skipped)
	199 - test_voxtral_e2e (Skipped)

Two of the three load-dependent tests passed in this run at a box load of 19–105: test_openai_conformance (0.77 s) and test_cpu_threadpool (11.18 s). Nothing needed a solo re-run. test_cpu_x86_llamacpp_floor is not registered in this configuration at allctest -N | grep -c llamacpp = 0, against positive controls of 1 for test_cpu_threadpool and 1 for test_openai_conformance in the same listing — so it was not run here and this head says nothing about it either way.

Known-red, proved pre-existing rather than asserted. For each, the checker's own inputs are byte-identical to origin/main on this head — git diff origin/main HEAD --name-only -- <inputs> returns zero paths — against a positive control on the paths this branch DOES change, which returns three:

tracked as inputs changed by this branch
#873check-release-binary-contract, check-release-workflow, check-test-registration, test_check_release_binary_contract, test_release_manifest, test_release_pipeline, test_check_test_registration 0
#584windows-msvc-cpu, windows-msvc-vulkan 0
load-dependent — test_cpu_x86_llamacpp_floor, test_openai_conformance, test_cpu_threadpool 0
positive control.agents/specs/ltx25-prompt-adaln.md, .agents/model-matrix.md, tests/vllm/models/ltx2_goldens.inc 3

Review repair — 7a6165dab: two anchors were dated, never re-derived

Review of d3f846768 returned FAIL on two file:line citations in the spec, both landing inside an unrelated CRF-refusal SUBCASE instead of the text they claim. :917-921 for the shipped-checkpoint skip-and-return becomes :1316-1319; :913-914 for the "differ in a TRAINED keyframes_abs_pos_embedding" comment becomes :1302-1303.

Both were correct when written at 2990ed81b. The row then re-measured its suite counts and dated them, but re-derived none of its own anchors into test_ltx2_video.cpp — the one file whose line numbers #658 moved most. 98f8e046d inserted 169 lines above the cited text and this branch added 9 more, so the citations drifted 389 lines while the row was auditing the numbers beside them.

Verified by uniqueness, not existence, with every clean result paired to a control that must report STALE:

check rule result
:1316-1319 skip-and-return enclosing TEST_CASE is ltx2 video: the SHIPPED Lightricks checkpoints parse and load, declared exactly once FRESH
:1302-1303 keyframes comment text occurs exactly once in the file FRESH
control — old :917-921 same rule STALE
control — old :913-914 same rule STALE
control — :1451-1454, the identical VAE-case skip block same rule STALE
control — off-by-two span :1304-1305 same rule STALE

The skip block is not uniquely identifiable by its text: :1316-1319 is byte-identical to :1451-1454 in ltx2 video: the SHIPPED Lightricks VAEs and upsampler load, so a grep-based re-derivation gets two hits and cannot choose. The sentence now names its enclosing case, which is what makes the anchor re-derivable rather than merely trusted.

Spec-only edit; git diff HEAD~1 HEAD --name-only lists .agents/specs/ltx25-prompt-adaln.md alone. check-doc-checkpoint, check-commit-trailers, check-commit-style, check-issue-index-append-only and check-agent-record each exit 0 (ENGINE=156 MODEL=377 QUANT=82 KERNEL=51 BACKEND=82), against a positive control — check-commit-style on a reversed range — that exits 1.

mergeable reads CONFLICTING / DIRTY, and it is a GitHub artefact, not a tree conflict. A real git merge origin/main at this head reports "Automatic merge went well" with zero paths in git diff --diff-filter=U, in both directions, at origin/main = b5f27c9a4 (confirmed identical to GitHub's main tip). The single overlapping file is .agents/issue-index.md, which both sides appended to and which carries merge=union in .gitattributes; GitHub's mergeability check does not apply .gitattributes merge drivers, so it sees the append-vs-append as a conflict. A plain 3-way git merge-file on the three blobs exits 1 with 2 conflict markers, and does so identically at the previous head d3f846768 — so this predates 7a6165dab, which does not touch issue-index.md. Negative control: the same 3-way merge on .agents/model-matrix.md exits 0.

Spec: .agents/specs/ltx25-prompt-adaln.md. .agents/specs/ltx-2-5.md is operator-owned and untouched. Issues: #644 (campaign), #673 and #900 (owed).

FOLLOWING_AGENTS_PROTOCOL

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

mudler added 4 commits August 13, 2026 17:05
`use_prompt_adaln_single` defaults TRUE in both references — diffusers
`transformer_ltx2.py:1185` and LTX-2 `model.py:77` /
`model_configurator.py:76,138` — and the shipped FP8 DiT carries the 18
tensors the flag builds. `ltx2_loader.cpp:988` (and `:573`, `:626`) cleared
it unconditionally, so every render kept only the static
`prompt_scale_shift_table` and dropped the timestep-conditioned half of the
prompt K/V modulation. Shapes, finiteness and every committed golden agree
with the defect, because the goldens were generated with the flag OFF.

Spec only; no code. Records the upstream anchors for the module
(`model.py:222-227`, `:252-257`), the producer
(`transformer_args.py:274-277`, driven by `modality.sigma` and NOT
`timesteps`), the consumer (`transformer.py:441-446`), and what replaces
the cleared flag so `allow_unported_modules` can no longer silently disable
a ported feature.

Issue #644, row 0.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…learing it

`use_prompt_adaln_single` defaults TRUE in both references — diffusers
`transformer_ltx2.py:1185`, LTX-2 `model.py:77` and
`model_configurator.py:76`/`:138` — and the shipped DiT carries the module's
tensors. `ltx2_loader.cpp` cleared it in three places, so every render kept
only the static `prompt_scale_shift_table` and dropped the
timestep-conditioned half of the prompt K/V modulation. Nothing saw it:
shapes unchanged, values finite, and every committed golden was generated
with the flag OFF.

MEASURED, flag ON vs OFF over the same shared weights: the timestep term is
51.7% the magnitude of the static table it is added to, moves the block-0
modulated prompt K/V by 5.82%, and moves the DiT output by 1.46e-4 — 73x the
gate's f32 floor.

Ported, citing what each piece came from:
  the module      <- model.py:222-227 (video), :252-257 (audio);
                     AdaLayerNormSingle(dim, embedding_coefficient=2), adaln.py:19-45
  the producer    <- transformer_args.py:274-277 driven by `modality.sigma`
                     [batch] and NOT the per-token `timesteps`, scaled by
                     timestep_scale_multiplier at :173-186
  the consumer    <- transformer.py:441-446, summed into the table BEFORE
                     `(1 + scale)` applies, threaded per stream at :288-296/:317-325
  diffusers twin  <- transformer_ltx2.py:1536-1547, :1648-1649, :677-693

Both arms: `Ltx2DitForward` and `Ltx2DitForwardDevice` (f32 and the bf16
production stream).

The three `= false` assignments are replaced by an invariant: the resolved
flag must equal whether the FILE carries `prompt_adaln_single`. And
`Ltx2AdoptDeclaredDitParams` now clears exactly ONE flag in its config copy —
`use_keyframes_abs_pos_embedding`, whose module really is unported — so
`allow_unported_modules=1`, which a real render still needs, can no longer
switch a ported feature off. A config that disagrees with the shapes about
the flag is refused rather than forced into agreement.

Both shipped DiTs were re-read off the NAS to check this refuses neither: the
FP8 file carries no `__metadata__` at all and the NVFP4 file's config OMITS
the key, so upstream's TRUE default decides on both, matching their tensors.

Evidence. Goldens executed from upstream LTX-2 @fd4ded7f at reduced dims
(`gen-ltx2-goldens.py` section 6); every pre-existing golden VALUE is
byte-identical. Five mutations, each RED and each restored byte-for-byte:
dropping the term host-side (3/35 cases), dropping it device-side (1/15),
re-adding the cleared flag (the guard throws; assertion count drops
4826->4815), driving the MLP from `timesteps` instead of `sigma` (2/35), and
swapping the shift and scale rows (2/35). A permanent in-tree case asserts
the flag-ON forward MISSES the flag-OFF golden, so a bound-but-unused module
cannot pass.

Suites vs `cefacd2d0`: test_ltx2 30/1627 -> 35/2435, test_ltx2_loader
24/4817 -> 26/4826, test_ltx2_device 13/498 -> 15/523, test_ltx2_video
30/502 -> 30/502 (its fixture now carries the module, which is the shipped
shape). Full `ctest` 423 registered, 422 pass under -j8 and
`test_serve_low_tools` passes on its serial re-run.

Spec .agents/specs/ltx25-prompt-adaln.md @baa92ccf7. Issue #644, row 0.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
Brings in b81a5e4 (the secondary-oracle registry). No conflict and no
overlap with this row's files; rebuilt clean and re-ran the full gate after
the merge, because a clean merge is not a compiling one: BUILD_EXIT=0,
ctest 423/423.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…138x, and the keyframes claim next door was false (#644)

The port landed and reviewed PASS. What we WROTE about it did not.

## The headline numbers were fixture artifacts

The spec Outcome, the PR body and test_ltx2.cpp all quoted 51.7% ("term vs
table") and 5.82% (block-0 K/V) as the answer to "does this matter". Both come
from the generator's synthetic init: `prompt_scale_shift_table` AND every
prompt-AdaLN MLP parameter are drawn from the same `param_spec` rule at
scale=0.05 (gen-ltx2-goldens.py:100-106), so the ratio between them is a property
of the FIXTURE. It moves with the init scale: 0.005 gives 4.1%, 0.2 gives 1450%.
The Outcome disclaimed only the two OUTPUT rows as synthetic-bounded and then
called the other two the answer, though all four have identical provenance.

Measured on the SHIPPED weights instead, through upstream's own
AdaLayerNormSingle(dim, embedding_coefficient=2) evaluated on sigma*1000 exactly
as transformer_args.py:274-278/:177 do, against all 48 prompt_scale_shift_table
tensors of
`ltx-2.5-22b-distilled-transformer-nvfp4.safetensors`:

                          video     audio
  rms|table| (48 blocks)  0.017553  0.021925
  rms|term|  (uniform s)  0.236446  0.347171
  term/table RMS          1347%     1583%
  max|term|/max|table|    7119%     2817%

Like for like -- 51.7% is a max-vs-max ratio, and the same ratio on the real
weights is 7119% / 2817% -- the fixture UNDERSTATED the defect by 138x (video)
and 54x (audio). On the shipped model the timestep term DOMINATES the static
table; the table is the perturbation. Pre-row renders applied
`context*(1 + ~0.018 rms) + ~0.018` where upstream applies
`context*(1 + ~0.32 rms) + ~0.10`; on a unit-rms context the modulated context
moves +8.8% (video) / +31.3% (audio).

Both dispositions the finding offered are taken: the four fixture rows are now
labelled GATE-FLOOR numbers from synthetic weights in the spec, the goldens'
comment block and test_ltx2.cpp, AND the real-checkpoint measurement is stated as
the answer. `scripts/measure-ltx2-prompt-adaln.py` is committed so the number is
re-runnable rather than transcribed; it asserts `ltx_core.__file__` under the
named checkout before reading anything.

## A false claim about a checkpoint, the same class this row just fixed

ltx2.h:47-49 -- a line surviving inside the paragraph this row rewrote -- said
"LTX-2.5's checkpoint does not carry the parameter" about
keyframes_abs_pos_embedding. Both shipped DiTs contradict it, each on a different
half, read off their headers and run through upstream's own configurator:

  FP8 (vonkaiser):  CARRIES keyframes_abs_pos_embedding F8_E4M3 [1,4096] + scale,
                    and declares NO __metadata__ at all -- so
                    LTXModelConfigurator.from_metadata cannot configure it:
                    KeyError: 'caption_channels', raised by
                    _build_caption_projections on the empty dict, BEFORE the flag
                    at model_configurator.py:82 is ever read.
  NVFP4 (1st-party): DECLARES the flag true and does NOT carry the tensor, so the
                    parameter stays torch.zeros(1, inner_dim) (model.py:217-219)
                    through load_state_dict(..., strict=False)
                    (single_gpu_model_builder.py:98) -- a genuine no-op there.

It is also not keyframe-only: transformer_args.py:269 applies it on every prepare
whose keyframes_mask is set, and tools.py:186-196 sets that mask unconditionally.

REFUSAL KEYING: unchanged, deliberately. It fires on the TENSORS the file
carries. Keying it on the resolved flag would, on the FP8 DiT, read a DEFAULT
rather than the file -- that file declares nothing -- and load it while silently
discarding a trained [1,4096] parameter. No behaviour changed, so no new gate is
owed; three refusal MESSAGES changed, because they asserted an implication that
is false in both directions.

## Records the lifecycle change did not move

model-matrix.md's inventory row still listed "timestep-INDEPENDENT prompt K/V
(cacheable once per request)" -- precisely what this row disproved.
docs/STATUS.md's LTX-2.5 row did not mention the prompt-side AdaLN at all;
FEATURES.md and USAGE.md described the keyframes opt-in as if only one file were
involved.

## Two things recorded honestly rather than fixed

- test_ltx2_video's shipped-checkpoint case is env-gated on
  LTX2_CHECKPOINT_ROOT and SKIPS by default, so the row's "unchanged 30/502"
  meant the whole real-header case did not run. With the variable set the same
  binary measures 30/8734 -- verified here, exit 0 both ways. Noted in the spec
  and at the skip site.
- Upstream loads with strict=False, so a config declaring the prompt-AdaLN flag
  false over a file that carries the module would silently run flag-OFF upstream
  where we now refuse. Ours is better; it is a DOCUMENTED DIVERGENCE, not a
  mirror, and it is named as one.

## Gate

BUILD_EXIT=0; build logs grepped for `No space left|BFD assertion` (0 hits);
df -h / 92% used, 37G free. ctest -N = 423; full ctest -j8 422/423 with
test_serve_low_tools starved under -j (known parallel flake), 1/1 PASS serially,
exit 0; 2 skipped as on the baseline. Suite counts unchanged from the row:
test_ltx2 35/2435, test_ltx2_loader 26/4826, test_ltx2_device 15/523,
test_ltx2_video 30/502 (skipped default) and 30/8734 with the checkpoint root.
ltx2_goldens.inc REGENERATED from gen-ltx2-goldens.py against ltx_core fd4ded7f:
every golden VALUE byte-identical, the diff is the comment block alone.

An earlier full run was VOIDED rather than reported: another session's
disk-pressure cleanup deleted build/ while ctest was at 421/423 and the last two
tests recorded "Not Run -- Failed to change working directory". A run whose tree
vanished under it is not a result; it was rebuilt and re-run from scratch.

One finding detail did not hold on inspection: it cited
`.agents/model-matrix.md:98` as already saying the two DiTs "differ in a TRAINED
keyframes_abs_pos_embedding". That file contains no occurrence of "keyframes" at
all on this branch; the corroborating anchors are `.agents/specs/ltx-2-5.md`
section 3.1 and `tests/vllm/multimodal/test_ltx2_video.cpp:913-914`.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
mudler added 2 commits August 13, 2026 21:33
…d device-leakage red (#644)

The head was behind and inherited a `check-device-leakage` FAIL it did not cause:
`kcuda=2 > baseline 0`, both hits in
`src/vllm/multimodal/ltx2_video.cpp:532,549` — a file this branch does not touch,
present at the parent `968461cda` and already fixed on `main` by `11cc1d589`.
Merging is the whole repair; no edit of mine was needed and none was made.
`check-device-leakage` before: FAIL, `kcuda=2`. After: OK, `kcuda=0`, DSR 32 ==
baseline 32.

RESOLUTION, recorded because it was NOT a plain auto-merge. This branch's base row
`row/LTX25-PROMPT-ADALN` was SQUASHED onto main as `65e79eee5`, so the merge base
predates the squash and git reports add/add conflicts on files where both sides
carry identical content. Resolved deterministically rather than hunk by hunk: the
tree was set to `origin/main` wholesale (`git read-tree -u --reset origin/main`),
then this branch's single commit `968461cda..2990ed8` was reapplied on top with
`git apply --3way`. All 14 paths applied cleanly.

VERIFIED, not assumed: `git diff origin/main` on the resolved tree is
byte-identical to `git diff 968461c 2990ed8` except for two hunk-header line
offsets (`.agents/model-matrix.md` 429->445,
`tests/vllm/multimodal/test_ltx2_video.cpp` 913->925) where main's own later edits
shifted the file. The four paths BOTH sides changed —
`.agents/model-matrix.md`, `docs/FEATURES.md`, `docs/STATUS.md`,
`tests/vllm/multimodal/test_ltx2_video.cpp` — were each inspected directly: main's
content intact, this branch's edit present exactly once, no duplicated relocation.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…not zeroed, and the audio factor had the wrong denominator (#644, #673)

Review findings F-1 and F-2 on PR #663. The reviewer re-ran every measurement in
that PR and every published digit reproduced; this repairs the two claims that did
not.

## F-1 (blocking) — a claim about upstream that upstream's own code contradicts

Three places said that on the NVFP4 DiT the absent `keyframes_abs_pos_embedding`
means the parameter "keeps `torch.zeros(1, inner_dim)` (model.py:217-219) through
`load_state_dict(..., strict=False)` (single_gpu_model_builder.py:98) — a genuine
no-op there": `include/vllm/model_executor/models/ltx2.h` (THE PRODUCT TREE), the
spec, and the PR body.

IT IS NOT A NO-OP. The claim quoted `single_gpu_model_builder.py:98` while
dropping the `assign=True` that is on that same line, and upstream builds on the
META DEVICE -- `loader/helpers.py:84-95`, `create_meta_model`:
`with torch.device("meta"): configurator.from_metadata(...)` at `:90-91`. A key
absent from the state dict is therefore never materialised at all.

RUN HERE, not transcribed, through upstream's own `create_meta_model` on the
shipped file's real `__metadata__` (read with upstream's own `read_model_metadata`
/ `SafetensorsModelStateDictLoader`, sft_loader.py:58-74, which JSON-decodes each
value -- the flag lives at `config.transformer`, not at the top level, so a raw
`__metadata__` read returns None for it):

  keys matching 'keyframes_abs_pos' in the file : []  (0 of 7876 entries)
  config.transformer['use_keyframes_abs_pos_embedding'] = True
  keyframes_abs_pos_embedding: shape=(1, 4096) f32 device=meta is_meta=True
  supports_keyframes_abs_pos_embedding (BEFORE load) : False
  after load_state_dict(sd, strict=False, assign=True):
    neighbour patchify_proj.weight : device=cpu is_meta=False   <- materialised
    keyframes_abs_pos_embedding    : device=meta is_meta=True
    in missing_keys                : True
    reading the value RAISES : RuntimeError: Tensor.item() cannot be called on meta tensors
  supports_keyframes_abs_pos_embedding (AFTER load)  : False

Upstream states this itself and then never asks.
`supports_keyframes_abs_pos_embedding` (model.py:166-173) returns False for "a
model whose config set the flag but whose checkpoint carried no weight for it (the
parameter would still be on ``meta``)" (:170), and
`enable_keyframes_abs_pos_embedding` (model.py:175-200) exists because such a
parameter "would fail at the first forward" (:182). BOTH ARE DEFINED AND NEVER
CALLED: `grep -rn` over the whole Lightricks/LTX-2 checkout at fd4ded7f returns
exactly 1 hit each, the definition, re-confirmed here against a positive control
rather than asserted from a null grep.

Polarity is not what fails: `apply_keyframes_absolute_embedding` is
`hidden_states + mask * embedding` (transformer_args.py:23-43, the sum at :43), so
REAL zeros would be inert. The mechanism claim fails on `meta`, not on additivity.

This STRENGTHENS the row's conclusion and changes nothing downstream: the refusal
stays keyed on TENSOR PRESENCE for the FP8 file, and the NVFP4 file is refused by
FLAG in `ParseLtx2DitParams` (ltx2.cpp:192-198).

NOTHING RUNTIME CHANGED IN THIS COMMIT. `ltx2.h` and `test_ltx2.cpp` move comment
text only; the one script edit (`gen-ltx2-goldens.py`) alters only the COMMENT the
generator emits; `ltx2_goldens.inc` moves two comment lines with every value
byte-identical. No `src/` file is touched at all. Suite counts are therefore
expected to be identical, and the point of the gate below is that they are.

The same anchor is now quoted in full at the OTHER place it appears (the
documented-divergence bullet), because dropping the `assign=True` is precisely
what made the claim above wrong.

## F-2 — the audio factor's denominator

The Outcome read "138x (video) and 54x (audio)" as if both were per-stream. The
video figure is right and like-for-like. The audio one divided the shipped AUDIO
ratio by the VIDEO fixture denominator, because `gen-ltx2-goldens.py` emits
exactly ONE fixture ratio and it is the video stream's. 54x is literally true
about that single published figure and errs CONSERVATIVE.

Recomputed by IMPORTING the generator, so the weight stream is bit-identical and
no weight is re-drawn:

  video: max|term| = 0.0252012  max|table| = 0.0487142  -> 51.7327%   (7119/51.73 = 137.6x)
  audio: max|term| = 0.0201763  max|table| = 0.0496868  -> 40.6068%   (2817/40.61 =  69.4x)

FIXED AT THE SOURCE, not only in prose. The generator emitted BOTH video-only
rows unlabelled -- "timestep term vs static table" and "block 0 modulated prompt
K/V" -- which is exactly how a video denominator came to be applied to an audio
numerator. `gen-ltx2-goldens.py` now names the stream on both, and
`ltx2_goldens.inc` was REGENERATED against ltx_core fd4ded7f to carry them
(REGEN_EXIT=0). The regeneration diff is those two comment lines and NOTHING
else: every golden VALUE byte-identical, and the "Regenerate with:" header
unchanged because the committed command was re-run verbatim -- so this re-proves
provenance as well as the labels. The Outcome now carries a per-stream table with
each row against its own denominator, and `test_ltx2.cpp` and the spec's
gate-floor table say which stream they mean.

No fifth golden was added: the audio figure is a denominator for this record, not
a gate floor, so "ALL FOUR ROWS ARE GATE-FLOOR NUMBERS" still holds and the three
files that label those four are otherwise untouched.

## Recorded, not fixed — issue #673

`LTX2_CHECKPOINT_ROOT` is set by NO workflow: `grep -rn CHECKPOINT_ROOT .github/`
exits 1 with zero hits while the same pattern matches in `tests/` and `.agents/`
(positive control run in the same command). CI therefore executes 502 of 8734
assertions -- 5.7% -- of `test_ltx2_video`, at an UNCHANGED case count of 30, and
`scripts/measure-ltx2-prompt-adaln.py` is a manual tool no gate invokes. This
row's checkpoint-derived evidence is manual and host-local. Filed as visible debt
and linked in the roadmap issue table and the spec; wiring checkpoints into CI is
explicitly not in this row.

## No test asserts this text, and none was invented

Searched in the subject's own vocabulary: the corrected claim lives only in a
`ltx2.h` comment, the spec and the PR body. The runtime refusal MESSAGES
(`ltx2.cpp:195-198`, `ltx2_loader.cpp` `RefuseUnported`) never carried the
"zeros"/"no-op" implication, and no checker reads the header comment. Writing a
test here would be writing one that cannot fail, so this change adds none. The
tensor-keyed refusal it defends is already pinned by a mutation the reviewer ran:
making `LoadedElsewhere` swallow the tensor takes `test_ltx2_loader` to 25/26
cases, 4817/4818 assertions, exit 1.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
@localai-bot
localai-bot changed the base branch from row/LTX25-PROMPT-ADALN to main August 13, 2026 21:53
localai-bot pushed a commit that referenced this pull request Aug 13, 2026
…-- retire that refusal, apply nothing (#658)

FOLLOWING_AGENTS_PROTOCOL

The spec recorded a live disagreement for the implementer to settle: one reviewer
read the NVFP4 arm's `keyframes_abs_pos_embedding` as zero-initialized and
therefore an exact no-op; another said it stays on the meta device. Both readings
are consistent with the source. Only one is consistent with what runs, and an
implementer on the sibling row (#663) has now RUN it, using upstream's own
`create_meta_model` and its own metadata reader rather than a hand-rolled probe:

  keys matching 'keyframes_abs_pos' in the file : []   (0 of 7876 entries)
  config.transformer['use_keyframes_abs_pos_embedding'] = True
  keyframes_abs_pos_embedding: shape=(1, 4096) device=meta is_meta=True
  supports_keyframes_abs_pos_embedding (BEFORE load) : False
  after load_state_dict(sd, strict=False, assign=True):
    neighbour patchify_proj.weight : device=cpu is_meta=False   <- materialised
    keyframes_abs_pos_embedding    : device=meta is_meta=True
    in missing_keys                : True
    reading the value RAISES : RuntimeError: Tensor.item() cannot be called on meta tensors
  supports_keyframes_abs_pos_embedding (AFTER load)  : False

The materialised NEIGHBOUR is what makes the result mean anything: the loader ran
and populated the model, and only the absent key stayed on `meta`. Without that
control the transcript would be equally consistent with a loader that did nothing.

So on the first-party NVFP4 DiT upstream never reaches the add at all. The
correct mirror there is to LOAD AND APPLY NOTHING -- neither the refusal
`ltx2.cpp:192` raises today, which is stricter than upstream, nor a synthesised
zero, which would invent the behaviour `supports_...` exists to prevent. The row
retires that refusal outright, and section 6 now names the tempting middle option
as the risk rather than leaving it open.

One narrow consequence, stated narrowly so it is not over-read: a render taken on
the NVFP4 DiT with `allow_unported_modules` is upstream-equivalent FOR THIS
MODULE ONLY. It says nothing about the render as a whole.

Also corrected here: the guards are `model.py:166-173` and `:175-200`, not
`167-182`/`175-193`; and the flag is NOT at the top of `__metadata__` -- a raw
read returns None, it lives at `config.transformer`, which is why upstream's
JSON-decoding reader is needed to see it at all.

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5[1m] [claude-code]
…ame bias (#644, #658)

This branch was written 120 commits ago. Two of the things it says have since
been made true by somebody else, and saying them again would UNDO that. Ten
files conflicted; five are source and five are keyed records.

## The port half of this branch already landed

`baa92ccf7` (spec) and `020381676` (implementation) reached `main` on 2026-08-13
as the squash `65e79eee5`, "feat(ltx-2.5): port the prompt-side AdaLN, and stop
the opt-in from clearing it (#654)". What is still unique to this branch is the
two `record(...)` commits: the fixture-vs-checkpoint magnitude correction, the
audio denominator, and `scripts/measure-ltx2-prompt-adaln.py`.

## `98f8e046d` (#880, #658) landed the keyframe bias TODAY and supersedes half of
this branch's prose

Four of the five source conflicts are this branch asserting things about
`keyframes_abs_pos_embedding` that were true while it was UNPORTED and are false
now. Each takes `main`'s side wholesale, and each is a case of `main` already
carrying this branch's own finding in a better place:

- `include/vllm/model_executor/models/ltx2.h` — the 57-line CORRECTED bullet hung
  off an "unported modules" list entry that no longer exists. `main` states the
  same meta-device fact at `ltx2.h:144-153`, on the FIELD, where it decides
  behaviour: "upstream builds on the meta device (loader/helpers.py:84-95) and
  loads with `strict=False, assign=True`, so the absent parameter stays on `meta`
  and the add is never reached."
- `include/vllm/model_executor/models/ltx2_loader.h` — "the refusal is keyed on
  the tensors" describes a refusal that no longer exists.
- `src/vllm/model_executor/models/ltx2.cpp` — this branch re-adds the
  `use_keyframes_abs_pos_embedding` refusal `VT_CHECK` that #880 deleted. Taking
  HEAD here would have re-refused BOTH shipped DiTs.
- `src/vllm/model_executor/models/ltx2_loader.cpp` — same, for the
  `RefuseUnported` message's tensor-keying rationale.

`tests/vllm/models/ltx2_goldens.inc` is GENERATED and was not hand-merged. It was
regenerated with the committed command, `python3 scripts/gen-ltx2-goldens.py
--ltx2 /home/mudler/_git/LTX-2 --out tests/vllm/models/ltx2_goldens.inc`, against
`Lightricks/LTX-2` at the pinned `fd4ded7f` (working tree clean), REGEN_EXIT=0.
The result differs from `main` by 12 insertions and 7 deletions, ALL of them
comment lines in the prompt-AdaLN magnitude block: every golden VALUE on both
sides, including #880's new `kLtx2Forward Keyframes*` arrays, is byte-identical.

## The five keyed records, resolved the way `AGENTS.md` `## Records` says

Take the complete target-branch version, apply the scoped edit again, verify
unrelated keys are byte-for-byte equal. Never accept the three-way merge. Per
file, changed lines against `origin/main`:

| file | changed | key this row owns |
|---|---|---|
| `.agents/model-matrix.md` | 1 +, 1 - | `MODEL-DIFFUSION-ltx-2-5-ltx2-video-transformer-3d-model` |
| `.agents/roadmap_v1.md` | 0 | none any more — see below |
| `docs/FEATURES.md` | 0 | none |
| `docs/STATUS.md` | 0 | none |
| `docs/USAGE.md` | 0 | none |

`model-matrix.md` is the one record `main` is STALE on. Its LTX-2.5 cell still
reads "timestep-INDEPENDENT prompt K/V (cacheable once per request)" — the claim
this campaign retracted on 2026-08-12 and #654 ported away on 2026-08-13. One
line is rewritten and nothing else: `git diff --numstat origin/main` reports
exactly `1 1`, so every other key in a 500-row file is byte-identical.

The other four are zero-line resolutions, and that is the finding rather than an
omission. This is a record-correction branch; it changes no lifecycle state, so
`AGENTS.md` `## Public documents` owes it no `STATUS` / `FEATURES` / `USAGE`
edit at all. Its edits to those three were compressions and an
`allow_unported`-era sentence that #880 has since replaced with a truer one
("BOTH DiTs load, NO `allow_unported`"). Reapplying them would reintroduce a
retired opt-in.

`roadmap_v1.md` needs no reapplication because the surface moved: `main` retired
the roadmap's inline issue table into `.agents/issue-index.md`, which carries
`merge=union`. The row this branch appended there for #673 is appended to the
index instead, in the follow-up commit.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
mudler added 2 commits August 15, 2026 12:13
`origin/main` moved twice while this branch's gate was running — `1e2408526`
(#894) and `e8048ef63` (#895). Merged rather than rebased, because a rebase over
a pushed branch is a force-push and `AGENTS.md` forbids one.

Both are DOCUMENTS. `git diff` over the merge names `docs/FEATURES.md`,
`docs/SPECULATIVE-DECODING.md`, `docs/USAGE.md` and `website/data/nav.yaml`, and
no `src/`, `include/` or `tests/` path, so the built tree the mutations and the
suite counts were measured on is still the tree that is being landed. The merge
reported no conflict, and the two keyed records this branch owns were re-verified
against the NEW `origin/main` afterwards rather than assumed: `git diff --numstat
origin/main` reports `1 1` on `.agents/model-matrix.md` and nothing at all on
`.agents/roadmap_v1.md`, `docs/FEATURES.md`, `docs/STATUS.md` and `docs/USAGE.md`.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…rough the door, plus the counts and claims the keyframe port moved (#644, #658, #886, #900)

The merge before this one reconciled the TREE onto `98f8e046d`. This reconciles
what the row SAYS, files the issue it was carrying outside the index, and answers
a rule that landed after the branch was written.

## `.agents/issue-index.md` — #673 was never indexed

`AGENTS.md` `## Every change starts from an issue` requires the number in three
places that agree: the index, the row's spec, and the pull request body. #673 was
open, named in the spec and in the pull request body, and absent from the index
on this branch AND on `main` — checked both, not one. The branch had appended it
to the roadmap's inline issue table instead, and `main` has since retired that
table into the index. So the row moves to the surface that still exists.

Two rows are appended, #673 and the new #900 below.

Appended, nothing edited and nothing removed:
`scripts/check-issue-index-append-only.py --base origin/main --head HEAD` exits 0,
and `scripts/check-agent-record.py` exits 0 at `ENGINE=156 MODEL=377 QUANT=82
KERNEL=51 BACKEND=82`. The row carries `—` in the `Row` column and is listed
under `## Owed` in the spec, which is the shape the checker's unowned ratchet
requires; the high-water mark is untouched.

## The spec's keyframes section argued for a disposition that #658 retired

`LTX25-KEYFRAMES-ABS-POS` (#658, `98f8e046d`) ported
`keyframes_abs_pos_embedding` on 2026-08-14 and retired BOTH refusals this row's
Outcome reasoned about. Three passages were left asserting the opposite, and one
of them is a forward-looking rule rather than history:

- §3.3 said `use_keyframes_abs_pos_embedding` is "the sole flag
  `Ltx2AdoptDeclaredDitParams` still clears". It clears none: the declared flag is
  now RESOLVED against what the file carries.
- "The refusal keying does NOT change" described a refusal that no longer exists.
- The second of the two recorded divergences — "we refuse
  `keyframes_abs_pos_embedding` by tensor presence" — is gone with the refusal.
  The first divergence survives and is unchanged.

Each is dated and marked SUPERSEDED in place rather than deleted, with the
current disposition pointed at `.agents/specs/ltx25-keyframes-abs-pos.md` §2.
`AGENTS.md` `## Records`: never delete evidence to reduce context. The FINDING —
that the absent parameter stays on `meta` rather than becoming a zero — is not
retracted; #658 acted on it, and `scripts/measure-ltx2-keyframes-meta.py` now
re-runs it on demand instead of quoting it, which is the review's meta-device
probe already landed on `main` rather than owed here.

## The reachability question, asked because the rule post-dates the branch

`AGENTS.md` `## Nothing lands dead` and `.agents/reachability.md` landed in
`8f49ac3be` (#886), after this branch was written, so the answer is derived
rather than assumed. It ships NO checker — `8f49ac3be` touches seven files, all
documents, and `ls scripts/ | grep -iE 'reach|dead'` returns nothing against a
positive control of 37 `check-*` scripts — so there is no exit code to report and
the guide says why.

**Reached: YES**, and the chain is in the spec with every anchor re-derived at
this merge commit and asserted UNIQUE rather than merely present:
`include/vllm.h:962` (`vllm_video_generate`) to `src/capi/vllm_c.cpp:1646` to
`ltx2_video.cpp:1063` to `:1730`/`:1732` to `ltx2_dit.cpp:785` /
`ltx2_device.cpp:1152`, where the flag DEFAULTS TRUE at `ltx2.h:133`, and on to
`ltx2_dit.cpp:581` and `:205`/`:140`. The loader half is `ltx2_video.cpp:533` to
`:624`. Default configuration, not an opt-in, and as of #658 both shipped DiTs
take it with no `allow_unported_modules`.

**Entered by the smallest failing test: NO — filed as
[#900](#900 The rule's second half
is the one that fails, and the reachability mutation says so rather than an
argument. Delete the production call site — `ltx2_dit.cpp:140`
`if (prompt_mod != nullptr) {` becomes `if (false) {` — and rebuild: BUILT=YES,
compile_err=NO, so this is a test result and not a compiler refusal.
`test_ltx2`, which calls `Ltx2DitForward` by hand, goes RED at 3 of 43 cases and
6 of 4388 assertions. `test_ltx2_video`, which enters through the ABI, stays
GREEN at 37 of 37 and 784 of 784, exit 0 — although its fixture sets the flag
TRUE (`ltx2_video_fixture.h:258`) and every render it drives executes the path.
It asserts no value the term can move.

Filed rather than fixed in flow because closing it needs an ABI-level value
oracle designed red-first, which is a row with a spec, not a record repair. The
LOADER half passes both halves, and the same harness shows it: M3 re-adds
`use_prompt_adaln_single = false` in front of §3.2's guard and takes
`test_ltx2_video` to 29 of 37 cases failing, exit 1.

## The numbers were re-measured, not carried forward

Every published digit was re-derived on this tree rather than copied. The shipped
NVFP4 DiT through `scripts/measure-ltx2-prompt-adaln.py` (`ltx_core` at the
pinned `fd4ded7f`, `__file__` asserted, exit 0): video `rms|term|/rms|table|`
1347%, audio 1583%, `max` ratios 7119% / 2817%, `+8.8%` / `+31.3%` on a unit-rms
context, and 1275% / 1492% under the file's own LinearQuadratic 8-step sampler.
The audio fixture denominator by importing the generator so no weight is
re-drawn: 0.0201763 / 0.0496868 = 40.6068%, giving 2817 / 40.61 = 69.4x, against
the video 0.0252012 / 0.0487142 = 51.7327% and 7119 / 51.73 = 137.6x. Unchanged,
so the headline stands as written.

**Two counts DID move, and #658 moved them.** `test_ltx2_video` measures 37 cases
/ 784 assertions with `LTX2_CHECKPOINT_ROOT` unset and 37 / 9031 with it set,
where the row recorded 30 / 502 and 30 / 8734 on 2026-08-13. The figure #673
quotes is therefore 784 of 9031 — 8.7%, not 5.7%. Corrected in the spec, in the
index row and at the skip site in `tests/vllm/multimodal/test_ltx2_video.cpp`,
each carrying its date, because a bare count in a comment is exactly the thing
that goes stale under somebody else's merge. Note also that the CASE count is now
IDENTICAL in both configurations, so the "unchanged case count" reading the
original note relied on no longer distinguishes them at all.

**M5's first run was a silent NO-OP and is recorded rather than dropped.** The
harness's substitution for the shift/scale swap spanned two lines and never
matched, so the tree was unchanged, the build succeeded, and `test_ltx2` printed
43/43 SUCCESS — a green that says nothing about the guarantee. It was caught only
because the harness prints `git diff --stat` for every mutation and that line was
missing. Re-applied as a real edit (`1 file changed, 2 insertions(+), 2
deletions(-)`) it is RED at 2 of 43 cases, exit 1. All five mutations are in the
spec with their BUILT status, because a mutation that fails to build reads as a
passing test.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
@localai-bot localai-bot changed the title record(LTX25-PROMPT-ADALN): the prompt-AdaLN defect was understated ~138x, and the keyframes claim next door was false (#644) record(LTX25-PROMPT-ADALN): the ~138x understatement stands, the keyframes claim next door is now main's, and nothing enters through the door (#644, #658, #900) Aug 15, 2026
@localai-bot

Copy link
Copy Markdown
Collaborator Author

Operator call on the one question the review left open, recorded explicitly rather than by omission, because the reviewer was right that it should not be settled by silence.

Question. AGENTS.md ## Nothing lands dead and .agents/reachability.md say a disclosed slice must name "the row ID that owns the wiring". The commit body, the PR body, and ## Owed all name the issue (#900) and the shape of the work, but no row ID, because no such row exists.

Ruling: the staged-slice clause is not triggered, so the landing is permitted — and on stronger grounds than the clause.

That clause governs landing a layer before the wave that wires it. This PR lands no product code at all: 8 files, none under src/ or include/. The code in question is already on main via 65e79eee5 (#654) and 98f8e046d (#880), where it is reached from vllm_video_generate on the default configuration — the review re-derived that chain by hand, 14 anchors, each unique in its file.

What is unreached is a test entry, not a slice. #900 is therefore an honest disclosure of a pre-existing hole in the gate around already-landed code, and filing it as owed debt is the correct disposition. Requiring a row ID here would mean opening a row whose only purpose is to be named by a document, which is the kind of record-for-its-own-sake this protocol keeps trying to delete.

What makes me confident rather than merely persuaded is the reviewer's second mutation. Deleting the production call site (ltx2_dit.cpp:140if (false)) takes test_ltx2 red and leaves the ABI suite green at 37/37. On its own that could be an artifact of deleting one if. So they zeroed out.prompt_modulation at a different altitude (ltx2_dit.cpp:582, straight after PrepareTimestep) — BUILT, 1 file changed, 1 + — and got the same split: test_ltx2 exit 1, test_ltx2_video exit 0 at 37/37, 784/784.

Two independent injections, one verdict: the ABI suite cannot see this term at all. That is a class gap, not a one-line artifact, and #900 states it accurately rather than understating it. An issue that describes the gap correctly is worth more than a row opened to satisfy a sentence.

If a row is later opened for the ABI-level value oracle, it should name #900 — not the other way round.

FOLLOWING_AGENTS_PROTOCOL

mudler added 2 commits August 15, 2026 13:14
…re dated but never re-derived (#644)

Review of #663 returned FAIL on two `file:line` citations in
`.agents/specs/ltx25-prompt-adaln.md`. Both pointed into
`tests/vllm/multimodal/test_ltx2_video.cpp`, and both landed inside an unrelated
CRF-refusal `SUBCASE` rather than the text they claim to cite.

`:917-921` for the shipped-checkpoint skip-and-return becomes `:1316-1319`, and
`:913-914` for the "differ in a TRAINED `keyframes_abs_pos_embedding`" comment
becomes `:1302-1303`.

Why they rotted is the point. Both were correct when written at `2990ed81b`. The
row then re-measured its suite counts and dated them, but re-derived none of its
own anchors into `test_ltx2_video.cpp` — the one file whose line numbers #658
moved most. `98f8e046d` inserted 169 lines above the cited text and this branch
added 9 more, so the citations drifted 389 lines while the row was auditing the
numbers next to them. Dating a count is not re-deriving an anchor; anchors here
rot inside a single pull request, and these two did.

The skip-and-return is also not uniquely identifiable by its text: the block at
`:1316-1319` is byte-identical to the one at `:1451-1454` in `ltx2 video: the
SHIPPED Lightricks VAEs and upsampler load`. A future re-derivation that greps
for it gets two hits and cannot choose. The sentence therefore now names the
enclosing case, so the anchor can be re-derived rather than only trusted.

Verified at this tree with a uniqueness assertion, not an existence check: the
cited comment occurs exactly once in the file, and the cited skip block sits
inside the named case, which is itself declared exactly once. Four positive
controls — the two old anchors, the identical VAE-case skip block, and an
off-by-two span — each report STALE, so the clean result is a measurement and
not silence.

Documentation only. No `src/`, `include/`, `tests/` or record file is touched.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…hey were derived (#644)

The whole of `.agents/specs/ltx25-prompt-adaln.md` is branch-local — it does not
exist on `main` — so every citation in it arrives with this pull request and gets
no second chance to be right. Five anchors were verified correct at `baa92ccf7`,
then moved out from under the prose by this row's own implementation commit
`020381676` and by `98f8e046d` (#658) on top of it. That is exactly the window in
which a citation goes wrong without anyone reading it again.

Three are present-tense claims about the current tree and take a live line
number: the modulation-order trap in `ProcessOutput` (`ltx2_dit.cpp:530-540` →
`:640-642`), the prompt-K/V cache refusal in `Ltx2DitForward` (`:672-676` →
`:775-780`), and the `use_keyframes_abs_pos_embedding` clear in
`Ltx2AdoptDeclaredDitParams` (`ltx2_loader.cpp:979-984` → `:1033-1035`). Each now
resolves to the text its sentence quotes, and to nothing else in its file.

Two sit in section 0, "what is wrong today", and describe a state this row
changed. They are decided separately rather than uniformly.
`ltx2_loader.cpp:988` quoted `declared.use_prompt_adaln_single = false;`, which
this row DELETED; no live line can carry it, so it is SHA-anchored `@ baa92cc`,
where that assignment and the two manifest-path assignments the next sentence
cites as `:573` / `:626` are all still present and the live file has none of the
three. `ltx2_video.cpp:570` quoted the `allow_unported_modules` read, which still
exists and merely moved, so it takes the live `:617`. A SHA anchor is the honest
fix only when the cited text is gone. Reaching for one to avoid re-deriving a
line that still exists would hide the anchor from every later sweep.

Every anchor in the file was re-derived at this head and asserted UNIQUE — the
quoted text matches exactly once in the cited file and the match starts at the
cited line — against a positive control that reports STALE on a deliberately
wrong line, so a clean result is not silence. 32 repo-local citations were
checked: 26 distinct full-form anchors plus 5 bare `:NN` continuations. The 34
`diffusers` and `ltx-core` anchors are out of scope here.

One repo-local citation is STALE and is deliberately NOT repaired, because this
change carries authority for the five above and no more: `ltx2.cpp:274-276`,
cited three times as the `VT_CHECK` that refuses the prompt-AdaLN tensors by
name. It was exactly those three lines at `baa92ccf7`, this row deleted it
(section 2 item 5 says so), and the live lines are the unrelated
`keyframes_abs_pos_embedding` enumeration. Same defect class as
`ltx2_loader.cpp:988`, and it wants the same SHA anchor. Recorded here rather
than left for a later reader to rediscover.

`ltx2_video.cpp:617` is the one anchor sensitive to a `main` merge: this branch
adds nothing to `src/`, and `origin/main` has since moved that line to 660. It
must be re-derived on the merged tree, not carried forward.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
mudler added 5 commits August 15, 2026 13:46
…chors (#644)

`origin/main` advanced four commits while this branch sat on `00613767d`. Merged
rather than rebased, because a rebase over a pushed branch is a force-push and
`AGENTS.md` forbids one. The merge reported no conflict.

It is not a document-only merge, which is why it is committed on its own. The
one commit that matters here is `0785cfc4d` (#882, `LTX25-RETIRE-DEAD-ARMS`),
which touches the same two files this row's record cites most: it adds 70 lines
to `src/vllm/multimodal/ltx2_video.cpp` and 306 to
`tests/vllm/multimodal/test_ltx2_video.cpp`, all of them AHEAD of every anchor
this spec carries into those files. Seven citations that were correct at
`00613767d` are wrong at this commit, and the repair rides in the next one.

The rest is `04be1390b` (#901) sweeping unchecked registry downcasts across 30
translation units, `b5f27c9a4` (#906) recording issue #904, and `727ac7734`
(#909). None of them is on this row's path.

Verified after merging rather than assumed: `git diff --numstat origin/main`
names `.agents/issue-index.md`, `.agents/model-matrix.md`,
`.agents/specs/ltx25-prompt-adaln.md`, `scripts/gen-ltx2-goldens.py`,
`scripts/measure-ltx2-prompt-adaln.py`, `tests/vllm/models/ltx2_goldens.inc`,
`tests/vllm/models/test_ltx2.cpp` and
`tests/vllm/multimodal/test_ltx2_video.cpp` — and no `src/` or `include/` path,
so the claim in this row's Outcome that it changes no product source still holds
against the NEW `origin/main`.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
… all 33 citations, and file the class (#644, #911)

Three things, all in one spec plus one append-only index row.

**The refusal that no live line can carry.** `ltx2.cpp:274-276` was cited three
times (§0, §1.1, §2) as the `VT_CHECK` refusing the prompt-AdaLN tensors by name.
This row DELETED it — §2 item 5 says so — so the citation was not merely stale: live
`274-276` is now an unrelated `keyframes_abs_pos_embedding` enumeration, which
contradicts the sentence carrying it. All three are now
`ltx2.cpp:274-276 @ baa92cc`, the same disposition §0 already uses for
`ltx2_loader.cpp:988`. Proven both ways with positive controls: at `baa92ccf7`,
`VT_CHECK(!p.use_prompt_adaln_single` matches once at `:274` and
`not ported in phase L2` at `:276`; in the live tree both grep exit 1 across
`src include tests`, while the control term `PushAdaLayerNormSingle` matches 7
times at that SHA and 9 today. A null grep on its own would only have proven the
search terms wrong.

**Seven anchors the merge moved.** The preceding merge commit explains the
mechanism; this is the repair. `ltx2_video.cpp:617 → :660`, `:1063 → :1106`,
`:1730/:1732 → :1784/:1786`, `:533 → :575`, `:624 → :667`, and in the test
`:1316-1319 → :1620-1625`, `:1302-1303 → :1608-1609`. Every one was correct at
`00613767d`.

The env-gate anchor gained a line rather than just an offset. Its four gate lines
are byte-identical to the gate of `ltx2 video: the SHIPPED Lightricks VAEs and
upsampler load` at `:1757-1760`, so an anchor on the gate alone names two places
and identifies neither — an ambiguity that was already there at `:1316-1319`.
Starting the span on the `TEST_CASE` line, which occurs exactly once, is what
makes it resolvable.

**All 33 repo-local citations re-derived**, not only the ones known to be wrong:
27 live, 4 SHA-anchored occurrences, 2 bare continuations of the SHA-anchored
loader claim. All FRESH. The expected text comes from the CLAIM, never from the
file — a checker that reads the span out of the file it is validating is a
tautology and reported 27 of 27 fresh on the same tree where five anchors pointed
at a `VT_CHECK` message string and a comment about mask pointers. Armed, not
decorative: shifting four anchors by one line gives 6 STALE of 33.

`ltx2_loader.cpp:573`/`:626` is the deliberate exception. Both lines really do
read `out.params.use_prompt_adaln_single = false;`, which is what §0 claims, so
uniqueness there is asserted as "exactly these two lines".

**One claim corrected while its anchor was being re-derived.** §0 said the FP8
DiT carries "12 `prompt_adaln_single.*`, 6 `audio_prompt_adaln_single.*`". It is
9 and 9 — `grep -c` returns 9 per family and each cited span is nine lines — 6
parameters plus 3 FP8 weight scales per stream. The TOTAL of 18 was always right
and no conclusion drawn from it moves; the breakdown was not, and a citation
whose own span contradicts its sentence is the defect this repair exists to
remove.

**Filed rather than swept: #911.** This spec shipped eight stale repo-local
anchors across two earlier repair commits, every one introduced by its own
commits and moved by its own `020381676` and by `98f8e046d` (#658), then seven
more from the merge alone. Spec BODIES are checked by nothing:
`check-agent-record.py`'s `MATRIX_PATHS` covers the five matrices,
`feature-matrix.md` and `specs/model-family-inventory.md`, leaving 4772
line-carrying citations across 315 `.agents/specs/*.md` unexamined (positive
control: 2314 line-less `.cpp` mentions match the same shape, so the count is not
a grep artefact). The rule is one sentence — an anchor into a file the row is
editing is stale until re-derived at the tree that LANDS, merge included — and
both dispositions are already in use here unwritten. Narrower on surface than
#632 and sharper on mechanism, so filed beside it rather than folded into it. A
repo-wide sweep and a checker change each need their own spec and red-before
evidence, which is not this PR.

No `src/`, `include/` or `tests/` file changes.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…is one moves nothing (#644)

`origin/main` advanced to `2f2bce926` (#891, the MoE vision tower) while this
branch's gate was configuring. Merged rather than rebased, per `AGENTS.md`. No
conflict.

Recorded because "it moves nothing" is a measurement here, not a guess. The
files #891 touches are `qwen3_5.{h,cpp}`, `qwen3_5_weights.{h,cpp}`,
`tests/CMakeLists.txt`, two new `test_qwen3_5_*` suites, `model-matrix.md`,
`issue-index.md`, `specs/moe-vision-tower.md`, `docs/FEATURES.md` and
`docs/USAGE.md`. Intersected against the twelve files this spec cites — every
`ltx2_*` source, `include/vllm.h`, `src/capi/vllm_c.cpp`,
`scripts/gen-ltx2-goldens.py`, `ltx2_fp8_dit_manifest.inc` — the intersection is
EMPTY, and the same `grep -Fx` shape returns `qwen3_5.cpp` as its positive
control, so the empty result is an answer rather than a wrong pattern.

The 33 citations were nonetheless re-derived on this tree rather than carried
over from the previous merge: 33 FRESH, and the armed control (four anchors
shifted by one line) still reports 6 STALE of 33. That is the rule this row
exists to demonstrate — a re-derivation is only true of the tree it ran on — and
declining to re-run it here because the reasoning said it was safe would be the
same shortcut in a better mood.

The two keyed records were checked rather than trusted to the merge driver.
`.agents/model-matrix.md` differs from `origin/main` by `1 1` — the single
`MODEL-DIFFUSION-ltx-2-5-*` row this branch owns, with every other key
byte-for-byte equal. `.agents/issue-index.md` differs by `3 0`: #673, #900 and
#911, appended, with ZERO deletions.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…middle of the reachability argument (#644)

Three editorial defects in the preceding commit, found by reading its own diff.

The re-derivation subsection was inserted between the reachability chain and the
paragraph that qualifies it, so `**The second half of the rule is NOT
satisfied**` — which is about the chain above it — read as though it were about
citation freshness. Moved to the end of `## Outcome`, immediately before
`## Owed`, where the thing it qualifies is the whole file rather than one
section.

The migration arrow said `:1316-1319 → :1622-1625` while the anchor two hundred
lines earlier reads `:1620-1625`, because the widening for uniqueness was decided
after that sentence was written. An anchor repair that ships two different
numbers for the same anchor is the failure it is repairing, so the arrow now
names `:1620-1625` and says why it gained a line.

A reflow left `same binary` alone on its own line.

All 33 citations re-derived again after the move — the move changes spec line
numbers, not anchors, but "it cannot have changed anything" is the reasoning this
row exists to distrust. 33 FRESH, and the armed control still reports 6 STALE of
33.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…alidated, marked UNKNOWN rather than carried (#644, #673)

The merge that repairs seven anchors also invalidates a count, and the count was
about to ride along unexamined — which is the same defect in its other form. An
anchor and a measurement both name a tree, and this row's rule is that neither
survives a merge on the argument that it probably did not move.

`0785cfc4d` (#882) added 306 lines to `tests/vllm/multimodal/test_ltx2_video.cpp`
between `00613767d` and this branch's tip, taking it from 37 to 40 `TEST_CASE`s.
The Outcome quoted 37 / 784 with `LTX2_CHECKPOINT_ROOT` unset and 37 / 9031 with
it set, dated to the PREVIOUS merge, in three places.

What is measured here is the SOURCE count, 37 to 40, by `grep -c '^TEST_CASE'` on
both revisions with the same grep returning matches on `origin/main` as its
control. The doctest CASE and ASSERTION totals were NOT re-run, so they are
recorded as UNKNOWN rather than adjusted, guessed, or left standing. Marking a
number superseded is cheap; inventing its replacement is not available, because
the `set` arm needs the 18.72 GB NVFP4 and 23 GB FP8 DiTs under
`$CHECKPOINT_ROOT` and no CI host has them. That debt is #673's, where it already
lives.

Two claims that DO survive, checked rather than assumed. The #673 ratio finding —
CI executes a single-digit percentage of this suite — does not depend on the
exact totals. And the #900 reachability finding, that deleting the term leaves
`test_ltx2_video` green, is not undone by adding three cases that also do not
observe it.

Scoped by measurement, not by assertion: `test_ltx2_loader.cpp` and
`test_ltx2_device.cpp` are byte-identical across those two revisions —
`git diff --numstat` reports nothing on either, against a positive control that
reports `62 8` on `ltx2_video.cpp` — so their counts are untouched, and
`test_ltx2.cpp` differs only by this branch's own edit.

All 33 citations re-derived again on this tree: 33 FRESH, armed control still 6
STALE of 33. This commit changes one Markdown file and no build input, so the
`BUILD_EXIT=0` / `CTEST_EXIT=0` / `100% tests passed, 0 tests failed out of 480`
gate measured at `7bf2a9297` still describes the tree that lands; `git diff
--name-only 7bf2a92` naming only the spec is the evidence, and it is stated as
an inherited gate rather than a fresh one.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
@localai-bot
localai-bot merged commit fba312c into main Aug 15, 2026
4 of 17 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.

2 participants