Chapter 7 · Section 7
Species, Announcement, the Discovery Card and the Worker
The BPT law
BPT does not state this. Species, signatures, naming and rarity are game methods. They serve two BPT ideas. The first is persistence: BPT Part 7.6 counts as form only what crosses the threshold and lasts, and the game reports a state only when it has held for two scans. The second is replay: BPT Part 8.1 says a universe is "its level, its genesis, its Pulsecore and its rule; everything after its first pulse is replay", and its Packet Replay prediction is "testable on the game's recorded universes". A species signature gives every pattern a name that does not depend on where or when it appeared, so a pattern found again in a replay, or in another universe, is recognized as the same. The card's physics line for each family cites the book place listed in STATE_FAMILIES (Parts 7.3 to 7.6 above).
The established physics
None: a game method. The canonical form under the eight symmetries of the square (the dihedral group D4) is standard geometry. The FNV-1a and djb2 string hashes are standard.
The game's math
Held two scans. keep(det) (states.js:327) files each detection under a location key, family | round(r/8) | round(c/8) | signature. A soliton or revival is filed under family | signature alone, since a traveller is somewhere else next scan. seen counts consecutive scans: it is replaced each scan by what that scan saw (states.js:525), so a state missing from one scan starts again. A detection is reported when it has been seen in two scans in a row (k ≥ 2) and its key has not been announced in this universe. Scans are 16 flips apart and each needs a full 48-flip window, so a state must last at least 64 flips to be found.
Species signature (signature() states.js:205). The detector takes the region's cell codes over one period inside its bounding box. It writes them as strings under every symmetry of D4, every starting flip of the period, and with lit and dark swapped or not, then keeps the least string. The species id is a 64-bit hash: FNV-1a and djb2, 32 bits each, as 16 hex digits. Two finds with one signature are one species. A region whose box is wider or taller than 24 cells gets a coarse signature instead, FNV of family | p | round(log₂ cells). So all large regions of one family, period and size octave count as one species.
Pattern (capture() states.js:238). For drawing and for the catalog, the detector keeps a box of at most 24 × 24 around the center and min(16, max(2, p)) frames. Cells outside the region are '.' unless the whole box is kept (whole).
Off the main thread (states-worker.js). resetStates() (app.js:1755) starts the worker once. Every scan, stepStates() posts copies of hist (W · n bytes), hashes and carried (4 · n bytes) with a token. While a scan is out, the next scan is skipped (stateBusy, app.js:1773). A reply carrying a stale token, from before a reset, is ignored. Without Worker support, the scan runs in place. At level 8 each post copies about 48 MiB of history and 4 MiB of carried flips, every 16 flips.
Announcement (announceStates() app.js:1780). The find's center is moved back from the flow frame to the torus. A time crystal becomes kind crystal and every other family kind state. The pop rule is:
pop if: first of its family in this universe, or tier ≥ 4, or (tier ≥ 3 and ≥ 12 pulses since the last pop)
otherwise: added quietly (quiet: true)
Under QUIET the pop shows nothing, so the rule only sets the quiet flag in the record.
Species catalog (sightSpecies() app.js:1802). Each new signature in a session is posted once to the server's species catalog with the pattern. If the catalog says first, this is the first sighting anywhere in PulseCore and the discovery card is due. If it is a known species new to this browser, a species find is added: "seen N times · tap to see it". If the catalog cannot be reached, a local list of seen signatures (the last 2000, in localStorage) decides, and only the unclassified family opens the card locally.
The discovery card (showDiscovery() app.js:1846). The card shows a kicker, the title (species name or family), a line on who found it first, and facts: family, beat (p Rhythms), size, tile, speed and the first 10 hex digits of the signature. It adds the family's physics and book line and the animated pattern (drawPattern() app.js:1825, one frame per 380 ms; lit cells gold #ffd166, dark cells blue #35517a). A first finder may name the species, and a signed-in player may label it. The card pauses the universe and plays a C-major arpeggio (523, 659, 784 Hz). Since 2026-10-28 QUIET returns before any of this (app.js:1847). The find is still recorded, and naming is not offered in v8.3.
In the game
What reaches the player in v8.3 is the count and the record. Each state the detector reports adds one to "Finds: N" and appears in the Collection. A pattern new to this browser but known to the catalog also adds a species find, worded "Néel crystal · first found by … · seen N times · tap to see it" (finds.js:60), and the Collection counts these under "species met" (app.js:273).
The discovery card is built into the page (index.php:432–434) and would be the moment of the run: the field stops, the State line reads "State: Discovery" (app.js:1893), the kicker says "Discovery · first ever in PulseCore", the lede says "No one has seen this pattern before in PulseCore. You found it in universe #N, level L.", and the pattern animates in gold and blue while three rising tones sound. Its physics line ends "'First ever' means first seen in PulseCore, not new to nature." (app.js:1867). With QUIET set, none of this opens, and no find pauses the universe. The pattern and the signature still go to the species catalog, which the site shows at /states.
The worker is invisible to the player except in what it saves: the field keeps pulsing while a scan runs. The device readout ("How hard this device is working", index.php:82) is where a slow scan would show.
The scale model
Exact on the drawn field: no scale model. A species is a pattern of drawn cells.
Fixed numbers
| Number | Where | What it is | Kind |
|---|---|---|---|
| 8 (r/8, c/8) | states.js:329 | Place bins that keep one find from being reported again as it shifts a little | METHOD |
| 2 (k < 2) | states.js:332 | Held two scans in a row | METHOD |
| 24 (signature box) | states.js:207 | Beyond 24 cells a side, species collapse to a coarse key. This limits species identity | CAP |
| 5381, 33 | states.js:82–83 | djb2 hash constants | METHOD |
| 8 (D4), 2 (swap) | states.js:88–91, 212 | The square's eight symmetries; lit/dark swap | METHOD |
| 24 × 24, 16, 2 | states.js:240, 244 | Captured pattern box and frames | RECORD |
| 12 (pulses), 4, 3 (tiers) | app.js:1790 | Pop rule | DISPLAY |
| −999 | app.js:1754, 1756 | "No pop yet" sentinel | METHOD |
| 2000 | app.js:1800 | Species signatures remembered in the browser | RECORD |
| 10 (hex digits) | app.js:1863 | Signature shown on the card | DISPLAY |
| 380 ms; #05060a, #ffd166, #35517a | app.js:1835–1844 | Pattern animation and colors | DISPLAY |
| 523, 659, 784 Hz; 0.25, 0.4 s; 180, 360, 80 ms | app.js:1895–1896 | Discovery chime and focus delay | DISPLAY |