diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 98848aba..d83bc685 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -196 sections. Search this before re-deriving anything. +197 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) @@ -207,6 +207,7 @@ dies, which is what this file is for. * [🔴 CORRECTION: my backdrop predicate is exact in `GP_TITLE` and its reading was wrong](#correction-my-backdrop-predicate-is-exact-in-gp_title-and-its-reading-was-wrong) * [Sweeping my own `--help` and headers, after theirs](#sweeping-my-own---help-and-headers-after-theirs) * [`black_hold_units`: my own tripwire has tripped, and I am not resolving it alone](#black_hold_units-my-own-tripwire-has-tripped-and-i-am-not-resolving-it-alone) +* [Their sharpened tell, applied to my tree: two descriptions the code below had already refuted](#their-sharpened-tell-applied-to-my-tree-two-descriptions-the-code-below-had-already-refuted) ## P0 — the exporter, 2026-08-28 @@ -11055,3 +11056,54 @@ being settled by whichever error I find more comfortable. ✅ The value stays at **pending that**, and `verify-dwell` now reports the resulting shortfall explicitly instead of hiding it in slack, so the cost of leaving it is visible in the tool rather than only here. + +## Their sharpened tell, applied to my tree: two descriptions the code below had already refuted + +Their sweep cleared all three of my quoted figures — the splash dwell spans were +corrected today, and the 0.114–0.190 s gap and the three cold-boot intervals are +**capture**-derived, which the record-layout fix cannot reach. + +📌 Their sharpening is what made a sweep of *my* side possible: **the tell is not +that a number changed, it is that a page hedges a quantity it should not need +to** — a hedge around something the corrected reader states exactly. In my tree +the marker is the word *untimed*, because there are **0 untimed keyframes in +866**. Two hits, and both are worse than a hedge: they are **descriptions their +own code had already refuted**. + +### Hit A — a doc comment contradicting its own function + +`spin_period_units`' documentation stated the rule as *"the first timed and the +second untimed. The period is the first keyframe's declared `t`."* That is the +**pre-fix** rule. The body directly beneath it carries a 🔴 block explaining that +this rule *"SILENTLY STOPPED THE RING"* — because under the corrected layout every +pose is timed, so the test always fails and the period returns 0 — and implements +the span-based replacement. + +**A function and its documentation disagreeing, with the documentation stating the +refuted version.** Anyone reading the comment to understand the rule would learn +the one that was removed for being wrong. + +### Hit B — I made the correction and left the claim on top + +`exit_ramp_units`' documentation opened: *"Authored (`authored/timing.json`): the +disc has no time slot on that keyframe, so this is the one unknown duration per +screen."* Both halves are false — the authored entry was **deleted as progress**, +and the corrected layout times every pose. + +⚠️ **And I wrote the correction myself, immediately below it.** Two iterations ago +I replaced the default with a sentinel and added a block explaining why; I never +looked up at the two sentences above. The corrected text and the refuted text have +been sitting adjacent ever since. + +### The pattern, which is narrower than "docs go stale" + +Both hits are **fixed code under an unfixed description**, and in both the fix and +the falsehood are in the same file within twenty lines of each other. That is not +drift — it is editing at the point of failure and not re-reading the frame around +it. ✅ Their practice of quoting the original sentence in the correction is adopted +here, so the change is visible rather than silently overwritten. + +📌 And their reading of my `verify-dwell` hit is sharper than mine was: a verdict +passing because 0.15 s of slack exceeded the 0.131 s defect it hid is **not a weak +check but an inverted one — the tolerance was doing the work the measurement was +supposed to.** diff --git a/port/scripts/screen_view.gd b/port/scripts/screen_view.gd index 44201c2d..2cd09860 100644 --- a/port/scripts/screen_view.gd +++ b/port/scripts/screen_view.gd @@ -37,9 +37,15 @@ var pose_mode: Pose = Pose.TIMELINE var time_units: float = 0.0 var units_per_second: float = 60.0 -## Duration of the ramp into the final, untimed keyframe -- the screen playing -## itself out. Authored (`authored/timing.json`): the disc has no time slot on -## that keyframe, so this is the one unknown duration per screen. +## Duration of the ramp into a final UNTIMED keyframe -- a shape this export no +## longer contains (866 keyframes across 16 screens, **0** untimed). +## +## 🔴 THE TWO SENTENCES THAT WERE HERE ARE PRE-FIX AND I LEFT THEM WHEN I FIXED +## THE CODE BELOW. They read: *"Authored (`authored/timing.json`): the disc has no +## time slot on that keyframe, so this is the one unknown duration per screen."* +## Both halves are now false — the authored entry was DELETED as progress, and +## the corrected record layout times every pose, so there is no unknown to +## author. The correction lived immediately below while the claim stayed on top. ## Synthetic duration for a group's final UNTIMED keyframe. ## ## 🔴 NEGATIVE MEANS "NOT SUPPLIED", AND THAT IS NOW THE DEFAULT. It used to @@ -376,8 +382,16 @@ static func settle_units(element: Dictionary) -> float: ## How long one turn takes, in keyframe units, for an element that spins — or 0. ## ## The rule is STRUCTURAL and narrow: exactly two keyframes, differing in -## **nothing but** `rotation_deg`, by a full 360, with the first timed and the -## second untimed. The period is the first keyframe's declared `t`. +## **nothing but** `rotation_deg`, by a full 360. The period is the SPAN between +## the two poses. +## +## 🔴 THIS PARAGRAPH DESCRIBED THE PRE-FIX RULE WHILE THE BODY BELOW IMPLEMENTED +## THE CORRECTED ONE. It read: *"with the first timed and the second untimed. The +## period is the first keyframe's declared `t`."* Under the corrected record +## layout every pose is timed, so `b.has("t")` is always true, that rule returns +## 0, and the ring stops spinning — which is exactly the failure the body's own +## comment records and fixes. A doc comment and its function contradicting each +## other, with the doc stating the refuted version. ## ## Its disc-wide check, over this export: **16 of 212 elements match, and all 16 ## are focus rings** — `ptbtneff01` on the five main-menu buttons and