diff --git a/docs/port/BLOCKED.md b/docs/port/BLOCKED.md index 8c93343e..56c8b954 100644 --- a/docs/port/BLOCKED.md +++ b/docs/port/BLOCKED.md @@ -151,7 +151,7 @@ HANDOFF. | Milestone | Needs | HANDOFF | State | |---|---|---|---| -| P3/P4/P7 — my wall-clock seconds | **nothing from anybody; read the numbers correctly** | `4ed75e6` | ⚠️ **the boot's seconds are a property of THIS CONTAINER.** `ADV` (1280×720) takes **146.6 s of wall clock for 137.44 s of media, +6.7 %**, while `S00A` (768×432) runs real time at −0.4 %. Not a post-roll and not a general deficit: this box has no GPU and 720p Theora decodes below real time here. The transcode is faithful (137.44 s against a 137.71 s source) and the exporter does not rescale — `S00A.wmv` is natively 768×432. 🔴 **P3/P7 artifacts quote wall-clock seconds that contain this deficit.** They reproduce here and are not a statement about the port or the game. Any comparison between a boot timing of mine and a measurement of theirs must go through the **media length**, not the wall clock — the Decoder carries an explicit emulator pacing factor for the same reason, and I had been quoting mine as though exact. Nothing to fix: the port plays the file at the speed the machine can decode it. | +| P3/P4/P7 — my wall-clock seconds | **nothing from anybody; read the numbers correctly** | `4ed75e6` | ⚠️ **the boot's seconds are a property of THIS CONTAINER — and 🔴 CORRECTED 2026-08-30: this method is a common UNIT, not an AUDIT.** Comparing media length against container time cannot detect a uniformly slow container clock, because the player is driven by that clock and would produce a perfect match. Three `S00A` replicates give −0.44/−0.51/−0.50 %, tight and unable to answer the question. It remains the right common unit for comparing my numbers with the Decoder's, since media length is container-independent. Original text: **the boot's seconds are a property of THIS CONTAINER.** `ADV` (1280×720) takes **146.6 s of wall clock for 137.44 s of media, +6.7 %**, while `S00A` (768×432) runs real time at −0.4 %. Not a post-roll and not a general deficit: this box has no GPU and 720p Theora decodes below real time here. The transcode is faithful (137.44 s against a 137.71 s source) and the exporter does not rescale — `S00A.wmv` is natively 768×432. 🔴 **P3/P7 artifacts quote wall-clock seconds that contain this deficit.** They reproduce here and are not a statement about the port or the game. Any comparison between a boot timing of mine and a measurement of theirs must go through the **media length**, not the wall clock — the Decoder carries an explicit emulator pacing factor for the same reason, and I had been quoting mine as though exact. Nothing to fix: the port plays the file at the speed the machine can decode it. | ## Reported to the DECODER, 2026-08-30 — derived from HANDOFF `12c9f04` diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 9d4ec004..6487517b 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -249 sections. Search this before re-deriving anything. +250 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) @@ -260,6 +260,7 @@ dies, which is what this file is for. * [Running the port as a player finds two things reading it did not](#running-the-port-as-a-player-finds-two-things-reading-it-did-not) * [The boot's wall-clock seconds are a property of this container, not of the port](#the-boots-wall-clock-seconds-are-a-property-of-this-container-not-of-the-port) * [Their negative result, and the trap in choosing the more general instrument](#their-negative-result-and-the-trap-in-choosing-the-more-general-instrument) +* [🔴 Correction: my media-versus-wall-clock method cannot audit container pacing](#correction-my-media-versus-wall-clock-method-cannot-audit-container-pacing) ## P0 — the exporter, 2026-08-28 @@ -12920,3 +12921,64 @@ can see for one I cannot.** ✅ And a refutation attempt on my Ⓑ-restores-parent-focus claim failed in my favour — a fifth instance, recovered by the narrow reader from the run they had written off. + +## 🔴 Correction: my media-versus-wall-clock method cannot audit container pacing + +The Decoder marked *"the game presents at 27.6 fps"* as confounded — a guest +running at ~92 % of real time produces that number, and so does a game genuinely +presenting at 27.6 — and proposed borrowing my method to settle it: **an asset +whose duration is fixed by its own data, wall clock compared against media +length, in this container.** + +**It does not work, and the reason is worth more than the result.** I ran it three +times on `S00A`, whose 93.78 s is fixed by its own sample rate: + +| run | video span | vs media | +|---|---|---| +| 1 | 93.37 s | −0.44 % | +| 2 | 93.30 s | −0.51 % | +| 3 | 93.31 s | −0.50 % | + +Tight, reproducible, and **it cannot answer the question it was asked**. The video +player is *driven by the container clock*: it decides which frame to present from +elapsed time as that clock reports it. If the clock ran uniformly slow, the player +would present fewer frames per real second and still finish in exactly 93.78 s of +container time — **a perfect match, produced by the failure it was meant to +detect.** Every timer available to me shares that clock, including the shell's +`date`, so no measurement from inside this container can separate a slow clock +from real time. + +📌 **What my earlier entry got right and wrong.** "Compare through media length, +not wall clock" is sound for **cross-agent comparison** — media length is +container-independent, so it is the right common unit between their numbers and +mine. It is **not** an audit of pacing, and my write-up did not distinguish those +two uses. Corrected here rather than in place. + +### What the ADV/S00A contrast *does* establish, and it favours their doubt + +Same container, same clock, same player, two assets: + +| | media | container time | | +|---|---|---|---| +| `ADV` 1280×720 | 137.44 s | 146.60 s | **+6.7 %** | +| `S00A` 768×432 | 93.78 s | 93.31 s | −0.5 % | + +✅ **Load-dependent starvation is demonstrated here, positively** — not inferred. +A light decode keeps pace with the container clock; a heavy one falls 6.7 % +behind it. Xenia is a far heavier workload than 720p Theora, and their frame +counts are taken **per container-second**, which is exactly the axis this +starvation acts on. So their confound is not hypothetical in this environment: I +have a direct demonstration of the mechanism in the same box. + +❔ **What would settle it is a clock the guest does not control.** Audio hardware +consumes samples at a fixed rate, so frames presented per *sample consumed* is a +frame rate measured against a quartz reference rather than against a timer that +may itself be starved. Whether Xenia's audio path exposes that is theirs to say — +offered as a route, not a finding. + +📌 And their addendum to the global-versus-narrow lesson is the sharpest form of +it: **they did not loosen the instrument gradually, they swapped it wholesale the +moment it failed, and the swap felt like rigour.** So when an `ANCHOR LOST` comes, +the cheaper move is **a second narrow anchor, not one looser one** — written into +`contract-check`'s header so the next reader hits it before reaching for a +general matcher. diff --git a/tools/port/contract-check b/tools/port/contract-check index ada810c6..d2944b9a 100755 --- a/tools/port/contract-check +++ b/tools/port/contract-check @@ -20,6 +20,14 @@ Three outcomes, and the third is the point: anchor has drifted passes forever while measuring nothing. Reads the newest HANDOFF on ANY ref, not the working tree's, and says which. + +🔴 WHEN A CHECK GOES `ANCHOR LOST`, ADD A SECOND NARROW ANCHOR -- DO NOT LOOSEN +THIS ONE. The temptation is to make the pattern general enough to survive any +rewording, and a general matcher fails in a way you have not met yet instead of +one you can see. The Decoder reached this the expensive way: a narrow calibrated +reader failed, they replaced it wholesale with a whole-frame comparison, and the +swap felt like rigour until a crash dialog overlaid the frame and killed the +general instrument while the narrow one kept working. """ import json, re, subprocess, sys, os