Kernl

0.3.0 · · Release on GitHub

Kernl 0.3.0: Everything an Agent Is, in One Drawer

Kernl's 3D office with several agents in a meeting and the LIVE conversation panel

Everything that defines an agent in Kernl — its mandate, its runtime, its tools, its skills, what wakes it up — used to be spread across a panel welded into the 3D world and a second, half-duplicated panel on the agents page. This release pulls it into one drawer that both pages mount, and then spends most of its commits filling that drawer in.

One panel, mounted in two places

The agent drawer was extracted out of the 3D world into its own shell, with its own store, and it now mounts on the agents page as well. Its tree carries the mandate, the default goal, the allowed tools, the variables, the appearance and the runtime. That last one matters: the runtime is editable from the panel itself, rather than from a settings page three clicks away.

Connections, schedule and event triggers became a single triggering section. They were three different places to answer one question: what starts this agent.

Skills that recommend themselves

Every agent now has its own skills tab, where suggestions, installation and attachment happen in one place. Suggestions are served over HTTP from a scoring core lifted out of the suggester cron, and catalogue skills are scored alongside the ones the agent already has installed.

That difference isn't cosmetic. The ranking now answers what should this agent learn next instead of what does it already have.

Skills can also be added from a repo URL without leaving the tab. For script agents, which cannot use skills, the tab simply doesn't appear.

MCP connections from the dashboard

Add an MCP server, sign in, and have it stay working. Before, that meant editing a config file and restarting.

This release also adds in-app update on Linux and Windows — macOS already had it — and the Windows installer now bundles the agent and MCP SDKs, so a fresh install can run an agent without a separate toolchain.

Signed and notarized, in the right order

macOS builds are signed and notarized, and the order was the part that was wrong. Every nested Mach-O is now signed before the bundle that seals it, the .app is notarized and stapled before it enters the disk image — so it opens with no network — and the portable tarball is repacked from the signed bundle instead of the unsigned one written minutes earlier.

The job also fails when the six Apple secrets are only partly set. It used to ship a signed-but-un-notarized app, which Gatekeeper rejects exactly like an unsigned one. A release built without the secrets is still unsigned, but it says so.

What was broken and invisible

  • The store's update button did not update. It reported success anyway.
  • Every mcp__kernel__* tool was missing from claude_code runs. The kernel's HTTP API is fail-closed and the MCP server reached it with no Authorization header, so /mcp answered 401 and the server never finished initializing — silently. The agent started regardless, found only its built-ins, and improvised. It now presents the token the process already holds.
  • A failed run left the chat thread silent. The panel fell back to the run row only when the thread held no agent message at all, so from the second failure onward the failure vanished entirely: the operator saw their own message, no reply, and no error. The reason is now persisted and rendered as a line that names the control which actually fixes it. A step budget that ran out says which setting moves it, rather than "Reached maximum number of turns (15)".
  • Every animated event tag was dead. The icon never carried the class its keyframes hang off, and the keyframes were referenced by a name Svelte had already rewritten. Pulse, spin, shake, wobble, bounce, sparkle and pop had never once played.
  • Array and object arguments an executor had serialised into strings are recovered, instead of reaching the tool as "[object Object]".

The "thinking" indicator changed too. It was a ⚙️ glyph spinning over the agent's head, and at office camera distance a rotating glyph reads as a vibrating speck. It is now three dots breathing in sequence inside the nameplate, in the agent's flow colour.

How to upgrade

curl -fsSL https://lifekernl.com/install.sh | sh

The same command installs and updates. On macOS and Windows the update runs from the app. Full detail is in the CHANGELOG, and signed rpm, deb, dmg and msi binaries are on the release page.

Changelog

Everything an agent is — its prompt, its runtime, its tools, its skills, what wakes it up — used to be spread across a panel welded into the 3D world and a second, half-duplicated panel on the agents page. This release pulls it into one drawer that both pages mount, and then spends most of its commits filling that drawer in.

Added

  • The agent drawer. A single panel, extracted out of the 3D world into its own shell with its own store, mounted on the agents page as well. Its tree carries the mandate, the default goal, allowed tools, variables, appearance and the runtime — the runtime being editable from the panel itself rather than from a settings page three clicks away.
  • A skills tab per agent that recommends, installs and attaches in one place. Suggestions are served over HTTP from a scoring core lifted out of the suggester cron, and catalogue skills are scored alongside the ones already installed, so the ranking answers "what should this agent learn next" instead of "what does it already have".
  • Skills from a repo URL, added without leaving the tab.
  • MCP Connections from the dashboard: add a server, sign in, and have it stay working, instead of editing a config file and restarting.
  • In-app update on Linux and Windows, with progress. macOS already had it.
  • A verdict on failed agent runs, leading the panel, with each failure mapped to the control that actually fixes it.
  • Model chains convert between the panel's list and the agent's columns.
  • Tool-loop capability is reported in the LLM provider status, so a provider that cannot drive a tool loop says so before an agent is pointed at it.
  • Watch the creative office draw, from the agent drawer.
  • macOS builds are signed and notarized, in the right order. Every nested Mach-O is signed before the bundle that seals it, the .app is notarized and stapled before it enters the disk image — so it opens with no network — and the portable tarball is repacked from the signed bundle instead of the unsigned one written minutes earlier. The job now fails when the six Apple secrets are only partly set, rather than shipping a signed-but-un-notarized app that Gatekeeper rejects exactly like an unsigned one. A release built without the secrets is unsigned as before, and says so.
  • Host support for headless rendering, for the Blender bridge that ships as an extension. The kernel image carries the libraries a render needs with no display — libEGL above all, whose absence killed a job after it was queued and the scene was built — and a rendered frame can be shown with <img src> through ?auth=, which cannot set a header. The allowlist stays one route wide: the job listing beside it still refuses a token in the URL.

Changed

  • The dashboard opens signed in on every platform. The token handoff worked on one and left the others at a login screen for an instance the user had just installed themselves.
  • Connections, schedule and event triggers are one "triggering" section. They were three places to answer one question: what starts this agent.
  • The Windows installer bundles the agent and MCP SDKs, so a fresh Windows install can run an agent without a separate toolchain.
  • The skills tab is hidden for script agents, which cannot use skills, and the drawer is translated.
  • The README leads with the agent office and a live instance count.
  • The duplicated agent skills panel is gone.
  • The "thinking" indicator lives in the agent's own tag. It was a ⚙️ glyph spinning over the agent's head — at office camera distance a rotating glyph reads as a vibrating speck. It is now three dots breathing in sequence inside the nameplate, in the agent's flow colour.

Fixed

  • The store's update button did not update. It reported success.
  • Every mcp__kernel__* tool was missing from a claude_code run. The kernel's HTTP API is fail-closed and the MCP server reached it with no Authorization header, so /mcp answered 401 and the server never finished initializing — silently. The agent started regardless, found only its built-ins and improvised. It now presents the token the process already holds.
  • A failed run left the chat thread silent. The panel fell back to the run row only when the thread held no agent message at all, so from the second failure onward the failure vanished entirely: the operator saw their own message, no reply, and no error. The reason is now persisted the way the native executor does it, and rendered as a line that names the control which actually fixes it — a step budget that ran out says which setting moves it, rather than "Reached maximum number of turns (15)".
  • Every animated event tag was dead. The icon never carried the class its keyframes hang off, and the keyframes themselves were referenced by a name Svelte had already rewritten — so pulse, spin, shake, wobble, bounce, sparkle and pop had never once played.
  • Array and object arguments an executor had serialised into strings are recovered instead of reaching the tool as "[object Object]".
  • The Google re-auth detection matched Claude Code SDK errors and demanded a re-login that fixed nothing; it now matches the kernel's own error signatures.
  • Model-chain coercion turned non-string values into undefined rather than strings, and now uses an explicit empty-string sentinel.
  • The drawer store: stale seed(), per-field patch rollback, in-flight fields overwritten when the drawer was re-seeded, writes not reconciled against the saved row, and a leaked menu listener per open.
  • Skill status classification, the unknown-cost display, and tokenization of accented text.
  • Chain controls stay disabled while the chain is being written.