PulseCore

Chapter 7 · Section 2

The State Watch: Recording and the Period Test

The BPT law

BPT Part 1.1 (The Binary Foundation of Our Reality) sets the clock and names the structure. "The full cycle 0 → 1 → 0 is the Pulse Tempo ①⥂⧗⌂, Planck time. One transition, 0 → 1, is the Pulse Rhythm ①⥂⧖⌂, half of it." Among the Critical Fundamentals each transition creates, it lists "Time Crystals (⧖): Temporal periodicity structures that maintain rhythmic oscillation and establish the stable temporal lattice underlying causality." The book's glyph table reads ⧖ as "time crystal; alone, the Rhythm", so in BPT the Rhythm itself is the unit of a time crystal, and the plain pulse has period 2 Rhythms.

BPT Part 7.5 (The Resonant Field of Becoming) says how pulse cycles come to share a beat. Its Entrainment Condition is |ω_i − ω_j| < Δω⨶: "Phase-Locking occurs when frequency differences fall below critical threshold". Its Phase-Locking Strength is R⊠ = |⟨e^(i(φ_i − φ_j))⟩|, an order parameter for how far phases agree, and its coupled cycles follow the Kuramoto form dφ_i/dt = ω_i + Σ_j K_ij sin(φ_j − φ_i). Part 7.6 calls the result Phase-Locked Domains, regions that "achieve collective coherence". BPT gives no test for finding any of this in recorded data. The recording and the period test are game methods. They serve BPT's time crystal by measuring, cell by cell, which beat each cell keeps.

The established physics

A discrete time crystal is a driven system whose bulk responds at a whole multiple of the drive's period. This is period multiplication, a broken discrete time-translation symmetry. The code cites Wilczek 2012 (the proposal), Else et al. 2016 (the Floquet time crystal), and Zhang et al. 2017 and Choi et al. 2017 (the first observations). The period test itself is the textbook definition of a minimal period of a sequence.

The game's math

Recording. record(lit, pulser, offR, offC) (states.js:138) writes one flip into a ring buffer hist of W · n bytes. Here W is the window in flips and n = rows · cols is the number of cells. Each cell's code is

v = 0 if the cell is null, 1 if it is a dark pulser, 2 if it is a lit pulser

The record is kept in the frame that moves with the data flow: cell (r, c) of the record is field cell ((r + offR) mod rows, (c + offC) mod cols). A pattern that rides the flow is therefore seen standing still. Each frame also gets a 32-bit FNV-1a hash over v + 1 for every cell, and the last 512 hashes are kept for the revival test (Part 7.6). code(i, back) (states.js:155) reads the code of cell i from back flips ago. It adds W · 4 inside the modulus only to keep the index positive.

Period of a cell. periods() (states.js:158) gives each cell its minimal period p over the window:

per[i] = the least p in 1 … ⌊W/3⌋ such that code(i, k) = code(i, k + p) for every k with 0 ≤ k and k + p < W
per[i] = 0 if no such p exists

Because p ≤ ⌊W/3⌋, a period counts only if it repeats at least three times inside the window. That is the detector's definition, and the Rules page states it. With W = 48 (STATE_WINDOW, app.js:1753), the longest period a cell can show is 16 flips, which is 8 Tempos.

Frame dragging. carry(cells) (states.js:131) stamps the flip at which frame dragging last moved each cell. A cell moved within the window gets period 0 (states.js:168). Its history is rotation, a pattern turning past it, and not a beat of its own. app.js calls carry from the spin drag and from the row shifts of the flow (app.js:869, 4395, 4539).

Cadence. stepStates() (app.js:1767) records every flip and scans when t is a multiple of 16 (STATE_EVERY). A scan returns nothing until the window is full: filled < W (states.js:322).

Worked case. Level 8 runs on a 1024 × 1024 field (the comment at app.js:4506 gives this size), so n = 1,048,576. The window holds 48 · 1,048,576 = 50,331,648 bytes, about 48 MiB. The worst case of periods() is n · 16 · 48 ≈ 805 million comparisons, though most cells stop at their first mismatch. The source comment of 2026-10-24 (states-worker.js:2) says one scan at level 7 already takes a quarter of a second. For that reason the scan runs in a Web Worker (Part 7.7).

In the game

The State Watch starts with the universe epoch, after the Data Nova has turned the Pulsecore inside out onto space: stepStates() returns at once in any other epoch (app.js:1768). The first scan that can report anything comes 48 flips in, once the window is full, and because a state must be seen in two scans in a row (Part 7.7), the earliest report comes at least 64 flips into the universe epoch.

Nothing of the recording is drawn. The field the player sees on the 2D grid and on the 3D torus is the same field the watch records, but the watch adds no marks to it. Its reports appear as finds: the readout line "Finds: N" (index.php:89) and the count beside the Collection link in the menu (index.php:274) go up by one for each.

No control tunes the detector. The level sets the field, 4 · 2^L cells a side, so it sets n and how long a scan takes. The Speed menu (index.php:133) changes how fast flips come, not what is recorded. Spin and the flow move cells, and every moved cell is marked carried, so in a spinning universe more of the field is read as rotation and less as beats of its own.

The scale model

The detector reads every drawn cell. That is exact for the drawn field, but it is not the true level. Nothing is scaled up, and a period found is a period of drawn cells.

Fixed numbers

Number Where What it is Kind
48 app.js:1753 (STATE_WINDOW), states.js:118 default The window in flips. It sets the longest period (16) and the memory (48 · n bytes) CAP
16 app.js:1753 (STATE_EVERY), states.js:118 default Scan every 16 flips. This is the detector's sampling cadence METHOD
3 (in ⌊W/3⌋) states.js:159 A period must repeat three times in the window to count. This is the detector's definition METHOD
0, 1, 2 states.js:146 The cell codes null, dark and lit. These are the field's three states BPT
2166136261, 16777619 states.js:141, 148 FNV-1a 32-bit offset basis and prime, a standard hash METHOD
512 states.js:151 Frame hashes kept. This bounds how far back a revival can be seen CAP
4 (W · 4) states.js:155 Keeps the ring-buffer index positive. Arithmetic only METHOD
−1e9 states.js:126, 128 "Never carried" sentinel METHOD