Skip to content

LTX-2.5: three phase anchors and the instrument's own cost accounting are measured and reviewed, and none of them is on main #1668

Description

@localai-bot

Three phase anchors and the instrument's own cost accounting were measured, gate-run and reviewed three times on #1556, and none of them is on main. #1556 is closed rather than merged, for a reason that is about its COMMIT MESSAGE and not about its code — see "Why the pull request could not be merged" below. This issue owns the work so it is not lost.

Verified absent from main

Measured on db648fb88, by grep over src/, include/, tests/ and docs/:

symbol occurrences on main
load.dit_config 0
artifacts.mux 0
sampler_updates 0
denoise.update 1, and it is tests/vllm/multimodal/test_ltx2_video.cpp:4325 ASKING for it
Record::instrument_seconds 0

The one thing that IS on main is the load prologue. 519303d15 (#1622, issue #1439) names it load.open at src/vllm/multimodal/ltx2_video.cpp:794, closed at :956; #1556 named the same region load.setup and opened and closed it at the same two statements with the same Scope::Close shape. Same repair, and main's is the one that stands. That is a supersession of ONE anchor, not of the branch.

What is owed here

  1. load.dit_config — the DiT config resolution between load.dit and load.video_vae. 0.950 ms, 5% of the measured 19.178 ms residue on the 64x64x9 fixture.
  2. artifacts.mux — the result assembly and mux argv build, after artifacts.audio and before WritePhaseLog reads the clock. 0.210 ms, 1%. Named mux rather than finish deliberately: phase.finish already names what a RECIPE PHASE does after its sampler, and two names one letter apart for two different things is how a reader mis-ranks a lever.
  3. denoise.update plus Ltx2ConditioningTrace::sampler_updates — nested inside denoise, wrapping the sampler's post-process and Euler step on the first-order arm. This is the WHOLE of the coverage gate's miss, and the shape of the miss is what proves it is work rather than instrument overhead: 49 us per step at nine frames against 343 us per step at 81 frames, in one run of one binary. Instrument cost does not move 7x with the latent. Counted by a render-side counter, not by the phase table, because a denominator derived from the phase table cannot falsify a phase table.
  4. Record::instrument_seconds — the instrument charging its own out-of-record wall to the innermost live non-span record, and to the table when none is live, with the conservation invariant between the two. PhaseLog::Open stamps o.start after taking the process-wide mutex and PhaseLog::Close stamps r.end before it emits its progress line, so both intervals land outside every record today. Plus WriteJson taking Elapsed() before it copies and sorts, so the table stops charging its own serialization to the render.

Why this is not urgent, and why it is still owed

Neither red is reproducing. The sum floor was repaired on main by 519303d15, which is the right repair. The coverage floor was repaired by 6b48edb2c moving it to 0.75 — and that change's own comment, still in the tree at tests/vllm/multimodal/test_ltx2_video.cpp:4324-4331, calls itself a holding action and asks for exactly item 3:

NAMING THE UN-NAMED TIME WOULD SETTLE IT PROPERLY, which is what #1439 asks for first. A denoise.update scope over the sampler's per-step update would put the interior residue under a name and make a tight share floor honest again. ... It stays owed rather than being folded into the repair of a standing red.

So main asks for this in writing, on a floor that is loose by its own account. Nothing is blocked; the record is what would have been lost.

Do NOT re-propose the bound

#1556 first replaced both wall-clock ratios with residue <= 2 * instrument, and three fresh reviews measured that and it is wrong. The un-instrumented remainder of a boundary dilates faster than the instrumented part under contention, so the comparison has a heavy right tail: 4 red in 45 at the table bound (load 88, max 4.115), 3 in 200 at the conservation case, 2 in 200 at unit.parent, and 28 in 160 (17.5%, max 5.55) on a standalone probe at load 125. A 20-run distribution reading 1.021 to 1.464 was the body of the first of those and saw NONE of its tail — which is itself the finding: a 20-run sample of this quantity does not see the tail that decides the gate. wall is the better-conditioned denominator because it grows with contention exactly when a preemption inflates the residue.

Both ratios therefore STAY. Read .agents/specs/ltx25-phase-residue.md ## Design 3 before measuring this again.

Why the pull request could not be merged

squash_merge_commit_message = PR_BODY, so the body IS the landed commit message and is unrepairable afterwards. #1556's body argues at length for load.setup as new work; 519303d15 had already landed that region as load.open. Merging would have written a materially false narrative onto main permanently. The body also carried a withdrawn bound and a build-newest-gcc repair that d27639e71 and 13548db8f had already landed twice over. Rewriting the body and the 809-line spec around what the change actually is now, on a branch that conflicts in three files, is a fresh row's work with its own red-first tests and its own fresh review — which is what this issue is.

The reference implementation is not lost. It is readable at refs/pull/1556/head = b45ea3bbb013f9c689f10c9bab1e9ca44efeca98, with the full gate report, the mutation table and the three review threads. git fetch origin refs/pull/1556/head retrieves it.

Scope note for whoever takes this

Land it as one unit or as anchors-first. The anchors (1-3) are self-contained and each has a measured share to justify it. Item 4 is a change to shared instrument semantics in render_phase_log.cpp and carries its own unit cases; #1556 measured it at ~193 lines across three files with two new TEST_CASEs. denoise.update makes denoise a multi-part leaf, so it pulls in assertion (1b) and part_min_coverage, and it owes the phase names published in docs/models/ltx-2-5.md.

Owning row: LTX25-PHASE-RESIDUE, spec ltx25-phase-residue.md. Sibling gaps this row filed and does not close: #1567, #1568, #1569, #1570, #1571, #1572, #1619. #1439 stays OPEN and is not closed by this work.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions