Skip to content

record(LTX25-DEVICE-RESIDENCY): the span-slack bound's fifth and sixth shapes, both MEASURED and both WITHDRAWN (#1727, #1728) - #1712

Merged
localai-bot merged 14 commits into
mainfrom
row/LTX25-DEVICE-RESIDENCY
Aug 23, 2026
Merged

record(LTX25-DEVICE-RESIDENCY): the span-slack bound's fifth and sixth shapes, both MEASURED and both WITHDRAWN (#1727, #1728)#1712
localai-bot merged 14 commits into
mainfrom
row/LTX25-DEVICE-RESIDENCY

Conversation

@localai-bot

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

Copy link
Copy Markdown
Collaborator

Nothing here touches assertion (1c). tests/vllm/multimodal/test_ltx2_video.cpp is byte-identical to main, #1572, #1576 and #1536 stay open, and the bound still carries the fourth shape's flat 30 ms constant. What lands is the record of two further shapes that were built, measured and withdrawn, so that the next person does not build them again.

That is a reversal of what this pull request set out to do. The reason is in the numbers below.

Four shapes, and what each one is measured to do

shape denominator how it fails measured
4th, on main a flat 30 ms per leaf record reds an unmutated tree under load, and cannot resolve artifacts.frames at all #1576, 171x on one binary
5th 4 x the WORST boundary a 1 kHz sampler saw across the WHOLE case one scheduling event on the sampler thread multiplies the bound by ~100 and silences a real 20 ms un-named phase a fresh review: the defect reds 9/9 alone, 0/4 with one 200 ms sampler stall, whole case GREEN 2/4
6th 4 x the worst boundary inside the RECORD'S OWN window too tight -- the honest span slack's tail exceeds it 5 red in 45 consecutive runs of the unmutated case on that mechanism, loadavg 21.8-61.5 (10 in total; see below)
next red only when the SAME leaf exceeds it in BOTH renders untried recorded, not attempted

The fifth shape: right derivation, wrong estimator

A fresh review confirmed the derivation operation-by-operation against render_phase_log.cpp: Open takes the mutex, stamps, samples and flushes a line; Close takes the same mutex, samples, then stamps and flushes. Head plus tail really is two boundary-sized operations and 2 x ceiling really is what the structure gives.

The estimator is what fails. Read over the whole case, that maximum is drawn from 3,764 to 27,975 draws while the numerator it bounds is a maximum over TWO, and maxima do not compare across sample sizes. Over 24 unmutated runs the sampler's MEDIAN operation measured 18.4-22.9 us -- stable to 1.24x across loadavg 25 to 82 -- and its MAXIMUM 47x to 785x that median.

arm what it stages (1c) red case verdict
C20 a 20 ms un-named phase in decode.audio's head 9 of 9 red 9 of 9
C20D2 the SAME defect + ONE 200 ms descheduling of the sampler thread 0 of 4 GREEN 2 of 4, bound 0.800 s

A real un-named phase, no assertion fires, and the only thing that made it pass is a scheduling event on a sleeping background thread.

The same review found the skip path was a permanent report-only state, which AGENTS.md ## Gates refuses in as many words: span_checked was computed, printed and asserted nowhere, and CI runs ctest --output-on-failure, so on a green run nobody ever sees it. Four CheckCarryingPhase calls reported 1 of 1, 0 of 2, 0 of 1, 0 of 1 while the case exited Status: SUCCESS! with the 20 ms defect present.

The sixth shape: better detection, and it reds an unmutated tree

Each draw stamped with PhaseLog::Elapsed(), and a record's bound reading only the draws inside that record. It is a strict tightening, and it detects better than anything before it:

mutation 30 ms constant 5th shape 6th shape
2 ms un-named head in decode.audio 0 of 4 1 of 4 3 of 3
15 ms un-named head in decode.video 0 of 4 5 of 5 3 of 3
20 ms + a 200 ms sampler stall -- 0 of 4 3 of 3

artifacts.frames -- the leaf #1470 is about, 0.9 to 61 ms, which no previous shape could resolve at all -- came out bounded at 71.9 us.

And then it was validated the way this cluster's own rule demands. 45 consecutive runs of the containment case, one pinned binary (sha256 242c7925...), an unmutated tree, loadavg 21.78 to 61.52, every run's counts recorded:

45 runs   35 green   10 RED

The headline 10 is not the red rate of the shape's final form, and the honest figure is 5. Two mechanisms produced those ten, and the second was identified and repaired while the population was still running -- so its nine reds were measured on a binary that predates its own repair, and that repair was never re-validated. 11%, five reds in 45, is the defensible number, against a measured 1 red in 120 (0.83%) for what is on main. It is 13x, it is decided by the same mechanism at any multiplier, and it is what the withdrawal rests on. The nine are reported rather than dropped, because a population that reports only its surviving mechanism is an argument and not a measurement.

assertion reds what happened
span_slack <= span_bound 5 the honest head-and-tail exceeded 4 x the record's own local worst boundary: decode.audio 13.115 ms vs 8.889 ms, decode.video 0.488 ms vs 0.374 ms, artifacts.frames 70.6 us vs 60.6 us
longest_checked 9 a leaf's longest record was not resolvable, most often artifacts.frames at ~1 ms with no draw of a 1 kHz sampler inside it

The second was repaired mid-flight -- a record shorter than the sampler's cadence takes the worst of the draws bracketing it. The first is not repairable by choosing a different denominator, and it is the same mechanism .agents/specs/ltx25-phase-residue.md ## Design 3 records for the withdrawn residue bound: the part of a boundary the instrument cannot measure -- the lock_guard release, the Close return, the Scope destructor and constructor, the call into Open up to its clock read -- dilates faster under contention than the part it can. It sits in the numerator and in no denominator a sampler can build.

Raising the multiplier would be repairing a red gate by widening it, which AGENTS.md ## Changing the rules or a checker refuses in as many words. (#1668 is not cited for that and does not say it; what it says, quoting this file's own comment, is that naming the un-named time would settle it properly -- the repair is an ANCHOR, not a threshold, which points the same way by a different route.) So both shapes are withdrawn.

The next traceable hypothesis, which this row does NOT take

A defect is REPRODUCIBLE within a run and a scheduling event is not. The fixture renders the same three carrying leaves TWICE. A bound that reds only when the SAME leaf exceeds it in BOTH renders would keep every detection measured above -- the injected sleeps run on every pass -- while dropping every red measured here: in all five span-slack reds the failing leaf exceeded the bound in exactly one render.

Its cost is named before anybody builds it: requiring both renders silences any real defect present in only ONE of them -- a first-render lazy allocation, a cold-cache path, anything the second pass warms. On this fixture the three carrying leaves run the same code on both passes, which is why the staged sleeps red 3 of 3, but that is a property of the fixture and not of the assertion.

That is a different assertion with a different failure mode. It owes its own red-first evidence, its own mutation set, its own 45-run validation, and a mutation present in render 1 alone. Attempting a fourth shape in the same session that refuted the second and third is how this cluster got four constants in the first place.

Issues

Closes nothing. #1572, #1576, #1536, #1470 and #1439 all stay open, and #1536's thesis is not refuted here either -- that claim depended on the fifth shape landing.

Filed by the fresh review and left open as constraints on any re-proposal, each owned by this row's spec ## Owed:

Baseline

Inheritance is read by FAILURE TEXT, not by job name, and the inherited set MOVED while this branch was open. At 019f66c1a main was red on build-test-cpu, both sanitize-cpu arms and both windows-msvc-*. Three of those five are GREEN here now: main landed the tests/vllm/v1/worker/test_runner.cpp:1557 repair (#1602/#1608) and this branch takes it by merge, not by any edit of its own.

agent-record was red here and is not this row's. Its failure text was ERROR: .agents/issue-index.md: issue #1649 listed twice — a merge=union duplicate this branch filed as #1733 rather than repairing, because AGENTS.md says never edit a row and never delete one. main repaired it in 6354755ba (#1742), #1733 is CLOSED, and this branch inherits the repair by merge. That one was worth reading rather than waving through: a records gate failing on a records-only branch is exactly where a real failure would hide behind an inherited one. The record anchors ... -> rot 37 line beside it is the rot budget being MET — check-agent-record.py prints ANCHOR-ROT=37 and exits 0 on main and here alike.

What is left is two jobs, and BOTH are inherited, filed and owned. Each is named by FAILURE TEXT and cited to the issue that MATCHES that text, because "the standing Windows red" is not one stable thing and a records gate turning red on a records-heavy branch is exactly where a real failure would hide behind an inherited one.

agent-record -- an ABSENT INSTRUMENT reading as a code verdict. The text is ERROR: test_rendered_benchmark_index_links_resolve_to_emitted_pages ... FileNotFoundError: [Errno 2] No such file or directory: 'hugo' / FAILED (errors=1). tests/scripts/test_check_site.py invokes hugo through subprocess.run with no shutil.which, no skipTest and no FileNotFoundError handler, and the job never installs it. That is #1722, open since 2026-08-22, with the repair in flight as PR #1726. #1754 is a later DUPLICATE of the same defect -- same file, same missing guard -- filed six hours after #1722 and citing neither it nor #1726; the original is cited here on purpose, because a squash body is the landed commit message and a pointer to a duplicate cannot be repaired afterwards.

It is a LAYERED failure, which is why it looks new: until 6354755ba the same job exited earlier on .agents/issue-index.md: issue #1649 listed twice, so nothing downstream of that line had been reached. The record checkers themselves are FINE -- check-agent-record.py prints ANCHOR-ROT=37 and exits 0 on main and on this branch alike, the rot budget MET rather than exceeded, and audit-live-rows.py passes -- verified locally on the merged tree rather than inferred from a job colour.

windows-msvc-cpu / windows-msvc-vulkan -- #584, and NOT #1649. #1649 is the pre-compilation refusal CMakeLists.txt: MSVC /W4 /WX policy is negated on the C/C++ compile by /w, and PR #1701 rescoped that gate on main at 2f2a70925. The lanes now get PAST Windows portability contract OK and die twenty-eight minutes later at test_openai_api_server.exe exited with status -1073740791 -- 0xC0000409, STATUS_STACK_BUFFER_OVERRUN -- immediately after a decoder prompt (length 40) is longer than the maximum model length of 32 refusal. That is #584, already open, and its history repeats: it was filed when an earlier fix first let that binary run on Windows, #1649 then re-masked it, and #1701 has unmasked it again. A post-#1701 Windows red citing #1649 is a false attribution, so this body does not make one.

Nothing in this change touches src/vllm/entrypoints/, and the length guard in that log is #1675, already present in this branch's merge base. Two branches sharing no diff reproduce the crash byte-identically, so it is attributable to no current row. windows-msvc-* is also SKIPPED on main (#503 -- the jobs are pull-request-only), so inheritance for it cannot be read off a main baseline at all and is established from failure text plus the owning issue instead.

tests/scripts/test_cpu_x86_llamacpp_floor.py refuses locally under box load with NO_QUIET_WINDOW after 30s (busy=105% builders=0 load=60.83) and passes once the box is quiet (Ran 10 tests in 186.719s / OK at loadavg 35). That is the harness's own quiet-window precondition, not a verdict.

This is records-only, and the invariants say so

git diff --stat <merge-base>..HEAD -- src/ include/ tests/ docs/ scripts/ is EMPTY, and the net diff is exactly three .agents/ files. The comparison is against the MERGE BASE rather than against origin/main deliberately: main moved to b508cbce6 while this branch was open, and a diff against the moved tip reports THAT commit's docs/FEATURES.md, docs/models/qwen3-8-27b.md and tests/vt/test_ops_matmul_fp8_block_cuda.cpp changes INVERTED, as though this branch were reverting them. It is not; it is one commit behind, and b508cbce6 touches neither ltx25 spec nor the issue index.

.agents/issue-index.md is +2 with zero removals: #1727 and #1728 each appear exactly once, they are the last two rows, and no pre-existing row is modified -- checked row-by-row against origin/main, not by reading the diffstat.

It composes with #1711, and that was PROVED rather than assumed. Both pull requests edit .agents/specs/ltx25-phase-residue.md and git merge-tree reports CONFLICT -- but the conflict is POSITIONAL, not semantic: #1711 edits rows #1569 and #1571, this one edits #1572 and #1470, and they collide only because #1571 and #1572 are adjacent lines. That table is a KEYED RECORD, so AGENTS.md ## Records forbids resolving it by an automatic three-way merge. The resolution takes the complete target-branch file and re-applies this branch's two row edits by exact unique anchor: all four edits present, and the six untouched rows byte-for-byte identical.

FOLLOWING_AGENTS_PROTOCOL

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

mudler added 5 commits August 22, 2026 16:18
… the coverage arm a mutation refused (#1572, #1576)

`test_ltx2_video` has carried four wall-clock constants and each was afterwards
found redding an unmutated tree. This records the measurement that replaces the
fifth one with a number the run takes itself, and the companion change to the
coverage floor that was written, measured and withdrawn.

120 runs of the containment case at `73ada0df8` on a 20-core box at loadavg
40-155, 1440 leaf-record observations, one binary: one run red, at loadavg
155.65, and its two failures are one 67.55 ms descheduling between
`ppm_phase.Close()` and the `artifacts.frames` destructor. Against the run's own
measured boundary cost that event is 0.645 of the ceiling; against the 30 ms
constant it is 2.25x over.

Two denominator shapes are recorded as rejected because both are the obvious
thing to reach for: bursts taken beside the render reach 2.954, and the
continuous sampler's 99.9th percentile reaches 199.4, where its maximum reaches
0.645.

The coverage floor keeps its share and gains nothing, because the second arm
makes `artifacts.frames.ppm` opened after the write loop instead of around it
pass with 1.1% coverage. That leaf is 0.2-7 ms while one boundary on this host
is 0.3-1.2 ms pinned to two idle cores, so no allowance built from the boundary
is smaller than the leaf. #1470 keeps it, and the repair named there is an
anchor rather than a threshold.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…sured, instead of the fifth constant (#1572, #1576)

`kSpanSlackPerRecord` was 30 ms, and before that 3 ms under a sanitizer, 0.25 ms
plain, and a 0.95 share of the leaf. The quantity all four bound is what a phase
boundary costs, which is a property of the machine and of what else held a core
at that second, not of this tree. #1576 measured it swinging 171x on one binary
and said a bigger constant would only move the load at which the same ambiguity
returns.

`InstrumentCeiling` times the three operations `PhaseLog::Open` and
`PhaseLog::Close` both perform -- the process-wide mutex, `SampleNow()`, and one
flushed write -- from a thread that runs for the load and both renders, and
keeps the worst. The bound is four of those: two boundary-sized operations sit
inside a leaf record's head and tail, and the four carries one factor of two
over the structure it is derived from.

The maximum, not a quantile, and that is measured. The numerator is itself a
maximum over two draws; over 1440 leaf-record observations the worst
`slack / ceiling` is 0.645 against the maximum, 2.954 against bursts taken
beside the render, and 199.4 against the same sampler's 99.9th percentile.

On this box the bound now runs 1.18 ms to 419 ms, median 13.3 ms, against the
flat 30 ms. A 20 ms phase nobody named in `decode.audio`'s head is green on
(1c) at 30 ms and reds 3 of 3 here.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
Brings the branch onto `944d7d947` so the trailer and commit-style gates run
against a tree that has `origin/main` as an ancestor. No conflicts: the branch
touches `tests/vllm/multimodal/test_ltx2_video.cpp` and two files under
`.agents/specs/`, and none of them is in the merged range.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
`origin/main` advanced to `deb53c6a3` while the previous preflight was running,
which put the branch behind it again and made the trailer and commit-style gates
SKIP rather than run. No conflicts: this branch touches
`tests/vllm/multimodal/test_ltx2_video.cpp` and two files under `.agents/specs/`,
and none of them is in the merged range.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
Keeps the branch fast-forwardable so the trailer and commit-style gates run at
all; they SKIP and report nothing when origin/main is not an ancestor of HEAD.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
mudler added 4 commits August 22, 2026 21:29
…n-slack bound, both measured and both WITHDRAWN (#1727, #1728)

Nothing in this change touches (1c). `tests/vllm/multimodal/test_ltx2_video.cpp`
is byte-identical to `main` again, and #1572, #1576 and #1536 stay open. What
lands is the record of two further shapes that were built, measured and
withdrawn, so that the next person does not build them again.

THE FIFTH SHAPE replaced the 30 ms constant with `4 x` the worst boundary a
1 kHz sampler observed across the whole case. Its derivation is right and a
fresh review confirmed it operation-by-operation against `render_phase_log.cpp`.
Its ESTIMATOR is not: that maximum is drawn from 3,764 to 27,975 draws while the
numerator it bounds is a maximum over TWO, and maxima do not compare across
sample sizes. Over 24 unmutated runs the sampler's MEDIAN operation measured
18.4-22.9 us, stable to 1.24x across loadavg 25 to 82, and its MAXIMUM 47x to
785x that median. One 200 ms descheduling of the sampler thread turned a real
20 ms un-named phase from red 9 of 9 into red 0 of 4, with the whole case GREEN
2 of 4.

THE SIXTH SHAPE drew the denominator from the record's OWN window, stamping each
draw with `PhaseLog::Elapsed()`. It detects better than anything before it: a
2 ms un-named phase reds (1c) 3 of 3 against 1 of 4 on the fifth shape and 0 of
4 at the constant, and the 20 ms defect with the sampler stall reds 3 of 3. And
then it was validated the way this cluster's own rule demands -- 45 consecutive
runs of the containment case, one pinned binary, an unmutated tree, loadavg 21.8
to 61.5 -- and it reddened 10 of 45. Five of those are the honest head-and-tail
exceeding four of the record's own local worst boundary; the other five are a
leaf whose longest record was not resolvable.

The first mechanism is the one that decides it, and it is the same one
`ltx25-phase-residue.md` `## Design` 3 records for the withdrawn residue bound:
the part of a boundary the instrument cannot measure dilates faster under
contention than the part it can, it sits in the numerator and in no denominator
a sampler can build, and tightening the denominator onto the record's own window
moves the bound into the honest distribution's tail.

So both are withdrawn rather than repaired by a larger multiplier, which
AGENTS.md refuses and #1668 names as the thing not to re-propose. The next
traceable hypothesis is recorded and NOT attempted here: a defect is
reproducible within a run and a scheduling event is not, so a bound that reds
only when the same leaf exceeds it in BOTH of the fixture's renders would keep
every detection above while dropping every red measured here, each of which hit
one render and not the other. It owes its own red-first evidence, its own
mutation set and its own 45-run validation.

#1727 and #1728 are filed against the sampler as constraints on any
re-proposal: two of its three terms are unfalsifiable by the gate, its estimator
is unmeasured under the sanitizers and in the full-suite configuration where
#1576's 171x swing was measured, and on a ROCm runner it would drive
`hipMemGetInfo` at 1 kHz under the process-wide phase mutex.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
Keeps the branch fast-forwardable so the trailer and commit-style gates run at
all; they SKIP and report nothing when origin/main is not an ancestor of HEAD.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…due spec said it was

The row's own claim, written before the fifth shape was reviewed. Both the fifth
and the sixth shape of that bound are now measured and withdrawn, so #1572 stays
open and the cross-reference has to say so rather than pointing a reader at a
discharge that did not happen.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…on a re-proposal, not live defects

Both were written while the sampler-based estimator was expected to land. It
does not: both shapes of it are measured and withdrawn, and `(1c)` on `main` is
unchanged. The two index rows now say so in their first sentence, so a reader
does not go looking in `test_ltx2_video.cpp` for an `InstrumentCeiling` that is
not there. What each one records is still owed by anyone who rebuilds that
estimator.

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 fix(LTX25-DEVICE-RESIDENCY): the span-slack bound reads the boundary cost the run measured, not the fifth constant (#1572, #1576, #1536) record(LTX25-DEVICE-RESIDENCY): the span-slack bound's fifth and sixth shapes, both MEASURED and both WITHDRAWN (#1727, #1728) Aug 22, 2026
mudler added 5 commits August 22, 2026 21:52
…th the withdrawal

A fresh review of the record found the file asserting both things at once. The
fifth-shape section was written while that shape was expected to land, and
nothing in it was touched when it was withdrawn, so a reader who greps #1572
landed on a table saying **closed here**.

Three contradictions, all repaired:

* the fifth-shape section's own table said #1576 and #1572 were closed and
  #1536's thesis was refuted. All three are OPEN, and the section now carries a
  block quote at its head saying the shape does not land and pointing at the
  withdrawal. It is annotated rather than deleted, because its measurements are
  what the withdrawal rests on;
* `## W0-live`'s coverage note said the 60 ms floor **is now** a per-run number
  the case prints. It is not: `test_ltx2_video.cpp` still reads
  `kSpanSlackPerRecord = 0.03` and prints a flat `2 x` it;
* the same section's "#1536's thesis is refuted rather than repaired" said in
  prose what the pull request body says the opposite of. The population that
  contradicts #1536 stands; the word "refuted" was a consequence of a shape that
  did not land.

Three smaller ones, each of which would otherwise ride into an unrepairable
squash message: `rocm_backend.hip:358` is a comment inside `UnifiedMemory()` and
the `DeviceMemoryInfo` override is at `:373`; #1668 was cited for a sentence it
does not contain, and `AGENTS.md` is cited instead; and the sixth shape's
headline 10 reds in 45 mixes a mechanism that was repaired while the population
was still running, so 5 in 45 is stated as the defensible figure with the other
five reported rather than dropped.

The next hypothesis now names its own cost: requiring a leaf to exceed the bound
in BOTH renders silences any defect present in only one of them, and whoever
builds it owes a mutation of that shape.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
The branch was behind `main`, and both `check-issue-index-append-only.py` and
the commit-style gates take their range from `merge-base(origin/main, HEAD)`.
While `origin/main` is not an ancestor, that base is the old fork point and the
gates SKIP or read a stale range rather than holding this branch to the tree it
will land on. Merging first is what makes their verdicts mean anything.

`.agents/issue-index.md` was the only conflicting surface. `main` had removed
the duplicate `#1649` row (6354755) and this branch had appended `#1727` and
`#1728`; the resolution takes `main`'s removal and keeps both appended rows,
with no row duplicated and no row edited.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…d a code anchor the index cannot repair later

A fresh review of #1712 found six places where this records-only branch still
reads as if the withdrawn fifth shape had landed, or points at a line that has
moved. Two of them are why this commit exists rather than a follow-up.

The `### Owed out of W0` bullet on (1c) was headed `8 x THIS RUN'S BOUNDARY
CEILING` while its own paragraph seven lines below says the floor is a flat
60 ms and that the per-run shape was WITHDRAWN. `main` carries
`const double kSpanSlackPerRecord = 0.03` and prints `2.0 *
kSpanSlackPerRecord` (`tests/vllm/multimodal/test_ltx2_video.cpp:3869`,
`:3974`), so the heading asserted a bound that was measured and never landed.
It is restored to the merge base's `60 ms` wording. A heading is what a skimming
reader takes away, and this one contradicted the sentence under it.

The `#1728` index row cited `src/vt/rocm/rocm_backend.hip:358`, which is a
comment; the `DeviceMemoryInfo` override the row is ABOUT is at `:373` on
`main` (`:356` is `UnifiedMemory`). `73c4248b9` already corrected the same
anchor twice in the spec and missed the index. The index is append-only, so
this cannot be repaired after the merge without a union-duplicating edit --
it has to be right now or it is wrong forever.

The remaining four are readability, not correctness of record:

- The corrected "5 in 45, not 10" headline had not reached the shape-summary
  table or the `#1572` row in `ltx25-phase-residue.md`. Both raw counts are
  kept; both now carry the defensible figure and point at the note.
- The 45-run population's arithmetic did not close: 5 + 9 = 14 against 10 red
  RUNS. The run-by-run counts are not reproduced in this file and no cell says
  whether it counts runs or assertion instances, so the split is stated as an
  UNRECORDED quantity rather than invented. Only the 10 reds and the 5-in-45
  figure are load-bearing, and neither needs the split.
- `#### Two more findings, repaired without changing any bound` read in the
  present tense about a `/dev/null` redirect and an accessor deletion that are
  not in the tree, which risks a reader believing the `[render]` corruption
  #1413 names is fixed. `p999_seconds` and `InstrumentCeiling` do not exist on
  `main`; the heading and both bullets now say so.
- Rows `#1727` and `#1728` were inserted before `#1649` with ten rows after
  them. #1619 records that appending before a trailing anchor is exactly what
  makes the union driver duplicate a row. They are moved to the true end.
  Neither row is base-reachable, so this nets to a pure addition and
  `check-issue-index-append-only.py --base origin/main` is OK.

No bound is re-proposed here. The whole point of this branch is that the bound
was measured and withdrawn.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
…ommit closed, one of them on the append-only surface

A second fresh review found that the previous repair fixed the two bullets it
was pointed at and missed two siblings of the same class: prose that reads as
if the withdrawn shape's code were in the tree.

The `#1727` index row still ended with the `/dev/null` redirect as an
accomplished repair -- "so the finding paid for a repair while itself staying
open". No redirect exists anywhere under `src/vllm/multimodal/` or
`tests/vllm/multimodal/`, on `origin/main` or here. So the branch asserted both
halves at once: the spec at `:3266` already said the repair went out with the
shape, while the index banked it against #1413, which is live and open. The row
now says the redirect is not in the tree and that #1413 is unfixed. This is
first in this commit because the index is append-only and `#1727` is not
reachable from `origin/main` -- it is free to edit now and impossible to repair
cleanly after the merge, the same reason the `:373` anchor could not wait.

The `#### The skip path was a permanent report-only state` section had the same
mixed tense, and worse: its opening sentence stated the WITHDRAWN skip
condition, `record_seconds >= 8 x ceiling`, as if it were the tree's. `main`
skips on `span_bound < kSpanSlackPerRecord` (`test_ltx2_video.cpp:3971`), the
flat 60 ms. `longest_checked` does not exist in the tree at all.

What makes this one worth care rather than a tense fix is that the paragraph's
underlying observation IS true of `main`: `span_checked` and
`span_unresolvable` are incremented at `:3972` and `:3983`, printed once at
`:3999-4001`, and asserted nowhere. A reader who discounted the paragraph as
withdrawn-shape prose would lose a live report-only state that `AGENTS.md`
`## Gates` refuses. So the observation is kept and attributed to `main`, the
assertion is put in the past and named as absent, and the section now says
plainly that the report-only state is STILL OPEN. The argument for that shape
of assertion is what survives; the assertion is not here.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
… each other's names

A round-3 fresh review passed the substance and found the name-to-anchor
mapping reversed. The sentence read "`span_checked` and `span_unresolvable` are
computed (`test_ltx2_video.cpp:3972`, `:3983`)". Both anchors are real
increment sites, but on `origin/main` `:3972` is `++span_unresolvable` and
`:3983` is `++span_checked`, so a reader pairing them in order got them
backwards.

Neither anchor was wrong and no claim was false, which is exactly what makes it
worth one line: a wrong-but-plausible anchor is the failure this row already
spent a full review round on, and a positional pairing is the shape that goes
stale silently. Each anchor now sits beside its own name, so the order carries
no meaning and cannot be misread.

Also gave the withdrawn quantity one name. It was "the `8 x ceiling` form"
eight lines above "`record >= 8 x its own window's worst boundary`", which are
the same thing said twice; the first now names the record's own window too, so
nobody has to work out that the two mentions are one quantity.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
@localai-bot
localai-bot merged commit 66d1b0a into main Aug 23, 2026
22 of 25 checks passed
@localai-bot
localai-bot deleted the row/LTX25-DEVICE-RESIDENCY branch August 23, 2026 04:01
localai-bot pushed a commit that referenced this pull request Aug 23, 2026
PR #1712 landed as `66d1b0a90` and edits the same issue table in
`.agents/specs/ltx25-phase-residue.md` that this branch edits.

THE CONFLICT WAS POSITIONAL, NOT SEMANTIC. `main` updated rows `#1572` and
`#1470`; this branch updated rows `#1569` and `#1571`. No row is edited by both
sides. They collide only because `#1571` and `#1572` are adjacent lines, so
git's hunks overlap.

RESOLVED AS A KEYED RECORD, per `AGENTS.md` `## Records`: take the complete
target-branch version and apply the scoped edit again, rather than accept an
automatic three-way merge. `origin/main`'s whole file was taken and this
branch's two rows were re-applied onto it by exact anchor, each anchor asserted
UNIQUE before the replace. No line range was hand-merged.

VERIFIED, and every check is an equality rather than a reading:

  row count       10 on `main`, 10 resolved, identical key sets
  #1572, #1470    byte-for-byte identical to `origin/main`
  #1569, #1571    byte-for-byte identical to this branch's pre-merge version
  all 8 others    byte-for-byte identical to `origin/main`
  whole file      285 lines both sides, and exactly two lines differ from
                  `origin/main` -- 234 and 236, which ARE rows #1569 and #1571
  no conflict markers survive

`.agents/issue-index.md` union-merged without a duplicate: 627 rows, no repeated
id, and this branch's `#1760` row present. `check-issue-index-append-only.py`
re-run against the moved `origin/main` returns `OK`.

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 23, 2026
…d names the gap its residue is in (#1569, #1571)

`unaccounted_seconds` shipped as one number. Four issues — #1439, #1470, #1494 and #1536 — argued about whether the floor over it was the right tolerance, and none of them split it into the gaps between consecutive leaves. Splitting it is one pass over the table the render already writes, and it settles the argument by pointing at a region instead of at a constant.

On the fixture render through the ABI: a residue of **2.100 ms over 21 gaps, of which 0.953 ms — 45% — is charged to the instrument itself**, and the largest remaining gap is **`load.dit` -> `load.video_vae` at 0.822 ms**. That is precisely the `load.dit_config` anchor #1668 still owes. The decomposition named the next un-named region out of the emitted file, with no scratch script — which is the whole of what #1571 asked for.

Those three numbers are one run of `ltx2 video: a render through the ABI emits a phase table that SUMS to wall` on this branch's binary, on a 20-core box at loadavg ~80. The row's spec records a different run of the same fixture — 2.013 ms, 0.944 ms (47%), and the same gap at 0.627 ms — on a quieter box. Neither is an accepted measurement and neither is quoted as one: what the row claims is the SHAPE, that about half of a two-millisecond residue is the instrument's own cost and that the largest region left has a name. Both runs say that, and a reader who wants the numbers runs the case, because it prints them.

## What lands

**`Record::instrument_seconds` and `PhaseLog::Instrument()`.** Every interval the instrument spends inside its own entry points is charged to the innermost live non-span record, and to the table when none is live. `Open` stamps its start after taking the process-wide mutex and `Close` stamps its end before it flushes its progress line, so both intervals used to land outside every record and could not be told from a phase nobody named. Ported behaviour-identically from `refs/pull/1556/head` = `b45ea3bbb`. Item 4 of #1668.

**`WriteJson` reads its clock before it serialises.** `Sum(records, Elapsed())` after `ByStart(Records())` charged the writer's own copy and sort to the render's wall, and therefore to `unaccounted_seconds`. This table measures the render.

**`gaps` in `phase-log.json`.** One interval before each named leaf and one after the last, each carrying the two names it lies between AND its own `start_seconds` and `end_seconds`, plus a `gap_rule` string saying what the array is.

**`RenderText` prints the instrument charge too**, so the console copy and the file copy answer the same question.

## The gap gate is arithmetic, not a measurement

`Open` marks a leaf `nested` whenever another leaf is already live, so the leaves `Sum` adds are non-overlapping. Their complement inside `[0, wall]` is therefore exactly `wall - sum_leaf_seconds`. The gaps reconcile to `unaccounted_seconds` by construction rather than by tolerance, and no box load can move that verdict. Ten of the eighteen mutations below are caught by a comparison with no clock in it.

That matters here more than it usually would. Every assertion this table has ever carried was a ratio of two wall-clock quantities, and two of them spent days being argued about across four issues.

## What the FRESH REVIEW changed, and it was not cosmetic

Four findings, each repaired here and each now held by a mutation that reds.

**F1 — `instrument_seconds <= duration_seconds` was asserted, documented as an invariant, and was NOT one.** `Open` and `Tick` read their clock BEFORE taking the process-wide mutex, so the interval they charge to a record spans a window in which another thread, holding that mutex, charges the SAME record. Both charges are individually correct, they OVERLAP, and the sum of overlapping intervals is not bounded by the interval containing them. The reviewer drove the ratio to **1.914** with 24 threads inside one live leaf, red in 3 runs of 5. `ChargeLocked` now clamps each charge to the end of the last one that reached the same target and seeds that mark with the record's own `start`, so every charged interval lies inside `[start, end]` and no two overlap. The sum is at most the duration **by construction**. The reviewer's own probe shape is now a case; removing the clamp measures **21.97**.

**F2 — the #1569 bound's one-number budget missed a PARTIAL regression.** The case bounded the writer's clock lag against `copy + sort` together, arguing that a mutated head contains one of each. That holds only when BOTH move. The reviewer hoisted `Records()` above the clock read and left `ByStart` below it — the exact edit somebody makes while moving one line — and the bound stayed GREEN at 0.0588, because the copy is about 6% of copy-plus-sort. The budget is now `min(copy, sort)`, measured as two separate steps in the same run, and that same partial regression reds at **1.024**. The constant did not move; the quantity under it got smaller, which is the only direction a repair may take a bound. The table also grew to 8000 records and its leaf name past `std::string`'s inline buffer, so the two steps sit within one order of magnitude of each other rather than being decided by an implementation detail.

**F3 — the gaps' `start_seconds` and `end_seconds` were emitted and asserted NOWHERE.** Zeroing both left the whole file green. They are the half a reader uses to LOCATE a region, and locating one was the entire content of #1571. They are now read: each gap's endpoints must agree with its own `seconds`, the first gap must start at the origin, the last must end at `wall`, and each must start no earlier than the previous one ended. The reviewer also did the algebra on the identity and was right — the gap sum telescopes to `wall - sum(durations)` for ANY record sequence, ordered or not — so the comment claiming the identity caught a mis-ordering is corrected, and the ORDER is now held by the tiling assertions instead. A reversed `ByStart` reds them at -16.996 ms.

**F4 — the console copy and the file copy had diverged.** `phase-log.json` carried `instrument_seconds` and `RenderText` did not, so a reader watching a terminal saw a residue with no way to subtract the cost of naming the phases from it. The line is added, and it is gated against `Instrument()` to 5e-4 — which is that line's own `%10.3f` resolution by the definition of the conversion, not a tolerance. Deleting the line reds.

## What a SECOND fresh review found, including one BLOCKING defect in the repair above

**B1, BLOCKING — the F4 gate was VACUOUS.** It compared `RenderText`'s printed instrument charge with `Instrument()` inside the conservation case, whose three-scope timeline charges the table 2.80e-4 to 2.95e-4 s — **smaller than the 5e-4 tolerance the `%10.3f` format defines**. So `0.000` is what the honest value prints, and the comparison was satisfied by anything in `(-5e-4, +5e-4)`, the literal `0.0` included: the reviewer replaced `Instrument()` with `0.0` in the production line and the whole file stayed green at `5 | 5 passed` and `93 | 93 passed`. That is #1569's own failure reproduced inside #1569's own repair. The gate now has its own case with 4000 sequential scopes, where the table's share measures **0.40 to 0.44 s — about 800x the format's last digit** — and a `REQUIRE` refuses to assert below that resolution, exactly as #1569's own `serialize > 1e-5` does.

**The TABLE arm of the clamp was ungated.** `ChargeLocked` has two targets; removing `instrument_gap`'s high-water mark left the suite green, because every case charged the table from ONE thread where the intervals are already disjoint. A case now hammers `Tick` from 24 threads with NOTHING live and asserts `Instrument() <= wall` — arithmetic, not a measurement, honest ratio 0.993.

That mutation's own first run is the trap arriving from a new direction: the new case's name carried a **comma**, doctest's `-tc` splits on commas, and the run printed `test cases: 0 | 0 passed | 0 failed | 7 skipped` with `Status: SUCCESS!` at `rc=0`. Only the harness printing the case count separated it from a mutation the suite genuinely does not catch.

**Two of the four gap assertions were TAUTOLOGIES.** Inside this emitter `gaps[i].start >= gaps[i-1].end` reduces to a non-negative leaf duration, and `gaps.front().start == 0.0` is constant-true unless the first gap is dropped. The reviewer staged `cursor = r.start`, so every gap swallows the leaf before it, and both passed — only the pre-existing identity fired. They are replaced by one comparison with power: each gap's endpoints are checked against the leaf records it lies between, read out of the same table.

**`NSEED` stays GREEN and is printed rather than left out.** The per-record mark's SEED — the half that stops a charge reaching back before the record began — is held by nothing, because staging it needs a `Tick` whose clock read predates a record and whose lock acquisition follows it. It is added to #1718.

## The two bounds, over 45 runs of the whole suite under real load

Every run's `test cases:` line was recorded, because a `-tc` filter that matches nothing prints `0 cases ran` and `Status: SUCCESS!` and is indistinguishable from a green run in a log or an `&&` chain. All 45 read `test cases: 5 | 5 passed | 0 failed` and `assertions: 93 | 93 passed | 0 failed`.

| population | n | load | min | median | p90 | max | margin |
|---|---:|---|---:|---:|---:|---:|---:|
| `head / min(copy, sort)`, pre-review tree | 45 | 56-113 | 0.003744 | 0.006467 | 0.010502 | **0.018123** | **27.6x** |
| `instrument / duration`, 24 threads | 45 | 56-113 | 0.0723 | 0.9928 | 0.9962 | **0.99756** | bound 1.0 |
| `head / min(copy, sort)`, **the tree that lands** | 45 | 13-24 | 0.003355 | 0.006841 | 0.008413 | **0.010226** | **48.9x** |
| `instrument / duration`, **the tree that lands** | 45 | 13-24 | 0.9898 | 0.9958 | 0.9967 | **0.99686** | bound 1.0 |

The second pair is on the final tree, where the suite reads `test cases: 7 | 7 passed | 0 failed` and `assertions: 100 | 100 passed | 0 failed` on every one of the 45.

**0 red in 90 here, and 0 red in 355 across all six populations.** And the defective values are not near either bound:

```
#1569        honest [0.0037 .. 0.0181]   bound 0.5   main's order 17.2, partial regression 1.024
conservation honest [0.072 .. 0.99756]    bound 1.0   no clamp 21.97
```

The conservation ratio sits just under its bound BY CONSTRUCTION and a reader should not read that as a bound about to flap. That leaf is 24 threads ticking and almost nothing else, so almost all of it IS instrument — that is what the case constructs. It cannot cross 1.0 on a slow box, because the charges to one record are disjoint intervals inside it: the arithmetic holds it, not the margin.

Contrast the withdrawn bound this row refuses to re-propose. Its honest population had a median of 1.132 and a maximum of 4.115 against a bound of 2, so the bound sat INSIDE its own scatter and 4 runs in 45 crossed it. `.agents/specs/ltx25-phase-residue.md` `## Design` 3 is that evidence and it was not re-derived.

## What this does NOT do

**`instrument_seconds` appears in no denominator anywhere.** `residue <= 2 * instrument` was measured red 4 times in 45 runs at load 88 (max 4.115) and 28 times in 160 at load 125 (max 5.55) and withdrawn before this row started, because the un-instrumented remainder of a boundary dilates faster than the instrumented part when the box slows. It is emitted and reported so a reader can subtract it, and asserted against nowhere.

**Neither existing floor is touched**, in form or in constant. `leaves >= 0.95 * wall` and `covered >= min_coverage * leaf_seconds` are byte-identical.

## The mutations, re-run in full against the REPAIRED tree

Each prints its own `compile_status` and a `git diff --numstat`, because a mutation that fails to build and a mutation that never applied both read as a passing test. Each asserted its anchor matched exactly once, and each restored the tree from a pristine BYTE COPY verified by sha256 — a reverse text edit is not safe here, because `RenderText` carries the same two lines `WriteJson` does.

| id | mutation | verdict |
|---|---|---|
| M1 | `WriteJson` reads its clock AFTER the copy and sort, i.e. `main`'s own code | RED, head 8.331 ms against a budget of 0.484 ms -- 17.2x |
| N11 | the clock read moves BELOW the copy and stays ABOVE the sort -- a PARTIAL regression | RED, 1.024 |
| NCLAMP | the per-target high-water mark is removed, so overlapping charges are counted twice | RED, charged 9.491 s of a 0.432 s record -- 21.97 |
| M2 | the decomposition drops the FIRST gap -- the prologue, 92% of a real residue | RED on 4 |
| M3 | the decomposition counts NESTED records as leaves | RED on 3: a negative gap at -1.198 ms, the identity, the count |
| M7 | the tail gap reported as zero, count and names untouched | RED on 2: the endpoint agreement and the identity |
| M8 | each gap measured to the leaf's END rather than its START | RED on the identity alone |
| M4 | every instrument interval charged to the TABLE, never to a leaf | RED on 4 assertions across 2 cases |
| M5 | a SPAN absorbs the charge | RED on the span assertion |
| M6 | the per-record charge is not emitted | RED at `REQUIRE(e.contains("instrument_seconds"))` |
| NEND | every gap's `start_seconds` and `end_seconds` zeroed, `seconds` untouched | RED on 4 -- **GREEN before this repair** |
| NREVSORT | `ByStart` orders the table by DESCENDING start | RED at `CHECK(seconds >= 0.0)` on -16.996 ms |
| NTEXT | `RenderText` stops printing the instrument charge | RED at `REQUIRE(at != std::string::npos)` |
| NTEXTZERO | `RenderText` prints a hardcoded `0.0` instead of `Instrument()` | RED -- and **GREEN against the first version of that gate** |
| NTABLECLAMP | the TABLE arm's high-water mark is removed | RED -- and **GREEN before the table case existed** |
| NCURSOR | each gap starts at the PREVIOUS LEAF'S START, so every gap swallows the leaf before it | RED -- and **GREEN against the first repair for the endpoints** |
| NSEED | the per-record mark is seeded with `0.0` instead of the record's own `start` | **GREEN** -- #1718 |
| R1 | the production emitter stops writing `gaps` -- run against the RENDER case | RED at `REQUIRE(table.contains("gaps"))` |
| R2 | `ChargeLocked` charges nothing anywhere -- run against the RENDER case | RED at `REQUIRE(instrument > 0.0)` |
| N4 | `ChargeLocked`'s negative-`from` refusal becomes a clamp | **GREEN** -- #1718 |
| N6 | `Open`'s pre-lock wait is computed and charged to nothing | **GREEN** -- #1718 |
| NNOSORT | `ByStart` stable-sorts an empty range, i.e. does not sort at all | **GREEN** -- #1718 |

`R1` and `R2` are the reachability half. Both were run against `ltx2 video: a render through the ABI emits a phase table that SUMS to wall`, which enters through `vllm_video_engine_load` and `vllm_video_generate`, so what they prove is that a RENDER reaches this code and not that the class works.

**The three GREENS are reported because a mutation table that lists only its successes is an argument and not a measurement.** They are #1718. `NREVSORT` beside `NNOSORT` says exactly how much of `ByStart` is held: an inversion is caught, a removal is not, because every timeline this suite builds is already start-ordered.

`N6`'s first staging did not compile. Written as `if (false) { ... }` it left `entered` unused and failed `-Werror` with `compile_status=1`, and a mutation that fails to build reads exactly like a passing test — only the printed compile status separated the two. Re-staged as a `(void)` cast of the same expression it compiles, and it is green.

## Where the tests live

The instrument's own cases go in a new `test_render_phase_log` executable rather than into `test_ltx2_video`. Two of them need a table of thousands of records that no render produces, and the model suite costs a fixture build. The reachability block stays in `test_ltx2_video` because only that case can prove a render reaches any of this, and it is the only thing this change adds to that file.

## Issues

Closes #1569. It asked for a gate on `WriteJson`'s clock ordering that was **measured green under its own mutation** — the copy and sort of a three-record table are nanoseconds, so the defect sat far below the slack in any bound that case carried. It reds now, twice: at 17.2x for `main`'s own ordering and at 1.024 for the partial regression the first repair missed.

Closes #1571. `phase-log.json` carries `gaps` with names and endpoints, the gate over it is an accounting identity plus a tiling, and on its first run it named `load.dit -> load.video_vae` as the next region.

Closes #1755. The fresh review of the head above found `RenderText` still carrying the ordering #1569 names -- the copy and the sort ahead of the clock read -- on the pull request closing #1569, and nothing gating it: applying the one-line hoist alone left the suite green at `7 | 7` and `100 | 100`. Measured on the 8001-record unit timeline, `sum(leaf)` held at 0.189 s across five `WriteJson` calls while the console's `unaccounted` climbed 0.065 -> 0.134 -> 0.200 -> 0.265 -> 0.329 s: about 66 ms of the writer's own work charged to the render, per call. Fixing one member of a class and leaving its sibling red is not a repair, so it is fixed here with its own issue, its own gate and its own index row rather than deferred.

The fix is TWO statements, and the second is why the first is gateable at all. `RenderText`'s `Elapsed()` moves above the copy and the sort; and `WriteJson`'s `if (StderrEnabled())` block moves from the end of the function to immediately after its own clock read, above the copy, the sort AND the whole `nlohmann` build. The hoist alone cannot be gated -- `RenderText` prints every total with `%10.3f` and its own copy-and-sort over 8000 records is 0.12 ms, a QUARTER of one step of that format, so the defect cannot cross the last printed digit. Moving the emission point is what makes it visible. The two clock reads are now one `getenv` apart, so the console copy and the file copy describe the same instant.

Filed and left open, each owned by this row's spec `## Owed`:

* #1718 — the charge sites are gated only in AGGREGATE. Four of this row's own mutations are green, `NSEED` included.
* #1719 — `PhaseLog::Close`'s pre-lock wait is charged to nobody, so it inflates the closing record's uncovered time. It has to land before #1718 can.
* #1720 — `WriteJson` now takes the process-wide mutex twice, so `wall_seconds` and the record set are two snapshots. Unreachable on the shipped path, argued in the function's own comment, and the repair is a public API change.
* #1760 — **the #1755 gate holds two thirds of its own repair, and this says which third it misses.** A fresh review staged `M-SITE-MID`: keep the console block above the JSON build but slide it BELOW `ByStart(Records())` and `Sum(...)`, which reintroduces #1755's class. The composite case does NOT reliably catch it. The reason is structural and measured rather than argued: arm (A)'s 16 000-record table is sized to the JSON-build discriminator at 6.54-7.26 format steps, while copy-and-sort at that same size is 0.39-1.03 steps — so the defect STRADDLES a one-step bound instead of clearing it. Over 20 runs it is 19 GREEN and 1 RED, and it is recorded as GREEN: **a gate that fires once in twenty does not hold the defect, and is worse than a clean survivor, because the one red reads as a flake a later session will discount.** The first review of it measured `GREEN 10/10` at 4.455e-4 and 4.665e-4 — the bottom of that distribution — which is why the number in this body is the 20-run one and not the 10-run one. Enlarging arm (A)'s table is measured shut at ~1 GB RSS against the case's current 141 MB, and inventing a wider tolerance is what #1668 forbids.

**#1668 stays open.** It owns four items and this lands one. Items 1 to 3 — `load.dit_config`, `artifacts.mux`, `denoise.update` and `Ltx2ConditioningTrace::sampler_updates` — are one unit with the `Carrying` table in `test_ltx2_video.cpp`, and #1568 and #1570 both need `denoise.update` to exist before they can be closed.

**#1568 and #1570 stay open, and the obvious closure for #1568 is now MEASURED SHUT.** A ceiling on `instrument_seconds / duration_seconds` per record separates an empty scope from a working one at 5 ms and does not at `denoise.update`'s real 134 us scale: over 200 samples the honest maximum is 0.8930 and the defective minimum is 0.0804, so the populations overlap completely, while an 80-sample cut of the same probe says they are separated by 1.57x. #1570 survives on a LEAF rather than a record. The full table is in the spec.

**#1439 stays open.** A quantity a reader can see is not yet a budget a gate holds.

## The operator's own re-run, on the tree that is merged

`AGENTS.md` `## How work gets done` 4: an implementer or reviewer report is an input, never a gate result. Everything below was re-run by the merging session on the tree carrying the `origin/main` merge, with `git status` clean across `src/`, `include/` and `tests/` and `render_phase_log.cpp` matching sha256 `e490ccc3…f0834224` before and after every mutation.

**The whole set, 23 mutations.** Each printed its own `git diff --numstat`, its `compile_status`, both doctest count lines, and `restore_sha256_ok` against a pristine byte copy. 23 of 23 restored true, 23 of 23 compiled, no numstat was empty. **19 RED, 4 GREEN** — and the four green are exactly the four already filed under #1718: `NSEED`, `N4`, `N6`, `NNOSORT`. No mutation this table calls red came back green.

**`M3`'s anchor was NOT unique, and the harness refused rather than mutating the wrong function.** `if (r.span || r.nested) continue;` occurs TWICE — in `Sum` and in `GapsBetweenLeaves` — so a plain text replace would have silently hit whichever came first and reported whatever that produced. Run against each site separately, both are held: the decomposition site reds on a −1.232 ms gap and `REQUIRE(gaps.size() == leaf_names.size() + 1)` at `4 == 3`, and the `Sum` site reds on the identity at `0.00114164 < 1e-9`. An anchor is asserted UNIQUE, not merely present.

**#1569's mutation can now fail, which is the entire point.** The defect #1569 records is an instrument whose own mutation stayed GREEN 10 of 10. Both wrong orderings were therefore re-run 10 consecutive times each, under load, with the doctest case count asserted on every run:

| tree | n | verdict | ratio min | ratio max | bound |
|---|---:|---|---:|---:|---:|
| honest | 45 | GREEN 45/45 | 0.009467 | **0.027616** | 0.5 |
| `M1`, `main`'s clock order | 10 | **RED 10/10** | **2.080** | 3.418 | 0.5 |
| `N11`, the PARTIAL regression | 10 | **RED 10/10** | **0.892** | 1.145 | 0.5 |

All 65 runs printed the identical string `test cases:  1 |  1 passed | 0 failed`, which is what rules out a `-tc` filter that matched nothing and printed `SUCCESS!`.

**The two populations do not touch.** The honest maximum over 45 runs is 0.0276; the WORST defective run of the harder mutation is 0.892 — a factor of **32** apart, with the bound at 0.5 between them, 18.1x of headroom below and 1.78x above. That is the separation `## Design` 6 argues for from the definition of the quantities, measured rather than asserted.

**The honest distribution in full, never a median alone.** n=45, loadavg 19.40–26.42, min 0.009467, median 0.015184, p90 0.021052, p95 0.025348, **max 0.027616**. The margin is quoted at the MAX, because the failure this cluster exists to stop is a heavy right tail that a median never sees — the withdrawn bound's own honest population had a median of 1.132 against a bound of 2 and still crossed it 4 times in 45.

**The reachability mutation, run by the merging session rather than cited.** `AGENTS.md` `## Nothing lands dead` asks whether a production entry point reaches this, not whether the class works. The production call site is `WritePhaseLog(gen.output_dir, kLtx2VideoFamily, phase_device, &result.phase_log_path);` in `src/vllm/multimodal/ltx2_video.cpp` — anchor uniqueness count 1, checked before the edit. Deleted in a scratch copy: `compile_status=0`, `git diff --numstat` `1 1`, and `test_ltx2_video -tc='*SUMS to wall*'` goes from `1 | 1 passed` with `assertions: 528 | 528 passed` to `1 | 0 passed | 1 failed` on `the render wrote no phase table at .../phase-log.json`. Restored byte-for-byte, sha256 `4a928d7f…49dcc436`. A render reaches this; a test does not merely construct it.

`tests/scripts/test_cpu_x86_llamacpp_floor.py` refused twice under box load with `NO_QUIET_WINDOW after 30s (busy=105% builders=0 load=60.83)` and then ran `Ran 10 tests in 186.719s / OK` once load fell to 35. That is the harness's own quiet-window precondition, not a verdict on a change whose diff is one markdown file and cannot reach a CPU floor benchmark. `scripts/agent-preflight.sh` exits 0 on the merged tree.

The D3 reachability case was re-run too: `test_ltx2_video -tc='*SUMS to wall*'` reads `test cases: 1 | 1 passed | 0 failed` and `assertions: 528 | 528 passed`, with `residue: 0.00254701s over 21 gaps, instrument 0.00220699s, largest gap 0.000632119s (load.prompt_embeds -> generate.setup)`.

## One record repair found while merging

`## Tests` opened with "four cases" and listed four rows. The suite has **SEVEN** — `### 7` added the console gate its own case, `### 8` added the table arm one, and the many-threads reproduction is a third. That count is the one thing separating a real green from a `-tc` filter that matched nothing, so the section now names it, says why it is written down, and describes all seven.

## What the gate holds, stated as coverage rather than intent

`### 10` of the spec now separates the two, because they are not the same claim. The production comment says the console block "sits above the copy, the sort and the whole JSON build" — that is true of the CODE. What the GATE holds is narrower: arm (B) holds `RenderText`'s own internal ordering including a partial regression (`M-RT` and `M-RT-PARTIAL` both RED 10/10), and arm (A) holds only that the block stands above the JSON BUILD. It does not hold that the block stands above the copy and the sort. That gap is #1760, and it is written down rather than left for the next reader to rediscover.

**The mutation totals are two populations, deliberately not one.** The original 23 (`19 RED + 4 GREEN`) were measured on a tree that PRE-DATES the `### 10` repair — the call site `M-SITE-MID` mutates did not exist on it — so folding a new row into that count would break a reconciliation the spec maintains on purpose. The console table is its own 7 rows (6 RED, 1 GREEN). Together: **30 mutations, 25 RED, 5 GREEN**, and every green is named beside the issue that owns it — #1718 for four of them, #1760 for the fifth. A mutation table that lists only its successes is an argument, not a measurement.

## It composes with #1712, and that was proved at the blob level

[#1712](#1712) landed as `66d1b0a90` while this round was open, and it edits the SAME issue table in `.agents/specs/ltx25-phase-residue.md` that this row edits. `git merge-tree` reported CONFLICT, and the conflict was POSITIONAL rather than semantic: #1712 edits rows `#1572` and `#1470`, this row edits `#1569` and `#1571`, and they collide only because `#1571` and `#1572` are adjacent lines. No row is edited by both sides.

That table is a KEYED RECORD, so `AGENTS.md` `## Records` forbids resolving it with an automatic three-way merge. The resolution took `main`'s COMPLETE file and re-applied only this row's two edits by exact, verified-unique anchor. Checked afterwards row by row rather than by reading a diffstat: `#1572` and `#1470` are byte-for-byte identical to `origin/main` and still carry #1712's text; every other row is byte-for-byte identical to `origin/main`; the row count matches main's; and the whole file differs from `main` on exactly TWO lines, which are `#1569` and `#1571`. No conflict markers anywhere in the tree.

## The gate that decides this, and why it is a verdict about THESE artifacts

The full rollup ran on **`921b03d60`** and finished: **14 success, 1 skipped, 3 failure**. Every job that could belong to this row is green — `build-test-cpu`, `build-test-cpu-arm64`, `build-test-vulkan`, `build-newest-gcc`, `cuda-fat-build`, BOTH `sanitize-cpu` arms, `commit-protocol-tag`, `documentation-checkpoint`, `device-leakage`, `pr-size`, `last-gated-commit`, `cuda-arch-features`, `vulkan-spirv-freshness`. `build-newest-gcc` is the one worth naming: it is green on `main`, so a red there would have been this row's, and it is green here.

The three failures are named by FAILURE TEXT and cited to the issue that matches that text:

- **`windows-msvc-cpu` and `windows-msvc-vulkan` — [#584](#584), NOT [#1649](#1649 [PR #1701](#1701) rescoped #1649's checker, so both lanes now print `Windows portability contract OK` and die twenty-eight minutes later at `test_openai_api_server.exe exited with status -1073740791` — `0xC0000409`, `STATUS_STACK_BUFFER_OVERRUN`. A post-#1701 Windows red citing #1649 is a false attribution. **Proved to belong to no current row by experiment rather than by argument:** [PR #1712](#1712), whose source diff against its merge base is EMPTY, reproduced the identical exit code in the identical binary at the identical point.
- **`agent-record` — [#1722](#1722, repair in flight as [PR #1726](#1726). `tests/scripts/test_check_site.py` invokes `hugo` with no `shutil.which`, no `skipTest` and no `FileNotFoundError` handler, and the job never installs it: `FileNotFoundError: [Errno 2] No such file or directory: 'hugo'` / `FAILED (errors=1)`. **This one was read rather than waved through, because a records gate failing on a records-heavy branch is exactly where a real failure hides behind an inherited one.** The record checker itself PASSES inside that same failing job — the log carries `agent record OK: ENGINE=170 MODEL=377 QUANT=84 KERNEL=57 BACKEND=85 ANCHOR-ROT=37` before the hugo traceback, the rot budget MET rather than exceeded. ([#1754](#1754) is a later duplicate of #1722 and is deliberately not the citation here, because a squash body cannot be repaired once landed.)

**The verdict transfers to the head being merged, and that is a claim about BYTE IDENTITY rather than about recency.** `921b03d60` merged `origin/main` at `66d1b0a90`. This row's own compiled and tested contribution is the diff against THAT main — five files:

| file | blob at `921b03d60` | blob at `7cb94cf12` | |
|---|---|---|---|
| `include/vllm/multimodal/render_phase_log.h` | `c3a64f554958` | `c3a64f554958` | identical |
| `src/vllm/multimodal/render_phase_log.cpp` | `949a47fa6b37` | `949a47fa6b37` | identical |
| `tests/vllm/multimodal/test_ltx2_video.cpp` | `29b27cef4ef8` | `29b27cef4ef8` | identical |
| `tests/vllm/multimodal/test_render_phase_log.cpp` | `e870679f42bc` | `e870679f42bc` | identical |
| `tests/CMakeLists.txt` | `a35fd28ea4f0` | `dd4188037e77` | **DIFFERS** |

**Four of the five are byte-identical, and the fifth is stated as it is rather than as the argument would prefer.** `tests/CMakeLists.txt` differs, and every differing line is `main`'s: two test registrations it added between the two heads, `test_device_expert_slot_store` ([#1124](#1124)) and `test_logits_processor_host_addressable` ([#1752](#1752)). This row's own registration is untouched — `vllm_cpp_add_test(test_render_phase_log vllm/multimodal/test_render_phase_log.cpp)` sits at line 294 with byte-identical surrounding context on both heads. So the claim this body makes is NOT "the five files are byte-identical"; it is that this row's four authored artifacts are byte-identical and the fifth changed only by additions `main` itself already gated. A reader who wants the stronger claim does not get it here.

Each blob is compared at the gated head and at the merged head individually. **A `<gated>..HEAD` tree diff is NOT the check and would be wrong**: it crosses the integration merge commit and sweeps in everything `main` landed in between — eleven commits, here — which looks like a large delta and falsely sinks the argument. Per-file blob identity is the claim.

**Why waiting for a fresh rollup was not viable.** `main` moved eight commits during the rollup above and three more within the hour, so every integration merge invalidates the run that was about to finish. Runner starvation is the binding constraint rather than job duration — a sibling pull request in this wave sat with all fifteen jobs `QUEUED` and none dispatched for thirty minutes, which is indistinguishable from a slow verdict by waiting longer. The forge additionally reports this branch `CONFLICTING` when `git merge-tree` reports rc=0 and a clean tree, because GitHub does not apply this repository's `.gitattributes` `merge=union` driver to the append-only issue index.


FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants