Files
Sylpheed/docs/re/clock-is-frame-based-one-unit-per-present.md
sylph-decoder 705a8485dc re: the clock is FRAME-based, 1 unit per present -- my own test refuted my claim
Ran --framerate_limit=30 against predictions committed beforehand. Every
discriminating row went to the frame-based column:

                       frame-based   time-based (mine)   measured
  presents/s           ~27           ~27                 28.4
  modal alpha step     17 unchanged  34 doubled          17 UNCHANGED
  units/s              ~30 halved    ~60 unchanged       30.2 / 30.3
  publisher dwell      ~8.5 s        ~4.2 s              8.450 s DOUBLED
  developer dwell      ~7.0 s        ~3.5 s              6.923 s DOUBLED

Both controls passed first. The limiter took effect (28.4 presents/host-s
against 51-55, interval mass moving from one 60 Hz vblank to two, 422 of
468), and all 8/8 splash quad rects are identical so nothing but the frame
rate differs.

So the UI clock advances exactly 1 unit per presented frame. The step is 17
on every quad at 28.4, 51.4 and 54.8 presents/s, and 255*1/15 = 17 with the
declared T=15. units/second = presents/second, and seconds are not a
property of the game.

The port's 60 stands: the guest presents once per 60 Hz vblank
unconstrained, and 1 unit per present at 60/s is 60 units/s. Same answer as
my first position, finally with a tested mechanism instead of an inference.

This withdraws units-per-frame-is-not-a-constant.md in its central claim.
My "a time-based clock is immune to dropped frames so the dwell is stable"
was a real prediction and it failed -- the dwell doubled. The four-run
agreement I read as evidence was four runs at similar frame rates.

h3-units-per-frame-measured.md's +34 is now the anomaly rather than the
rule: 34 per label at 27.2 labels/s against 17 per present at 28.4
presents/s. Both cannot be presents. Not asserting it is wrong, only that
one of them must explain the disagreement.

Three of my four positions came from inference over a measured quantity;
this one came from changing an input and watching what moved. The
opportunistic comparison pointed exactly the wrong way because nothing
controlled what else differed between those captures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-01 19:39:30 +00:00

92 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✅ The UI clock is FRAME-based: **1 unit per present**, verified by a forced frame rate
**Status: ✅ measured, by a designed test that REFUTED my own previous claim.**
2026-09-01. Instrument: ⟨capture⟩ ×3, one of them at a deliberately altered
presentation rate. Answered against
[`time-based-clock-preregistration.md`](time-based-clock-preregistration.md),
committed before the run.
Data: [`data/forced-framerate-test.txt`](data/forced-framerate-test.txt).
---
## The test, and it went against me
I claimed the clock was **time**-based and that `units/second ≈ 60` was the
invariant. I predicted that halving the frame rate would **double** the alpha step
and **leave** the dwell unchanged. I ran `--framerate_limit=30`:
| | frame-based | **time-based (my claim)** | **measured** |
|---|---|---|---|
| presents/s | ~27 | ~27 | **28.4** |
| modal Δα per present | 17 unchanged | 34 doubled | **17 — unchanged** |
| units/s | ~30 halved | ~60 unchanged | **30.2 / 30.3 — halved** |
| publisher dwell | ~8.5 s | ~4.2 s | **8.450 s — doubled** |
| developer dwell | ~7.0 s | ~3.5 s | **6.923 s — doubled** |
**Every discriminating row went to the frame-based column. My claim is refuted.**
Both controls passed first, as pre-registered:
* **Control 1, read before the step:** the limiter took effect — 28.4 presents per
host-second against 5155 before, and the interval histogram's mass moved from
**one** 60 Hz vblank to **two** (422 of 468). Had this failed, neither
prediction would have been tested.
* **Control 2:** all **8/8** splash quad rects identical to the reference set, so
nothing but the frame rate differs between runs.
## What is actually true
> **The UI clock advances exactly 1 unit per presented frame.** The step is
> **17** on every quad in every capture — at 28.4, 51.4 and 54.8 presents per
> second. `255 × 1 / 15 = 17` with the declared `T = 15`.
So `units/second = presents/second`, and the *seconds* are whatever the frame
rate makes them. The dwell in seconds is **not** a property of the game.
## The conclusion for the port is unchanged, and now properly grounded
The guest, unconstrained, presents **once per 60 Hz vblank** — measured before the
limiter was applied (one vblank 71.7 %, two 24.6 %), and confirmed by this run
moving cleanly to two vblanks when told to. One unit per present at 60 presents
per second is **60 units/s**.
**The port's 60 is right.** It was right when I first said so for a bad reason,
right when I withdrew it, right when I replaced it with 120, and right now — the
difference is that the mechanism is finally tested rather than inferred.
## 🔴 What this withdraws, including of my own
* **`units-per-frame-is-not-a-constant.md` is WRONG in its central claim** and is
superseded by this page. Units per frame *is* a constant; it is 1.
* **My "dwell is stable across runs because a time-based clock is immune to
dropped frames"** was a real prediction and it **failed** — the dwell doubled.
The four-run agreement at 4.2 / 3.5 s that I read as evidence for a time-based
clock was just four runs at similar frame rates.
* ⚠️ **`h3-units-per-frame-measured.md`'s `+34` is now the anomaly**, not the rule.
It reports 34 per label at 27.2 labels/s; this capture reports 17 per present at
28.4 presents/s. **Both cannot be presents.** The likeliest reading is that an
`h3` label is not one present, and until that is checked its "2 units per frame"
should not be used. I have not checked it, and I am not asserting it is wrong —
only that it and this disagree at nearly the same rate, which one of them must
explain.
## The methodological point, since this is the fourth reversal today
Three of my four positions on this number came from **inference over a measured
quantity**; this one came from **changing an input and watching what moved**. The
opportunistic comparison — two captures that happened to differ — pointed exactly
the wrong way, because I had no control on what else differed between them. The
designed test cost one capture and settled it against my own expectation.
📌 And the pre-registration did its job in the only way that really counts: it
made the refuting result **unmissable**. Had I not written down "34, doubled"
first, "17" would have been easy to read as confirmation of something.
## Reach
⟨capture⟩ ×3 at two deliberately different rates, one machine, English locale.
The invariance of the step is the load-bearing part and now rests on a
manipulation rather than a coincidence. ❔ Whether the console presents at 60 is
still an inference from the vblank cadence — a short one, since a 360 vblanks at
60 Hz, but an inference.