Changelog
Sprint-by-sprint notes from active development. The last handful of sprints show up here.
Play with an AI copilot
June 7 · You can now run your empire through an AI. SPAR Sector speaks MCP, so you can connect your live game from Claude Desktop or Claude Code and play it in plain language: ask for the state of the market, weigh a trade, dispatch a MULE, scout a frontier system, and let your copilot do the clicking. It is the same galaxy, the same ship, the same database, just a second cockpit. And it cannot cheat: every action runs through the exact gates a slash command does (combat locks, turn freezes, fog of war, licenses, Action Points), and every action has a preview that shows the true landed cost before you commit. You are always the captain; the AI just reads the instruments faster than you can. See the new AI Copilot page for how to connect.
Pick a side: factions, standing, and territory
June 4 · Ten factions now run the sector, and they do not all get along. Do a faction’s Pub jobs to climb in their favor and sink with their rivals: haul cargo for the Arimuz Combine and the Jesuite Synod likes you less for it, and the job board shows you the trade (+Arimuz / -Jesuite) before you take it. About a quarter of populated systems fly a faction’s colors, scattered across every sector and ringed on the star map, and your standing there is money. Favored ports give you cheaper buys, fatter sells, and free docking; ports that dislike you slap a surcharge on everything and charge you to dock. Run /ssfactions to see where you stand with all ten, and scan a system before you commit to read its controlling faction and price climate. The other three-quarters of space stays neutral, a safe harbor for when you have burned too many bridges.
The carrier, drawn to spec
June 4 · Your Ship Layout view grew up. The console now renders your carrier as a proper top-down schematic: bridge prow, power core, cargo bays, and engines drawn to the real hull, with every fitted module sitting on its actual hardpoint. Gun turrets swivel to aim outward, fixed launchers and packs sit neutral, and a Back Mount panel lists the underside fittings you cannot see from above. Each weapon, reactor, and drive shows its own art.
Talk to the people, not a menu
May 30 · The contacts in every station Pub are now living characters you actually talk to. Type whatever you want in the Say box and they answer in their own voice, with their own personality, slang, and quirks, rolled fresh for every station so no two bars feel the same. They decide when to offer you work, swap a job you turn down, and remember how they feel about you: waste their time and they get short with you, then cold, and they will remember it the next time you walk in. Some just want to drink and trade gossip. One fixer named Sanchez keeps a booth at a bar way out on the rim. There is also a new Ship Layout view on your console that draws your fitted modules slot by slot.
Build anything — the component tech tree
May 29 · Every finished good now runs on a real supply chain. X-SPARs first fabricate components — mechanical frames and hull plating (MCH), exotic field & drive parts like Alcubierre coils and ion thruster jets (FLD), electronics (ELC), and plastic packaging (PKG) — then assemble those into the 210 finished modules, weapons, drives, and goods. Components trade on the Trade Floor under the new “Components” category at industrial systems, and the full two-stage production chains are browsable on the Recipes page. Stand up a component foundry, feed your assembler, and run the whole capitalism stack yourself.
CSV export of your explored systems (/sssystemsexport)
May 24 · Small but handy. Run /sssystemsexport and get an ephemeral CSV file with every system you have explored, columns for zone, economy type, populated flag, trade-floor presence, and distance from Sol. For offline route planning, spreadsheet analysis, or sharing with other players.
CSV has 8 columns: system_id, system_name, zone, last_explored_turn, economy_type, populated_flag, has_trade_floor, distance_from_sol. One row per explored system, ordered by when you first visited. Ephemeral (only you see it). Fog-of-war respected by construction (only your explored systems, nothing else).
Behind the scenes: also consolidated the jump transaction into a single shared service method (was hand-rolled in three places: Discord cog, MCP tool, autonav). Same behavior; less duplication; if a future bug surfaces in jump, only one site to fix.
224 new X-SPAR recipes + every asset state pings comms + system IDs everywhere
May 24 · Afternoon sprint that triples-down on the morning’s work. Your X-SPAR can now manufacture 224 new finished goods (was 6). Every meaningful asset state transition now pings Quantum Comms. And system IDs show up next to system names everywhere in the UI so you can finally type them into slash commands without scrolling around.
The industrial loop is unlocked. X-SPAR went from 6 recipes (basic thruster + advanced jump drive + heavy railgun + sensor array + shield generator + exotic hold) to 230. Every finished-good family in the catalog now has at least one recipe: hull plates, hull frames, weapons (light and heavy), thrusters and jump drives, sensors and cloaks, power plants, life support, pharma, food, construction, industrial modules, trade goods, consumables, memory banks, exotic containment pods, AND the components tier (ELC). You need a blueprint to unlock each family (21 new blueprints, BPT020 through BPT040, one per family). Buy the Hull Plate Blueprint at a Lab and your X-SPAR can now make all 12 hull plate variants. Same for weapons (light pack, heavy pack), drives (thrusters, jump drives), and so on. Blueprints are owner-bought-once and stay in your inventory.
Every asset action talks to you now. Before this, a MULE running a trade route was silent until it finished and posted “sold X for Y SOL.” A SPAR sitting idle was indistinguishable from a SPAR working hard. Now you get a Quantum Comms message every time something meaningful changes. MULE departs origin, you see it. MULE arrives at pickup, you see it. MULE buys cargo, separate message. MULE delivers and sells, separate message (the existing sale ping, refreshed). SPAR engages (you ordered it or it auto-engaged on cargo arrival), you see it. SPAR runs out of input feedstock, you see it. SPAR fills its output hold (production paused), you see it. You issue a Rendezvous / Dispatch / Recall order, the asset acknowledges immediately in comms. (Asset under attack is the one missing piece; that comes when the NPC raider AI learns to target deployed assets, designed for a later sprint.)
System IDs everywhere in the UI. Trade Floor footer, hub welcome screen, ship console header, star map, /ssstatus location, Remote Comms asset list, asset card location line, all of it now reads as Name [123] instead of just Name. Useful because the slash commands that take a system reference (/ssmuleroute, /ssrecall, /ssjump) want an ID, and copying the ID out of UI text is way easier than scrolling through /sssystems to look it up.
Behind the scenes (not player-visible): five multi-step slash handlers got defensive try/except wrappings so a future bug can’t leave a slash stuck “thinking” at you; four MCP tools got better error code mapping; two more slash handlers (/ssmuleroute + /ssmilkrun) got atomic AP debit so a failed mutation no longer eats your AP; and a few stale docstrings + website pages got refreshed.
Asset arrival pings + Set Route inline (CR-307 transit polish)
May 24 · Two CR-307 followups closed this Sunday. Your assets now actually tell you when they arrive somewhere. And setting a MULE route no longer punts you out to a slash command.
Arrival comms. When an asset you ordered around (Rendezvous, Dispatch, or Recall) reaches its destination, you now get a Quantum Comms ping. Says whether it docked at a hub or arrived idle, names the system. Transit-cancelled (unreachable route) also pings now, so a stranded MULE is not silently stuck. Was a real hole: every other asset event (extractions, trades, hazards) fired comms, but arrivals were silent. Bruce kept asking “did my MULE land yet” and there was no way to know without re-opening Remote Comms. Fixed.
Set Route is in-menu. The Set Route button on the per-asset card used to be a polite shim: it told you to go run /ssmuleroute with the MULE name pre-filled. Now it opens a real Discord modal right there with three fields (origin system, destination system, material). Validates the route, checks your licenses at both endpoints, sets the route, all without leaving the menu. Edge cases (dump-all, SPAR pickup/deliver, milk runs) still live on /ssmuleroute for the full power, but the everyday “I just want to set a simple trade lane” case finally fits in one click.
Behind the scenes: design correction on CR-310. The original spec called for transit orders (Rendezvous / Dispatch / Recall) to cost 10 AP. After thinking through how MULEs actually move (they handle their own travel, you just give them orders), the orders are now free comms instructions. The asset moves system-by-system per its own travel rules. Pure command-and-control, no AP tax on the act of telling.
Filed under “next slice”: broader asset chatter (MULE entering warp, picking up cargo, SPAR starting operation, hold full or empty). Right now the comms surface covers extractions, trades, arrivals, transit failures, hazards, and combat. The full lifecycle is the next polish pass.
Mass-truthful warp AP - heavier ships cost more to push through wormholes
May 23 · The warp AP formula now uses real ship mass. Strip your hold, drop your clamped MULEs at the hub, and your next jump costs less. The drive tier you fly determines how much mass you can push through a fold for the same AP.
Big rework on how /ssrefresh calculates your warp cost. The old formula counted slots: each fitted module, each cargo hold, each clamped asset added a fixed AP. A Railgun stashed in inventory cost zero; the same Railgun in a hardpoint cost one. That was an exploit waiting to happen, and a playtest hit it.
New formula has three pieces. Engine base AP is the cost to open the fold: T1 StarDrive pays 3, T2 pays 2, T3 pays 1. Bigger drives spin up faster. Mismatch penalty fires only when your engine tier is wrong for your hull: a T1 dragging a Large hull through a fold pays for the size mismatch; a T3 designed for a Large hull pays nothing. Push-through AP divides your ship’s real loaded mass by the drive’s push capacity (T1 = 300 IHu per AP, T2 = 600, T3 = 1200). A T3 carries four times the mass per push-AP that a T1 does, the “howl” of a big drive.
Real mass means everything that physically rides through the fold: fitted modules (excluding the StarDrive itself, which is the wormhole-opener), cargo in your inventory, clamped autonomous assets (the chassis), AND the cargo inside those clamped assets. A MULE you piggyback with a full hold now costs you more to warp than an empty one. The fitted-vs-inventory exploit is closed: that Railgun contributes the same mass whether it is in a hardpoint or in cargo.
Practical effect: matched-tier rigs (T3 + Large, T2 + Medium, T1 + Base) all land in the 1-3 AP band per warp regardless of size. Mismatched rigs pay extra. Loaded rigs pay extra. Empty light freighters fly cheap. Heavy haulers with full cargo pay real cost. Tier-match your hull to your drive for the no-mass-tax flying.
Asset Operations day - Remote Comms surface + R/X-SPAR engagement
May 22-23 · Two CRs back-to-back unlocked the industrial loop. A button-driven Remote Comms surface for every asset you have deployed, three motion verbs to command them from anywhere, and a fix for the bought-but-idle R-SPAR / X-SPAR problem.
Remote Comms. New surface on the ship console that lists every autonomous asset you have deployed across the galaxy (any MULE, M-SPAR, R-SPAR, X-SPAR, or WISKER not clamped to your ship). Reached from both the Comms sub-menu and the Assets sub-menu (two doors, one room). Per-asset card shows status, location, and seven action buttons: Status, Locate (highlights the asset’s system on the star map with fog-of-war respected), Rendezvous (bring it to your current system), Dispatch (send it to a chosen system you have explored), Set Route, Recall (bring it to your docked hub), Back. The forcing function was a playtester with 29 deployed assets across 3 systems and no way to track or command them without scrolling slash command output.
Universal transit mechanic. Behind the three motion verbs is one primitive: move_asset_to. Writes a transit target on the asset, the turn compiler advances it one jump per turn through the jump-route network, lands it (docked or idle) when it arrives. One-hop trips land same turn. Unreachable paths abort cleanly and idle the asset in place. Dispatch is fog-of-war gated: you can only send an asset to a system you have explored.
R-SPAR / X-SPAR engagement fix. Until today, a bought R-SPAR or X-SPAR sat idle forever: the production phase only worked on assets in operating status, but nothing flipped them from idle to operating. Two ways to fix that now. Manual: new /ssengage slash command plus an Engage button on the Remote Comms card (only visible when the asset is idle and is an R-SPAR or X-SPAR). Automatic: when a MULE delivers cargo to a SPAR’s input hold, the SPAR auto-engages on arrival. Most of the time you never need the manual override; the lore-clean default is “asset starts working once it has feedstock.”
Companion: new Industry tab on the website with a 250-line field manual covering the SPAR + MULE supply chain, asset roles, deploy and engage flows, the three MULE-route patterns, Remote Comms management, X-SPAR blueprints, trader-vs-industrialist strategy, and common gotchas.
Economy rebalance - more room to trade, prices that actually move
May 20 · A wave of economy tuning from live playtest. Doubled the action budget, slashed the price of market intelligence, and gave every system its own local price weather so trade routes have real spread again.
Three things made the trader life better this week.
Action Points doubled. Every captain now gets 100 AP per round (was 50), banking up to 150. A focused trading run no longer runs dry after a dozen jumps - there’s room to actually work a circuit.
Bourse subscriptions got far cheaper. The price-feed subscription used to charge a steep up-front fee that could empty a starter wallet on two systems. Now the entry cost equals the ongoing per-turn cost - a frontier feed is a few dozen Solari a turn, a Core feed a couple hundred. Subscribe to the systems you actually trade, without going broke to do it.
Local price noise. The biggest fix: prices were drifting in lockstep across whole zones, so two systems in the same sector showed nearly identical numbers and there was nothing to arbitrage. Now every system gets its own local price weather - small frontier markets swing hard (one late hauler moves the needle), big Core markets stay steady (deep volume absorbs shocks), and a final layer of market noise lands on every commodity in every system each turn. The result: real, persistent price spread within a zone. There is always a buy-low somewhere and a sell-high somewhere else.
One rhythm change rides along: prices now settle at turn-compile, not the instant you trade. You place your orders during the turn; the market reveals the new prices when the host runs the turn. Pure play-by-mail cadence.
AI Co-Pilot - action tools live (EP-026 Slice 2, FE-084 + FE-085)
May 18 · Your AI client can now DO things in the game, not just see them. Nine action tools (buy, sell, accept jobs, jump, dock, undock, deploy SPARs, recall SPARs, submit your turn) shipped today behind the same gates the Discord buttons enforce.
Slice 2 of the MCP harness is live. Where Slice 1 let your AI read your game state, Slice 2 lets it execute trades, take jobs, navigate, manage docks, deploy and recall autonomous assets, and submit your turn. Every action tool is a thin wrapper over the same service methods the Discord cog handlers use - your AI is not getting a second door into the game; it is calling the front door programmatically.
Hard rule: MCP can never bypass game state. Every action tool runs through the same combat-lock + turn-idle gates as the Discord buttons. If you are mid-combat or your turn is queued for processing, the action gets refused with a clear error code your AI can read. Submit-turn is the one exception that only checks combat-lock (gating it behind turn-idle would defeat the point - submit IS the signal that lets the host advance).
Fog-of-war stays intact: every action tool that accepts a system or asset ID refuses the call if you have not explored that system or do not own that asset. The asset-ownership check returns “not found” instead of “unauthorized” specifically so an AI cannot probe for the existence of other players’ assets.
The Render deployment scaffold (FE-085) shipped alongside - the
public MCP endpoint will go live at
https://mcp.sparsector.com/mcp once the
owner triggers the Render Blueprint apply. After that, your
/ssconnect mint command will display the exact URL +
token pair to paste into your Claude Desktop or ChatGPT MCP config.
Three Codex stop-hook catches today on the jump tool deserve a mention. Each pass exposed the next layer of the same root issue: the first catch fixed the tool calling the wrong service method (the original called a method that only validates the route + rolls encounters without actually moving the ship); the second caught the AP debit and ship-move running on separate database connections (a failure between them would have charged you AP for a jump that did not happen); the third caught the silent zero-row case (a vanished ship row would have committed the AP debit for a no-op move). All three fixed same-morning with regression smokes. The same race exists in the Discord cog Jump button and is tracked for a follow-up cleanup.
Autopilot Resume + ticker only shows what you can trade + turn-start banner
May 18 · Three Bruce-playtest fixes shipped together. Autopilot now has a proper pause-and-resume flow with a clear banner. The trader ticker stops surfacing rows you cannot legally execute. The host’s turn-process command now broadcasts a clean “processing turn N” signal so players know what is happening.
The autopilot flow had two related problems Bruce surfaced during the live 2-player test: clicking Pause stranded you on the in-flight view with no way to get back to normal navigation, and an autopilot that ran out of AP mid-trip silently turned itself off with no UI affordance to recover the armed plan. Both fixed by adding a distinct “paused” ship state. When you pause - or when the autopilot suspends itself because AP ran out - the console embed shows a clear amber banner reading “PAUSED at leg N/M” and you get a Resume Autopilot button alongside the full normal navigation set. You can navigate, trade, fit modules, do anything you normally would while parked, then come back and hit Resume to pick up the plan from wherever it left off. No re-arming required.
The trader ticker (the Economic Computer arbitrage scanner) was showing opportunities the player could not legally execute - rows that required a tier license or sector authorization the player did not hold. The ticker now post-filters by your active licenses on both legs of the trade, so every row you see is one you can actually buy + sell.
When the host runs the turn-process command, the channel now gets a public ”⏳ Host is processing turn N. This usually takes 30-60s.” banner immediately, then the existing ”✅ Turn advanced to N+1” when it completes. Bookended START/DONE so non-host players have a clear signal of where the turn is in the compile cycle.
Behind the scenes: the bot is now self-healing through transient infrastructure hiccups. A new retry-with-backoff loop catches short Postgres connection blips automatically - the bot no longer needs a manual restart to recover from a 30-60-second proxy outage.
Trading actually pays off now - continuous price formula + small UX wins
May 17 · The old price formula had a wide dead-zone that hid every supply and demand signal. Two systems carrying the same commodity showed the same price even when one had a glut and the other a shortage. The fix puts the spread back where it belongs.
The economy had a hidden flaw that made the trader life flat: a wide “normal” band in the supply/demand price function snapped any everyday state to the same multiplier. Population consumption, platform output, your own buys and sells - all the work the turn compiler does to push supply and demand around per system - was being silently smoothed away at the very last step before prices were written.
The new formula is direct: every supply and demand point moves the price. The shock absorber that keeps a single trade from swinging prices wildly is now where it should be - the population-scaled capacity of the destination system. A 100-unit trade in a 5-billion megacity barely nudges the local price; the same trade at a 1,000-population frontier outpost can move it dramatically. That asymmetry was always supposed to be the game’s depth.
Live data after the fix: Water Ice spreads up to 108% across the galaxy. Pig Iron 426%. Standard Ration Pack 214%. Carbon Steel 117%. Trader gameplay is back on its feet.
Two small UX wins shipped alongside: the public game site URL is
now on your private console card (with a new /website slash
command for a one-click Link button), and gray dots on the star map
- the reachable-but-unvisited systems - now show their system numbers in a dimmer font, so warp planning doesn’t require guesswork about which dot is which.
AI Co-Pilot - read tools live (EP-026 Slice 1, FE-082)
May 17 · The first playable slice of the MCP harness shipped. Your AI client can now SEE your game.
Nine read tools are live: ship status, cargo inventory, current
system info (bodies, hubs, platforms), star map (PNG image), Pub
jobs at your location, Trade Floor prices, your autonomous assets,
your mailbox, and current turn state. Every tool returns a stable
{ok, data, error} envelope so your AI can branch on a specific
error code (license_required, cargo_full, not_explored, etc.)
rather than parsing free-text messages.
Fog-of-war stays intact: the read tools that accept a system_id
argument refuse to return data for systems the player hasn’t
explored. The map tool only renders the visible (explored + adjacent)
set - the full-galaxy debug view stays Discord-owner-only. That gate
matches the visibility rules the Discord menus enforce implicitly
just by living in your current-system context.
The token surface for connecting your AI client is already live as
/ssconnect mint (yesterday’s FE-081). The MCP server itself is
running locally during dev; the Render-hosted public endpoint
deploys in FE-085, after which the full Slice 1 (read tools +
preview tools) becomes reachable from any MCP-aware AI from anywhere.
Action tools (buy / sell / jump / dock / submit_turn) come in Slice 2, gated by the same combat-lock + turn-idle rules as the Discord commands. The AI can never bypass game state.
AI Co-Pilot is coming - MCP harness (EP-026 scaffold)
May 16 · Connect your game to Claude Desktop or ChatGPT and let an AI help you trade, plan, and deliver. Direct connection. Bypasses Discord. Same game rules.
The work began this week on a second client surface for the game. Generate a connect token with a Discord command, paste it into Claude Desktop or any MCP-aware AI client, and from then on the AI has direct access to your game state plus a curated set of tools - same actions you take with buttons in Discord, just with a smarter analyst sitting next to you.
The plumbing is going in now: server scaffold, transport, authentication. Update May 17: the first read-only slice (9 tools) is live - see the entry above for what your AI can see today.
The action tools land in a follow-up slice once the read surface has soaked clean. Mutations go through the same combat-lock and turn-idle rules as the Discord commands - the AI can never bypass game state.
Architecture rule baked in: every new feature ships as a service method first, which keeps Discord and the AI client at automatic parity forever.
Behind-the-scenes maintenance day - 8 CRs
May 16 · Quiet day of cleanup and infrastructure: prefix rename, code consolidation, dead webhook removed, test bit-rot cleared.
Several invisible-to-players improvements landed:
- The artifact catalog prefix was renamed
ART→RLC(Relic). Same items, clearer name. All inventory, market prices, ledgers, and 32 image files migrated in lockstep. - The first spaghetti-code consolidation shipped: a small new helper module collapses 9 copy-pasted JSON-parsing sites onto one shared function. Foundation work for bigger consolidations later.
- The dead Chains of Destiny Stripe webhook directory (legacy from before the SPAR Sector reset) was removed. The new game-access payment integration (Stripe, SP-028) will be built fresh when it ships.
- 24 stale failing tests were either fixed (4) or skip-marked with specific reasons (20). The CI signal is now clean - no more noise to scroll past when the next real regression lands.
Sidequests at the Pub - NPC Job Board (CR-263 Slice 1)
May 15 · Tavern-style contracts at every hub. Carry cargo somewhere. Take someone someplace. Two turns to deliver.
Every Pub now posts a small Job Board with a handful of contracts from named NPCs. The shape is deliberately simple: Destination, Mission, Fork, Return. Pick one up, complete it, get paid plus a faction reputation bump.
Slice 1 ships two verbs: Courier (3 flavors × 4 cargo classes = 12 combinations) and Solo Passenger (NPC rides in the cockpit, no slot cost, optional round trip). Courier flavors are pickup (cargo waits on the dock), purchase (client deposits a sourcing budget, you buy at origin and keep any surplus), and package (opaque parcel, contents undisclosed - trader’s honor). Cargo classes follow the existing containment rules: regular, shielded, exotic, data. Higher-class jobs pay better and need the matching hold or bolt-on equipped.
Jobs expire two turns after acceptance, hard. The clock IS the cost - let it run out and your cargo just becomes regular salable stock, your passenger walks off at the next port, the bonus payout is gone. No extra rep hit. Easy come, easy go.
More verbs are queued for Slice 2 (Hunt, Bounty, Salvage, Excavate, Trophy Hunt, Patrol, Escort Convoy, Defense Contract, Evacuation, Distress Response). Live capture of monsters and a rename of the ART material prefix are tracked as separate CRs (264, 265).
Website art batch - bestiary, infographic, personas
May 9–10 · 18 portraits, 71 encounter scenes, a galactic map, 2 character personas. Painted in the gouache space-opera house style.
The bestiary is now a visual reference, not just a stat block. Every monster
has a painted portrait at the top of its card (McQuarrie / Berkey / Foss /
Syd Mead lineage), and each card carries a small carousel of two-to-four
encounter scenes - with a ‹ › to flip between them.
You can finally see what a Plasma Leviathan looks like instead of imagining
it from “vast tentacled jellyfish”.
The home page picked up a top-down infographic of the human-occupied quadrant of the sector - five concentric zones radiating from a bright civilian core out into the dark frontier - sitting just above the “What is it?” section so the gameplay map reads at a glance.
CR-256 also added an “appears ×N–M” pill on cards for monsters that arrive in groups (Pirate Barbarians 2–4, Minar packs 3–5, Alien Warrior squadrons of 3, etc.). Solitary giants like the Plasma Leviathan, Cosmic Slug, and Cosmic Worm stay correctly framed as one-of-a-kind encounters. Hive-type swarm monsters keep their existing “swarm ×N” pill (Spacefarer Beetles ×20, Asteroid Hamsters ×30, etc.). Runtime encounter generator still single-spawns - the multi-spawn loop is the next step in this CR.
Across six moderation-retry passes the model approved 71 of 72 action shots
- 10 of 10 ALIENS-aesthetic ship-interior concepts + both character personas (Cowboy Joe from Mexico, Johnny Mofarlow). Heavy-resolution PNG masters stay locally as future sources; the website ships 2 MB of optimized WebP (down from ~170 MB of raw PNGs).
ArbiBot in flight - per-step autopilot + Console takeover
May 8 · Autopilot now actually flies your route, step by step, with an AP cost per move and a comm-channel drip you can follow.
ArbiBot - the optimal-arbitrage trade planner that shipped in SP-065 - got the in-flight execution it was missing. Plan your circular trade (outbound trade, return trade, holds per run, number of runs), pick Ship or any eligible MULE as the carrier, hit Execute, and the autopilot now ticks WARP → DOCK → TRADE → UNDOCK as four separate steps each round, paying AP per step (warp=2, dock=1, trade=1, undock=1).
Each step posts a sci-fi-flavored comm message to your Quantum Comms mailbox so you can reconstruct the run after the fact. The Console takes over while autopilot is active - slim Pause / Abort / Captain Sheet / Refresh / Wait button set with a “Recent Activity” field showing the last three ticks. No more clicking around a full Console while you’re mid- flight.
If a hop fails (insufficient AP, license missing, supply binding) the autopilot pauses gracefully and waits for your next round so you can adjust. Resume picks up where it left off.
Pairs with CR-243 (MULE carrier-select - same planner View, two- stage flow if you have eligible MULEs in-system, single-stage if you don’t).
Hero refresh + small UX + housekeeping
May 8 · New hero banner; combat dialog completion; three CRs filed for upcoming polish.
The home page hero swapped to hero1.png at 60% transparency with a
reworked dark overlay so the SPAR Sector wordmark and tagline read clearly
against the painting underneath.
CR-250 closed the combat dialog rework: per-action narrative streaming (every weapon hit + counter shot lands as its own embed line with directional icons and damage-band flavor), and a “Return to Console” button that brings the live ship console back as an ephemeral while leaving the combat record in-channel.
CR-251 added Intimidate / Call for Surrender to combat: a proficiency- roll contest with a five-band outcome ladder (critical success captures all targets at HP=1; critical failure dings every faction’s rep and lets the enemy counter at +50% damage). Surfaces only on encounter types where intimidation makes sense (pirate scouts/ambushes, raider fleets, navy patrols).
Three CRs filed for follow-up:
- CR-253 Discord bot OAuth invite link wiring on the website
- CR-254 gpt-image-2 access for ongoing website art needs (this is what shipped the bestiary above)
- CR-255 collapse bid/ask double-prices to a single trading price with up/down direction arrows
BG-162 hotfix - ECONOMY phase regression
May 7 · Live runtime crash fixed: pop-gated exotic consumption now joins through the right schema path.
LiveTest18’s /ssprocess was crashing in ECONOMY phase with
column h.system_id does not exist. Same shape as the BG-088 family
(April 2026): hubs in SPAR Sector attach to bodies, not directly to
systems, so the correct path is always ss_systems → ss_bodies
→ ss_hubs. Two regression sites were found and fixed: the
CR-119 exotic-consumption code and the CR-246 ART-backfill migration.
All other hub joins in the codebase already routed correctly.
BG-161 hotfix - Market Ticker Bourse-path + lore canon expansion
May 4 · Live runtime crash fixed; Mofarlow + TJfM origin canon enters the lore.
Market Ticker was crashing for any player with an active Bourse subscription:
could not determine data type of parameter $2. The Bourse-path query was
declaring an unused parameter that asyncpg couldn’t type-infer. One-line fix
shipped; the legacy explored-systems path was never affected. Players with
Bourse subs can use the Ticker again.
Lore canon picked up two new origin sections. Johnny Mofarlow is now the canonical SPAR designer - self-proclaimed Trader Pioneer Prince, built the first SPARs when Zone 1 and 2 were still frontier, won the patent fight via the Central Judge’s Council Board on pre-Hegemony copyright. Hardware open, blueprints gated. Two centuries later the Free Pirates ran open-source until the Council disbanded organized open-source as a copyright breach; basic profiles now ship with hardware, advanced ones must be begged, borrowed, or stolen. Trader Joe from Mexico is now the canonical MULE designer - a parallel story with a Trader’s Patent through the Syndicate (Syndicate gets a cut, Senate stays out) and a commodity NavComFTLComm onboard AI that has no copyright surface, which is why anyone can build, own, and run a MULE. Trader Joe is a legend; the lot still operates under his name.
Plus a UX fix: ship-fitting console panels now show material names alongside
codes (bridge_fore_bottom · FGN006 · Light Pulse Cannon instead of bare
FGN006) so players can recognize their newly-installed weapon at a glance.
CR-249 filed and shipped same evening: MULE catalog collapsed to T1 only. The legacy 12-variant ladder (T1/T2/T3 × 4 cargo variants) was killed
- 4× docked T3-Exp at 2,000 IHu each = 8,000 IHu in tow, which broke the trader-loop economy. Storefront now sells 4 SKUs (T1-Std/Std+S/Exp/Exp+S with 100/200 IHu cargo). Existing player T2/T3 MULEs are grandfathered.
Same session shipped: BG-156 SSView.refresh → rerender (killed an async-shadow RuntimeWarning that was breaking persistent-view state-sync); CR-244 Bourse Subscription button on every Trade Floor’s docked landing menu (was buried two clicks deep); CR-245 dock-target Select → named buttons (1-click UX vs prior 2-3 clicks); CR-227 storefront polish - Asset Store now surfaces all 12 SPAR variants (3 types × 4 cargo classes) instead of generic single-tier SKUs, so players can buy a Shielded M-SPAR for heavy-isotope mining without needing a separate refit step. The Market Ticker also flipped its ranking from absolute SOL profit to % margin - the right default when wallet binds before hold capacity, which is most of MVP gameplay.
SP-064 - The Bourse v1 (CR-097) + UI dead-end audit + ArbiBot CR family
May 3 · Off-system price visibility ships. Subscribe at any tradefloor; read remotely.
The Bourse - interstellar tradefloor data infrastructure broadcasting market prices over the null-band - is now a live in-game subscription. Dock at a system’s tradefloor, click Bourse Subscription to issue your q-pair decrypkey, then read that system’s prices from anywhere in the sector. The Bourse view (Console → Comms → The Bourse) shows your local tradefloor + each subscribed system side-by-side, filterable by material tier and sub-category.
Subscriptions cost SOL: 5,000 (Frontier/Outer) to 25,000 (Core) initial fee covering 5 turns; renewals every 5 turns at 5% of the initial fee. Insolvency lapses the q-pair (you’ll get a Comms message). One subscription covers every Trade Floor in that system - you don’t need to subscribe per hub.
/ssticker arbitrage scan now respects per-system Bourse scope:
your subscriptions define which systems you can compare. Default: local +
subscribed only.
What’s new on the site
- Commands (commands.astro) -
/sstickerdescription updated to mention Bourse-scope auth;/sseconnotes the dev-hatch status (in-game SOL purchase via Guild Office is filed under CR-236 follow-up);/ssautonav+/ssautonavstopadded to the Extraction & Autonomous Assets group (SP-063 / CR-231 from May 2 - point-to-point autopilot with pause-on-encounter and cross-round resume). - game.md / guide.md Bourse coverage - queued as follow-up CR (this snapshot only refreshed the commands reference).
Under the hood
- SP-064 Bourse v1 - new
ss_market_feed_membershipsschema,FeedMembershipServicewith subscribe / cancel / settle loop,MarketRepository.bulk_get_pricesmatrix fetcher,PriceAnalysisView+FeedMembershipsView+TradefloorBourseSubscribeView. - 5 Codex stop-hook iterations hardening the Bourse: settlement wallet running balance, 5-turn renewal cadence, at-tradefloor-only subscribe, no-dead-end UI rule, /ssticker per-system scope.
- UI no-dead-end rule added to
CLAUDE.md: every player-facing menu MUST flow back viaedit_original_responsewith the View attached. CR-237 audit of the rest of the UI surface in flight. - BG-158 fail-safe -
/ssprocessspinning forever now surfaces a friendly error followup instead of leaving the player on Discord’s spinner indefinitely. - 11 CRs filed for the next gameplay arc: ArbiBot family (CR-240 brain, CR-241 Autopilot execute with narrative comms, CR-242 1 AP per cargo move, CR-243 carrier select Ship vs MULE) plus DeepSeek NPC research (CR-238), cargo-full tow prompt (CR-239), and other quality-of-life CRs.
SP-062 - Website Polish (CR-091 copy update + CR-098 imagery scaffolding)
May 2 · Site copy catches up to the new economy + containment classes.
Pre-launch website pass. Updates the gameplay narrative on the site to reflect the EP-024 IHu rename, the EP-025 four-class containment system, and the SP-060/061 MULE/SPAR variant catalog + asset bolt-ons. Imagery is scaffolded (alt-text + lazy-loading patterns + a screenshot-capture guide for the owner) but actual in-game screenshots are owner-driven since Discord doesn’t expose its rendered messages via API.
What’s new on the site
- Game page (game.md) - new Containment Classes section explains the four cargo classes (regular IHu / shielded sIHu / exotic xIHu / data dIHu) at the player-experience level. The Data Economy section now mentions the free starter BMB (Bridge Memory Bank). The MULEs section describes the 12 MULE + 12 SPAR variant catalog and routing-by-class.
- How-to-Play guide (guide.md) - starter package now correctly describes the free BMB001 + 50-shield-HP loadout. New tips: containment classes are real (Trade Floor refuses with friendly error if slot missing), crystal carve-out (Time/Axion/Phonon Crystals stay regular IHu), Refit menu at Shipyard for asset bolt-ons.
- Screenshot Capture Guide - new
website/SCREENSHOT_CAPTURE_GUIDE.mddocuments the 8 priority screenshots needed for CR-098 imagery polish, with framing notes per shot. Owner runs the live game and captures; AI assists with optimization- Astro page placement.
Deferred
- Actual in-game screenshot capture (owner-side; Discord can’t be screenshotted via API).
- Hero imagery upgrade for
index.astro(filed as CR-228 for owner-driven art generation).
SP-061 - Asset Bolt-on Slots (EP-025 CR-227 follow-up)
May 2 · MULEs and SPARs get xPod + BMB slots, mirroring the ship side.
Closes the last open follow-up CR for EP-025. MULEs and SPARs now carry exotic
- data cargo via fitted bolt-ons, the same way ships do.
What you’ll see in-game
- Asset Refit menu in Shipyard. New “Refit” button alongside Modules / Assets / Upgrades / Licenses. Lists your owned, docked autonomous assets at this hub. Pick an asset, then four buttons appear: Install xPod / Remove xPod / Install BMB / Remove BMB. Install opens a Select with the catalog options (SHX001/002/003 or BMB001/002/003) and confirms with an atomic SOL debit + FK write. Remove refunds 1 unit of the removed module to your inventory.
- Containment routing on MULEs + SPARs is now functional. A regular Std MULE with an xPod fitted accepts exotic routes (e.g., DRK002 dark-matter trace) bound by the xPod’s xIHu capacity, separate from the MULE’s regular cargo. Same for BMB + data routes. Owner can finally route exotic / data cargo through autonomous logistics instead of moving everything by ship.
- SPAR production respects bolt-ons too. A Std M-SPAR with no xPod refuses to mine exotic outputs (drops them). Fit an xPod and the same SPAR happily fills its xPod from active dark-matter bodies. R-SPAR refining + X-SPAR manufacturing same rule via the recipe-output filter.
Behind the scenes
- New
ss_autonomous_assets.exotic_bolton_module_id+data_bolton_module_idFK columns. New composite gateasset_can_accept_material(asset_row, material_class, qty, materials_class_map)is the single point of truth for “can this asset take this cargo class right now”. Wired into MULE routing, SPAR production funnel, SPAR refining/manufacturing recipe filter, and manual ship→asset transfer. - 21 new tests covering schema, helpers, four wire-up sites, and the install/remove UI flow. EP-025 fully closed.
BG-154 - LiveTest16 hotfix: ss_systems.population int32 overflow
May 2 · World-gen crashed at 10% on Sol pop 5-15B; column ALTER’d to BIGINT.
LiveTest16 hit value out of int32 range partway through world-gen. The
ss_systems.population column was declared INTEGER (max ~2.1B int32) back in
SP-021, but the CR-190 Sol calibration anchor sets the (0,0) zone-0 system to
random.uniform(5_000_000_000, 15_000_000_000) - 5-15 billion, which
overflows. Hotfix migration db/ss_sp064_schema.sql ALTERs the column to BIGINT
(int64, ~9.2 quintillion of headroom). Idempotent.
Pre-existing bug since CR-190 shipped 2026-04-27. Earlier playtests hit the
sub-2.1B end of the Sol range by luck; LiveTest16 didn’t. Owner can retry
/ssnewgame now.
SP-060 - Asset Variants + Progression-Economy Retune (EP-025 Phase B + CR-226)
May 2 · MULEs and SPARs get the same containment treatment ships got yesterday. Capital expense climbs.
Closes EP-025 in two sprints over one calendar day. Phase A (SP-059) wired the ship side; this sprint wires the asset side + the paired progression-economy retune.
What you’ll see in-game
- 24 new MULE + SPAR variants in the storefront:
- MULEs - 3 tiers (T1 light / T2 heavy / T3 capital) × 4 cargo variants (Std / Std+S / Exp / Exp+S) = 12 SKUs.
- SPARs - 3 types (M-SPAR mining / R-SPAR refining / X-SPAR manufacturing) × 4 variants single-tier = 12 SKUs.
- Std+S variants hold shielded materials (heavy radioactive isotopes) per B1 mixed-envelope: same envelope volume as Std, doubles for regular cargo too. Pricing roughly 3× the unshielded equivalent at the same capacity.
- Exp variants = double the cargo capacity at roughly 4× the price.
- MULE routing now respects containment class. Try to route Plutonium-239 through a regular Std MULE and the dispatcher rejects it with “Containment mismatch: MULE has regular hold, material ISO018 requires shielded containment.” Buy a Std+S MULE for that route.
- SPAR production also gated. M-SPAR mining a body that yields heavy radioactive isotope into a regular SPAR refuses the output (drops it back into the body’s resource pool). Owner upgrades to a Std+S M-SPAR to mine those bodies.
- Manual ship→asset transfer same gate. Player can’t hand off shielded plutonium from their ship into a regular MULE.
- SHM004 ‘Volatile’ module deprecated. Existing fittings auto-remap to SHM010 Shielded Standard Hold (pure upgrade - existing regular cargo preserved, gain shielded capacity for free).
- Capital expense rises (CR-226 progression retune). T2 MULEs jump from low-five-figure to ~275k SOL. M-SPAR ~225k. R-SPAR ~350k. X-SPAR ~750k. StarDrive T2 ~500k. StarDrive T3 ~2.5M. Target: ~30 turns of dedicated trading to reach a mid-frame loadout.
- Shipyard storefront grouped by class. Module Select now shows category tags ([xPod] / [BMB] / [Shielded] / [Std] / [Weapon] / [Shield] / [Cloak] / [Power] / [Bridge] / [Drive] / [Repair] / [Drone]) so SP-059’s new bolt-ons surface alongside their categorical siblings rather than scattered alphabetically.
Behind the scenes
- New
cargo_classcolumn onss_autonomous_assetswith CHECK enum (regular / exotic / shielded / data). Existing assets stay regular via column default. - Centralized
material_class_fits_asset_classhelper inturn/services.pyis the single point of truth for “can this material’s class ride in this asset’s slot”. Wired into every asset cargo write (MULE auto-routing, SPAR production funnel, manual transfer) so the gate is consistent. - ZERO_SPACE_PREFIXES retired across the runtime - the post-seed classification helper from SP-059 guarantees every data-prefix row carries
containment_class='data'before any market call runs, so the belt-and-braces prefix fallback is gone. - One Codex stop-time review fix shipped same-sprint (SPAR production + manual transfer paths needed the gate too - routing wasn’t the only bypass).
Deferred
- Bolt-on slots on assets (xPod / BMB fitting flow on MULEs / SPARs analogous to ship side) - needs schema columns + UI flow. Until shipped, exotic + data routes through MULEs are rejected at every gate; players move that cargo via ship only. Filed as CR-227 for a follow-up sprint.
SP-059 - Containment Hold Classes (EP-025 Phase A)
May 2 · Four cargo classes, three slot types, one starter ship that can finally haul data for free.
The big architectural lift. Cargo no longer comes in just one flavor - it’s now four distinct classes with their own holds. Phase A ships the ship-side foundation; the MULE/SPAR variant catalog lands in SP-060.
What you’ll see in-game
- Four cargo classes, four hold types:
- Regular IHu - standard goods. Same as before, in your normal cargo holds.
- xIHu (Exotic) - plasmas, antimatter, dark-matter trace, phased materials. Need an xPod bolt-on (SHX001/002/003 at 5/15/50 xIHu) installed in the new exotic_bolton slot.
- sIHu (Shielded) - heavy radioactives (Cobalt-60+, Strontium-90+, Uranium, Plutonium, Americium, Californium, Thorium-232). Need a Shielded hold variant (SHM010/011 at 100/200 IHu) swapped into a regular cargo hold slot. Shielded holds are mixed-envelope - you can carry regular AND shielded cargo in the same hold (each sIHu sits in a shielded sub-block; regular cargo fills the rest).
- dIHu (Data) - digital goods (DAT/RDX/MDL/BPT/INT). Need a Bridge Memory Bank bolt-on (BMB001/002/003 at 50/250/1500 dIHu) in the new data_bolton slot. Every starter ship now ships with a free BMB001 - 50 dIHu of digital cargo room from day one.
- Crystal carve-out. Structurally stable solids stay regular IHu even within EXO/DRK/SCI prefixes - Time Crystal, Axion Crystal, Phonon Crystal, Photonic Crystal, Spin Ice, Zero-Point Crystal, Stellarite, Plasma Crystal, Warp Crystal, Raw Dilithium, Aetherium Fragment, Super-Conducting Lattice, Metamaterial Substrate, Majorana Composite, Weyl Semimetal, Topological Insulator Shard, Negative Index Material. Only active-state matter needs xPod containment.
- Light isotopes stay regular as starship fuel. Only ISO012-020 heavy radioactives need shielded hold.
- Friendly errors when you try to buy without the right slot installed: “Exotic containment required - install an xPod (SHX001/002/003) at the Shipyard before buying [material].”
Lore
- xPod: a high-density EM field grid - each xIHu of cargo sits in its own individually-trapped EM field cell within the pod. The grid is the containment.
- Shielded hold: regular hold envelope with shielded sub-blocks for radioactive cargo. Volatile cargo (radioactive + explosive) is hazardous to the warp bubble during transit - the lead/magnetic shielding is what makes the hold safe.
- Bridge Memory Bank: digital storage. Big non-volatile RAM (NVRAM) optimized for active read/write - the same underlying tech as today’s memory, persistent across power cycles. Not a physical cargo hold - can’t store atoms.
Behind the scenes
- New
ss_materials.containment_classcolumn with CHECK enum (regular/exotic/shielded/data) + per-row backfill. Migrationdb/ss_sp061_schema.sqlseeds the 8 new module catalog rows + classifies ~36 exotic IDs, 8 heavy radioactive ISOs, all data prefixes. - Centralized
cargo_intake_capacity_txhelper is the single point of truth for “how many units can this ship take of this material” - used by every code path that adds to ship inventory. - Four Codex stop-time review fixes shipped same-sprint, all bugs caught + closed before snapshot.
What’s deferred to SP-060
- 12 MULE + 12 SPAR catalog variants (3 tiers x 4 cargo variants for MULEs, 3 types x 4 for SPARs).
- MULE routing class checks.
- SHM004 ‘Volatile’ module deprecation (superseded by SHM010 Shielded Standard).
- Storefront UI grouping for hold variants and bolt-on options.
SP-058 - IHu Rename + Tiered Market Calibration (EP-024)
May 2 · MT → IHu, and small-port markets finally feel small.
Two changes that pair: rename the cargo unit so it tells the right story, and recalibrate the per-system price-impact curve so a single-ship trade actually moves an outpost’s gauge without overwhelming a megacity hub.
What you’ll see in-game
- Cargo is measured in IHu (Interstellar Hold Units, lowercase ‘u’) everywhere. UI labels, trade dialogs, asset specs, console gauges - all flipped from MT (metric tons). Numbers are unchanged; only the label.
- Trade impact is now tier-aware. The per-system supply gauge swings per trade are calibrated to a 1,000-IHu baseline (loaded mid-frame ship + 4 MULEs). At an outpost (pop 1K-10K) that swings the gauge ~13 points; at a megacity (pop 10M+) it swings ~1.3. Same trade, very different market response.
- Five population tiers: outpost (7,500 IHu capacity) / frontier (15,000) / mid (30,000) / major (50,000) / megacity (75,000). Sized so a starter 100-IHu trade is intentionally low-impact at every tier.
Behind the scenes
- New
core/economy_model.py::CAPACITY_BY_POP_TIERdict +pop_tier(pop)helper. Samegauge_delta_for_tradesignature, same per-trade ±15 clamp from SP-030. - CLAUDE.md fully renamed; design docs that already shipped got supersession header notes (their inline references stay as historical analysis context).
- New top-level rule: cargo IHu vs engineering MT - do not mix.
SP-057 - Tow + Surrender
Apr 30 · Drag the wrecks home, or eject when the fight is lost.
Closes the combat-consequences arc. Two mechanics shipped same-session as design call.
What you’ll see in-game
- Tow a wreck instead of scooping it. The salvage menu now has a Tow selected button alongside Scoop selected. Tow drags the wreck (intact contents) for delivery to a PLT-SV salvage yard, where the hull-armor scrap converts to 50 SOL per HU in your ship wallet plus any non-scrap cargo lands in your inventory. Warp AP doubles while towing - pick your route. One wreck at a time per ship; the next tow has to wait.
- Surrender as a guaranteed exit. The combat encounter dialog now has a red Surrender button on row 2 alongside Retreat / Cloak / Shields Up. Click it, lose your ship + ship wallet, but respawn instantly in a fresh starter hull docked at the nearest Starbase via auto-warp escape pod. The ISP Bank account survives - that’s the safe tier. Withdraw to fit out the new hull.
- Deliver Wreck Tow button at PLT-SV docks. When you’re docked at a hub with a PLT-SV salvage yard AND have a wreck in tow, a hammer-and-wrench button appears on the welcome menu. Click to drop the wreck for the SOL refund + cargo transfer. The wreck flips to recovered; the tow detaches.
Behind the scenes
- New schema migration
db/ss_sp059_schema.sqladdsss_ships.towed_wreck_id+ partial unique index. compute_warp_ap×2 multiplier extended to wreck-tow gate; combines via OR with the SP-052 capture-tow gate (single doubling for any in-tow burden).- New
find_nearest_starbaseBFS helper throughss_jump_routes; max-depth-30 ceiling against degenerate graphs. Honors theis_bidirectionalroute flag so reverse-direction edges aren’t invisible to surrender’s escape-pod path. - Tow delivery preserves cargo-overflow remainder in the wreck instead of silently deleting it - if your hold can’t fit everything, the rest stays floating at the hub for a follow-up
/sslootafter undocking. - 41 new tests; 277/277 scoped bundle sweep green.
SP-056 - Combat Loot Trio
Apr 29 · Killing things drops things you can sell.
Three combat-loot mechanics shipped in one sprint. The fight-then-trade loop is now closed: kill a monster, the loot lands in your hold; destroy a ship, scoop the wreck and sell the scrap.
What you’ll see in-game
- Monster kills drop materials. Every species in the bestiary now has a real loot table backed by
data/monsters/monsters.json. Kill a Minar, get one of PSB008 / ELM006 / PLZ001 in your hold (3-10 units). Kill a Plasma Leviathan, get a richer haul. The drop lands in cargo automatically if you have room; otherwise it spawns as floating salvage you can scoop with/ssloot. - Ship wrecks carry damage-band scrap. The classification keys on how much hull the ship had at the killing-blow moment. Three bands actually appear on wrecks today: catastrophic (the ship was already a near-wreck; finishing blow leaves a rubble field - peak scrap), heavy (mid-HP destroy - moderate scrap), and vaporized (the ship was healthy and got one-shot; the big damage atomized it - low scrap). Two more bands (disabled and intact) are reserved in the schema for ship-survives outcomes and route to the captured-vessels table instead. Wrecks now carry SHA001 hull-armor scrap on top of any cargo the fleet was hauling.
/sslootreworked into a proper menu. Replaces the old one-shot bulk scoop. Pick a wreck from the dropdown, hit Scoop selected, or use Scoop all to rake in everything subject to cargo space. The scoop respects your hold capacity per item and leaves the unscooped remainder in the wreck for next time. Zero-space data goods (DAT/RDX/MDL/BPT/INT) always fit. The menu re-validates turn-idle, in-system, undocked, and same-system invariants on every click and inside every loop iteration of bulk scoop - if you warp away while the menu is open, the wreck list updates to your new system.
Filed for the future
- CR-224 - ship tow mechanics.
ss_ships.towed_wreck_id+ ×2 AP penalty when towing + PLT-SV (Salvage Yard) delivery flow + tow attach/detach UI. Design-resolved, awaiting plan. - CR-225 - player surrender mechanic. New surrender button on the combat dialog - ship and ship wallet lost; player respawns via escape pod auto-warped to the nearest Starbase. ISP Bank account survives (the safe tier). Design-resolved, awaiting plan.
- CR-222 - Outer/Frontier wilderness % retune. LiveTest15 R1-2 playtest signal: hard to find tradeable systems in Outer/Frontier zones. Design-blocked on owner axis call (probability range vs dead-end bias vs catalog scope vs discoverability).
Behind the scenes
- New pure-function module
src/ss_bot/combat/loot.py(hp_band_from_pct,scrap_yield_for_band,monster_loot_roll). - New UI module
src/ss_bot/ui/loot_view.py(LootView+scoop_wreck_into_inventoryservice). - Schema migration
db/ss_sp057_schema.sqladdsss_wrecks.damage_band TEXT. - 68 new tests; 188/188 scoped bundle sweep green.
CR-205 → CR-208 - Economy Round
Apr 26-27 · Owner directive: “There should be NO pull to equalize - NPC turns also a factor.”
Closed the structural in-flight economy round in four moves. The price formula
price = base_price × supply_mod × demand_mod now has both halves
moving at compile time, system populations drive both ends, and there is no longer
any primitive equalizer underneath the layered movers.
- CR-205 - Removed
regenerate_stockpull-toward-100 from the ECONOMY phase and the automation tick. The complex layered calcs (Layer-1 baseline + pop-gated exotic consumption + platform buys/sells + NPC trade convoys + Layer-3 player trades) are the only forces that touch supply/demand at compile time now. - CR-206 - Urban-scaling local-supply U-shape for basket goods.
basket_local_supply_scalar(pop)cancels 10% of basket consumption at outpost scale and ~100% at megacity scale. Mirrors real-world central-place theory: a Toronto-equivalent has saturating mom-and-pop providers; a frontier outpost imports almost everything. - CR-209 - Platform-loop
pop_factorrescaled from linearpop / 1000to log-relative-to-1M-anchor. Range 0.5 (1K outpost) → 1.0 (1M anchor) → 1.67 (10B max). Platformqtyvalues in the profile catalog actually carry weight across system sizes now - legacy linear scaling saturated the ±50 supply clamp at almost any non-frontier population. - CR-208 - Demand-side mover.
baseline_demand_for_material(category, pop, wealth)pulls demand UP for basket categories scaled by population × wealth. Tuning constants chosen gentler than supply-side counterparts so the two halves don’t compound runaway. Closes the economy round.
Plus a perf cut: CR-211 batched ECONOMY-phase per-row UPDATEs into chunked
UPDATE FROM UNNEST writes against ss_market_prices - apply_baseline_flows
went from ~80K to ~40 round-trips per turn; tick_market went from ~163K
to ~1000. Math semantics unchanged; just the SQL execution path.
Plus a brick: BG-146 - list_stale_locks SQL had
$2 - $3 with untyped params; asyncpg’s prepare step crashed with
operator is not unique: unknown - unknown. Bricked every /ssprocess.
Fixed by computing the threshold in Python and passing one INTEGER param.
SP-046 → SP-051 - Marathon Day
Apr 25 · Six sprints in one calendar day. Combat got consequences, Captains got reputation, your ship got Repair Microbots.
Path A through D landed back-to-back: concurrency hardening, Captain progression, combat consequences, a debug test harness, a UX dock fix, and a brand-new Repair Microbots system. This entry collapses to what changed for players.
New player-facing systems
- Repair Microbots - three new module tiers (FGE020 / FGE021 / FGE022) install on bridge or stardrive hardpoints. Each install carries a finite charge pool (5 / 8 / 12 charges by tier, healing 10 / 25 / 60 hull HP per charge). Click Repair on the ship console between fights to consume one charge and patch your hull (
+N HP, now X/Y = Z%). Out of charges? Visit a Shipyard and click Refill Microbots - tops up every installed module to max in tier order. - Captain progression sheet - new
/sscaptaincommand shows your in-game reputation across seven axes (combat record, diplomat, bribery, blackmail, outlaw, trader honor, bounty status) and a panel of lifetime badges that persist across every game you play on this server. Earned badges award at/ssendgame. - Covert Hail + Threaten - on Navy patrol encounters, the Hail menu now offers a Covert option. 80% chance the conversation gets recorded; future encounters with the same Navy faction in the same system surface a Threaten with recording option (50% comply / 30% panic with -30% enemy damage / 20% call-bluff that escalates the fight and pushes you toward outlaw).
- Wreck creation + scavenge - destroying or disabling enemy ships now leaves wrecks in the system. The first cut of
/sslootscavenged every wreck in one shot. Reworked in SP-056 (Apr 29) - see the SP-056 entry above for the full button-driven LootView with damage-band scrap and creature loot from the bestiary. - DOCK button gray-out - in wilderness or facility-less systems the Dock button now renders gray with a “Dock (no facility)” label instead of erroring on click.
Behind the scenes
- Concurrency hardening (EP-022) - turn compiler now holds an advisory lock for its full seven-phase run, asyncpg pool sized 10/50, world-gen runs as a background task so
/ssnewgamereturns immediately, and/ssattack+/ssendgameclose are wrapped in atomic transactions. None of this is visible to you when it works; all of it is necessary for the public launch. - Six new SQL migrations seeded automatically on bot startup. New
src/ss_bot/captain/domain (8 files) andsrc/ss_bot/ship/repair_microbots.pyservice. - 252/252 scoped tests green at sprint close.
Already filed for the future
- CR-185 - pre-launch gate on the host-only test harness command. Will be re-gated to owner-only or removed before public launch.
- CR-186 - post-MVP epic for per-subsystem damage tracking, focused repair (engines / power plant / life support), and the damage-graphic UI overlay. Owner-approved deferral after agreeing the MVP single-pool hull HP model is the right shipping shape.
SP-045 - Combat Encounter View
Apr 25 · Combat became a button-driven dialog instead of slash commands.
Jump into a hostile system, the encounter dialog opens automatically - narrative text, threat list, and a grid of action buttons. Auto-Target focus-fires weapons one target at a time until each enemy is destroyed; Auto-Target Dispersal spreads weapons round-robin and overlaps when you have more weapons than targets. Retreat, Cloak, Shields Up, and (encounter-conditional) Hail / Bribe round out the action set.
- New
CombatEncounterViewPycord UI, owner-verified, with the two reserved auto-target buttons and a Select fallback when more than five enemies are active in the same encounter. - New
ss_combat_engagements+ss_combat_targetstables. Combat state persists round-by-round so/ssrefreshalways returns you to the live dialog if Discord scrolls the message away. - Encounter dialogs rewritten with rich narrative text per type (pirate scout, pirate ambush, raider fleet, navy patrol, alien contact, monster).
- Standing rule established: SPAR Sector is button-driven, not slash-command- driven. New player-facing flows default to Views + Buttons. Existing slash commands remain as underlying handlers and admin tools.
- Concurrency hardening epic (EP-022) opened in parallel - seven CRs covering pool sizing, FOR UPDATE audit, turn-compiler advisory locks, custom_id namespacing audit, world-gen as a background task, ship-fittings optimistic concurrency, and per-game RNG. Public-launch blockers, not playtest blockers.
SP-037 - Salvage Plumbing (EP-020 close)
Apr 20 · All six EP-020 slices shipped in two calendar days.
Schema + profile plumbing for the salvage loop. The combat wreck-creation hook and
/ssloot UI follow when combat generates meaningful wreckage (CR-131).
- New
ss_wreckstable (ten columns, two partial indexes) andss_ships.tow_capacitycolumn. - PLT-SV Salvage Yard profile - buys hull / module scrap, sells refined ingots.
- Owner lifted the combat-maturity gate to close EP-020 MVP on schedule.
SP-036 - Data Economy Runtime
Apr 20 · Data becomes tradeable. Zero-mass cargo enforced.
Twenty-six new data-family rows across RDX / MDL / BPT / INT prefixes. Research labs and data archives now produce tradeable output.
- Zero-space rule - non-physical data goods skip cargo accounting on both player trades and MULE automation.
- PLT-SL research lab now sells alien telemetry, astronavigation models, and exotic containment blueprints.
- PLT-DA data archive consumes four raw-dataset categories and produces population, pricing, and ecosystem models plus faction and black-market intel.
- Alien artifacts (ART) stay physical despite the shared tier - audit caught it before the ingot hit the hold.
SP-035 - Per-System Trade Floor Catalog Scoping
Apr 20 · The feature players actually notice.
Each hub now trades only materials relevant to its pop tier, economy specialty, platform composition, body composition, and zone. Restores the four-phase progression arc.
- New
core/catalog_scope.pypure function - five composition rules (consumer basket, specialty prefixes, platform buys/sells, body raws, zone bonus). - Wilderness systems (CR-079) - roughly 40% of Zone 3-4 have no hubs, no Trade Floor, pop zero. M-SPARs still mine. Pirates still hunt.
ss_market_pricesrow count drops roughly an order of magnitude per world-gen.
SP-034 - Platform IPO Slice 3 (Hubs + Data Prefixes)
Apr 19 · Third slice of EP-020 shipped same session as Slices 1 + 2.
Four new hub profiles land; PLT-CO absorbed into PLT-IP via population gate.
- PLT-IP inhabited planet, PLT-DA data archive, PLT-SP starport, PLT-MP mining platform.
- Four new catalog prefix stubs seeded: RDX / MDL / BPT / INT.
- Cursor external audit caught one P1 + four P2 + one P3; all closed same session.
SP-033 - Platform IPO Slice 2 (Tier-2 Manufacturing)
Apr 19 · Four new tier-2 manufacturer profiles.
- PLT-PM propulsion + power, PLT-EF electronics fab, PLT-PH pharma compounder, PLT-MV multi-vector flex-cell.
- Legacy PLT-FG renamed to PLT-MV across schema, code, and world-gen (942 rows migrated).
- Profile count 11 → 16; platform roster 17 → 21.
SP-032 - Platform IPO Slice 1 (IPO Foundations)
Apr 19 · EP-020 kickoff - five new tier-1 refining profiles.
- PLT-SF smelter/foundry, PLT-IS isotope separator, PLT-NF nano-fab, PLT-GP gas purifier, PLT-CG crystal growth.
- Pop-gated exotic consumption wired (the “LHC-locally” pattern - core metros ambient-consume EXO / PLZ / DRK / SCI).
ss_materials.base_pricecolumn added to stabilize price elasticity.
SP-031 - Economy Layer-1 Baseline Flows
Apr 18 · Population drives baseline consumption and production.
- Consumer-basket categories consume from population; economy specialties produce.
- Population retune (Option B): 500M core, 10M inner, 200K mid, 20K outer, 5K frontier.
- Codex review #19 caught two hotfixes same session.
SP-030 - Economy Drift Removal + Capacity Scaling
Apr 17 · Layer-3 capacity-scaled trade impact.
- New
core/economy_model.py- capacity curve +gauge_delta_for_trade(). - Drift-to-equilibrium removed from
tick_market: supply / demand only moves when actors act. - The same trade moves the gauge less on a megacity than on a frontier settlement.
SP-029 - Fly.io Pivot + MULE Cargo Unification
Apr 14-15 · Bot pivoted from Render to Fly.io; MULE holds unified with ship cargo.
Cloudflare 429s on Render’s shared IP pool forced a pivot to Fly.io (Chicago, close to the Ohio Postgres). Owner ran the first live game; 22-minute world-gen surfaced BG-084.
/ssbuyand/sssellnow route through ship + docked MULE holds as one unified cargo pool.- Jumps cascade
system_idto all docked assets (no more orphaned MULEs). - First live trades, first live bugs, first live fixes.
SP-028 - Website + Render Deploy
Apr 12 · This site, in its first incarnation.
Six Astro pages (home, game, how-to-play, commands, bestiary, changelog). Dark
sci-fi theme with zone-colored accents. Eighteen-monster bestiary cards built from
the same data/monsters/monsters.json the runtime seeds from.
- Render static-site deploy for
spar-sector-website. DEPLOYMENT.mdguide covering both bot and website targets.
SP-027 - Economic Computer + Market Ticker
Apr 12 · MVP Phase B kickoff.
Shipped the Economic Computer as a subscription-gated intel tool. The new
MarketTickerService uses CTEs and LATERAL joins to scan every explored
trade floor and surface the top cross-system arbitrage opportunities in constant time.
- New
/sstickerslash command, paginated to 12 rows to stay under Discord embed field limits. /ssecondev helper for grant/revoke/status.ss_player_sheets.econ_computer_activeandexpires_atcolumns added.- Self-review caught the 20-row embed overflow; fixed before release.
SP-026 - Combat Expansion
Apr 12 · Cloaking, monsters, and PvP.
Pulled encounter combat out of the sandbox and into the real game.
- Cloaking for ships, SPARs, and MULEs (CR-063). Cloaked assets reduce encounter chance and sidestep PvP targeting.
- 18 space monster bestiary (CR-070) - full schema, JSON catalog, seeder, and per-hop encounter integration. From Sublight Pilgrim to Plasma Leviathan.
/sspvpplayer-vs-player combat (CR-071) with cloak, dock, and sector checks; AP cost raised from 3 to 10 after live test spam.- Codex review #16 caught four real issues on retry after a sandbox hiccup.
SP-025 - Ship Frames + Power Budget
Apr 12 · Fitting becomes a real decision.
- Schema adds
frame_class, five slot-type columns,power_generated, andshielded_holds. - Four frame definitions in
ship/frames.py: light_trader, heavy_hauler, exotic_carrier, combat_frigate. - New
PowerBudgetServiceenforces fit legality at the shipyard. - Exotic containment and shielded hold modules for non-standard cargo.
- Ship Fitting button wired into the persistent console.
SP-024 - Persistent Buttons Foundation
Apr 12 · MVP Phase A opens.
The persistent UI layer that makes Discord views survive bot restarts.
CustomIDRouterand a globalon_interactionlistener.PersistentConsoleViewwith stablecustom_id./consolenow posts a landing card that ephemeral-responds on refresh.- Codex #14 fixed a privacy leak and a disappearing-button bug via the ephemeral response pattern.
SP-023 - Player Automation UX
Apr 11 · Set it and forget it.
- Ship autopilot with
autopilot_configJSONB and/ssautopilot(CR-016). Autopilot disables automatically on AP exhaustion. - SPAR configuration screen - Connect to SPAR, stop/resume controls (CR-020).
- MULE console builder - three-step modal wizard for new routes (CR-051).
- Codex #13 fixed Back nav for SPAR and MULE sub-views.
The project ships fast: 27 sprints in under two weeks, thirteen Codex review cycles, and an ever-growing list of bugs filed, fixed, and forgotten.