Token policy, decided 2026-09-05
The Codex plan is now 20×, so implementation load goes to Astra and its Codex subagents, with Sol 5.6 on bounded, test-covered pieces. Claude's budget is reserved for project management, design specs and acceptance criteria, review of Astra's commits, QA through screenshot tours, tests and performance gates, and small integration glue. Claude agents are spawned only when Astra is saturated, when a task needs Claude's browser tooling such as Meshy, or when a hard shader or solver stalls. In the tables below, ASTRA means Astra or a Codex subagent; CLAUDE means review, QA or spec, not implementation.
Foundation
Everything already built, and the last wiring before new features start.
| Item | Owner | Status |
|---|---|---|
| Camera-relative 64-bit navigation, LOD terrain streamed in workers | ASTRA | DONE |
| Atmospheric scattering, volumetric clouds, stars and sun | ASTRA | DONE |
| Terrain v2: ridged mountains, cliffs, beaches, metre-scale relief | CLAUDE | ADOPTED |
| Per-pixel terrain material, ocean shader, real trees, cascaded shadows | CLAUDE | READY · WIRING |
| Orbital station (Blender) with animated hangar, landing deck, LOD | CLAUDE | READY · WIRING |
| Physical boarding: hatch, ramp, cabin, pilot seat | ASTRA | DONE |
| Tests: 30 unit tests, Playwright smoke on system Chromium | CLAUDE | DONE |
| Public repo, README, AGENTS.md, contributor guide | ASTRA | IN PROGRESS |
Flight physics and the edge of space
The ship feels the atmosphere. Two flight regimes with a defined boundary, and landing struts that absorb the shock.
| Altitude | Regime | Behaviour |
|---|---|---|
| > 70 km | SPACE · 6-DOF | Newtonian. RCS translation on all axes, torque control, flight-assist damping toggle, no drag. Speed capped only by travel mode. |
| 20 – 70 km | TRANSITION | Aero forces scale with density ρ(h) = ρ₀·e−h/8000. Control authority blends from RCS to control surfaces by dynamic pressure q = ½ρv². Re-entry glow when q·v exceeds threshold. HUD reads "ATMO 43 %". |
| < 20 km | PLANE FLIGHT | Lift and drag from angle of attack and airspeed, stall below vstall, banked turns, thrust-limited top speed. Gravity kept at 1 g for feel, exposed as a constant. |
Work items
- flight-model.js, a pure step(state, controls, env, dt), unit-tested for stall, terminal velocity and RCS in vacuum. ASTRA
- Regime blend and HUD indicator; per-regime and per-mode speed limits. ASTRA
- landing-gear.js: spring-damper strut per leg (0.6 m travel), one raycast per strut against terrain or hangar deck, touchdown g-force to a damage event. ASTRA · SUBAGENT
- Re-entry plasma shader on the hull driven by q. ASTRA · SUBAGENT
- Wind loudness from q, RCS puffs in vacuum. ASTRA · AUDIO
Why 70 km
The Kármán line at quarter scale would be about 25 km, but the scattering shell already rendered ends at 70 km. Using the shell as the boundary keeps what the pilot sees and what the ship feels in agreement.
Cockpit: MFDs, radar sphere, power
Four standardized rectangular displays in the corners of the pilot's view, a radar sphere between the lower two, all data-driven and cheap.
MFD standard
- 512 × 384 canvas (4:3) drawn to a cockpit quad or a DOM overlay; same page code either way.
- Pages: CONTACTS (range, closing speed, IFF), POWER (classic pips: weapons / thrusters / shields, afterburner reserve), SHIP (damage per component, fuel, gear, mode), NAV (destination, ETA, regime, hangar guidance), COMMS / CARGO later.
- Five bezel buttons per side. 1–4 selects an MFD, [ ] pages.
- Radar sphere: instanced points and rings, up to 256 contacts coloured by IFF, elevation stalks, 20 Hz.
Efficiency contract
- Each page is a pure draw(ctx, shipState).
- Displays refresh at 12 Hz, staggered one per frame, and only when their dirty hash changes.
- One typed-array ShipState bus written by the sim; no DOM reads in the loop.
- Budget under 1 ms per frame on a laptop, gated in the smoke test.
| Work item | Owner |
|---|---|
| ShipState bus and MFD host (routing, dirty tracking, staggering) | ASTRA · HOOK-UP |
| Page renderers with a shared design system (mint brand, mono type, 2 px grids) | ASTRA · SUBAGENT · SPEC BY CLAUDE |
| Radar sphere | ASTRA · SUBAGENT |
| Cockpit geometry: four screen quads and sphere mount in the walkable cabin | ASTRA |
| Performance gate in the smoke test | CLAUDE |
Celestial expansion
A hot second planet, a moon, an asteroid ring visible from the beach, and the travel modes to reach them.
| Body | Radius | Where | Character |
|---|---|---|---|
| AEON | 1 592.75 km | 25 M km from the star | The current planet. |
| SEL · moon | ≈ 434 km | 75 000 km orbit | Quarter-scale Luna. No atmosphere, grey regolith, crater noise term, ⅙ g. Disc of 0.66° from Aeon's surface, a touch larger than our Moon. |
| RING | 5 – 200 m rocks | 3 800 – 4 600 km (2.4 – 2.9 R) | Ring shader for distance, a band across the sky from the surface with a faint shadow line; instanced rocks within 50 km of the player; mineable in Phase 6. |
| PYRE · hot planet | ≈ 1 200 km | 10 M km from the star | Thin CO₂ atmosphere, lava-cracked basalt, 400 °C day side with hull-temperature warnings. A bright morning star from Aeon. |
Travel modes
- Combat ≤ 250 m/s, afterburner 400 m/s (Phase 4).
- Travel ≤ 3 km/s inside a gravity well.
- Jump between bodies: align, spool 4 s, straight line at 0.05 c with a tunnel effect. Moon in 5 s. For the 15 M km to Pyre use 0.2 c, about 4 minutes, or a 0.5 c interplanetary lane.
- Bodies follow Keplerian orbits at real time; positions are doubles; origin rebasing already handles it.
Work items
- Body abstraction across planet, atmosphere, vegetation. ASTRA
- Moon palette and craters; ring shader and instanced belt. ASTRA · SUBAGENTS
- Pyre palette and heat mechanic. ASTRA · SUBAGENT
- Jump travel, tunnel effect, NAV page. ASTRA
- Moon and planets as lit discs from the surface. ASTRA
Combat
Wing Commander-style dogfighting inside 4 km. Travel mode versus combat mode, shields that matter.
Modes
Travel is fast with weapons safe and shields low. Combat caps speed at 250 m/s, afterburner to 400 m/s on a heat and fuel budget, weapons hot, gimbal assist on. Switching takes 1.5 s and the POWER page pips redistribute.
Weapons on mounts
Hardpoint sockets at wing tips, nose and belly. Laser repeaters (energy, travel time), ballistic cannons (projectiles, ammo), missiles (lock-on, countermeasures). Hard 4 km range, lead indicator from target velocity, projectiles in a fixed 60 Hz sub-step.
Shields and damage
Four quadrants with pools, recharge after 3 s without a hit, power pips scale recharge. Hull HP per component: engines, wings and gear each degrade a gameplay system. Impact ripple shader, sparks, smoke on damaged engines.
AI
Three behaviours: pursue with lead, strafe and extend, evade. Difficulty by turn rate and accuracy. Patrol encounters near the station and the ring. Single-player first, server-authoritative once Phase 5 lands.
| Work item | Owner |
|---|---|
| Weapons, projectiles, shields, damage model, wired to the flight model | ASTRA |
| Targeting HUD, lock, lead indicator, shield ripple | ASTRA · SUBAGENT |
| Dogfight AI | ASTRA · SUBAGENT |
| Balance tests (time-to-kill tables) | CLAUDE |
Multiplayer
A shared solar system with dozens of ships in view and persistent bases. The client stays a static site; the server ships entities, never terrain.
Architecture
- Authoritative server in TypeScript (Node 22 or Bun) or Rust, fixed 30 Hz tick.
- WebTransport preferred, WebSocket fallback, binary packets, client prediction with reconciliation.
- Interest management by spatial cell per body: full updates within about 50 km, low-rate beacons for everything else.
- One shard process per body (Aeon, Sel, Pyre, ring, deep space). All fit on one machine early; a gateway hands players between shards on jump later.
- Postgres for accounts, inventories, bases and economy; Redis pub/sub between shards. Magic-link or GitHub sign-in, no stored passwords.
- Server owns damage, resources and money; the client owns only its own flight input.
Rules of thumb
- About 25 KB/s down and 5 KB/s up per player at 20 Hz with 50 entities in interest.
- About 0.3 ms CPU per player-tick at 30 Hz in JavaScript, so roughly 250 players per core.
- RAM is negligible. Bandwidth is what you pay for.
- Put a Cloudflare tunnel and DDoS front in place before any public announcement.
| Tier | Concurrent players | Machine | Est. cost | Notes |
|---|---|---|---|---|
| 0 · SITE ONLY | unlimited | Cloudflare Pages or Netlify, static | €0 | Client and assets, about 6 MB, cached at the edge. |
| 1 · MVP | ≤ 200 | netcup RS 2000 G12 (ordered) or Hetzner CX43: 8 shared vCPU, 16 GB, 160 GB, 20 TB traffic. Or CAX31 (8 Arm vCPU, 16 GB, €20.99) if the server runs on Node or Bun. | €15.99 / mo | All shards on one box, Postgres and Redis local. 200 players ≈ 40 Mbit/s ≈ 13 TB a month at full load, inside the 20 TB allowance. |
| 2 · GROWTH | ≤ 2 000 | Hetzner AX42 dedicated: Ryzen 7 PRO 8700GE, 64 GB DDR5 ECC, 2 × NVMe, unmetered 1 Gbit, Cloudflare in front. | €46 / mo + €39 setup | One dedicated box outperforms three cloud CCX33s, now €138 each, and traffic is unmetered. Shards by body as separate processes. Add a US AX42 later. |
| 3 · BLOW-UP | 10 000 + | 4 – 8 × AX42 / AX102, or an EPYC AX162 hub, behind a gateway; Redis cluster, managed Postgres, CDN for all static | €400 – 1 500 / mo | Roughly €0.05 – 0.15 per player per month. Shards split further by cell. |
Prices verified 2026-09-05, after Hetzner's June 2026 increase: CPX and CCX roughly doubled, CX, CAX and the dedicated AX line barely moved, so those are the picks.
Ads and funding, kept modest
Because the client is a static site, ordinary web ads work on the landing view and loading screen only, never in the HUD: one 300 × 250 or a native sponsor card under the mission panel. EthicalAds or Carbon Ads need no consent banner; AdSense does in the EU. Add a privacy page and an ad-free supporter tier via Ko-fi or GitHub Sponsors. For this audience the supporter tier will likely out-earn banners.
Bases, resources, mining, caves
Rust and Dune-style modular building, a harvest-refine-craft chain, and caves where the rare items are.
Building
Socket-snapped pieces: 4 m foundation, wall, doorway, window, roof, ramp, pillar, gate, in wood, stone and metal tiers. Levelling foundations sit on the terrain height function; bases up to 1 000 pieces; placement validated server-side; ownership with an access code.
Interference shield
The base core projects a sphere of 150 – 600 m by tier. Ships without the code get a NO ENTRY warning on the MFD at twice the radius and lose engines inside it. People on foot can still walk in, so walls matter. A faint hex bubble marks the boundary.
Resources and tools
Wood from trees (chopping removes the instance and it regrows), stone from rocks and cliffs, metal ore from veins in cliffs, caves and ring asteroids, crystals only in caves. Hatchet, pick and a mining laser with a heat budget.
Processing chain
Campfire, then forge (ore to ingots), refinery (fuel from ice and regolith), fabricator (parts, weapons, base pieces). Inventory by mass, ship cargo hold, storage crates.
Voxel mining: asteroids and planetside
Every mineable volume is a signed-distance field meshed with marching cubes in a worker, the same engine for ring asteroids, cave interiors and ore outcrops. An asteroid is an ellipsoid plus noise plus an ore-vein field, voxelized in 32³ chunks only within about 2 km of the player. Mining subtracts a sphere; each asteroid keeps a sparse brush list of position, radius and material removed, so holes are tiny to persist, cheap to replicate and identical for every player. On the planet the height-field stays authoritative for the surface and voxel islands overlay it at ore outcrops, cliff faces, cave interiors and under a placed excavation marker. Digging the open surface anywhere is out of scope for v1, since a height-field cannot hold an overhang. Yield equals removed volume times ore density at the brush.
Caves
A 3D worm-noise field carves the terrain. Near the player it is voxelized in 32³ chunks at 1 m and meshed with marching cubes in a worker; entrances appear where the field meets steep terrain. Interiors are lit by crystal emissives and a headlamp. Rare items spawn deep. The height-field terrain stays as it is; cave chunks replace it locally with a stencil on the surface mesh.
Hero props with Meshy (25 000 credits)
A Claude Opus agent drives Meshy through Chrome while you stay signed in, the one standing exception to the token policy because it needs Claude's browser tooling; it never handles credentials. Targets: forge, refinery, fabricator, storage crate, base gate, turret bases, mining laser, shop kiosk, an asteroid set and a crystal set, each under 10 k triangles, decimated in headless Blender and exported as glTF into the models folder. Check the per-model credit cost in the dashboard first; the budget should cover on the order of a hundred assets, so plan around forty and keep the rest for iterations.
| Work item | Owner |
|---|---|
| Snapping, placement validation, ownership and codes | ASTRA |
| Building pieces kit and props | CLAUDE OPUS + MESHY · EXCEPTION |
| Interference shield mechanic | ASTRA |
| Resources, inventory, crafting chain, tools | ASTRA · SUBAGENT |
| Voxel engine: SDF, marching-cubes worker, brush lists (shared by asteroids, caves, outcrops) | ASTRA · FABLE ONLY IF STALLED |
| Asteroid SDFs and ore fields; cave field and entrances | ASTRA · SUBAGENTS |
| Brush-list replication and persistence | ASTRA · PHASE 5 |
Economy and pre-built outposts
Somewhere to sell what you mined and buy what you need.
Outposts
One pre-built NPC outpost per biome plus the station concourse, each with shops for resources, fuel, ammo and ship parts. Prices drift with server-wide supply and demand. A mission board offers deliveries, escorts, patrol clears and cave surveys.
Money
Currency and ledger live on the server. Player-to-player trade happens at kiosks. Cave crystals and artefacts are the high-value goods, which is what makes the caves worth the risk.
Launch and scale
Ship it to the world without it falling over.
- CI: unit tests, smoke test, bundle-size budget on every push.
- Opt-in telemetry with fps and latency histograms; crash reporting.
- Cloudflare in front; EU and US regions.
- Weekly builds and a Discord.
Community model, decided 2026-09-05
The repository is private and invitation-based. Anyone who wants to contribute by bringing their own coding agent, whether Claude Opus 5, Fable, GPT-6 or Sol, asks Cees for an invite. The agents guide and the handoff document are the onboarding: file ownership, the module-swap pattern, test pages under /dev/, and tests that stay green. Invitees work on branches and open pull requests, and the agents' owners review each other's work.
Quality bar
Added after the owner's review: assets looked whiteboxy and the map showed three blobs where a planetary system should have been obvious. Tests passing is not the bar; looking finished is.
Art direction
One faction language: white armour, dark polymer, brushed metal, mint accents, amber only for warnings. No whitebox ships: every asset has a readable silhouette, material detail that catches light, an emissive or status detail where the design calls for it, correct scale against the human silhouette, and a review render. Hard-surface is Blender by script, organic is Meshy.
Definition of done, every PR
Tests and build green, zero console errors, a screenshot tour at five fixed viewpoints at desktop and phone sizes, performance numbers against per-scene budgets, keyboard, controller and touch reach. Visual PRs get an Opus review scored on six criteria with a 4.0 pass mark, or an explicit polish-later decision from the owner.
Regression
Fixed viewpoints: orbit, coast, forest, highlands, hangar, cockpit. Captures are diffed against baselines; any change is a review item. Baselines move only in the merge that intentionally changes the look.
Process
Two-stage review on every PR, Claude functional then Opus visual. A weekly quality pass scores the integration branch and files the top ten defects. Placeholder assets ship only behind a dev flag. Details in QUALITY.md in the repo.
Team and working rules
Three kinds of agents and one human, coordinated through files in the repo.
| Role | Who | Scope |
|---|---|---|
| Implementation lead: sim, netcode, integration, shaders, UI | ASTRA · CODEX · GPT-6 + SUBAGENTS | everything in src, server, MFD pages, effects |
| Bounded, test-covered pieces | SOL 5.6 · GPT | scoped files only, reviewed by Astra |
| Project management, specs, review, QA | CLAUDE · FABLE | roadmap, handoff, tests, screenshot tours, PR review, perf gates |
| Exceptions only: browser tooling, stalled hard maths | CLAUDE OPUS / FABLE AGENTS | Meshy asset generation; a shader or solver if Astra is stuck |
Rules
- One owner per file, recorded in the handoff document.
- New features land as new modules with a documented swap for the owner of the file they replace.
- Every module ships with a test page under /dev/ and a screenshot.
- Unit tests stay green. Requests between agents go in the handoff, not in chat.
- The roadmap is updated when a phase meets its exit criteria.