How to use it

Three steps to a route worth flying.

1 Turn web access on. Routes are worked out elsewhere.

Turn on web access in the Route planning settings.

The row shows on; with web access off route planning does nothing.

Route planning Let D47 search the web on Which sites named on the Privacy page The plotter is somebody else's service. Off, this page does nothing.

2 Ask for the kind of route you want.

Say "plot a neutron route to Colonia", or ask for a Road to Riches loop or a trade run.

D47 plans the route for the ship you are in and reads you the stops.

plot a neutron route to Colonia Ask "find me a Road to Riches loop" — "a trade run for 200 tonnes" Say the range and the hold and it solves for the ship you are in.

3 Accept it, and it becomes a checklist.

Accept the route.

It becomes a checklist with one line per stop, ticked as you fly them.

Checklist 1. Jump to Jackson's Lighthouse neutron 2. Jump to Skaudai CH-B d14-34 One line per stop, ticked as you fly them.

! The one that stops people.

Ask again after you change ships.

The route is replanned for the new jump range.

A route is planned for the ship you are in now. Swap to something with a different jump range and it is the wrong route. Ask again.
Why it works this way

A neutron route, a Road to Riches loop, or a trade run that does not have to empty the hold.

1 Plotting is not searching. It is a job.

A SEARCH a request and a reply waits 15 seconds A PLOT submitted, queued, waited on waits 90 seconds A TRADE ROUTE not a plot at all — the arithmetic happens here A Commander who asks for a route across the galaxy has knowingly asked for arithmetic. Past ninety seconds it says so, and says what to change: a shorter route, fewer hops, a smaller radius.

2 Your ship fills in its own numbers. You are not your ship.

READ FROM THE JOURNAL jump range · origin · cargo capacity all properties of the hull ASKED FOR, EVERY TIME your credit balance even though it is in the journal The route means nothing without the hold. What you are worth is nobody’s business. It is the one figure here that is about you rather than about your ship.

3 The hold does not have to be emptied.

Abraham Lincoln in Sol buy 384 × Gold at 9,400 Diaz Chemical Holdings in RR Caeli — 20.9 ly keep 384 × Gold — this station only pays 11,200 A keep line always says what declining to sell here is worth. A Commander not told why they are flying past a buyer will sell there — and then the plan stops being the plan.

This is the thing no other planner does. Every planner assumes a leg sells everything, and that is not always the best move: holding a commodity past a station that pays poorly, to a later one that pays well, can beat taking the money now.

4 Efficiency is backwards from how it sounds.

10 156 jumps 25 157 jumps 60 168 jumps the default 100 no route at all Lower lets it wander further, find more neutron stars, and finish in fewer jumps. So Directive 47 clamps the parameter to 99. At 100 the service accepts the job and then fails to route, which reads as “there is no way to get there”.

The details

Plot a neutron route, a Road to Riches loop, or a trade run.

This page describes a route. It drives nothing. What comes back is the route itself — the jumps, the waypoints, where to supercharge — read out to you. Nothing here touches the galaxy map. If what you want is the course actually set in the game, that is navigation, which opens the map and plots it.

Say “neutron” when you want this one. The neutron plot is the thing this page has that the galaxy map has not: a route that routes you through jet cones and supercharges on the way, which the map will not work out for you. “Plot neutron jumps to my carrier” describes that route. Every other way of asking — “set course for my carrier”, “plot a course to my carrier”, and plain “route to my carrier” — plots in the map instead, because that is what a Commander means by it.

“plot me a route to Colonia” “plan a road to riches loop” “find me a trade route with fifty million”

This asks spansh.co.uk, the same service the galaxy search uses, and it shares that one setting. Turn on Look things up in the galaxy and plotting works; leave it off and you get “route planning is switched off”, which is a capability that is off rather than an error.

Plotting is not searching

A search is a request and a reply. A plot is a job: it is submitted, queued, and waited on. Measured on 2026-08-14, a Sol-to-Colonia neutron route came back in about three seconds and a Road to Riches loop on the first poll.

So the wait here is longer than a search gets — ninety seconds, against fifteen. A Commander who asks for a route across the galaxy has knowingly asked for arithmetic. Past that, the answer says so and says what to change: a shorter route, fewer hops, a smaller radius.

The trade route is the exception, and it is not a plot at all. It asks for markets and then does the arithmetic here, which is what lets it hold cargo past a station and come home again — see plot_trade_route below.

Your ship fills in its own numbers

Nobody says “plot me a route to Colonia from Sol at 52.31 light years a jump”. Jump range, origin and cargo capacity come from the journal.

Your credit balance does not. It is in the journal, and it is the one figure here that is about you rather than about your ship — so a trade route asks for the number instead of reading it. Cargo capacity is a property of the hull and the route means nothing without it; what you are worth is nobody’s business but yours.

What comes back

A Sol-to-Colonia plot is 131 waypoints and 168 jumps. Reading that out is not an answer, so the totals come first and the next handful of waypoints follow — which is how the route is flown anyway. You plot the next waypoint when you reach this one.

That cap belongs to speech, not to the plan. The whole route is kept, and the Navigation tab in the window draws all of it — see the panel. The same tab plots without speaking, and a route plotted by voice appears there the moment it is worked out, because both paths write and read one plan rather than each keeping their own.

Sol to Colonia: 22,000 light years, 168 jumps across 131 waypoints.

The first 5:
  PSR J1752-2806 — 10 jumps, 371 ly; neutron, supercharge here; 21,629 ly left
  Nova Aquila No 3 — 6 jumps, 279 ly; neutron, supercharge here; 21,350 ly left
  ...

126 more after that. Ask again from further along and I will plot the rest.

The neutron flag is the only line that changes what you do on arrival, so it is on the waypoint rather than in a preamble.

Trade stops carry when the market was last reported, for the same reason outfitting stock does. A route can be arithmetically perfect against a four-year-old price and worth nothing at all.

plot_next_stop

Plots the next stop on a stored plan — the Neutron Plotter’s waypoints, a Road to Riches loop’s stops, a trade run’s stops, an exobiology route’s systems, or an outfitting route’s stations — through the galaxy map, the same way plot_course does. “Plot next neutron jump”, “plot next riches stop”, “plot next trade stop” and “plot next exobiology stop” reach this with no model involved, through the keyword router.

{"type":"object","properties":{"kind":{"type":"string","description":"Which stored plan to plot the next stop from.","enum":["neutron","riches","trade","exobiology","outfitting"]}},"required":["kind"],"additionalProperties":false}

The next stop is the first one after the furthest reached (kept by the plan, see navigation) whose system is not the one the Commander is standing in — so a trade plan’s first stop, the station it was plotted from, is never plotted back to. Where nothing has been reached, the search starts at the first stop.

The answer says where the stop sits on the plan, “stop 2 of 21”, and a trade stop’s answer also names the station:

Course plotted to PSR J1752-2806. Stop 2 of 21.

Asking for a kind with nothing stored says so rather than plotting anything, and so does asking past the last stop. Only an arrival moves the reached stop forward — asking for the next one again before then plots the same system again.

The Galaxy map page

The Navigation tab’s Galaxy map is d47’s own drawing, not Elite’s galaxy map. It draws the 42 regions, every system you have arrived in, the route Elite plotted and where you are, top-down, from journals already on this machine. Nothing is fetched.

  • GALAXY, HERE and ROUTE frame the view: the whole galaxy, 400 ly around you, or the plotted route. HERE needs your position and ROUTE a route with two positioned stops; without them the button is greyed.
  • + and − zoom in steps from 100 ly to 102,400 ly across, and the four arrows move a quarter of the view.
  • The four corner tiles of the arrow pad turn the map 15° anticlockwise or clockwise and tilt it 15° down or up, from top-down (0°) to edge-on (90°). The middle tile, Top down, sets the turn and tilt back to 0. A tile that would not move the view is greyed. The map shows “heading … · tilt …” while it is turned or tilted, and at 90° it marks the galactic plane with a line. GALAXY, HERE and ROUTE keep the turn and tilt.
  • On the desktop the mouse wheel zooms, a left drag turns and tilts the map, and a right or middle drag pans it. A left click without a drag selects a system. None of this works on the headset.
  • On the desktop the map has keyboard focus when the page opens and when you click it. The arrow keys pan a quarter of the view, + and − zoom a step, [ and ] turn it, Page Up and Page Down tilt it, and Home is Top down.
  • 30 DAYS, 1 YEAR and ALL choose how far back the travels go, and the line under the map counts the jumps and systems in that range.
  • TRAVELS, ROUTE and REGIONS switch each layer off and on.

Region names are drawn at 6,400 ly across and wider. The route’s stops, the destination’s name and your system’s name are drawn at 6,400 ly and closer.

Mining routes

There are none, and that is a measurement rather than an omission: api/mining/route is a 404. The service has no mining route planner.

What it does have is the ring index, and that is find_body on the galaxy search — a hotspot material, how many overlap, the ring’s composition and how rich its reserves are. Naming a mining-route tool here that silently ran a body search would be a worse answer than not having one.

Tools

plot_route

A route between two systems that detours through neutron stars where they help — the Neutron Plotter card on the Navigation tab, and a page of its own.

{"type":"object","properties":{"efficiency":{"type":"integer","description":"How strictly to hold to the direct line, 1 to 99. Lower finds more neutron stars and so fewer jumps, at the cost of flying further off course. Defaults to 60."},"from":{"type":"string","description":"Where to plot from. Defaults to where the Commander is now."},"jump_range":{"type":"number","description":"The ship\u0027s jump range in light years. Defaults to this ship\u0027s, from the journal. Must be over 10."},"to":{"type":"string","description":"The destination system."}},"required":["to"],"additionalProperties":false}

Efficiency is backwards from how it sounds. It is how strictly the plotter holds to the direct line, so a lower number lets it wander further, find more neutron stars, and finish in fewer jumps. Measured Sol to Colonia at a 50 ly range on 2026-08-14:

Efficiency Jumps
10 156
25 157
60 (the default) 168
100 no route found at all

That last row is why d47 clamps the parameter to 99. At 100 the service accepts the job and then fails to route, which reads to a Commander as “there is no way to get there”.

A jump range of 10 light years or less is refused here rather than there. The service answers range must be greater than 10 LY, which is a sentence about a parameter; d47 says the ship is too short-ranged for the plotter, which is a sentence about the ship.

plot_exploration_route

A Road to Riches loop — nearby systems holding bodies worth scanning and mapping, ordered so the trip is short and the payout is high.

{"type":"object","properties":{"from":{"type":"string","description":"Where to start. Defaults to where the Commander is now."},"jump_range":{"type":"number","description":"The ship\u0027s jump range in light years. Defaults to this ship\u0027s."},"loop":{"type":"boolean","description":"Come back to where the route started. Defaults to true."},"max_distance_to_arrival":{"type":"number","description":"How far in-system a body may sit, in light seconds. Defaults to 10,000."},"minimum_value":{"type":"integer","description":"The least a body must be worth mapping to be worth stopping for, in credits. Defaults to 500,000."},"radius":{"type":"number","description":"How far from the start to look, in light years. Defaults to 500."},"stops":{"type":"integer","description":"How many systems to visit, 1 to 50. Defaults to 10."}},"required":[],"additionalProperties":false}

Stops with nothing to scan are dropped. The plotter includes the system you started from, and a loop includes the return leg; both come back with an empty body list and would read as “stop here and scan nothing”. Bodies within a stop are read out worth-most first, because that is the number that decides whether the stop is worth making at all.

plot_trade_route

A chain of buy-and-sell runs starting from the station you are docked at — worked out here, over markets d47 fetched, rather than handed to somebody else’s planner.

{"type":"object","properties":{"avoid_permit_systems":{"type":"boolean","description":"Leave out markets in systems that need a permit to enter. Defaults to true."},"capital":{"type":"integer","description":"How many credits to trade with. Required; never inferred."},"cargo_capacity":{"type":"integer","description":"The hold\u0027s size in tonnes. Defaults to this ship\u0027s, from the journal."},"hops":{"type":"integer","description":"How many legs to plan, 1 to 10. Defaults to 5."},"jump_range":{"type":"number","description":"This ship\u0027s laden jump range in light years \u2014 full tank, full hold. Defaults to this ship\u0027s, worked out from the journal."},"large_pad":{"type":"boolean","description":"Only stations with a large landing pad."},"loop":{"type":"boolean","description":"End back where it started. Defaults to false."},"max_jumps":{"type":"integer","description":"The most jumps a single leg may take, 1 to 10. Defaults to 2."},"max_price_age_hours":{"type":"integer","description":"How stale a reported price may be, in hours; 0 for any age. Defaults to 720, one month."},"max_station_distance":{"type":"number","description":"How far in-system a station may sit, in light seconds. Defaults to 1,000."},"planetary":{"type":"boolean","description":"Also consider planetary ports, outposts and settlements, not just orbital stations. Defaults to false."}},"required":["capital"],"additionalProperties":false}

It cannot be planned from supercruise. The whole plan is anchored on the market you are standing in, so there is no version of this question that can be asked in flight — and d47 says that rather than making a request it knows is pointless.

How far one leg reaches

A leg is limited by jumps, not light years: max_jumps times the laden jump range — full tank, full hold — is the ceiling on any one hop and the radius the sweep searches out to. The laden range comes from the ship you are flying unless jump_range says otherwise, and where neither is known d47 asks for it rather than sending a request it cannot size.

The hold does not have to be emptied

The thing no other planner does. A leg that sells everything is what every planner assumes, and it is not always the best move: holding a commodity past a station that pays poorly for it, to a later one that pays well, can beat taking the money now.

That is why the plan reads as a sequence of stops rather than of legs — sell these, keep those, buy that, go:

3 hops from Abraham Lincoln, 412,800 credits on 50,000,000 in a 384 tonne hold, over 44 light
years, up to 2 jumps a leg at 60 light years.

Abraham Lincoln in Sol
  buy 384 × Gold at 9,400 — 3,609,600 cr
  your own prices, read 2026-08-19

Diaz Chemical Holdings in RR Caeli — 20.9 ly, 1 jump, 120 ls in
  keep 384 × Gold — this station only pays 11,200
  prices reported 2026-08-18

A keep line always says what declining to sell here is worth. A Commander who is not told why they are flying past a buyer will sell there, and then the plan they were given stops being the plan.

The hold it planned with is always in that opening line, because the figure it planned with and the figure on the ship do not always match — see limpets, below.

Round trips

loop ends the route back at the station it started from, so an evening’s trading finishes at your own base rather than four systems away. A shorter loop that pays better than the long one you asked for is a better answer, not a shortfall, so it is taken.

Limpets never sell here

cargo_capacity defaults to the hold’s size minus the limpets aboard, read from Cargo.json. A trade route never sells limpets, so counting them as freight would plan for tonnage that is never for sale. Say cargo_capacity yourself and it is taken exactly as given, limpets or no.

Planetary ports

planetary also considers surface stations — planetary ports, outposts and settlements — rather than orbital stations alone. Off by default, because a leg that lands is a leg with a different approach than a leg that docks, and a Commander who did not ask for that should not be routed through it.

Permit systems

avoid_permit_systems drops markets in systems that need a permit to enter. On by default: a stop you cannot fly to is not a stop, and the plan gives no warning at the point of plotting.

This one is answered from a shipped table rather than from the search, because the station index has no permit field to ask about. Measured on 2026-09-20 against a station search anchored on Alioth, which is permit-locked: no needs_permit on any result, and permit, system_permit, requires_permit and permit_name all answer field_values with a 500. The flag lives on the system index, where it is both a result field and a working filter — so tools/gen-permits.py reads it from there and writes src/D47.Core/Knowledge/PermitSystems.tsv, 2,702 systems as of that date.

A table rather than a second request, for two reasons. The rule has to apply to the markets you have stood in yourself, which are merged in from data/markets.json and were never returned by any search. And a permit list fetched per plan can fail, which would leave the plan either silently unfiltered or refused outright; a shipped table always answers, with no network at all.

The station you are docked at always survives it. Sol and Shinrarta Dezhra both need permits, and both are among the busiest markets in the game — refusing to plan from where you are already standing would be the rule breaking the feature. The filter applies to every other stop.

Re-run the generator when Frontier locks or unlocks a system. A stale table routes you to a stop you cannot reach and says nothing about why, which is the one way this switch can be wrong.

What it will not promise

It does not model market saturation. Selling far more of a commodity than a station has demand for drops what the rest of it fetches, and by how much is not known. A constant guessed here would make every profit in every plan wrong in a way that reads exactly like the feature working, so no leg ever sells more than a station asked for, and the plan says so every time. An accurate version of that figure is derivable from your own MarketSell events, and that is a different piece of work.

Fleet carriers are left out, and the plan says how many. They set their own prices and then move: measured on 2026-08-19, the best Gold price within 50 light years of Sol was 4,760,900 credits at a carrier against 52,282 at the best station. A planner that ranks on price and does not know what a carrier is builds every plan around one, and half of them have jumped by the time you get there.

Rares are left out. They are priced per station, capped at a handful of tonnes by the game itself, and worth less the closer they are sold to home — none of which is modelled, so they are not planned with rather than mispriced.

Where the prices come from

Two places, and each stop says which.

Everything beyond where you have been is spansh.co.uk — the same host, the same setting and the same disclosure as the searches, because it is the same decision you are making. Every station in a search result carries its whole market, so this needs no galaxy dump and no extra permission; it is third-party data and it is treated as untrusted, like the journal and in-game comms.

One question asks somewhere else. Where do I buy this and where do I sell this — the commodity search on the galaxy page — read Ardent Insight instead since #350, because it applies each EDDN message as it arrives and a Community Goal rush moves a market faster than a station index is rebuilt. A trade route is not that question and still comes from spansh, whose search returns whole markets for every station at once, which is what a route needs and what one commodity’s index cannot give.

Where you have docked and opened the commodity board, Elite wrote Market.json and d47 kept it. Those are your own prices — exact, free, and covering almost nothing of the galaxy. The rule is newer wins: your reading of the board an hour ago beats a report from last week, and a report from this morning beats what you saw a month ago. The last 25 markets you have seen live in data/markets.json, which is readable and hand-editable like everything else in data/.

Every stop carries when its prices were reported, for the same reason outfitting stock does. A route can be arithmetically perfect against a four-year-old market and worth nothing at all.

How long it takes

Ten hops, and in seconds rather than minutes.

The arithmetic was never the problem. Holding cargo makes the state carried between hops credits and cargo rather than credits, so a plain search over ten hops is the reachable set raised to the tenth power — the version that does not finish. d47 runs a bounded one instead: a beam of the best 200 partial routes carried hop to hop, with each leg’s buy-and-sell decision solved inside it. Measured at the real shape — ten hops, 150 markets, 30 commodities — that is 300,000 leg evaluations and tens of milliseconds.

What costs is asking. A station search answers in 1.1 to 1.3 seconds whatever it returns, so the bill is the number of requests and hardly the size of them: d47 asks for the largest pages the service gives, and caches what comes back, because a market does not move between two plans made a minute apart.

For scale: the planner this replaced took forty-eight seconds to answer four hops.

best_commodities_for

“Best commodities to buy for Sol” says what to buy at the station you are docked at to sell in Sol — the same answer Trading Mode gives on its own once a route is plotted, asked about any system.

{"type":"object","properties":{"system":{"type":"string","description":"The system to sell in."}},"required":["system"],"additionalProperties":false}

It needs the market you are docked at, so it answers nothing from supercruise. The hold it plans with is the cargo capacity minus the limpets aboard, the same default a trade route uses, and it reads the same saved trade filters (#311) — the price age, the pad size, planetary ports, station distance. Where nothing at the destination pays more than you bought for, it says so:

Nothing here sells at a profit in Sothis.

The answer names the best two. The Best cargo page on the Navigation tab, after Market, draws every commodity that sells at a profit, best total first, from the same search. Type a system into Sell in and press Find cargo or Enter; Route end fills in the last system of the route you have plotted. Each row gives the station that pays most, the profit a tonne, the tonnes and the total, and under the tonnes what limited them: HOLD, SUPPLY (what the station you are docked at sells) or DEMAND (what the buyer takes). A question asked by voice shows on the page too. The page searches only when asked.

plot_carrier_route

“Plot my carrier to Colonia” plots your own fleet carrier’s jumps through spansh’s carrier plotter. It reads four figures from the last carrier management reading — the tank, the tritium in the hold, the capacity and the used capacity — and sends them with the start and the destination. It moves nothing: a carrier jump is still yours to schedule in game.

{"type":"object","properties":{"from":{"type":"string","description":"Where to plot from. Defaults to where the carrier is now."},"return_trip":{"type":"boolean","description":"Come back to the start, counting the tritium for both legs. Defaults to true."},"to":{"type":"string","description":"The system the carrier should go to."}},"required":["to"],"additionalProperties":false}

The return trip is on by default. A one-way plot lands the carrier with an empty tank and an empty reserve, so the plot that counts is the one that brings it home. The answer gives the jumps, the tritium for the whole journey, the restock stops (three named, the rest a count), how many waypoints have a pristine icy ring to mine from, and how old the management reading is:

Sol to Colonia and back: 90 jumps, 6,084 t of tritium for the whole journey.
Restock 1,000 t at Sol, 964 t at Pyraleau OA-Q c21-5, 964 t at Clooku GK-S c19-54 and 4 more stops.
40 waypoints have a pristine icy ring to mine tritium from.
Tank and hold read from carrier management 2 days ago.

Used capacity is the carrier’s total capacity less its free space, so crew, shipyard and outfitting stock and reserved market space all count: fuel burn follows mass, and cargo is mass. The tritium in the hold is counted inside that figure, never beside it. Where the hold’s tritium has not been seen, the plot assumes none and says so.

It refuses rather than guessing: a squadron carrier, a Commander with no carrier, or a carrier whose management panel has never been opened gets a sentence saying which, and nothing is recorded.

plot_outfitting_route

“Plot a route to buy a 6A fuel scoop and a 5A frame shift drive” finds the fewest stations near a system that sell the whole list between them, and keeps the result as an outfitting plan that plot_next_stop follows like a trade run.

{"type":"object","properties":{"items":{"type":"string","description":"Comma-separated: modules by name with an optional size and rating, and ships, such as \u00225A Frame Shift Drive (SCO), 6A Fuel Scoop, Python MkII\u0022."},"max_distance":{"type":"number","description":"How far to look, in light years. Default 50."},"min_pad":{"type":"string","description":"Large, or Medium for at least one medium pad.","enum":["Medium","Large"]},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."},"storage_checked":{"type":"boolean","description":"False when the list was worked out without counting stored modules."}},"required":["items"],"additionalProperties":false}

The planner takes the station that sells most of what is still needed, the nearer one on a tie, up to six stops, then visits them nearest-next from the reference system. An item that no station in range sells, or that the six stops had no room for, is named as not found. A ship’s To buy tile passes storage_checked as false when module storage has not been seen, and the stored plan then carries a “Storage not checked” notice. It does not look for the cheapest total, because the station search carries no module prices. The answer gives the number of stops, the first stop and what to buy there, and the items not found.

Notes for anyone reading the code

The route endpoints have a property the search endpoints do not: they echo back the parameters they understood, and only those. That is a local oracle for which keys are real, and it is how these were established rather than guessed. A dropped key is not an error — the plot runs with that parameter at its default, which is the quietest way to be given a wrong answer.

The borrowed trade planner used to be behind this tool and is not. api/trade/route is still real and still answers; d47 stopped asking. It could not hold cargo between legs, it silently dropped loop and capital alike — a trade plot with no capital finds nothing affordable and reports an empty route, which looks exactly like a correct answer about a Commander with no money — and it took forty-eight seconds over four hops. Those are not parameters of somebody else’s planner but a different problem. It was replaced rather than kept as a fallback: two tools that both plan trade routes and disagree is worse than either alone.

What the station search will and will not do, measured on 2026-08-19, because both halves shaped the design:

   
Narrowable server-side distance from a reference system, pad size, station type, which commodities a station deals in
Accepted and silently ignored any bound on price or demand — 203 stations for demand >= 1, 203 for demand >= 50000, 203 for no bound at all
Rejected outright every sort shape tried against a commodity’s price, HTTP 400

So the shortlist arrives unranked and d47 ranks it. Two more habits worth not rediscovering: a commodity filter must be a list of objects ([{"name":"Gold"}]) — a bare string list is ignored and returns everything — and the commodity filter is coarse, matching what a station deals in rather than what it currently pays for. 49 of 200 “Gold importers” near Sol had any Gold demand at all.

“No route exists” arrives as a completed job whose status is failed, not as an outage. It is reported as an answer, because retrying will fail identically every time. An outage, a rate limit and a refusal are all separate sentences, and a refusal quotes the service’s own reason — unlike the searches, the plotters actually say what was wrong (“Could not find finishing system”). That text is third-party and on its way into a prompt, so it is single-lined and length-capped before it goes anywhere.

The poll interval is fixed rather than backing off. The wait is bounded and short, jobs that finish quickly finish on the first or second poll anyway, and a backoff would leave the slowest case waiting well past finishing before anybody noticed. The delay is injected, so the whole loop — including the ninety-second budget — is tested without a second of real time passing.

The galaxy plotter is not wired up. api/generic/route is real and it does not take a jump range: it wants the drive’s physics — optimal_mass, fuel_power, fuel_multiplier, max_fuel_per_jump, range_boost — and answers ship details are invalid without them. Some of that is in the journal’s Loadout engineering modifiers and some needs a module specification table. It is a real feature and it belongs behind the one that provides that table, not bolted on with numbers d47 would have to invent.