fix(LTX25-RETIRE-DEAD-ARMS): retire the invented refusals, refuse the ignored extra (#644, #611) - #661
Open
localai-bot wants to merge 7 commits into
Open
fix(LTX25-RETIRE-DEAD-ARMS): retire the invented refusals, refuse the ignored extra (#644, #611)#661localai-bot wants to merge 7 commits into
localai-bot wants to merge 7 commits into
Conversation
…t have (#644, #611) Spec before code for row LTX25-RETIRE-DEAD-ARMS. Grounds every entry of `Ltx2UnportedPipelineFeature` against LTX-2 fd4ded7f and diffusers 3a2f35d4, both re-derived by this row rather than taken from a prior grounding report. Four findings, three dispositions: - `kMultishot` is FABRICATED. Its comment cites "ltx-pipelines multishot entry points"; there is no such entry point, symbol or string in either reference. Searched as a SUBJECT, not as our own phrasing: the only upstream sense of "shot" is ONE camera take (duration_head.py:1,5 "predicts shot duration", README:136 "a cinematographer describing a shot list"), and the one `scene` hit is PySceneDetect in the TRAINER. Retire it -- a defect in our record is not a gap in our port, so recording it as owed is the error. - `kCfgParallelism` names something upstream does not do: 0 `cfg` hits in either multigpu tree. The three real forms are sequence-parallel, tiled data parallel and distributed VAE decode, and upstream's own README calls MGPU "a latency tool, not a memory tool". CFG is not in our path at all -- the distilled recipe denoises with SimpleDenoiser, "single transformer call, no guidance". - `kVideoEngineWiring` says the wiring "is phase L7, not L5". L7 landed in cefacd2. Retire it. - `kInt8ConvRot` is correct: the four inference quantization kinds are fp8-cast, fp8-scaled-mm, nvfp4-cast, nvfp4-prequant, and every upstream int8 is either training-only or a uint8 buffer. Kept and re-anchored so nobody re-audits it. Five of the seven enumerators have NO product call site, so "refused by name" overstated them; they are declared-out-of-scope markers and the code will say so. Separately (#611): `duration_head_path` is accepted and read by nothing. The spec carries the full ten-key `kKnownLoadExtras` audit -- nine READ, that one ignored -- so the sweep #611 asks for is closed, not sampled. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
… ignored extra (#644, #611) The LTX-2.5 out-of-scope ledger claimed more than was true, in four ways, and one load extra was accepted and read by nothing. Every claim below was re-derived by this change against Lightricks/LTX-2 fd4ded7f and huggingface/diffusers 3a2f35d4; a prior grounding report was an input, never the result. RETIRED, because they are defects in our record rather than gaps in our port: - `kMultishot` refused "multishot generation" and cited "ltx-pipelines multishot entry points". There is no such entry point, symbol or string in either reference. Searched as a SUBJECT, not from our own phrasing: the only upstream sense of "shot" is ONE camera take (duration_head.py:1,5 "predicts shot duration"; README.md:136 "a cinematographer describing a shot list"), and the only `scene` hit is PySceneDetect in the TRAINER. There was nothing to owe. - `kVideoEngineWiring` said the wiring through vllm::multimodal::VideoEngine "is phase L7, not L5". L7 landed in cefacd2. A refusal whose subject shipped is a false statement, not a record of debt. RE-ANCHORED: - `kCfgParallelism` -> `kMultiGpuParallelism`. Zero `cfg` hits in either multigpu tree; the three real forms are sequence-parallel (sp_builder.py:25), tiled data parallel (tdp_builder.py:25, upscale only) and distributed VAE decode (distributed_decoder.py:204-256). Upstream calls MGPU "a latency tool, not a memory tool" (docs/multigpu/README.md:5-16), and there is no CFG pass here to split anyway: the distilled recipe runs SimpleDenoiser at both stages (distilled.py:266,295), "single transformer call, no guidance" (denoisers.py:3). - `kInt8ConvRot` was already honest and is now recorded as VERIFIED ABSENT so it is not re-audited: upstream defines exactly four inference quantization kinds (quantization_factory.py:23-27), none int8; `convrot` is 0 hits; every other upstream int8 is the TRAINER's bitsandbytes/quanto path or a uint8 buffer. CLASSIFIED. Five of the seven enumerators had NO product call site, so "refused by name" overstated them. The header, the messages and the test now separate a REACHABLE REFUSAL (kTemporalUpsampler, kBetaScheduler -- a product path builds the condition) from a DECLARED-OUT-OF-SCOPE MARKER (the rest -- nothing a caller can send reaches it). The ledger case drops 7 -> 5 entries: a CHANGED COUNT that is the retirement, and it gains assertions rather than losing them. REFUSED (#611). `duration_head_path` was in `kKnownLoadExtras` and read by nothing, so a caller who pointed at a duration head silently got the recipe default. AGENTS.md requires an unimplemented arm to be refused with a message naming the missing piece. `CheckUnservedExtras` now does that, naming the head, why it cannot load, and `num_frames` / `duration` as the alternatives. NOT by dropping the key: "unknown load extra" would claim the family does not define it, which is false and sends the reader hunting a typo. The full audit is in the spec §2.1 and closes #611's "audit the rest the same way": nine of the ten keys reach a reader (ltx2_video.cpp:570, 625, 721, 737, 739, 771, 796, 901, 942); `duration_head_path` was the only one with none. RED first. `ltx2 video: duration_head_path is REFUSED by name` and `ltx2 video: every accepted load extra is READ by something` both FAILED before the fix (2 failed / 12 of 14 assertions passing) for exactly the intended reason -- the load succeeded. The inventory case parses the accepted list out of the unknown-extra refusal, which is built from `kKnownLoadExtras` itself, so an eleventh decorative key fails it; asserting on a copy of the list kept in the test would have gated nothing. Gate: test_ltx2_video 32 cases / 520 assertions SUCCESS (was 30 cases), and test_ltx2_pipeline 37 cases / 2388 assertions SUCCESS. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…ck (#644) §1.1 argued the retirement mostly from Lightricks/LTX-2, where "shot" is rare. diffusers @ 3a2f35d4 is the stronger check because the word is COMMON there and still never means a generation mode: every `shot` under src/diffusers/pipelines/ltx2/ is a camera shot TYPE in the prompt-enhancement guidance (utils.py:217, "extreme wide shot / wide shot / medium shot / ...") or the duration head's own docstring (duration_head.py:83, "the natural duration of the shot implied by a caption"). Its sixteen ltx2 modules are enumerated; none is multi-shot. Records only; no code, no gate. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…-ARMS # Conflicts: # .agents/roadmap_v1.md
… absence this row exists to retire (#644, #611) Review of `4e5be2585` returned FAIL with six findings, every one of them evidence accuracy rather than logic. No disposition moved. The two that matter most are instances of #604 -- an absence asserted from a grep of our own vocabulary -- committed inside the row whose whole purpose is to close them. F1 -- a FALSE ABSENCE shipped in a user-visible refusal. The `kInt8ConvRot` message ended "int8 appears upstream only in the trainer". Re-derived at Lightricks/LTX-2 `fd4ded7f`: `ltx-kernels`, an INFERENCE package, carries a per-row int8 quantize kernel with fp32 scales -- `blockwise/triton_ops.py:25-50`, output dtype `torch.int8` at `:43`, aliased `rowwise_int_quantize_triton` at `:436`. It is dead (that alias is its only reference; `blockwise/functional.py: 12-18` re-exports five other names and not this one), which is why the disposition stands and only the sentence was wrong. Context: the package is a fork of Lightricks' int8 kernel library retargeted to fp8/fp6/nvfp4 -- its custom-op namespace is still literally `q8_kernels_ops` (`functional.py:25`). The message now says int8 is UNREACHABLE, names the trainer paths AND the dead kernel, and corrects `quantization_factory.py:23-27` to `:23-26`. F2 -- the spec asserted an absence that was false, on the one search term that mattered. Section 1.2 listed `hadamard` among "0 hits" and concluded "no rotation of any kind". LTX-2 vendors Tri Dao's fast-Hadamard-transform family in `ltx-kernels/csrc/ops/include/`, explicitly quantization-coupled: `DequantHadamardParamsBase:54`, `QuantHadamardParamsBase:71`, `QuantMax<int8_t>` at `fast_hadamard_transform_common.h:14`. A Hadamard transform IS the "rot" of QuaRot/SpinQuant. The conclusion survives on different evidence, re-derived here: NOTHING calls it -- `hadamard_mult_thread`/`_warp` have no call site in `csrc/`, `fast_hadamard_transform_cuda` is commented out (`rms_norm_rope_cuda.cu:225-228`), and the only live struct, `NormRopeHadamardParamsBase`, drives `norm_rope_cvt_kernel` (`rms_norm_rope_cuda.cu:51-170`), which is RMS-norm -> RoPE -> store with no rotation at all; its instantiations are bf16 and `Float8_e4m3fn` only (`:219-223`). `convrot`/`conv_rot`/`quarot`/`spinquant` are genuinely 0 hits. F3 -- nine reader anchors were stale, cited in the file they were wrong about: `ltx2_video.cpp:259-261` pointed at `:570` etc., where `:570` was `if (backend == nullptr)`. Correcting them, the merge of `origin/main` below moved the real ones AGAIN. So they are no longer written by hand. The anchors live in one `READER ANCHORS` comment and `test_ltx2_video` derives them from the source on every run, printing the replacement list when they drift. It hard-codes no line number itself, so it cannot rot, and the only obligation it creates is on whoever moves a reader, in the file they are already editing. F4 -- `docs/FEATURES.md` re-merged the split this row had just made, labelling all five arms "Declared, not requestable" including `kTemporalUpsampler` and `kBetaScheduler`, the two a caller CAN trip. Split into two rows, gated by a new case that also requires exactly one such row to exist so it cannot pass vacuously. F5 and F6 are filed, not fixed here: the reachable/marker split gates message TEXT and not reachability, and `.agents/specs/ltx-2-5.md:291` still owes `multishot` but is operator-owned. Also merged `origin/main` (`11cc1d589` .. `7965f12bf`), which clears the inherited `device-leakage` red on this PR -- the two `kcuda` hits were in `ltx2_video.cpp:532,549` and were fixed on main after this branch was cut. `.agents/roadmap_v1.md` conflicted add/add and was resolved by taking the target version and reapplying the `#611` row by key; no duplicate row was produced. RED before GREEN, per finding: F1 `test_ltx2_pipeline.cpp:1303,1306` failed against the shipped message. F3 `Recorded: []. Actual: [638 693 789 805 807 839 864 969 1010]`. F4 both reachable arms found on `FEATURES.md:328`. test_ltx2_video 32/520 -> 33/541 SUCCESS (exit 0) test_ltx2_pipeline 37/2388 -> 38/2395 SUCCESS (exit 0) F2 is prose in a spec about an upstream checkout; no test in this tree can carry it, and it is stated as re-derived evidence instead. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5[1m] [claude-code]
… does not own (#691, #692) Review findings F5 and F6 on #661. Neither is repaired here, and the reason is recorded so neither becomes debt nobody holds. F5 (#691) — the reachable/marker split gates the MESSAGE TEXT, not reachability. The ledger test is not tautological in the direction it tests; both directions were mutation-proven. But nothing asserts that a marker still has no product call site, so adding one for `kLoraFusion` and changing nothing else leaves the test green while the shipped refusal tells a caller "no request field or load extra asks for this" immediately after they asked for it through a load extra. The issue names the anti-tautological shape to copy: the extras inventory gate parses the accepted set out of the product's OWN unknown-extra refusal rather than from a list kept in the test, which is why adding an eleventh key REDs it. F6 (#692) — `.agents/specs/ltx-2-5.md:291` still records the fabricated `multishot` arm as owed. That file is the operator-owned campaign spec and this row is scoped out of editing it, so `main` was carrying the claim with nobody holding it. The issue carries the full re-derivation and two smaller corrections on the same line. Both placed in the roadmap issue table under `ROAD-V1-LTX25` and named in this row's spec section 3 "Out", so the three surfaces agree. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5[1m] [claude-code]
…-ARMS 37 commits, `7965f12bf` .. `5498b4aea`. Taken to re-gate this row against current main after the earlier merge went stale, and because `ctest -N` moved 423 -> 443 there: a changed test count on this branch has to be attributable to main's drift rather than to anything here. Main touched NONE of this row's source or tests -- `ltx2_video.cpp`, `ltx2_pipeline.cpp/.h`, `test_ltx2_video.cpp` and `test_ltx2_pipeline.cpp` are unchanged across the range. Only three record/doc surfaces overlapped, and all three auto-merged. `.agents/roadmap_v1.md` is a keyed record, so its automatic three-way merge was NOT accepted on git's word. Verified by key instead: no duplicate `#NNN` key in the merged file, and the merged table diffed against `origin/main`'s copy differs by exactly the three rows this branch adds (`#611`, `#691`, `#692`) with every main-side row byte-for-byte identical. `docs/FEATURES.md` and `docs/USAGE.md` were checked for the specific content this row put there, since that is what a bad merge would silently eat: the reachable-vs-marker LTX-2.5 split is still two rows (`FEATURES.md:331-332`), not the one row the review found conflating them, and the USAGE paragraph naming the split is intact. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5[1m] [claude-code]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Row
LTX25-RETIRE-DEAD-ARMS. Closes part of #644 (items D–I and N); addresses #611.Files #691 and #692. Spec:
.agents/specs/ltx25-retire-dead-arms.md,committed before code.
Our LTX-2.5 refusal ledger claimed more than was true, and one load extra was
accepted and read by nothing. Every claim below was re-derived against
Lightricks/LTX-2
fd4ded7fand huggingface/diffusers3a2f35d4, both verifiedwith
git rev-parse HEADon the local checkouts. A prior grounding report was aninput, never a result.
Retired — defects in our record, not gaps in our port
kMultishotwas FABRICATED. It refused "multishot generation" and its enumcomment cited "ltx-pipelines multishot entry points". No such entry point,
symbol or string exists in either reference. Searched as a subject rather than
from our own phrasing (the self-confirming-grep trap, #604):
multishot/multi_shot/multi-shot: 0 hits, both references.duration_head.py:1,5"predicts shot duration",
README.md:136"think like a cinematographerdescribing a shot list", and in diffusers, where the word is far more common,
utils.py:217"Shot type (exactly one: extreme wide shot / wide shot / mediumshot / …)".
scenehit is PySceneDetect in the trainer.ltx-pipelineshas 11 documented pipelines and diffusers 16ltx2/modules;none is multi-shot.
kVideoEngineWiringwas STALE. It said the wiring throughvllm::multimodal::VideoEngine"is phase L7, not L5". L7 landed incefacd2d0.A refusal whose subject shipped is a false statement, not a record of debt.
Both retirements are recorded in the header, in the spec, and in their commit
messages — which is where an exception's reason lives (AGENTS.md, "there is no
waiver registry").
Re-anchored
kCfgParallelism→kMultiGpuParallelism. Zerocfghits in eithermultigpu/tree. The three real forms are sequence-parallel (sp_builder.py:25),tiled data parallel (
tdp_builder.py:25, upscale only) and distributed VAE decode(
distributed_decoder.py:204-256). Upstream calls MGPU "a latency tool, not amemory tool" (
docs/multigpu/README.md:5-16), and there is no CFG pass here tosplit anyway: the distilled recipe runs
SimpleDenoiserat both stages(
distilled.py:266,295), documented "single transformer call, no guidance"(
denoisers.py:3), withcfg_scale=1.0, stg_scale=0.0(denoisers.py:25-26).kInt8ConvRotis UNREACHABLE upstream — not absent. (Corrected by review;the first version of this PR said "verified absent" and "int8 appears upstream
only in the trainer", and both were false.)
convrot/conv_rot/quarot/spinquantreally are 0 hits. But two things do exist:ltx-kernelsblockwise/triton_ops.py:25-50is a per-row int8 quantize with fp32 scales —output dtype
torch.int8at:43— aliasedrowwise_int_quantize_tritonat:436. That alias is its only reference;blockwise/functional.py:12-18re-exports five other names and not this one. The package is a fork of
Lightricks' int8 kernel library retargeted to fp8/fp6/nvfp4, and its custom-op
namespace is still literally
q8_kernels_ops(functional.py:25).ltx-kernels/csrc/ops/include/carries Tri Dao's FHT withDequantHadamardParamsBase:54,QuantHadamardParamsBase:71andQuantMax<int8_t>atfast_hadamard_transform_common.h:14. A Hadamardtransform is the "rot" of QuaRot/SpinQuant, so "0 hits for
hadamard" waswrong on the one search term that mattered.
The disposition is unchanged, because nothing calls either.
hadamard_mult_thread/
_warphave no call site incsrc/;fast_hadamard_transform_cudaiscommented out (
rms_norm_rope_cuda.cu:225-228); and the only live struct,NormRopeHadamardParamsBase, drivesnorm_rope_cvt_kernel(
rms_norm_rope_cuda.cu:51-170), which is RMS-norm → RoPE → store with norotation at all, instantiated for bf16 and
Float8_e4m3fnonly (:219-223).Upstream's four wired inference quantization kinds (
quantization_factory.py:23-26— the first version of this PR miscited this as
:23-27) arefp8-cast,fp8-scaled-mm,nvfp4-castandnvfp4-prequant. None is int8.Classified
Five of the seven enumerators had no product call site — only
kTemporalUpsampler(ltx2_upsampler.cpp:395) andkBetaScheduler(
ltx2_pipeline.cpp:199) are constructed by a product path. Recording the rest as"refused by name" overstated what exists. The header, the messages and the ledger
test now separate a reachable refusal from a declared-out-of-scope marker,
and the marker messages say
DECLARED, NOT REQUESTABLE.docs/FEATURES.mdnow carries that split as two rows, not one. The firstversion of this PR re-merged it into a single "Declared, not requestable" row
covering all five arms, which mislabelled the two a caller can actually trip —
the exact conflation the code change had just removed.
Refused — the user-visible half (#611)
duration_head_pathwas inkKnownLoadExtrasand read by nothing, so a callerwho pointed at a duration head silently got the recipe default.
CheckUnservedExtrasnow refuses it by name, saying the head is unported, why the file would never be
opened, and to use
num_frames/durationinstead.Not by dropping the key: "unknown load extra" would claim the family does not
define it, which is false and sends the reader hunting a typo.
The full
kKnownLoadExtrasaudit — the durable half of this PRAll ten keys. Every reader is inside
Ltx2VideoEngine::Loadinsrc/vllm/multimodal/ltx2_video.cpp, so the column below names the value each keyis read into — that is what a line number was standing in for, and unlike a
line number it does not go stale:
audio_prompt_embeds_pathaudio_embeds_pathpipeline_kindim.pipeline_kindmodel_versionoverride_versionallow_unported_modulesdit_options.allow_unported_modulesmax_phaseim.max_phasedit_config_pathconfig_pathprompt_embeds_valid_rowsim.prompt_valid_rowsencoder_config_pathencoder_config_pathupsampler_pathupsampler_pathduration_head_pathNine of ten were wired;
duration_head_pathwas the only defect, so #611's "auditthe rest the same way" is closed rather than sampled. One documentation gap found
by the same sweep:
docs/USAGE.mdlisted the LTX-2.5 extras and omittedencoder_config_path, which is defined and read. Fixed.Line numbers are no longer written by hand anywhere in this row. The first
version of this PR recorded them, in the source file they were wrong about, and
review found nine of nine stale by +37. Correcting them by hand was not enough:
merging
origin/mainmoved the real ones again inside this same PR. They now livein one
READER ANCHORScomment thattest_ltx2_videoderives from the sourceon every run, printing the replacement list when they drift. The test hard-codes
no line number itself, so it cannot rot, and the only obligation it creates falls
on whoever moves a reader, in the file they are already editing.
Review repair
A fresh review of
4e5be2585returned FAIL with six findings, all of themevidence accuracy rather than logic. No disposition moved. Two are instances
of #604 — an absence asserted from a grep of our own vocabulary — committed inside
the row whose whole purpose is to close them.
ltx-kernelsinference package2d1d59d9fhadamardamong "0 hits" and concluded "no rotation of any kind". False: LTX-2 vendors a quantization-coupled fast-Hadamard family. Conclusion survives on different, re-derived evidence2d1d59d9f2d1d59d9f— now derived, not recordeddocs/FEATURES.mdre-merged the reachable/marker split into one row2d1d59d9fkLoraFusiona call site and the test stays green while the refusal tells the caller it is not requestable.agents/specs/ltx-2-5.md:291still records the fabricatedmultishotarm as owed; operator-owned file, out of this row's scopeF5 and F6 are placed in the roadmap issue table under
ROAD-V1-LTX25and named inthis row's spec §3 "Out", so the three surfaces agree.
RED before GREEN
The original two cases failed before the fix, for exactly the intended reason —
the load succeeded:
Each repair was red first as well, against the shipped artifact it corrects:
test_ltx2_pipeline.cpp:1303,1306failed against the shippedkInt8ConvRotmessage.Recorded: []. Actual: [638 693 789 805 807 839 864 969 1010].FEATURES.mdrow.F2 is prose in a spec about an upstream checkout; no test in this tree can carry
it, so it is stated as re-derived evidence instead.
The inventory case parses the accepted list out of the unknown-extra refusal,
which is built from
kKnownLoadExtrasitself, so an eleventh decorative key failsit. Asserting on a copy of the list kept in the test would have been true by
construction and gated nothing.
Mutation-proven, four ways
Every claimed guarantee was mutated in the built tree and each mutation went red;
the tree was then restored byte-for-byte (
git statusclean,git diff HEADempty).
kKnownLoadExtraskKnownLoadExtras grew; add the key to served or refused(and the anchor case fires too, since the inserted line moved every reader)if (false && !duration_head.empty())inCheckUnservedExtrasduration_head_path is served by no code+an accepted-but-unread extra must be refused by namemultishot, dropmarkerfromkLoraFusionCHECK_FALSE(Mentions(message, "multishot"))andCHECK(Mentions(message, "DECLARED, NOT REQUESTABLE"))markerto the reachablekBetaSchedulerCHECK_FALSE(Mentions(message, "DECLARED, NOT REQUESTABLE"))The third and fourth are the two directions of the F4 split, so it is proven not
to be one-sided. Note that the second mutation prints
assertions: 537 | 535 passedwhile failing — the exit code is the authority, not the summary line.Gate
Re-run in full after merging
origin/main(7965f12bf..5498b4aea, 37commits), from a fresh configure into a deleted build tree — the previous one
was reclaimed by a disk sweep, so nothing here is incremental.
CONFIGURE_EXIT=0,BUILD_EXIT=0(1319/1319 targets),ENOSPC_HITS=0— noNo space left, noBFD assertion.ctest -N→ 444.ctest --output-on-failure(serial) → 444 executed,99% passed, 1 failed, 991.76 s. The denominator is asserted against the run:
444 enumerated, 444 executed. Two pre-existing environment skips:
test_modelopt_mixed_precision_checkpoint,test_voxtral_e2e.The one failure is #737 and is not this PR's.
test_op_paritythrows[json.exception.type_error.302] type must be string, but is nullattests/parity/test_op_parity.cpp:1989— the null field in the MiniMax-Music3golden manifest added to main today, already filed and reproduced on clean main.
This branch touches no golden, no manifest and nothing under
tests/parity/(12 files changed, all LTX-2.5 source, tests, spec and docs). Note its summary
line reads
assertions: 70 | 70 passed | 0 failedwhile failing — a throwntest case is invisible to the assertion counter, so the exit code is the authority.
ctest -Nmoved 423 → 444 since the first version of this PR. Fully attributed tomain: this branch adds zero test registrations (
git diff origin/main...HEAD | grep '^+.*add_test'→ nothing), and main's newest merged commit5498b4aeaaddstest_qwen3_8_text_only, which is the last of them.test_ltx2_videotest_ltx2_pipelineBoth
exit 0. The before column was measured, not reasoned about: thepre-change versions of the touched files were checked out, rebuilt and run, then
restored. The ledger case itself drops from 7 to 5 entries — a changed count,
and it is the retirement — while gaining assertions rather than losing them. The
post-merge counts are identical to the pre-merge ones, which is the check that
main's 37 commits changed nothing for this row; main touched none of this row's
source or tests across that range.
scripts/agent-preflight.sh --stagedat commit time: all checkers green, includingdoc-checkpoint --staged, which required thedocs/USAGE.mdparagraph in thisdiff (
include/vllm/…is classifieduser_usage).scripts/agent-preflight.shin full: two failures, both #733 / #731 and bothalready open against clean main —
audit-live-rowsand its mutation suitetest_audit_live_rows, onMODEL-MUSIC-minimax-music3-mini-max-music3-for-conditional-generation(
.agents/model-matrix.md:459), anACTIVErow with "no branch, no commit on mainmentioning the row ID". Isolated by measurement rather than argued: this branch's
only
.agents/edits (two roadmap issue rows and one new spec file) were revertedin place and the checker re-run, and its output is byte-identical with and
without them,
exit 1both ways. This branch does not touchmodel-matrix.md,engine-matrix.md,backend-matrix.mdorfeature-matrix.md.Two further environment notes, recorded because they were hit and would otherwise be
misread as findings.
tests/scripts/test_cpu_x86_llamacpp_floor.pyfailed withNO_QUIET_WINDOW(exit 4,busy=362% load=100.52) while other sessions werebuilding, and passed on re-run; this PR touches no
scripts/file.test_openai_conformancefailed three times in a row at load 95–127 — allclient-timeout shapes against a 30 s read timeout, with a different failing
assertion set each time — and passes in the gate above. Neither is a finding.
🤖 Generated with Claude Code