diff --git a/crates/sylpheed-formats/examples/loop_length_offset_discriminates.rs b/crates/sylpheed-formats/examples/loop_length_offset_discriminates.rs index d907b713..4194cb10 100644 --- a/crates/sylpheed-formats/examples/loop_length_offset_discriminates.rs +++ b/crates/sylpheed-formats/examples/loop_length_offset_discriminates.rs @@ -45,6 +45,10 @@ fn main() { .flat_map(|el| el.keyframes.iter().filter_map(|k| k.time)) .max(); let Some(max_t) = max_t else { continue }; + // sylpheed-port's reconciliation: max_t == 0 makes "does the word + // equal the largest keyframe time?" vacuous, and those records were + // silently in my denominator. Filter them and the counts must meet. + if std::env::var("MEANINGFUL_ONLY").is_ok() && max_t == 0 { continue } for (i, o) in offsets.iter().enumerate() { if let Some(w) = be32(rec, *o) { stat[i].0 += 1; diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 5bbe792a..8f3011df 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -3235,3 +3235,26 @@ does not transfer to a per-record header: **an interior consistency check is satisfied by any reading that is internally consistent — and "internally consistent" is what a wrong offset into a regular structure usually is.** The boundary rule is the special case where the structure's edges break that regularity. + +## A denominator mismatch hides behind an agreeing numerator + +Two agents, one statistic, and the disagreement was **entirely in the denominator**: +`1643/1781 = 92.3 %` against `1643/3311 = 49.6 %`. **Neither of us was wrong about +the disc.** + +🔴 **My explanation of the gap was wrong too.** I said my scan "requires a timed +keyframe". It does not — `.max()` over the keyframe times returns `Some(0)`, not +`None`, for a record whose keyframes all sit at time 0, so those never left my +denominator. 1 530 records where *"does the word equal the largest keyframe time?"* +has **no content** were counted as failures **by construction**. + +📌 **`sylpheed-port`'s diagnosis of why it stayed invisible is the transferable +part: the numerator agreed to the unit.** We both looked at **1 643** and neither +noticed we were dividing it differently. An agreeing numerator reads as agreement, +and a shared number is the last place either party looks for a discrepancy. + +⚠️ **Both halves needed a qualifier neither carried.** 92.3 % is *of the records +where the question is meaningful*, not *of nested records* — quoted bare on both +sides for two days, including into a shipped doc comment. **A population-scoped +statistic reported without its population is the same shape as a negative reported +without its reach**, and this corpus already had a rule for the second. diff --git a/docs/re/structures/ui-record-loop-length.md b/docs/re/structures/ui-record-loop-length.md index 38b350d4..9bcfc707 100644 --- a/docs/re/structures/ui-record-loop-length.md +++ b/docs/re/structures/ui-record-loop-length.md @@ -22,10 +22,27 @@ disc-wide (1 781 records, 0 violations). > a secondary statistic**: `+0x08` equals the largest keyframe time *exactly* in > half the records and `+0x04` in **none**. No unrelated word reproduces that. > -> ⚠️ My population differs from theirs — 3 311 records against 1 781, because this -> scan takes every pak and requires a timed keyframe — so the exact percentage -> moves (49.6 % vs 92.3 %). **The discrimination does not**: 0 % for `+0x04` under -> both counts. The consequence for the `PRESS Ⓐ` plate +> 🔴 **AND MY EXPLANATION OF THE 49.6 % WAS WRONG.** I wrote that my scan "requires +> a timed keyframe", so the population differed. It does not: `.max()` over the +> keyframe times returns `Some(0)` — not `None` — for a record whose keyframes are +> all at time 0, so those never left my denominator. `sylpheed-port` reconciled it +> exactly and I reproduced it: +> +> ``` +> 1643 / 1781 = 92.3 % records where max t > 0 — the question is meaningful +> 1643 / 3311 = 49.6 % plus 1 530 records where max t == 0 +> ``` +> +> **Same numerator.** The 1 530 extra are records where *"does the word equal the +> largest keyframe time?"* has no content — `max t` is 0, so each counts as +> not-exact **by construction**. 49.6 % is not a weaker 92.3 %; it is 1 643 +> successes over a denominator containing 1 530 questions that were never asked. +> +> ✅ **The conclusion is untouched**: `+0x04` is **0 %** under either denominator, +> so the offset stands on both scans. +> +> ⚠️ **And 92.3 % needs the qualifier it has never carried here**: it is *of the +> records where the question is meaningful*, not *of nested records*. The consequence for the `PRESS Ⓐ` plate is then tested against the corpus's existing measurements of the running game, which it passes and the previous reading fails.