How to use it

Off unless D47 is started with --utilities. Then one step to timers that say their own name.

1 Set a timer, and give it a name.

Start D47 with --utilities, then say "set a timer for twenty minutes called fuel scoop".

D47 confirms the timer, and when it goes off it says its name instead of beeping.

set a timer for twenty minutes called fuel scoop Ask When it goes off it says the name rather than beeping. "how long left on the fuel scoop timer" — "cancel it"

! The one that stops people.

Keep D47 running until the timer ends.

The timer fires; closing D47 cancels any timer still running.

Timers live with D47, not with Elite. Close D47 and a running timer goes with it. They are for this session, not for next week.
Why it works this way

Timers and alarms that say their own name.

1 A timer is a stretch. An alarm is a moment.

TIMER forty minutes for the mining run a stretch of time ALARM seven in the morning a single moment gone if D47 restarts survives a restart Half of forty minutes through a crash is a question nobody can answer, so it is not asked.

2 One it could not sound, it owns up to.

07:00 due, and D47 was closed “That alarm was due at 07:00 and I was not running. I have not sounded it since.” Told at the next start, with when it was due. Sounding it hours late as though nothing had happened would be worse than not sounding it. A chime says something finished; the name says which.

Cancelling is reachable by saying so, and from nowhere else — the AI is not offered it and is refused if it asks. Naming one that matches nothing, or two, is answered rather than guessed at: cancelling the wrong alarm of two is worse than being asked which.

The details

Timers and alarms that say their own name.

Off unless you turn it on

Timers and alarms are not part of a normal run. Start Directive 47 with --utilities on the command line, or with the environment variable D47_UTILITIES=1 set, and everything on this page is there for that run. Nothing is saved to settings, so the next run without the switch is back to off.

Without the switch none of it exists: no timer or alarm tools, none of the phrases below, and alarms.json is not read. Asking the date or the time works either way; that is the Clock.

Ask for it

“set a timer for forty minutes for the mining run” “wake me at 07:00” “cancel the mining timer”

Cancelling needs no AI configured at all.

Timers and alarms

A timer is a stretch of time — forty minutes for a mining run. An alarm is a moment — seven in the morning.

They are set by saying so, and they are named, because the name is how Directive 47 tells you which one finished.

What happens when one goes off

A short rising chime, and then Directive 47 says the name. One clip for all of them rather than a tone per timer: the sound says something finished and the sentence says which, which the voice does better than a chime ever could. It goes through the same audio arbiter as everything else, so it either waits for a sentence to end or lands on top of it according to the same rules.

Alarms survive a restart. Timers do not.

An alarm for 07:00 is a promise about a wall-clock moment that outlives the process. A forty-minute timer through a crash is a question nobody can answer — half elapsed, or start again? Neither answer is right, so it is not asked.

An alarm that could not sound says so afterwards. Directive 47 cannot fire while it is closed, so an alarm that came round in the meantime is reported the next time it starts, with when it was due:

Wake up: that alarm was due at 07:00 and I was not running. I have not sounded it since.

Sounding it hours late as though nothing had happened would be worse than not sounding it at all.

The file

Alarms live in one file beside the executable, and it is yours to edit:

{
  "alarms": [
    {
      "id": "8f2c1e40b7a94d2f",
      "name": "Wake up",
      "due": "2026-08-18T06:00:00+00:00"
    }
  ]
}

Edited by hand, it takes effect without a restart. A line the file gets wrong is reported rather than silently dropped — an alarm somebody relies on to leave the house is not a thing to lose silently — and the rest of the file still loads.

Cancelling is yours

Not offered to the AI, and refused if it asks. Cancelling is reachable from the phrases above, and from nowhere else. Protected is about who is asking rather than how — so saying “cancel the alarm” works, and a hostile message arriving in your comms panel cannot reach one.

Naming one that matches nothing, or matches two, is answered rather than guessed at. Cancelling the wrong alarm of two is worse than being asked which.

The tool surface, for contributors

set_timer

Start a countdown that says its own name when it finishes. Minutes, from the moment it is set. Timers do not survive D47 restarting; use an alarm for a wall-clock moment.

{"type":"object","properties":{"minutes":{"type":"number","description":"How long, in minutes."},"name":{"type":"string","description":"What to call it. Said back when it finishes."}},"required":["minutes","name"],"additionalProperties":false}

Advertised, unlike the rest of this capability, and the asymmetry is the point: a duration arrives as English — “about forty minutes”, “an hour and a half” — which is the one thing a model does better than a closed grammar, and the keyword router cannot extract an argument from free text without starting to guess.

set_alarm

Set an alarm for a wall-clock time today or tomorrow. Alarms survive D47 restarting, and one that came round while D47 was closed is reported afterwards rather than sounded late.

{"type":"object","properties":{"at":{"type":"string","description":"Local time for the Commander, as 24-hour HH:mm."},"name":{"type":"string","description":"What to call it. Said back when it goes off."}},"required":["at","name"],"additionalProperties":false}

“Seven in the morning” said at nine in the evening means the seven that is coming rather than the one that went, so a time already past today is set for tomorrow rather than refused.

cancel_reminder

Cancel a timer or an alarm by name. The Commander’s own act: not offered to the model, and refused if it asks.

{"type":"object","properties":{"name":{"type":"string","description":"Which one. Omit to cancel everything running."}},"required":[],"additionalProperties":false}