Chapter 2 · Section 3
The Clock: Flips, Pulses and Tempos
The BPT law
BPT Part 1.6 fixes how a universe's own pulses are counted. "One flip of state, 0 → 1 or 1 → 0, is one Pulse Rhythm; one full cycle, 0 → 1 → 0, is one Pulse Tempo and one frame (Local Frame Rate). The Recursive Growth Law and the Rupture Rule count a universe's own pulses in Tempos, full cycles, never in single flips." Bits per Pulse (G) gives what each count carries, b⌂ = 2^(L+1) = 2s/f^L: "a universe's Pulse Tempo carries 2^(L+1) bits and its Rhythm 2^L; the heritage f stretches its time, not its data."
The Rupture Rule, also BPT Part 1.6, gives a universe's life: n↯ = 2^L, where n↯ is the count of "completed Pulse Tempos of the universe, full 0 → 1 → 0 cycles rather than single flips, at the moment it ruptures and seeds its children." "A universe spawns when its own pulse count reaches the UniSphere's capacity at its level."
BPT Part 3.6 (Data Harmonics) places that life on the count. The Pulsecore's fill, its Null Nova and its Data Nova "are the data's own count, and they take no time on the universe's clock." "The data's count goes on past the Data Nova, as Harmonic 2 of its own series, to Harmonic 3 at (1 − 2/3)·2^L = 2^L / 3 of its Tempos ... that count too is beyond time. The universe's life begins at Harmonic 3, the Physical Nova ... 2^L Tempos from the big bang."
The established physics
None: a game method. The clock is the theory's own count.
The game's math
pulseCounterapp.js:3436 counts engine steps. The firstupdateCore()after Start sets it to 1 without stepping (app.js:4488); every later step adds one (app.js:4534). So flips = pulseCounter − 1.- The page shows Pulses:
pulsesShown() = floor(pulseCounter / 2)app.js:59. One Pulse on the clock is one Tempo. pulseLength = 2app.js:51, "a Tempo is two flips." It sets the ring period ofRingField(app.js:565), the life of a cell painted with the pulse tool, 2·pulseLength flips (app.js:4678), the burst pattern of an imported packet with no parent data (app.js:3388), and two record fields (app.js:3550, 3708). The page has no control for it; the input it reads (app.js:50) is not on the page, so it is fixed at 2.- During the fill, the Tempo count is n = floor((pulseCounter − 1)/2) (app.js:4568).
universePulses()app.js:4224 is the universe's own Tempos since the Data Nova: floor((pulseCounter − birthFrame)/2), wherebirthFrameis the frame of the Data Nova (app.js:5268). After the final well it is held atlifeEndTempo().physicalTempo() = ceil(2^Lm / 3)app.js:4282, the Physical Nova, counted from the Data Nova.lifeEndTempo() = physicalTempo() + 2^Lmapp.js:4283. The final well comes whenuniversePulses() ≥ lifeEndTempo()(app.js:4581).uni.rupturePulses = 2^Lm(app.js:4248,U.rupturePulses()universe.js:245).
A desktop at level 6 or above (Lm = 6): the Null Nova at pulseCounter 363 (Tempo 181, Part 2.4), the Data Nova at 511 (Tempo 255), the Physical Nova at 511 + 2·22 = 555, the final well at 511 + 2·86 = 683. The clock then reads 341 Pulses. A phone (Lm = 4): Null Nova at 91, Data Nova at 127, Physical Nova at 139, final well at 171.
The pace of play is separate from the clock (start() app.js:4764 and startLoop()). In the "fast" pace a 50 ms tick owes rate steps: during the fill rate = max(1, 2·novaTempo(Lm)/400) (app.js:4843), so the fill plays in about 400 ticks, 20 s; during the life rate = min(4, 2·lifeEndTempo()/2000) (app.js:4844), about 100 s. Between steps the universe moves in slices at most every 90 ms, and a slice is skipped when it would reach 0.97 of a step. Each step or slice then waits as long as it took. In the "max" pace the rule runs as many steps as fit in 14 ms, at most 64, before drawing (app.js:4822). The slider pace runs one step every (min + max − value) ms of the slider, with 50, 1000 and 100 as fallbacks. In every pace each step runs and every count is the same; only the wall time changes. At Lm ≤ 6 the life's rate stays far below 4 steps a tick: the largest life, 2·86 = 172 flips, gives 0.086 steps a tick.
In the game
The clock is on the readout from the first frame. "Pulse:" (index.php:70, and again in the controls at index.php:129) shows pulsesShown(), with the tooltip "Pulses on the clock: one Pulse is 0 → 1 → 0, a Tempo, two Rhythms." The Tempos line (index.php:71, tooltip "Own Pulse Tempos (full 0 → 1 → 0 cycles) out of 2^L, the Rupture Rule") changes with the epoch (updateHud() app.js:2124): during the fill it shows the data within against the skin (Part 2.4); from the Data Nova to the Physical Nova it reads "the data's count n / ⌈2^Lm/3⌉ · beyond time"; from the big bang it reads "n − physicalTempo / 2^Lm since the big bang." The state label reads "State: Pulsing" while the clock runs (app.js:4492, 4564).
The Bits line (index.php:73) turns the clock into data, as Bits per Pulse does. Before Start it reads the painted lit cells × 2^(L+1) "in the Pulsecore"; after Start, every flip so far × 2^L (app.js:2130–2131). Its tooltip: "every flip is one Rhythm and carries 2^L bits (Bits per Pulse, ch 1)."
The player controls the pace, not the clock. Start and Pause (index.php:97–98) run and hold it. The Speed menu (index.php:133) offers "slider pace," "paced · the filling in ~20 s, the life in ~100 s" (the default) and "max · the rule flat out," with the tooltip "The physics is the same at every speed." The Pace slider, 50 to 1000 (index.php:132), sets the slider pace. Reverse steps the clock back one flip at a time (Part 2.13).
On a desktop at level 28 with the default pace, a run reads 255 Pulses at the Data Nova, about 20 seconds in, and 341 Pulses at the final well, about 100 seconds after that.
The scale model
The clock is a scale model. The true life is 2^L Tempos (2^28 ≈ 2.68×10⁸ at level 28); the drawn life is 2^Lm (64 on a desktop). One drawn Tempo of life stands for 2^(L−Lm) true Tempos. scaleModel() keeps the true value as uni.trueRupture (app.js:4247), and the readouts quote it.
Where the game and the theory differ
- BPT puts the fill, both Pulsecore novas and the data's count before Harmonic 3 beyond time, off the universe's clock. The game runs them on the same Pulse counter as the life and marks them in the Tempos line ("· beyond time") instead.
- The Bits line multiplies the drawn flips by the true level's 2^L bits a flip. It does not apply the scale model's factors: each drawn cell stands for 4^(L−Lm) true cells and each drawn Tempo for 2^(L−Lm) true Tempos, so at L > Lm the line counts the bits of the drawn field at the true level's rate, not the bits of the true field.
Fixed numbers
| Number | Where | What it is | Kind |
|---|---|---|---|
| 2 (pulseLength) | app.js:51 | flips per Tempo | BPT (Part 1.6, Bits per Pulse) |
| 2 (÷2 in pulsesShown, universePulses, Tempo count) | app.js:59, 4224, 4568 | flips per Pulse | BPT (Part 1.6) |
| 1 (pulseCounter = 1) | app.js:4488 | the first frame starts the clock without a step | METHOD |
| 3 (2^Lm/3) | app.js:4282 | the Physical Nova at a third of the data's count | BPT (Part 3.6, Data Harmonics) |
| 2^Lm | app.js:4248, 4283 | the life in Tempos | BPT (Part 1.6, Rupture Rule) |
| 50 ms | app.js:4863 | the tick of the fast pace | DISPLAY (pace only) |
| 400, 2000 | app.js:4841 | ticks for the fill and for the life | DISPLAY (pace only) |
| 1 in max(1, …), 4 in min(4, …) | app.js:4843–4844 | least and most steps a tick | DISPLAY (pace only; 4 never binds) |
| 90 ms, 0.97 | app.js:4855 | slice spacing and the last share a slice may take | DISPLAY (pace only) |
| 14 ms, 64, 0 ms | app.js:4822, 4825 | the max pace's budget, batch and interval | DISPLAY (pace only) |
| 50, 1000, 100 | app.js:4866–4867 | slider fallbacks, ms | DISPLAY (pace only) |
| 2 (owed ≤ 2) | app.js:4847–4849 | steps held while matter runs on its own thread | DISPLAY (inactive: the thread is off) |
Measured
The fast pace's "keeps half of every second" rule rests on a measurement the comment records (2026-10-28): about 0.4–0.5 s of physics a flip after the big bang, a step every 0.6 s, on a desktop.