DEVON

Control plane

Every panel says where its numbers come from. A panel marked as having no route is waiting on a backend read, not broken, and it shows nothing rather than a placeholder. Agents recommend and humans decide here as everywhere: nothing on this page approves a write.

Tier 1

Sovereign Admin

Who is running, what they are allowed to touch, and whether the record of what happened can be trusted.

Agent readiness

Partly sourced

Every agent task and the state its events put it in, with the risk class of the tools it can reach.

Task states and tool risk classes are read from the API and the generated Hermes surface manifest. Latency and load balancing are not built, so no agent is ranked here.

DEVON agent readiness

Task state and tool risk matrix

Rows from GET /agent-tasks. Risk from GET /agent-tasks/tools, falling back to the 20 tool manifest pinned in docs/devon/hermes-surface.json.

reading

Reading the task list

No rows are shown while the request is open. A blank matrix here would be a guess.

Agent roster

Fully sourced

What each Council agent declares it is for, what it says it cannot do, the shape it promises to answer in, and how it asks to be judged.

Read from GET /agents and, per row on demand, GET /agents/{slug}. Both were complete and had no caller under apps/web until this panel. Capability counts read 'not read' rather than 0 until the detail route answers, because the list route sends no arrays; and is_active is only called a measurement on the detail route, because the list route filters on that very field.

ROSTER READING

The list route has not answered yet. Nothing is claimed about the roster while the request is in flight.

Read only, by construction. The registry is Python module level code in services/agents/registry.py rather than a table, so there is nothing on this surface to edit and no effect for it to run. Expanding a row issues GET /agents/{slug}; nothing else is sent.

Ledger provenance

Fully sourced

Whether an intent's history is hash chained end to end and whether a signed receipt certifies exactly that chain.

Read from the provenance route added in migration 019. A chain that is intact but incomplete is receipted on trust, and the card says so rather than showing it as verified.

Live State Ledger

Provenance verdict

No intent selected.

Give the card an intent id and it verifies that intent's hash chain and receipt. Nothing is read until then, so this is not a claim that any chain is sound.

No route lists an owner's intents, only a read of one by id, so this asks for the id instead of offering a picker it cannot populate. The last id is remembered on this device only.

Skill proposal gate

Fully sourced

The drafts DEVON wrote for itself from finished work, and the human ruling on each one.

Read from the skill proposal routes on the agent expansion surface. Every field shown comes back from that read. Approving a draft and activating a skill are two separate rulings and the panel sends them as two separate values, because the API defaults promotion to on when the key is left out.

Reading the skill proposal queue.

Decision record

Fully sourced

Every question the Council was asked, and the human final call on it.

Read from the decision routes. Until this panel existed nothing under apps/web called any of them, so a ruling made on the deliberate page lived in one browser tab and a reload discarded it. A failed read is drawn as unreadable, never as an empty record, and an exchange whose tracked state could not be read says so rather than reading as not recorded. Recording a call writes to the decision record only: no tool runs from here.

Reading the decision record.

Put a Council exchange on the record

POST /decisions/from-message takes the synthesis of one assistant turn as the recommendation and its recommended actions as the options, and leaves the final call open for you. Reading your conversations is a separate request, so it is made only when you ask for it.

Security shell and secrets

Partly sourced

The two doors that can execute, and where secrets do and do not live.

Both shells are live and predate this arc, so this panel points at them rather than embedding a PTY inside the control plane. There is no secret vault, by design, and whether one should exist is a ruling rather than an omission.

The shell is not embedded here on purpose. A bug on this page should not be able to reach a shell on the API container, so the door stays its own route behind its own second factor.

A per request signature over the command body is not built. The gate is two factors at connect time, and calling that a signed request would overstate it.

There is no secret vault, no ephemeral password generator and no injection into executors. That is deliberate: every key lives in the environment and the API refuses to start in production on a public default. Whether a vault should exist at all is a ruling for Tee rather than something to add quietly.

Tier 2

Cognitive Hub

The face and voice, and the memory behind them.

Presence

Partly sourced

The avatar driven by blendshape frames over the presence socket, with client side barge-in.

Frames, the sliding window buffer and the interrupt path are real against the presence service. Cartesia is reached and proven: Tee heard his own cloned voice on 2026-09-09, 113 frames sent and received with none dropped, ten audio chunks scheduled and none late or undecodable. LiveKit is still not configured and this build publishes no audio into a room, so the socket carries the voice. The face is a procedural placeholder until an owned rig exists.

Loading the stage

Projects

Fully sourced

The scope every other read can be narrowed by, and the only place to create or rename one.

Rows, counts and every field shown come from GET /projects, and creating and renaming go to POST /projects and PATCH /projects/{id}. Until this panel existed nothing under apps/web called any of them, so the project_id the knowledge routes and the graph route filter on could only ever be null. A failed read is drawn as unreadable, never as an empty list, and a 200 carrying rows with no usable id is drawn as neither. Archiving is accepted by the patch route and is deliberately not offered here.

Reading the project list.

A project is a scope, not a container: creating one moves nothing into it. The knowledge routes and the graph route accept a project_id and filter on it, so a project only starts doing work once something is filed against it. Archiving is a separate ruling and is not offered here, though an archived project still shows its status above.

Knowledge

Partly sourced

The corpus DEVON recalls from, a search that runs against it, and the measured distances between its items drawn as a graph.

Items, the source breakdown and search come from the knowledge routes. The graph below reads GET /knowledge/graph, whose distances are pgvector cosine distance, the minimum over each pair of items chunks. The first attempt at this panel was PULLED on 2026-09-10 for reading a payload shape the route does not send and stating a measurement over a query that had not run; it ships now with its fixtures generated from the route itself, so the two cannot drift apart again. It still refuses to call a simulated or unavailable embedding real, and it names every cap that bit.

Reading the corpus.

Distance here is the raw distance the search route returns, where smaller is nearer, not a confidence score. The distances between the items themselves are drawn in the knowledge graph panel below, read from GET /knowledge/graph, and this panel says nothing of its own about how close any two items are.

Nodes are knowledge items, coloured by source. A line means the two items sit inside the route's distance threshold, drawn thicker and brighter the nearer they are. Every distance below is the number the route returned, not a similarity score derived from it.

Reading the graph.

Read once on mount. Nothing here polls, so what you see is the answer to one request.

The layout is deterministic: nodes are sorted by source, then by degree, then by created date, then by id, and placed on a ring. Every item drawn here has the same number of edges, so the ring is flat and how far a mark sits from the centre means nothing. The same payload always draws the same picture, so two readings can be compared. A short line does not mean two items are near each other in vector space. Only the printed distance says that.

Learning

Fully sourced

The memories and skills every agent plan is handed, and the only place to write one.

Rows and counts come from the two learning routes. Until this panel existed nothing in the estate wrote to either table, so the store was empty by construction. A failed read is drawn as unreadable, never as empty.

Reading the learning store.

Memories and skills are inspectable, replaceable and deletable by design, and this panel is the only writer in the estate. Skills are shown read only here: a skill is created by promoting an approved proposal or by the skills route, both of which are human gated, so this panel does not offer a shortcut past that gate.

Long term memory

Fully sourced

Everything stored about you that the Council can recall, and the only place to write, edit, pause or destroy one.

Rows and every field shown come back from GET /memory. The four routes were finished and tested before this panel and nothing under apps/web called them, so the Council's own memories about the owner accumulated where the owner could not read them. DELETE on that route is a hard delete, so deleting here is a two step ruling and the panel names what would be lost. A failed read is drawn as unreadable, never as empty.

READING MEMORY

The request to the memory route is in flight. Nothing is claimed about the store until it answers.

Importance is a real multiplier on recall, not a label: the score is the shared word count times importance over ten times a decay of about 30 days, and the top 5 reach the answer. The value shown above is the value sent.

Not read yet.

These rows are not all yours. The Council writes memories about you after an exchange and stamps them as its own, so this panel is where you find out what it decided to keep. Nothing here approves a write anywhere else in the estate, and nothing here runs an effect: every request is one you pressed a button for, against your own account.

Tier 3

Execution and Pipeline

What the estate is spending, and what is running outside this repository.

Workflows

Fully sourced

The automation engine, the runs it has made, and the human ruling on every step that would write something.

Read from the six workflow paths. Until this panel existed nothing under apps/web called one of the engine's ten operations, so a workflow could not be composed and the approval gate the engine is built around had nobody standing at it. The payload a gate would write is rendered in full and its sha256 seal is sent back with the approval, so the server refuses a ruling given over a payload the run has since moved past. A gate the API reports as diverged carries no approve control at all.

Reading the workflow list.

Reading the step catalog.

The composer is closed because the step catalog is not readable. Which steps stop for a ruling is that route's answer, and this panel will not offer step types it has not been told about.

Runs are started here by hand. A run reads and reasons unattended and then stops in front of every step that writes something, and this panel is the only place in the estate where that stop can be answered. Approving one is a ruling on the exact payload printed above the buttons, and the hash of that payload is sent with the approval so the server refuses it if the run has moved on.

Token budget and cost

Fully sourced

Today's spend against the hard cap that refuses at 429.

Read from the usage route over the provider usage ledger. Warning thresholds are not built, so nothing here claims a warning was sent.

Reading today's usage.

n8n operations

Partly sourced

Execution telemetry, retries, queue depth and version sync against GitHub.

GET /n8n/executions reads the configured instances, so recent executions and failure counts are sourced. Retries, queue depth and version sync are not built and are not drawn. Any plan cap is stated by configuration and the spend against it is estimated from the execution id gap, never measured, and is refused entirely when the ids of a window contradict its clock. No date is projected: every date on this tier is observed from an execution row or stated by configuration. Workflow names are NOT in the executions response, so a row is labelled by its workflow id and says so.

Reading the configured n8n instances.