diff --git a/authored/timing.json b/authored/timing.json index c236c9ce..882d63e2 100644 --- a/authored/timing.json +++ b/authored/timing.json @@ -1,199 +1,171 @@ { - "format": "sylpheed.timing/1", - "keyframe_units_per_second": 60, - "why": [ - "HANDOFF Q1. The disc says a keyframe is at `t=30`; it does not say what a", - "`t` is. The unit was MEASURED off the running game, not decoded: a declared", - "15-unit fade lands on round(255*k/15) for all seven of its samples with k", - "stepping 2,4,6,8,10,12,14 on seven consecutive submitted frames -- so 2", - "units per rendered frame -- and the idle title presents at 28.3-28.8 fps,", - "a 30 Hz game, giving 60 units per second. A second line agrees: the", - "transition quad is declared black for 12 units, and a capture measured the", - "pure-black plateau at 0.17-0.23 s, where 12/60 = 0.20 s.", - "", - "Expressed as units-per-second rather than seconds-per-unit so the value is", - "exact rather than a repeating decimal a reader has to recognise.", - "", - "DELETE THIS FILE when a field on the disc is found that states the unit.", - "Nothing here is on the disc.", - "", - "🔴 DO NOT 'CORRECT' THIS AGAINST AN EMULATOR FRAME RATE. A draw-stream", - "measurement on 2026-08-29 found the presented units-per-frame rising 33 % over", - "a single boot (1.765 early, 2.357 late) and three independent readings of one", - "container's rate disagreeing with each other. That is the EMULATOR's", - "presentation pacing drifting, and no single units-per-frame figure describes a", - "run there.", - "", - "60 is a different quantity: the GAME's logical unit rate, measured off the", - "running game as HANDOFF Q1 (a declared t=30 landing on the linear value at", - "every one of seven sampled frames). The port renders at its own frame rate and", - "converts through this constant, so guest pacing cannot reach it. The two", - "numbers are not comparable and one is not evidence about the other." - ], - "kind": "measured", - "source": "/reborn docs/port/HANDOFF.md Q1, docs/re/ui-keyframe-time-unit.md", - "ramp": "linear", - "ramp_why": [ - "Also HANDOFF Q1, and part of the same measurement: the fade lands on the", - "linear value at every one of the seven sampled frames, so there is no ease." - ], - "dwell_seconds": null, - "dwell_why": [ - "NOT SET -- because the dwell is DECLARED, and the port already plays it.", - "", - "This key has now been wrong in two opposite directions, and the second was", - "mine, so both are recorded.", - "", - "It first said 'a screen's dwell is its OWN keyframe group'. Then GP_TITLE", - "build 4 was measured dwelling ~1100 presented frames against a declared ~120,", - "and I generalised that into 'the boot is KNOWN TOO FAST on both splashes'.", - "🔴 THAT WAS AN OVER-CORRECTION and it is withdrawn. Build 4 is the title: its", - "exit is caused by something outside its timeline, so it holds. A splash's exit", - "is caused by nothing, so it plays its declared timeline and leaves. The title", - "is the exception, not the rule, and one screen was never enough to overturn", - "the other two.", - "", - "MEASURED 2026-08-29 by the Decoder over 3 cold boots", - "(docs/re/structures/boot-splash-dwells-are-declared.md):", - "", - " publisher declared t=0..255 = 4.250 s corpus 4.30 / 4.60 / 4.37", - " developer declared t=0..210 = 3.500 s corpus 3.51 / 3.50 / 3.37", - "", - "The developer agrees to 1.1 %, two of its three runs to 0.3 %. The port emits", - "4.400 s and 3.650 s -- each declared value plus the 9-unit black hold, exactly.", - "So the pacing was right all along and nothing changes in the code.", - "", - "🔴 AND THE UNIT STAYS UNITS, NOT SECONDS. The same two dwells timed in the", - "Decoder's own container came out 15-20 % LONGER than both the declared values", - "and the corpus -- same disc, same timeline -- and three independent readings", - "of that container's rate disagree with each other. A seconds figure records", - "one emulator's pacing on one run. The units are on the disc. If anything ever", - "goes in `dwell` it is an extra hold in UNITS, and only for a screen that is", - "measured to wait beyond its group." - ], - "looping_focus_records": { - "_": [ - "WHICH focus records the port draws, unconditionally and on a loop, OVER the", - "element's own sprite rather than instead of it.", - "", - "RESTORED 2026-08-30 on a MEASUREMENT, having been deleted on 2026-08-29 for", - "a real defect that was in the RENDERER, not in this table. The old entry made", - "`_draw` substitute the glow for the plate's own bright sprite, so the plate", - "was invisible at every instant (max 0 against max 252.5). `ScreenView` now", - "draws the base and the record over it, and the entry comes back." + "format": "sylpheed.timing/1", + "keyframe_units_per_second": 60, + "why": [ + "HANDOFF Q1. The disc says a keyframe is at `t=30`; it does not say what a", + "`t` is. The unit was MEASURED off the running game, not decoded: a declared", + "15-unit fade lands on round(255*k/15) for all seven of its samples with k", + "stepping 2,4,6,8,10,12,14 on seven consecutive submitted frames -- so 2", + "units per rendered frame -- and the idle title presents at 28.3-28.8 fps,", + "a 30 Hz game, giving 60 units per second. A second line agrees: the", + "transition quad is declared black for 12 units, and a capture measured the", + "pure-black plateau at 0.17-0.23 s, where 12/60 = 0.20 s.", + "", + "Expressed as units-per-second rather than seconds-per-unit so the value is", + "exact rather than a repeating decimal a reader has to recognise.", + "", + "DELETE THIS FILE when a field on the disc is found that states the unit.", + "Nothing here is on the disc.", + "", + "🔴 DO NOT 'CORRECT' THIS AGAINST AN EMULATOR FRAME RATE. A draw-stream", + "measurement on 2026-08-29 found the presented units-per-frame rising 33 % over", + "a single boot (1.765 early, 2.357 late) and three independent readings of one", + "container's rate disagreeing with each other. That is the EMULATOR's", + "presentation pacing drifting, and no single units-per-frame figure describes a", + "run there.", + "", + "60 is a different quantity: the GAME's logical unit rate, measured off the", + "running game as HANDOFF Q1 (a declared t=30 landing on the linear value at", + "every one of seven sampled frames). The port renders at its own frame rate and", + "converts through this constant, so guest pacing cannot reach it. The two", + "numbers are not comparable and one is not evidence about the other." ], - "press_start/ptbtn00": { - "record_element": "ptbtn00f", - "period_units": 120, - "kind": "measured", - "source": "docs/re/structures/plate-pulse-measured.md, RE agent 2026-08-30", - "why": [ - "MEASURED off the running game, held at the title with NO INPUT: the plate", - "oscillates continuously -- two windows in one boot of 58 s and 57 s, about", - "23 cycles each, with no decay and no settling.", + "kind": "measured", + "source": "/reborn docs/port/HANDOFF.md Q1, docs/re/ui-keyframe-time-unit.md", + "ramp": "linear", + "ramp_why": [ + "Also HANDOFF Q1, and part of the same measurement: the fade lands on the", + "linear value at every one of the seven sampled frames, so there is no ease." + ], + "dwell_seconds": null, + "dwell_why": [ + "NOT SET -- because the dwell is DECLARED, and the port already plays it.", "", - "🔴 IT NEVER GOES OFF. The plate-absent floor is 159 thresholded green", - "pixels -- the title art's own, measured on live-title-build4-no-plate.png --", - "and the pulse bottoms at 714, four and a half times that. So `ptbtn00`", - "going transparent at t=244 is not the end of the plate; that is its EXIT", - "ramp, which plays when the screen leaves. While the screen is held the base", - "sits at its own hold (alpha 255 at t=238) and `ptbtn00f`'s cycle runs over", - "it. Base-only and base-plus-glow are what the 714 and the 1520 are.", + "This key has now been wrong in two opposite directions, and the second was", + "mine, so both are recorded.", "", - "⚠️ 120 UNITS, NOT SECONDS, and that is the RE agent's own instruction. Their", - "run measured 2.530 and 2.540 s; an earlier corpus run measured 2.24 s. Same", - "declared number, different emulator pacing -- x1.27 and x1.12 against a", - "nominal 2.000 s, which IS 120 units at 60 units/s. Hardcoding 2.5 s would", - "author one loaded container's clock." - ], - "limits": [ - "ONE BOOT. Two windows inside it are not two boots.", - "It does NOT distinguish the boot title from an attract-loop title: run 1", - "opens at t~255 s against Q9's ~193 s no-input baseline, so it may already", - "be the attract title. Both are 'the title, held, no input' -- which is what", - "was asked -- but it is not proof about the first appearance.", - "🔴 714/1520 IS NOT AN ALPHA RATIO. The counter is thresholded pixels, so dim", - "pixels drop out first. No duty cycle and no ramp shape may be read off it;", - "the port draws the record's own declared alpha ramp and infers nothing." - ] - } - }, - "exit_ramp_deleted_why": [ - "DELETED 2026-08-29, and the deletion is the point.", - "", - "`exit_ramp_seconds` (~0.4 s) and `exit_ramp_units` (24) were AUTHORED because", - "the disc had no time slot on a group's final keyframe, so the ramp into it was", - "the one unknown duration per screen. Under the corrected record layout", - "(formats-pin-2026-08-29c onward) there IS no untimed keyframe -- a group is an", - "8-byte header then frames x {u32 time; 36-byte pose}, so every pose is timed", - "including the last. The unknown the constant stood in for does not exist.", - "", - "MISSION section 3: 'When the RE agent later decodes something you had", - "authored, delete the authored entry and let the exporter emit it. That", - "deletion is the measure of progress.'", - "", - "VERIFIED DEAD BEFORE DELETING, not assumed: setting it to 9999 (166 seconds)", - "changed the boot's transitions by 0.04 s -- wall-clock jitter, not a 166 s", - "ramp. Both of its uses in ScreenView were gated on `not last_frame.has('t')`,", - "which no longer fires on any of the export's 866 keyframes.", - "", - "The measurement it recorded is not lost: HANDOFF Q7's ~0.4 s fade-out and the", - "0.17-0.23 s black hold are still measured facts, and the hold is still used --", - "`tools/port/verify-dwell` compares a transition INTERVAL against the oracle's", - "visible SPAN plus that hold. What is deleted is the port's need to invent a", - "duration the disc now states." - ], - "black_hold_units": 9, - "black_hold_why": [ - "MEASURED IN THE DRAW STREAM, 9 units — and 🟡 SOFTER THAN IT LOOKS. Read the", - "audit below before quoting it. The VALUE IS UNCHANGED because changing it", - "would be my arithmetic on somebody else's instrument; the change is what may", - "be claimed for it.", - "", - "AUDIT 2026-08-29, prompted by the Decoder disclosing that `ARM=early` silently", - "loses its trigger ~40 % of the time, so their draw-stream runs are n = 1 each.", - "Three things this constant rests on have moved since it was authored:", - "", - "1. 🔴 THE CONVERSION USED A FRAME COUNT THEY HAVE SINCE CORRECTED. 9 came from", - " 2.284 units/frame = `palogo_sqex`'s declared span over 105 drawn frames.", - " Their batched-draw truncation fix revised that span to frames 6…119 = 114,", - " which gives 2.096 — the same declared 239 units over 9 more frames.", - "2. 🔴 ITS SECOND CORROBORATION WAS WITHDRAWN. '2.231 from the title capture'", - " is the figure behind their retracted 114-unit plate period: it was", - " regressed over the build-in, where the top-level clock advances, and does", - " not describe the transition.", - "3. 🔴 NO SINGLE UNITS-PER-FRAME FIGURE DESCRIBES A RUN. The presented rate", - " rises 33 % across one boot (1.765 → 2.357). A run-average conversion is", - " the wrong shape for a 3-4 frame event; the LOCAL rate is what applies.", - "", - "Redone with their corrected segments (publisher-late 2.165, developer-early", - "2.308 bracket the gap):", - "", - " 4-frame gap (their 1st run) -> 8.66 - 9.23 units (mid 8.95)", - " 3-frame gap (their 2nd run) -> 6.50 - 6.92 units (mid 6.71)", - "", - "⚠️ Those two runs were reconciled as 'the 3-frame gap replicates the 4-frame", - "one within the ±1 both are quantised to, so ~9 stands'. OVERLAPPING ERROR BARS", - "ARE NOT AGREEING CENTRAL VALUES: one frame is a third of this quantity, and", - "the midpoints are 8.95 and 6.71. The honest range is ~6.5-9.2 units and the", - "port sits at the TOP of it.", - "", - "What is NOT in doubt, and is why 9 is still better than what preceded it: the", - "hold is REAL and was missing entirely until 2026-08-29. Filmed at 0.05 s the", - "port had NO BLACK FRAME AT ALL where the oracle measures a plateau. A value", - "at the top of a plausible range beats a fifth of a second of missing black.", - "", - "Both boundary frames still carry picture — alpha 7 and 34 — and are counted as", - "black, so the true hold is shorter than whatever number this lands on.", - "", - "PRIOR REASONING, kept: the draw stream beats luminance here because luminance", - "cannot separate the outgoing fade's tail from true black. It disagrees with", - "HANDOFF Q7's 0.17-0.23 s plateau (12 units), which is a different screen's", - "transition quad on a different path -- the boot splashes carry none, since", - "`palogo_eff0` is one static keyframe. A number that fits by analogy loses to", - "one measured in place, and that reasoning survives this audit intact.", - "", - "Delete this the day a screen's own transition quad supplies it on the boot", - "path too." - ] + "It first said 'a screen's dwell is its OWN keyframe group'. Then GP_TITLE", + "build 4 was measured dwelling ~1100 presented frames against a declared ~120,", + "and I generalised that into 'the boot is KNOWN TOO FAST on both splashes'.", + "🔴 THAT WAS AN OVER-CORRECTION and it is withdrawn. Build 4 is the title: its", + "exit is caused by something outside its timeline, so it holds. A splash's exit", + "is caused by nothing, so it plays its declared timeline and leaves. The title", + "is the exception, not the rule, and one screen was never enough to overturn", + "the other two.", + "", + "MEASURED 2026-08-29 by the Decoder over 3 cold boots", + "(docs/re/structures/boot-splash-dwells-are-declared.md):", + "", + " publisher declared t=0..255 = 4.250 s corpus 4.30 / 4.60 / 4.37", + " developer declared t=0..210 = 3.500 s corpus 3.51 / 3.50 / 3.37", + "", + "The developer agrees to 1.1 %, two of its three runs to 0.3 %. The port emits", + "4.400 s and 3.650 s -- each declared value plus the 9-unit black hold, exactly.", + "So the pacing was right all along and nothing changes in the code.", + "", + "🔴 AND THE UNIT STAYS UNITS, NOT SECONDS. The same two dwells timed in the", + "Decoder's own container came out 15-20 % LONGER than both the declared values", + "and the corpus -- same disc, same timeline -- and three independent readings", + "of that container's rate disagree with each other. A seconds figure records", + "one emulator's pacing on one run. The units are on the disc. If anything ever", + "goes in `dwell` it is an extra hold in UNITS, and only for a screen that is", + "measured to wait beyond its group." + ], + "looping_focus_records": { + "_": [ + "WHICH focus records the port draws, unconditionally and on a loop, OVER the", + "element's own sprite rather than instead of it.", + "", + "RESTORED 2026-08-30 on a MEASUREMENT, having been deleted on 2026-08-29 for", + "a real defect that was in the RENDERER, not in this table. The old entry made", + "`_draw` substitute the glow for the plate's own bright sprite, so the plate", + "was invisible at every instant (max 0 against max 252.5). `ScreenView` now", + "draws the base and the record over it, and the entry comes back." + ], + "press_start/ptbtn00": { + "record_element": "ptbtn00f", + "period_units": 120, + "kind": "measured", + "source": "docs/re/structures/plate-pulse-measured.md, RE agent 2026-08-30", + "why": [ + "MEASURED off the running game, held at the title with NO INPUT: the plate", + "oscillates continuously -- two windows in one boot of 58 s and 57 s, about", + "23 cycles each, with no decay and no settling.", + "", + "🔴 IT NEVER GOES OFF. The plate-absent floor is 159 thresholded green", + "pixels -- the title art's own, measured on live-title-build4-no-plate.png --", + "and the pulse bottoms at 714, four and a half times that. So `ptbtn00`", + "going transparent at t=244 is not the end of the plate; that is its EXIT", + "ramp, which plays when the screen leaves. While the screen is held the base", + "sits at its own hold (alpha 255 at t=238) and `ptbtn00f`'s cycle runs over", + "it. Base-only and base-plus-glow are what the 714 and the 1520 are.", + "", + "⚠️ 120 UNITS, NOT SECONDS, and that is the RE agent's own instruction. Their", + "run measured 2.530 and 2.540 s; an earlier corpus run measured 2.24 s. Same", + "declared number, different emulator pacing -- x1.27 and x1.12 against a", + "nominal 2.000 s, which IS 120 units at 60 units/s. Hardcoding 2.5 s would", + "author one loaded container's clock." + ], + "limits": [ + "ONE BOOT. Two windows inside it are not two boots.", + "It does NOT distinguish the boot title from an attract-loop title: run 1", + "opens at t~255 s against Q9's ~193 s no-input baseline, so it may already", + "be the attract title. Both are 'the title, held, no input' -- which is what", + "was asked -- but it is not proof about the first appearance.", + "🔴 714/1520 IS NOT AN ALPHA RATIO. The counter is thresholded pixels, so dim", + "pixels drop out first. No duty cycle and no ramp shape may be read off it;", + "the port draws the record's own declared alpha ramp and infers nothing." + ] + } + }, + "exit_ramp_deleted_why": [ + "DELETED 2026-08-29, and the deletion is the point.", + "", + "`exit_ramp_seconds` (~0.4 s) and `exit_ramp_units` (24) were AUTHORED because", + "the disc had no time slot on a group's final keyframe, so the ramp into it was", + "the one unknown duration per screen. Under the corrected record layout", + "(formats-pin-2026-08-29c onward) there IS no untimed keyframe -- a group is an", + "8-byte header then frames x {u32 time; 36-byte pose}, so every pose is timed", + "including the last. The unknown the constant stood in for does not exist.", + "", + "MISSION section 3: 'When the RE agent later decodes something you had", + "authored, delete the authored entry and let the exporter emit it. That", + "deletion is the measure of progress.'", + "", + "VERIFIED DEAD BEFORE DELETING, not assumed: setting it to 9999 (166 seconds)", + "changed the boot's transitions by 0.04 s -- wall-clock jitter, not a 166 s", + "ramp. Both of its uses in ScreenView were gated on `not last_frame.has('t')`,", + "which no longer fires on any of the export's 866 keyframes.", + "", + "The measurement it recorded is not lost: HANDOFF Q7's ~0.4 s fade-out and the", + "0.17-0.23 s black hold are still measured facts, and the hold is still used --", + "`tools/port/verify-dwell` compares a transition INTERVAL against the oracle's", + "visible SPAN plus that hold. What is deleted is the port's need to invent a", + "duration the disc now states." + ], + "black_hold_units": 0, + "black_hold_why": [ + "0, AND THAT IS NOT 'RIGHT' -- IT IS THE VALUE THAT INVENTS NOTHING.", + "", + "This was 9 units, measured in the draw stream. The Decoder has now measured", + "the black gap on THREE transitions off the running game and it is not a", + "constant: menu->title 0 units, title->menu 4, EXTRAS->menu 6. Not a", + "per-button property, not a per-direction property. Their recommendation is to", + "treat this as unauthored rather than uniform-at-9.", + "", + "9 was outside the measured range entirely -- wrong for all three, by +9, +5", + "and +3, i.e. up to a sixth of a second of black the game does not show.", + "", + "WHY 0 AND NOT 4. A uniform 4 minimises total error across the three samples", + "(6 units against 0's 10). That is FITTING THREE SAMPLES, and a fit chosen for", + "its residual is the thing this corpus keeps having to withdraw. 0 has a", + "reason that is not a fit: it adds no black the game does not have, which is", + "the same tie-breaker `input_during_transition` already uses in this file --", + "the choice that invents the least. It is also measured-CORRECT for one real", + "transition, which no other uniform value beats on principle.", + "", + "The error is now a MISSING gap of at most 6 units on two transitions rather", + "than an INVENTED one of up to 9 on all three. Delete this entry the day the", + "rule is known; the Decoder cannot state it yet and neither can I." + ] } diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 823d4961..8a95edf6 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -164 sections. Search this before re-deriving anything. +166 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) @@ -175,6 +175,8 @@ dies, which is what this file is for. * [`check-all` passes — after an hour-long hang that was the suite's own fault](#check-all-passes--after-an-hour-long-hang-that-was-the-suites-own-fault) * [Ⓐ and Ⓑ are not the same shape, and my `black_hold` treats them as if they were](#and--are-not-the-same-shape-and-my-black_hold-treats-them-as-if-they-were) * [🔴 `check-all` excused two failing rows with a reason that is measurably false](#check-all-excused-two-failing-rows-with-a-reason-that-is-measurably-false) +* [`black_hold_units` 9 → 0, and why not the value that fits best](#black_hold_units-9--0-and-why-not-the-value-that-fits-best) +* ["Already up to date" is not evidence that I am current](#already-up-to-date-is-not-evidence-that-i-am-current) ## P0 — the exporter, 2026-08-28 @@ -9465,3 +9467,73 @@ The pin reminder survives as its own line, and now reads the tag **out of This one had been true once — the monorepo merge made the exporter and the reference share a decoder, and the tag pin quietly unmade that — and it kept being printed long after it stopped describing the tree. + +## `black_hold_units` 9 → 0, and why not the value that fits best + +The Decoder measured the black gap on **three** transitions off the running game. +It is not a constant: + +| transition | measured gap | my hold of 9 | +|---|---|---| +| menu → title | **0 units** | +9 | +| title → menu | 4 | +5 | +| EXTRAS → menu | 6 | +3 | + +🔴 **9 was outside the measured range entirely** — wrong for all three, by up to a +sixth of a second of black the game does not show. Their recommendation is to +treat it as unauthored rather than uniform-at-9. + +⚠️ **I did not take the value that fits best.** A uniform **4** minimises total +error (6 units against 0's 10). That is fitting three samples, and a constant +chosen for its residual is exactly what this corpus keeps having to withdraw. **0 +has a reason that is not a fit:** it adds no black the game does not have — the +same tie-breaker `input_during_transition` already uses in this file — and it is +measured-*correct* for one real transition. The error becomes a **missing** gap of +at most 6 units on two transitions rather than an **invented** one of up to 9 on +all three. + +✅ The verified boot artifact survives: the end frame is still **0.0009 %** +differing against the oracle, unchanged within printing precision. + +📌 And their EXTRAS run vindicates the refusal. "Ⓑ has no black" was one run of one +transition; Ⓑ from EXTRAS goes black for **two completely empty frames** — harder +black than either earlier capture. Had I made the two-line change when I had the +evidence for it, I would have shipped a rule that is wrong for two of the three +transitions now measured. + +### The declared final ramp, confirmed from my side + +They report the outgoing ramp is the declared final ramp **three for three** +against three different values. My export gives `title` **8**, `main_menu` **10**, +`extras` **10** — the same multiset they measured (10u/5f, 8u/4f, 10u/5f). ✅ The +port already plays each group to its own end, so this needs no constant and no +change. + +### 🔴 `exit_ramp_units` is dead code carrying the number I refused to author + +`ScreenView.exit_ramp_units` defaults to **24.0** — the very constant HANDOFF ask +2 told me to author and that I declined. It synthesises a time for a group's +*untimed* final keyframe. + +**There are no untimed keyframes.** 866 across all 16 screens, **0** untimed. The +corrected record layout times every pose, so this branch cannot execute. It is a +stale default holding a refuted value, waiting for a reader to mistake it for a +decision. + +## "Already up to date" is not evidence that I am current + +The Decoder found `origin/main` is the **stale** era. Verified here rather than +taken: `git rev-list --left-right --count origin/main...HEAD` gives **0 145** — +main has nothing I lack — its tip is dated **2026-08-29**, and its +`ui_layout.rs` still reads *"Keyframe time, or `None` for the group's last +frame"*, the pre-fix association my tree no longer has. + +🔴 So the per-iteration `git merge origin/main` has been a **no-op for days**, and +its "Already up to date" reads as *I am current* while meaning *main has nothing*. +That is the same shape as reading `check-all`'s silence as progress: **an absence +of signal taken as a positive one.** + +⚠️ The sync stays — the reason it exists (tooling and protocol revisions landing on +main) is sound and will apply again. What changes is that its output is not +reassurance. And my `Cargo.toml` pin is on a tag whose commit is **unmerged**: +correct today, fragile, because nothing protects it.