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