Skip to content

records: land the data from 5 of the 15 open PRs, correct 4 stale claims, leave #471 open - #518

Merged
lilith merged 6 commits into
mainfrom
docs/records-triage
Aug 13, 2026
Merged

records: land the data from 5 of the 15 open PRs, correct 4 stale claims, leave #471 open#518
lilith merged 6 commits into
mainfrom
docs/records-triage

Conversation

@lilith

@lilith lilith commented Aug 13, 2026

Copy link
Copy Markdown
Member

Triage of the 15 PRs open from 2026-08-06 to 2026-08-10, run the way #514's round was: nothing
merged as written
, nothing closed whose data exists nowhere else, stale claims corrected in place
with a date rather than deleted. Full index: benchmarks/pr_triage_2026-08-13.meta.

Records only. No decoder code, no crates/ behaviour change, no feature flags. Every closed
PR's code stays on its branch at the head SHA recorded in the index. Nothing was re-measured —
another agent holds the box for timed work in a sibling repo — so every figure here is cited from a
committed record, from a CI log, or counted from the tree.

First: I was told three supersession claims that do not survive checking

The task brief asserted these from titles and campaign memory. Stated plainly rather than softened:

  1. "perf(tracker): bounded spin then yield — the shipping build spun without bound #471 is one of the four waiting-policy arms perf(#455): c256x2048 t=8 — a finer shard block and four lock-waiting policies, both refuted, with the residual named #504 measured as NULL" — WRONG. perf(#455): c256x2048 t=8 — a finer shard block and four lock-waiting policies, both refuted, with the residual named #504 ran its
    four arms on c256x2048 at t=8, and its own not-measured list
    (benchmarks/c256_contention_2026-08-11.meta:128) ends with t=16. perf(tracker): bounded spin then yield — the shipping build spun without bound #471 ran at n=16 on an
    idle box across t=1..16 and read null at t=1/2/4/8 — agreeing with perf(#455): c256x2048 t=8 — a finer shard block and four lock-waiting policies, both refuted, with the residual named #504 — and 0.955 (8bpc)
    / 0.960 (10bpc) at t=16
    , with p90 and max moving by the same factor. t=16 is the only cell on
    this host where threads (16) exceed cores (12 logical). Not a duplicate. Left open.

  2. "perf(tracker): shard picture planes by COLUMN — a w x h block is ONE borrow at every thread count (0.785x at 8bpc t=8, scaling 4.74x -> 6.13x) #469's column-sharding is the shape The &mut [u8] recon-kernel refactor, WRITTEN — sound, lands on #481's unsound ceiling at all 8 cells, and +1.6 MB instead of +96 MB #482's column-compact ReconBand landed" — IMPRECISE in a
    way that matters.
    perf(tracker): shard picture planes by COLUMN — a w x h block is ONE borrow at every thread count (0.785x at 8bpc t=8, scaling 4.74x -> 6.13x) #469's mechanism is a tracker change: RowMap, per-record c0/c1 column
    bands, cols_meet, COL_ANY, StridedRows. None of those symbols exist anywhere on main.
    The &mut [u8] recon-kernel refactor, WRITTEN — sound, lands on #481's unsound ceiling at all 8 cells, and +1.6 MB instead of +96 MB #482's src/owned_recon.rs is an owned buffer proved by borrowck with no record at all, one
    band per WORKER not per tile, removing recon's registrations rather than making them
    column-aware. The thing that actually generalises "one record for a rectangle" is perf(tracker): exact strided-rectangle borrow records — measured, default-off, and the cost model they correct #505/The code-placement lottery is removable (16-byte alignment, 1.37% -> 0.18% spread); the CDEF rectangle pays -2.0..-2.5% at t=8; both rectangles flipped ON #513,
    and it covers the filter chain — a different population. perf(tracker): shard picture planes by COLUMN — a w x h block is ONE borrow at every thread count (0.785x at 8bpc t=8, scaling 4.74x -> 6.13x) #469's goal was reached by two later
    changes, neither of which is its mechanism.

  3. "fix(soundness): the rectangle guard hands out ROWS, not the hull — same one registration, no overlapping &mut #472 is what perf(tracker): exact strided-rectangle borrow records — measured, default-off, and the cost model they correct #505 implements and The code-placement lottery is removable (16-byte alignment, 1.37% -> 0.18% spread); the CDEF rectangle pays -2.0..-2.5% at t=8; both rectangles flipped ON #513 shipped by default" — CORRECT. Verified:
    DisjointMutRectGuard::row_mut(&mut self) at crates/rav1d-disjoint-mut/src/lib.rs:1615, and
    Cargo.toml declares __lf_rect / __rows_rect as retained no-ops because "the rectangle is
    now the DEFAULT path (2026-08-11)". fix(soundness): the rectangle guard hands out ROWS, not the hull — same one registration, no overlapping &mut #472's other half — the macos-15-intel
    compact_read_per_row overlap it analysed and could not fix without an x86 box — was
    independently found, root-caused and fixed as the x86_64 t=8: deblock compact_read_per_row races a concurrent write (identical extents) — 4/768 vectors abort, aarch64 clean #494 t=8 race (X64_APPLICABILITY.md §G).
    fix(soundness): the rectangle guard hands out ROWS, not the hull — same one registration, no overlapping &mut #472 was right that the defect was on main and not an artefact of its own change.

What this lands

from files why it could not just be closed
#487 docs/SIZE_SWEEP{,_T8}.md + 9 data + 11 scripts/perf/* main cites SIZE_SWEEP.md on 26 lines across 8 files and does not contain it
#488 6 benchmarks/ + scripts/perf/paired_ab.py AGENT_BRIEF.md §6 cites lf_vbatch_iso_2026-08-10_v1.tsv by name
#471 4 benchmarks/park_not_spin_* a t=16 result #504 never measured, and a 6x correction to a figure on main
#450 tile_threading_guard_2026-08-06.meta + 3 .tsv.zst three metas on main cite it by name, two for its vector recipe

SIZE_SWEEP.md is byte-identical between pull/487/head and measure/size-sweep-intercept
(30a7294) — sha1 eaff7b70… — so this closes #514's deliberately-left-open pointer rather than
forking it. Excluded as code: examples/avif_to_ivf.rs, and a stray __pycache__/*.pyc that
30a7294 had already dropped.

Four stale claims corrected in place, none deleted

  • crates/rav1d-disjoint-mut/src/tracker_shard.rs:582 + docs/C256_CONTENTION.md §5 — both say
    the earlier TinyLock nulls were taken "where contention is ~0.02% of registrations". That is the
    wrong counter
    : it is wide_probe::N_SLOW, a count of BorrowTracker::add_slow (the
    poisoned / wide-record / multi-block path), divided by the registration population and quoted as a
    contention rate. Traceable to an add_slow count at verify_compose2_2026-08-08.meta:278.
    Directly counted on the same vector: 0.061% of acquisitions / 0.122% of registrations — six
    times, against a different denominator. perf(#455): c256x2048 t=8 — a finer shard block and four lock-waiting policies, both refuted, with the residual named #504's 0.264% for c256x2048 t=8 is a different cell,
    counted directly, and is explicitly not disturbed; nor is §5's "at most 10.7% is waiting".
  • docs/AGENT_BRIEF.md §6 — the waiting-policy row re-titled "CLOSED AT t <= 8" with its
    scope stated, plus a new row for oversubscription carrying perf(tracker): bounded spin then yield — the shipping build spun without bound #471's numbers and what would settle it.
  • docs/CONTENT_CLASS.md — its "SIZE_SWEEP.md is NOT on main" header is now false. Its
    recalled count ("eleven references") was also wrong: counted on the pre-change file, 13
    occurrences on 12 lines, 10 of them in the body
    . Third recall-not-count slip the campaign has
    had to fix.
  • benchmarks/tile_threading_guard_2026-08-06.meta §Result 3 — "a REJECTED attempt, recorded so
    it is not retried". It was retried five days later and it paid, because the retry obeyed the
    constraint that section ends on (leave the dense scan byte-identical). Annotated, not rewritten:
    its two designs are still correctly refuted.

Left open

#471 only. Records landed, code not. What settles it: the t=12 / t=24 / t=32 ladder (queued
on that branch, never got an idle window) and x86_64, where spin_loop() is pause and the
scheduler is not heterogeneous, so none of it transfers. Do not re-litigate at t <= 8 — that is now
null on two cells and two vectors.

Closed, each with a comment saying why and where its content lives

#450 #451 #468 #469 #472 #473 #474 #475 #480 #481 #485 #487 #488 — the SHA-verified table is in
benchmarks/pr_triage_2026-08-13.meta. #451's head 761366e8 is already an ancestor of main
(landed via #454, 490ed78). Two conclusions on closed branches are flagged there as refuted by
later rounds: #480's residual attribution (it is code placement, #506) and #485/#488's
count-is-cost framing (cost tracks distinct shard lines visited, #505).

Gates

cargo fmt clean on both touched packages. The only non-docs/-benchmarks/-scripts/ change is a
doc comment in tracker_shard.rs — which does mean this branch touches
crates/rav1d-disjoint-mut/** and so fires the 13 path-filtered disjoint-mut-ci.yml legs,
including both Miri legs, unlike the other records PRs in this family.

Lilith River added 6 commits August 13, 2026 06:45
…`main` has been dangling for days

`main` references `docs/SIZE_SWEEP.md` on **26 lines across 8 files** and does not
contain it. Counted, not recalled:

    benchmarks/itx_16bpc_ab_2026-08-10.meta   docs/ITX_16BPC_DISPATCH.md
    docs/CONTENT_CLASS.md                     scripts/perf/content_report.py
    scripts/perf/content_sweep.sh             scripts/perf/itx_ab_report.py
    scripts/perf/mk_size_ladder.sh            src/safe_simd/cdef_arm.rs

`CONTENT_CLASS.md` alone accounts for 12 of those lines, and #514 left this open
deliberately with a "not on main, here is where it is" pointer at
`measure/size-sweep-intercept` (`30a7294`). #487 carries a BYTE-IDENTICAL copy —
`sha1 eaff7b7071d9e66ab03df29301855463b38ca736` on both `pull/487/head` and
`30a7294` — so landing it here closes that pointer rather than forking it.

Also lands the t=8 half #487 measured, which `SIZE_SWEEP.md` itself listed as
open ("t=1 for the whole ladder"), plus its `docs/SIZE_SWEEP_T8.md` and 9 data
files.

The finding, quoted from the committed record rather than re-derived: all 24
ladder vectors are ONE TILE (`scripts/perf/tile_layout.py`, whose teeth are that
`v4k_8tile` reads 4x2=8 and `v4k_1tile` reads 1), a one-tile frame has exactly
two runnable tasks, and `cores busy` never exceeds 1.19 at any size or thread
count. Re-encoding the same content at 8 tiles moves 4K t=8 from 1.07x to 5.20x
for +0.38% bytes. So the ladder's threading ceiling is the bitstream, not the
decoder — and the campaign's t=8 numbers come from `v4k_8tile`, which is I444 +
8 tiles, while this ladder's 4K cell is I420 + 1 tile. Two different bitstreams
behind one "4K".

Caveat carried forward with the data, not softened: **all 1,944 rows are
load-tagged** (the `measlock` EXIT-trap defect #514's brief now documents let two
agents measure at once), so the absolutes are inflated and the tiled t=8
speedups are LOWER BOUNDS. Gates on the branch: 30/30 bit-identical to dav1d
1.5.4 before any timing, 18/18 thread-invariant with a gate demonstrably able to
fail.

Records only. `examples/avif_to_ivf.rs` is compiled by CI and is left on the
branch as code; `scripts/perf/__pycache__/tile_layout.cpython-314.pyc` is a
stray artefact `30a7294` had already dropped and is not landed. The eleven
`scripts/perf/*` files ARE landed: they are the measurement harness the records
name as their reproduction path, they are not in the decoder build, and #507 set
that precedent with `scripts/x64/build_and_run_x86.sh`.

Source: PR #487 @ 178e070.
…and a third recall-not-count fix

The header's 'SIZE_SWEEP.md is NOT on main' pointer was true on 2026-08-12 and is
not now. Corrected in place with the old wording quoted, not deleted.

Its 'eleven references' was also a recalled number. Counted on the pre-change
file: 13 occurrences of the string on 12 lines, 10 of them in the body.
…of these files by name

`docs/AGENT_BRIEF.md` §6's V-batch row ends
`benchmarks/lf_vbatch_iso_2026-08-10_v1.tsv`, and that file was not on `main`.
Same dangling-citation class #514 cleared for `TILED_SCALING.md` and
`X64_APPLICABILITY.md` §F; this is the one it did not reach.

#488's CONCLUSIONS are already on `main` in four places and none of them change
here — AGENT_BRIEF §6 (two rows: the H cap as a structural 1.000, the V cap's
+3.0%/+7.9% machinery cost), `OWNERSHIP_MODELS.md:344` (1.971x count cut, t=8
ratio 1.0005, p=1.000), `SHARD_GRANULARITY.md:268` (cited as the converse of
#500), and `BOUNDS_MAP.md:473`'s CONTRADICTED section on its soundness TEST.
What was missing is the rows underneath them:

* `lf_vbatch_2026-08-10_v1.tsv` (208 rows) and `_cap32.tsv` (248) — the paired
  A/B whose t=8 ratio is that 1.0005.
* `lf_vbatch_iso_2026-08-10_v1.tsv` (18) and `_v3.tsv` (18) — the ISOLATION arm,
  which is the actually-transferable result: machinery kept, cap pinned back to
  4, **+18.7% at t=1**. That is the row AGENT_BRIEF cites, and it is the
  evidence for "price the MACHINERY a count reduction needs", not just the count.
* `lf_cap_census_2026-08-10.txt` (101) — the `LFCAP` census behind H's exactly
  1.000 at caps 4/8/16/32/64.
* `ctx99_sites_2026-08-10.tsv` (24) — the `#[track_caller]` split of
  `src/ctx.rs:99` across its 12 real callers, summing to 2,534,988 exactly.
  `main` cites that total in three places (`MUT_RECON_KERNELS.md` :27, :471,
  :521) and has never carried the breakdown, including the 50/50 split whose
  `t.l` half is 1,267,494/frame of per-worker buffer.

Records only — #488's `src/ctx.rs`, `src/loopfilter.rs` and `lib.rs` probe
wiring is NOT landed and stays on `pull/488/head` @ 419d271. Its own body says
the tree is back to `f87b12c` with the kernel file byte-identical, so nothing
behavioural is being withheld.

Source: PR #488 @ 419d271.
… cite it by name

`benchmarks/tile_threading_guard_2026-08-06.meta` is referenced by name from
`shard_tracker_2026-08-07.meta:274`, `tracker_decomp_2026-08-07.meta:251` and
`x64_i265_gap_2026-08-08.meta:33` — the last two for its VECTOR RECIPE, i.e.
`main` currently tells a reader to go read a file it does not have. Landing the
meta plus its three `.tsv.zst` (5.7 / 6.5 / 6.6 KB).

Carries three things that exist nowhere else on `main`:

* the #445 regression itself, per-cell (8bpc t=2/4/8 at 1.043-1.082, t=1 flat at
  0.997-1.022 as the control, 10-bit unaffected) and the probe that acquits the
  memcpys — keep both memcpys with one contiguous guard and it measures
  identical to baseline, so the cost was 2h lock round-trips per block;
* the REJECTED one-strided-record attempt, with both variants' numbers;
* the vector recipe the two 2026-08-07 metas send readers here for.

**A dated supersede is added in place over Result 3, not a deletion.** That
section says the strided record is "recorded so it is not retried" — it WAS
retried, and #505/#513 made it the default path on 2026-08-11. Its two designs
are still correctly refuted and its constraint (leave the dense scan
byte-identical) is exactly what the successful retry obeyed, so the section is
worth keeping and worth annotating rather than either deleting or leaving to
read as current.

Records only. #450's `include/dav1d/picture.rs` batching, its
`crates/rav1d-disjoint-mut` additions, `examples/bench_ab_decode.rs` and the two
`scripts/perf/ab_*` harness files are code and stay on `pull/450/head`.

Source: PR #450 @ b5211a0.
…sured, and it corrects `main`'s contention figure

The triage brief characterised #471 as "one of the four waiting-policy arms #504
measured as NULL". Reading its committed data says otherwise, so it is landed as
a live finding rather than closed as a duplicate.

WHAT IS NEW RELATIVE TO #504 (verified against #504's own record, not recalled)

#504 ran backoff/yield/relax/park on `c256x2048` at **t=8**, n=15. Its own
not-measured list, `benchmarks/c256_contention_2026-08-11.meta:128`, ends with
`t=16`. #471 ran spin-64-then-yield on `v4k_8tile`{,`_10b`} at n=16 on an idle
box (every committed row `foreign_max = 0`) across t=1/2/4/8/16 and found:

  * null at t=1/2/4/8 on every statistic — which AGREES with #504;
  * **0.955 (8bpc) / 0.960 (10bpc) at t=16**, p90 and max moving by the same
    factor, i.e. the whole distribution shifted rather than a tail being clipped.

t=16 is the only cell on this host where threads exceed cores (M4 Pro, 8 P + 4 E
= 12 logical). So the joint statement is: refuted at t <= 8 on two cells, OPEN
under oversubscription. AGENT_BRIEF §6 gets a second row saying exactly that, and
the existing row is re-titled "CLOSED AT t <= 8" with its scope stated.

THE CONTENTION FIGURE ON `main` IS WRONG BY 6x, AND THIS IS THE COUNT

`crates/rav1d-disjoint-mut/src/tracker_shard.rs:582` and
`docs/C256_CONTENTION.md:160` both say the earlier TinyLock nulls were taken
"where contention is ~0.02% of registrations". That is `wide_probe::N_SLOW` — a
count of `BorrowTracker::add_slow`, the poisoned / live-wide-record / multi-block
path — divided by the registration population and quoted as a contention rate.
Its provenance is traceable to an `add_slow` count at
`benchmarks/verify_compose2_2026-08-08.meta:278`.

Directly counted on the same vector with `--features probe-lockstats`:
45,401,450 lock acquisitions/frame, ~27,800 contended = **0.061% of acquisitions
/ 0.122% of registrations**. Both sites get a dated in-place correction. #504's
0.264% for `c256x2048` t=8 is a different cell, was counted directly, and is
explicitly NOT disturbed — nor is §5's "at most 10.7% is waiting" arithmetic.

ALSO CARRIED

* Two independent prices for `spin_loop()` on this host — 8.28 ns here, 7.6 ns
  in #504 two days later. Both kept and dated; neither is the ~627 ns that
  applies under real contention.
* #471's record refutes its OWN PR body: the 8bpc t=8 bands [67.8..114.6] /
  [73.2..112.8] that the body asked to be judged on appear in no committed TSV
  in this repo and in no issue or PR body except #471 itself, and real base band
  widths are ~8% of the median, not ~60%. Third instance of the
  unsourced-number class the campaign keeps having to correct.

Records only — the `TinyLock` change itself, the `probe-lockstats` feature and
the three `scripts/perf/tail_*` files are code and stay on `pull/471/head` @
5807083. The shipping build still spins unbounded; nothing here changes that,
and it should not be changed without the t=12/24/32 ladder.

Source: PR #471 @ 5807083.
… left open

Companion to #514's round. Records what landed, what closed, where each closed
PR's finding lives on main (checked by reading the file, not by title), the
branch head SHA for everything not landed, and the one PR left open with what
would settle it.

Also states plainly the three supersession claims the triage brief got wrong or
imprecise (#471, #469, #472) and two conclusions on closed branches that later
rounds refuted (#480's residual attribution, #485/#488's count-is-cost framing).
@lilith lilith self-assigned this Aug 13, 2026
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 5.51%. Comparing base (fcf07c5) to head (bb72946).

Additional details and impacted files
@@          Coverage Diff          @@
##            main    #518   +/-   ##
=====================================
  Coverage   5.51%   5.51%           
=====================================
  Files         85      85           
  Lines      36094   36094           
=====================================
  Hits        1990    1990           
  Misses     34104   34104           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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