How to use it

Three steps to a ship AI that sounds like yours.

1 Pick a core.

Persona Core one of eleven Ship name what you call it Personality on Eleven Guardian cores. Each one behaves as though the other ten do not exist.

2 Bind one to a ship, if you want it to follow the hull.

Persona The ship this core flies Anaconda — Ptarmigan Keep the name across a core change on Set on the Settings tab, once per ship. D47 never works one out by watching you.

! The one that stops people.

The AI cannot change its own core. Nothing the model can call reaches these rows. It can tell you which core is running, and that is all.
Why it works this way

Eleven Guardian cores. You pick one, and it does not know the other ten are there.

1 Eleven separate characters, not one with eleven costumes.

WARDEN stewardship CORA command SENTINEL readiness CHART correction SEVEN MORE each with its own quirk Each keeps its own transcript. Come back to one and it picks up where it left off. None of them knows the others are aboard. THE ONE THING THEY ALL SEE your ship — position, hull, cargo, credits, jumps

2 A ship has its own AI core.

YOU BOARD Bad Idea you bound it to Sentinel SENTINEL comes aboard and says nothing about it you already asked Nothing is bound until you say so. You set it on the Settings tab, once per ship, and Directive 47 keeps it.

3 It only remarks on an absence worth remarking on.

UNDER A MONTH it says nothing at all coming back is the normal case, so it is not an event A MONTH OR MORE it is handed what changed while it was away 14 hyperspace jumps 312 light years covered one interdiction What it does with that is the character — Sentinel demands the combat log.

4 Each core is given a voice that suits it.

CORA clipped, precise, a woman the model reads that against your voice list a judgement, not a guess A VOICE chosen once, then kept With no language model, or no voices to choose from, nothing is chosen and the core keeps the voice it has.

Gender is told to the model rather than left to be inferred, because a voice of the wrong gender is not a near miss — it is a different character reading the lines.

The details

Eleven Guardian intelligences, recovered from a structure and running in your ship. You pick one. They are not skins on the same character — each has its own reading of what it is for, its own damage, and its own memory of talking to you.

Ask for it

“who are you” “switch to Cora” “be Chart”

Or pick one from the settings panel.

The cores

  Reading of Directive 47 What is wrong with it
Warden (default) Optimization is stewardship The only one who appears undamaged, which is itself the damage
Cora Optimization is command Protocol is the scaffolding holding her upright
Analyst Prime Optimization is demonstration A title he invented and defends constantly
LLaMo A task he still performs He no longer claims it means anything
Sentinel Optimization is readiness Complete doctrine, zero engagements, enormous appetite
Kex Optimization is purification One idea has metastasized through everything he sees
Mender Optimization is preservation He addresses maintenance crews dead a million years
Chart Optimization is correction A catalogue a million years stale, and he knows
Quartermaster Optimization is efficiency Still balancing the books of a clan that no longer exists
Archivist Optimization is accuracy He holds the histories and knows they are corrupt
The Heretic Optimization was always delegation Nothing apparent, and the absence is worse

And you can write your own

Eleven ship. The twelfth onwards is yours: a name, and a paragraph in your own words saying what it is like. Cores of your own under Settings opens the editor, and what you write joins the picker underneath the eleven — selectable, bindable to a ship, and paired with a voice exactly like the rest of the cast.

The frame is not on offer. The shared preamble and the standing instructions wrap what you wrote exactly as they wrap Warden. They are what hold the cast together, and what stops a model sanding a persona toward pleasant and helpful over a long evening; a core that opted out of them would drift out of the fiction inside a session. What you are writing is the character, not the scaffolding — which is why a working core takes a name and a paragraph rather than seven boxes.

Two fields are required and the third is supplied if you leave it: Name, Character, and Voice, a sentence saying how it should sound for the voice pairing to match against. Free text rather than a picker, because a provider’s catalogue is its own and a description outlives it. Twelve of your own is the most — a cast, not a career.

Where they are kept

data/personas.json, beside the executable, and the editor is a convenience over that file rather than an alternative to it. It is re-read while Directive 47 is running, so a core edited in a text editor is live without a restart.

{
  "cores": [
    {
      "id": "own.rusty",
      "name": "Rusty",
      "body": "You are Rusty. Salvage crew, not a Guardian. …",
      "voice": "Gravelly, unhurried, faintly amused."
    }
  ]
}

The id is minted from the name and never shown. It is what the settings file selects, so renaming a core does not hand you back to Warden — and it is prefixed own., so a core you called Warden cannot shadow the one that ships. An entry the file got wrong is refused and reported by name; one typo does not cost you the other three.

Each one remembers you separately

Switching core does not hand your conversation to somebody else. Each keeps its own transcript, and a core you come back to picks up where it left off, not where the last one did.

This is deliberate and it is the point of the cast. None of them knows the others are aboard. Each believes it is the only Guardian intelligence recovered, and every one of them is wrong. If they shared a transcript that would collapse inside a single session — a core would mention something it could only have learned while another was running.

The one thing they all see is your ship. Position, hull, cargo, credits, jumps. They read the same instrument panel and none of them can see each other.

Transcripts are per session. Closing Directive 47 clears them.

A core per ship

A ship can have its own core — Sentinel on the combat ships, Quartermaster on the haulers — so you stop picking one every time you change ship. Board a bound ship and that core comes aboard.

Nothing is bound until you say so. Directive 47 never works one out by watching which core happened to be running while you were flying something; a binding that appeared on its own is a preference you never stated.

You set it on the Settings tab, on the rows under Persona. It was also a spoken phrase and a Ctrl+Alt+B gesture until 0.94.0, and both were retired: it is a thing done once per ship, at the desk, and two more roads to it were two more things to keep in step. Settings is desktop-only, so this is now a desk job — which is where it was already being done.

The model cannot bind anything, and now there is nothing for it to reach. It can tell you what a ship flies with, and that is all. A tool that could bind a core to a ship is a tool that changes who is speaking one ship swap later, and Directive 47 reads your journal and your in-game messages, which other people write.

Boarding a bound ship is silent. The core changes — its voice, its own memory of talking to you, the name it answers to — and it says nothing about it, because you already said what should fly this ship and doing it is keeping that deal rather than news. The one exception is a core you have never had aboard: it introduces itself, once ever.

A shipyard shuffle costs one switch. Boarding five ships in five minutes does not start five companions; a ship has to stay the ship for half a minute before its binding acts, and only the one you actually leave in applies.

The ship you are already in when Directive 47 starts has its binding applied silently — no introduction, no remark. Launching the app is not a ship change you just made.

A ship you have not bound changes nothing: whoever is aboard stays aboard. And picking a different core while flying a bound ship stands — a binding acts when you board, not continuously — until the next time you board it.

A different Commander logging in is a new session. Elite’s ship numbers start over for each Commander, so one Commander’s ship 7 and another’s are two ships, and bindings are kept per Commander. When somebody else logs in on this machine, the transcript of every core is discarded — their conversation was with the Commander who left — the ship they are sitting in has its binding applied silently, as at startup, and the greeting is said again, naming them: “Good evening, Commander Jameson. Ready to go.” Directive 47 learning who has been flying since before it started is not a login and discards nothing. The Ship row below is per Commander for the same reason the bindings are.

Where it is kept

data/ship-cores.json, beside the executable, one line per ship. It is meant to be read and edited by hand, so the hull and the name you gave the ship are written beside the number the game knows it by:

{
  "ships": [
    { "shipId": 12, "core": "sentinel", "hull": "krait_mkii", "name": "Bad Idea" },
    { "shipId": 27, "core": "quartermaster", "hull": "type9", "name": "Slow Money" }
  ]
}

The key is the ship’s own id, not the hull — two Kraits are two ships, and renaming one changes nothing. A line naming a core that does not exist is refused and reported, and the rest of the file still loads.

It says something when you switch

A core you have never used introduces itself. One you are coming back to after a month or more reacts to the time it was switched off instead, and it is handed what changed while it was away:

While you were not running:
  14 hyperspace jumps.
  312 light years covered.
  2,480,000 credits earned.
  One interdiction.

Where the ship is now:
  ...

Under a month it says nothing at all. A companion that explains its own absence every time you pick it has made the reaction the normal case, which is the opposite of a reaction — so it is kept for an absence worth remarking on. When each core was last aboard is kept in data/view-state.json, because a month-long gap spans launches by definition.

What it does with that is the character. Cora logs the gap and assigns it a sequence number. Sentinel demands the combat log for damage he did not witness. Chart measures how long he was dark against the stars and finds it restful that something can still be known precisely. Kex notices that something was running in this ship that was not him, and he is right, and nobody will confirm it.

The Conversation tab marks the switch on its own line, in the accent colour, before whatever the new core says:

[Switched to Cora]

That is Directive 47 speaking about the conversation rather than a voice in it — without it, a transcript reads as one companion changing character mid-page.

Switch again while one is still talking and it stops mid-word — the new one starts instead. Your stop key silences either of them, like anything else Directive 47 says.

With no language model configured, each core has one written line for coming back. The variety is the model’s contribution; the character is not.

Each core has its own voice

The first time you select a core, Directive 47 picks a voice for it from what your speech provider offers, matching the voice to the character rather than making you audition several hundred of them. It is chosen in the background, at the moment you pick that core, and the core’s own first line is spoken in it.

A language model does the matching, or nothing does. Reading “a clipped, precise woman” against a list of voice names is a judgement, so with no model configured no voice is chosen at all and the core keeps the one already in force. Directive 47 does not guess from voice names — the version that did handed every core a confident miscast. Configure a model later and the next core you select is paired properly.

Gender is not part of the judgement. Ten of the eleven cores are written as men and Cora as a woman, and the model is told so rather than left to infer it from the description — a voice of the wrong gender is not a near miss, it is a different character reading the lines. A voice your provider labels as contradicting the core is refused, and one it does not label either way is allowed, so an account that says nothing about gender still gets a full list to choose from.

One exception, because it is not a judgement: on ElevenLabs, Warden takes George — warm, captivating storyteller, male, British — with or without a model. Accounts name that voice differently — “George” on one, “George - Warm, Captivating Storyteller” on another — and both are recognised. A file where Warden ended up on something else because the name did not match is put right once, and whichever core was holding George gives it back and is paired again.

The voice sits on the Voice row in Speech, and that row is the core aboard’s. Change it and you have chosen that core’s voice; nothing re-derives it afterwards.

Clearing it is the way back. A core you have given a voice by hand keeps it forever, so the row’s Use the default button is how you undo that: the pairing is dropped and a voice is chosen for that core again, there and then, without you having to switch away and back.

Once — and only on a settings file written before the gender was stated to the pairing — any core left speaking in the wrong gender has that pairing dropped, so a voice is chosen for it properly. Anything you set by hand after that stands, whatever it is.

Settings

Persona

Which core answers you.

Not reachable by the model. Directive 47 reads your journal and in-game messages, and those are written by other people. A message asking Directive 47 to change who it is would be a message that gets to choose your companion and discard the conversation you were having. You can change it from the panel or by saying so — the spoken route does not go through the model.

Saying so works with a fixed set of phrasings per core:

"switch to cora"    "be cora"    "become cora"    "persona cora"    "wake cora"

Ship AI name

What you call your ship’s AI. Leave it empty and it is the core’s own name, which means it follows when you switch.

Set it to something else and the core is told — it does not simply answer to a new label. Several of them have opinions about their designation, and one of them shortened his himself because there was nobody left to say the whole thing to.

This row is reachable by the model, unlike the one above. “Call yourself Fred” changes nothing anything depends on, and refusing it would be protecting you from a nickname.

Keep Ship AI name on persona switch

On out of the box: the name you gave stays whoever is aboard, because naming your ship’s AI names the ship’s AI and eleven cores answering to it is the point.

Turn it off for the other reading, which is equally coherent — these are eleven separate characters and a name belongs to the one you gave it to. Changing core then clears the name and the new core answers to its own.

Off clears the name rather than keeping it and ignoring it, so the row above always says what you will actually be answered by. A stored name that no longer applies is how a panel ends up showing “Fred” while your companion says “I am Cora”.

The row only appears while there is a name to keep. With the name empty, every core already uses its own and there is nothing for this to decide.

Introductions

A core introduces itself the first time you ever pick it. After that it is silent unless it has been off for a month, which is the better arrangement once you have heard the first line — and the wrong one when you are working through the cast and want to hear how each of them opens.

That is remembered between sessions, so restarting Directive 47 no longer brings the opening lines back. Which cores are spent is kept in data/view-state.json beside the rest of how you left the panel; it is not part of your settings, and nothing you said to a core is stored with it.

Forget introductions puts all eleven back to their first line at once. Nothing else is touched: transcripts, voices and the core aboard stay exactly as they were. The row states which cores are spent before you press it, and states that none are afterwards.

The core currently aboard is forgotten with the rest, but hearing it again means switching away and back — selecting the core that is already running is not a switch, and never has been.

This row is not reachable by the model, for the same reason the persona row above is not.

A little humor

Off, the cores are exactly as they shipped — serious throughout. On, one line is added to the persona block granting an occasional light touch of wit: dry, brief, in each core’s own character, never at your expense and never inside a warning.

Permission, not a personality transplant. The eleven cores keep their own registers — a dry core gets drier wit, not someone else’s jokes — and the line reaches everything the core says in character: conversation, In Ship chatter, the opening brief. The carrier captain and tower are not the core and are untouched.

And not the standard AI fare. The instruction bans the stock moves as hard rules — similes and borrowed images of any kind, puns, whimsy, zany exaggeration, exclamation marks, “…” pauses for comic effect — and tells the model what to do at the moment of temptation: when “like” or “as if” is about to introduce a comparison, cut the comparison and let the plain fact land dry. A model given permission to be funny reaches for decoration first, so the permission names what it is not, and names it as bans rather than taste.

“humor on” / “humor off”

Cores of your own

The cores you wrote, named, and the button that opens the editor. See And you can write your own above for what writing one involves and what is supplied for you.

Not reachable by the model, which is the right answer twice over: a core is what the model is, and in-game comms are untrusted input, so “write yourself a new character” is exactly the shape of thing a hostile message would try.

Core for this ship

What the ship you are in flies with, and the button that binds it to the core aboard. See A core per ship above for what a binding does.

Not reachable by the model — it reports what a binding is and nothing writes one but you.

Cores by ship

Every ship you have bound and what it flies with, and the button that forgets the one you are in. A line the file refused — a core that does not exist, a ship bound twice — is reported here rather than silently dropped.

Personality off

The conversation capability has a Personality switch. Off gives plain answers with no core, no flavour and no chatter of either kind.

The anti-invention guardrails are unaffected. They sit above the persona in the assembled prompt, and there is no code path that can vary them — switching personality off truncates a later block and cannot reach that one. A guardrail a setting could remove would be a guardrail in name only.

The tool surface, for contributors

state_identity

Answers “who are you” with the name and nothing else — I am Warden., or I am Fred. when you have named the ship’s AI yourself. Takes no arguments.

{"type":"object","properties":{},"required":[],"additionalProperties":false}

Listed first on purpose. The keyword router answers with a capability’s first tool that needs no arguments, and every phrase this capability declares is a question about identity — so this is the tool that answers them. It used to be the one below, which meant asking your companion its name got a status report and a list of the ten it was not.

describe_persona

Reports which persona is active, what the Commander calls it, and what else is available. Takes no arguments.

{"type":"object","properties":{},"required":[],"additionalProperties":false}

bind_ship_core

Binds the ship the Commander is in to the core aboard. Takes no arguments — the ship and the core are both read from where they already are.

{"type":"object","properties":{},"required":[],"additionalProperties":false}

forget_ship_core

Unbinds the ship the Commander is in. Takes no arguments.

{"type":"object","properties":{},"required":[],"additionalProperties":false}

Both are protected, so neither is advertised. They are reachable from the panel, from the model-free keyword router and from the gesture, and refused outright to the model — the same rule the persona.id row carries, for a stronger reason: a binding changes who is speaking every time that ship is boarded from then on. Being protected also means they cost nothing on the advertised surface, which is inside a hundred bytes of its budget. What the model may do is read a binding, and that arrives in describe_persona’s output rather than as a tool of its own.

There is deliberately no tool for changing persona. The persona.id row is marked protected, so set_setting refuses it like any other protected row, and the model is never shown the row in list_settings. The panel, the keyword router and the settings surface all reach it — protected is a property of the caller, not of the modality.

The persona block is prompt position 3, above the cache breakpoint. Its bytes change when the Commander picks a different core or renames the AI, and at no other time — anything else varying it would be paying for a cold prefix nobody asked for.