The board's qualifying fleet counted Independent pilots and their ships,
so the player saw jobs only an Independent pilot could fly. Generation
and the read filter now use the player's Manual pairs, falling back to
the whole fleet when there are none.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Welcome card text and the tutorial employer's name in content; save
version 7 records whether this company's welcome was seen (decision
0.5.131).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CR-020 and Phase 20 went to the Bridge dashboard, recorded first in
another session. Independent Pilots is CR-021 (decisions 0.5.122-0.5.130);
its Steps 20.1-20.5 commits are Steps 21.1-21.5.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Commands and the resolution loop replay arrivals and Independent
pilots' decisions in time order, at most 7 days, in chunks with
progress; the same time always gives the same save (decision 0.5.125).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Commands to buy the Dispatch Office, set a pilot's mode and orders, and
set the spending floor; save version 5 starts every pilot on Manual
(decisions 0.5.118-0.5.120).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Location boards are generated for the qualifying fleet and store it;
reads hide jobs it can no longer complete. Save version 4 drops stored
boards (decisions 0.5.115, 0.5.117).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New ships (deal or Market) come full on Manual refueling; save version
3 puts every existing ship on Manual. The balance simulator refuels only
when a job needs it (decisions 0.5.111, 0.5.112).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A one-time tip after the deal and the notification permission prompt,
listing each pilot's unspent skill points, with Go to Pilots and Later
(decision 0.5.109). The engine client exposes the pending permission
prompt as ApiClient.notificationPrompt().
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Applies CR-016's amendments to the implementation plan (eight
locations, the deferred list, content, map art, goods, fuel and balance
notes) and documents the belt and label planning. Phase 16 is complete.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Caddy listens on port 80 inside the container (the Caddyfile had moved
it to 8080, which the port mapping didn't reach). NPM handles the domain
and HTTPS, so compose publishes only HTTP_PORT (default 8080) and drops
the HTTPS ports, certificate volumes and SITE_ADDRESS.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ship cards show a fuel gauge and refuel policy, with a Fuel sheet to
fill or buy an amount, switch policy, and order emergency fuel when it
is offered. The dispatch sheet and deadhead picker show fuel needed,
on board and left after, price fuel at the tank's average, and offer
"Refuel here first". Locations show fuel prices with the cheapest
marked, and delivery summaries list Auto top-ups.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refuel a ship where it is (fill or an amount, at the local price),
switch its refuel policy, and order emergency fuel when the sim offers
it (fuel at 2.5x the local price, cost added to the loan). The save
fields and migration landed in Step 15.4.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The no-strand rule now asks whether the ship could leave the
destination on a full tank where fuel is sold, or on what is left
after the leg where it isn't. Emergency fuel is offered to an idle
ship that can't reach anywhere when the player can't afford the
shortfall: the cheapest leg's fuel at 2.5x the local price.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ships carry fuel: a leg burns from the tank at departure (no credits),
dispatch needs the fuel on board (not-enough-fuel), a leg's fuel cost
is fuel burned x the tank's average price, and Auto top-up refills on
landing with what the credits cover. The save gains tank fields (save
version 2, migration fills every tank). Market ships arrive full; the
deal's ships come with a quarter tank to keep the balance targets.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ships get a tank capacity and a burn rate instead of range and fuel
cost; locations get a fixed fuel price and a sellsFuel flag instead of
the launch cost multiplier. A leg burns burn rate x the economic
distance of (distance / origin factor), and reach is a full tank's
worth. Tanks are sized so every reach answer is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Locations get fixed polar coordinates (the Moon as an offset from
Earth) and astronomy-engine is removed, so positions now come from
content. Ranges move into CR-015's reach bands for the fixed distances,
and the Lighter's price drops to 36,000 to keep the balance targets.
Date-sampled tests become yes/no.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Removes apps/server (Fastify, Drizzle, pg-boss, Better Auth), the
development Postgres, the backup code routes, the web HTTP client and
the CI database service. Deployment is static hosting with Caddy. A
Playwright test checks that the production build loads only its own
files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Export save turns the whole save into one code (gzip + base64url
behind a DEADHEAD1. prefix) to copy or share as a file; Import save
takes a pasted code or a file, migrates and validates it, and replaces
the company after confirmation. A bad code is refused and changes
nothing. These replace the backup code. Debug info now gives the save
id, save version and storage type.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine derives the notification schedule from the save after every
saved change (arrivals, rest ending, upgrades; same-minute events
combined) and replaces the platform's schedule. Capacitor
LocalNotifications on iOS/Android, a no-op on the web. Permission is
asked after the deal; Settings has an On/Off toggle.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>