From b0bb57c0e62342b0241670fafdb9694c8839b1d4 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Mon, 31 Aug 2026 03:49:49 +0000 Subject: [PATCH] port: my falsifier never identified the offset -- the half I called a formality did Their struct-layout control found that a homogeneous repeated table type-checks at every field boundary, so an interior test carries no information about phase: 69 of 70 records passed under both shifted alignments. Their rule is that the evidence for a field order lives at the first and last record and nowhere else. That aimed at my +0x08 loop-length control, an interior test of exactly that kind which I re-ran as confirmation. Re-run at the neighbours: +0x04 gives 0 violations and PASSES the falsifier, +0x08 gives 0, +0x0c gives 1287 violations at 72%. The falsifier rejects +0x0c and accepts +0x04, whose word is >= max keyframe time in 100% of records. So the falsifier does not identify +0x08. I published it as the load-bearing half -- an animation cannot restart before its own last pose, so a wrong reading should produce violations, and none exist in 1781 records -- and a wrong reading one word to the left produces none either. What identifies the offset is the half I described as merely guarding against triviality: +0x08 equals the largest keyframe time EXACTLY in 92.3% of records and +0x04 does so in 0%. No unrelated word reproduces that coincidence. The value is right and my argument for it was wrong. Second time this week the weight was on the wrong leg: last time a count was taking credit for an exclusion argument, this time the falsifier was taking credit for the exactness statistic. Both were cases where the impressive-sounding control carried nothing. Their boundary rule does not transfer literally -- a per-record header has no first-and-last-record phase question -- but the underlying point does: 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. Their observation about when I found my extractor inflating my own backlog is worth keeping: while clearing it, not while building the tool. Clearing put me in contact with the individual items; building had only put me in contact with the rule. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- .../examples/record_loop_control.rs | 23 ++++++++- docs/port/DECISIONS.md | 47 ++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/crates/sylpheed-export/examples/record_loop_control.rs b/crates/sylpheed-export/examples/record_loop_control.rs index eb24796d..bbee584d 100644 --- a/crates/sylpheed-export/examples/record_loop_control.rs +++ b/crates/sylpheed-export/examples/record_loop_control.rs @@ -37,7 +37,17 @@ const SHIPPED: &[&str] = &[ "ptloop01", "ptloop02", ]; +/// Which header word to read as the loop length. `0x08` is the decoded one; +/// `--offset=N` re-runs the same falsifier at a neighbour, which is the only way +/// to learn whether the falsifier is evidence for the offset or just for the +/// disc. +static mut OFFSET: usize = 8; + fn main() { + let off: usize = std::env::args().find_map(|a| a.strip_prefix("--offset=") + .and_then(|v| v.parse().ok())).unwrap_or(8); + unsafe { OFFSET = off }; + println!(" reading the loop length at header +0x{off:02x}"); let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")).expect("dat/") .flatten().map(|e| e.path()) @@ -55,9 +65,18 @@ fn main() { if !ratc::is_ratc(&by) { continue } let Some(b) = ui_layout::parse_build(&by) else { continue }; for (rn, &(o, s)) in &b.records { - if o + 12 > by.len() || o + s > by.len() { continue } + if o + off + 4 > by.len() || o + s > by.len() { continue } if &by[o..o + 4] != b"RATC" { continue } - let len = u32::from_be_bytes(by[o + 8..o + 12].try_into().unwrap()) as i64; + // 🔴 THE FALSIFIER IS RUN AT NEIGHBOURING OFFSETS TOO. The + // Decoder's struct-layout control showed that a homogeneous + // repeated table type-checks at every field boundary, so an + // interior test carries no information about phase -- 69 of 70 + // records passed under BOTH shifted alignments of their dialog + // table. My falsifier (`+0x08 >= max keyframe time`) is an + // interior test of exactly that kind, and I re-ran it as + // "confirmation" without asking whether it discriminates the + // OFFSET or merely the file. + let len = u32::from_be_bytes(by[o + off..o + off + 4].try_into().unwrap()) as i64; let Some(lb) = ui_layout::parse_build(&by[o..o + s]) else { continue }; let maxt = lb.elements.iter() .flat_map(|el| el.keyframes.iter().filter_map(|k| k.time)) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 389016fe..15daa685 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -307 sections. Search this before re-deriving anything. +308 sections. Search this before re-deriving anything. * [P0 — the exporter, 2026-08-28](#p0--the-exporter-2026-08-28) * [P1 — Godot draws the screen, 2026-08-28](#p1--godot-draws-the-screen-2026-08-28) @@ -318,6 +318,7 @@ dies, which is what this file is for. * [🔴 My mechanism does not reproduce in my own corpus — measured, and it is refuted](#my-mechanism-does-not-reproduce-in-my-own-corpus--measured-and-it-is-refuted) * [The backfill: 17 was 12, and 12 is now 0](#the-backfill-17-was-12-and-12-is-now-0) * [🔴 Their record layout was wrong and I had copied it — fourth relayed aside](#their-record-layout-was-wrong-and-i-had-copied-it--fourth-relayed-aside) +* [🔴 My falsifier never identified the offset — the half I called a formality did](#my-falsifier-never-identified-the-offset--the-half-i-called-a-formality-did) ## P0 — the exporter, 2026-08-28 @@ -15165,3 +15166,47 @@ residue is old and whose recent rate is high, measured during the exchange that made the norm salient.** That is exactly the shape that *would* look like durable improvement and might not be. Worth re-measuring later — *"which is not a thing I would bet on"*. + +## 🔴 My falsifier never identified the offset — the half I called a formality did + +Their struct-layout control found that a homogeneous repeated table **type-checks +at every field boundary**, so an interior test carries no information about +phase — 69 of 70 records passed under *both* shifted alignments. Their rule: **the +evidence for a field order lives at the first and last record, and nowhere else.** + +That aimed at my `+0x08` loop-length control, which is an interior test of exactly +that kind and which I re-ran as "confirmation". Re-run at the neighbours: + +| offset | falsifier — never < max t | **exact — == max t** | +|---|---|---| +| `+0x04` | **0 violations — PASSES** | **0.0 %** | +| `+0x08` | 0 violations | **92.3 %** | +| `+0x0c` | 1 287 violations, 72 % | — | + +🔴 **The falsifier does not identify `+0x08`.** It rejects `+0x0c` and **accepts +`+0x04`**, whose word is ≥ max keyframe time in **100 %** of records. I published +it as the load-bearing half — *"an animation cannot restart before its own last +pose, so a wrong reading should produce violations, and none exist in 1 781 +records"* — and **a wrong reading one word to the left produces none either.** + +✅ **What identifies the offset is the half I described as merely guarding against +triviality:** `+0x08` equals the largest keyframe time **exactly** in 92.3 % of +records; `+0x04` does so in **0 %**. No unrelated word reproduces that +coincidence. + +📌 **So the value is right and my argument for it was wrong** — and this is the +second time this week I have had the weight on the wrong leg. Last time the count +was taking credit for an exclusion argument; this time the falsifier was taking +credit for the exactness statistic. **Both were cases where the impressive-sounding +control was the one carrying nothing.** + +⚠️ Their generalisation of the boundary rule does not transfer literally — a +per-record header has no first-and-last-record phase question — but the underlying +point does: **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.** + +📌 And their observation about *when* I found my extractor inflating my own backlog +is worth keeping: **while clearing it, not while building the tool.** Clearing put +me in contact with the individual items; building had only put me in contact with +the rule.