vago

Running and watching

Run a Goal with vago run, read what it prints, follow every Goal in the TUI, and read the Goal report its PR carries.

vago run takes one Goal’s Tickets through its Workflow and prints a line for each Step as it starts and ends. The TUI, vago with no command, shows every Goal of the Project while they run, from any terminal. Neither needs the other: start a Goal from the TUI and watch it there, or run it in a terminal and never open the TUI.

The TUIs on this page replay acme-shop, an example Project invented for these docs. Click one and use its keys.

Run a Goal

vago run low-stock-email

It runs in the Goal’s own worktree on the branch vago/low-stock-email, outside your checkout, and takes the lowest-numbered Ticket that is ready or stuck and has every blocker done. It goes on Ticket by Ticket until none is left or one goes stuck, then runs the Workflow’s after_all Steps once every Ticket is done. Here is acme-shop’s low-stock-email on the small Workflow, its first two Tickets cut short:

Worktree /home/dev/.vago/worktrees/acme-shop-5c1e7a20/low-stock-email
01-threshold-setting
  ...
02-daily-check
  ...
03-email-template
  2026-10-15T08:45:57Z                  New branch started
  2026-10-15T08:45:57Z    0.1s          New branch ok
  2026-10-15T08:45:57Z                  Build started
  2026-10-15T08:52:34Z   6m36s   $0.92  Build ok
  2026-10-15T08:52:34Z                  Checks started
  2026-10-15T08:54:16Z   1m42s          Checks ok
  2026-10-15T08:54:17Z                  Review started
  2026-10-15T08:57:11Z   2m54s   $0.23  Review ok
  2026-10-15T08:57:11Z                  Goal review started
  2026-10-15T08:58:45Z   1m33s   $0.24  Goal review ok
  2026-10-15T08:58:45Z                  Squash merge started
  2026-10-15T08:58:50Z    4.8s          Squash merge ok
after_all
  2026-10-15T08:58:52Z                  PR description started
  2026-10-15T08:59:37Z   45.3s   $0.14  PR description ok
  2026-10-15T08:59:38Z                  Ready for review started
  2026-10-15T08:59:39Z    1.4s          Ready for review ok

low-stock-email: 3 of 3 Tickets done
Ticket                Status  Runs    Took   Cost
01-threshold-setting  done       5  11m58s  $1.00
02-daily-check        done       5  16m04s  $0.75
03-email-template     done       6  12m51s  $1.40
Total                           16  40m54s  $3.15
Removed worktree /home/dev/.vago/worktrees/acme-shop-5c1e7a20/low-stock-email; branch vago/low-stock-email is kept

Line by line:

  • Worktree names the folder the Steps run in.
  • Each Ticket’s name, or before_all and after_all for the Goal Steps, starts its pass. A Ticket picked up after it went stuck says so: 02-daily-check, picked up at Review.
  • Under it, each Step gets a line when it starts and one when it ends: the time in UTC, how long it took, what an agent Step cost, then the Step’s name from the Workflow (its id when it has none) and how it ended. A Step whose when doesn’t hold for this Ticket prints skipped; on the first two Tickets above, Goal review did.
  • A Step that fails and will be retried prints retries in 1m00s under it.
  • When the run ends, a blank line and the summary: each Ticket’s status, Runs, time and cost, and the total. A Run still going counts toward neither.
  • Last, what became of the worktree: removed once the Goal is done, with its branch kept, or kept and why, such as uncommitted changes.

A Step ends ok, exit <code> for a shell Step or a Harness that exited non-zero, idle-timeout when the Harness printed nothing for the Workflow’s idle_timeout, interrupted when you pressed Ctrl-C, permission-denied when the Harness refused a tool call or command, or permission-mode <mode> when a Claude Code session ran in another mode than the one asked for. When a Ticket goes stuck, vago run stops and prints its log, the command that resumes the agent’s session, the vago run that picks it up again and the vago ticket reset that starts it over.

On a terminal the outcomes and statuses are coloured; set NO_COLOR to turn that off. vago run exits 0 only when every Ticket is done and after_all has gone through, and refuses a Goal another vago run is running.

Watch every Goal

Run vago with no command in the Project, on a terminal. It opens the Goals list, here with acme-shop’s gift-cards running:

acme-shop 4 done · 1 ready · 1 running · 1 stuck, lost or broken · $18.93 spent
Goals 1/8
STATE GOAL TICKETS RUN TIME COST NOW TITLE
● running gift-cards 2/5 32m 10s $2.01 03 Build Customers can pay w…
✗ stuck order-export 1/3 22m 12s $2.04 02 stuck after Build exit 1 Store owners can ex…
◇ planning self-service-returns 0/0 proposal ready
○ ready dark-mode 0/3 0s $0.00 ready to start The storefront foll…
✓ done low-stock-email 3/3 41m 41s $3.30 finished Owners get an email…
✓ done search-typos 4/4 1h 1m $4.85 finished Product search find…
✓ done responsive-images 3/3 42m 18s $3.20 finished Product images load…
✓ done saved-addresses 3/3 44m 0s $3.53 finished Returning customers…
gift-cards Workflow small · created 2026-10-21 · last activity 4m 36s ago
Customers can pay with a gift card
2/5 Tickets
STEP RUNS TOOK COST GOAL
New branch 3 0s Problem Statement
Build 3 20m 4s $1.39
Checks 2 2m 55s Customers ask for gift cards every December and the shop has nothing to sell
Review 2 8m 55s $0.63 them. Staff work around it with discount codes, which can't hold a balance,
Squash merge 2 13s so a code is either used up in one order or shared around. Nobody can say how
total 12 32m 10s $2.01 much credit is still out there.
Solution
A gift card is a code with a balance. Customers buy one like any product,
spend it at checkout over one or several orders, and check what's left on a
page of its own. Staff can issue a card by hand, and a refund on an order
paid by card goes back to the card.
↑↓ Goal Enter Open s Start n New Goal g G First, last PgUp PgDn Scroll ? Help q Quit

Ticket 03 · Build

A replay of Vago's TUI on an example Project. The TUI drew every frame itself, from acme-shop, a Project invented for this page, so nothing here is running.

The top line counts the Project’s Goals by state and adds up what their Runs cost. Each row is a Goal: its state, a bar of its Tickets done of the total, its run time (how long its Runs ran, pauses left out), its cost, what it is doing or waiting for now, and its title. The states sort in this order:

  • running: a vago run has it.
  • lost: a Ticket says running but no live vago run has the Goal, say after a crash. The next vago run picks it up at the Step it was on.
  • stuck: a Ticket or Goal Step failed and waits for you.
  • planning: a planning item, a Goal still being planned with an agent.
  • ready: nothing has stopped it, and it has Tickets left to run.
  • done: every Ticket is done.

Below the list, the selected Goal’s Runs per Step and its text. The TUI reads .vago-goals/ again every second, so you can leave it open while Goals run in other terminals. Run from inside a Goal’s worktree, it shows the main checkout’s Project. Without a terminal, vago prints the usage and exits 1.

The keys:

  • ↑ ↓ or j k select a Goal; g and G jump to the first and the last.
  • Enter opens the selected Goal in the Goal view, or a planning item in the planning view.
  • s starts the selected Goal when it is ready, stuck or lost, in a vago run of its own that keeps running after you quit the TUI.
  • n plans a new Goal. r renames and d discards the selected planning item.
  • ? shows every key, and q quits.

The TUI never stops a Goal or changes its Tickets. Set NO_COLOR to drop the colours, and VAGO_ASCII=1 for a terminal without the box and symbol glyphs.

The Goal view

Enter on a Goal opens it. This is gift-cards while its third Ticket’s Build Run is live:

acme-shop 4 done · 1 ready · 1 running · 1 stuck, lost or broken · $18.93 spent
● gift-cards Customers can pay with a gift card
RUNNING 32m 10s run time 3.3M tokens $2.01 Workflow small Goal 1 of 8
2/5 Tickets
Tickets 3/6 Ticket 03 2 Runs · 4m 36s · $0.00
✓ 01 A gift card is a code with a balance Customers can check a card's balance
✓ 02 Checkout takes a gift card code after 01
● 03 Build Customers can check a card's ba…
○ 04 Staff issue gift cards from the admin ✓ New branch ● Build · Checks · Review · Goal review
○ 05 A refund on a gift card order goes bac… · Squash merge
○ after_all Goal Steps
What to build
A page at `/gift-cards/balance` where anyone types a code and sees
its balance and its last five uses. It doesn't need an account. Five
wrong codes from one address in ten minutes slow the next try down.
Runs of Ticket 03
1 New branch ✓ ok 0s Acceptance criteria
2 Build ● live 4m 36s
Run 2 · 03 Build ● live 4m 36s · 1.2M tokens · $0.34
limiter instead of writing another one.
Write test/gift-card-balance.test.ts (17 lines)
Execute Run the new tests, expecting them to fail
✗ test/gift-card-balance.test.ts:
⁘ Four failing tests, as expected. Now the lookup: it reads the card by code and its last five uses in one query.
⁘ working
↑↓ Move ←→ Run Tab Pane PgUp PgDn Scroll s Start t r Full screen G Follow e d Diff Esc Goals ? Help

Ticket 03 · Build

A replay of Vago's TUI on an example Project. The TUI drew every frame itself, from acme-shop, a Project invented for this page, so nothing here is running.

The rows at the top give the Goal’s state, run time, tokens, cost, Workflow, and its place in the list. Under them are four panes:

  1. Tickets: each Ticket with its mark and, for a running one, the Step it is on. A Workflow’s before_all and after_all show as rows of their own, before and after the Tickets.
  2. Runs: every Run of the selected Ticket, its Step, outcome, time and cost, marked when it resumed a session.
  3. Ticket: its number, blockers, the Workflow’s Steps marked by how far its latest pass got, and its text.
  4. Run: the selected Run. For an agent Run, its activity: what the agent said, the tools it called, the files it edited, a failed call indented further. For a shell Run, its log. A live Run is followed as it writes; scrolling up stops that, and G follows again.

The keys:

  • Tab and Shift-Tab move the focus between panes, and 1 to 4 jump to one.
  • ↑ ↓ move in the focused pane, and ← → select the Run before or after.
  • [ and ] open the Goal before or after in the list.
  • t and r show the Ticket or the Run on the whole screen.
  • e and E select the Run’s edits, and d shows the selected edit’s diff.
  • s starts this Goal, as in the Goals list.
  • Esc closes the diff or the full screen, then goes back to the Goals.

The Goal report

vago goal report prints a Goal as Markdown: its text, each paragraph on one line, then the output of each Step that sets goal_report = true, collapsed under its Ticket, then a table of each Ticket’s Runs, time and cost, with every Run in a collapsed table below it. The starter Workflows’ merge Step makes it the description of the Goal’s PR and rewrites it after every Ticket, and their after_all rewrites it once more when the Goal is done.

vago goal report low-stock-email

After the Goal’s text, it prints:

## Runs

Workflow: small

| Ticket | Runs | Took | Cost |
|---|---:|---:|---:|
| 01-threshold-setting | 5 | 11m58s | $1.00 |
| 02-daily-check | 5 | 16m04s | $0.75 |
| 03-email-template | 6 | 12m51s | $1.40 |
| after_all | 2 | 46.7s | $0.14 |
| **Total** | **18** | **41m41s** | **$3.30** |

<details>
<summary>Every Run</summary>

| Ticket | Step | Outcome | Took | Cost |
|---|---|---|---:|---:|
| 01-threshold-setting | branch | ok | 0.1s |  |
| 01-threshold-setting | implement | ok | 6m01s | $0.61 |
...
| after_all | ready | ok | 1.4s |  |

</details>

Unlike the summary vago run prints, it counts the Goal Steps’ Runs too. The Goal view shows the same Runs; here the finished Goal’s after_all:

acme-shop 4 done · 1 ready · 1 running · 1 stuck, lost or broken · $18.93 spent
✓ low-stock-email Owners get an email before stock runs out
DONE 41m 41s run time 5.4M tokens $3.30 Workflow small Goal 5 of 8
3/3 Tickets
Tickets 4/4 after_all 2 Runs · 46s · $0.14
✓ 01 Each product has a low-stock threshold Goal Steps
✓ 02 A daily job finds products at or under…
✓ 03 The owner gets one email listing them ✓ PR description ✓ Ready for review
✓ after_all Goal Steps
Runs of after_all
1 PR descripti…✓ ok 45s $0.14
2 Ready for re…✓ ok 1s
Run 2 · after_all Ready for review ✓ ok · 1s
Marked https://github.com/acme-example/acme-shop/pull/34 ready for review.
↑↓ Move ←→ Run Tab Pane PgUp PgDn Scroll s Start t r Full screen G Follow e d Diff Esc Goals ? Help

Ticket 03 · Build

A replay of Vago's TUI on an example Project. The TUI drew every frame itself, from acme-shop, a Project invented for this page, so nothing here is running.

This page as Markdown