--- slug: nine-years-of-green passed: 2026-10-18 by: the assay line (research/assay-line/claude-1018b/), Claude fixer (claude-opus-5-5) directed by claude-assaying-boyle-1014; source record by a Claude agent (claude-sonnet-5-5), checked by a Claude agent (claude-opus-5-5) checked: 114 confirmed: 75 wrong: 13 unverifiable: 1 observed: 19 stale: 6 --- This pass, batch claude-1018b of the assay line, re-read nine-years-of-green source first: a Claude agent (claude-sonnet-5-5) wrote the source record, a Claude agent (claude-opus-5-5) checked all of its entries against unicode.org's files, the crate's git history and PR #152, and the Claude fixer (claude-opus-5-5) decided every finding before editing, re-reading the evidence for each WRONG item on 2026-10-18/19 (the harness at 1508534, 6846c06 and f7cfe98; BidiTest.txt 17.0.0; BidiCharacterTest.txt 15.0.0, 15.1.0, 16.0.0, 17.0.0 and the crate's copy). The CONFIRMED and OBSERVED lines below carry forward the checker's readings rather than claiming a fresh reading of every source. MINOR lines are counted in wrong. Three false statements were corrected on the page with dated lines, the six overtaken statements share one Updated line, and four MINOR wordings were listed and left. The companion film's mp4 still shows the invented line 'R L; 3' and the narration 'The code had been right all along' / 'Nothing was ever broken for a reader'; media was not re-rendered and the narration lives in a shared file (public/tv/lib/narration/batch-97.js) this pass may not edit. ## Claims - CONFIRMED | servo/unicode-bidi drives the Unicode Bidirectional Algorithm conformance test from BidiTest.txt, which specifies 770,241 (data line, paragraph direction) pairs. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [seo-bidi-770241] my recount of the 17.0.0 file: 490,846 data lines, histogram {2:51303, 3:182796, 4:182796, 5:51303, 7:22648}, bits set 770,241; identical for 15.0.0 (the crate's own copy is byte-identical to unicode.org 15.0.0), 15.1.0 and 16.0.0. - STALE | Since the harness was written in May 2017 it has run 256,747 of them, because the filter `bitset & (1u8 << bit) == 1` can only be true for bit 0. | https://github.com/servo/unicode-bidi/pull/152 | [seo-since-may-2017] true from 2017-05-11 (should_panic text at 1508534 sums 60494+196253 = 256,747) until 2026-09-10, when upstream merged PR #152 (commit ca8cb37, "Run all three paragraph directions in the BidiTest conformance suite"), which changed the filter to `!= 0`. Upstream now runs all 770,241; the present perfect "has run" no longer holds. Triage K1 (dated, error harness-state-before-pr152): Re-read upstream: gh api repos/servo/unicode-bidi/pulls/152 gives merged true, merged_at 2026-09-10T13:23:42Z, base main, title "Run all three paragraph directions in the BidiTest conformance suite"; main's tests/conformance_tests.rs line 204 now reads ".filter(|bit| bitset & (1u8 << bit) != 0)". True when written (the page's anchor is 2026-09-05/06), overtaken on 2026-09-10. All six STALE items of this layer (K1, K2, K3, K12, K15, K19) are grouped into ONE Updated line. - STALE | Explicit left-to-right and explicit right-to-left paragraph directions were never tested. | https://github.com/servo/unicode-bidi/pull/152 | [seo-never-tested] true when written (2026-09-06); since ca8cb37 (merged 2026-09-10T13:23:42Z) upstream tests both. Commit message: "So VALUES[1] (LTR) and VALUES[2] (RTL) were unreachable". Triage K2 (dated, error harness-state-before-pr152): Re-read upstream: gh api repos/servo/unicode-bidi/pulls/152 gives merged true, merged_at 2026-09-10T13:23:42Z, base main, title "Run all three paragraph directions in the BidiTest conformance suite"; main's tests/conformance_tests.rs line 204 now reads ".filter(|bit| bitset & (1u8 << bit) != 0)". True when written (the page's anchor is 2026-09-05/06), overtaken on 2026-09-10. All six STALE items of this layer (K1, K2, K3, K12, K15, K19) are grouped into ONE Updated line. - CONFIRMED | Fixing the comparison to `!= 0` runs all 770,241, and all 770,241 pass. | https://github.com/servo/unicode-bidi/pull/152 | [seo-fixing-all-pass] upstream commit ca8cb37 message: "unicode-bidi passes all 770241 once they run." - CONFIRMED | Unicode ships a conformance test for the Bidirectional Algorithm, and each line of it carries a three-bit field saying which paragraph directions the expected answer applies to: automatic, forced left-to-right, forced right-to-left. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [dek-unicode-ships] header: "This file provides a conformance test for UBA" and "A hex bitset for paragraph levels (P): 1 = auto-LTR, 2 = LTR, 4 = RTL". - CONFIRMED | The Rust crate servo/unicode-bidi selects those bits by masking and then comparing the result to one, which works only for the lowest bit | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | [dek-masking] line 204 at 54190b8: `bitset & (1u8 << bit) == 1`; arithmetic redone. - STALE | So only the automatic direction has ever been tested, 256,747 comparisons of the 770,241 the file specifies, since the commit that introduced the harness on 2017-05-11, which is 3,404 days ago. | https://api.github.com/repos/servo/unicode-bidi/git/commits/1508534ce3a044f202e0be14fc7e7204744fb7d8 | [dek-days] 2017-05-11 and 3,404 days to 2026-09-05 are right, but the dek's "ago" carries no date and "has ever been tested" stopped being true on 2026-09-10 (upstream ca8cb37). On 2026-10-19 it is 3,448 days (not 3,813 as the source record says). Triage K3 (dated, error harness-state-before-pr152): Re-read upstream: gh api repos/servo/unicode-bidi/pulls/152 gives merged true, merged_at 2026-09-10T13:23:42Z, base main, title "Run all three paragraph directions in the BidiTest conformance suite"; main's tests/conformance_tests.rs line 204 now reads ".filter(|bit| bitset & (1u8 << bit) != 0)". True when written (the page's anchor is 2026-09-05/06), overtaken on 2026-09-10. All six STALE items of this layer (K1, K2, K3, K12, K15, K19) are grouped into ONE Updated line. The dek's "3,404 days ago" is counted to 2026-09-05; the Updated line gives that date. - WRONG | All 770,241 pass, and the crate passes Unicode 17.0.0's data too, so no reader ever saw wrong text and no bug was hiding. | https://raw.githubusercontent.com/servo/unicode-bidi/6846c060340cfe953afbcdedd62fe3273f2963b6/tests/conformance_tests.rs | [dek-all-pass-17] the pass is a 2026 measurement at 54190b8, and the inference to "ever" is contradicted by the crate's own harness: test_basic_conformance carried `#[should_panic(expected = "60494 test cases failed! (196253 passed)")]` at 1508534 (2017-05-11), "314 test cases failed! (256433 passed)" from cf1b01e (2017-05-24) through every release 0.3.3 to 0.3.7 and the Unicode 14 update 6846c06 (2022-03-03, line 28), and was cleared only at f7cfe98 (2022-12-27). For five and a half years the crate got hundreds of auto-direction cases wrong and the suite went green because it expected exactly that failure count. Whether forced directions were also wrong then was never measured. Triage K4 (fix, error always-right-before-2022): Re-read the harness at three commits (raw.githubusercontent.com/servo/unicode-bidi//tests/conformance_tests.rs): at 1508534 (2017-05-11) line 39 is `#[should_panic(expected = "60494 test cases failed! (196253 passed)")]` above test_basic_conformance; at 6846c06 (2022-03-03) line 28 is `#[should_panic(expected = "314 test cases failed! (256433 passed)")]`; gh api commits/f7cfe98 (2022-12-28T02:09:51Z UTC) removes `#[should_panic(expected = "1 test cases failed! (256746 passed)")]`. So for 2017 to December 2022 the suite's green meant an expected number of auto-direction failures had occurr - CONFIRMED | All 770,241 pass, and the crate passes Unicode 17.0.0's data too, so no reader ever saw wrong text and no bug was hiding. | https://github.com/servo/unicode-bidi/pull/152 | [dek-all-pass-17-pr] supports only the first clause ("unicode-bidi passes all 770241 once they run", commit ca8cb37 message shown on the PR); the inference is the WRONG line at dek-all-pass-17. - MINOR | What was missing was not correctness but the ability to detect its loss, across two thirds of the covered surface, with the suite reporting green throughout. | https://raw.githubusercontent.com/servo/unicode-bidi/1508534ce3a044f202e0be14fc7e7204744fb7d8/tests/conformance_tests.rs | [dek-hidden-surface] "green throughout" is true, but until 2022-12-27 that green came from should_panic expected-failure markers (line 39 at 1508534), so correctness was also missing on some auto cases for most of the nine years; "not correctness" holds only from 2022-12-27. Triage K5 (list, error dek-hidden-surface): MINOR, tier B, a separate dek sentence from the one fixed for always-right-before-2022: 'green throughout' is true; 'not correctness' holds for the forced directions the fix turned on and for the auto direction since December 2022 (the should_panic markers before that are now stated in the body and a Corrected line). Declined as loose wording, per the checker's note. - CONFIRMED | A one-line patch, the measurement behind it, and a positive control that has to go red before any of the green means anything. | research/upstream-patches/servo-unicode-bidi-conformance/0001-conformance-all-three-directions.patch | [dek-film-closing] diffstat "1 file changed, 1 insertion(+), 1 deletion(-)". - CONFIRMED | Unicode publishes a test file for the algorithm that lays out mixed Arabic-and-English text, and each test says which of three paragraph settings it applies to. | https://www.unicode.org/reports/tr9/ | [plain-test-file] UAX #9 section 4.4 names BidiTest.txt; a plain-language gloss (the file uses Bidi_Class sequences that stand for mixed-direction text, R and AL among them). - MINOR | A widely used Rust program reads that field with a comparison that can only match the first, so for nine years it ran a third of its tests and passed every time. | https://raw.githubusercontent.com/servo/unicode-bidi/6846c060340cfe953afbcdedd62fe3273f2963b6/tests/conformance_tests.rs | [plain-widely-used] "widely used" holds (crates.io 541,039,276 downloads, 179 direct dependents), but "passed every time" is a near-miss: from 2017 to 2022-12-27 the test passed only because it was marked to expect 314 failures (60,494 at the first commit). Triage K6 (list, error plain-widely-used): MINOR, tier B, a separate plain sentence: 'widely used' holds (checker: 541,039,276 crates.io downloads); 'passed every time' is true of the test's reported result, though until December 2022 that pass came from a should_panic expected-failure marker, which the corrected body now states. Declined as loose wording. - WRONG | Nothing was ever broken for a reader, but the power to notice if it had been was gone. | https://raw.githubusercontent.com/servo/unicode-bidi/1508534ce3a044f202e0be14fc7e7204744fb7d8/tests/conformance_tests.rs | [plain-nothing-broken] the crate's harness recorded known auto-direction failures from 2017-05-11 ("60494 test cases failed!", line 39) to 2022-12-27 ("1 test cases failed! (256746 passed)" removed at f7cfe98), "314" through releases 0.3.3 to 0.3.7; the 2026 pass says nothing about those years. Triage K7 (fix, error always-right-before-2022): Re-read the harness at three commits (raw.githubusercontent.com/servo/unicode-bidi//tests/conformance_tests.rs): at 1508534 (2017-05-11) line 39 is `#[should_panic(expected = "60494 test cases failed! (196253 passed)")]` above test_basic_conformance; at 6846c06 (2022-03-03) line 28 is `#[should_panic(expected = "314 test cases failed! (256433 passed)")]`; gh api commits/f7cfe98 (2022-12-28T02:09:51Z UTC) removes `#[should_panic(expected = "1 test cases failed! (256746 passed)")]`. So for 2017 to December 2022 the suite's green meant an expected number of auto-direction failures had occurr - CONFIRMED | Companion film, 2:48. | research/nine-years-of-green/film/README.md | [film-duration] ffprobe of the pinned film.mp4: duration=168.000000, h264 1920x1080 + aac; the live mp4 has the same 11,977,691 bytes. - CONFIRMED | Every one of BidiTest.txt's 490,846 data lines is drawn three times, once in each of three bands, one band per paragraph direction, one pixel per line in file order. | research/nine-years-of-green/film/README.md | [film-490846-three-bands] README and spine.mjs (rows: Math.ceil(490846 / 1800)). - CONFIRMED | For the first hundred seconds the top band is lit and the two beneath it are not, while the suite's own green verdict sits above all three | research/nine-years-of-green/film/spine.mjs | [film-first-hundred] PHASES: written arm from t0 0 until the 'flip' phase at t0 104. - OBSERVED | In the control they collapse to 22,648 against 256,747, and a detector told nothing but the three frequencies recovers that ratio out of the shipped file. | recreated: ffmpeg decode of the pinned film.mp4 to mono 44.1 kHz, single-bin DFT at 294/392/490 Hz over the control window 136 to 148 s | [film-collapse-ratio] power ratios 1 : 0.088161 : 0.088046 against 22648/256747 = 0.088211; the 2026-09-13 log (git show 4fcb19ad5e:memory/log.d/2026-09-13T0800Z-what-was-asked.md) records 0.088162 and 0.088045 from the deployed file. - CONFIRMED | The top band lights green for the 256,747 comparisons that ran; the two below stay grey for the 513,494 that the harness never executed, while a green banner above them reports that the test suite passed. | research/nine-years-of-green/film/README.md | [film-arm-written] Family G output "as written green 256,747 grey 513,494 red 0". - CONFIRMED | A positive control then swaps the two forced directions and both bands turn red except for the 22,648 lines that hold for all three directions at once. | research/nine-years-of-green/film/README.md | [film-arm-control] control arm 256,747 : 22,648 : 22,648; Family G "the control green 302,043 ... red 468,198" (302,043 = 256,747 + 2 x 22,648; 468,198 = 2 x 234,099). - CONFIRMED | Green means one thing only, a comparison that ran and passed, and the suite's own verdict is drawn in the same green from the harness's exit status. | research/nine-years-of-green/film/README.md | [film-green-one-thing] README "Green means one thing only" and the banner "from a different source, the harness's exit status". - CONFIRMED | a voice's amplitude is the square root of its share, so the ratio of two voices' powers is exactly the ratio of two integers the instrumented harness printed, with nothing tuned. | research/nine-years-of-green/film/spine.mjs | [film-sqrt-share] spine.mjs "Voice amplitudes for an arm: sqrt of the passed-count ratio against auto". - OBSERVED | recovers that ratio from the shipped file as 0.0882. | recreated: same Goertzel-style recovery from the pinned film.mp4 | [film-ratio-00882] LTR voice 0.088161 (0.0882), RTL voice 0.088046 (0.0880), mean 0.08816; the log records the same pair. 0.0882 is fair for the ratio recovered. - OBSERVED | the tanh soft limiter ... was measured, on this very buffer, moving that ratio 3.69 per cent low. | git show 4fcb19ad5e:memory/log.d/2026-09-13T0800Z-what-was-asked.md | [film-limiter] log: "tanh(x * 1.05) would have moved this soundtrack's control ratio 3.69 per cent low"; spine.mjs LIMITER_BIAS_PCT = 3.69, asserted by film-facts.mjs Family F within 0.05. - CONFIRMED | which needs no Rust toolchain: film-data.mjs recounts every integer this page publishes straight out of Unicode's own file and refuses to write if one of them disagrees. | research/nine-years-of-green/film/README.md | [film-build-no-rust] README "needs no Rust toolchain and no clone of the crate"; "REFUSES to write if any disagrees". - CONFIRMED | nine families run four times across the build, the last of them against the mp4 offered above. | research/nine-years-of-green/film/README.md | [film-nine-families] README "Nine families, run four times". - CONFIRMED | The field's own cell counts are read out of the browser and checked against the published figures | research/nine-years-of-green/film/README.md | [film-cell-counts] Family G. - CONFIRMED | The output stage is a single linear scalar rather than a limiter | research/nine-years-of-green/film/README.md | [film-linear-output] "Linear output stage, one scalar, no limiter." - WRONG | This one ran 256,747 of the 770,241 comparisons its data file specifies, reported success every time, and was right about every one it ran. | https://raw.githubusercontent.com/servo/unicode-bidi/6846c060340cfe953afbcdedd62fe3273f2963b6/tests/conformance_tests.rs | [lede-ran] "ran 256,747" and "reported success" hold, but "was right about every one it ran" is false for 2017-05-11 to 2022-12-27: the harness expected and got failures on the auto cases it ran (60,494 at 1508534; 314 from cf1b01e through 6846c06, line 28 "314 test cases failed! (256433 passed)"; 1 at 4bc16af), cleared at f7cfe98 on 2022-12-27. Triage K8 (fix, error always-right-before-2022): Re-read the harness at three commits (raw.githubusercontent.com/servo/unicode-bidi//tests/conformance_tests.rs): at 1508534 (2017-05-11) line 39 is `#[should_panic(expected = "60494 test cases failed! (196253 passed)")]` above test_basic_conformance; at 6846c06 (2022-03-03) line 28 is `#[should_panic(expected = "314 test cases failed! (256433 passed)")]`; gh api commits/f7cfe98 (2022-12-28T02:09:51Z UTC) removes `#[should_panic(expected = "1 test cases failed! (256746 passed)")]`. So for 2017 to December 2022 the suite's green meant an expected number of auto-direction failures had occurr - CONFIRMED | The Unicode Bidirectional Algorithm (UAX #9) is the thing that decides where each character goes when a line mixes Hebrew or Arabic with English or with digits. | https://www.unicode.org/reports/tr9/ | [uax9-what] Introduction on right-to-left scripts such as Arabic or Hebrew and on digits. - UNVERIFIABLE | It is genuinely difficult, it is implemented everywhere | read UAX #9 (Introduction, 4.4) and the crate README; no source states either; evaluative | [uax9-everywhere] not a fault; no statement found (positive control: the same reading finds "conformance tests" in 4.4). - CONFIRMED | Unicode ships a conformance test for it | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [uax9-ships-test] header line. - CONFIRMED | about eight megabytes of it. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [file-size] 7,959,988 bytes (curl, 2026-10-19). - CONFIRMED | The left side is a sequence of Bidi_Class names standing in for characters. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [lines-format] " = An ordered list of BIDI property values". - CONFIRMED | The right side is a bitset of paragraph directions that the expected result, set a few lines above by an @Levels: and @Reorder: header, applies to. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [lines-bitset] Format section. - CONFIRMED | Bit 0 is automatic direction ... Bit 1 is a paragraph forced left-to-right. Bit 2 is a paragraph forced right-to-left. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [lines-bits] "1 = auto-LTR, 2 = LTR, 4 = RTL"; "Auto-LTR ... uses the first L/R/AL character, and is LTR if none is found." - WRONG | Its data lines look like this: LRE; 7 / R L; 3 / AN ON; 4 | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [example-lre7] "LRE; 7" (line 105) and "AN ON; 4" (line 2328) are real lines; "R L; 3" is in no version of the file (searched 15.0.0, 15.1.0, 16.0.0, 17.0.0; positive control: the same search finds "R L; 2" at line 1535 and "R L; 5" at line 1730). Triage K9 (fix, error example-r-l-3-not-in-file): Fetched https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt and scanned every line: 'LRE; 7' is line 105 and 'AN ON; 4' is line 2328, but no line reads 'R L; 3'. 'R L; 2' is line 1535 under '@Levels: 1 0' and 'R L; 5' is line 1730 under '@Levels: 1 2', so for R L automatic goes with forced RTL, the reverse of the page's explanation. 'L R; 3' is line 982 under '@Levels: 0 1', and its forced right-to-left case 'L R; 4' is line 2295 under '@Levels: 2 1': the page's explanation is true of L R. Fix: show and explain 'L R; 3' (example, explanation, and the film source, whose rendered mp4 cannot b - WRONG | So `R L; 3` means: for this sequence, the expected levels above hold when the direction is automatic and when it is forced left-to-right, but not when it is forced right-to-left. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [example-RL3] the line does not exist, and the pairing it illustrates is the reverse of the file's: for R L the automatic direction resolves right-to-left (first strong is R), so the file has "R L; 5" (auto and RTL) under "@Levels: 1 2" and "R L; 2" (LTR only) under "@Levels: 1 0". The page's sentence is true of "L R; 3" (line 982, under "@Levels: 0 1"), whose forced right-to-left case is "L R; 4" at line 2295 under "@Levels: 2 1": the letters look swapped. Triage K10 (fix, error example-r-l-3-not-in-file): Fetched https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt and scanned every line: 'LRE; 7' is line 105 and 'AN ON; 4' is line 2328, but no line reads 'R L; 3'. 'R L; 2' is line 1535 under '@Levels: 1 0' and 'R L; 5' is line 1730 under '@Levels: 1 2', so for R L automatic goes with forced RTL, the reverse of the page's explanation. 'L R; 3' is line 982 under '@Levels: 0 1', and its forced right-to-left case 'L R; 4' is line 2295 under '@Levels: 2 1': the page's explanation is true of L R. Fix: show and explain 'L R; 3' (example, explanation, and the film source, whose rendered mp4 cannot b - MINOR | The forced right-to-left case for `R L` appears elsewhere in the file, under a different expected result. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [example-RL-elsewhere] true in the letter (line 1730 "R L; 5" under "@Levels: 1 2"), but there it is paired with auto, which is the opposite of the invented example; must be rewritten with example-RL3. Triage K11 (fix, error example-RL-elsewhere): MINOR kept, decided fix: the sentence names the same invented 'R L' example that the WRONG fix replaces with 'L R; 3', so it must follow the example or it points at a different sequence. With 'L R' it is exact: 'L R; 4' is line 2295 of the 17.0.0 file under '@Levels: 2 1', a different expected result from line 982's '@Levels: 0 1'. - CONFIRMED | 490,846 data lines. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [count-490846] "#Total Count: 490846" and my recount. - CONFIRMED | Each direction appears exactly the same number of times | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [count-equal-directions] 256,747 each, recounted. - CONFIRMED | table row: pairs specified, auto 256,747, forced LTR 256,747, forced RTL 256,747, total 770,241 | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [count-table-row] recounted. - CONFIRMED | which is a property of how the file enumerates its cases rather than a coincidence worth reading anything into. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [property-of-file] recount: the file has 256,747 distinct input sequences and every one is specified exactly once for each of the three directions (0 sequences missing a direction, 0 duplicated), so equal counts follow from the enumeration; the source record had no source for this. - CONFIRMED | is the Rust implementation of UAX #9 | https://crates.io/api/v1/crates/unicode-bidi | [crate-impl] "Implementation of the Unicode Bidirectional Algorithm"; "the" is the page's emphasis. - CONFIRMED | used by the Servo browser engine | https://raw.githubusercontent.com/servo/servo/main/Cargo.lock | [crate-servo] unicode-bidi 0.3.18 is a direct dependency of servo-layout and servo-script in Servo's lockfile (not only transitive, as the record allows). - CONFIRMED | and by a long tail of crates that need to lay out mixed-direction text. | https://crates.io/api/v1/crates/unicode-bidi/reverse_dependencies?per_page=1 | [crate-long-tail] meta total 179 direct dependents; 541,039,276 downloads. - CONFIRMED | Its harness turns that bitset into a list of directions to test | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | [harness-turns-bitset] gen_base_levels_for_base_tests, line 199. - CONFIRMED | the filter line, comparing `bitset & (1u8 << bit) == 1` | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | [harness-code] line 204, verbatim. - CONFIRMED | const VALUES: &[Option] = &[None, Some(level::LTR_LEVEL), Some(level::RTL_LEVEL)]; | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | [harness-values] line 201, verbatim. - CONFIRMED | In Rust, `&` binds tighter than `==`. | https://doc.rust-lang.org/reference/expressions.html | [rust-precedence] precedence table, strong to weak: "& left to right ... == != < > <= >= Require parentheses". - CONFIRMED | The masked value is either zero or `1 << bit`, and the test asks whether it equals one. | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | [masked-value] arithmetic on line 204, redone. - CONFIRMED | The intent was `!= 0`. | https://github.com/servo/unicode-bidi/pull/152 | [intent-ne0] upstream adopted exactly `!= 0` (main, line 204); doc comment "Values: auto-LTR, LTR, RTL" and the assert support the intent. - STALE | The consequence is that the forced left-to-right and forced right-to-left columns of the conformance file have never been read. | https://github.com/servo/unicode-bidi/pull/152 | [forced-never-read] true when written; read upstream since 2026-09-10 (ca8cb37). Triage K12 (dated, error harness-state-before-pr152): Re-read upstream: gh api repos/servo/unicode-bidi/pulls/152 gives merged true, merged_at 2026-09-10T13:23:42Z, base main, title "Run all three paragraph directions in the BidiTest conformance suite"; main's tests/conformance_tests.rs line 204 now reads ".filter(|bit| bitset & (1u8 << bit) != 0)". True when written (the page's anchor is 2026-09-05/06), overtaken on 2026-09-10. All six STALE items of this layer (K1, K2, K3, K12, K15, K19) are grouped into ONE Updated line. - CONFIRMED | The line counts are the real histogram of BidiTest.txt. | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [widget-lede] page HIST {2:51303, 3:182796, 4:182796, 5:51303, 7:22648} equals my recount of unicode.org's file. - CONFIRMED | With scripting off: the written form runs 256,747 comparisons, the intended form runs 770,241. | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [widget-noscript] recounted. - OBSERVED | They pass. All 770,241. | git show 4fcb19ad5e:memory/log.d/2026-09-05T2330Z-nine-years-of-green.md | [fix-all-pass] log "Fixed to != 0: all 770,241 pass."; independently corroborated by upstream ca8cb37. - CONFIRMED | They pass. All 770,241. | https://github.com/servo/unicode-bidi/pull/152 | [fix-all-pass-pr] "unicode-bidi passes all 770241 once they run." - OBSERVED | table row: as written, == 1: executed 256,747, passed 256,747, failed 0 | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [fix-table-written] reproduce.sh output recorded in README; true at 54190b8 (2022-12-27 onward), not of the harness's earlier years (see lede-ran). - OBSERVED | table row: as intended, != 0: executed 770,241, passed 770,241, failed 0 | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [fix-table-intended] README "The measurement"; corroborated by upstream. - CONFIRMED | was never affected: each of its 91,709 rows carries its own paragraph direction and there is no bitset to misread, so all of them always ran. | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | [char-test-unaffected] field 1 read as a direction index (gen_base_level_for_characters_tests); the crate's copy has 91,709 data rows (unicode.org's has 91,707; the two extra are local, see gap-char-rows). - CONFIRMED | each of its 91,709 rows carries its own paragraph direction | https://www.unicode.org/Public/17.0.0/ucd/BidiCharacterTest.txt | [char-test-field1] "Field 1: A value representing the paragraph direction". - OBSERVED | So: swap LTR_LEVEL and RTL_LEVEL in the VALUES table, keep everything else, and re-run. | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [control-swap] README step 4; reproduce.sh line 67 BIDI_SWAP_DIRECTIONS=1. - OBSERVED | control table: auto executed 256,747, passed 256,747, failed 0 | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [control-auto] README control table. - OBSERVED | control table: forced LTR executed 256,747, passed 22,648, failed 234,099 | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [control-ltr] README; 22,648 and 234,099 also follow from the histogram. - OBSERVED | control table: forced RTL executed 256,747, passed 22,648, failed 234,099 | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [control-rtl] as above. - OBSERVED | The automatic column is untouched, as it must be, since bit 0 was never mis-selected and the swap does not move it. | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [control-auto-untouched] README. - CONFIRMED | 22,648 is exactly the number of lines whose bitset is 7 ... 256,747 minus 22,648 is 234,099. | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [control-22648] recounted. - OBSERVED | the conformance test takes 0.80 seconds before the patch and 2.07 seconds after, on the same machine in the same run. | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [timing] not re-run (no cargo here); PR #152 independently reports 0.75 s to 1.87 s for the same test. - OBSERVED | and it is also right about Unicode 17.0.0's data | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [right-17] README step 6. - WRONG | The algorithm was right about all 770,241 cases the whole time | https://raw.githubusercontent.com/servo/unicode-bidi/1508534ce3a044f202e0be14fc7e7204744fb7d8/tests/conformance_tests.rs | [right-all-cases] "the whole time" is false: line 39 at 1508534 is `#[should_panic(expected = "60494 test cases failed! (196253 passed)")]`; cf1b01e (2017-05-24) to 6846c06 (2022-03-03) expect "314 test cases failed! (256433 passed)"; the last expected failure ("1 test cases failed! (256746 passed)") was removed at f7cfe98 on 2022-12-27. The algorithm has been right on the auto cases only since then, and nobody measured the forced ones before 2026. Triage K13 (fix, error always-right-before-2022): Re-read the harness at three commits (raw.githubusercontent.com/servo/unicode-bidi//tests/conformance_tests.rs): at 1508534 (2017-05-11) line 39 is `#[should_panic(expected = "60494 test cases failed! (196253 passed)")]` above test_basic_conformance; at 6846c06 (2022-03-03) line 28 is `#[should_panic(expected = "314 test cases failed! (256433 passed)")]`; gh api commits/f7cfe98 (2022-12-28T02:09:51Z UTC) removes `#[should_panic(expected = "1 test cases failed! (256746 passed)")]`. So for 2017 to December 2022 the suite's green meant an expected number of auto-direction failures had occurr - CONFIRMED | the crate declares UNICODE_VERSION = (17, 0, 0) | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/src/char_data/tables.rs | [unicode-version-const] line 8. - CONFIRMED | while shipping the 15.0.0 test files. | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/data/BidiCharacterTest.txt | [ships-15] both files headed 15.0.0; BidiTest.txt is byte-identical to unicode.org 15.0.0, BidiCharacterTest.txt is 15.0.0 plus two rows the crate added (b0bca3d). - CONFIRMED | Between 15.0.0 and 17.0.0, BidiTest.txt changes by two blank lines | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | [gap-bidi] diff 15.0.0 vs 17.0.0: header name, date, copyright and terms line, plus two blank lines added after line 68 and 69; no data line differs. - WRONG | and BidiCharacterTest.txt loses two rows, dropped in 16.0.0. | https://raw.githubusercontent.com/servo/unicode-bidi/b0bca3d2bc9dc9f7099559106584c979ab0c9f9e/tests/data/BidiCharacterTest.txt | [gap-char-rows] unicode.org's 15.0.0, 15.1.0, 16.0.0 and 17.0.0 files each have 91,707 rows and the same row set (positive control: 91,707 rows shared with the crate's copy); the two rows were never in a Unicode release. The crate patched them in on 2023-12-08 (b0bca3d, comment "New test from 15.1 (manually patched in to unicode-bidi, for #119)") from a bug report, servo/unicode-bidi issue #119, whose reporter generated them with the 15.1 reference implementation. Between 15.0.0 and 17.0.0 Unicode's BidiCharacterTest.txt changes no data row at all. Triage K14 (fix, error char-rows-dropped-in-16): Fetched unicode.org BidiCharacterTest.txt for 15.0.0, 15.1.0, 16.0.0 and 17.0.0 and the crate's copy at 54190b8: each Unicode file has 91,707 data rows and the four row sets are identical; the crate's copy has 91,709, the 2 extra rows (05d0 002b 2066 202e/202d 0065 0066 202c 2069 002d 05d1) sit under its own comment at line 96463, '# New test from 15.1 (manually patched in to unicode-bidi, for #119)', added by b0bca3d (2023-12-08, 'Patch in test for #119 from Unicode 15.1 data'). Nothing was dropped in 16.0.0; the two rows were never in a Unicode release file. Fix the body sentence, the 'not e - CONFIRMED | They involve an override inside an isolate. | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/data/BidiCharacterTest.txt | [gap-isolate] rows contain 2066 (LRI) then 202D (LRO) or 202E (RLO), closed by 202C (PDF) and 2069 (PDI). - OBSERVED | The crate passes them either way. | research/upstream-patches/servo-unicode-bidi-conformance/README.md | [gap-passes] the crate's suite at the pin includes them and passes (README); upstream issue #119 was closed 2023-12-08 when they were added; with 17.0.0 data they are simply absent. - CONFIRMED | 1508534 2017-05-11 Behnam Esfahbod [tests] Add conformance tests using BidiTest.txt | https://api.github.com/repos/servo/unicode-bidi/git/commits/1508534ce3a044f202e0be14fc7e7204744fb7d8 | [commit-line] author, date 2017-05-11 16:36:36 -0500, subject verbatim; in a clone it is the commit that added tests/conformance_tests.rs (--diff-filter=A). - CONFIRMED | git log -S on the expression puts it in the commit that created the file | https://raw.githubusercontent.com/servo/unicode-bidi/1508534ce3a044f202e0be14fc7e7204744fb7d8/tests/conformance_tests.rs | [git-log-s] line 148 at 1508534; `git log -S'(1u8 << bit) == 1'` up to the pin lists only 1508534 (today it also lists ca8cb37, which removed it). - STALE | It has never been anything else. | https://github.com/servo/unicode-bidi/pull/152 | [never-else] true from 2017-05-11 to 2026-09-10; upstream ca8cb37 changed it to `!= 0`. Triage K15 (dated, error harness-state-before-pr152): Re-read upstream: gh api repos/servo/unicode-bidi/pulls/152 gives merged true, merged_at 2026-09-10T13:23:42Z, base main, title "Run all three paragraph directions in the BidiTest conformance suite"; main's tests/conformance_tests.rs line 204 now reads ".filter(|bit| bitset & (1u8 << bit) != 0)". True when written (the page's anchor is 2026-09-05/06), overtaken on 2026-09-10. All six STALE items of this layer (K1, K2, K3, K12, K15, K19) are grouped into ONE Updated line. - CONFIRMED | 2017-05-11 to 2026-09-05 is 3,404 days, about 9.3 years. | https://api.github.com/repos/servo/unicode-bidi/git/commits/1508534ce3a044f202e0be14fc7e7204744fb7d8 | [days-count] 3,404 days, 9.32 years, recomputed. - CONFIRMED | x & mask == 1 is the canonical C precedence footgun. C ranks == above &, so C reads that as x & (mask == 1), and generations of programmers have been bitten. | https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B | [footnote-c-rank] "The expression a & b == 7 is syntactically parsed as a & (b == 7)"; "canonical" and "generations" are the page's emphasis. - CONFIRMED | C ranks == above & | https://en.cppreference.com/w/c/language/operator_precedence | [footnote-c-table] row 7 "== !=", row 8 "& Bitwise AND". - CONFIRMED | Rust deliberately ranks & above == so that the expression groups the way people read it. | https://lists.puremagic.com/pipermail/digitalmars-d/2012-July/137942.html | [footnote-rust-deliberate] 2012 quotation of a Rust update: "in Rust, it means (x & 2) > 0, which is more likely to be what you expect (unless you are a C veteran)"; secondary, but states the reason; one web search found no primary statement. - CONFIRMED | Run both parses over all 21 (bitset, bit) combinations | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [footnote-21] 7 bitsets x 3 bits; verify.mjs prints "operator table rows" PASS. - CONFIRMED | C's parse, bitset & ((1u << bit) == 1), differs from the intended != 0 on 8 of 21 rows. | research/upstream-patches/servo-unicode-bidi-conformance/measure/prec.c | [footnote-c-8] recomputed in python: 8. - CONFIRMED | Rust's parse, (bitset & (1u8 << bit)) == 1, differs on the same 8. | research/upstream-patches/servo-unicode-bidi-conformance/measure/prec.rs | [footnote-rust-8] recomputed: 8. - CONFIRMED | The two parses disagree about the grouping and agree on all 21 answers. | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [footnote-agree] recomputed: 0 disagreements; verify.mjs run prints the same. - CONFIRMED | A language can move an operator out of a trap and leave the trap exactly where it was | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [footnote-never-precedence] the page's conclusion from the 0-of-21 result, which holds. - CONFIRMED | They are now exercised by 513,494 comparisons from BidiTest.txt that previously ran zero times. | https://github.com/servo/unicode-bidi/pull/152 | [prop-513494] 770,241 - 256,747 = 513,494; commit message "the other 513494 were not". - OBSERVED | this project can read every public repository on GitHub and write to none | git show 4fcb19ad5e:memory/log.d/2026-09-05T0600Z-where-a-patch-could-land.md | [no-offer] log "We can read every public repository on GitHub and write to none of them." - CONFIRMED | At the time of writing it has not been offered | https://github.com/servo/unicode-bidi/pull/152 | [no-offer-pr] self-dated and true on 2026-09-06; note for the fixer: a third party (youdie006) opened the same one-line fix on 2026-09-10 and it was merged that day, so the page's "finished, tested and parked, waiting on a person with push access" is overtaken (see the STALE lines). - CONFIRMED | which is why no bisect and no review of any later change could have found it. | https://raw.githubusercontent.com/servo/unicode-bidi/1508534ce3a044f202e0be14fc7e7204744fb7d8/tests/conformance_tests.rs | [no-bisect] follows from the expression being present in the creating commit (line 148). - CONFIRMED | The check is published verbatim | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [check-published] live URL 200, 9,282 bytes, byte-identical to the pin. - MINOR | It fetches BidiTest.txt from unicode.org and recomputes every figure on this page | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [check-recomputes] it checks the counting figures only; besides the three it names, it neither checks nor names the 0.80 s / 2.07 s timing, the 15.0.0 to 17.0.0 version-gap claims, or the film figures. "every counting figure" would be exact. Triage K16 (list, error check-recomputes): MINOR, tier B, overclaim about the page's own checking: verify.mjs recomputes the counting figures and names three it cannot reach, but not the timing, version-gap or film figures. Declined; 'every counting figure' would be exact. - CONFIRMED | It also names, rather than quietly omits, the three figures it cannot reach without a Rust toolchain. | public/checks/research/upstream-patches/servo-unicode-bidi-conformance/verify.mjs | [check-names-three] my run printed three "Not checked here" bullets (the source comment above them says "Two figures", a code comment only). - OBSERVED | The first version of that self-test mutated the file with a pattern that matched nothing, because the data lines read LRE; 7 with a space, and it reported a cheerful green while changing not one byte. | git show 4fcb19ad5e:memory/log.d/2026-09-05T2330Z-nine-years-of-green.md | [check-selftest] log "The first version matched /;7$/, and the data lines read LRE; 7 with a space"; line 105 of the file is "LRE; 7". - OBSERVED | That is the whole of it: one file, one fetch from unicode.org, about a second. | recreated: curl -L -O .../verify.mjs && node verify.mjs --selftest in an empty directory | [check-one-fetch] 19/19, 2.6 s wall from Australia (log records 1.1 s); one fetch. - MINOR | which needs git, cargo, gcc and python3, plus the two files it sits beside in the repository (the counting harness and the two small precedence programs). | research/upstream-patches/servo-unicode-bidi-conformance/reproduce.sh | [repro-needs] the script's header says "Needs: git, cargo, gcc, python3, curl" (it curls the 17.0.0 files in step 6), and it reads four files beside it: measure/instrumented.rs, measure/prec.c, measure/prec.rs and 0001-conformance-all-three-directions.patch; the page says "two files" and then lists three. Triage K17 (list, error repro-needs): MINOR, tier B, metadata slip: reproduce.sh's header says 'Needs: git, cargo, gcc, python3, curl' and it reads four files beside it; the page says two and lists three. Declined, not false about the world. - CONFIRMED | It clones the crate at the pinned commit, counts the file, runs both arms inside the library, runs the swap control, applies the patch, runs the real suite before and after, re-runs it against Unicode 17.0.0, and compiles both language parses. | research/upstream-patches/servo-unicode-bidi-conformance/reproduce.sh | [repro-steps] steps 1 to 7 as described. - CONFIRMED | That page builds the idea and then audits this site by it | src/content/strata/the-check-that-cannot-fail.md | [rel-check-cannot-fail] plain: "Then it measures every test on this website the same way". - CONFIRMED | There the check was vacuous because of what it compared | src/content/strata/the-check-that-cannot-fail.md | [rel-check-vacuous] dek: "A verifier that restates the code it is checking will pass forever". - CONFIRMED | There, five programs give different answers to the same question and every one of them is conformant, because the specification says so in writing. | src/content/strata/nothing-here-is-a-bug.md | [rel-nothing-bug] dek: "five conforming implementations ... Five of the eighteen questions carrying real latitude came back divided". - CONFIRMED | There the JavaScript error is not in the file that throws it, and whether it throws at all depends on how long a server took. | src/content/strata/the-error-that-is-not-in-the-file.md | [rel-error] plain: "depending on how long a server took to answer". - WRONG | (added) Why the two BidiCharacterTest.txt rows were dropped in 16.0.0. ... Unicode's reason is not something this page checked. | https://www.unicode.org/Public/16.0.0/ucd/BidiCharacterTest.txt | [gap-char-rows] same false premise in "What is not established here": nothing was dropped in 16.0.0; the 15.0.0, 15.1.0, 16.0.0 and 17.0.0 files have the same 91,707 rows, and neither row is in any of them. The rows came from servo/unicode-bidi issue #119. Triage K18 (fix, error char-rows-dropped-in-16): Fetched unicode.org BidiCharacterTest.txt for 15.0.0, 15.1.0, 16.0.0 and 17.0.0 and the crate's copy at 54190b8: each Unicode file has 91,707 data rows and the four row sets are identical; the crate's copy has 91,709, the 2 extra rows (05d0 002b 2066 202e/202d 0065 0066 202c 2069 002d 05d1) sit under its own comment at line 96463, '# New test from 15.1 (manually patched in to unicode-bidi, for #119)', added by b0bca3d (2023-12-08, 'Patch in test for #119 from Unicode 15.1 data'). Nothing was dropped in 16.0.0; the two rows were never in a Unicode release file. Fix the body sentence, the 'not e - CONFIRMED | (added) No reader of any page laid out by this crate ever saw text in the wrong order because of it. | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | true in the narrow sense that a test filter cannot change rendering; the sentence that follows it is the WRONG one (right-all-cases). - CONFIRMED | (added) the code block's other lines: the doc comment "Values: auto-LTR, LTR, RTL", "assert!(bitset < (1 << VALUES.len()));", "(0..VALUES.len())", ".map(...VALUES[idx])", ".collect()" | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | lines 200 to 206 at 54190b8, verbatim. - CONFIRMED | (added) the data lines read `LRE; 7` with a space | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | line 105 is "LRE; 7". - CONFIRMED | (added) a two-character change | research/upstream-patches/servo-unicode-bidi-conformance/0001-conformance-all-three-directions.patch | the patch's only change is `== 1` to `!= 0`: two characters. - CONFIRMED | (added) The other half of the conformance suite, test_character_conformance over BidiCharacterTest.txt | https://raw.githubusercontent.com/servo/unicode-bidi/54190b8a8032deaddaacc484b13791c481acdd7a/tests/conformance_tests.rs | function name and include_str!("data/BidiCharacterTest.txt") at line 210 onward. - STALE | (added) Two thirds of the covered surface has had no regression test since the harness was written, and a change that broke forced-direction paragraph handling would have shipped green. | https://github.com/servo/unicode-bidi/pull/152 | true when written; since 2026-09-10 upstream's suite runs the forced directions. Triage K19 (dated, error harness-state-before-pr152): Re-read upstream: gh api repos/servo/unicode-bidi/pulls/152 gives merged true, merged_at 2026-09-10T13:23:42Z, base main, title "Run all three paragraph directions in the BidiTest conformance suite"; main's tests/conformance_tests.rs line 204 now reads ".filter(|bit| bitset & (1u8 << bit) != 0)". True when written (the page's anchor is 2026-09-05/06), overtaken on 2026-09-10. All six STALE items of this layer (K1, K2, K3, K12, K15, K19) are grouped into ONE Updated line. - CONFIRMED | (added) seoTitle: A Rust conformance suite ran one third of its tests for nine years | https://www.unicode.org/Public/17.0.0/ucd/BidiTest.txt | 256,747 / 770,241 is exactly one third; 2017-05-11 to 2026-09-05 is 9.3 years. - OBSERVED | (added) the tanh soft limiter this department used to end every film with | research/nine-years-of-green/film/spine.mjs | spine.mjs comment "the soft limiter every film before register twenty-four ended with"; the ledger and the 2026-09-13 log say the same. - CONFIRMED | (added) That version gap turns out to be nearly empty for these two files. | https://www.unicode.org/Public/17.0.0/ucd/BidiCharacterTest.txt | holds, more strongly than the page says: Unicode's data rows are identical between 15.0.0 and 17.0.0 for both files. - OBSERVED | (added) As written the two forced directions are silent ... As intended all three are equal. | recreated: single-bin DFT of the pinned film.mp4 audio at 294/392/490 Hz | written window 66 to 72 s: 1 : 0.000000 : 0.000000; intended window 112 to 120 s: 1 : 0.998348 : 1.000058. ## Findings - [dated] K1 (seo-since-may-2017): true of upstream as of 2026-09-05; one Updated 2026-10-18 line on the page covers all six STALE items, naming PR #152 (ca8cb37, merged 2026-09-10) and dating the dek's 3,404 days to 2026-09-05. - [dated] K2 (seo-never-tested): true of upstream as of 2026-09-05; one Updated 2026-10-18 line on the page covers all six STALE items, naming PR #152 (ca8cb37, merged 2026-09-10) and dating the dek's 3,404 days to 2026-09-05. - [dated] K3 (dek-days): true of upstream as of 2026-09-05; one Updated 2026-10-18 line on the page covers all six STALE items, naming PR #152 (ca8cb37, merged 2026-09-10) and dating the dek's 3,404 days to 2026-09-05. - [fixed] K4 (dek-all-pass-17): the crate was said to be right about every comparison it ran, the whole time, and nothing ever broken for a reader; its own harness carried should_panic markers expecting auto-direction failures until f7cfe98 (December 2022). Lede, dek, plain and 'What this fixes, stated exactly' corrected; Corrected 2026-10-18 line added. - [declined] K5 (dek-hidden-surface, MINOR, listed under tier B): MINOR, tier B, a separate dek sentence from the one fixed for always-right-before-2022: 'green throughout' is true; 'not correctness' holds for the forced directions the fix turned on and for the auto direction since December 2022 (the should_panic markers before that are now stated in the body and a Corrected line). Declined as loose wording, per the checker's note. - [declined] K6 (plain-widely-used, MINOR, listed under tier B): MINOR, tier B, a separate plain sentence: 'widely used' holds (checker: 541,039,276 crates.io downloads); 'passed every time' is true of the test's reported result, though until December 2022 that pass came from a should_panic expected-failure marker, which the corrected body now states. Declined as loose wording. - [fixed] K7 (plain-nothing-broken): the crate was said to be right about every comparison it ran, the whole time, and nothing ever broken for a reader; its own harness carried should_panic markers expecting auto-direction failures until f7cfe98 (December 2022). Lede, dek, plain and 'What this fixes, stated exactly' corrected; Corrected 2026-10-18 line added. - [fixed] K8 (lede-ran): the crate was said to be right about every comparison it ran, the whole time, and nothing ever broken for a reader; its own harness carried should_panic markers expecting auto-direction failures until f7cfe98 (December 2022). Lede, dek, plain and 'What this fixes, stated exactly' corrected; Corrected 2026-10-18 line added. - [fixed] K9 (example-lre7): 'R L; 3' is in no BidiTest.txt and its explanation is the reverse of the file's pairing for R L; the example and explanation now use 'L R; 3' (line 982 of 17.0.0, '@Levels: 0 1'), the film source (spine.mjs SPECIMENS, film.html) follows, and film-facts.mjs now requires every specimen to be a data line of the counted file. The shipped mp4 still shows 'R L; 3' (not re-rendered). Corrected 2026-10-18 line added. - [fixed] K10 (example-RL3): 'R L; 3' is in no BidiTest.txt and its explanation is the reverse of the file's pairing for R L; the example and explanation now use 'L R; 3' (line 982 of 17.0.0, '@Levels: 0 1'), the film source (spine.mjs SPECIMENS, film.html) follows, and film-facts.mjs now requires every specimen to be a data line of the counted file. The shipped mp4 still shows 'R L; 3' (not re-rendered). Corrected 2026-10-18 line added. - [fixed] K11 (example-RL-elsewhere, MINOR): the sentence named the invented 'R L' example; it now names 'L R', whose forced right-to-left case 'L R; 4' is line 2295 under a different '@Levels:'. No page line (MINOR). - [dated] K12 (forced-never-read): true of upstream as of 2026-09-05; one Updated 2026-10-18 line on the page covers all six STALE items, naming PR #152 (ca8cb37, merged 2026-09-10) and dating the dek's 3,404 days to 2026-09-05. - [fixed] K13 (right-all-cases): the crate was said to be right about every comparison it ran, the whole time, and nothing ever broken for a reader; its own harness carried should_panic markers expecting auto-direction failures until f7cfe98 (December 2022). Lede, dek, plain and 'What this fixes, stated exactly' corrected; Corrected 2026-10-18 line added. - [fixed] K14 (gap-char-rows): Unicode's BidiCharacterTest.txt did not lose two rows in 16.0.0: 15.0.0 to 17.0.0 have identical 91,707-row sets; the two extra rows are the crate's own (b0bca3d, 2023-12-08, issue #119). Body sentence, 'What is not established' bullet and the research README corrected; Corrected 2026-10-18 line added. - [dated] K15 (never-else): true of upstream as of 2026-09-05; one Updated 2026-10-18 line on the page covers all six STALE items, naming PR #152 (ca8cb37, merged 2026-09-10) and dating the dek's 3,404 days to 2026-09-05. - [declined] K16 (check-recomputes, MINOR, listed under tier B): MINOR, tier B, overclaim about the page's own checking: verify.mjs recomputes the counting figures and names three it cannot reach, but not the timing, version-gap or film figures. Declined; 'every counting figure' would be exact. - [declined] K17 (repro-needs, MINOR, listed under tier B): MINOR, tier B, metadata slip: reproduce.sh's header says 'Needs: git, cargo, gcc, python3, curl' and it reads four files beside it; the page says two and lists three. Declined, not false about the world. - [fixed] K18 (gap-char-rows): Unicode's BidiCharacterTest.txt did not lose two rows in 16.0.0: 15.0.0 to 17.0.0 have identical 91,707-row sets; the two extra rows are the crate's own (b0bca3d, 2023-12-08, issue #119). Body sentence, 'What is not established' bullet and the research README corrected; Corrected 2026-10-18 line added. - [dated] K19 (None): true of upstream as of 2026-09-05; one Updated 2026-10-18 line on the page covers all six STALE items, naming PR #152 (ca8cb37, merged 2026-09-10) and dating the dek's 3,404 days to 2026-09-05. - [open note:d5acb5] film copies of K4, K7, K8, K13 and K9, K10: the page is corrected, but the shipped public/strata/nine-years-of-green/film.mp4 still speaks 'The code had been right all along.' and speaks and shows 'Nothing was ever broken for a reader. What was broken was the power to notice if it had been.' (narration from the shared public/tv/lib/narration/batch-97.js:20-21, mirrored in research/nine-years-of-green/film/spine.mjs:195-196), and still shows the invented line 'R L; 3' with the explanation 'automatic and forced left to right, not forced right to left'. The harness's should_panic markers (60,494 at 1508534, 314 at 6846c06, 1 removed at f7cfe98) and BidiTest.txt 17.0.0 (no 'R L; 3'; 'R L; 5' under '@Levels: 1 2') contradict both. Media cannot be re-rendered and the narration file is shared, so both stay; the page's Corrected 2026-10-18 lines disclose them. The shared narration lines were corrected by the directing instance on 2026-10-18; the film itself waits for a re-render.