tower / interior-flight / files / design.md
Branch interior-flight · default branch · all branches
design.md
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 | ||
17ccee99 2026-09-08 Pavel Safronov | 117 | **And Tower keeps its clock on it.** Two lit lines from the collector's hub: one |
| 118 | running the full radius, fixed normal to the plane of the solar system, and one | |
| 119 | stopping short of the rim at an angle θ from it, where θ runs 0 to 2π over a day. | |
| 120 | The collector is the only surface in the sky worth writing on — it does not spin, | |
| 121 | and it is always dead ahead through the sun cap window. | |
| 122 | ||
| 123 | **The time is the angle between the two lines, and it has to be.** From inside, the | |
| 124 | whole collector face appears to wheel once every 7 min 29 s along with the stars, | |
| 125 | because the observer co-rotates and it does not. A single hand against a fixed dial | |
| 126 | would be unreadable, since the dial is not fixed; the angle between two marks is | |
| 127 | invariant under that rotation. It is a clock built for people who cannot stop the | |
| 128 | dial turning. D-055. | |
| 129 | ||
866c7f96 2026-09-07 Pavel Safronov | 130 | #### 1.3.1 The diffuser swarm |
| 131 | ||
| 132 | The diffusers must be individually invisible, or the sky becomes a row of separate | |
| 133 | suns. Two thresholds govern this, and only the second one binds: | |
| 134 | ||
| 135 | - **Resolvability.** At 50 km, one arcminute is 14.5 m. Anything larger is a | |
| 136 | resolved disc with a visible edge. | |
| 137 | - **Visibility.** Being unresolved is not enough — stars are unresolved and we see | |
| 138 | them. A mirror *preserves radiance*, so a mirrorlet aimed at an observer shows | |
| 139 | the sun's own surface brightness over a tiny angle. A 1 m mirrorlet reads at | |
| 140 | magnitude −13.6, brighter than the full moon. Blending into daylight requires | |
| 141 | **~1.2 cm**, at magnitude −4.0, just under Venus. | |
| 142 | ||
| 143 | Diverting 54.3 TW needs 11.3 km² of mirror, so: | |
| 144 | ||
| 145 | | | | | |
| 146 | |---|---| | |
| 147 | | Mirrorlet size | **1.2 cm**, ~1.4 cm², 2 mg | | |
| 148 | | Count | **78 billion** | | |
| 149 | | Total mass | **158 tonnes** — the entire sun system | | |
| 150 | | Mean spacing in beam | **3.8 m** — sparse enough to fly through | | |
| 151 | | Optical depth over 540 km | 1.41, so **24 % of light reaches the far cap** | | |
| 152 | ||
| 153 | **The swarm cannot be passive — it must fly, always.** The axis is not weightless. | |
| 154 | At the beam's edge gravity is **0.312 m/s²**, enough that a foil sinks outward at | |
| 155 | 0.26 m/s and **leaves the beam in 1.7 hours**. A drifting swarm dissolves the same | |
| 156 | afternoon. Every foil is therefore under continuous individual control. This is not | |
| 157 | a flourish on a working system; it is the only configuration that works. | |
| 158 | ||
| 159 | **They have absurd power to do it with.** Each foil intercepts 979 W of beam. | |
| 160 | Harvesting 0.1 % gives it ~1 W on a 2 mg body — **489,600 W/kg**, some fifty times | |
| 161 | a jet engine's specific power. | |
| 162 | ||
| 163 | | | | | |
| 164 | |---|---| | |
| 165 | | Down-beam, riding radiation pressure | 0.85 m/s, 7.4 days | | |
| 166 | | Back up-beam under its own power at 1.5 m/s | 15 µW, 4.2 days | | |
| 167 | | Harvestable from ambient world-light | **14,400 µW** — a 1000× margin | | |
| 168 | ||
| 169 | **So there is no recirculation machinery, at either cap.** The foils fly home on | |
| 170 | scavenged daylight. Nothing needs to be built for them, and the 1000× power margin | |
| 171 | means Tower can afford to move them *wastefully* — in spirals, shoals and patterns | |
| 172 | that cost energy for no reason but preference. | |
| 173 | ||
| 174 | **Lighting is a render target, not a schedule.** 78 billion independently aimed | |
| 175 | mirrors put any intensity on any patch of ground at any time. Dawn, dusk, moving | |
| 176 | cloud shadows and seasons are compositing problems, not optical ones. | |
| 177 | ||
| 178 | **Aiming resolution is human-sized.** A 1.2 cm mirror is diffraction-limited to | |
| 179 | 4.6×10⁻⁵ rad, so its reflection lands as a **2.3 m spot** on the floor 50 km below. | |
| 180 | Tower can put a glint on one person that someone five metres away cannot see. The | |
| 181 | privacy is set by the wavelength of light, not by any protocol. | |
| 182 | ||
| 183 | **Mirrorfall.** A failed foil sinks out of the beam and falls. Terminal velocity at | |
| 184 | the floor is 0.48 m/s; the descent takes about two days and it lands like a | |
| 185 | snowflake. There is a permanent slow glitter coming down out of Tower's sky. | |
| 186 | ||
| 187 | #### Illumination is a dial, not a constant | |
| 188 | ||
| 189 | 54.3 TW is Tower's *capability*, not its setting. Spread over the inner surface it | |
| 190 | is 320 W/m² mean, which — with roughly half the surface lit at a time and a | |
| 191 | sinusoidal day profile — puts **local noon at ~1,000 W/m², Earth clear-sky | |
| 192 | daylight**. But the diffusers are software-controlled, so brightness is genuinely | |
| 193 | adjustable in-world across the full range: | |
| 194 | ||
| 195 | | Setting | Mean W/m² | Feels like | | |
| 196 | |---|---|---| | |
| 197 | | Twilight | 30 | permanent overcast dusk | | |
| 198 | | Temperate | 200 | Earth's global mean | | |
| 199 | | **Full** | **320** | **Earth clear-sky noon** | | |
| 200 | ||
| 201 | This should be a control in the app, not a fixed number. It is the most | |
| 202 | characterful thing about a world whose sun is a machine. | |
| 203 | ||
| 204 | #### Headroom | |
| 205 | ||
| 206 | 5,000× is **11 % of the étendue limit** (46,223× at 1 AU). Tower could in principle | |
| 207 | push the beam 9.2× further and cook itself; the diffuser network is as much a safety | |
| 208 | system as a lighting system. 5,000× was chosen because it is *demonstrated* | |
| 209 | technology — the Odeillo solar furnace reaches ~10 MW/m² on Earth today. Nothing in | |
| 210 | Tower's sun system requires physics that does not exist. See `decisions.md` D-003. | |
| 211 | ||
392bb8a7 2026-09-08 Pavel Safronov | 212 | #### 1.3.2 Night, and the difference between banked and off |
| 213 | ||
| 214 | **Night cannot be made by aiming the swarm away.** The glow above belongs to the | |
| 215 | beam and the air, not to the diffusers, so a fully lit beam lights the world | |
| 216 | whatever the mirrorlets are doing: 779 W/m²/sr over a strip 3.65° wide running | |
| 217 | horizon to horizon is about 0.2 sr, which lands **~100 W/m² on the floor** — half | |
| 218 | of temperate, and no kind of night. Tower's night is therefore made by **banking | |
| 219 | the beam itself**, to a thousandth of full: **0.32 W/m²**, a rod you can still find | |
| 220 | overhead and a world you can just make out under it (D-046). | |
| 221 | ||
| 222 | **Shutting the beam down entirely is a different state and a much worse one.** No | |
| 223 | airlight, no lit ground, no rod — the only thing left in the world is the sky | |
| 224 | through the far cap. §1.9.4 gives the thermal mass about a week of coasting, so | |
| 225 | this is a state Tower can survive and not one it can sit in. | |
| 226 | ||
| 227 | | Setting | Floor | What it is | | |
| 228 | |---|---|---| | |
| 229 | | Dark | **0** | the beam shut down. Stars, and nothing else. | | |
| 230 | | Night | **0.32 W/m²** | the beam banked to a thousandth | | |
| 231 | | Twilight | 30 W/m² | | | |
| 232 | | Temperate | 200 W/m² | | | |
| 233 | | Full | 320 W/m² | Earth clear-sky noon | | |
| 234 | ||
da6bcb0e 2026-09-08 Pavel Safronov | 235 | #### 1.3.3 The far cap mirror, and where the last quarter of the beam goes |
| 236 | ||
| 237 | The swarm has optical depth 1.41, so **24% of the beam survives all 540 km** — and | |
| 238 | it survives *collimated*, in the beam's own 7.96 km² cross-section. That is the | |
| 239 | whole shape of the problem: not 13 TW spread over a 7,854 km² cap, but **1.7 MW/m² | |
| 240 | in a 3.2 km spot**, about 1,200 suns. An absorber there sits at **2,330 K**. | |
| 241 | ||
| 242 | **So the spot is a mirror** (D-048), and only the spot: it is a thousandth of the | |
| 243 | cap's area, which is what leaves the other 99.9% free to be window (§1.4). A mirror | |
| 244 | is the cheap answer rather than the expensive one — at 99.9% it absorbs **1,665 | |
| 245 | W/m²**, about 1.2 Earth solar constants, so the thing that would have glowed white | |
| 246 | is merely warm. | |
| 247 | ||
| 248 | **It also recovers the energy.** The residual goes back up the column, which makes | |
| 249 | the optical path 1,080 km instead of 540 and utilisation **1 - e^(-2τ) = 94%** | |
| 250 | rather than 76%. What survives even the return trip leaves through the beam | |
| 251 | aperture toward the collector, which sends it back again; in the limit the whole | |
| 252 | 54.3 TW lands on the inner surface. **This is why full brightness is 320 W/m² and | |
| 253 | not 243** — the figure in §1.3 assumes the entire beam is eventually used, and with | |
| 254 | the cavity closed at both ends it is. | |
| 255 | ||
| 256 | Aiming light at a region to warm it is a separate lever and stays one (§1.9.4). The | |
| 257 | mirror is about not wasting the beam; the desert is about where the weather goes. | |
| 258 | ||
2bb3e0de 2026-09-08 Pavel Safronov | 259 | #### 1.3.4 The day, and why dawn has a direction |
| 260 | ||
| 261 | Tower's day is **24 hours**, chosen for the people living under it — nothing | |
| 262 | physical offers one, since the spin is 7.5 minutes and has nothing to do with light. | |
| 263 | ||
| 264 | **Dawn cannot be a dimmer, and it cannot be the swarm either.** §1.3 gives the glow | |
| 265 | to the beam and the air, so the sky, the airlight and the rod overhead all brighten | |
| 266 | together the moment beam power comes up; there is no way to have one end of the axis | |
| 267 | light before the other. But the *ground* is lit by the diffusers, and they can put | |
| 268 | the light wherever they like. So Tower brings the day up as a **front running | |
| 269 | deepward from the sun cap**, 540 km in 40 minutes — **225 m/s**, near Tower's own rim | |
| 270 | speed, and slow enough to stand and watch arrive. | |
| 271 | ||
| 272 | The result is a morning nothing on Earth has: **a fully lit sky over dark ground**, | |
| 273 | with a line of daylight coming toward you along the world. §1.9.4 says Tower has no | |
| 274 | latitude. The cycle gives it **longitude** — 40 minutes of it, sun cap to far cap. | |
| 275 | ||
| 276 | Dusk runs the same way, so the light withdraws in the direction it arrived and the | |
| 277 | sun-cap end always has the shorter day by a hair. Nothing forces that; the | |
| 278 | alternative was a dusk that retreats, and a consistent direction of time reads as | |
| 279 | designed rather than as an oscillation. | |
| 280 | ||
866c7f96 2026-09-07 Pavel Safronov | 281 | ### 1.4 Sealed hull, and the cap windows |
| 282 | ||
| 283 | **The cylinder wall is opaque and unbroken.** No slats, no windows, no view out | |
| 284 | along any of the 540 km. From anywhere on the inner surface, the sky is land, haze | |
| 285 | and the beam — nothing else. See D-017. | |
| 286 | ||
| 287 | The only views out are at the **end caps**, and they are peculiar: | |
| 288 | ||
| 289 | - **A cap is a wall, not a floor.** Gravity there points radially outward, which is | |
| 290 | *tangent* to the cap's surface, so nothing rests on it — you would slide to the | |
| 291 | rim. Each cap is a **50 km vertical cliff** standing at the end of the world, and | |
| 292 | its windows sit at its base, at eye level for anyone standing on the floor. | |
| 293 | - **The sky through them does not sweep — it turns.** A cap window looks along the | |
| 294 | spin axis, which is the celestial pole. Stars rotate about a fixed centre, one | |
| 295 | full turn every 7.5 minutes, with one motionless star at the middle. **A pinwheel | |
769726ea 2026-09-08 Pavel Safronov | 296 | sky.** It is the only moving sky anyone in Tower ever sees — and because the axis |
| 297 | is horizontal from the floor, it wheels about a point on the **horizon** rather | |
| 298 | than overhead. | |
| 299 | - The **far cap is glazed whole** — a 100 km window looking into deep anti-sun | |
| 300 | space, not a wall with windows at its foot (D-045). Its structure survives as the | |
| 301 | window's **mullions**, on the same polar tessellation the checker used and at the | |
| 302 | same cell pitch, so the one object in the world with a known scale still is one: | |
| 303 | the rule now reads against the sky instead of against a plate. The **sun cap** | |
9c891d2e 2026-09-08 Pavel Safronov | 304 | faces the collector rather than the sun, and is **glazed too** (D-050): §1.3.0 |
| 305 | retires the "heavy glare management" this section used to demand of it, because no | |
| 306 | direct sunlight has ever reached it. Through it, a 244 km black disc, stars round | |
| 307 | the edge of it, and the beam blazing out of the aperture at its centre. | |
769726ea 2026-09-08 Pavel Safronov | 308 | - **By day the window is simply blue.** §1.5 puts the far cap 100–200 km into the |
| 309 | haze, so from anywhere but the deepward end the airlight in front of it swamps | |
| 310 | whatever is behind, and the cap reads as a disc of sky. The stars are there at | |
| 311 | noon and unseeable, which is a fact about eyes and not about the glass. | |
da6bcb0e 2026-09-08 Pavel Safronov | 312 | - **The beam does not go through it.** §1.3.3 puts the surviving quarter of the |
| 313 | beam on a 3.2 km bullseye at the centre of the cap, and that bullseye is a mirror | |
| 314 | rather than glass: it returns the residual up the column for a second pass. The | |
| 315 | window is everything else, which is 99.9% of the disc. | |
| 316 | - **The mirror is not the pinwheel's centre, and it is worth being clear why.** The | |
| 317 | sky turns about the direction *parallel* to the spin axis, and from anywhere on | |
| 318 | the floor that direction is horizontal — so **the pinwheel's centre is at eye | |
| 319 | level, dead ahead**, down where the window meets the ground, not overhead and not | |
| 320 | at the middle of the cap. The mirror is a physical object *on* the axis, which | |
| 321 | from 270 km sits about 10° above that. They coincide only for an observer | |
| 322 | standing on the axis itself, and nobody can. By day the mirror blazes — it is | |
| 323 | returning 1.7 MW/m² — and is the brightest thing in Tower's sky; at night it | |
| 324 | banks with the beam and goes dark. | |
866c7f96 2026-09-07 Pavel Safronov | 325 | |
| 326 | **Nobody aboard can ever see Earth.** Tower holds a terminator orbit (D-004), which | |
| 327 | puts Earth roughly 90° off the axis — out the *side* of the cylinder, which is now | |
| 328 | solid hull. A habitat in Earth orbit whose inhabitants have never seen the planet | |
| 329 | they orbit. | |
| 330 | ||
| 331 | The caps are therefore the only places in the world with a horizon that is not | |
| 332 | Tower. Whatever grows up around them, it will not be ordinary. | |
| 333 | ||
| 334 | ### 1.5 Atmosphere and the look of the sky | |
| 335 | ||
| 336 | Air co-rotates with the shell. Because g falls linearly to zero at the axis, the | |
| 337 | atmosphere is much deeper than Earth's: | |
| 338 | ||
| 339 | - Pressure at the axis, 50 km up: **5.2 kPa** — thin, but genuinely air. | |
| 340 | - A vertical column floor-to-axis is ~10,600 kg/m², about **one Earth atmosphere**. | |
| 341 | ||
| 342 | So the interior sky behaves like this, and the shader must reproduce it: | |
| 343 | ||
| 344 | - **Straight up** you look through ~1 atmosphere and see the far side of the world | |
| 345 | 100 km away — visible, but washed to pale blue like a very distant mountain range. | |
| 346 | - **Along the axis** you look through many atmospheres. The far end cap is not | |
| 347 | visible as a wall; it dissolves into blue haze around 100–200 km out. The world | |
| 348 | reads as endless in the axial direction and closed in the circumferential one. | |
| 349 | - **The ground curves up on both sides** into that same blue, meeting overhead. | |
| 350 | - **The beam** is a self-luminous scattering shaft 3.65° wide at 779 W/m²/sr — | |
| 351 | render it as a bright sunlit cloud, not as a light source with a halo. With the | |
| 352 | hull sealed, it is the only thing in the sky that is not land. | |
| 353 | ||
| 354 | ### 1.6 Orbit and attitude | |
| 355 | ||
| 356 | - Tower holds a high circular orbit with its **orbital plane kept normal to the | |
| 357 | Earth–Sun line** — a terminator orbit. This is why one cap can face the sun | |
| 358 | permanently and Tower is never eclipsed. | |
| 359 | - The plane precesses 360° per year to track the sun. Tower's angular momentum is | |
| 360 | enormous, so this 1°/day reorientation is actively driven, continuously, forever. | |
| 361 | Canon treats this as Tower's defining maintenance burden. | |
| 362 | - Consequence for the interior view: the star field slowly drifts across the year | |
| 363 | while spinning fast every 7.5 minutes. Two nested motions. | |
| 364 | ||
| 365 | ### 1.7 Coordinates | |
| 366 | ||
| 367 | The canonical surface coordinate is **(θ, z)**: | |
| 368 | ||
| 369 | - `θ` — angle around the cylinder, 0 to 2π. θ = 0 is the centre of land strip 0. | |
| 370 | - `z` — distance from the sun cap, 0 to 540 km. | |
| 371 | ||
| 372 | The 2D map is the direct unroll: `x = z`, `y = (θ − θ₀) · R`. No projection | |
| 373 | distortion — a cylinder unrolls exactly. This is a genuine advantage over mapping a | |
| 374 | globe and the map view should lean on it. | |
| 375 | ||
| 376 | **The map shows the surface once, bounded**, so its extent is readable. That means | |
| 377 | it needs an edge, and the edge is placed at **θ₀ = the centre of the last slat**. | |
| 378 | Land strip 0 is centred on θ = 0, so cutting there would slice a whole strip in | |
| 379 | half across the top and bottom margins; cutting at a slat centre leaves every land | |
| 380 | strip whole and splits only a band of stars, which carries no geography. Same | |
| 381 | reasoning as putting Earth's map edge at the antimeridian. A sightline whose short | |
| 382 | route crosses the edge is drawn as two segments, so the drawn path always matches | |
| 383 | the measured distance. | |
| 384 | ||
| 385 | --- | |
| 386 | ||
| 387 | ### 1.8 Sightlines: Tower has two horizons | |
| 388 | ||
| 389 | Along the axis the floor is perfectly flat and never falls away, so nothing is ever | |
| 390 | hidden by curvature. **Tower's horizon is haze.** Circumferentially the floor curves | |
| 391 | *up*, so distant land rises into the sky rather than sinking below a line. The two | |
| 392 | directions behave completely differently, and this is one of the most alien facts | |
| 393 | about living there. | |
| 394 | ||
| 395 | Rayleigh transmission from a floor-level observer: | |
| 396 | ||
| 397 | | Distance | Along the axis | Across the interior (overhead) | | |
| 398 | |---|---|---| | |
| 399 | | 26 km | 78 % | 77 % | | |
| 400 | | 50 km | 56 % | 70 % | | |
| 401 | | 100 km | **31 %** | **78 %** | | |
| 402 | | 270 km (far cap from midpoint) | **4 %** — a ghost | — | | |
| 403 | ||
| 404 | Two consequences: | |
| 405 | ||
| 406 | - **The axial horizon closes at 100–150 km.** From the midpoint you cannot see | |
| 407 | either end cap. Everyone can see 100 km, knows there is more beyond, and cannot | |
| 408 | resolve it — a different psychology of distance than Earth's 5 km cliff-edge. | |
| 409 | - **The far side of the world is clearer than the ground at the same distance,** | |
| 410 | because a sightline across the interior rises through thin axis air while one | |
| 411 | along the floor grinds through full density. It gets *better* with distance: the | |
| 412 | land directly overhead, 100 km away, is the crispest far object in Tower at 78 %. | |
| 413 | **Distant geography is best seen by looking up.** People would orient by what is | |
| 414 | overhead; the ground is the vague part. This inverts the human default. | |
| 415 | ||
| 416 | ### 1.9 Water | |
| 417 | ||
| 418 | Tower's hydrology is stranger than its geometry, and most of it follows from one | |
| 419 | fact and one absence. | |
| 420 | ||
| 421 | #### 1.9.1 Coriolis never pushes surface water sideways | |
| 422 | ||
| 423 | The floor's tangent plane is spanned by θ̂ and ẑ, and the spin axis is ẑ. For any | |
| 424 | flow along the surface: | |
| 425 | ||
| 426 | - **along the axis** — `ẑ × ẑ = 0`, no Coriolis force at all; | |
| 427 | - **around the circumference** — `ẑ × θ̂ = −ŝ`, the force is purely radial. | |
| 428 | ||
| 429 | The Coriolis term never has a component *inside* the surface. So **Tower's rivers | |
| 430 | do not curve.** No hemispheres, no Baer's law, no preferred bank erosion, no gyres, | |
| 431 | no cyclones. Every large-scale rotational habit of Earth's water and weather is | |
| 432 | absent, and a meander in Tower is pure flow dynamics with no thumb on the scale. | |
| 433 | ||
| 434 | #### 1.9.2 What it does instead: everything vertical leans | |
| 435 | ||
| 436 | The force goes into the floor rather than across it, so it appears whenever water | |
| 437 | moves up or down. Deflection of a free fall goes as h^1.5: | |
| 438 | ||
28f9a6bc 2026-09-07 Pavel Safronov | 439 | | Fall | Lands (retrograde) | Lean of the path | Lean at impact | |
| 440 | |---|---|---|---| | |
| 441 | | 100 m | 4.2 m | 2.4° | 3.6° | | |
| 442 | | 500 m | 47 m | 5.4° | 8.1° | | |
| 443 | | **1,000 m** | **133 m** | **7.6°** | **11.3°** | | |
| 444 | | 2,000 m | 377 m | 10.7° | 15.8° | | |
| 445 | ||
| 446 | Two different angles, and the interior view needs both. The **path** leans by where | |
| 447 | the water lands against how far it fell — the tilt of a waterfall's plume seen | |
| 448 | whole. The **impact** lean is the direction the water is actually moving when it | |
| 449 | arrives, which is what a streak of it is drawn at, and it is half again the other in | |
| 450 | tangent. `src/canon/motion.ts` computes both. | |
866c7f96 2026-09-07 Pavel Safronov | 451 | |
| 452 | **Rain falls permanently slanted** — a raindrop at terminal velocity sits at a fixed | |
| 453 | **1.47° against the spin**, ~51 m of drift over a 2 km fall, never varying, never | |
28f9a6bc 2026-09-07 Pavel Safronov | 454 | reversing. It is fixed because drag holds the fall speed constant, so unlike free |
| 455 | fall the angle does not grow with the drop: rain leans the same 1.5° whatever the | |
| 456 | cloud. Set against a waterfall's 11°, **the waterfall is the compass and the rain is | |
| 457 | 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 | 458 | anti-spinward. Every plume and every shower in Tower tilts, and they tilt against |
| 459 | each other. | |
| 460 | ||
| 461 | The same applies to anything that descends, not just water — see §1.11 on what it | |
| 462 | does to skiing. | |
| 463 | ||
| 464 | Horizontal flow changes *weight* rather than direction (Eötvös): +0.57 % for a | |
| 465 | 2 m/s prograde river, negligible hydrologically. It only matters at speed — an | |
| 466 | express train at 100 m/s gains 29 %, and anything moving retrograde at the 700 m/s | |
| 467 | rim speed is stationary in space and therefore weightless. | |
| 468 | ||
| 469 | #### 1.9.3 A perfect cylinder has no slope anywhere | |
| 470 | ||
| 471 | Potential depends only on radius, so **the whole floor is a single equipotential | |
| 472 | surface.** Water on it has no preferred direction: a perfect Tower has no rivers at | |
| 473 | all, forever. | |
| 474 | ||
| 475 | **Every river in Tower exists because the floor was shaped.** There are no | |
| 476 | tectonics and no uplift, so erosion is strictly one-way — a 3 km range wears flat in | |
| 477 | ~30 Myr under a wet engineered climate, ~150 Myr under a dry one. Tower's rivers | |
| 478 | are steadily destroying its landscape and the highlands must be rebuilt to keep them | |
| 479 | running. This is D-004's theme again: Tower's rivers are plumbing it chose to | |
| 480 | install and has to keep re-installing. | |
| 481 | ||
| 482 | Two corollaries: | |
| 483 | ||
| 484 | - **No river can circumnavigate.** A closed loop has no net descent. | |
| 485 | - **Lakes curve upward.** Level means constant radius, so across a 30 km lake the | |
| 486 | far shore rides **2.3 km above your tangent plane** — Earth would hide it 18 m | |
| 487 | below the horizon. You look *up* at the opposite beach, and water appears to | |
| 488 | climb away from you. | |
| 489 | ||
| 490 | #### 1.9.4 There is no passive climate at all | |
| 491 | ||
| 492 | **Tower has no latitude** — every point is equidistant from the light — and with the | |
| 493 | hull sealed it has no windows either. Nothing breaks the thermal uniformity. A | |
| 494 | uniform hull radiates at 274 K everywhere, so left alone the world settles into a | |
| 495 | flat calm: no gradient, no wind, no evaporation, no rain, no rivers. | |
| 496 | ||
| 497 | **So every weather system in Tower is deliberate.** Tower makes climate the only way | |
| 498 | left to it — by aiming light. It warms where it wants convection and shades where it | |
| 499 | wants condensation; the hull's uniform loss is the sink. Every cloud, every | |
| 500 | rainfall, every jet stream is something Tower is doing, continuously, on purpose. | |
| 501 | ||
| 502 | This is D-009 arriving at its conclusion. The mirrorlet swarm was already Tower's | |
| 503 | body language; now it is also its lungs and its weather. There is no autonomic | |
| 504 | layer underneath. **If Tower's attention ever lapses, the rain stops.** | |
| 505 | ||
| 506 | Costs, for scale against a 54.3 TW budget: | |
| 507 | ||
| 508 | | | | | | |
| 509 | |---|---|---| | |
| 510 | | Earth-like rainfall, 1,000 mm/yr | **12.2 TW** | **22.4 %** — Earth spends the same fraction | | |
| 511 | | Recirculating all runoff (1,792 m³/s) against 500 m | 8.8 GW | 0.016 % | | |
| 512 | ||
| 513 | #### 1.9.5 Rivers are a closed, pumped circulation | |
| 514 | ||
| 515 | With no natural cycle and no natural slope, a Tower river is a **loop**: a headwater | |
| 516 | reservoir, a shaped descent through the landscape, a lake at the bottom, and a lift | |
| 517 | back to the top. Source and sink are the same system. | |
| 518 | ||
| 519 | Two ways to close the loop, and they give completely different rivers: | |
| 520 | ||
| 521 | - **The pump outfall.** A river begins at a machine. Walk to the source of any | |
| 522 | river and find a wall of water coming out of a structure — not a spring, an | |
| 523 | outlet. Costs a rounding error (above). | |
| 524 | - **The made cloud.** Tower evaporates the lake with aimed light and condenses it | |
| 525 | over the highlands, so rain falls exactly where the river should start. No | |
| 526 | machinery: the swarm is the pump. Costs the 22.4 % above, and buys real weather | |
| 527 | with it. | |
| 528 | ||
| 529 | Canon uses **both** — made weather for the world's general hydrology, pumps for | |
| 530 | watercourses Tower wants under precise control. | |
| 531 | ||
| 532 | Two consequences of the sealed hull: | |
| 533 | ||
| 534 | - **A river can circle the world.** The surface is one unbroken sheet, so a channel | |
| 535 | can run the full 314 km circumference and close on itself — a lazy river returning | |
| 536 | to its own source. Gravity cannot drive a closed loop, so it is pumped. | |
| 537 | - **The water inventory is conserved and exactly known.** Nothing evaporates to | |
| 538 | space. Tower knows how much water it has, to the litre, forever. | |
| 539 | ||
| 540 | Lifting is also slightly cheaper than on Earth, since gravity falls off with height: | |
| 541 | 1 % cheaper at 1 km, 5 % at 5 km, 25 % at 25 km. | |
| 542 | ||
| 543 | ### 1.10 Slat orientation — RESOLVED: none | |
| 544 | ||
| 545 | Axial strips versus rings was weighed at length (D-016) and answered by removing | |
| 546 | slats entirely (D-017). The comparison is kept in D-016 because it established what | |
| 547 | the choice *cost*, and because the reasoning — that slat layout sets the shape of | |
| 548 | Tower's countries, its climate map and its astronomy all at once — is what made | |
| 549 | "none" a real option rather than an absence. | |
| 550 | ||
| 551 | ### 1.11 The world as built | |
| 552 | ||
| 553 | Authored geography lives in **`content/geography.json`** — the source of truth — and | |
| 554 | `npm run terrain` renders it. Names are provisional. Tower is laid out in **belts | |
| 555 | along the axis**, which is the natural grain of an engineered climate (§1.9.4): | |
| 556 | ||
| 557 | | z | | | | |
| 558 | |---|---|---| | |
| 559 | | 0–42 km | **The Sunward Sea** | ring ocean at the foot of the sun cap | | |
03607270 2026-09-08 Pavel Safronov | 560 | | 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) | |
866c7f96 2026-09-07 Pavel Safronov | 561 | | 148–218 km | **The Dry Reach** | desert **ringing the world**, 22,000 km², 13% of the surface | |
| 562 | | 176/190/203 km | **three ridges** | ringing, concentric — and **The Narrows** is the only breach in all three | | |
| 563 | | 214–430 km | **Greatwood** | forest belt | | |
| 564 | | 248–402 km | **The Deep** | 154 × 32 km sea, long down the axis and narrow around | | |
| 565 | | 270 km | **The Capital / The Spindle** | axial midpoint, on The Deep's antispinward shore | | |
| 566 | | 496–540 km | **The Deepward Sea** | ring ocean at the foot of the far cap | | |
| 567 | ||
| 568 | #### Why the desert rings | |
| 569 | ||
| 570 | **On a cylinder you cannot go around a band.** Every desert on Earth can be | |
| 571 | circumnavigated; a ringed one cannot. It is an absolute barrier across the world's | |
| 572 | waist, and with the three ridges ringing too it becomes three concentric walls. | |
| 573 | ||
| 574 | #### The drainage, and why it keeps the chokepoint | |
| 575 | ||
| 576 | Four rivers come off the range — Westwall Water, Sisters Water, Eastwall Water and | |
| 577 | The Long Water. On Earth most drainages **do not** cut through a rising ridge; they | |
| 578 | are defeated and diverted, and only an *antecedent* river with enough power keeps | |
| 579 | its course. So three of the four are turned by First Ridge, run **along its front** | |
| 580 | gathering each other, and leave with the fourth through the single gap. | |
| 581 | ||
| 582 | - **The Narrows carries the entire world's runoff** — ~392 m³/s off a 9,800 km² | |
| 583 | range, lifted 1,780 m for 6.9 GW (0.013% of budget). | |
| 584 | - The ridge-front reaches are **the only circumferential water in Tower**, and | |
| 585 | weigh fractionally more or less for it (§1.9.2). Everything else runs axially, | |
| 586 | where Coriolis is exactly zero. | |
| 587 | - Whoever holds The Narrows holds the axis of the world. The Capital sits behind it. | |
| 588 | ||
| 589 | #### The Deep is oriented for the view | |
| 590 | ||
| 591 | Long down the axis and narrow around it, so you cross it the **short** way — around | |
| 592 | θ, where the floor curves up. From the Capital the far shore is 32 km away and | |
| 593 | stands **2.6 km above eye level**. Crossing it lengthwise instead would be dead | |
| 594 | flat. The orientation is the whole point. | |
| 595 | ||
| 596 | It is also the world's flywheel: 19× the diurnal heat storage of bare ground, and | |
| 597 | 5.9 days at full power to move its temperature one kelvin. Tower still supplies | |
| 598 | every joule (§1.9.4), but the world now coasts for about a week rather than | |
| 599 | stopping the moment attention lapses. | |
| 600 | ||
| 601 | #### The cap seas are not designed | |
| 602 | ||
| 603 | Gravity on an end cap points radially outward — *tangent* to the cap. Nothing rests | |
| 604 | there; water runs down to the rim and pools. **Both ring oceans exist whether anyone | |
| 605 | planned them or not**, each with a 314 km shoreline and a 50 km cliff standing | |
| 606 | behind it. The only windows in the world are at their feet (§1.4). | |
| 607 | ||
| 608 | #### Skiing, because it is a different sport here | |
| 609 | ||
| 610 | Level motion feels no Coriolis (§1.9.1) but a descending skier has radial velocity, | |
| 611 | and that does deflect: | |
| 612 | ||
| 613 | - **Down the axis:** a steady sideways push, always antispinward — 1.5% of g at | |
| 614 | 15 m/s on a 20° slope, 6.4% at 35 m/s on 40°. | |
| 615 | - **Around the cylinder:** you get heavier or lighter. 8.6% at 30 m/s, 11.4% at 40. | |
| 616 | ||
| 617 | So a **retrograde run gets lighter the faster you go**, which is self-reinforcing, | |
| 618 | while a prograde run grips harder as it accelerates. Every slope in Tower has a | |
| 619 | handedness. No Earth mountain does. Settlements sit at the tarns — Sisters Station, | |
| 620 | Hollow Station — around 2,100 m, with the runs above them. | |
| 621 | ||
| 622 | #### Open questions | |
| 623 | ||
| 624 | - **The Spindle's height.** 3.2 km is a placeholder; an object dropped from its top | |
| 625 | lands ~760 m antispinward of its base. | |
03607270 2026-09-08 Pavel Safronov | 626 | - **z 430–496 km** is unauthored. The circumference outside the named peaks is no |
| 627 | longer empty — The Girdle carries the range round the whole 314 km — but it is | |
| 628 | unwalked: peaks with no names, and no rivers drawn off them yet. | |
866c7f96 2026-09-07 Pavel Safronov | 629 | |
| 630 | ## 2. Application architecture | |
| 631 | ||
| 632 | ### 2.1 Stack | |
| 633 | ||
| 634 | - **Vite** + **TypeScript** (strict), no framework — the app is three canvases and | |
| 635 | a control panel, and a framework would not earn its weight. | |
fc11b064 2026-09-08 Pavel Safronov | 636 | - **One layout breakpoint**, at 720 px: above it the panel is a column beside the |
| 637 | world, below it a drawer over it (D-043). The world is a full-bleed canvas in | |
| 638 | both, because all three views are drag-to-look and a scrolling page would be | |
| 639 | fighting them for every touch. | |
866c7f96 2026-09-07 Pavel Safronov | 640 | - **Three.js** for the exterior and interior 3D views. |
| 641 | - **Canvas 2D** for the map view. | |
62458672 2026-09-07 Pavel Safronov | 642 | - **GitLab CI → GitLab Pages**, publishing `dist/` as `static/`. |
866c7f96 2026-09-07 Pavel Safronov | 643 | |
| 644 | ### 2.2 Module layout | |
| 645 | ||
| 646 | ``` | |
| 647 | src/ | |
| 648 | canon/ | |
| 649 | constants.ts single source of truth for every number in §1 | |
| 650 | geometry.ts (θ,z) <-> 3D, slat layout, map <-> surface | |
28f9a6bc 2026-09-07 Pavel Safronov | 651 | atmosphere.ts the rotational density profile and its extinction (§1.5) |
| 652 | motion.ts how things fall in the rotating frame (§1.9.2) — the only | |
65484043 2026-09-08 Pavel Safronov | 653 | evidence of the spin anywhere but the far cap window |
866c7f96 2026-09-07 Pavel Safronov | 654 | views/ |
| 655 | palette.ts one colour per place kind, shared by map, list and editor | |
28f9a6bc 2026-09-07 Pavel Safronov | 656 | raster.ts what npm run terrain wrote: grid, and what white means |
866c7f96 2026-09-07 Pavel Safronov | 657 | world/ |
| 658 | schema.ts world.json types + validation | |
| 659 | store.ts places CRUD, localStorage drafts, JSON import/export | |
| 660 | instruments.ts sightline, viewshed, lighting probe, travel (§3.3) | |
| 661 | state/ | |
| 662 | store.ts selected point, time-of-day, spin phase, view mode, writer flag | |
| 663 | views/ | |
5f38efd0 2026-09-07 Pavel Safronov | 664 | exterior.ts Three.js: hull, caps, collector, beam, spin, point picker |
866c7f96 2026-09-07 Pavel Safronov | 665 | map.ts Canvas 2D: unrolled surface, slats, terminator, point picker |
28f9a6bc 2026-09-07 Pavel Safronov | 666 | interior.ts Three.js: shell geometry, the haze shader of §1.5, beam, rain |
866c7f96 2026-09-07 Pavel Safronov | 667 | ui/ |
28f9a6bc 2026-09-07 Pavel Safronov | 668 | app.ts the whole panel: tools, editor, readouts, view switching |
| 669 | scales.ts slider mappings — kept out of views/ so the panel can label | |
| 670 | the eye-height slider without pulling in Three.js | |
866c7f96 2026-09-07 Pavel Safronov | 671 | main.ts |
6364748a 2026-09-08 Pavel Safronov | 672 | |
| 673 | tools/ node-only, never bundled; plain .mjs with no build step | |
| 674 | terrain.mjs renders content/geography.json into static/ (§1.11) | |
| 675 | png.mjs minimal PNG encoder — zlib is its only dependency | |
| 676 | noise.mjs fbm and ridged noise for the terrain relief | |
| 677 | screenshots.mjs drives the running application in a headless browser and | |
| 678 | photographs it into docs/screenshots/ (D-042) | |
866c7f96 2026-09-07 Pavel Safronov | 679 | ``` |
| 680 | ||
| 681 | `canon/constants.ts` is the spine. Every derived figure — period, rim speed, land | |
| 682 | area, slat width — is *computed* from radius, length, slat count and target land | |
| 683 | area, never hard-coded. Changing the radius changes the whole app coherently. | |
| 684 | ||
| 685 | ### 2.3 State | |
| 686 | ||
| 687 | One small observable store. Views subscribe; nothing owns anything else. | |
| 688 | ||
| 689 | ```ts | |
| 690 | type TowerState = { | |
| 691 | point: { theta: number; z: number } | null // the picked location | |
| 692 | tod: number // 0..1, position in the diffuser day cycle | |
| 693 | brightness: number // W/m^2 mean, 30..320 -- the diffuser output setting | |
| 694 | spinPhase: number // 0..2pi, rotation for star motion | |
| 695 | spinning: boolean | |
| 696 | view: 'exterior' | 'map' | 'interior' | |
| 697 | writer: boolean // ?writer=1 -- a UI mode, not a security boundary | |
| 698 | probe: { from: SurfacePoint; to: SurfacePoint } | null | |
| 699 | } | |
| 700 | ``` | |
| 701 | ||
| 702 | The exterior and map pickers both write `point`; the interior view reads it. That | |
| 703 | is the entire interaction loop. | |
| 704 | ||
5f38efd0 2026-09-07 Pavel Safronov | 705 | ### 2.4 The exterior view |
| 706 | ||
| 707 | Scene units are kilometres, so the code reads in canon numbers. Tower's axis lies | |
| 708 | along world Z with the sun cap at z = 0, which puts a canon surface point at | |
| 709 | `(R cos θ, R sin θ, z)` in the hull's own frame. The hull spins about Z and carries | |
| 710 | that frame with it, so **picking resolves the ray hit back through | |
| 711 | `worldToLocal`** — otherwise every point picked off a turning hull would be wrong by | |
| 712 | the spin phase. | |
| 713 | ||
| 714 | Two deliberate departures from physics, both reading aids of the same kind as the | |
| 715 | map's hillshade: | |
| 716 | ||
| 717 | - **Fill lighting.** Real sunlight here runs parallel to the axis, so Tower's flank | |
| 718 | is edge-on to it and renders very nearly black — accurate and useless. Two fill | |
| 719 | lights lift the hull enough to read its shape. | |
| 720 | - **A visible beam.** In vacuum there is nothing between collector and cap to | |
8b6287ba 2026-09-07 Pavel Safronov | 721 | scatter light, so the converging beam would not be visible at all. It is drawn |
| 722 | as rays because it is the thing the view is about. | |
| 723 | ||
| 724 | Everything in the scene is captioned — collector, beam, both caps — with screen-space | |
| 725 | labels. A pale disc and a cone of light are not self-explanatory, and the collector | |
| 726 | is the least intuitive object in Tower: it is larger than the world it feeds. | |
5f38efd0 2026-09-07 Pavel Safronov | 727 | |
| 728 | The default camera frames the whole system rather than Tower alone: the collector | |
| 729 | is 244 km across and flies 320 km ahead, and it is the larger object. | |
| 730 | ||
65484043 2026-09-08 Pavel Safronov | 731 | **The hull has two readings, and the view switches between them** (D-047). **True** |
| 732 | is the outer skin: bare structure, the checkered sun cap, and the glazed far cap. | |
| 733 | **X-ray** wraps the terrain raster onto the outside instead — from outside Tower is | |
| 734 | structure, so what that texture shows is what is *inside*, which makes it a diagram | |
| 735 | and not a view. Both are worth having and they are not the same claim, so the | |
| 736 | control is a two-way switch rather than a checkbox. | |
| 737 | ||
| 738 | The wall is drawn as two meshes rather than one double-sided one, because its two | |
| 739 | faces show different things: the outer skin changes with the mode, and the inner | |
| 740 | surface is always the land. Since the far cap became a window (D-045) that inner | |
| 741 | surface is genuinely visible from outside — look in through the glass in true mode | |
| 742 | and the world is really there, lit and 540 km deep. It is the only line of sight | |
| 743 | into Tower that is not a projection. Three's cylinder runs u around and v along, while the raster is the other | |
11a13dbf 2026-09-07 Pavel Safronov | 744 | way round, so the UVs are rewritten from the original attribute rather than derived |
| 745 | from vertex positions — the seam vertices are duplicated, and deriving an angle from | |
| 746 | them smears one column of triangles across the whole image. | |
| 747 | ||
15d933c9 2026-09-07 Pavel Safronov | 748 | **The camera position persists** across reloads, alongside the active view, so |
| 749 | returning to the page returns to the vantage you left. Both end caps are places in | |
| 750 | their own right, so the view can frame them: a cap's marker sits on the **axis**, | |
| 751 | because a cap is a disc across the end and a point on its rim would ride round the | |
| 752 | edge as Tower turns. | |
| 753 | ||
11a13dbf 2026-09-07 Pavel Safronov | 754 | Markers are scaled per frame to hold a roughly constant size on screen. A 4 km dot |
| 755 | is legible from 200 km and sub-pixel from the 1,200 km of the default view, which is | |
| 756 | to say the places would simply not be there. | |
| 757 | ||
28f9a6bc 2026-09-07 Pavel Safronov | 758 | ### 2.4 The interior view — built |
| 759 | ||
| 760 | Scope held: **real geometry, simple ground.** | |
| 761 | ||
| 762 | Real: the shell is the actual cylinder, curving up on both sides and closing | |
| 763 | overhead, displaced by `terrain-height.png` and painted with `terrain-color.png`. | |
65484043 2026-09-08 Pavel Safronov | 764 | **Stars only through the far cap** — the wall is sealed (§1.4), so for 539 of the |
| 765 | 540 km the sky is land and light. The far cap is glazed (D-045) and the sky beyond | |
| 766 | it is sampled by view direction in an azimuthal-equidistant projection about the | |
| 767 | spin axis, which makes the pinwheel fall out of the projection rather than being | |
| 768 | animated into it: azimuth plus spin phase, one turn every 7 min 29 s, and the | |
| 769 | point on the axis genuinely motionless. | |
28f9a6bc 2026-09-07 Pavel Safronov | 770 | |
| 771 | Simple: the ground is the raster plus a little procedural grain in the near field, | |
| 772 | not modelled scenery. No buildings, no vegetation meshes. Cells are 0.7 km and | |
| 773 | texels 264 m, so relief a valley away is real and the ground underfoot is not. | |
| 774 | Detailed procedural scenery stays deferred. | |
| 775 | ||
| 776 | **Haze is the shader, and it is integrated rather than faked.** Every fragment | |
| 777 | samples the rotational density profile 24 times along the ray to the camera and | |
| 778 | extinguishes per channel — red survives twice as far as green, blue half as far, | |
| 779 | which is what makes distance blue rather than grey. From the floor it reproduces | |
| 780 | §1.8 from the inside: 78% straight up against 31% for the same 100 km along the | |
| 781 | ground, printed in the readout so the claim can be checked rather than believed. | |
| 782 | The airlight the haze adds is *neutral*; tinting it blue double-counts the | |
| 783 | wavelength dependence and turns even the desert mauve (D-034). | |
| 784 | ||
65484043 2026-09-08 Pavel Safronov | 785 | **Nothing inside the scene rotates**, because the observer, the ground and the air |
e27aaf20 2026-09-08 Pavel Safronov | 786 | all co-rotate. What falls carries the spin, and §1.9.2 is lopsided about how: rain |
| 787 | leans a fixed 1.5° whatever the cloud, because drag pins its speed, while only free | |
| 788 | fall keeps accelerating and so keeps leaning. **The waterfall is the compass; the | |
| 789 | rain is barely a hint.** Rain is no longer drawn (D-049) — 1.5° is not a picture, | |
| 790 | and the pinwheel below does the job it was standing in for. The physics stays in | |
| 791 | `canon/motion.ts` and stays tested; it was only ever the rendering that could not | |
| 792 | carry it. | |
65484043 2026-09-08 Pavel Safronov | 793 | |
9c891d2e 2026-09-08 Pavel Safronov | 794 | **The one thing that does turn is outside.** The sky through the caps does not |
65484043 2026-09-08 Pavel Safronov | 795 | co-rotate, so it wheels once every 7 min 29 s about the motionless star on the axis |
e27aaf20 2026-09-08 Pavel Safronov | 796 | (D-045). It is by a wide margin the plainest evidence of the spin in the view, and |
9c891d2e 2026-09-08 Pavel Safronov | 797 | it is the only evidence left now that the rain is gone. Both caps are windows |
| 798 | (D-050), so it can be had looking either way along the axis — deepward into empty | |
| 799 | space, or sunward past the black disc of the collector. | |
28f9a6bc 2026-09-07 Pavel Safronov | 800 | |
| 801 | The observer stands on the terrain, which means the height raster is read back onto | |
| 802 | the CPU and sampled against the mesh's own cell corners — the GPU cannot be asked | |
| 803 | where the ground is (D-035). | |
| 804 | ||
| 805 | Instruments in the view: eye height from 1.7 m to 25 km with the local gravity | |
65484043 2026-09-08 Pavel Safronov | 806 | beside it, the five canon illumination settings of §1.3, the field of view as a |
28f9a6bc 2026-09-07 Pavel Safronov | 807 | pair of binoculars, and captions on every place still visible through the haze. |
| 808 | Selecting a place walks the observer to it (D-038) — the haze horizon closes at | |
| 809 | 100–150 km, so turning to face something usually just points at haze. | |
| 810 | ||
65484043 2026-09-08 Pavel Safronov | 811 | The caps are no longer the same object. **The sun cap is checkered** (D-041) — |
| 812 | polar, six rings, cells about 8 km. **The far cap is glazed** (D-045), and the | |
| 813 | checker survives on it as the window's mullions: the same tessellation at the same | |
| 814 | pitch, so it is still the only object in the world with a known size and still | |
| 815 | doubles as a scale for judging distance, now read against sky rather than plate. | |
| 816 | Both patterns are shared with the exterior view. | |
| 817 | ||
| 818 | The far cap's glazing is set a kilometre into its own frame, so from inside there is | |
| 819 | a **1 km reveal** around it. That is the only place the wall depth of D-044 can be | |
| 820 | seen from within the world, which is why it is the only place it is drawn. | |
28f9a6bc 2026-09-07 Pavel Safronov | 821 | |
| 822 | Not modelled: water has no surface. Lakes and seas are painted in the raster and cut | |
| 823 | into the shell as basins, so standing in one puts you on its floor. | |
866c7f96 2026-09-07 Pavel Safronov | 824 | |
| 825 | --- | |
| 826 | ||
| 827 | ## 3. Writer mode and the world file | |
| 828 | ||
| 829 | The app is an instrument for writing the novel as much as a thing to look at. It | |
| 830 | must answer questions like *can the far face be seen from the midpoint?*, *where | |
| 831 | does a central embassy go?*, *can a lake overhang?* — and let their answers be | |
| 832 | placed, named and kept. | |
| 833 | ||
| 834 | ### 3.1 Two modes over one data file | |
| 835 | ||
| 836 | | | Reader (default) | Writer (`?writer=1`) | | |
| 837 | |---|---|---| | |
| 838 | | World content | committed `world.json`, read-only | editable, drafts in `localStorage` | | |
| 839 | | Instruments (§3.3) | sightline probe only | all | | |
| 840 | | Output | permalinks to a point or place | **Export JSON** for the author to commit | | |
| 841 | | Panel | read-only detail card | full editor, canon controls, import/export | | |
| 842 | ||
| 843 | There is no backend — GitLab Pages is static. The loop is: the author edits in the | |
| 844 | browser, exports `world.json`, commits it, and the published site serves it. Simple, | |
| 845 | versioned in git alongside the prose, and diffable. | |
| 846 | ||
| 847 | **Writer mode is a UI mode, not a security boundary.** Anyone may set `?writer=1`; | |
| 848 | they can only edit their own local copy, which persists nowhere and reaches nobody. | |
| 849 | This is fine, and arguably good — a reader who finds it gets a sandbox. It must not | |
| 850 | be mistaken for access control. | |
| 851 | ||
| 852 | ### 3.2 The world file | |
| 853 | ||
| 854 | ```jsonc | |
| 855 | { | |
| 856 | "version": 1, | |
| 857 | "places": [{ | |
| 858 | "id": "hallow-crossing", // permalink target; see below | |
| 859 | "name": "Hallow Crossing", | |
| 860 | "kind": "city|embassy|lake|region|landmark|note", | |
| 861 | "geometry": { "type": "point", "theta": 1.9635, "z": 270000 }, | |
| 862 | // or { "type": "polygon", "points": [[theta,z], ...] } for lakes, regions | |
| 863 | "blurb": "public description, shown to readers", | |
| 864 | "notes": "the author's working notes — NEVER shipped", | |
| 865 | "public": true // false = not ready to exist publicly | |
| 866 | }] | |
| 867 | } | |
| 868 | ``` | |
| 869 | ||
| 870 | **Two text fields, deliberately separate.** `blurb` is written for readers and | |
| 871 | ships; `notes` is the author's working thinking and never leaves the machine except | |
| 872 | in a backup. One field with a flag would have made every note a publication | |
| 873 | accident waiting to happen. | |
| 874 | ||
| 875 | **Ids follow the name until pinned.** An id is a permalink target and must be | |
| 876 | stable once published, but during world-building names churn constantly and a file | |
| 877 | full of `new-city-7` is unreadable. So the id tracks the name while it still | |
| 878 | matches it, and editing the id field freezes it for good. The editor shows the id | |
| 879 | for exactly this reason. | |
| 880 | ||
| 881 | Coordinates are canon (θ radians, z metres, §1.7) — never map pixels, so the file | |
| 882 | survives any change to how the map is drawn. | |
| 883 | ||
| 884 | **The `public` flag is a privacy trap worth naming.** Working notes ("embassy here? | |
| 885 | check sightline to the cap") must not ship to readers. But a `world.json` committed | |
| 886 | to a public repository is public regardless of any flag in it. So export writes two | |
| 887 | files: **`world.json`** (public entries only, committed) and | |
| 888 | **`world.private.json`** (everything, gitignored by default). Whether private notes | |
| 889 | should nonetheless be version-controlled — in a private repo, or a second one — is | |
| 890 | the author's call and is deliberately unresolved. | |
| 891 | ||
| 892 | ### 3.3 Instruments | |
| 893 | ||
| 894 | The measuring tools are the real substance of writer mode. Each answers a question | |
| 895 | the novel actually raised: | |
| 896 | ||
| 897 | - **Sightline probe.** Pick two points; get surface distance, straight-line | |
| 898 | distance, optical depth, transmission, and a plain verdict (*crisp / hazy / ghost | |
| 899 | / invisible*). This is the tool that answered §1.8. Available to readers too — it | |
| 900 | is the single most illustrative thing in the app. | |
| 901 | - **Viewshed overlay.** From a selected point, shade the whole map by transmission. | |
| 902 | It renders the axis-versus-overhead asymmetry as one picture, which is worth more | |
| 903 | than the table in §1.8. | |
| 904 | - **Lighting probe.** At a point, illumination across the day cycle at the current | |
| 905 | brightness setting (§1.3) — for writing a scene at a specific hour. | |
| 906 | - **Travel.** Surface distance and journey time between points at chosen speeds, | |
| 907 | including whether the route crosses a slat. | |
| 908 | - **Sky-at-a-time.** Star field, beam position and Earth transits for a given point | |
| 909 | and moment, so a described sky is a correct sky. | |
| 910 | ||
| 911 | ### 3.4 What readers get | |
| 912 | ||
| 913 | The public link is the finished map: embassies, towns, lakes, named regions — the | |
| 914 | permanent things, behaving like any map application. Plus the exterior view, the | |
| 915 | interior view from any point, and permalinks so a reader can be handed a place and | |
| 916 | a moment. Reading the world, not editing it. | |
| 917 | ||
| 918 | ## 4. Phases | |
| 919 | ||
| 920 | 1. **Design** — this document and `decisions.md`. ← current | |
| 921 | 2. **Scaffold** — Vite/TS/Three, CI to Pages, `canon/` implemented and unit-tested. | |
5f38efd0 2026-09-07 Pavel Safronov | 922 | 3. **Exterior** — ✅ hull, caps, collector, beam, spin, and hull point picking. |
866c7f96 2026-09-07 Pavel Safronov | 923 | 4. **Map** — unrolled surface, slat rendering, picking, sync with exterior. |
28f9a6bc 2026-09-07 Pavel Safronov | 924 | 5. **Interior** — ✅ shell geometry, the haze shader, the beam, rain, eye height, |
65484043 2026-09-08 Pavel Safronov | 925 | and the five illumination settings. Stars, but only through the far cap window. |
866c7f96 2026-09-07 Pavel Safronov | 926 | 6. **Writer mode** — ✅ *built ahead of 3–5, at the author's request, because the |
| 927 | world needs developing before there is anything to render.* Map view, place | |
| 928 | editing for all thirteen kinds, points/polylines/polygons, localStorage | |
| 929 | autosave, backup and static exports, import, and the sightline probe. | |
| 930 | 7. **Content pipeline and reader mode** — ✅ `content/geography.json` + | |
| 931 | `npm run terrain` (D-019); the rendered terrain drawn under the map; reader and | |
| 932 | writer modes (D-011); permalinks (D-010). | |
6364748a 2026-09-08 Pavel Safronov | 933 | 8. **Polish** — mobile ✅ (the sidebar is a drawer below 720 px, D-043) and a |
| 934 | screenshot tour that photographs all ten views through the UI, D-042. | |
fc11b064 2026-09-08 Pavel Safronov | 935 | Remaining: transitions, performance. |
866c7f96 2026-09-07 Pavel Safronov | 936 | |
28f9a6bc 2026-09-07 Pavel Safronov | 937 | All five view phases are built. Phase 2's `canon/` landed with phase 6, since the |
| 938 | map could not be drawn without it. | |
866c7f96 2026-09-07 Pavel Safronov | 939 | |
| 940 | **Shareable permalinks are implemented** (phase 7) — the app has | |
| 941 | readers, and "stand here and look at this" is the whole reason it exists as a | |
| 942 | companion piece. Named locations from the novel should be markable on the map for | |
| 943 | the same reason. | |
| 944 | ||
| 945 | Later, explicitly out of scope for now: procedural scenery, settlements, weather | |
| 946 | systems. |