Chapter 5 · Section 12
Feedback
The BPT law
BPT Part 3.14 (Galaxies: the Wells and the Stars Around Them), in Feedback: What Keeps Galaxies Blue: "Without feedback a galaxy forms its stars too fast, too early, and too many: gas cools, falls in and turns into stars until none is left, and every galaxy ends red and dead … Two sources of energy push back." Its Supernova Momentum, p_sn = p◇·(n_H/n◇)^(−2/17), p◇ ≈ 2.8 × 10⁵ Suns at 1 km/s, n◇ one atom per cubic centimeter, is "the momentum one supernova drives into the gas around it"; it "hardly depends on the gas … so every supernova delivers about the same push". Its Quasar Feedback Energy, E_fb = ε_f·L·Δt, ε_f ≈ 0.05, is "the share of a feeding well's light that stirs its galaxy", L the accretion luminosity, a tenth of the food's rest energy.
In Binary Pulse Theory, the Part says, "feedback is the data of a star or a well's food returned to the field and pushed back out before the wells take what is left". And it states how the game does it: "The simulation gives each supernova an outward push on the gas round it and keeps that gas too hot to form stars for a while, and each well feeding past a hundredth of its Eddington rate a push and heating in proportion; the reach of both is scaled to what the device can compute, so their effect is seen in the universes deep enough to have stars, from about level 23." The ruling quoted at app.js:748 (2026-10-27): "we need supernova and quasar feedback, ideally this can scale with the users processing power".
The established physics
Kim & Ostriker (2015) for the supernova momentum; Di Matteo, Springel & Hernquist (2005) for ε_f; accretion luminosity a tenth of the rest energy; Dekel & Silk (1986) for blowing a dwarf's gas out; the Salpeter time, about 45 Myr (BPT Part 6.10 gives ≈ 5 × 10⁷ yr).
The game's math
SALPETER_SHARE = 45 × 10⁶ / 11.0 × 10⁹ ≈ 1/244 (app.js:746): the Salpeter time as a share of the life. FB_HOT = 2 flips (app.js:757).
applyFeedback(sev) app.js:758, once per sub-step after stepStars():
strong = matterBudget() ≥ 30000; busy = perf.lastBusy > 85 (%)
cap = max(4, (strong ? 96 : 24) >> (busy ? 1 : 0)) supernova events handled this sub-step
reach = (strong ? 3 : 2) · (busy ? 0.75 : 1) cells
sk = (matter.cloud or 8) / 8 Chapter 4, Part 4.15
push(r, c, R, dv0, energy, hot): R ← R·sk, hot ← hot·sk; every body within R cells; M their total mass;
v_esc = √(2·G·gk·M / max(0.5, R))
dv = min(1.5·v_esc, 0.05·c, energy ? √(2·dv0/M) : dv0/M)
each body: v += r̂ · dv · (1 − 0.5·d/R); hotUntil = max(hotUntil, now + hot)
- Supernovae (the first
capof this sub-step's events): p = 0.93·n·S.sun·c, momentum (p_sn = 2.8 × 10⁵ Suns·km/s over light's 3 × 10⁵ km/s is 0.93 Suns·c), reach R, hot FB_HOT. - Feeding wells (every non-stellar, non-site well with Eddington ratio ≥ 0.01): Ṁ = (edd / (SALPETER_SHARE·life))·M_f, M_f the heart's own mass in cells, E = 0.005·Ṁ·c² (ε_f × the tenth radiated), reach R·(1 + 2·min(1, edd)), hot FB_HOT·(1 + 3·min(1, edd)).
Stars read hotUntil: heated gas forms none until it cools (Part 5.7).
Worked case, desktop, level 28: S.sun ≈ 3.8 cells, c = 128: one supernova's p ≈ 0.93 × 3.8 × 128 ≈ 450 cell-masses·cells a flip; reach 2 cells; the push is at most 0.05 × 128 = 6.4 cells a flip. On a phone sk = 0.25: reach 0.5 cells and heating 0.5 flips.
In the game
Feedback has no flash of its own; it is seen in the gas. Round each supernova flash (Part 5.9) the bodies within its reach are pushed outward, and their gas forms no new stars for about two flips. As the code's comment puts it (app.js:769), a dwarf's gas is blown out, a large galaxy's stirred.
The wells' half shows in the galaxy readout. A tap in a galaxy whose well feeds at a hundredth of its Eddington rate or more adds " · a Seyfert", from a tenth " · a quasar" (app.js:3011), and a starless cloud " · feeding the well" (app.js:2995); those are the wells whose feedback pushes and heats the gas around them, further and longer the faster they feed. The quasar's own drawing, a blazing core with two jets, is the galaxies' (Chapter 6).
The device enters here. The HUD's Speed line (index.php:82) shows "how busy the page is (above about 80% it starts to stutter)"; above 85 % busy the game handles half as many supernova events a sub-step and shortens their reach by a quarter.
The scale model
The reach and heating follow the cloud share (sk); the momentum is in the level's Suns and the game's light; the push is bounded by light and the escape speed because the game's units are not km/s (app.js:769–770).
Where the game and the theory differ
- BPT Part 3.14's Supernova Momentum falls with the gas density as (n_H/n◇)^(−2/17); the game gives every supernova the reference momentum p◇, with no density factor.
- The strong branch is dead.
matterBudget()returns at most 16,000 since 2026-10-27 (Chapter 4, Part 4.5), sostrongis never true. Every device runs with 24 events a sub-step (12 when busy) and a reach of 2 cells (1.5 when busy). The rule "96 or 24 events, reach 3 or 2, by device" in the code and its comment (app.js:755) is what the code says, not what it does. The threshold of 30,000 belongs to the older budget of up to 60,000 that the stale comment at app.js:1151–1154 still describes. - BPT Part 3.14 scales feedback "to what the device can compute"; in the code that means the busy reading, so two devices can apply different feedback to the same universe, and supernovae past the first 24 (or 12) of a sub-step push nothing.
- The push is bounded at 1.5 escape speeds and 5 % of light (app.js:772); BPT states neither bound.
Fixed numbers
| Number | Where | What it is | Kind |
|---|---|---|---|
| 45e6, 11.0e9 | SALPETER_SHARE app.js:746 |
Salpeter time over the life | PHYSICS (Salpeter time) and BPT (11.0 Gyr life, Chapter 1 Part D) |
| 2 | FB_HOT app.js:757 |
Flips heated gas stays hot | METHOD (unsourced) |
| 30000 | app.js:761 | Body budget that makes a device strong (unreachable) | CAP (device class; dead) |
| 96, 24 | app.js:761 | Supernova events handled per sub-step | CAP |
| 85 | app.js:761 | Busy percent that halves the work | CAP |
| 1 (>> 1) | app.js:761 | Halving when busy | CAP |
| 4 | app.js:761 | Least events handled | CAP (floor) |
| 3, 2 | app.js:761 | Reach, cells, strong and ordinary | CAP (device class) |
| 0.75 | app.js:761 | Reach when busy | CAP |
| 8 | app.js:763 | sk = cloud/8 | METHOD (Chapter 4, Part 4.15) |
| 0.5 | app.js:771 | Floor on R in the escape speed, cells | METHOD |
| 1.5 | app.js:772 | Push at most 1.5 escape speeds | CAP (stated as a guard, Dekel & Silk 1986 cited qualitatively) |
| 0.05 | app.js:772 | Push at most 5 % of light | CAP |
| 0.5 | app.js:774 | Push falls to half at the reach | METHOD |
| 10⁻³ | app.js:774 | Distance below which a random direction is used | METHOD |
| 0.93 | app.js:779 | p_sn in Suns·c | PHYSICS (Kim & Ostriker 2015) |
| 0.01 | app.js:783 | Eddington ratio for feedback | BPT (Part 3.14, a hundredth of Eddington) |
| 0.005 | app.js:785 | ε_f × ε_r = 0.05 × 0.1 | PHYSICS (Di Matteo, Springel & Hernquist 2005) |
| 2, 3 | app.js:786 | Reach and heating grow with the Eddington ratio | METHOD (unsourced) |
| 2 (×) | app.js:781 | Flips per Tempo in the life | BPT (Part 1.10) |