866c7f96 2026-09-07 Pavel Safronov | 1 | # Tower — Design |
| 2 | |
| 3 | **Tower is the setting of a novel.** This app exists to serve that: first as an |
| 4 | instrument for the author to see the place and keep it consistent, and second as a |
| 5 | companion piece readers can explore. Where a choice trades spectacle against |
| 6 | coherence, coherence wins — canon here is series-bible material, and the book is |
| 7 | downstream of it. |
| 8 | |
| 9 | Tower is a smart cylinder in orbit around Earth, spun for 1 g, with an inner |
| 10 | surface the size of Wisconsin, lit by sunlight piped down its axis and scattered by |
| 11 | a swarm of mirrors it flies itself. It is also a person. |
| 12 | |
| 13 | The app has three linked views: |
| 14 | |
| 15 | 1. **Exterior** — a 3D render of Tower from outside, with its collector, beam and |
| 16 | orbit. You pick a point on the hull. |
| 17 | 2. **Map** — a 2D unrolled map of the inner surface. You pick a point here too; the |
| 18 | two pickers stay in sync. |
| 19 | 3. **Interior** — a first-person "streetview" from the picked point, with live |
| 20 | controls for time of day and spin phase. |
| 21 | |
| 22 | --- |
| 23 | |
| 24 | ## 1. Canon |
| 25 | |
| 26 | ### 1.1 Dimensions |
| 27 | |
| 28 | All numbers derive from two free parameters — radius and length — chosen so the |
| 29 | inner surface matches Wisconsin. |
| 30 | |
| 31 | | Quantity | Value | Notes | |
| 32 | |---|---|---| |
| 33 | | Radius | **50 km** | floor to axis | |
| 34 | | Length | **540 km** | sun cap to far cap | |
de65ab10 2026-09-08 Pavel Safronov | 35 | | Wall depth | **1 km** | floor to outer skin, D-044 | |
866c7f96 2026-09-07 Pavel Safronov | 36 | | Circumference | **314.16 km** | the world's "width" | |
| 37 | | Inner surface area | **169,646 km²** | Wisconsin total area, 169,635 km² | |
| 38 | | Habitable land area | **169,646 km²** | all of it — the hull is sealed (§1.4) | |
| 39 | |
| 40 | Every square metre of the inner surface is land. There are no windows in the wall, |
| 41 | so nothing is subtracted. *An earlier version sized star slats to leave exactly |
| 42 | Wisconsin's land area of 140,268 km²; D-017 removes them and that second |
| 43 | coincidence with it.* |
| 44 | |
| 45 | ### 1.2 Spin and gravity |
| 46 | |
| 47 | | Quantity | Value | |
| 48 | |---|---| |
| 49 | | Angular velocity ω | **0.014005 rad/s** | |
| 50 | | Spin period | **448.6 s** = 7 min 29 s | |
| 51 | | Rotation rate | **0.134 rpm** | |
| 52 | | Rim speed | **700.2 m/s** | |
| 53 | | Floor gravity | **1.000 g** by construction | |
| 54 | |
| 55 | Consequences that the app should show or at least respect: |
| 56 | |
| 57 | - **Gravity falls off linearly with height.** g(h) = ω²(R−h). A 1 km peak sits at |
| 58 | 0.98 g; the axis is weightless. Mirrors at the axis float. |
| 59 | - **Coriolis is mild but real.** 2ω = 0.0280 s⁻¹. Walking is unaffected (0.4 % g). |
| 60 | A ball thrown at 30 m/s deflects at 8.6 % g — enough that Tower's sports differ |
| 61 | from Earth's, and enough that thrown objects visibly curve. |
769726ea 2026-09-08 Pavel Safronov | 62 | - **Nothing in the sky moves, except through the far cap.** The wall is sealed |
| 63 | (§1.4), so along 539 of the 540 km there is nothing to wheel past — the far side |
| 64 | of the world overhead co-rotates with you and hangs perfectly still. The one |
| 65 | exception is the far cap window, where the sky is *outside* and does not |
| 66 | co-rotate: it turns once every 7 min 29 s about a single motionless star on the |
| 67 | axis. The spin is invisible upward and obvious deepward, and only at night. |
866c7f96 2026-09-07 Pavel Safronov | 68 | - **But everything that falls leans.** Rain hangs at a permanent 1.47° slant, smoke |
| 69 | drifts the other way, and a 1 km waterfall lands 133 m off its own cliff (§1.9.2). |
| 70 | This inversion is the alien fact the interior view must sell: **the sky is still |
| 71 | and the water is not.** |
| 72 | |
| 73 | ### 1.3 The sun system |
| 74 | |
| 75 | Sunlight enters through the sun-facing end cap and runs the full 540 km axis. |
| 76 | |
| 77 | - **Collector.** A mirror array flies ahead of Tower, gathering sunlight and |
| 78 | concentrating it into the beam. **46,900 km² of aperture — a disc ~244 km |
| 79 | across**, two and a half times Tower's own diameter. It is the dominant visual |
| 80 | element of the exterior view. |
| 81 | - **Beam.** **10 km in circumference** — 1,592 m radius, 7.96 km² cross-section — |
| 82 | carrying **54.3 TW** at a concentration of **5,000×**, or 6.8 MW/m². It runs the |
| 83 | axis from sun cap to far cap. |
| 84 | - **Diffusers.** Not lamps — a **swarm**. See §1.3.1. |
| 85 | - **The beam is visible, and it glows by itself.** There is real air at the axis |
| 86 | (§1.5), and a 6.8 MW/m² beam Rayleigh-scattering through 3.18 km of it radiates |
| 87 | **779 W/m²/sr** — **26× brighter than clear blue sky, 25,700× dimmer than the |
| 88 | sun's disc.** It is a brilliantly sunlit cloud extruded into a rod, safe to look |
| 89 | at directly. From the floor 50 km below it is **3.65° wide, about seven |
| 90 | sun-widths**, running the whole length of the sky. This glow is a property of the |
| 91 | beam and the air, not of the diffusers — it would be there if the beam were empty. |
| 92 | |
9c891d2e 2026-09-08 Pavel Safronov | 93 | #### 1.3.0 Tower never sees the sun |
| 94 | |
| 95 | The collector is **244 km across and flies 320 km ahead of the sun cap**, which puts |
| 96 | it **41.8° wide** in Tower's sky against the sun's 0.53° — **79 times the sun's |
| 97 | diameter**. It sits squarely between Tower and the sun, so it occults it completely, |
| 98 | and the umbra it casts is 120 km across where Tower's 51 km sits inside it. The |
| 99 | eclipse is total, permanent, and self-inflicted. |
| 100 | |
| 101 | So **nobody aboard can see the sun**, for the same reason nobody can see Earth |
| 102 | (§1.4). What they can see, through the sun cap window, is the *back* of the |
| 103 | collector: 46,938 km² of structure radiating its own waste heat at about 245 K — |
| 104 | infrared, and therefore black. It is the only object in Tower's sky that is neither |
| 105 | Tower nor a star, and it never moves, because the collector flies in formation |
| 106 | rather than spinning. D-050. |
| 107 | |
49b0d64d 2026-09-08 Pavel Safronov | 108 | **Its edge is not black.** The face is a mirror pointed away, but the collector is |
| 109 | *backlit*, and the structure holding 46,938 km² flat stands proud of the mirror |
| 110 | plane at the rim, where the sun strikes it side-on. With the scatter any real mirror |
| 111 | throws at grazing incidence, the edge reads as a thin sun-coloured ring — so the |
| 112 | collector is a hole in the stars with a lit rim rather than an absence, which is how |
| 113 | anything backlit looks. **It is not sunlight leaking past the edge**: Tower is wholly |
| 114 | inside the umbra, so the sun's disc is hidden from every point in the world. The ring |
| 115 | is lit structure. D-054. |
| 116 | |
866c7f96 2026-09-07 Pavel Safronov | 117 | #### 1.3.1 The diffuser swarm |
| 118 | |
| 119 | The diffusers must be individually invisible, or the sky becomes a row of separate |
| 120 | suns. Two thresholds govern this, and only the second one binds: |
| 121 | |
| 122 | - **Resolvability.** At 50 km, one arcminute is 14.5 m. Anything larger is a |
| 123 | resolved disc with a visible edge. |
| 124 | - **Visibility.** Being unresolved is not enough — stars are unresolved and we see |
| 125 | them. A mirror *preserves radiance*, so a mirrorlet aimed at an observer shows |
| 126 | the sun's own surface brightness over a tiny angle. A 1 m mirrorlet reads at |
| 127 | magnitude −13.6, brighter than the full moon. Blending into daylight requires |
| 128 | **~1.2 cm**, at magnitude −4.0, just under Venus. |
| 129 | |
| 130 | Diverting 54.3 TW needs 11.3 km² of mirror, so: |
| 131 | |
| 132 | | | | |
| 133 | |---|---| |
| 134 | | Mirrorlet size | **1.2 cm**, ~1.4 cm², 2 mg | |
| 135 | | Count | **78 billion** | |
| 136 | | Total mass | **158 tonnes** — the entire sun system | |
| 137 | | Mean spacing in beam | **3.8 m** — sparse enough to fly through | |
| 138 | | Optical depth over 540 km | 1.41, so **24 % of light reaches the far cap** | |
| 139 | |
| 140 | **The swarm cannot be passive — it must fly, always.** The axis is not weightless. |
| 141 | At the beam's edge gravity is **0.312 m/s²**, enough that a foil sinks outward at |
| 142 | 0.26 m/s and **leaves the beam in 1.7 hours**. A drifting swarm dissolves the same |
| 143 | afternoon. Every foil is therefore under continuous individual control. This is not |
| 144 | a flourish on a working system; it is the only configuration that works. |
| 145 | |
| 146 | **They have absurd power to do it with.** Each foil intercepts 979 W of beam. |
| 147 | Harvesting 0.1 % gives it ~1 W on a 2 mg body — **489,600 W/kg**, some fifty times |
| 148 | a jet engine's specific power. |
| 149 | |
| 150 | | | | |
| 151 | |---|---| |
| 152 | | Down-beam, riding radiation pressure | 0.85 m/s, 7.4 days | |
| 153 | | Back up-beam under its own power at 1.5 m/s | 15 µW, 4.2 days | |
| 154 | | Harvestable from ambient world-light | **14,400 µW** — a 1000× margin | |
| 155 | |
| 156 | **So there is no recirculation machinery, at either cap.** The foils fly home on |
| 157 | scavenged daylight. Nothing needs to be built for them, and the 1000× power margin |
| 158 | means Tower can afford to move them *wastefully* — in spirals, shoals and patterns |
| 159 | that cost energy for no reason but preference. |
| 160 | |
| 161 | **Lighting is a render target, not a schedule.** 78 billion independently aimed |
| 162 | mirrors put any intensity on any patch of ground at any time. Dawn, dusk, moving |
| 163 | cloud shadows and seasons are compositing problems, not optical ones. |
| 164 | |
59c12827 2026-09-28 Pavel Safronov | 165 | **Together they make Tower's sun** (D-074). Individually invisible, the swarm gathers |
| 166 | by day into a single shoal on the axis and throws the beam's light out sideways from |
| 167 | there — one blazing point 3.2 km across, which is Tower's sun. The shoal moves: it |
| 168 | forms at the sun cap at sunrise and flies the length of the world by sunset, where it |
| 169 | disperses (§1.3.4). Each mirrorlet in it is aimed, so Tower sends as much of the sun's |
| 170 | light toward ground far away as toward ground beneath it, and the sun looks equally |
f16f084e 2026-09-28 Pavel Safronov | 171 | bright from everywhere, as Earth's does; the ground is lit by how high it stands. The |
| 172 | shoal takes only part of the beam and lets the rest run on (D-079), so **the rod glows |
| 173 | from cap to cap at every hour**, a little dimmer past the sun than before it, and ends |
| 174 | on the far cap's mirror. This is the one exception to the rule |
59c12827 2026-09-28 Pavel Safronov | 175 | above that the diffusers must never read as a sun: Tower wants exactly one. |
| 176 | |
866c7f96 2026-09-07 Pavel Safronov | 177 | **Aiming resolution is human-sized.** A 1.2 cm mirror is diffraction-limited to |
| 178 | 4.6×10⁻⁵ rad, so its reflection lands as a **2.3 m spot** on the floor 50 km below. |
| 179 | Tower can put a glint on one person that someone five metres away cannot see. The |
| 180 | privacy is set by the wavelength of light, not by any protocol. |
| 181 | |
| 182 | **Mirrorfall.** A failed foil sinks out of the beam and falls. Terminal velocity at |
| 183 | the floor is 0.48 m/s; the descent takes about two days and it lands like a |
| 184 | snowflake. There is a permanent slow glitter coming down out of Tower's sky. |
| 185 | |
| 186 | #### Illumination is a dial, not a constant |
| 187 | |
| 188 | 54.3 TW is Tower's *capability*, not its setting. Spread over the inner surface it |
| 189 | is 320 W/m² mean, which — with roughly half the surface lit at a time and a |
| 190 | sinusoidal day profile — puts **local noon at ~1,000 W/m², Earth clear-sky |
| 191 | daylight**. But the diffusers are software-controlled, so brightness is genuinely |
| 192 | adjustable in-world across the full range: |
| 193 | |
| 194 | | Setting | Mean W/m² | Feels like | |
| 195 | |---|---|---| |
| 196 | | Twilight | 30 | permanent overcast dusk | |
| 197 | | Temperate | 200 | Earth's global mean | |
| 198 | | **Full** | **320** | **Earth clear-sky noon** | |
| 199 | |
| 200 | This should be a control in the app, not a fixed number. It is the most |
| 201 | characterful thing about a world whose sun is a machine. |
| 202 | |
| 203 | #### Headroom |
| 204 | |
| 205 | 5,000× is **11 % of the étendue limit** (46,223× at 1 AU). Tower could in principle |
| 206 | push the beam 9.2× further and cook itself; the diffuser network is as much a safety |
| 207 | system as a lighting system. 5,000× was chosen because it is *demonstrated* |
| 208 | technology — the Odeillo solar furnace reaches ~10 MW/m² on Earth today. Nothing in |
| 209 | Tower's sun system requires physics that does not exist. See `decisions.md` D-003. |
| 210 | |
392bb8a7 2026-09-08 Pavel Safronov | 211 | #### 1.3.2 Night, and the difference between banked and off |
| 212 | |
59c12827 2026-09-28 Pavel Safronov | 213 | **Night is the sun going out and the beam banked** (D-074). The sun reaches the far |
| 214 | cap at sunset and the shoal disperses; the beam is then banked for the night, and |
| 215 | comes back up for the sun to light at the sun cap in the morning. Banking is not |
| 216 | optional, for the reason below. |
| 217 | |
392bb8a7 2026-09-08 Pavel Safronov | 218 | **Night cannot be made by aiming the swarm away.** The glow above belongs to the |
| 219 | beam and the air, not to the diffusers, so a fully lit beam lights the world |
| 220 | whatever the mirrorlets are doing: 779 W/m²/sr over a strip 3.65° wide running |
| 221 | horizon to horizon is about 0.2 sr, which lands **~100 W/m² on the floor** — half |
| 222 | of temperate, and no kind of night. Tower's night is therefore made by **banking |
| 223 | the beam itself**, to a thousandth of full: **0.32 W/m²**, a rod you can still find |
| 224 | overhead and a world you can just make out under it (D-046). |
| 225 | |
| 226 | **Shutting the beam down entirely is a different state and a much worse one.** No |
| 227 | airlight, no lit ground, no rod — the only thing left in the world is the sky |
| 228 | through the far cap. §1.9.4 gives the thermal mass about a week of coasting, so |
| 229 | this is a state Tower can survive and not one it can sit in. |
| 230 | |
| 231 | | Setting | Floor | What it is | |
| 232 | |---|---|---| |
| 233 | | Dark | **0** | the beam shut down. Stars, and nothing else. | |
| 234 | | Night | **0.32 W/m²** | the beam banked to a thousandth | |
42b4554e 2026-09-29 Pavel Safronov | 235 | | Moonlit night | up to **0.64 W/m²** | the same, and a full moon's light again (§1.3.5) | |
392bb8a7 2026-09-08 Pavel Safronov | 236 | | Twilight | 30 W/m² | | |
| 237 | | Temperate | 200 W/m² | | |
| 238 | | Full | 320 W/m² | Earth clear-sky noon | |
| 239 | |
da6bcb0e 2026-09-08 Pavel Safronov | 240 | #### 1.3.3 The far cap mirror, and where the last quarter of the beam goes |
| 241 | |
f16f084e 2026-09-28 Pavel Safronov | 242 | *Since D-079 the mirror is lit at every hour.* By day the sun's shoal takes part of the |
| 243 | beam where it is and lets the rest run on to the far cap; by night the mirror works on the |
| 244 | banked beam. The rod always ends on it. |
59c12827 2026-09-28 Pavel Safronov | 245 | |
da6bcb0e 2026-09-08 Pavel Safronov | 246 | The swarm has optical depth 1.41, so **24% of the beam survives all 540 km** — and |
| 247 | it survives *collimated*, in the beam's own 7.96 km² cross-section. That is the |
| 248 | whole shape of the problem: not 13 TW spread over a 7,854 km² cap, but **1.7 MW/m² |
| 249 | in a 3.2 km spot**, about 1,200 suns. An absorber there sits at **2,330 K**. |
| 250 | |
| 251 | **So the spot is a mirror** (D-048), and only the spot: it is a thousandth of the |
| 252 | cap's area, which is what leaves the other 99.9% free to be window (§1.4). A mirror |
| 253 | is the cheap answer rather than the expensive one — at 99.9% it absorbs **1,665 |
| 254 | W/m²**, about 1.2 Earth solar constants, so the thing that would have glowed white |
| 255 | is merely warm. |
| 256 | |
| 257 | **It also recovers the energy.** The residual goes back up the column, which makes |
| 258 | the optical path 1,080 km instead of 540 and utilisation **1 - e^(-2τ) = 94%** |
| 259 | rather than 76%. What survives even the return trip leaves through the beam |
| 260 | aperture toward the collector, which sends it back again; in the limit the whole |
| 261 | 54.3 TW lands on the inner surface. **This is why full brightness is 320 W/m² and |
| 262 | not 243** — the figure in §1.3 assumes the entire beam is eventually used, and with |
| 263 | the cavity closed at both ends it is. |
| 264 | |
| 265 | Aiming light at a region to warm it is a separate lever and stays one (§1.9.4). The |
| 266 | mirror is about not wasting the beam; the desert is about where the weather goes. |
| 267 | |
59c12827 2026-09-28 Pavel Safronov | 268 | #### 1.3.4 The day: a sun that crosses the world |
| 269 | |
| 270 | *Rewritten for D-074; it replaces the dawn front of D-053.* |
2bb3e0de 2026-09-08 Pavel Safronov | 271 | |
| 272 | Tower's day is **24 hours**, chosen for the people living under it — nothing |
| 273 | physical offers one, since the spin is 7.5 minutes and has nothing to do with light. |
de3d60d6 2026-09-29 Pavel Safronov | 274 | **Tower keeps an Earth city's days: Pisa's** (D-089; until then, Sydney's). Its clock is |
| 275 | Pisa's — Italian time, daylight saving included — and its sunrise and sunset are Pisa's, |
| 276 | so the days lengthen and shorten with Pisa's seasons. Day 0 is the northern autumn |
| 277 | equinox, 23 September 2026, so the calendar starts on a 12-hour day and shortens toward |
| 278 | December. The city and that date are the `calendar` in the world file, and can be changed |
| 279 | there. The app's clock opens at Pisa's time now and runs on at the speed it was last run at. |
59c12827 2026-09-28 Pavel Safronov | 280 | |
| 281 | **The sun crosses the world once a day.** It lights at the **sun cap** at sunrise, |
| 282 | travels at a steady speed down the axis, and reaches the **far cap** at sunset, where |
de3d60d6 2026-09-29 Pavel Safronov | 283 | it goes out. At the equinox that is 540 km in 12 hours 11 minutes — **44 km/h**, a sun |
| 284 | you can watch move; at midwinter the day is 8 h 55 min and it runs at 61 km/h, and at |
| 285 | midsummer 15 h 27 min and 35 km/h. It takes a quarter of an hour to light and a quarter |
59c12827 2026-09-28 Pavel Safronov | 286 | of an hour to go out, which is the shoal gathering and dispersing. Then it is night |
| 287 | (§1.3.2) until the next sunrise. |
| 288 | |
| 289 | **Every place has its own noon.** The sun is 50 km overhead when it passes, so each |
| 290 | place along the world has its midday at a different hour: the sun-cap end in the early |
| 291 | morning, The Capital at about midday, the far-cap end towards evening. Away from |
| 292 | overhead the sun stands lower — 45° at 50 km off, 11° at 270 km — and the ground is lit |
| 293 | by how high it stands (§1.3.1). It never sets: from one cap, the sun at the other is |
| 294 | still 5° up. Morning is a low sun in the sunward sky, evening a low sun deepward. §1.9.4 |
| 295 | says Tower has no latitude; the sun gives it **longitude**, and a direction for its days. |
| 296 | |
| 297 | **The same sun inside and out.** The sun is a point on the beam, lit by the beam, and it |
| 298 | is drawn once and seen by both views — from the floor, and in through the windows from |
| 299 | outside — with the same haze between it and the eye. |
2bb3e0de 2026-09-08 Pavel Safronov | 300 | |
42b4554e 2026-09-29 Pavel Safronov | 301 | #### 1.3.5 The night: a moon |
| 302 | |
| 303 | *Asked for by the author, 2026-09-28; D-088.* |
| 304 | |
| 305 | **Tower has a moon.** By night the swarm gathers a second, smaller shoal on the banked beam, |
| 306 | the size of the sun — 3.2 km, as Earth's Moon and Sun are one size in Earth's sky. It lights |
| 307 | at the **far cap** as the sun goes out there at dusk, and crosses the world **the other way**, |
| 308 | sunward, reaching the **sun cap** by sunrise, where the sun lights behind it. At the equinox |
de3d60d6 2026-09-29 Pavel Safronov | 309 | that is 540 km in about 11 h 50 min, some 46 km/h; the long winter nights run it slower. |
42b4554e 2026-09-29 Pavel Safronov | 310 | |
de3d60d6 2026-09-29 Pavel Safronov | 311 | **It keeps Earth's Moon's phases**, as the sun keeps Pisa's days. Its disc is lit as much as |
42b4554e 2026-09-29 Pavel Safronov | 312 | the Moon is lit that night, and shaped like it: the lit part lies toward the far cap while it |
| 313 | waxes — the end the sun went out at, as a waxing moon on Earth is lit on the side of the set |
| 314 | sun — and toward the sun cap while it wanes, the end the sun will light at. The dark part is |
| 315 | not drawn; those mirrorlets are simply turned away. At new moon there is no moon. |
| 316 | |
| 317 | **It lights the world.** At full it throws as much light on the floor as the whole banked rod, |
| 318 | so a full-moon night is twice as bright as a moonless one — 0.64 W/m² against 0.32 — and lit |
| 319 | from one direction, with the land facing it brighter. Tower banks the beam that much less to |
| 320 | feed it. This is a choice and not a necessity: Earth's full moon is about a hundred and |
| 321 | fiftieth of Tower's banked night, and would be lost in it. Water shows a path of moonlight. |
| 322 | |
866c7f96 2026-09-07 Pavel Safronov | 323 | ### 1.4 Sealed hull, and the cap windows |
| 324 | |
| 325 | **The cylinder wall is opaque and unbroken.** No slats, no windows, no view out |
| 326 | along any of the 540 km. From anywhere on the inner surface, the sky is land, haze |
| 327 | and the beam — nothing else. See D-017. |
| 328 | |
| 329 | The only views out are at the **end caps**, and they are peculiar: |
| 330 | |
| 331 | - **A cap is a wall, not a floor.** Gravity there points radially outward, which is |
| 332 | *tangent* to the cap's surface, so nothing rests on it — you would slide to the |
| 333 | rim. Each cap is a **50 km vertical cliff** standing at the end of the world, and |
| 334 | its windows sit at its base, at eye level for anyone standing on the floor. |
| 335 | - **The sky through them does not sweep — it turns.** A cap window looks along the |
| 336 | spin axis, which is the celestial pole. Stars rotate about a fixed centre, one |
| 337 | full turn every 7.5 minutes, with one motionless star at the middle. **A pinwheel |
769726ea 2026-09-08 Pavel Safronov | 338 | sky.** It is the only moving sky anyone in Tower ever sees — and because the axis |
| 339 | is horizontal from the floor, it wheels about a point on the **horizon** rather |
| 340 | than overhead. |
59c12827 2026-09-28 Pavel Safronov | 341 | - **The caps have more than one name.** The **sun cap** is the end the beam enters by. |
42b4554e 2026-09-29 Pavel Safronov | 342 | The **far cap** is also the **star cap**: it is the one with the stars in it — and the |
| 343 | **night cap**, since night starts there: the sun goes out at it at dusk, and the moon sets |
| 344 | out from it (D-088). All are used, and more names are added as they come into use (author, |
| 345 | 2026-09-27, 2026-09-28). |
769726ea 2026-09-08 Pavel Safronov | 346 | - The **far cap is glazed whole** — a 100 km window looking into deep anti-sun |
| 347 | space, not a wall with windows at its foot (D-045). Its structure survives as the |
c954a775 2026-09-28 Pavel Safronov | 348 | window's **mullions**, a lattice of identical equilateral triangles 8.3 km on a side |
| 349 | (D-078) — the old checker's pitch — so the one object in the world with a known scale still is one: |
769726ea 2026-09-08 Pavel Safronov | 350 | the rule now reads against the sky instead of against a plate. The **sun cap** |
9c891d2e 2026-09-08 Pavel Safronov | 351 | faces the collector rather than the sun, and is **glazed too** (D-050): §1.3.0 |
| 352 | retires the "heavy glare management" this section used to demand of it, because no |
| 353 | direct sunlight has ever reached it. Through it, a 244 km black disc, stars round |
| 354 | the edge of it, and the beam blazing out of the aperture at its centre. |
769726ea 2026-09-08 Pavel Safronov | 355 | - **By day the window is simply blue.** §1.5 puts the far cap 100–200 km into the |
| 356 | haze, so from anywhere but the deepward end the airlight in front of it swamps |
| 357 | whatever is behind, and the cap reads as a disc of sky. The stars are there at |
| 358 | noon and unseeable, which is a fact about eyes and not about the glass. |
9f91e995 2026-09-29 Pavel Safronov | 359 | - **The far cap is single-glazed, and it frosts** (D-090). The glass is the coldest |
| 360 | surface in the world and collects frost on its inner face, so Tower clears it one pane |
| 361 | at a time, one pane per turn of the world in an order reshuffled every 35.1-hour loop. |
| 362 | Close to, the window is a white lattice with a scatter of clear, black, starry |
| 363 | triangles, and which ones are clear keeps changing. §1.9.6 has the numbers, and the |
| 364 | cold wind and ice the window makes at its foot. |
| 365 | - **The sun cap is double-glazed** (author, 2026-09-29; D-090). Its inner pane stays |
| 366 | near the air's temperature, so it neither frosts nor chills the world: the Sunward Sea is |
| 367 | a temperate sea and the Deepward Sea the only cold one. The two caps are glazed |
| 368 | differently on purpose. |
da6bcb0e 2026-09-08 Pavel Safronov | 369 | - **The beam does not go through it.** §1.3.3 puts the surviving quarter of the |
| 370 | beam on a 3.2 km bullseye at the centre of the cap, and that bullseye is a mirror |
| 371 | rather than glass: it returns the residual up the column for a second pass. The |
| 372 | window is everything else, which is 99.9% of the disc. |
| 373 | - **The mirror is not the pinwheel's centre, and it is worth being clear why.** The |
| 374 | sky turns about the direction *parallel* to the spin axis, and from anywhere on |
| 375 | the floor that direction is horizontal — so **the pinwheel's centre is at eye |
| 376 | level, dead ahead**, down where the window meets the ground, not overhead and not |
| 377 | at the middle of the cap. The mirror is a physical object *on* the axis, which |
| 378 | from 270 km sits about 10° above that. They coincide only for an observer |
| 379 | standing on the axis itself, and nobody can. By day the mirror blazes — it is |
| 380 | returning 1.7 MW/m² — and is the brightest thing in Tower's sky; at night it |
| 381 | banks with the beam and goes dark. |
866c7f96 2026-09-07 Pavel Safronov | 382 | |
| 383 | **Nobody aboard can ever see Earth.** Tower holds a terminator orbit (D-004), which |
| 384 | puts Earth roughly 90° off the axis — out the *side* of the cylinder, which is now |
| 385 | solid hull. A habitat in Earth orbit whose inhabitants have never seen the planet |
| 386 | they orbit. |
| 387 | |
99a2821b 2026-09-29 Pavel Safronov | 388 | **Spacecraft dock anywhere on the outer shell** (author, 2026-09-28; D-087). There is no |
| 389 | port: a ship matches the hull's spin and sets down where it likes. Docked, it turns with the |
| 390 | hull at 700 m/s and hangs from its clamps, pressed outward at 1.02 g — its feet toward the |
| 391 | hull and its floor toward space. |
| 392 | |
866c7f96 2026-09-07 Pavel Safronov | 393 | The caps are therefore the only places in the world with a horizon that is not |
| 394 | Tower. Whatever grows up around them, it will not be ordinary. |
| 395 | |
| 396 | ### 1.5 Atmosphere and the look of the sky |
| 397 | |
| 398 | Air co-rotates with the shell. Because g falls linearly to zero at the axis, the |
| 399 | atmosphere is much deeper than Earth's: |
| 400 | |
| 401 | - Pressure at the axis, 50 km up: **5.2 kPa** — thin, but genuinely air. |
| 402 | - A vertical column floor-to-axis is ~10,600 kg/m², about **one Earth atmosphere**. |
| 403 | |
| 404 | So the interior sky behaves like this, and the shader must reproduce it: |
| 405 | |
| 406 | - **Straight up** you look through ~1 atmosphere and see the far side of the world |
| 407 | 100 km away — visible, but washed to pale blue like a very distant mountain range. |
| 408 | - **Along the axis** you look through many atmospheres. The far end cap is not |
| 409 | visible as a wall; it dissolves into blue haze around 100–200 km out. The world |
| 410 | reads as endless in the axial direction and closed in the circumferential one. |
| 411 | - **The ground curves up on both sides** into that same blue, meeting overhead. |
| 412 | - **The beam** is a self-luminous scattering shaft 3.65° wide at 779 W/m²/sr — |
f16f084e 2026-09-28 Pavel Safronov | 413 | render it as a bright sunlit cloud, not as a light source with a halo. It runs |
| 414 | from cap to cap at every hour; by day it is dimmer past the sun (§1.3.1, D-079). |
59c12827 2026-09-28 Pavel Safronov | 415 | - **The sun** is the other thing in the sky that is not land: a blazing disc on the |
| 416 | beam, 3.65° across from directly beneath and smaller from afar, with glare round it |
42b4554e 2026-09-29 Pavel Safronov | 417 | (§1.3.4). By night there is the **moon** instead, smaller in light and crossing the other |
| 418 | way, as lit as Earth's Moon (§1.3.5). With the hull sealed, the rod, the sun and the moon are |
| 419 | all there is. |
866c7f96 2026-09-07 Pavel Safronov | 420 | |
| 421 | ### 1.6 Orbit and attitude |
| 422 | |
| 423 | - Tower holds a high circular orbit with its **orbital plane kept normal to the |
| 424 | Earth–Sun line** — a terminator orbit. This is why one cap can face the sun |
| 425 | permanently and Tower is never eclipsed. |
| 426 | - The plane precesses 360° per year to track the sun. Tower's angular momentum is |
| 427 | enormous, so this 1°/day reorientation is actively driven, continuously, forever. |
| 428 | Canon treats this as Tower's defining maintenance burden. |
| 429 | - Consequence for the interior view: the star field slowly drifts across the year |
e331ec2a 2026-09-28 Pavel Safronov | 430 | while spinning fast every 7.5 minutes. Two nested motions. Both are drawn (D-075): |
| 431 | the far cap looks at the antisolar point, which walks the ecliptic a degree a day. |
866c7f96 2026-09-07 Pavel Safronov | 432 | |
| 433 | ### 1.7 Coordinates |
| 434 | |
| 435 | The canonical surface coordinate is **(θ, z)**: |
| 436 | |
| 437 | - `θ` — angle around the cylinder, 0 to 2π. θ = 0 is the centre of land strip 0. |
| 438 | - `z` — distance from the sun cap, 0 to 540 km. |
| 439 | |
| 440 | The 2D map is the direct unroll: `x = z`, `y = (θ − θ₀) · R`. No projection |
| 441 | distortion — a cylinder unrolls exactly. This is a genuine advantage over mapping a |
| 442 | globe and the map view should lean on it. |
| 443 | |
| 444 | **The map shows the surface once, bounded**, so its extent is readable. That means |
| 445 | it needs an edge, and the edge is placed at **θ₀ = the centre of the last slat**. |
| 446 | Land strip 0 is centred on θ = 0, so cutting there would slice a whole strip in |
| 447 | half across the top and bottom margins; cutting at a slat centre leaves every land |
| 448 | strip whole and splits only a band of stars, which carries no geography. Same |
| 449 | reasoning as putting Earth's map edge at the antimeridian. A sightline whose short |
| 450 | route crosses the edge is drawn as two segments, so the drawn path always matches |
| 451 | the measured distance. |
| 452 | |
| 453 | --- |
| 454 | |
| 455 | ### 1.8 Sightlines: Tower has two horizons |
| 456 | |
| 457 | Along the axis the floor is perfectly flat and never falls away, so nothing is ever |
| 458 | hidden by curvature. **Tower's horizon is haze.** Circumferentially the floor curves |
| 459 | *up*, so distant land rises into the sky rather than sinking below a line. The two |
| 460 | directions behave completely differently, and this is one of the most alien facts |
| 461 | about living there. |
| 462 | |
| 463 | Rayleigh transmission from a floor-level observer: |
| 464 | |
| 465 | | Distance | Along the axis | Across the interior (overhead) | |
| 466 | |---|---|---| |
| 467 | | 26 km | 78 % | 77 % | |
| 468 | | 50 km | 56 % | 70 % | |
| 469 | | 100 km | **31 %** | **78 %** | |
| 470 | | 270 km (far cap from midpoint) | **4 %** — a ghost | — | |
| 471 | |
| 472 | Two consequences: |
| 473 | |
| 474 | - **The axial horizon closes at 100–150 km.** From the midpoint you cannot see |
| 475 | either end cap. Everyone can see 100 km, knows there is more beyond, and cannot |
| 476 | resolve it — a different psychology of distance than Earth's 5 km cliff-edge. |
| 477 | - **The far side of the world is clearer than the ground at the same distance,** |
| 478 | because a sightline across the interior rises through thin axis air while one |
| 479 | along the floor grinds through full density. It gets *better* with distance: the |
| 480 | land directly overhead, 100 km away, is the crispest far object in Tower at 78 %. |
| 481 | **Distant geography is best seen by looking up.** People would orient by what is |
| 482 | overhead; the ground is the vague part. This inverts the human default. |
| 483 | |
| 484 | ### 1.9 Water |
| 485 | |
| 486 | Tower's hydrology is stranger than its geometry, and most of it follows from one |
| 487 | fact and one absence. |
| 488 | |
| 489 | #### 1.9.1 Coriolis never pushes surface water sideways |
| 490 | |
| 491 | The floor's tangent plane is spanned by θ̂ and ẑ, and the spin axis is ẑ. For any |
| 492 | flow along the surface: |
| 493 | |
| 494 | - **along the axis** — `ẑ × ẑ = 0`, no Coriolis force at all; |
| 495 | - **around the circumference** — `ẑ × θ̂ = −ŝ`, the force is purely radial. |
| 496 | |
| 497 | The Coriolis term never has a component *inside* the surface. So **Tower's rivers |
| 498 | do not curve.** No hemispheres, no Baer's law, no preferred bank erosion, no gyres, |
| 499 | no cyclones. Every large-scale rotational habit of Earth's water and weather is |
| 500 | absent, and a meander in Tower is pure flow dynamics with no thumb on the scale. |
| 501 | |
| 502 | #### 1.9.2 What it does instead: everything vertical leans |
| 503 | |
| 504 | The force goes into the floor rather than across it, so it appears whenever water |
| 505 | moves up or down. Deflection of a free fall goes as h^1.5: |
| 506 | |
28f9a6bc 2026-09-07 Pavel Safronov | 507 | | Fall | Lands (retrograde) | Lean of the path | Lean at impact | |
| 508 | |---|---|---|---| |
| 509 | | 100 m | 4.2 m | 2.4° | 3.6° | |
| 510 | | 500 m | 47 m | 5.4° | 8.1° | |
| 511 | | **1,000 m** | **133 m** | **7.6°** | **11.3°** | |
| 512 | | 2,000 m | 377 m | 10.7° | 15.8° | |
| 513 | |
| 514 | Two different angles, and the interior view needs both. The **path** leans by where |
| 515 | the water lands against how far it fell — the tilt of a waterfall's plume seen |
| 516 | whole. The **impact** lean is the direction the water is actually moving when it |
| 517 | arrives, which is what a streak of it is drawn at, and it is half again the other in |
| 518 | tangent. `src/canon/motion.ts` computes both. |
866c7f96 2026-09-07 Pavel Safronov | 519 | |
| 520 | **Rain falls permanently slanted** — a raindrop at terminal velocity sits at a fixed |
| 521 | **1.47° against the spin**, ~51 m of drift over a 2 km fall, never varying, never |
28f9a6bc 2026-09-07 Pavel Safronov | 522 | reversing. It is fixed because drag holds the fall speed constant, so unlike free |
| 523 | fall the angle does not grow with the drop: rain leans the same 1.5° whatever the |
| 524 | cloud. Set against a waterfall's 11°, **the waterfall is the compass and the rain is |
| 525 | not**, which is the opposite of what §2.4 originally assumed (D-034). Rising things lean the opposite way: smoke drifts spinward, rain drifts |
866c7f96 2026-09-07 Pavel Safronov | 526 | anti-spinward. Every plume and every shower in Tower tilts, and they tilt against |
| 527 | each other. |
| 528 | |
| 529 | The same applies to anything that descends, not just water — see §1.11 on what it |
| 530 | does to skiing. |
| 531 | |
| 532 | Horizontal flow changes *weight* rather than direction (Eötvös): +0.57 % for a |
| 533 | 2 m/s prograde river, negligible hydrologically. It only matters at speed — an |
| 534 | express train at 100 m/s gains 29 %, and anything moving retrograde at the 700 m/s |
| 535 | rim speed is stationary in space and therefore weightless. |
| 536 | |
| 537 | #### 1.9.3 A perfect cylinder has no slope anywhere |
| 538 | |
| 539 | Potential depends only on radius, so **the whole floor is a single equipotential |
| 540 | surface.** Water on it has no preferred direction: a perfect Tower has no rivers at |
| 541 | all, forever. |
| 542 | |
| 543 | **Every river in Tower exists because the floor was shaped.** There are no |
| 544 | tectonics and no uplift, so erosion is strictly one-way — a 3 km range wears flat in |
| 545 | ~30 Myr under a wet engineered climate, ~150 Myr under a dry one. Tower's rivers |
| 546 | are steadily destroying its landscape and the highlands must be rebuilt to keep them |
| 547 | running. This is D-004's theme again: Tower's rivers are plumbing it chose to |
| 548 | install and has to keep re-installing. |
| 549 | |
| 550 | Two corollaries: |
| 551 | |
| 552 | - **No river can circumnavigate.** A closed loop has no net descent. |
| 553 | - **Lakes curve upward.** Level means constant radius, so across a 30 km lake the |
| 554 | far shore rides **2.3 km above your tangent plane** — Earth would hide it 18 m |
| 555 | below the horizon. You look *up* at the opposite beach, and water appears to |
| 556 | climb away from you. |
| 557 | |
| 558 | #### 1.9.4 There is no passive climate at all |
| 559 | |
| 560 | **Tower has no latitude** — every point is equidistant from the light — and with the |
9f91e995 2026-09-29 Pavel Safronov | 561 | hull sealed it has no windows in its walls either. A uniform hull radiates at 274 K |
| 562 | everywhere, so left alone the world settles into a flat calm: no gradient, no wind, no |
| 563 | evaporation, no rain, no rivers. **The one exception is the far cap**, whose window is |
| 564 | a cold wall the size of the cap (§1.9.6, D-090); it makes a gradient at the deepward |
| 565 | end whatever Tower does. |
866c7f96 2026-09-07 Pavel Safronov | 566 | |
| 567 | **So every weather system in Tower is deliberate.** Tower makes climate the only way |
| 568 | left to it — by aiming light. It warms where it wants convection and shades where it |
9f91e995 2026-09-29 Pavel Safronov | 569 | wants condensation; the hull's loss is the sink. Every cloud, every |
866c7f96 2026-09-07 Pavel Safronov | 570 | rainfall, every jet stream is something Tower is doing, continuously, on purpose. |
| 571 | |
9f91e995 2026-09-29 Pavel Safronov | 572 | **Tower also sets the sink** (D-090). The loss through the hull cannot be passive: |
| 573 | 1 km of rock conducting the mean 320 W/m² would need a difference of some 100,000 K |
| 574 | across it, so heat reaches the outer skin because Tower sends it there. It follows |
| 575 | that Tower can send less of it from one place and more from another. **It can move |
| 576 | about 5 TW** — a tenth of the beam — between regions this way: enough to hold the far |
| 577 | end cold and a few projects besides, not enough to run the climate on. Light is still |
| 578 | how Tower makes weather; heat rejection is how it keeps the books. |
| 579 | |
866c7f96 2026-09-07 Pavel Safronov | 580 | This is D-009 arriving at its conclusion. The mirrorlet swarm was already Tower's |
| 581 | body language; now it is also its lungs and its weather. There is no autonomic |
| 582 | layer underneath. **If Tower's attention ever lapses, the rain stops.** |
| 583 | |
| 584 | Costs, for scale against a 54.3 TW budget: |
| 585 | |
| 586 | | | | | |
| 587 | |---|---|---| |
| 588 | | Earth-like rainfall, 1,000 mm/yr | **12.2 TW** | **22.4 %** — Earth spends the same fraction | |
| 589 | | Recirculating all runoff (1,792 m³/s) against 500 m | 8.8 GW | 0.016 % | |
9f91e995 2026-09-29 Pavel Safronov | 590 | | The far cap window's loss to space (§1.9.6) | 0.65–1.9 TW | 1–4 % | |
866c7f96 2026-09-07 Pavel Safronov | 591 | |
| 592 | #### 1.9.5 Rivers are a closed, pumped circulation |
| 593 | |
| 594 | With no natural cycle and no natural slope, a Tower river is a **loop**: a headwater |
| 595 | reservoir, a shaped descent through the landscape, a lake at the bottom, and a lift |
| 596 | back to the top. Source and sink are the same system. |
| 597 | |
| 598 | Two ways to close the loop, and they give completely different rivers: |
| 599 | |
| 600 | - **The pump outfall.** A river begins at a machine. Walk to the source of any |
| 601 | river and find a wall of water coming out of a structure — not a spring, an |
| 602 | outlet. Costs a rounding error (above). |
| 603 | - **The made cloud.** Tower evaporates the lake with aimed light and condenses it |
| 604 | over the highlands, so rain falls exactly where the river should start. No |
| 605 | machinery: the swarm is the pump. Costs the 22.4 % above, and buys real weather |
| 606 | with it. |
| 607 | |
| 608 | Canon uses **both** — made weather for the world's general hydrology, pumps for |
| 609 | watercourses Tower wants under precise control. |
| 610 | |
| 611 | Two consequences of the sealed hull: |
| 612 | |
| 613 | - **A river can circle the world.** The surface is one unbroken sheet, so a channel |
| 614 | can run the full 314 km circumference and close on itself — a lazy river returning |
| 615 | to its own source. Gravity cannot drive a closed loop, so it is pumped. |
| 616 | - **The water inventory is conserved and exactly known.** Nothing evaporates to |
| 617 | space. Tower knows how much water it has, to the litre, forever. |
| 618 | |
| 619 | Lifting is also slightly cheaper than on Earth, since gravity falls off with height: |
| 620 | 1 % cheaper at 1 km, 5 % at 5 km, 25 % at 25 km. |
| 621 | |
9f91e995 2026-09-29 Pavel Safronov | 622 | #### 1.9.6 The far end is cold, and Tower keeps it so |
| 623 | |
| 624 | *Worked out with the author, 2026-09-28; D-090.* |
| 625 | |
| 626 | **The window is a radiator.** Glass is opaque to thermal infrared, so the far cap's |
| 627 | single glazing does not let the world's heat out as light — it absorbs it, and its outer |
| 628 | face radiates it to space at 3 K. A pane 0.1–1 m thick loses **80–250 W/m²**, and over |
| 629 | the cap's 7,854 km² that is **0.65–1.9 TW**, 1–4 % of the beam. Air cooled against the |
| 630 | glass is denser and slides down the cap, which on a cap means radially outward to the |
| 631 | rim, and it spreads sunward over the Deepward Sea as a **cold wind off the window**, |
| 632 | roughly 5–15 m/s. Nothing Tower does makes this; it is what a cold wall does. The ice at |
| 633 | the foot of the cap is where the physics was going anyway. |
| 634 | |
| 635 | **Tower keeps that end of the world dim, and lets it freeze in bands.** Sunward to cap: |
| 636 | |
| 637 | | z (km) | Band | By day | By night | |
| 638 | |---|---|---|---| |
| 639 | | 496–512 | **open water** | grey sea at about freezing, with sea smoke where the cold wind crosses it | dark | |
| 640 | | 512–525 | **pack ice** | floes made at the fast ice's edge, carried sunward by the wind, melting where they meet open water | dark | |
e18dad04 2026-09-30 Pavel Safronov | 641 | | 525–528.5 | **fast ice** | dusk — the rod's glow and nothing aimed | night; the sun goes out overhead at dusk | |
| 642 | | 528.5–540 | **the Cap Range** | ice mountains, 2–3 km high against the glass, a few crests bare rock | the same, dark | |
| 643 | | 540 | **the window** | white frost with a scatter of clear panes, its foot buried in ice | stars through the clear panes | |
9f91e995 2026-09-29 Pavel Safronov | 644 | |
| 645 | - **The dark is dusk by day, not darkness.** The rod's own glow cannot be aimed away |
| 646 | (§1.3.2) and runs on past the sun to the cap (D-079), so the fast ice gets tens of W/m² |
| 647 | by day — a permanent overcast dusk — and real night only by night. The sun still goes |
| 648 | all the way to the cap (§1.3.4), so once a day it goes out directly over the ice, and |
| 649 | the moon sets out from the same place. |
e18dad04 2026-09-30 Pavel Safronov | 650 | - **Ice mountains stand against the window** (D-093). Snow off the window wind and the |
| 651 | meltwater of every cleared pane come down at the cap's foot and freeze there, so the ice |
| 652 | is thickest against the glass. But grounded ice cannot stand much higher than a few |
| 653 | hundred metres over a few kilometres — it spreads under its own weight until the stress |
| 654 | at its bed is what the bed will take, about 150 kPa for cold ice frozen down — and on a |
| 655 | 420 m sea that is a kerb: 280 m against a 50 km window. So **Tower raised a range there |
| 656 | for the ice to stand on**, as it raised the Uplands (D-064): the **Cap Range**, rock rising |
| 657 | from the sea bed at 524 km to about 2,400 m at the cap, higher in some places round the |
| 658 | ring than others. Ice mantles it from where the rock leaves the water, about 528.5 km, in a |
| 659 | low front over the fast ice, thickening as an ice sheet does to 350 m on the heights, and |
| 660 | it drapes the ridges rather than burying them level, so the range reads as mountains and |
| 661 | its sharpest crests stand out as bare rock. Against the glass it stands **2 to 3 km up the |
| 662 | window**, and the window's foot is buried in it. The sea no longer meets the cap: the |
| 663 | fast ice ends against the range. |
9f91e995 2026-09-29 Pavel Safronov | 664 | - **The fast ice holds.** The window wind pushes on it with about 1,500 N per metre of |
e18dad04 2026-09-30 Pavel Safronov | 665 | shore; 3 m of ice frozen to the range's foot holds some 3 MN. **Tower has no tides** — its moon |
9f91e995 2026-09-29 Pavel Safronov | 666 | is light (§1.3.5) — so the thing that breaks Earth's fast ice out is absent. Storm swell |
| 667 | is the threat to it, and the Deepward Sea is on the weather plan. |
| 668 | - **The whole sea is ice-cold, not only the ice.** With no Coriolis in the plane of the |
| 669 | floor (§1.9.1), a 1 K difference in the water drives an exchange of about 0.45 m/s, |
| 670 | cold out along the bottom and warm in over the top. That mixes the sea's 44 km to within |
| 671 | about a kelvin, so the open water sits at freezing. It is a polar sea, grey and foggy, |
| 672 | and its coast has fog where the land's air comes down onto it. **No sea in Tower can |
| 673 | be frozen in one corner** — only whole or not at all. |
| 674 | - **The window's bill is paid by the air.** If the sea paid the 0.65–1.9 TW, the open |
| 675 | water would need daylight on it, 140–400 W/m². Instead the weather runs one overturning |
| 676 | cell: warm air from the lit lands comes deepward aloft to the glass, cools, sinks, and |
| 677 | goes back sunward along the surface as the window wind. The sea pays only what that |
| 678 | wind takes from the open water, which is also how fast ice is made — so **Tower sets |
| 679 | the ice edge by how hard it runs the cell**. |
| 680 | - **Tower turns the hull down under the sea** (§1.9.4). If the floor went on drawing its |
| 681 | share, the sea would be cooled from beneath and freeze on its bed first, and no light |
| 682 | would keep any of it open. The far end takes about 2 TW of Tower's 5 TW of heat control. |
| 683 | |
| 684 | **The window frosts, and Tower clears it one pane at a time.** Cold glass collects frost |
| 685 | on its inner face — very roughly millimetres a day, enough to whiten a pane in days — so |
| 686 | left alone the far cap would go white and the stars would go. Tower heats one pane at a |
| 687 | time from its frame: melting a pane's frost is about 6 × 10¹² J, a few minutes at tens of |
| 688 | GW, and the meltwater runs down the cap onto the ice. |
| 689 | |
| 690 | - **One pane per turn of the world**, every 7 min 29 s. The window has **282 panes** |
| 691 | (216 whole triangles and 66 cut by the rim, D-078), so a loop takes **35.1 hours** — |
| 692 | not a whole number of days, so the clearing drifts against day and night. |
| 693 | - **Shuffled, and reshuffled every loop.** A fixed order could be learned by anyone who |
| 694 | watched long enough; a fresh one each loop cannot. Each loop's order is drawn from the |
| 695 | world's seed and the loop's number, so which panes are clear at any moment can be |
| 696 | worked out without the history, the same in the app and in the book. |
| 697 | - A pane's gap between clearings runs from almost nothing to almost two loops, so the |
| 698 | frost on it ranges from clean glass to thick white. The window reads as a white lattice |
| 699 | with a scatter of black, starry triangles, perhaps one in ten; how long a pane stays |
| 700 | clear rests on the frost rate, which is rough to a factor of ten. |
| 701 | |
e18dad04 2026-09-30 Pavel Safronov | 702 | **As drawn** (D-091). The Deepward Sea's `ice` in the world file puts the bands where the |
| 703 | table has them, and the water shader draws the pack as floes and leads and the fast ice as |
| 704 | one cracked sheet. Tower's aimed light falls from the shore to about a third at the ice |
| 705 | edge, a tenth at the fast ice and nothing on it, which leaves the fast ice the rod's |
| 706 | twentieth by day; the views show that through the same 0.35 power the exposure gives the |
| 707 | light dial, so the fast ice reads as dusk, not black. The frost closes a cleared pane as |
| 708 | 1 − e^(−age / 10 h), which leaves about one pane in ten nearly clear, and the pane being |
| 709 | cleared thaws across its turn. Both views share the window, so the frost is the same from |
| 710 | outside. |
| 711 | |
abc0aad0 2026-10-01 Pavel Safronov | 712 | #### 1.9.7 Farms on their own days |
| 713 | |
| 714 | *Asked for by the author, 2026-09-30; D-095.* |
| 715 | |
| 716 | **Tower gives each crop the day its plant wants.** Any light on any field at any hour is |
| 717 | what the swarm is for (§1.3.1), so a farm in Tower does not live by the sun. The author's |
| 718 | first thought was full sunlight around the clock; the plants would not thank Tower for it. |
| 719 | Most flowering plants measure the night to know when to flower, and some — tomatoes — are |
| 720 | injured by light that never stops. So every field gets darkness, and its own length of day: |
| 721 | |
| 722 | | | Day Tower gives it | Why | |
| 723 | |---|---|---| |
| 724 | | rapeseed, flax, wheat | 18 h | long-day plants: they flower sooner and fuller under long days | |
| 725 | | lavender, poppies, phacelia, tomatoes | 16 h | long-day; tomatoes are day-neutral but need about six hours of dark | |
| 726 | | tulips, sunflowers, maize, lettuce | 14 h | day-neutral, or nearly | |
| 727 | | buckwheat, potatoes | 12 h | short-day; potatoes set their tubers on short days | |
| 728 | |
| 729 | - **A field's day starts at sunrise and is lit as at noon** from first light to last, not |
| 730 | by a sun climbing and setting. A long-day crop is lit **on into the night**; a short-day |
| 731 | crop has its light taken away before the sun sets. |
| 732 | - **Tower cannot make a field dark by day.** The rod's own glow cannot be aimed away |
| 733 | (§1.3.2), so a short day ends in the far end's dusk, a twentieth of the light, and only |
| 734 | the world's night is truly dark. |
| 735 | - **The fields show at night.** For the first hours after sunset most of them are still lit |
| 736 | as at noon — a patchwork blazing in a dark world — and they go out one crop at a time, |
| 737 | the last of them six hours after sunset at the equinox. |
| 738 | - **They cost the world a little of its night.** Lighting fields after dark means a beam |
| 739 | not quite banked, and the rod glows with the beam. With **250 km²** of fields, chosen by |
| 740 | the author for this, about 220 GW goes to them just after sunset — 0.4% of the beam — |
| 741 | which adds about 0.4 W/m² of the rod's glow everywhere, a moonlit night's worth, falling |
| 742 | to nothing by six hours after sunset. At 1,000 km² it would be a permanent twilight. |
| 743 | - **Nine farms share the 250 km²**, spread round the world and down its length (D-096): |
| 744 | two on the Uplands beside the Uplands Ring, four in clearings cut out of Greatwood — one |
| 745 | of them the nearest fields to the Capital — and three on the open ground before the far |
| 746 | end, one at the Axial Line's railhead. Each is about 28 km² (provisional names: Ringside, |
| 747 | Far Ringside, Greatwood Clearing, Capital, Deepwood, Greatwood, Railhead, Far and Last |
| 748 | Fields). Three-quarters of the fields are flowers in bloom — tulips red, yellow, pink and |
| 749 | white, lavender, sunflowers, rapeseed, poppies, flax, phacelia, buckwheat — and the rest |
| 750 | maize, potatoes, tomatoes, wheat and lettuce. |
| 751 | - **Farms grow; they are not drawn** (D-097). Each farm is a seed and an area, and grows |
| 752 | outward over the land a patch at a time, taking the nearest and luckiest ground at its |
| 753 | edge and never water, sand, rock, a range or a slope too steep to plough — so it comes out |
| 754 | ragged, with lobes and bays, and goes round a river rather than across it. Its edge runs |
| 755 | along its fields' edges: a field is in the farm or not, whole. |
| 756 | - **Fields are irregular, the way old farmland is.** The land is divided into blocks about |
| 757 | 1.5 km across, with farm tracks along their edges, and each block was taken in hand on its |
| 758 | own terms: its fields run at its own angle, are its own size (220–440 m), and are drawn out |
| 759 | long by its own stretch. Inside it the fields have straight edges meeting at odd angles, |
| 760 | and a third of them are cut again into long strips. No line runs further than a block, and |
| 761 | no two blocks agree. |
| 762 | |
866c7f96 2026-09-07 Pavel Safronov | 763 | ### 1.10 Slat orientation — RESOLVED: none |
| 764 | |
| 765 | Axial strips versus rings was weighed at length (D-016) and answered by removing |
| 766 | slats entirely (D-017). The comparison is kept in D-016 because it established what |
| 767 | the choice *cost*, and because the reasoning — that slat layout sets the shape of |
| 768 | Tower's countries, its climate map and its astronomy all at once — is what made |
| 769 | "none" a real option rather than an absence. |
| 770 | |
| 771 | ### 1.11 The world as built |
| 772 | |
376f2ce6 2026-09-16 Pavel Safronov | 773 | Authored geography lives in **`content/world.json`** — the source of truth — as |
| 774 | features the browser generates the terrain from live (world-generation.md, D-062). |
| 775 | Names are provisional. Tower is laid out in **belts |
866c7f96 2026-09-07 Pavel Safronov | 776 | along the axis**, which is the natural grain of an engineered climate (§1.9.4): |
| 777 | |
| 778 | | z | | | |
| 779 | |---|---|---| |
| 780 | | 0–42 km | **The Sunward Sea** | ring ocean at the foot of the sun cap | |
03607270 2026-09-08 Pavel Safronov | 781 | | 55–140 km | **the range** | Westwall, The Sisters, **Snowcrown** (4,300 m), Eastwall — the named high points of **The Girdle**, which rings the world at z 90 km (D-051) | |
14d35b7d 2026-09-16 Pavel Safronov | 782 | | 105–150 km | **The Uplands** | ground Tower raised to about 1,000 m, ringing the world, so the rivers off the range can run down to The Narrows (D-064) | |
51c39d8b 2026-09-17 Pavel Safronov | 783 | | 148–218 km | **The Dry Reach** | desert **ringing the world**, 22,000 km², 13% of the surface: mesas over dune fields, dry washes, and salt pans ringed by shorelines (D-069) | |
866c7f96 2026-09-07 Pavel Safronov | 784 | | 176/190/203 km | **three ridges** | ringing, concentric — and **The Narrows** is the only breach in all three | |
abc0aad0 2026-10-01 Pavel Safronov | 785 | | 129–470 km | **the farms** | nine farms of about 28 km², 250 km² in all, round the world: on the Uplands, in Greatwood's clearings, before the far end (§1.9.7, D-095, D-096) | |
00ceeedb 2026-09-27 Pavel Safronov | 786 | | 214–430 km | **Greatwood** | forest belt: about three billion trees, with meadows Tower left open in it (D-071) | |
866c7f96 2026-09-07 Pavel Safronov | 787 | | 248–402 km | **The Deep** | 154 × 32 km sea, long down the axis and narrow around | |
51c39d8b 2026-09-17 Pavel Safronov | 788 | | 270 km | **The Capital / The Spindle** | axial midpoint; 20 km across, its spinward edge on The Deep's shore (D-070) | |
e18dad04 2026-09-30 Pavel Safronov | 789 | | 496–540 km | **The Deepward Sea** | ring ocean at the foot of the far cap: open water to 512 km, pack ice to 525, dim fast ice to the Cap Range (§1.9.6, D-090) | |
| 790 | | 528.5–540 km | **The Cap Range** | ice mountains Tower raised against the far cap's window, 2–3 km high (D-093) | |
99a2821b 2026-09-29 Pavel Safronov | 791 | | 110–480 km | **The Axial Line** | railway down the length of the world, through The Narrows (D-086) | |
| 792 | | 140 km | **The Uplands Ring** | railway round the world across the Uplands (D-086) | |
| 793 | |
| 794 | The railways keep a grade of their own over the ground rather than cutting it, so they run |
| 795 | on piers much of the way: 10–20 m up over ordinary country, and on long viaducts over the |
| 796 | rivers' gorges. **A train going round the world has a handedness**, like a ski run: the |
| 797 | Ring's trains, at 100 m/s, are 31% heavier running spinward and 27% lighter running |
| 798 | antispinward (`canon/motion.ts`); a train along the axis feels nothing. |
866c7f96 2026-09-07 Pavel Safronov | 799 | |
a088e5d5 2026-09-17 Pavel Safronov | 800 | Both ring seas carry ninety sailing ships each, and Tower's published weather plan |
| 801 | (D-067) runs a 28-day cycle of storms, gales and a calm over them and The Deep. |
| 802 | |
51c39d8b 2026-09-17 Pavel Safronov | 803 | #### What the desert is made of |
| 804 | |
| 805 | The Dry Reach is not sand with some rock in it; it is the whole grammar of a desert, |
| 806 | because Tower had seen deserts (D-069). Tiers of rock stand over dune fields whose crests |
| 807 | run across the wind Tower sends there; rocky hills break up the open ground; a network of |
| 808 | **dry washes** is routed by the same drainage the ranges are eroded by, because a channel |
| 809 | network that ignores drainage is the one thing that would look wrong. In the lowest ground |
| 810 | there are **salt pans**, dead flat, ringed by the **shoreline benches** of lakes that never |
| 811 | stood. The middle of the Reach stands 150 m above its rim so that the washes have somewhere |
| 812 | to run, and Tower keeps its rock 6.5 km clear of the rivers it had already routed — a mesa |
| 813 | across The Narrows would leave the world's drainage in a slot. |
| 814 | |
| 815 | Rock is laid in beds, and a bed in Tower is a **constant radius**, so the strata line up |
| 816 | across separate mesas however far apart they stand. That is what makes a field of them read |
| 817 | as one formation eroded out of one plateau. |
| 818 | |
866c7f96 2026-09-07 Pavel Safronov | 819 | #### Why the desert rings |
| 820 | |
| 821 | **On a cylinder you cannot go around a band.** Every desert on Earth can be |
| 822 | circumnavigated; a ringed one cannot. It is an absolute barrier across the world's |
| 823 | waist, and with the three ridges ringing too it becomes three concentric walls. |
| 824 | |
| 825 | #### The drainage, and why it keeps the chokepoint |
| 826 | |
| 827 | Four rivers come off the range — Westwall Water, Sisters Water, Eastwall Water and |
| 828 | The Long Water. On Earth most drainages **do not** cut through a rising ridge; they |
| 829 | are defeated and diverted, and only an *antecedent* river with enough power keeps |
| 830 | its course. So three of the four are turned by First Ridge, run **along its front** |
| 831 | gathering each other, and leave with the fourth through the single gap. |
| 832 | |
| 833 | - **The Narrows carries the entire world's runoff** — ~392 m³/s off a 9,800 km² |
| 834 | range, lifted 1,780 m for 6.9 GW (0.013% of budget). |
| 835 | - The ridge-front reaches are **the only circumferential water in Tower**, and |
| 836 | weigh fractionally more or less for it (§1.9.2). Everything else runs axially, |
| 837 | where Coriolis is exactly zero. |
| 838 | - Whoever holds The Narrows holds the axis of the world. The Capital sits behind it. |
80bcc97a 2026-09-17 Pavel Safronov | 839 | - **The Long Water falls twice** (D-066): 680 m off the range below Hollow Tarn, into a |
| 840 | gorge, and 170 m into The Deep at its mouth. Eastwall Water falls 440 m off its side of |
| 841 | the range. Each leans antispinward as it drops. |
866c7f96 2026-09-07 Pavel Safronov | 842 | |
14d35b7d 2026-09-16 Pavel Safronov | 843 | **The drainage needed the floor raised, and generating it honestly is what showed it** |
| 844 | (D-063, D-064). As v1 authored it, the ground between the Girdle's foot and the Dry |
| 845 | Reach — z 115 to 135 km — was a lowland barely 60 m high, below a plateau of |
| 846 | 800–1,100 m, and v1 painted its rivers across it a kilometre up. A river cannot climb. |
| 847 | Generated faithfully, each needed an embankment up to 950 m high to reach The Narrows. |
| 848 | |
| 849 | So Tower raised the lowland: **The Uplands**, a ring of ground lifted to about 1,000 m, |
| 850 | meeting the Girdle's skirt on one side and the plateau's edge on the other. The rivers |
| 851 | now fall steadily off the range, across the Uplands and onto the plateau, and the floor |
| 852 | under them is mostly cut — The Narrows about 500 m deep — and built up by no more than |
| 853 | ~200 m anywhere, the height of a levee rather than a dam. |
376f2ce6 2026-09-16 Pavel Safronov | 854 | |
866c7f96 2026-09-07 Pavel Safronov | 855 | #### The Deep is oriented for the view |
| 856 | |
| 857 | Long down the axis and narrow around it, so you cross it the **short** way — around |
51c39d8b 2026-09-17 Pavel Safronov | 858 | θ, where the floor curves up. The authored outline is 154 × 32 km and the water fills about |
| 859 | 18 km of that width; from the Capital's waterfront the far shore is that 18 km away and |
| 860 | stands **2.6 km above eye level**. Crossing it lengthwise instead would be dead flat. The |
| 861 | orientation is the whole point. |
| 862 | |
| 863 | **The Capital is a footprint, not a dot** (D-070). It is 20 km across, centred on the axial |
| 864 | midpoint — the only centre a cylinder has — which is just wide enough that its spinward edge |
| 865 | is on The Deep's shore, 9.8 km out, where the ground has come down from 300 m to the |
| 866 | water's 120 m. So the city holds both the middle of the world and a waterfront. The streets |
| 867 | and buildings inside that footprint are phase 7's. |
866c7f96 2026-09-07 Pavel Safronov | 868 | |
| 869 | It is also the world's flywheel: 19× the diurnal heat storage of bare ground, and |
| 870 | 5.9 days at full power to move its temperature one kelvin. Tower still supplies |
| 871 | every joule (§1.9.4), but the world now coasts for about a week rather than |
| 872 | stopping the moment attention lapses. |
| 873 | |
| 874 | #### The cap seas are not designed |
| 875 | |
| 876 | Gravity on an end cap points radially outward — *tangent* to the cap. Nothing rests |
| 877 | there; water runs down to the rim and pools. **Both ring oceans exist whether anyone |
| 878 | planned them or not**, each with a 314 km shoreline and a 50 km cliff standing |
| 879 | behind it. The only windows in the world are at their feet (§1.4). |
| 880 | |
9f91e995 2026-09-29 Pavel Safronov | 881 | They are not the same sea. The far cap's window is a cold wall, so **the Deepward Sea is |
| 882 | a polar one** — ice-cold throughout, and frozen in bands toward the cap (§1.9.6). The sun |
| 883 | cap is double-glazed and does none of this, so the Sunward Sea stays temperate. |
| 884 | |
866c7f96 2026-09-07 Pavel Safronov | 885 | #### Skiing, because it is a different sport here |
| 886 | |
| 887 | Level motion feels no Coriolis (§1.9.1) but a descending skier has radial velocity, |
| 888 | and that does deflect: |
| 889 | |
| 890 | - **Down the axis:** a steady sideways push, always antispinward — 1.5% of g at |
| 891 | 15 m/s on a 20° slope, 6.4% at 35 m/s on 40°. |
| 892 | - **Around the cylinder:** you get heavier or lighter. 8.6% at 30 m/s, 11.4% at 40. |
| 893 | |
| 894 | So a **retrograde run gets lighter the faster you go**, which is self-reinforcing, |
| 895 | while a prograde run grips harder as it accelerates. Every slope in Tower has a |
| 896 | handedness. No Earth mountain does. Settlements sit at the tarns — Sisters Station, |
| 897 | Hollow Station — around 2,100 m, with the runs above them. |
| 898 | |
e7a9f9dd 2026-09-17 Pavel Safronov | 899 | **The range as generated** (D-065) is the named summits and a scatter of unnamed ones, |
| 900 | joined by ridges and cut by water into branching valleys, all eroded as one group with |
| 901 | the Girdle. The named summits are held at exactly their heights and are the highest |
| 902 | ground around them; each tarn sits on a shelf the valleys were not allowed to cut, which |
| 903 | puts Sisters Tarn at 2,173 m. |
| 904 | |
866c7f96 2026-09-07 Pavel Safronov | 905 | #### Open questions |
| 906 | |
| 907 | - **The Spindle's height.** 3.2 km is a placeholder; an object dropped from its top |
| 908 | lands ~760 m antispinward of its base. |
abc0aad0 2026-10-01 Pavel Safronov | 909 | - **z 430–496 km** is unauthored but for three of the farms (D-096). The circumference |
| 910 | outside the named peaks is no |
03607270 2026-09-08 Pavel Safronov | 911 | longer empty — The Girdle carries the range round the whole 314 km — but it is |
| 912 | unwalked: peaks with no names, and no rivers drawn off them yet. |
866c7f96 2026-09-07 Pavel Safronov | 913 | |
| 914 | ## 2. Application architecture |
| 915 | |
| 916 | ### 2.1 Stack |
| 917 | |
| 918 | - **Vite** + **TypeScript** (strict), no framework — the app is three canvases and |
| 919 | a control panel, and a framework would not earn its weight. |
fc11b064 2026-09-08 Pavel Safronov | 920 | - **One layout breakpoint**, at 720 px: above it the panel is a column beside the |
| 921 | world, below it a drawer over it (D-043). The world is a full-bleed canvas in |
| 922 | both, because all three views are drag-to-look and a scrolling page would be |
| 923 | fighting them for every touch. |
866c7f96 2026-09-07 Pavel Safronov | 924 | - **Three.js** for the exterior and interior 3D views. |
| 925 | - **Canvas 2D** for the map view. |
376f2ce6 2026-09-16 Pavel Safronov | 926 | - **Web workers** for world generation (world-generation.md §5): a pool of up to six, |
e18dad04 2026-09-30 Pavel Safronov | 927 | driven through **comlink**. Each must answer a ping before it is given the world. One |
| 928 | whose script fails, or that is still silent a few seconds after its siblings answered, |
| 929 | is replaced at once, up to four tries, then dropped, so a dead worker costs a few |
| 930 | seconds rather than freezing the load (D-080, D-092). Noise is **simplex-noise**, sampled in 3D on the |
376f2ce6 2026-09-16 Pavel Safronov | 931 | cylinder itself so nothing tears at θ = 0. Those two are the only runtime |
| 932 | dependencies besides Three.js. |
62458672 2026-09-07 Pavel Safronov | 933 | - **GitLab CI → GitLab Pages**, publishing `dist/` as `static/`. |
866c7f96 2026-09-07 Pavel Safronov | 934 | |
| 935 | ### 2.2 Module layout |
| 936 | |
| 937 | ``` |
| 938 | src/ |
| 939 | canon/ |
| 940 | constants.ts single source of truth for every number in §1 |
| 941 | geometry.ts (θ,z) <-> 3D, slat layout, map <-> surface |
28f9a6bc 2026-09-07 Pavel Safronov | 942 | atmosphere.ts the rotational density profile and its extinction (§1.5) |
| 943 | motion.ts how things fall in the rotating frame (§1.9.2) — the only |
65484043 2026-09-08 Pavel Safronov | 944 | evidence of the spin anywhere but the far cap window |
376f2ce6 2026-09-16 Pavel Safronov | 945 | terrain/ world generation, pure TypeScript — runs in workers, on the |
| 946 | main thread and under vitest alike (world-generation.md §5) |
e7a9f9dd 2026-09-17 Pavel Safronov | 947 | compile.ts the world compile: shapes, river profiles, lake levels |
| 948 | mountains.ts summits, ridge graphs, steady-state erosion, pinned summits |
51c39d8b 2026-09-17 Pavel Safronov | 949 | grid.ts grids on the surface: drainage, blur, sampling — shared by the above |
| 950 | desert.ts plateaus and mesas, dry washes, salt pans, abandoned shorelines |
00ceeedb 2026-09-27 Pavel Safronov | 951 | forest.ts where trees stand, how big they are, and what a canopy is |
80bcc97a 2026-09-17 Pavel Safronov | 952 | water.ts wind seas, fetch, river speed and foam: the water's physics |
a088e5d5 2026-09-17 Pavel Safronov | 953 | sea-state.ts every lake and sea's waves and whitecaps now, from the weather |
| 954 | ships.ts ship lanes, positions from the clock, the wave sum they ride |
99a2821b 2026-09-29 Pavel Safronov | 955 | rails.ts railway lines, and the grade their track keeps over the ground |
80bcc97a 2026-09-17 Pavel Safronov | 956 | falls.ts waterfall sheets, leaning antispinward as they fall |
| 957 | cache.ts the compiled world kept in IndexedDB between visits |
376f2ce6 2026-09-16 Pavel Safronov | 958 | field.ts the elevation function: one answer to "how high is it here" |
| 959 | noise.ts seeded simplex noise on the cylinder, and the hash under it |
| 960 | shapes.ts signed distance, smoothed lines, on the unrolled (z, θR) plane |
| 961 | tile.ts the tile quadtree scheme, and one tile's mesh data |
| 962 | palette.ts material weights to colour, as TypeScript and as GLSL |
| 963 | map-image.ts the map's picture of the world, rendered in bands |
| 964 | worker.ts one worker: compile, tiles, map rows |
| 965 | service.ts the pool, generations, the status dialog's progress, ground queries |
866c7f96 2026-09-07 Pavel Safronov | 966 | views/ |
9d5a061c 2026-09-27 Pavel Safronov | 967 | palette.ts one colour per feature kind, shared by the map and the list |
376f2ce6 2026-09-16 Pavel Safronov | 968 | terrain-lod.ts the ground as a quadtree of tiles, refined around the eye |
99a2821b 2026-09-29 Pavel Safronov | 969 | craft.ts the tour's flyers as meshes: paragliders to giant airships, trains, spacecraft |
| 970 | tour-player.ts plays the tour's legs: the deal, the fades, the caption |
00ceeedb 2026-09-27 Pavel Safronov | 971 | forest-view.ts the trees near the eye: meshes, then cards, then the canopy skin |
99a2821b 2026-09-29 Pavel Safronov | 972 | tour/ the scenic tour, pure: no Three.js, flown by the views and the tests |
| 973 | geo.ts the floor's coordinates and the tower's frame, and the sums between them |
| 974 | director.ts a craft's track and bank, what is worth looking at, where the camera rides |
| 975 | interior-legs.ts the legs inside, found in the compiled world |
| 976 | exterior-legs.ts the legs outside, in kilometres, clear of the beam |
| 977 | plan.ts the deal: every leg once, no two of a kind in a row, 12–18 s each |
866c7f96 2026-09-07 Pavel Safronov | 978 | world/ |
376f2ce6 2026-09-16 Pavel Safronov | 979 | schema.ts world.json v2 types + validation: features, not places |
866c7f96 2026-09-07 Pavel Safronov | 980 | instruments.ts sightline, viewshed, lighting probe, travel (§3.3) |
a088e5d5 2026-09-17 Pavel Safronov | 981 | weather.ts Tower's weather plan read at an hour: what it does, what it told people |
3cc2b5bd 2026-10-04 Pavel Safronov | 982 | photos.ts a saved shot of a 3D view: its numbers, checked (D-099) |
866c7f96 2026-09-07 Pavel Safronov | 983 | state/ |
9d5a061c 2026-09-27 Pavel Safronov | 984 | store.ts selected point, time-of-day, spin phase, view mode |
866c7f96 2026-09-07 Pavel Safronov | 985 | views/ |
6bb061a6 2026-09-14 Pavel Safronov | 986 | exterior.ts Three.js: hull, collector, beam, spin, point picker |
376f2ce6 2026-09-16 Pavel Safronov | 987 | interior-model.ts ground tiles, caps, bore, beam and haze, shared by both 3D views |
866c7f96 2026-09-07 Pavel Safronov | 988 | map.ts Canvas 2D: unrolled surface, slats, terminator, point picker |
3e898b51 2026-09-28 Pavel Safronov | 989 | interior.ts Three.js: shell geometry, the haze shader of §1.5, beam |
866c7f96 2026-09-07 Pavel Safronov | 990 | ui/ |
9d5a061c 2026-09-27 Pavel Safronov | 991 | app.ts the whole panel: list, detail card, weather board, readouts, view switching |
3e898b51 2026-09-28 Pavel Safronov | 992 | eye-gauge.ts the interior's eye-height gauge and its landmarks of known height |
28f9a6bc 2026-09-07 Pavel Safronov | 993 | scales.ts slider mappings — kept out of views/ so the panel can label |
3e898b51 2026-09-28 Pavel Safronov | 994 | the eye-height gauge without pulling in Three.js |
9d5a061c 2026-09-27 Pavel Safronov | 995 | main.ts loads world.json and starts the app |
3cc2b5bd 2026-10-04 Pavel Safronov | 996 | vite.config.ts also makes world.json from content/world.json (§3.1), and on a dev |
| 997 | server writes the author's saved shots to content/photos.json (D-099) |
6364748a 2026-09-08 Pavel Safronov | 998 | |
| 999 | tools/ node-only, never bundled; plain .mjs with no build step |
376f2ce6 2026-09-16 Pavel Safronov | 1000 | port-world.mjs the one-off port of v1's geography.json into world.json v2 |
b4b8e46c 2026-09-28 Pavel Safronov | 1001 | build-pages.sh the Pages site: every branch built into one, with branches.json (D-073) |
6364748a 2026-09-08 Pavel Safronov | 1002 | screenshots.mjs drives the running application in a headless browser and |
| 1003 | photographs it into docs/screenshots/ (D-042) |
3cc2b5bd 2026-10-04 Pavel Safronov | 1004 | photos.mjs renders the shots in content/photos.json to photos/, the view alone, |
| 1005 | at 4K (D-099) |
| 1006 | browser.mjs what those two share: the browser, the warm world, waiting for terrain |
866c7f96 2026-09-07 Pavel Safronov | 1007 | ``` |
| 1008 | |
| 1009 | `canon/constants.ts` is the spine. Every derived figure — period, rim speed, land |
| 1010 | area, slat width — is *computed* from radius, length, slat count and target land |
| 1011 | area, never hard-coded. Changing the radius changes the whole app coherently. |
| 1012 | |
| 1013 | ### 2.3 State |
| 1014 | |
| 1015 | One small observable store. Views subscribe; nothing owns anything else. |
| 1016 | |
| 1017 | ```ts |
| 1018 | type TowerState = { |
| 1019 | point: { theta: number; z: number } | null // the picked location |
| 1020 | tod: number // 0..1, position in the diffuser day cycle |
| 1021 | brightness: number // W/m^2 mean, 30..320 -- the diffuser output setting |
| 1022 | spinPhase: number // 0..2pi, rotation for star motion |
| 1023 | spinning: boolean |
| 1024 | view: 'exterior' | 'map' | 'interior' |
| 1025 | probe: { from: SurfacePoint; to: SurfacePoint } | null |
| 1026 | } |
| 1027 | ``` |
| 1028 | |
| 1029 | The exterior and map pickers both write `point`; the interior view reads it. That |
| 1030 | is the entire interaction loop. |
| 1031 | |
5f38efd0 2026-09-07 Pavel Safronov | 1032 | ### 2.4 The exterior view |
| 1033 | |
| 1034 | Scene units are kilometres, so the code reads in canon numbers. Tower's axis lies |
| 1035 | along world Z with the sun cap at z = 0, which puts a canon surface point at |
| 1036 | `(R cos θ, R sin θ, z)` in the hull's own frame. The hull spins about Z and carries |
| 1037 | that frame with it, so **picking resolves the ray hit back through |
| 1038 | `worldToLocal`** — otherwise every point picked off a turning hull would be wrong by |
| 1039 | the spin phase. |
| 1040 | |
| 1041 | Two deliberate departures from physics, both reading aids of the same kind as the |
| 1042 | map's hillshade: |
| 1043 | |
| 1044 | - **Fill lighting.** Real sunlight here runs parallel to the axis, so Tower's flank |
| 1045 | is edge-on to it and renders very nearly black — accurate and useless. Two fill |
| 1046 | lights lift the hull enough to read its shape. |
| 1047 | - **A visible beam.** In vacuum there is nothing between collector and cap to |
8b6287ba 2026-09-07 Pavel Safronov | 1048 | scatter light, so the converging beam would not be visible at all. It is drawn |
| 1049 | as rays because it is the thing the view is about. |
472390e2 2026-09-09 Pavel Safronov | 1050 | - **A dark collector.** Both of its sides are dark, and for different reasons: the |
| 1051 | face pointed at Tower is a 245 K radiator, and the face pointed at the sun is a |
| 1052 | mirror, which shows the empty sky in front of it and not the sun behind the eye. |
| 1053 | What makes it legible is the sunlit rim of D-054 — the same 4 km ring the sun cap |
| 1054 | window sees from inside, drawn here as geometry rather than in a shader (D-055). |
6bb061a6 2026-09-14 Pavel Safronov | 1055 | The mirror face is lit **by the sun alone**, in its own shader: as a standard |
| 1056 | metal material it also reflected the fill lights, which do not exist, as a |
| 1057 | blue-white sweep across the disc (D-060). The sun sits on the axis behind the |
| 1058 | collector, so its glint shows only when looking nearly straight down that axis. |
| 1059 | |
e331ec2a 2026-09-28 Pavel Safronov | 1060 | **The stars are the interior's, and they are Earth's** (D-075). The sky is a sphere |
| 1061 | around the scene painted with the same star field the windows use (D-056), sampled by |
| 1062 | direction from the camera so the stars sit at infinity and hold still as the camera |
| 1063 | orbits. The field is the Yale Bright Star Catalogue — every star to magnitude 6.5 — set by |
| 1064 | the clock's date: the axis points at the sun, so the sky behind Tower is fixed by the sun's |
| 1065 | ecliptic longitude, and turns once a year. Outside, ecliptic north is up (scene +Y), the one |
| 1066 | roll square to the axis on every day. Spin does not turn it — the camera is not riding the |
| 1067 | hull — and there is no daylight to adapt to, so it is drawn at full gain (D-060). |
8b6287ba 2026-09-07 Pavel Safronov | 1068 | |
908833aa 2026-09-28 Pavel Safronov | 1069 | **The hull can be tried in other dress** (D-076). **Rock** is the first: a cratered, lumpy |
| 1070 | shell a few kilometres thick laid over the metal skin, never into it, with the windows |
| 1071 | left clear. It is an experiment in how Tower might look, not canon — the mass alone would |
6368edcf 2026-09-28 Pavel Safronov | 1072 | be a question for §1.2 — and it sits in the Hull switch beside True and X-ray. **Piping** |
| 1073 | is the second (D-077): the skin plated in panels, banded every ~36 km with hoop pipes either |
| 1074 | side, pipe bundles running between the bands on brackets, clustered blocks of plant, vents |
| 1075 | whose grilles and plumes switch on and off at random, and thruster pods at each end that |
| 1076 | fire rarely, with long flaring flames and real light on the hull. Everything is dusted, |
| 1077 | matte where the dust lies, so the metal does not read as chrome. Every part is outside the skin, so the windows |
ab6ae94f 2026-09-28 Pavel Safronov | 1078 | still see only Tower's inside. **Rock and piping** is the third (D-081), the two at once: |
| 1079 | the reading is that rock was heaped over the plant as shielding, so it lies in banks tens |
| 1080 | of kilometres across over about three fifths of the hull, half as tall again as the Rock |
| 1081 | reading, with scarps at their edges; the plant |
| 1082 | rooms and vents crowd into the bare ground between, the bands and pipe runs are laid |
| 1083 | regardless and go under the rock, and the rock is dug clear round each thruster pod. |
908833aa 2026-09-28 Pavel Safronov | 1084 | |
8b6287ba 2026-09-07 Pavel Safronov | 1085 | Everything in the scene is captioned — collector, beam, both caps — with screen-space |
472390e2 2026-09-09 Pavel Safronov | 1086 | labels. A dark disc and a cone of light are not self-explanatory, and the collector |
8b6287ba 2026-09-07 Pavel Safronov | 1087 | is the least intuitive object in Tower: it is larger than the world it feeds. |
5f38efd0 2026-09-07 Pavel Safronov | 1088 | |
| 1089 | The default camera frames the whole system rather than Tower alone: the collector |
| 1090 | is 244 km across and flies 320 km ahead, and it is the larger object. |
| 1091 | |
65484043 2026-09-08 Pavel Safronov | 1092 | **The hull has two readings, and the view switches between them** (D-047). **True** |
6bb061a6 2026-09-14 Pavel Safronov | 1093 | is the outer skin: bare structure, with a window at each cap. |
376f2ce6 2026-09-16 Pavel Safronov | 1094 | **X-ray** wraps the map's picture of the terrain onto the outside instead — the same |
| 1095 | image the map draws, rendered live from the world (world-generation.md §9) — from outside Tower is |
65484043 2026-09-08 Pavel Safronov | 1096 | structure, so what that texture shows is what is *inside*, which makes it a diagram |
| 1097 | and not a view. Both are worth having and they are not the same claim, so the |
aa201500 2026-09-14 Pavel Safronov | 1098 | control is a two-way switch rather than a checkbox. **True is the default**, and the |
| 1099 | last reading chosen is remembered across reloads and view switches (D-061). |
65484043 2026-09-08 Pavel Safronov | 1100 | |
6bb061a6 2026-09-14 Pavel Safronov | 1101 | **The inside of Tower is the interior view's own model** (D-060), not a lookalike. |
| 1102 | The displaced ground, both glazed caps, the far cap's bore and the beam are built |
| 1103 | once in `interior-model.ts` and added to both scenes, so looking in through either |
| 1104 | window from outside shows the same land, hazed by the same integral, as standing in |
| 1105 | it does. Two things make that work from outside. The haze integral **clips its |
| 1106 | segment to the air** — the part of the sightline inside the tube, between the sun |
| 1107 | cap and the far cap's glass — so the kilometres of vacuum between the camera and the |
| 1108 | window add nothing; from inside the clip is the whole segment and nothing changes. |
| 1109 | And the windows are **see-through**: a pane that paints the computed sky from inside |
| 1110 | is transparent from outside, carrying only the haze in front of it, so what shows |
| 1111 | through is the scene that is really there — the land beyond the near cap, and the |
| 1112 | collector and the stars beyond the far one. The shaders work in the tower's frame, |
| 1113 | and the exterior hands them the world-to-tower transform each frame, because the |
| 1114 | hull is turning and the air turns with it. |
| 1115 | |
14d35b7d 2026-09-16 Pavel Safronov | 1116 | The outer skin keeps its own mesh and its own two modes. It sits **a kilometre out from |
| 1117 | the floor**, where D-044 puts the wall's outer face, with a ring closing the wall at each |
| 1118 | end — generated ground goes below the datum, and a skin at the floor's own radius let |
| 1119 | sea floors and tile skirts show through the hull (D-064). Three's cylinder runs u |
376f2ce6 2026-09-16 Pavel Safronov | 1120 | around and v along, while the image is the other way round, so the UVs are rewritten |
6bb061a6 2026-09-14 Pavel Safronov | 1121 | from the original attribute rather than derived from vertex positions — the seam |
| 1122 | vertices are duplicated, and deriving an angle from them smears one column of |
| 1123 | triangles across the whole image. |
11a13dbf 2026-09-07 Pavel Safronov | 1124 | |
15d933c9 2026-09-07 Pavel Safronov | 1125 | **The camera position persists** across reloads, alongside the active view, so |
6bb061a6 2026-09-14 Pavel Safronov | 1126 | returning to the page returns to the vantage you left. |
15d933c9 2026-09-07 Pavel Safronov | 1127 | |
99a2821b 2026-09-29 Pavel Safronov | 1128 | **The scenic tour runs outside too** (D-085): spacecraft, a new one every 12–18 seconds — |
| 1129 | skimming the hull, circling it against its spin, docking on it, looking in through the far |
| 1130 | cap, over the collector's rim, down the beam, and Tower, the collector and the sun framed |
| 1131 | together. A leg flies either in space, where the hull turns past at real speed, or in the |
| 1132 | hull's own frame, where it holds still and the stars wheel. No craft enters the beam's cone. |
| 1133 | |
6bb061a6 2026-09-14 Pavel Safronov | 1134 | **There are no place markers** (D-060). Selecting a place still swings the camera |
| 1135 | round to it, and a cap is framed from about 40° off the axis so its window faces the |
| 1136 | camera; the sidebar and the map carry the places themselves. |
11a13dbf 2026-09-07 Pavel Safronov | 1137 | |
28f9a6bc 2026-09-07 Pavel Safronov | 1138 | ### 2.4 The interior view — built |
| 1139 | |
376f2ce6 2026-09-16 Pavel Safronov | 1140 | Scope, since D-062: **real geometry, and ground generated to match it.** |
28f9a6bc 2026-09-07 Pavel Safronov | 1141 | |
376f2ce6 2026-09-16 Pavel Safronov | 1142 | Real: the ground is the actual cylinder, curving up on both sides and closing |
| 1143 | overhead, built from generated tiles (world-generation.md §6). |
65484043 2026-09-08 Pavel Safronov | 1144 | **Stars only through the far cap** — the wall is sealed (§1.4), so for 539 of the |
e331ec2a 2026-09-28 Pavel Safronov | 1145 | 540 km the sky is land and light. The far cap is glazed (D-045) and the sky beyond it is |
| 1146 | the real one (D-075): the Yale Bright Star Catalogue, baked into cells on a cube's faces |
| 1147 | so a pixel reads only the nine cells round it, and looked up by view direction turned |
| 1148 | about the spin axis by the spin phase — one turn every 7 min 29 s, the point on the axis |
| 1149 | genuinely motionless — and then by the date, which sets where the antisolar point is. |
28f9a6bc 2026-09-07 Pavel Safronov | 1150 | |
376f2ce6 2026-09-16 Pavel Safronov | 1151 | The ground is a **quadtree of tiles**, each a 65-vertex grid bent onto the cylinder |
| 1152 | in a worker: 34 km tiles on the far side of the world, 33 m tiles underfoot, so vertices |
| 1153 | are half a kilometre apart overhead and half a metre apart at your feet. A tile splits |
| 1154 | once the eye is within 1.8 tile-widths of it, and only once all four of its children |
| 1155 | have arrived — detail pops in, and the ground is never missing. The tiles carry |
| 1156 | material weights rather than colour, and the shader turns them into colour from the |
| 1157 | same palette the map uses, with v1's mottling and a little grain near the eye. There |
| 1158 | is still no scenery: no buildings, no trees, no water surface of its own. Those are |
| 1159 | phases 3–7 of world-generation.md. |
28f9a6bc 2026-09-07 Pavel Safronov | 1160 | |
| 1161 | **Haze is the shader, and it is integrated rather than faked.** Every fragment |
| 1162 | samples the rotational density profile 24 times along the ray to the camera and |
| 1163 | extinguishes per channel — red survives twice as far as green, blue half as far, |
| 1164 | which is what makes distance blue rather than grey. From the floor it reproduces |
| 1165 | §1.8 from the inside: 78% straight up against 31% for the same 100 km along the |
| 1166 | ground, printed in the readout so the claim can be checked rather than believed. |
| 1167 | The airlight the haze adds is *neutral*; tinting it blue double-counts the |
| 1168 | wavelength dependence and turns even the desert mauve (D-034). |
| 1169 | |
65484043 2026-09-08 Pavel Safronov | 1170 | **Nothing inside the scene rotates**, because the observer, the ground and the air |
e27aaf20 2026-09-08 Pavel Safronov | 1171 | all co-rotate. What falls carries the spin, and §1.9.2 is lopsided about how: rain |
| 1172 | leans a fixed 1.5° whatever the cloud, because drag pins its speed, while only free |
| 1173 | fall keeps accelerating and so keeps leaning. **The waterfall is the compass; the |
| 1174 | rain is barely a hint.** Rain is no longer drawn (D-049) — 1.5° is not a picture, |
| 1175 | and the pinwheel below does the job it was standing in for. The physics stays in |
| 1176 | `canon/motion.ts` and stays tested; it was only ever the rendering that could not |
| 1177 | carry it. |
65484043 2026-09-08 Pavel Safronov | 1178 | |
9c891d2e 2026-09-08 Pavel Safronov | 1179 | **The one thing that does turn is outside.** The sky through the caps does not |
65484043 2026-09-08 Pavel Safronov | 1180 | co-rotate, so it wheels once every 7 min 29 s about the motionless star on the axis |
3e898b51 2026-09-28 Pavel Safronov | 1181 | (D-045). It is the only evidence of the spin in the view. Both caps are windows |
9c891d2e 2026-09-08 Pavel Safronov | 1182 | (D-050), so it can be had looking either way along the axis — deepward into empty |
| 1183 | space, or sunward past the black disc of the collector. |
28f9a6bc 2026-09-07 Pavel Safronov | 1184 | |
376f2ce6 2026-09-16 Pavel Safronov | 1185 | The observer stands on the terrain by asking the same elevation function the tiles are |
| 1186 | built from, at full detail. D-035's readback of a raster is gone with the raster. |
| 1187 | |
| 1188 | **Keyboard flight**: W A S D or the arrows move along the heading, E and Q climb and |
| 1189 | descend, shift is five times faster. Speed is proportional to height above the ground, |
| 1190 | so the ground passes at the same apparent pace from a metre up or ten kilometres. |
28f9a6bc 2026-09-07 Pavel Safronov | 1191 | |
3e898b51 2026-09-28 Pavel Safronov | 1192 | Instruments in the view: eye height from 1.7 m to the edge of the beam, 48.4 km up (D-084), with the local gravity |
| 1193 | beside it — a vertical gauge up the view's right side, marked with real-world things of |
| 1194 | known height so the number means something (D-082) — the five canon illumination settings of §1.3, a field of view fixed at 60° (D-083), and captions on every place still visible through the haze. |
28f9a6bc 2026-09-07 Pavel Safronov | 1195 | Selecting a place walks the observer to it (D-038) — the haze horizon closes at |
| 1196 | 100–150 km, so turning to face something usually just points at haze. |
| 1197 | |
c954a775 2026-09-28 Pavel Safronov | 1198 | **Both caps are glazed** (D-045, D-050), framed by a lattice of identical equilateral |
| 1199 | triangles 8.3 km on a side (D-078), with a vertex on the axis where six meet. That is the |
| 1200 | pitch of the polar checker it replaced (D-041), so it is still the only object in the world |
| 1201 | with a known size and still doubles as a scale for judging distance, read against sky. |
6bb061a6 2026-09-14 Pavel Safronov | 1202 | The exterior draws these same caps — the same meshes and shaders, not a copy of |
| 1203 | them (D-060). |
65484043 2026-09-08 Pavel Safronov | 1204 | |
| 1205 | The far cap's glazing is set a kilometre into its own frame, so from inside there is |
| 1206 | a **1 km reveal** around it. That is the only place the wall depth of D-044 can be |
| 1207 | seen from within the world, which is why it is the only place it is drawn. |
28f9a6bc 2026-09-07 Pavel Safronov | 1208 | |
80bcc97a 2026-09-17 Pavel Safronov | 1209 | **Water is geometry** (D-066). Every lake, sea and river is a surface at its own level |
| 1210 | — a level in Tower is a constant radius, so a lake curves up with the floor — drawn over |
| 1211 | the ground with the depth test finding the shoreline, and the ground under it drawn as |
| 1212 | bed. Deep water is dark and shallow water shows the bed through it. Waves are sized from |
a088e5d5 2026-09-17 Pavel Safronov | 1213 | each body's wind — Tower's weather plan, or the body's usual wind when nothing is |
| 1214 | scheduled (D-067) — and the fetch it blows over, by the relations fitted to real seas, and |
| 1215 | drawn as six components that displace the surface near the eye and shade it beyond; |
80bcc97a 2026-09-17 Pavel Safronov | 1216 | rivers carry ripples downstream at the speed Manning's equation gives them, and turn |
a088e5d5 2026-09-17 Pavel Safronov | 1217 | white on their rapids. Whitecaps cover the share of a sea the wind speed gives. Water |
| 1218 | mirrors the hazed land overhead, and glints where it mirrors the beam. |
| 1219 | |
00ceeedb 2026-09-27 Pavel Safronov | 1220 | **The forest is trees** (D-071). Greatwood is a density field — stems per hectare, thinned |
| 1221 | at its edges, opened where Tower left meadows, stopped by water, rock and the treeline — and |
| 1222 | the trees themselves are found by a rule rather than kept in a list, so the same trunks |
| 1223 | stand in the same places for everyone who walks there. Within a few hundred metres they are |
| 1224 | meshes; out to three quarters of a kilometre, cards turned to face the eye; beyond that the |
| 1225 | tile carries a canopy skin at the canopy's own height, which sinks back onto the ground as |
| 1226 | you approach. **The Tall Wood** is 52 km² of 90–115 m giants near the Capital, placed once |
| 1227 | from the world's seed: a landmark standing 75 m proud of the wood around it. |
| 1228 | |
a088e5d5 2026-09-17 Pavel Safronov | 1229 | **Ships** sail the ring seas (D-067): procedural hulls, mainsails and jibs, instanced, each |
| 1230 | on a lane round the world at a position that is a function of the clock, riding the waves |
| 1231 | drawn under it with the mainsail set to the wind. While a gale or storm is published for |
| 1232 | their sea in time to get in, they are in harbour — off the water, since harbours are not |
| 1233 | drawn yet; a squall announced too late catches them out. |
| 1234 | |
99a2821b 2026-09-29 Pavel Safronov | 1235 | **The scenic tour** (D-085, replacing D-068's) flies the view itself, on the world's flyers: |
| 1236 | a new one every 12–18 seconds, dealt at random, fading through black between them — a |
| 1237 | paraglider on a summit's flank, a glider in a thermal, light aircraft and seaplanes, an |
| 1238 | airliner round the Girdle, airships low down and giants near the axis, one of them circling |
| 1239 | the sun outside the beam, trains on both railways, ships in fair weather and foul. Each |
| 1240 | craft exists for its leg. The camera rides in it or chases it, banks with it, and is |
| 1241 | pointed by a director at whatever is worth seeing from there — scored by the same haze |
| 1242 | integral the view is drawn with, so it never turns to stare at something the air has eaten. |
| 1243 | The legs are worked out from the world, so they follow its edits, and the screenshot tour |
| 1244 | photographs them. |
80bcc97a 2026-09-17 Pavel Safronov | 1245 | |
| 1246 | **Waterfalls lean.** A river's profile steps where it cannot slope — off a range, into |
| 1247 | The Deep — and a step is a fall with a gorge below it. The falling sheet leaves the lip at |
| 1248 | the river's speed and drifts antispinward by the free-fall drift of §1.9.2, so the |
| 1249 | Long Water's 680 m fall off the range lands about 75 m antispinward of its lip. It is the |
| 1250 | first thing in the view that shows the spin by leaning, which §1.9.2 always said the |
| 1251 | waterfall would be. |
| 1252 | |
| 1253 | The beam is drawn after all water: it is always in front of it, and drawn first it was |
| 1254 | blended under the far side's seas. |
866c7f96 2026-09-07 Pavel Safronov | 1255 | |
| 1256 | --- |
| 1257 | |
9d5a061c 2026-09-27 Pavel Safronov | 1258 | ## 3. The world file, and how it changes |
866c7f96 2026-09-07 Pavel Safronov | 1259 | |
| 1260 | The app is an instrument for writing the novel as much as a thing to look at. It |
| 1261 | must answer questions like *can the far face be seen from the midpoint?*, *where |
9d5a061c 2026-09-27 Pavel Safronov | 1262 | does a central embassy go?*, *can a lake overhang?* — and their answers are placed, |
| 1263 | named and kept in the world file. |
866c7f96 2026-09-07 Pavel Safronov | 1264 | |
9d5a061c 2026-09-27 Pavel Safronov | 1265 | ### 3.1 One file, changed in the repository |
866c7f96 2026-09-07 Pavel Safronov | 1266 | |
9d5a061c 2026-09-27 Pavel Safronov | 1267 | **`content/world.json` is the world, and the only copy of it** (D-072). The author |
| 1268 | writes alongside Tower rather than in it, and changes the world by talking it over with |
| 1269 | Claude, who edits the file; git keeps its history beside the prose. There is no editor |
| 1270 | in the browser, no local draft in `localStorage`, and no import or export. |
866c7f96 2026-09-07 Pavel Safronov | 1271 | |
9d5a061c 2026-09-27 Pavel Safronov | 1272 | | | | |
| 1273 | |---|---| |
| 1274 | | World content | `content/world.json`, committed; the app only reads it | |
| 1275 | | What the app loads | `world.json`, made from it by `vite.config.ts`: every `notes` emptied, every feature with `"public": false` left out | |
| 1276 | | Instruments (§3.3) | the sightline probe | |
| 1277 | | Output | permalinks to a point or place | |
| 1278 | | Panel | view controls, place list, a read-only detail card, the weather board | |
866c7f96 2026-09-07 Pavel Safronov | 1279 | |
9d5a061c 2026-09-27 Pavel Safronov | 1280 | The published `world.json` is **derived, never committed**: the dev server serves it |
| 1281 | fresh on every request and reloads an open page when `content/world.json` is saved, and |
| 1282 | the build writes it into `dist/`. There is no second copy to keep in step. There is |
| 1283 | no backend — GitLab Pages is static — and none is needed: the loop is edit, commit, |
| 1284 | push, and the published site serves it. |
a088e5d5 2026-09-17 Pavel Safronov | 1285 | |
9d5a061c 2026-09-27 Pavel Safronov | 1286 | Everyone sees the same app. Until D-072 there was a writer mode (the default) and a |
| 1287 | reader mode (`?reader=1`); the query parameter now does nothing. |
866c7f96 2026-09-07 Pavel Safronov | 1288 | |
3cc2b5bd 2026-10-04 Pavel Safronov | 1289 | **One exception, and it is not the world** (D-099): on a dev server the author has a |
| 1290 | button and a key that save the open view as a photograph, into `content/photos.json`, |
| 1291 | written by the dev server. It is not in the build, so readers still see one app, and it |
| 1292 | changes nothing about the world: a photograph is a camera position and a moment. |
| 1293 | |
866c7f96 2026-09-07 Pavel Safronov | 1294 | ### 3.2 The world file |
| 1295 | |
| 1296 | ```jsonc |
| 1297 | { |
376f2ce6 2026-09-16 Pavel Safronov | 1298 | "version": 2, |
| 1299 | "seed": 1729, // every feature's randomness mixes this in |
| 1300 | "ground": { "baseM": 60, "reliefM": 260, "notes": "" }, |
| 1301 | "features": [{ |
| 1302 | "id": "the-deep", // permalink target; see below |
| 1303 | "name": "The Deep", |
99a2821b 2026-09-29 Pavel Safronov | 1304 | "kind": "mountains|lake|sea|river|desert|forest|settlement|road|path|railway|embassy|tower|landmark|note|region", |
376f2ce6 2026-09-16 Pavel Safronov | 1305 | "geometry": { "type": "polygon", "points": [[theta, z], ...] }, |
| 1306 | // or point, polyline, or band { "zFrom", "zTo" } for anything ringing the world |
866c7f96 2026-09-07 Pavel Safronov | 1307 | "blurb": "public description, shown to readers", |
| 1308 | "notes": "the author's working notes — NEVER shipped", |
376f2ce6 2026-09-16 Pavel Safronov | 1309 | "public": true, // false = not ready to exist publicly |
| 1310 | "seed": 1437950893, // written once at creation, never from the id |
| 1311 | "levelM": 120, "depthM": 330, "basin": "flooded", "shoreM": 11000 |
| 1312 | // ...and whatever parameters the kind has: world-generation.md §3 |
a088e5d5 2026-09-17 Pavel Safronov | 1313 | }], |
| 1314 | "weather": { // Tower's published plan (D-067) |
| 1315 | "cycleDays": 28, // the plan repeats; 0 for never |
| 1316 | "events": [{ |
| 1317 | "id": "deepward-sea-storm", "target": "deepward-sea", "kind": "calm|breeze|gale|storm", |
| 1318 | "start": { "day": 20, "hour": 18 }, "durationH": 30, |
| 1319 | "wind": { "directionDeg": 60, "speedMS": 30 }, // toward; 0 deepward, 90 spinward |
| 1320 | "publishedAt": { "day": 17, "hour": 9 }, |
| 1321 | "revisions": [{ "at": { "day": 21, "hour": 6 }, "kind": "gale", |
| 1322 | "wind": { "directionDeg": 60, "speedMS": 18 }, "reason": "..." }] |
| 1323 | }] |
| 1324 | } |
866c7f96 2026-09-07 Pavel Safronov | 1325 | } |
| 1326 | ``` |
| 1327 | |
376f2ce6 2026-09-16 Pavel Safronov | 1328 | Every kind has the same `geometry` field, so the map, the list and the editor treat |
| 1329 | them one way; what a kind adds is parameters beside it, and a phase of |
| 1330 | world-generation.md adds a parameter only when a generator reads it. v1 files, with |
| 1331 | `places`, load as empty — there is no backwards compatibility (D-062). |
| 1332 | |
866c7f96 2026-09-07 Pavel Safronov | 1333 | **Two text fields, deliberately separate.** `blurb` is written for readers and |
9d5a061c 2026-09-27 Pavel Safronov | 1334 | ships; `notes` is the author's working thinking and never reaches the app. One field |
| 1335 | with a flag would have made every note a publication accident waiting to happen. |
866c7f96 2026-09-07 Pavel Safronov | 1336 | |
9d5a061c 2026-09-27 Pavel Safronov | 1337 | **Ids are permalink targets.** Once a place has been linked to, its id should not |
| 1338 | change even if its name does; a river names what it flows into by id, so renaming an |
| 1339 | id means rewriting those references too. |
866c7f96 2026-09-07 Pavel Safronov | 1340 | |
| 1341 | Coordinates are canon (θ radians, z metres, §1.7) — never map pixels, so the file |
| 1342 | survives any change to how the map is drawn. |
| 1343 | |
| 1344 | **The `public` flag is a privacy trap worth naming.** Working notes ("embassy here? |
9d5a061c 2026-09-27 Pavel Safronov | 1345 | check sightline to the cap") are kept out of the app, and a `"public": false` feature |
| 1346 | is left out of it entirely. But **`content/world.json` is committed to a public |
| 1347 | repository**, notes and unpublished features included — exactly as |
| 1348 | `content/geography.json` was before it — so anything in it is public to anyone who |
| 1349 | reads the source. The flag keeps things out of the map, not out of sight. Whether |
| 1350 | private notes should live somewhere else — a private repo, or a second one — is the |
| 1351 | author's call and is deliberately unresolved. |
376f2ce6 2026-09-16 Pavel Safronov | 1352 | |
866c7f96 2026-09-07 Pavel Safronov | 1353 | ### 3.3 Instruments |
| 1354 | |
9d5a061c 2026-09-27 Pavel Safronov | 1355 | The measuring tools answer questions the novel actually raised. Only the sightline |
| 1356 | probe is built; the rest are planned: |
866c7f96 2026-09-07 Pavel Safronov | 1357 | |
| 1358 | - **Sightline probe.** Pick two points; get surface distance, straight-line |
| 1359 | distance, optical depth, transmission, and a plain verdict (*crisp / hazy / ghost |
9d5a061c 2026-09-27 Pavel Safronov | 1360 | / invisible*). This is the tool that answered §1.8, and the single most |
| 1361 | illustrative thing in the app. |
866c7f96 2026-09-07 Pavel Safronov | 1362 | - **Viewshed overlay.** From a selected point, shade the whole map by transmission. |
| 1363 | It renders the axis-versus-overhead asymmetry as one picture, which is worth more |
| 1364 | than the table in §1.8. |
| 1365 | - **Lighting probe.** At a point, illumination across the day cycle at the current |
| 1366 | brightness setting (§1.3) — for writing a scene at a specific hour. |
| 1367 | - **Travel.** Surface distance and journey time between points at chosen speeds, |
| 1368 | including whether the route crosses a slat. |
| 1369 | - **Sky-at-a-time.** Star field, beam position and Earth transits for a given point |
| 1370 | and moment, so a described sky is a correct sky. |
| 1371 | |
| 1372 | ### 3.4 What readers get |
| 1373 | |
| 1374 | The public link is the finished map: embassies, towns, lakes, named regions — the |
| 1375 | permanent things, behaving like any map application. Plus the exterior view, the |
| 1376 | interior view from any point, and permalinks so a reader can be handed a place and |
9d5a061c 2026-09-27 Pavel Safronov | 1377 | a moment. Reading the world, not editing it — which, since D-072, is what the author |
| 1378 | gets too. |
866c7f96 2026-09-07 Pavel Safronov | 1379 | |
| 1380 | ## 4. Phases |
| 1381 | |
| 1382 | 1. **Design** — this document and `decisions.md`. ← current |
| 1383 | 2. **Scaffold** — Vite/TS/Three, CI to Pages, `canon/` implemented and unit-tested. |
5f38efd0 2026-09-07 Pavel Safronov | 1384 | 3. **Exterior** — ✅ hull, caps, collector, beam, spin, and hull point picking. |
866c7f96 2026-09-07 Pavel Safronov | 1385 | 4. **Map** — unrolled surface, slat rendering, picking, sync with exterior. |
3e898b51 2026-09-28 Pavel Safronov | 1386 | 5. **Interior** — ✅ shell geometry, the haze shader, the beam, eye height, |
65484043 2026-09-08 Pavel Safronov | 1387 | and the five illumination settings. Stars, but only through the far cap window. |
866c7f96 2026-09-07 Pavel Safronov | 1388 | 6. **Writer mode** — ✅ *built ahead of 3–5, at the author's request, because the |
| 1389 | world needs developing before there is anything to render.* Map view, place |
| 1390 | editing for all thirteen kinds, points/polylines/polygons, localStorage |
| 1391 | autosave, backup and static exports, import, and the sightline probe. |
9d5a061c 2026-09-27 Pavel Safronov | 1392 | *Removed by D-072: the world is now changed in `content/world.json`, and only |
| 1393 | the sightline probe remains.* |
| 1394 | 7. **Content pipeline and reader mode** — ✅ reader and writer modes (D-011, one |
| 1395 | mode since D-072); |
376f2ce6 2026-09-16 Pavel Safronov | 1396 | permalinks (D-010). The terrain pipeline of D-019 — `content/geography.json` and |
| 1397 | `npm run terrain` — is replaced by live generation (below). |
6364748a 2026-09-08 Pavel Safronov | 1398 | 8. **Polish** — mobile ✅ (the sidebar is a drawer below 720 px, D-043) and a |
| 1399 | screenshot tour that photographs all ten views through the UI, D-042. |
fc11b064 2026-09-08 Pavel Safronov | 1400 | Remaining: transitions, performance. |
866c7f96 2026-09-07 Pavel Safronov | 1401 | |
28f9a6bc 2026-09-07 Pavel Safronov | 1402 | All five view phases are built. Phase 2's `canon/` landed with phase 6, since the |
| 1403 | map could not be drawn without it. |
866c7f96 2026-09-07 Pavel Safronov | 1404 | |
| 1405 | **Shareable permalinks are implemented** (phase 7) — the app has |
| 1406 | readers, and "stand here and look at this" is the whole reason it exists as a |
| 1407 | companion piece. Named locations from the novel should be markable on the map for |
| 1408 | the same reason. |
| 1409 | |
376f2ce6 2026-09-16 Pavel Safronov | 1410 | **Live world generation** — in progress, planned in world-generation.md (D-062). |
| 1411 | Phase 1 ✅ (D-063): world file v2, the elevation function, the worker pool, tiled |
e7a9f9dd 2026-09-17 Pavel Safronov | 1412 | ground, the status dialog, keyboard flight, the map drawn from the features. Phase 2 ✅ |
80bcc97a 2026-09-17 Pavel Safronov | 1413 | (D-065): mountain ranges of summits, ridges and eroded valleys, and summit editing. Phase 3 |
a088e5d5 2026-09-17 Pavel Safronov | 1414 | ✅ (D-066): water as surfaces with waves and flow, and waterfalls that lean. Phase 4 ✅ |
51c39d8b 2026-09-17 Pavel Safronov | 1415 | (D-067): Tower's weather plan with revisions, a day on the clock, and ships. Phase 5 ✅ |
00ceeedb 2026-09-27 Pavel Safronov | 1416 | (D-069): the desert's mesas, dunes, washes, salt pans and shorelines. Phase 6 ✅ (D-071): |
| 1417 | Greatwood as individual trees, its meadows, and the Tall Wood of giants. Phases 7–8 bring |
| 1418 | settlements and roads — procedural scenery this section used to list as out of scope. Clouds and rain stay |
376f2ce6 2026-09-16 Pavel Safronov | 1419 | undrawn (D-049). |
e331ec2a 2026-09-28 Pavel Safronov | 1420 | |
| 1421 | ## 5. Backlog |
| 1422 | |
| 1423 | Things decided to be worth coming back to, not scheduled. |
| 1424 | |
| 1425 | - **The pinwheel's motionless star** (author, 2026-09-27). §1.4 promises one motionless |
| 1426 | star at the centre of the turning sky, and the real sky (D-075) has none there — the |
| 1427 | antisolar point walks a degree a day. The placed star in `STAR_GLSL` is **not canon** |
| 1428 | and stays only until this is revisited: a motionless point, a beacon Tower hangs there, |
908833aa 2026-09-28 Pavel Safronov | 1429 | or nothing. |
f16f084e 2026-09-28 Pavel Safronov | 1430 | - **The sun's share of the beam** (D-079). The rod now runs on past the sun at 70% of |
| 1431 | itself, which says the shoal takes only 30% — but the ground is still lit as if the sun |
| 1432 | took the whole beam. Canon has to settle the split, and the light budget with it. |
ab6ae94f 2026-09-28 Pavel Safronov | 1433 | - **The exterior's dress** (D-076, D-077, D-081). Rock, Piping, and Rock and piping are |
| 1434 | experiments, labelled as such in the Hull switch. Pick one or keep the bare skin — and |
| 1435 | if a heavy one stays, answer for its mass. The combined dress gives the rock a reason |
| 1436 | (shielding heaped on the plant), but taller and over three fifths of the hull it weighs |
| 1437 | about what D-076's shell does, so the mass question stands. |
99a2821b 2026-09-29 Pavel Safronov | 1438 | - **Traffic** (D-085). The tour's craft exist only for their legs: nothing flies, sails the |
| 1439 | sky or runs the railways when the tour is not watching, except the ships. A world with |
| 1440 | timetables — trains on the lines, airliners between the stations, giants on their slow |
| 1441 | circuits — would be the honest next step, and would let a reader standing anywhere see |
| 1442 | them go by. |
| 1443 | - **The Axial Line's 7% grade** (D-086), where it comes down off the plateau into Greatwood, |
| 1444 | is a rack railway's grade, not an adhesion one. Regrade it round the slope, or say it is a |
| 1445 | rack section. |
| 1446 | - **The giant airships** (D-087) are a consequence worked out from the thin air near the |
| 1447 | axis, not canon. Whether Tower's sky has them is the author's call. |
42b4554e 2026-09-29 Pavel Safronov | 1448 | - **The moon's light** (D-088). It is drawn as fed by Tower lifting the banked beam, so the rod |
| 1449 | is the same either side of it; the sun instead takes its share from the rod and leaves it |
| 1450 | dimmer past it (D-079). Canon could have the moon do the same, or settle why it does not. |
e18dad04 2026-09-30 Pavel Safronov | 1451 | - **The sun seen from the ice** (D-091). Tower aims none of the sun's light at the fast |
| 1452 | ice, so by §1.3.1's own rule the sun should look dim from there — a shoal lit toward |
| 1453 | everyone else. It is drawn as bright as from anywhere. Whether the sun going out over the |
| 1454 | ice each evening is seen from the ice as a blaze or as a dark disc in lit air is the |
| 1455 | author's call. |
abc0aad0 2026-10-01 Pavel Safronov | 1456 | - **The farms' light at night** (D-095). Lighting the fields after sunset keeps the beam |
| 1457 | from being fully banked, and the rod's glow with it: about 0.4 W/m² more everywhere at |
| 1458 | sunset, nothing by six hours after. The app's night light does not include it yet. |
| 1459 | - **3D models for the things drawn from plain shapes** (author, 2026-09-30). Everything that |
| 1460 | moves or stands on the land is built in code from boxes, cones and spheres. The author will |
| 1461 | supply real models; the app needs a way to load them. The list, with sizes as drawn: |
| 1462 | - *Tour craft* (`views/craft.ts`, metres, nose along +x, top along +y): paraglider (wing |
| 1463 | ~10 m), glider (17 m span), light aircraft (11 m span), seaplane, helicopter (11 m rotor), |
| 1464 | airliner (42 m), airship (120 m), giant airship (420 m), locomotive (22 m), railway |
| 1465 | carriage (25 m), spacecraft (~80 m). |
| 1466 | - *Instanced, drawn by the hundred or thousand*: the sailing ship as hull, mainsail and jib |
| 1467 | (~180 of them, 8–45 m; the mainsail swings about the mast, so it must stay a separate |
| 1468 | part with the mast at the origin), conifer, broadleaf and giant tree (up to 6,000 each, |
| 1469 | `views/forest-view.ts`), and the flat tree cards for distant woods (up to 75,000 — an |
| 1470 | image, not a model). |
| 1471 | - *Not candidates*: terrain, water, ice, falls, the railway viaducts, the hull dressings, the |
| 1472 | collector, beam, sun, moon and windows, all of which are shaped by the world. |
| 1473 | |
| 1474 | The plan: glTF binary (`.glb`) files in a `models/` folder, a small manifest naming which |
| 1475 | kind each replaces and how it faces, and the built-in shape as the fallback for any kind |
| 1476 | without one, so models can arrive one at a time. Imported models go through Tower's own |
| 1477 | lighting and haze — otherwise they are lit wrong and never fade into the distance — keeping |
| 1478 | each part's colour at first, and image textures once a textured variant of the shader |
| 1479 | exists. Budgets: tour craft can be detailed (tens of thousands of triangles); ships a few |
| 1480 | thousand; trees a few hundred. Models must be licensed for redistribution, since the app is |
| 1481 | published. |