Skip to main content

Under constructionStatus: Building. Being built now. Parts may run; the whole is not finished.

Every project’s status →

01.10Terminal interface

VOX Torch: a terminal view over AI agent work

VOX Torch is AR Labs' terminal interface over its live task graph: portfolio, line of work, single task, what waits on a person, and the agents running.

On this page
  1. What it does
  2. Screens
  3. How it works
  4. Decisions
  5. What exists today

VOX Torch is AR Labs' terminal orchestrator: a terminal interface for seeing all of our work and the AI agents doing it from one screen. An AI agent is a language model run in a loop with tools, so it can act as well as reply. Torch reads our task graph and the records of running Claude Code sessions, and lets a person move from the whole portfolio down to a single task and back, see everything waiting on them, and see which agents are running. It exists because, without it, the only way to know what an agent is doing is to find its terminal window. Torch is the first surface of VOX OS, our design for an operating layer over agent work, and the place where we test orchestration ideas before they move into our browser canvas, Vox Canvas. It is for engineers supervising several coding agents at once.

What it does

We track work in Beads, Steve Yegge's open-source issue tracker for coding agents. Each tracked task is a bead, and beads form a tree with dependency edges between them; all the tasks and their dependencies make up the task graph. A thread in Torch is one line of work: a bead marked as a thread, plus everything beneath it. Each Torch screen is one level of zoom over that tree.

Screen Shows State
Portfolio Every thread on one line: progress, counts by whose turn it is, the next action and the agent on it Built
Thread One line of work: its intent, then a Board grouped by whose turn it is, a Tree of the hierarchy, and a Sequence tab Built
Sequence A kanban for the thread: a column per phase (yours, next and ready, working, waiting, done, not sequenced, parked), cards in recommended order with NEXT marked Built
Item One task: its chain of intent from the root down, its blockers, and an evidence box pairing each claim in its spec with the proof it names Built
Needs you Everything waiting on the person across all threads Built
Agents Claude Code and tmux sessions on this machine Built for one machine
Queue Three lanes: work an agent can take, work waiting on a person, work not yet ready Designed

The screens nest: the Portfolio opens onto a thread and a thread onto a single item, while Needs you and Agents cut across every thread.

FIG. 01
flowchart LR
  T["VOX Torch"]
  PF["Portfolio"]
  TH["Thread and sequenced kanban"]
  IT["Item: intent and evidence"]
  NY["Needs you"]
  AG["Agents"]
  T --> PF --> TH --> IT
  T --> NY
  T --> AG

Screens

The screenshots below are Torch's own exports: Textual, the framework Torch is written in, can save any screen as an image of the terminal. They were taken on 13 November 2026 against live data, with the portfolio set to three threads that hold the lab's own tooling work: Torch itself, Taskgraph and Vox Canvas's map.

Torch opens on the Portfolio. Each thread is one row: a progress bar of finished against all items, counts by whose turn it is, and the next action. j and k (or the arrow keys) move the cursor, Enter opens a thread, n jumps to Needs you, a to Agents and r reloads.

Torch's portfolio screen: three thread rows with progress bars, counts under You, Ready, Working, Stalled and Blocked, whose turn it is and each thread's next action.
The Portfolio: one row per line of work, with whose turn it is and what happens next.

Opening a thread shows a header that stays in place: the thread's intent, the one item to start next, whose turn it is, and the first thing waiting for you. Beneath it are three tabs. b opens the Board, which groups the thread's items by whose turn it is and says why each item is where it is; a one-line key names every glyph. t opens the Tree, the bead hierarchy with closed items included, and h and l step between tabs.

The thread screen for VOX Torch's own work: an intent box, then a Board grouping items under blocked, not in pipeline and parked, with a reason and priority for each.
A thread's Board: the header holds the intent and the next step, and every item says why it is in its group.

s opens the Sequence tab, the thread's kanban as Taskgraph orders it. Each column is a phase (You, Next and ready, Working, Waiting, Done, then work not yet sequenced and work parked), cards carry Taskgraph's step numbers with NEXT marked, and each card shows the stops still ahead of it in the pipeline. Left and Right move between columns, and Enter opens a card.

A kanban in the terminal for the Taskgraph thread: columns You, Next and ready, Working, Waiting and Done, with numbered cards and NEXT highlighted.
The Sequence tab: Taskgraph's order as a kanban, the same order the browser map draws.

The Item screen opens on the chain of intent from the top of the task tree down to the item, so whoever approves a step can see what it is for, then the item's own state, blockers and the command that moves it on (c copies it).

Torch's item screen: an indented chain of parent tasks down to the selected item, marked "this item", then its status, priority, stage and next command.
Why this exists: each item is shown under the chain of goals it serves.

Further down, the evidence box pairs each claim in the item's spec with the proof the spec names, and marks it found, named but missing, or with nothing named. o opens the spec itself.

An evidence box headed "4/7 paired": seven claims from a spec, each with a tick, cross or question mark and the test file or check that proves it.
The evidence box: each claim beside its proof, so a missing test shows before anyone signs off.

Needs you cuts across every thread and lists only what waits on a person, with how long it has waited; Enter opens the item. Escape goes back one screen from anywhere.

Torch's Needs you screen: two rows, each with its thread, item, what is asked of you, title, priority and days waiting.
Needs you: every decision and task waiting on a person, across all threads.

Agents lists the Claude Code and tmux sessions running on the machine, with each one's state. For this picture the list was limited to the sessions working on the lab's tooling.

Torch's Agents screen: six Claude Code sessions with their runtime, state (busy, idle or waiting) and directory, and a note that pointing and messaging agents is not yet wired.
The Agents screen, which says plainly what it cannot do yet.

How it works

Torch is written in Python with Textual, a framework for terminal applications, and packaged with uv. It reads Beads through the bd command, asks Taskgraph for its account of each thread, and reads Claude Code's local session registry. Taskgraph is our tool that works out, for a branch of the task graph, what is finished, what is in flight, what comes next in what order, and where work waits for a person; it prints that as versioned JSON. Torch asks it once per thread at load, all threads at once, so the kanban and the turns come from one snapshot.

The figure, shared with the Taskgraph page, shows where Torch reads from beside the other views: Beads directly, Taskgraph's JSON for order and status, and the session records for its Agents screen.

Taskgraph reads Beads, git and the manifest and feeds its SVG map, VOX Torch and Vox Canvas; Torch and Canvas also read Beads and session records; the goal map reads a sweep of agent sessions. Three views of the task graph, and the goal map, and where each reads from. Beads, the task graph, is read through the bd command-line tool. Taskgraph, a read-only command-line tool, reads Beads together with git, GitHub and the pipeline manifest, and derives each item's phase, the order of work, the next action and every point that waits for a person. It draws its own SVG map and prints versioned JSON that VOX Torch (terminal) and Vox Canvas (browser) draw from, so all three show one interpretation. Torch and Canvas also read Beads directly and read agent session records; Canvas can edit a bead's fields, never its pipeline state. The goal map does not read the task graph: a background sweep agent reads the session records of Claude Code, Codex and the resident agents, and the goal map places that work around the month's goal and priorities. Three views of the task graph, and the goal map TASKGRAPH WORKS OUT THE STATE ONCE · THE TERMINAL, THE BROWSER AND ITS OWN MAP DRAW THE SAME ANSWER FIGURE TASK-GRAPH VIEWS DRAWN BY AR LABS SHEET 1 / 1 Agent session records [Claude Code, Codex, resident] Taskgraph map [SVG] Timeline with a NOW line VOX Torch [Terminal · Python, Textual] Portfolio, thread, kanban, needs-you, agents Taskgraph [CLI · read-only] Derives phase, order, NEXT and human stops; prints versioned JSON Vox Canvas [Browser · React Flow] Tree, map and agent modes Beads [via bd CLI] git, GitHub [+ manifest] Sweep agent [Background agent] Writes what each session works on and waits for Goal map [Interactive page] Projects on a spiral around the month's goal; agents as moons The goal map does not read the task graph. It places agents on priorities from a sweep of their sessions. KEY Taskgraph's one interpretation Task data, through bd Agent session data draws status JSON layout JSON reads reads reads directly reads edits fields (never pipeline state) agents screen agent mode reads sweep JSON
Where Torch reads from: Beads directly, Taskgraph's one interpretation, and the records of agent sessions.

Torch stores nothing. It is a view plus, later, actions that write back through Beads and through the commands of our coding pipeline, the route every code change takes (spec, test-first build, second-model review, a person's merge). Beads has no field for whose turn it is, and none is added; the turn is derived each time. Where Taskgraph covers a bead, the turn is Taskgraph's. Where it does not, Torch falls back to its own rules from the bead's status, its open blocking dependencies and its pipeline metadata, and marks each such value with ~ so the reader knows it is an inference. Work that Taskgraph says is in progress but that nobody has touched for more than three days shows as stalled.

Two rendering rules apply everywhere: an empty screen is not the same as a healthy one, and unavailable data is not the same as no data, so a screen that cannot load says so; and every derived cell names its basis.

The Item screen carries what we call holding intent. It shows the chain from the root of the tree down to the task, so a person approving a step sees what the step is for. Each spec's claims are paired with the evidence it names: found, named but missing, or no file or test named. A plain-text dump of the portfolio, needs-you queue and agents is available for logs and tests, and a script renders every screen headless to SVG for checking without a terminal.

Decisions

  • One interpretation of order. Torch once worked out its own wave view and a drawn dependency graph. Both were retired in October 2026 in favour of rendering Taskgraph's model, because two derivations of the same facts drift apart. The retired tabs were parked on branches, not deleted.
  • tmux owns the agents. Any window tool is only a view onto tmux, so agents stay reachable by hand if the window tool fails.
  • Dispatch from a thread's kanban. When launching is built, it happens at a thread's level, with agents overlaid on the work, the number running against a cap, warnings where two tasks touch the same files, and each task's readiness.
  • Pipeline runs through the pipeline's own verbs. Torch may start the coding pipeline's headless runner for a chosen list of tasks, with every write going through the pipeline's commands, so it never writes pipeline state directly. This is decided and not yet built.

What exists today

Torch is a working read-only prototype that we use on our own work against live data, in a private repository with checks for navigation and the kanban that run against fixtures. Not built: launching agents, messaging agents, sessions on other machines, and any write to Beads. The Queue screen is designed. Launching agents also waits on a decision about our agent model: whether workers keep a persistent role or start fresh for each step.