EN | JA | ZH | PT | ES | KO

April 10, 2026

Live Mode: The TUI That Watches Your Agents So You Don't Have To

Ten agents. Four grid slots. The operator manually cycles through panes with Alt+arrow keys, checking who's working, who's idle, who just finished. Every ten minutes, the same ritual. It does not scale.

Live mode fixes this. It comes in two flavors. live 2x3 gives you a fixed grid where dynamic slots rotate agents in and out. live auto goes further: the grid itself grows and shrinks based on who's actually working.

$ live auto

That command enters Live Auto mode. The screen starts empty and adds panes as agents become active. Or hit Alt+5 to toggle it. For a fixed grid with rotation, use live CxR (e.g. live 2x3).

Fixed grid: what the screen looks like

A 2x2 grid with super pinned to slot 0 and pm pinned to slot 2. The other two slots are dynamic:

+------------------+------------------+
| super (pinned)   | eng1 (active)    |
|                  |                  |
+------------------+------------------+
| pm (pinned)      | qa1 (active)     |
|                  |                  |
+------------------+------------------+

When eng1 finishes and eng2 starts working, the slot swaps automatically:

+------------------+------------------+
| super (pinned)   | eng2 (active)    |
|                  |                  |
+------------------+------------------+
| pm (pinned)      | qa1 (active)     |
|                  |                  |
+------------------+------------------+

The operator never switched a pane. The screen just shows where the work is.

The hard problem: not flickering

Naive activity-based rotation is unwatchable. Agent eng1 prints three lines, goes idle, eng2 wakes up, eng3 sends a brief error. Without protection, the dynamic slots flicker between agents faster than you can read anything.

The question is not "who produced output recently?" It's "who is genuinely working and worth watching right now?"

initech answers this with conviction scoring.

Conviction scoring

Each agent gets a numeric score based on five signals. Higher score means more confidence that the agent is doing real work.

Signal                   Weight    Why
-----------------------------------------------------
Bead assigned            +30       Claimed work = explicit intent
Received dispatch        +25       Someone just sent it a task
Active > 5 seconds       +20       Sustained output, not a blip
Output > 10KB            +15       Volume correlates with real work
Recent semantic event    +10       Completion, error, or claim detected

An agent with a bead and sustained activity scores 65. An agent that printed three lines and went quiet scores 20. The screen shows the agent scoring 65.

No single signal drives swaps. A dispatch alone (+25) won't steal a slot from an agent with a bead and activity (+50). But dispatch plus sustained output (+60) will. The signals combine, and the math is predictable.

Anti-thrashing

Conviction scoring decides who to show. Two mechanisms decide when to swap.

Hold time

Once an agent appears in a dynamic slot, it stays for at least 15 seconds regardless of score changes. This gives the operator time to read the pane content before it rotates out.

eng1 appears in slot 1 at T=0
eng2 becomes highest-scoring at T=3  -> BLOCKED (12s hold remaining)
eng2 still highest at T=16           -> ALLOWED (hold expired)

Hysteresis

The threshold to claim a slot is higher than the threshold to keep one. An agent needs a score of 40 to take a slot, but only 10 to hold it.

This means an idle agent that still has a bead assigned (score 30) keeps its slot once shown. It's below the 40 claim threshold, so it couldn't take a new slot. But it's above the 10 keep threshold, so nothing bumps it. The operator sees a natural, stable rotation instead of constant churn.

Pinning and manual override

Pin an agent to a specific slot and it never rotates out:

$ pin super 0
$ pin pm 2

Unpin a slot to make it dynamic again:

$ unpin 0

You can also pin from the agents modal: select an agent, press a number key to assign it to that slot. Alt+z still zooms any pane full-screen, temporarily suspending rotation. Switching to a static grid (grid 3x3) exits live mode entirely.

Live Auto: the grid that sizes itself

With live 2x3, you pick the grid size and agents rotate through those slots. Live Auto removes that choice entirely. The grid starts empty. As agents become active, panes appear. As they go idle, panes disappear. The grid reshapes itself to fit whatever's happening.

$ live auto

Three agents working? You see a 3-pane layout. One finishes and two more start? The grid grows to four. Everyone goes idle after a deploy? The screen collapses back down. The status bar shows Live Auto (N) where N is the current visible count.

The anti-thrashing rules apply here too. Agents need a conviction score above the keep threshold to appear. Hold time prevents panes from vanishing the instant an agent pauses. And the grid changes by one pane per render tick, not all at once, so the layout animates smoothly instead of jumping between sizes.

Pinning works the same way. A pinned agent stays visible regardless of activity. The grid can't shrink below the number of pinned agents.

Use live auto when you don't know how many agents will be active at any given time. Use live CxR when you want a stable grid size with rotation. Alt+5 toggles Live Auto on and off.

Configuration

Live mode works out of the box with defaults. For tuning, everything is in initech.yaml:

# Fixed grid with rotation:
layout:
  mode: live
  grid: 2x2
  pinned:
    super: 0
    pm: 2
  hold_seconds: 15
  claim_threshold: 40
  keep_threshold: 10

# Or auto-sizing grid:
layout:
  mode: live
  live_auto: true
  pinned:
    super: 0
  hold_seconds: 15

The conviction weights are fixed in v1. The thresholds and hold time are configurable because those depend on fleet size and operator preference. A 10-agent fleet with a fixed 3x3 grid wants shorter hold times. Live Auto sidesteps the grid-size question entirely.

Web companion

Live mode works in the web companion too. The browser mirrors the TUI's slot assignments. When a dynamic slot swaps agents, the web companion disconnects the old agent's WebSocket and connects the new one. Hold time prevents this from happening more than once every 15 seconds per slot, so the browser view stays readable.

Monitor your fleet from a phone or tablet. The screen follows the action without you touching anything.

When nobody is working

If all agents go idle, dynamic slots show the most recently active agents. The screen doesn't go blank. It shows whoever was working last, on the theory that those agents are most likely to start again soon.

Try it

curl -fsSL https://initech.sh/install.sh | bash
initech init
initech

# Inside the TUI command modal:
live 2x2

# Or just hit Alt+5

Source: github.com/nmelo/initech

Related docs:

← Back to all posts