hmz › /flow › Installed › ralph_loop ● unsaved changes Configure each role: an agent (CLI, account, model and effort) or an - environment; then what the flow takes and what a run may spend. + environment; then what the flow takes and what an epic may spend. ╭────────────────────────────────────────────────────────────────────────╮ agent claude/claude-opus-5-5:high ▸ 1 agent ──────────────────────────────────────────────────────────────────────── budget none ▸ 2 - what a run may spend: none set; a run needs one + what an epic may spend: none set; an epic needs one + ──────────────────────────────────────────────────────────────────────── + profile flow ○ off ▾ 3 + traced only ──────────────────────────────────────────────────────────────────────── - profiling ○ off ▾ 3 + profile environment ○ off ▾ traced only ╰────────────────────────────────────────────────────────────────────────╯ @@ -226,7 +229,8 @@ fills it with the first CLI it found, so the row already names one. 1. **`agent`**, the flow's one role, and the agent filling it as `cli/model:effort`. 2. **`budget`**: none yet. You set it in step 5. -3. **`profiling`** stays off here: it is for when you want the programs a run starts in its +3. **`profile flow`** and **`profile environment`** stay off here: they are for when you want + the flow's own Python, or the programs a run starts, in its [trace](/user/tracing#profiling-a-run). 4. **Save**: nothing you change is kept until you press it. `● unsaved changes` says something is waiting. @@ -293,12 +297,12 @@ Press enter on `budget`: hmz › /flow › Installed › ralph_loop › Set budget for ralph_loop ● unsaved changes - A run stops at whichever limit it reaches first; at least one limit is + An epic stops at whichever limit it reaches first; at least one limit is required. Leave empty or 0 for no limit. ╭────────────────────────────────────────────────────────────────────────╮ duration 20m 1 - maximum run duration: 1h30m, 90s, PT2H; empty for no limit + maximum epic duration: 1h30m, 90s, PT2H; empty for no limit ──────────────────────────────────────────────────────────────────────── cost 0.5 2 maximum cost in US dollars, 0 for no limit @@ -324,7 +328,7 @@ Press enter on `budget`: 3. **`graceful`**: on lets the turn that is running finish when a limit is reached; off cuts it off. enter or a click drops the two under it, opening on the one it is not. 4. **Set** keeps all four: tab to it and press enter. The `budget` row - then reads `set`, and under it `what a run may spend: stops at 20m, $0.50`. + then reads `set`, and under it `what an epic may spend: stops at 20m, $0.50`. The run stops at whichever limit it reaches first. If your account is billed by the token, set a `cost` as well as a `duration`. See [Every run has a budget](/features/allowances). @@ -351,8 +355,9 @@ it says it: What to look at, by number: -1. **`── agent`** marks whose words follow. With several agents, a new one appears wherever the - speaker changes. +1. **`─ reading agent ─`** says whose transcript this is: a run lands on the agent of the first + conversation it opens, with what you said at the top, and follows that agent into each new + conversation. 2. **`✻ Worked for 7s · agent`** closes a turn: the first round is done, and `calc.py` is already fixed. 3. **`conversation 2 of 2`**: a Ralph loop starts a fresh conversation every round, so the @@ -428,7 +433,7 @@ remembers, and forgets it. ### `this flow requires a budget: set the budget first` -Saving refused, because the budget row still reads `none set; a run needs one`. Set at least +Saving refused, because the budget row still reads `none set; an epic needs one`. Set at least one limit in step 5. ### The cost row reads `0.00.5` diff --git a/docs/user/installation.md b/docs/user/installation.md index 55d145187..9450a3028 100644 --- a/docs/user/installation.md +++ b/docs/user/installation.md @@ -229,7 +229,7 @@ Qwen Code signed in: ────────────────────────────────────────────────────────────────────── ❯ ────────────────────────────────────────────────────────────────────── - ◉ chat · ~/src/demo 3 / commands · shift+enter newline · ← monitor · ctrl+c exit+ ◉ chat · ~/src/demo 3 / commands · shift+enter newline · ctrl+c exit
all agents: enter here reads every agent at once.',
+ 'The monitor opens on the agent you were reading: the actor, where the run landed as it opened its first session.',
},
{
- label: '2 · ↓ ↓',
- lines: graph(all(false), actor(false), reviewer(true, false), folds),
+ label: '2 · ↓',
+ lines: graph(epic(false), actor(false), reviewer(true, false), folds),
caption:
'The cursor is on the reviewer, which has stopped and has something you have not read. The keys offer space sessions.',
},
@@ -156,7 +156,7 @@ const monitor = [
label: '3 · space',
lines: [
switched(false),
- all(false),
+ epic(false),
...actor(false),
...subagents(false),
...reviewer(true, true),
@@ -218,7 +218,10 @@ prompt at the bottom, so every command works on either.
The monitor draws the run as **nodes**:
-- `▣ all agents`, always first: the log every agent's work appears on.
+- `◫ epic`, always first: how far the run has got -- how many agents are working, their turns,
+ how long it has been going -- and, once it has started, how it stands and its budget against
+ what it has spent. There is no log every agent's work appears on; enter on it
+ opens the epic's own page instead.
- `◉` an **outworlder**, where the flow talks to you (for example `◉ human · outworlder:
messages from the flow to you`).
- a **box per agent** that has taken a turn, in the order the flow declares them. An agent is
@@ -240,9 +243,10 @@ What to look at in frame 1, by number:
1. **The switch, `graph` `list`.** Which of the two views you are looking at. A click on the
other half turns to it, as ctrl+t does.
-2. **`▣ all agents`.** Where the cursor starts: how many boxes are working, the run's turns,
- and how long it has run. `· reading` says its log is the one you came from.
-3. **The actor's box.** The top line says what it is doing now: `▸` (it can be opened out),
+2. **`◫ epic`.** How it stands, how many boxes are working, the run's turns, and how long it
+ has run. enter on it opens the epic's page.
+3. **The actor's box.** Where the cursor starts, `reading` saying its log is the one you came
+ from: a run lands on the agent of its first session. The top line says what it is doing now: `▸` (it can be opened out),
`●` working, and `43s`, how long this turn has been going. The second line says what it
runs, `cli/model:effort`, its turns and tokens.
4. **`▤ workspace local`.** The environments its sessions work in.
@@ -287,11 +291,13 @@ line says `graph` or `list`, and the monitor opens again the way you left it.
| the graph | the flow passes work between agents, and you want to see who is waiting on whom |
| the list | many agents or sessions, and you want the busy ones at the top |
-## The first node
+## The first line
-`▣ all agents` is always first, and the cursor starts on it. enter on it reads the log
-every agent's work appears on, which is where a run is watched from. Its row also says how many
-boxes are working, the run's turns, and how long it has run.
+`◫ epic` is always first. It says how the run stands, how many boxes are working, the run's
+turns, how long it has run, and its budget against what it has spent. No log holds every
+agent's work, each node below reading its own: enter on it opens
+[the epic's page](#the-epic-s-page) instead. The cursor starts on the node you were reading, or
+on its agent.
Under it, a run that talks to you has a `◉` node for each outworlder: the role that is you. Enter
on it reads what the flow says to you. Where another interface reads the same run, the node says
@@ -352,6 +358,17 @@ With the mouse, a click on the left edge of a box, where its `▸` is, opens it
and so does a click on the agent the cursor is already on. A click anywhere else on an agent
only moves the cursor there, and a double click reads it.
+## The epic's page
+
+enter or a click on `◫ epic` opens the run's own page, the same content as the epic
+panel of [the web page](/user/web): `Figures` (time, spend, tokens), `Budget` (each limit with
+what has gone of it, as a meter), `Set up` (the flow, task, agents, environments, params, and
+whether it is profiled) and `Flows` (the flows called). It stays live.
+
+Under it, for every flow but a chat, is `Stop` while the run runs and `Force stop` while it
+winds down. tab reaches the button; each asks before it acts. See
+[Stopping](/user/stopping).
+
## Environments
Under each session is the environment it works in: `▤`, the environment role the flow gave it,
@@ -372,7 +389,7 @@ out:
| `image` | What a container for it is started from, where the flow names one. |
| `grants` | The capabilities the flow declared for the role: `Shell`, `Files`, `GitWorktree`, … or `nothing beyond running in it`. |
| `needs` | What the flow asks of the machine: CPUs, memory, GPUs. |
-| `harness` | Where the run put the harnesses of the agents working in it, such as `self: on this environment's machine, with the CLI installed there` or `local: on this machine; what it runs lands here`. Where sessions went different ways, each is named: `self for NeiKos496/1 · local for PoleMos600/1`. See [Remote execution](/user/remote-execution). |
+| `harness` | Where the run put the harnesses of the agents working in it, such as `env: on this environment's machine, with the CLI installed there` or `local: on this machine; what it runs lands here`. Where sessions went different ways, each is named: `env for NeiKos496/1 · local for PoleMos600/1`. See [Remote execution](/user/remote-execution). |
| `status` | How many of its sessions are working now, such as `1 of 3 sessions working`. |
| `Sessions` | Each session working in it. enter or a click on one reads it. |
@@ -403,10 +420,11 @@ drawing, above the prompt.
| --- | --- |
| ↑ ↓ | With nothing typed: move between the nodes. |
| space | With nothing typed: open the agent under the cursor out to its sessions, or shut it. |
-| enter | With nothing typed: read that node's log. On an environment, open its page. On a line of the board, change it. |
+| enter | With nothing typed: read that node's log. On the epic or an environment, open its page. On a line of the board, change it. |
| a click | What enter does. On an agent: on its `▸`, or on the one already picked, open it out or shut it; elsewhere, pick it; twice, read it. |
| → | With nothing typed: back to the log you were reading. |
| ctrl+t | The graph, or the list. |
+| ctrl+e | With nothing typed: the run in [Exomyth](/reference/tui#exomyth), as a click on `Exomyth` above the graph does. Not for a chat. |
| ← | On the log, with nothing typed: up to the monitor. |
The status line offers only the keys that do something on the node under the cursor:
diff --git a/docs/user/permissions.md b/docs/user/permissions.md
index ec49b3469..eda3ca94f 100644
--- a/docs/user/permissions.md
+++ b/docs/user/permissions.md
@@ -248,7 +248,10 @@ says yes. The organisation's own `deny` rules still apply.
A [container](/user/containers) or an [ssh host](/user/remote-execution) is held to the same
grant as this machine. Every command the agent runs lands on the other machine and is fenced
-there, around that machine's own workdir and `$HOME`. With `online` of `NONE`, those commands
+there, around that machine's own workdir and `$HOME`. Claude Code, Codex, Grok Build, Qwen
+Code and pi are started in a home of their own where they run: here, or on that machine where its own CLI is driven, so
+neither writes the settings of the machine it runs on
+([Security](/user/security#what-a-flow-lets-its-agents-touch)). With `online` of `NONE`, those commands
reach no host at all. The agent's temporary directory is kept on the other machine at the path
it has here, so a command that names it, as Claude Code's every shell command does, finds it
there and ends with its own exit status.
diff --git a/docs/user/questions.md b/docs/user/questions.md
index fb03714c7..d9ef1f8ee 100644
--- a/docs/user/questions.md
+++ b/docs/user/questions.md
@@ -172,12 +172,12 @@ hmz exec -f chat -a assistant=claude/claude-haiku-4-5-20251001:low --json "…"
## Answering, in detail
-- **Where you answer.** A question is shown on the transcript every agent is on and on the
+- **Where you answer.** A question is shown on whichever transcript you are reading and on the
asking outworlder's own, which shift+tab reaches and which holds nothing but what
it asks you. A line typed on either answers it: the oldest question up on the first, the
oldest that outworlder asks on the second. One the agent stopped mid-turn to ask, and
- `chat` asking what next, are shown and answered in that agent's conversation as well. On one
- agent's transcript any other line goes to the agent instead. See [Many conversations at once](/user/conversations).
+ `chat` asking what next, are shown and answered in that agent's conversation instead. On one
+ agent's transcript any other line goes to the agent. See [Many conversations at once](/user/conversations).
- **Somebody else's.** Where [another interface](/features/daemon#several-people-on-one-run)
reads the same run, a question nobody has claimed goes to whoever answers first, and an
answer from somebody else shows ` · by