Runtimes

KernelHub does not include a model. It drives a CLI coding agent you installed yourself. Whichever one you pick, grants are checked in the same place: every write, edit and exec goes through KernelHub's built-in Tool Server, against your grants and the workspace boundary.

Required first: Node.js LTS (it ships npm). Runtimes are installed through npm — the default claude, and codex, qwen, codebuddy, opencode, kimi, mimo and pi. Check that node -v and npm -v both print a version before installing KernelHub; its installer does not install Node for you. The exception is agy (Antigravity), which comes from Google's own channel.

Choosing one

If a supported agent is on your PATH, KernelHub finds it. To pin one:

$ icloser run --runtime-kind claude

Valid kinds: claude · codex · agy · qwen · codebuddy · opencode · kimi · mimo · pi · ohmypi · acp · mcp · generic.

Google's runtime here is agy (Antigravity). The kind gemini is still accepted — its adapter is kept, not deleted — but it is retired: Google no longer ships a gemini CLI you can sign in to and use on its own.

Granted is not enforced

Two different things. What a grant allows is decided where the action happens: every write, edit and command the runtime asks for goes through KernelHub's built-in Tool Server and is checked against your grants and the workspace boundary before it runs. Whether a tier is also held by something that does not rely on that path — a verifiable switch on the runtime's own command line, or the optional OS boundary around its process — is a separate question. If nothing can prove it for one of the six, that runtime is marked NOT_READY. That is recorded, not a stop: it still takes work.

Which runtime holds which tier is not repeated here. The table on the home page is built by asking the live registry runtime by runtime, tier by tier, so it moves with the code. A second copy written by hand would drift from it, and swapping runtimes on the strength of a stale copy buys you nothing.

What KernelHub does about it

Routing skips a runtime only when it genuinely cannot take the task — not installed, will not start, cooling down after a quota error, or already failed on this task. One kind of task also looks at the tiers: if it would delete or move data, a runtime that can hold a deny list goes first; if none on the machine can, the task stops at a boundary card before anything is deleted and asks you to release that one run.

Switching mid-task

If the chosen agent runs out of quota or refuses a command it was authorised for, the task can be handed to another agent and continue as the same task, keeping its history and its diff.

What icloser runtimes shows you

It answers three questions this machine could otherwise only answer by reading source: which runtimes are installed, which version each one is, and what each one can do. It only ever runs --version — it burns no model quota and touches no workspace credential, so it also answers on a machine you have not set up yet.

$ icloser runtimes
$ icloser runtimes --json # scripts read this — do not grep the table headers
$ icloser runtimes --explain claude # why every cell says what it says

The six states, and the three that must not be folded into them

The state word is printed verbatim by the CLI, so it reads the same in every language. The order below is the order the probe decides in: it reports the first step you can still take.

StateWhat it meansTakes workYour next step
NOT_INSTALLEDThis machine has no such executable on PATH.no
hard — not even tried
Install it. If the reason line names a path, the package is on the machine but never got linked onto PATH — installing it again will not help.
INSTALLED_NOT_STARTABLEThe file is there, but it will not start — a half-finished install, a missing payload, a broken permission bit.no
hard — not even tried
Reinstall that runtime. Note that --version can still answer in this state, which is exactly why it is not folded into a healthy one.
STARTABLE_NOT_AUTHENTICATEDIt starts, but it is not signed in on this machine, or the credential it wants is not configured.no
soft — the router still lets it fail with the runtime's own message
Sign in with that runtime's own command, in your own terminal. KernelHub never holds a model API key — it uses the session you already have.
TOOL_CHANNEL_INCOMPATIBLEIt cannot be handed the built-in tool server on its command line. Signing in does not fix this one — it is a property of that CLI.yesNothing to do. It still takes work that needs no tool channel; work that does gets routed elsewhere.
AUTHENTICATEDStarts, credential is there, tool channel attaches. There is no evidence that it answers right now — a key can be expired, a provider can be rate-limiting.yesNothing required. Want the harder answer? icloser runtimes --verify really asks the model once.
HEALTHYHard evidence that it takes work right now — something actually asked it and got an answer back.yesNothing. Only --verify can put a runtime here; without it the best a runtime reaches is AUTHENTICATED.
STARTABLE_AUTH_UNKNOWN
Not one of the six — do not read it as a variant of them
It starts, but the sign-in state cannot be read. We neither guess an OK nor accuse it of being signed out.yesNothing forced. It is still dispatchable — treating "cannot tell" as "no" would idle a machine that can work.
USER_SUPPLIED
Not one of the six — do not read it as a variant of them
You named the executable yourself with --runtime. "Is it installed" is not a question that applies.yesNothing. This is the door for a runtime KernelHub has never heard of.
NOT_APPLICABLE
Not one of the six — do not read it as a variant of them
A protocol entry (acp / mcp). It does not correspond to any one executable, so probing it means nothing.yesNothing. This is not "broken" — it is a different kind of thing.

Scroll the table sideways for the next step →

"Takes work" is a property of the state, not of the task. Whether a particular task needs the tool channel is decided separately, per task — a pure conversation is perfectly fine on a runtime marked TOOL_CHANNEL_INCOMPATIBLE.