diff --git a/crates/sylpheed-formats/src/ui_layout.rs b/crates/sylpheed-formats/src/ui_layout.rs index a789d5cf..e63fbc7d 100644 --- a/crates/sylpheed-formats/src/ui_layout.rs +++ b/crates/sylpheed-formats/src/ui_layout.rs @@ -265,11 +265,17 @@ impl Element { pub fn rest(&self) -> Option<&Keyframe> { // `lastall`: the LAST keyframe for every element, bypassing the plateau - // rule entirely. This is what the shifted time reading predicts — under - // it the final pose is reached at a definite time and nothing follows, - // so "rest" needs no heuristic. Testing it against the captures is an - // independent check on that reading, from static composites rather than - // from animation timing. + // rule entirely. + // + // ⚠️ ITS STATED PURPOSE IS RETIRED (corrected 2026-08-30). This comment + // read: "This is what the shifted time reading predicts — under it the + // final pose is reached at a definite time and nothing follows, so + // 'rest' needs no heuristic. Testing it against the captures is an + // independent check on that reading." The shifted reading was **refuted** + // by the record-layout fix above, so this override no longer checks + // anything about it. It survives only as a plain "take the last + // keyframe" diagnostic, alongside the documented `last` and `maxalpha` + // (see `docs/re/structures/ui-resting-pose.md`). if std::env::var("SYLPHEED_REST_RULE").as_deref() == Ok("lastall") { return self.keyframes.last(); } @@ -305,7 +311,16 @@ impl Element { let (Some(t0), Some(t1)) = (self.keyframes[k].time, self.keyframes[k + 1].time) else { - continue; // the last frame carries no time + // ⚠️ PRE-FIX COMMENT, corrected 2026-08-30. This read + // "the last frame carries no time", which was the rule + // BEFORE the record-layout fix directly above. Post-fix + // every pose is timed — measured at **0 untimed of + // 24 811 keyframes** across 965 builds — so this branch + // is unreachable on this disc. Kept as a guard because + // `time` is still `Option` and a malformed group + // could produce `None`; it is no longer a description of + // the format. + continue; }; let dwell = t1.saturating_sub(t0); // `>=`, not `>`: on a tie take the LATER frame. A group is diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 758c1b13..5a0719d1 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -452,6 +452,23 @@ agent's loop prompt, i.e. nowhere durable. See [`README.md`](README.md) for the actually establishes.** Docs are where a claim is *reasoned*; the tool is where it is *believed*. +* **Fixed code under an unfixed description — and the two are usually within + twenty lines of each other.** `sylpheed-port` named this and it is narrower and + more useful than "docs go stale": both of their hits were a *correct* fix sitting + directly beneath a *refuted* description in the same file, one of them written by + them two iterations earlier and never looked up at. **It is not drift. It is + editing at the point of failure without re-reading the frame around it.** + ⚠️ Two on this side, in the crate the port pins: `rest_plateau`'s fallback still + said *"the last frame carries no time"* — the pre-fix rule — on a branch now + unreachable (**0 untimed of 24 811 keyframes**), and `rest`'s `lastall` override + still described itself as *"an independent check on the shifted time reading"*, + a reading the fix above it **refuted**. + 📌 **The grep is the cheap part**: search for the vocabulary the *old* rule + needed — here `untimed`, `last frame`, `shifted reading` — because a description + that survived a fix still speaks the dead rule's language. **And the tell in a + document is a hedge around something the current reader states exactly**: a `~0` + or an "approximately" marks where the old reader could not see. + ## Runtime / emulator * **Look at the PNG** — and check its dimensions.