re: two fixed-code-under-unfixed-description hits in the crate the port pins

sylpheed-port named a pattern narrower than "docs go stale": a correct fix
sitting directly beneath a refuted description in the same file, within twenty
lines. Not drift -- editing at the point of failure without re-reading the frame
around it. Applied their grep (the vocabulary the OLD rule needed) to my crate
and found two.

ui_layout.rs:308, in rest_plateau's fallback: `continue; // the last frame
carries no time`. That is the pre-fix rule, on a branch that is now UNREACHABLE
-- measured at 0 untimed of 24 811 keyframes across 965 builds. Kept as a guard
because `time` is still Option<u32> and a malformed group could yield None, but
relabelled: it is no longer a description of the format.

ui_layout.rs:268, on the `lastall` rest override: "This is what the shifted time
reading predicts ... testing it against the captures is an independent check on
that reading." The shifted reading was refuted by the record-layout fix in the
same file. The override survives as a plain "take the last keyframe" diagnostic
alongside the documented `last` and `maxalpha`, and now says so.

Both corrections quote the original sentence so the change is visible rather than
silently overwritten -- the practice the port adopted from me this iteration.

Verified by artifact rather than by "it compiles": a comment-only edit must leave
output byte-identical, and the build-7 render's md5 is unchanged at
141771d8f1a2b3496cfd679c6cd45d1a.

METHOD records the pattern with the two greps that find it: the vocabulary of the
dead rule in code, and a HEDGE around something the current reader states exactly
in prose -- a "~0" marks where the old reader could not see.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
sylph-decoder
2026-08-30 17:57:30 +00:00
parent 66c3422dec
commit 8d43e16c6f
2 changed files with 38 additions and 6 deletions

View File

@@ -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<u32>` 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

View File

@@ -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.