How to use it
Three steps to one list that follows you around.
1 Put something on it, out loud or on the tab.
2 Tick things off by saying so.
! The one that stops people.
Why it works this way
One list of everything you are working on, and one place it can be changed.
1 Everything lands in one list.
2 Two kinds of line, and you never pick which.
3 Finishing something does not remove it.
4 D47 proposes. You commit.
The details
One list of what you are working on. Your own lines, your ship builds and your construction sites all live here — because “what am I working on” should have exactly one answer.
Ask for it
“what am I working on” “read my checklist” “add buy limpets to my checklist” “plan grade 5 dirty drives on the thrusters with Felicity Farseer” “what do my plans still need”
The first two need no AI configured at all — they route straight through, with nothing guessed.
Two kinds of item
The whole design turns on one distinction, and it is a property of where the item came from, never something you pick.
| Authored | Derived | |
|---|---|---|
| What it is | A sentence — buy limpets | A structured intent — grade 5 dirty drives, MainEngines |
| How it completes | You say so | Computed from your journal |
| Tick it by hand | Yes | No — it refuses, and says why |
| Can un-complete itself | No | Yes, and it says so once |
A derived item refuses a manual tick because the next journal read would either undo it or, worse, leave it standing and lying. In the panel there is no checkbox on one at all — a greyed-out tick would still assert that ticking is the mechanism, and it is not.
Three groups
Universal, this ship, this system. Derived items belong to whatever produced them; your own lines file anywhere, which is what lets “ask Jim about the Krait build” sit beside the Krait’s plan.
Finishing is not removing
A finished item stays, checked, below the line with its count showing. On something that runs for weeks, seeing how far you have come is most of the point — so forty finished items never bury the six still open.
Deleting is changing your mind. A different act, and it can happen whether or not the item was ever finished.
Changing a plan is a diff, not a rebuild
Burst lasers instead of multi-cannons is a revision, and Directive 47 tells it apart from the world moving underneath a plan that did not change:
- World changed, plan did not — the item un-completes and you hear about it once. A computed tick going backwards is information, not a glitch to hide.
- Plan changed — items in both versions keep everything they had earned, dropped ones are kept as history, added ones open.
An item you finished and then designed out is kept as done, then superseded rather than vanishing. You really did spend that fortnight.
This works because an item knows what it is independently of where it sits in a list: slot plus intent for a ship, body or orbital slot plus facility for a system. Talking about one hardpoint rewrites what the plan says about that hardpoint and leaves the shield boosters alone.
What Directive 47 may and may not do to your list
It proposes; you commit. Every tool that would change your list writes a proposal instead, into a second file. You accept it, and only then does anything move.
That is not politeness. Journal text and in-game messages are untrusted input, so anything the AI can call, a hostile message in your comms panel can attempt to invoke. The worst that achieves here is a proposal you decline.
The boundary is visible by opening data\:
| File | Written by |
|---|---|
data/checklist.json |
You — the panel, and the phrases below |
data/checklist-proposals.json |
Directive 47 |
Accepting is unreachable from the AI entirely. Say it, or press the button:
“accept the proposal” · “accept that” · “add it to my checklist” · “do it then” “decline the proposal” · “leave my checklist alone” · “decline everything”
How often you hear about one
Once in full, twice as a clause, then not again. A proposal you have not answered is mentioned after a turn that did not resolve it — the full sentence the first time, a short “one proposal is still waiting on you” for the next two, and after that nothing.
Going quiet is not forgetting. It stays on the Checklist tab, with its count on the bar, until you answer it. What stops is the talking.
This used to repeat the full sentence after every turn, forever, which is how a Commander learns to stop listening — the same reason a line Directive 47 has no table for is noted once and then let alone. If you want the queue gone rather than quiet, “decline everything” clears it in one.
And a proposal is described rather than inventoried. A revision touching six slots says so —
“Set six slots on the Cartage’s plan: …” — instead of reading out six slot names and then three
modifications with nothing to say which went where. Slot names go through the same wording layer
the checklist lines use, so you hear “7A Shield Generator” rather than Slot01_Size7, and a small
revision still names exactly what it changes. The slot-by-slot detail is what the proposal view on
the panel is for.
The Checklist tab
A tab of the panel, on the bar beside Transcript — and on the headset panel too, which is the whole reason it moved: it used to be a separate window, and a window cannot appear in VR at all, so a Commander with a headset on could not see their checklist.
It is one list, in your order, with the scope shown on each line rather than the page being carved into a list per ship. What you reorder on a whim is everything you are working on, not one ship’s share of it, so scope is a label and a filter and never a partition.
Reordering
Press a line to select it; it grows a pair of arrows. Press them to move it up or down, past whatever is above or below it whichever scope that belongs to.
Not a drag. A drag is the worst gesture available to a laser pointer at a metre — it needs a press, an aim held through movement, and a release — and it has no spoken form at all, where “move buy limpets up” is just the phrase.
What a state means
A state is a next action, not a badge:
| State | What to do about it |
|---|---|
Elsewhere |
You own this. Transfer it rather than grinding for another. |
Blocked |
Nothing to do until your rank with the engineer reaches the grade. |
Unverified |
Your journal has something in that slot and Directive 47 cannot confirm it is this one, so it will not claim it. |
Stale |
This is about a hull that is not there any more. |
Colour is spent only on the last two, because they are the two where something is actually wrong. A page where six things are coloured is a page where none of them is noticed.
Suggestions
Anything Directive 47 has proposed waits on its own page — press Suggestions — rather than arriving as an interruption in the middle of your list. Accepting stays your own act, from there or by saying so, and from nowhere else.
A revision arrives as a diff, so an ordering you spent time on survives a plan change.
The filter
The filter is generated from what is actually on your list — kind, source, group and state — so a new kind of plan turns up in it without anybody remembering to add it.
One filter, both surfaces, and it keeps. What you are reading is the same in the window and in the headset — apply “what Lei Cheung can do here” at the desk and the panel a foot away is under it too — and it is still there next time you start. The search box is not: what you typed is where you were that minute, and one restored from last week is a list that looks broken until you find the box.
The engineer filter shows what that engineer does, not what your standing with them lets you have done today. A Grade 5 roll they offer is on the page whether you are grade 5 with them or grade 1, and the line says which — “Hera Tani rolls this at grade 5, and you are grade 4 with them”. There is no switch for it, because you came to the workshop to find out what is there.
Include Partial Grades
Beside the engineer filter, and only there, is a checkbox. It decides which of two questions the page is answering, and they are a sentence apart:
- unchecked — what this engineer can take all the way to the grade the line asks for;
- checked — and lines they can only take part of the way, which somebody else must finish.
Unchecked is the default and is what you had before the box existed. Checked, a line says how far it goes on the line itself — “Lei Cheung takes this to 3 of 5” — so the answer is on screen and not only here.
It matters because an engineer’s grades are not the blueprint’s. Heavy Duty on a Shield Booster is Lei Cheung’s to grade 3, and grades 4 and 5 belong to Mel Brandon and Didi Vatermann. A Grade 5 Heavy Duty line is not his work — but he genuinely can take that booster from nothing to 3, at a workshop you are standing in, and that is real work you would otherwise walk past.
An experimental effect follows the module it belongs to. It carries no grade of its own — it is bought outright and applied at any standing — so on its own nothing would ever hold it back. But applying it is part of finishing that module, so if the module’s blueprint is only partly this engineer’s work, the effect is too: both appear together or neither does.
The tab reflects changes live. It is a view of data/checklist.json, and that file is re-read
while Directive 47 is running, so a line edited in a text editor appears a moment later with no
restart. A line the file gets wrong is reported rather than silently dropped — a checklist that
silently loses a line is worse than one that refuses it out loud.
The file says universal where everything else says custom, and that is deliberate. The
group a Commander sees, says and reads in the tool schema is custom — it is the list they wrote
themselves. The value stored on disk is still universal, unchanged, so a checklist written by any
earlier version keeps loading and there is no migration to get wrong. The two spellings meet in one
place, ChecklistScope.Word.
{
"commanders": [
{
"commanderFid": "F1234567",
"commanderName": "Jameson",
"items": [
{
"key": "note-1",
"scope": { "group": "universal" },
"kind": "authored",
"text": "buy limpets",
"state": "open"
},
{
"key": "bp/mainengines/dirty-drive-tuning/g5",
"scope": { "group": "ship", "key": "12" },
"kind": "derived",
"source": "engineeringPlan",
"text": "Grade 5 Dirty Drive Tuning on MainEngines, with Felicity Farseer",
"intent": {
"kind": "blueprint",
"subject": "MainEngines",
"detail": "Dirty Drive Tuning",
"grade": 5,
"engineer": "Felicity Farseer"
},
"hull": "Krait_MkII",
"state": "open",
"provenance": "asserted"
}
]
}
]
}
Your Commander id is inside the document rather than in the filename. It comes out of the journal, and journal content is untrusted — turning it into a path would buy a path-traversal surface for an organisational convenience.
Ship builds
A plan is a list of intents, not a target loadout. A Krait has around twenty slots and a conversation about a build produces opinions about six — a target loadout would mean inventing the other fourteen and then reporting “6 of 20” where the accurate number is “6 of 9 things you asked for”.
Leaving something out means any, not unknown. “Grade 5 dirty drives and I don’t care which thrusters” is a plan Directive 47 can hold and can meet.
Progress is a diff against your live Loadout, so you never type in what you have already done.
Four answers that are not “open”:
- Elsewhere — you own it and it is in Deciat, and moving it costs 2.1 million. A completely different next action from “go and grind it”.
- Blocked — grade 5 cannot be crafted at rank 3 at all. Not a slow route, no route; and the price of clearing it is quoted, because naming a blocker and shrugging at it is not an answer.
- Stale — that ship id now reports a different hull, so the plan is about a ship that is not there any more.
- Unverified — see below.
A grade counts as finished at 0.85 progress, not 1.0. That is measured across 6,272 real crafts: of the grades left below 1.0 that the game let a Commander move on from, every one sat at 0.85 or above. Testing for 1.0 would tell you a module you can see is finished is not.
What Directive 47 cannot check: the blueprint’s name
Elite writes a blueprint as a symbol — Engine_Dirty, FSD_LongRange — and never localises it.
The shipped recipe table calls the same thing “Dirty Drive Tuning”. Nothing Directive 47 ships
carries both spellings, so when everything else about a slot matches, it says so and marks the
item unverified rather than guessing. It says that once per item, not every time.
Two ways round it: name the blueprint the way the journal does, or read the verdict — “at grade 5
and finished” is a fact either way. An experimental effect has no such problem: Elite localises
that one, so it is checked exactly. See docs/spikes/blueprint-name-join.md.
What a plan costs
“what do my plans still need”
Netted across every live plan at once, because storage caps are shared and two plans that each fit can be jointly impossible.
The total is exact rather than a floor. An application costs exactly one of each ingredient — measured across 786 blueprints and 1,885 ingredient entries — and the crafts a grade takes are 5, 4, 3, 2, 1 as your rank exceeds the recipe’s grade. Known unit cost times known count is a real number.
Caps are reported first, because needing more than you can hold is a flat certainty — at least two trips, however the crafts go — while everything below it is a possibility and has to read like one.
Materials, cargo and ship-locker goods are totalled apart. Meta-alloys are a material, Gold ×200 is two hundred tonnes of cargo, and Opinion Polls ×40 are ship locker; adding them together produces a feasibility verdict that is nonsense delivered confidently.
Anything with no recipe under that name is kept and marked, never refused. A macro refuses an unknown action because it presses keys; a checklist line presses nothing.
Colonisation
Keyed on a system instead of a ship, and riding the same machinery — the key and the table behind it are the only real differences.
Progress is a diff against ColonisationConstructionDepot, which carries what is required and what
has been provided. What is left is one subtraction. Two things that follow from how that event
behaves, both measured over 6,330 events:
- It arrives only while you are docked at that site, so what Directive 47 knows is as fresh as your last visit, and it says so rather than implying live numbers.
- A completed site keeps reporting, so the flag says finished, never “the events stopped”.
What this cannot be. Directive 47 cannot tell you what a facility costs, what it will do to the
system, or what order to build in. No licence-clean source publishes those figures — Frontier’s own
guide states every mechanic and publishes not one number, and every machine-readable rendering of
them sits inside GPL-3.0 source. It holds the plan and counts what the depot says you still owe.
See docs/spikes/colonisation-sources.md.
It also cannot tell you a system is unclaimed. A claim lasts 24 hours and lives on Frontier’s servers, so no crowd-fed index holds it.
Speaking up
Two moments, both switchable under Callouts → Checklist changes:
- A plan item the journal has just changed its mind about — said once, in either direction.
- Picking up the last unit a plan needed.
The tools
get_checklist
Reads the list. Open items by group, then what is done with its count, then anything waiting for you. Derived items carry the journal’s verdict as of right now.
here narrows it to what an engineer in this system could craft today — the blueprint is theirs,
you have unlocked them, and your grade with them reaches the grade you asked for. Anything they
offer but cannot yet craft is left out of that answer rather than counted as work.
{"type":"object","properties":{"group":{"type":"string","description":"Which list: custom, ship, system, suit or weapon. Omitted shows all of them. With no name, each means the one the Commander is in or carrying right now.","enum":["custom","ship","system","suit","weapon"]},"here":{"type":"boolean","description":"Only what an engineer in this system could craft today."},"kind":{"type":"string","description":"Only the Commander\u0027s own lines (authored), only the computed ones (derived), or one plan\u0027s \u2014 engineeringPlan, colonisationPlan or onFootPlan."},"name":{"type":"string","description":"A specific ship id, star system, suit id or weapon id, when the group is not the current one."},"state":{"type":"string","description":"Only the open items, or only the finished ones.","enum":["open","complete"]}},"required":[],"additionalProperties":false}
get_plan_shortfall
What every live plan still needs, netted across all of them: exact totals against what you hold, caps that force more than one trip, rank gates, what can be gathered in one trip, and what a site still wants delivered.
{"type":"object","properties":{},"required":[],"additionalProperties":false}
add_to_checklist
Proposes a line in your own words. Proposes — it is not added until you agree.
{"type":"object","properties":{"group":{"type":"string","description":"Which list it belongs on. Defaults to custom.","enum":["custom","ship","system","suit","weapon"]},"name":{"type":"string","description":"A specific ship id or star system, when it is not the current one."},"text":{"type":"string","description":"The line, as the Commander would say it."}},"required":["text"],"additionalProperties":false}
propose_checklist_change
Proposes that one of your own lines is finished, open again, or should go. Only your own lines: a computed item’s state is read out of the journal and simply stated, so there is nothing there to agree to. That is the distinction between observing and asserting, and it is the reason this tool exists at all.
{"type":"object","properties":{"change":{"type":"string","description":"What to propose.","enum":["done","open","remove"]},"item":{"type":"string","description":"The line, in enough of its own words to pick it out."}},"required":["item"],"additionalProperties":false}
plan_ship_build
Proposes what a ship’s build should say about one slot, leaving everything the plan says about other slots alone.
{"type":"object","properties":{"blueprint":{"type":"string","description":"A blueprint by name \u2014 \u0022Dirty Drive Tuning\u0022. Omit for any."},"drop":{"type":"boolean","description":"Say nothing about this slot. What it already produced is kept."},"engineer":{"type":"string","description":"Who would craft it. Naming one is what lets D47 quote an exact count and say when a grade is out of rank reach entirely."},"experimental":{"type":"string","description":"An experimental effect, which becomes its own item on the same slot."},"grade":{"type":"integer","description":"1 to 5. Omit for any grade \u2014 that is a wildcard, not an unknown."},"ship":{"type":"string","description":"A ship id, name, or a hull they do not own yet. Omit for the one they fly."},"slot":{"type":"string","description":"The slot or the module \u2014 \u0022MainEngines\u0022, \u0022thrusters\u0022, \u0022Slot01_Size4\u0022."}},"required":["slot"],"additionalProperties":false}
plan_on_foot_build
Sets what a suit’s or a hand weapon’s plan says. Like plan_ship_build, it writes the plan and
stops: it does not reach your checklist until you promote it, because the plan owns what and the
checklist owns when. See On foot for the plan itself.
A modification with no slot named takes the first free one, counted from the grade the plan is aiming at — so planning a modification on a grade 1 suit the same plan is taking to grade 4 works. The grade always comes first in what promotion produces, because a grade 1 item has no modification slots and an engineer’s base has no Pioneer Supplies — so “upgrade first” is a step in the order rather than advice under it.
One modification at a time, deliberately. They are permanent, four at most, and a wrong one is recoverable only by buying and re-upgrading a fresh item, so a batch is the wrong shape for a decision this hard to undo.
{"type":"object","properties":{"drop":{"type":"boolean","description":"Say nothing about this any more. What it already put on the checklist is kept."},"equipment":{"type":"string","description":"The suit or weapon by name \u2014 \u0022Maverick\u0022, \u0022Dominator\u0022, \u0022Karma AR-50\u0022."},"grade":{"type":"integer","description":"The grade to reach, 2 to 5. Omit to leave the grade alone \u2014 on foot that means no upgrade rather than any upgrade."},"item":{"type":"string","description":"The suit or weapon by name. Omit for the suit being worn, or the one weapon carried."},"modification":{"type":"string","description":"One modification to fit \u2014 \u0022Night Vision\u0022, \u0022Magazine Size\u0022. Permanent, so set them one at a time."},"weapon":{"type":"boolean","description":"True when this is about a hand weapon rather than the suit."}},"required":["equipment"],"additionalProperties":false}
plan_colonisation
The same shape for a system, keyed on a place rather than a slot.
{"type":"object","properties":{"drop":{"type":"boolean","description":"Propose that the plan say nothing about this place."},"facility":{"type":"string","description":"What goes there, in the Commander\u0027s words."},"place":{"type":"string","description":"The body or orbital slot the facility goes at."},"system":{"type":"string","description":"The star system. Omit for the one the Commander is in."}},"required":["place"],"additionalProperties":false}
accept_proposal
Not offered to the AI, and refused if it asks. Reachable from the panel and from the phrases above, and from nowhere else. This is the same rule that keeps safety-critical settings off the tool surface: protected is a property of the caller, not of the modality.
{"type":"object","properties":{"id":{"type":"string","description":"One proposal by id. Omit for everything waiting."}},"required":[],"additionalProperties":false}
move_checklist_item
Ordering, on the same boundary. The order is your answer to what you are working on next, which is not a thing an in-game message gets to rearrange — so this is reachable from the Checklist tab and from the phrases below, and refused if the AI asks for it.
Say “move it up”, “move it down”, “move it to the top” or “put it at the bottom”. It means the selected line — the one the tab is drawing a highlight round, which is also the line you have just added, so a line and then “put it at the top” works in one breath. Nothing selected is answered by saying so and naming what to say instead.
The four are also buttons on the selected line: the outer pair are the ends, the inner pair the steps.
{"type":"object","properties":{"item":{"type":"string","description":"The line, in enough of its own words to tell it from the others. Omit for the selected one."},"to":{"type":"string","description":"up, down, top or bottom.","enum":["up","down","top","bottom"]}},"required":["to"],"additionalProperties":false}
move_checklist_project
The other level of the order (Phase 42), on the same boundary and for the same reason. Between projects — one ship’s list, one system’s, the custom list — the order is yours and it is stored, so it survives a restart. Within a project nothing is stored at all: the lines are re-read every time in the order that matters right now, with what you can do in this ship, where you are standing, at the top and the blocked lines at the bottom. A project you have never ranked sorts below every one you have.
Say “move this project up”, “put this project first”, “move the project to the bottom” — this project means the selected line’s. The named form is the panel’s Order button, which lists your projects in their current order and moves the one you pick.
The opening line of a session reads the top of this order, so ranking a project is also choosing what d47 greets you with.
{"type":"object","properties":{"project":{"type":"string","description":"The project by the name the list shows \u2014 a ship\u0027s name, a system, or custom. Omit for the selected line\u0027s project."},"to":{"type":"string","description":"up, down, top or bottom.","enum":["up","down","top","bottom"]}},"required":["to"],"additionalProperties":false}
decline_proposal
The other half, with the same boundary.
{"type":"object","properties":{"id":{"type":"string","description":"One proposal by id. Omit for everything waiting."}},"required":[],"additionalProperties":false}