toolroll 0.9.84 → 0.9.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +94 -1193
  3. package/dist/agent-fence.d.ts +9 -5
  4. package/dist/agent-fence.js +6 -5
  5. package/dist/agent-onboard.d.ts +2 -0
  6. package/dist/agent-onboard.js +3 -0
  7. package/dist/assignment.js +4 -3
  8. package/dist/browser/workspace.css +1 -1
  9. package/dist/browser/workspace.js +33 -31
  10. package/dist/browser-workspace.d.ts +45 -0
  11. package/dist/chat-actions.d.ts +11 -1
  12. package/dist/chat-actions.js +53 -1
  13. package/dist/chat-channel.d.ts +10 -1
  14. package/dist/chat-channel.js +36 -5
  15. package/dist/chat-decide.d.ts +16 -4
  16. package/dist/chat-decide.js +239 -31
  17. package/dist/chat-messages.d.ts +5 -0
  18. package/dist/chat-messages.js +1 -1
  19. package/dist/chat-quiet.js +6 -4
  20. package/dist/chat-review.d.ts +4 -0
  21. package/dist/chat-review.js +13 -4
  22. package/dist/chat-terms.d.ts +9 -0
  23. package/dist/chat-terms.js +46 -0
  24. package/dist/claim.d.ts +3 -0
  25. package/dist/claim.js +4 -1
  26. package/dist/contracts/chat-actions.d.ts +9 -0
  27. package/dist/contracts/chat-actions.js +3 -0
  28. package/dist/contracts/console-api.d.ts +6 -2
  29. package/dist/contracts/console-api.js +6 -2
  30. package/dist/contracts/flow-propose.d.ts +4 -1
  31. package/dist/contracts/flow-propose.js +1 -1
  32. package/dist/contracts/flow.d.ts +41 -0
  33. package/dist/contracts/flow.js +4 -2
  34. package/dist/contracts/lead-tools.d.ts +51 -0
  35. package/dist/contracts/lead-tools.js +5 -0
  36. package/dist/contracts/store-json.d.ts +2 -0
  37. package/dist/contracts/trigger-payloads.d.ts +20 -0
  38. package/dist/contracts/trigger-payloads.js +4 -0
  39. package/dist/contracts/youiyoux-request.d.ts +248 -0
  40. package/dist/contracts/youiyoux-request.js +152 -0
  41. package/dist/coordinator.js +1 -0
  42. package/dist/deploy-gate.js +4 -0
  43. package/dist/dispatch.d.ts +3 -0
  44. package/dist/dispatch.js +4 -1
  45. package/dist/flow-browser.d.ts +103 -0
  46. package/dist/flow-browser.js +204 -0
  47. package/dist/flow-cadence.d.ts +8 -2
  48. package/dist/flow-cadence.js +16 -3
  49. package/dist/flow-card-task.d.ts +9 -0
  50. package/dist/flow-card-task.js +15 -6
  51. package/dist/flow-code.d.ts +5 -1
  52. package/dist/flow-code.js +4 -1
  53. package/dist/flow-engine.js +16 -0
  54. package/dist/flow-live.js +9 -1
  55. package/dist/flow-pull-request.js +15 -7
  56. package/dist/flow-share.js +3 -1
  57. package/dist/flow-steps.d.ts +9 -1
  58. package/dist/flow-steps.js +55 -5
  59. package/dist/flow-triggers.js +55 -0
  60. package/dist/flows-cli.d.ts +19 -0
  61. package/dist/flows-cli.js +47 -2
  62. package/dist/flows-ui.js +11 -2
  63. package/dist/flows.js +5 -2
  64. package/dist/integrations-ui.js +9 -4
  65. package/dist/integrations.d.ts +9 -1
  66. package/dist/integrations.js +43 -2
  67. package/dist/landed-cleanup.d.ts +4 -0
  68. package/dist/landed-cleanup.js +3 -2
  69. package/dist/lead-capabilities.js +2 -1
  70. package/dist/lead-cli.js +3 -1
  71. package/dist/lead-tools.d.ts +2 -0
  72. package/dist/lead-tools.js +65 -10
  73. package/dist/lead-voice.js +16 -5
  74. package/dist/lead.d.ts +2 -0
  75. package/dist/lead.js +3 -3
  76. package/dist/operate.d.ts +2 -3
  77. package/dist/operate.js +226 -21
  78. package/dist/project-activity.d.ts +20 -0
  79. package/dist/project-activity.js +23 -0
  80. package/dist/project-cli.d.ts +1 -0
  81. package/dist/project-cli.js +36 -19
  82. package/dist/project-delete.js +7 -3
  83. package/dist/project-knowledge.d.ts +3 -3
  84. package/dist/project-outcomes.d.ts +119 -0
  85. package/dist/project-outcomes.js +79 -0
  86. package/dist/pull-request-flow.js +35 -4
  87. package/dist/result-actions.d.ts +4 -0
  88. package/dist/result-actions.js +41 -9
  89. package/dist/result-follow-ups.js +4 -0
  90. package/dist/result-review.d.ts +9 -0
  91. package/dist/result-review.js +45 -5
  92. package/dist/scope.d.ts +5 -0
  93. package/dist/scope.js +7 -0
  94. package/dist/server/chat.js +4 -2
  95. package/dist/server/console.css +41 -0
  96. package/dist/server/flows.js +15 -0
  97. package/dist/server/pages.js +11 -1
  98. package/dist/server/render-chat.js +3 -2
  99. package/dist/server/render-pages.d.ts +15 -2
  100. package/dist/server/render-pages.js +52 -4
  101. package/dist/server/render-results.d.ts +2 -0
  102. package/dist/server/render-results.js +20 -7
  103. package/dist/server/render-tasks.d.ts +9 -0
  104. package/dist/server/render-tasks.js +32 -11
  105. package/dist/server/route-table.js +12 -0
  106. package/dist/server/settings.js +18 -1
  107. package/dist/server/task-views.js +11 -0
  108. package/dist/server/tasks.d.ts +10 -0
  109. package/dist/server/tasks.js +95 -7
  110. package/dist/settings-proofs.js +1 -0
  111. package/dist/store.d.ts +116 -5
  112. package/dist/store.js +385 -24
  113. package/dist/surface.js +18 -2
  114. package/dist/task-archive.d.ts +10 -0
  115. package/dist/task-archive.js +16 -0
  116. package/dist/task-control.d.ts +1 -1
  117. package/dist/task-source.d.ts +13 -1
  118. package/dist/task-source.js +17 -1
  119. package/dist/telegram-lead.js +7 -5
  120. package/dist/telegram.js +1 -1
  121. package/dist/tidy.d.ts +130 -0
  122. package/dist/tidy.js +503 -0
  123. package/dist/toolroll-update.js +2 -2
  124. package/dist/webhooks.d.ts +6 -0
  125. package/dist/webhooks.js +25 -0
  126. package/dist/work-index.d.ts +28 -0
  127. package/dist/work-index.js +82 -28
  128. package/dist/workspace-ui.d.ts +1 -1
  129. package/dist/workspace-ui.js +3 -2
  130. package/dist/youiyoux-intake.d.ts +234 -0
  131. package/dist/youiyoux-intake.js +908 -0
  132. package/package.json +11 -8
package/README.md CHANGED
@@ -2,1253 +2,154 @@
2
2
 
3
3
  <picture>
4
4
  <source media="(prefers-color-scheme: dark)" srcset="docs/media/wordmark-dark.svg">
5
- <img src="docs/media/wordmark-light.svg" alt="Toolroll — a control plane for unattended coding agents" width="440">
5
+ <img src="docs/media/wordmark-light.svg" alt="Toolroll" width="440">
6
6
  </picture>
7
7
 
8
8
  ### Your agents build. You decide.
9
9
 
10
- Queue the work, approve the exact terms once, and come back to results that
11
- prove themselves — interrupted only for decisions that need a person.
10
+ For Claude Code, Codex and Gemini, on your own machine.<br>
11
+ Approve the exact scope once. Get results back Ready with the diff, the passing check and screenshots.
12
12
 
13
- [![CI](https://github.com/ap9000/toolroll/actions/workflows/ci.yml/badge.svg)](https://github.com/ap9000/toolroll/actions/workflows/ci.yml)
14
13
  [![npm](https://img.shields.io/npm/v/toolroll?color=171717)](https://www.npmjs.com/package/toolroll)
14
+ [![CI](https://github.com/ap9000/toolroll/actions/workflows/ci.yml/badge.svg)](https://github.com/ap9000/toolroll/actions/workflows/ci.yml)
15
+ [![license](https://img.shields.io/badge/license-MIT-171717)](LICENSE)
15
16
  [![Homebrew](https://img.shields.io/badge/homebrew-ap9000%2Ftoolroll-171717)](https://github.com/ap9000/homebrew-toolroll)
16
17
  ![node](https://img.shields.io/badge/node-%E2%89%A5%2022.13-171717)
17
- [![license](https://img.shields.io/badge/license-MIT-171717)](LICENSE)
18
18
 
19
- **[Website](https://toolroll.dev)** · [Install](https://toolroll.dev/install) · [Use cases](https://toolroll.dev/use-cases) · [Integrations](https://toolroll.dev/integrations) · [Guides](docs/guide/README.md) · [Contributing](CONTRIBUTING.md)
19
+ **[Website](https://toolroll.dev)** · [Docs](docs/guide/README.md) · [For agents](docs/agents.md) · [Use cases](https://toolroll.dev/use-cases) · [Changelog](CHANGELOG.md)
20
20
 
21
21
  <picture>
22
22
  <source media="(prefers-color-scheme: dark)" srcset="docs/media/ui/tasks-dark.png">
23
23
  <img src="docs/media/ui/tasks-light.png" alt="The Toolroll console's Tasks view: plan windows and budget at the top, then every task with what it needs from you and the one action that settles it." width="920">
24
24
  </picture>
25
25
 
26
- <sub>Tasks across every project: what's building, what's Ready, and the one thing each needs from you. (Demo workspace.)</sub>
26
+ <sub>Every task across every project, and the one thing each needs from you. (Demo workspace.)</sub>
27
27
 
28
28
  </div>
29
29
 
30
30
  ## Quick start
31
31
 
32
- ```sh
33
- npx toolroll up
34
- ```
35
-
36
- That starts the app and a builder for your projects, then opens the console
37
- at http://127.0.0.1:4180. Runs on macOS or Linux with Node.js 22.13+ and git 2.41+.
38
- Try the sandbox first with `npx toolroll demo`: ask its scripted lead for a
39
- change in Chat, approve the plan, and watch it land Ready. It never calls a
40
- model, spends or reaches outside.
41
-
42
- | Install with | Command |
43
- |---|---|
44
- | npm | `npm install -g toolroll` |
45
- | Homebrew | `brew install ap9000/toolroll/toolroll` |
46
- | bun | `bun add -g toolroll` |
47
- | pnpm | `pnpm add -g toolroll` |
48
- | yarn | `yarn global add toolroll` |
49
- | script | `curl -fsSL https://raw.githubusercontent.com/ap9000/toolroll/main/install.sh \| sh` |
50
-
51
- ## Install with your agent
52
-
53
- Paste this into Claude Code or Codex:
54
-
55
- > Install Toolroll with `npm install -g toolroll` and start `toolroll up` in
56
- > the background; it keeps running. Then run `toolroll onboard` in this
57
- > repository, and run it again with `--yes` to add it as a project and install
58
- > Toolroll's skill for you. Tell me the console address, where my login is saved (not the
59
- > password), how to pair my phone, and what I can ask you next.
60
-
61
- `toolroll onboard --yes` adds the repository (its main checkout) as a project,
62
- says which agent CLIs are signed in, and prints the line that adds Toolroll as
63
- tools (`claude mcp add --scope user toolroll -- toolroll mcp`) without running it.
64
- `toolroll onboard --remove --yes` takes the skill out again.
65
-
66
- Then read [Getting started](docs/guide/getting-started.md), [Flows](docs/guide/flows.md)
67
- and [Security](docs/guide/security.md). Coming from Standing Orders? It's the
68
- same product renamed; the `standing-orders` command and your data keep working.
69
-
70
- ## One command center, the whole loop
71
-
72
- Tell Toolroll what outcome you want. Its planner reads the repository,
73
- drafts the scope and proof rubric, and asks only when an answer would materially
74
- change the work. You approve the exact contract once; long-running agents can
75
- build it while the control plane handles queues, dependencies,
76
- crashes, and decisions. The result comes back with the diff, checks, screenshots,
77
- and a criterion-by-criterion verdict.
78
-
79
- ### Hand off in one prompt; approve exactly what will run
80
-
81
- Project and quality stay close to the prompt; expert fields appear only when
82
- you open them. Before execution, the approval card restates the goal,
83
- boundaries, evidence requirements, model, and permissions.
84
-
85
- <div align="center">
86
- <img src="docs/media/ui/tasks-mobile.png" alt="The Tasks view on a phone: each task with its status and the one action that settles it." width="260">
87
- &nbsp;
88
- <img src="docs/media/ui/scope-approval.png" alt="The scope you approve: goal, what is out of bounds, the files it may touch, acceptance criteria with their evidence, quality, permissions and the agents that will build it." width="640">
89
- </div>
90
-
91
- ### One lead, durable crew work
92
-
93
- Start in **Chat**, inspect work in **Tasks**, and manage guidance in **Projects**.
94
- Browser and CLI chat share the lead conversation. A local database catch-up shows
95
- current decisions and results before you authorize any model usage.
96
-
97
- Crew work ends at **Ready**. Open the result, mark it **Complete**, or request a
98
- specific revision of the same task. Actual checks remain visible; there is no
99
- separate model reviewer or automatic evidence resubmission loop. Deployment is
100
- reported separately and still requires the exact passing native machine check.
101
-
102
- Enable **Automatic crew updates** in a conversation, or use `toolroll chat
103
- --follow`. Meaningful updates (a result, a question, completion or cancellation)
104
- reach the same lead within its saved permissions and limits, through the same
105
- acknowledged inbox an external coordinator reads. Idle scanning uses no model.
106
- Restart recovery reuses saved responses; a failed response does not rerun a task. `--no-follow` pauses automatic responses.
107
- This wakes Toolroll's own lead, not an unrelated external agent session.
108
-
109
- `toolroll brief` reads the local database. `knowledge search`, `knowledge
110
- impact`, and `knowledge refresh` add bounded source retrieval; see
111
- [repository context](docs/REPOSITORY_CONTEXT.md). Curated knowledge stays in the
112
- database, and crew context stays attached to its original run.
113
-
114
- Select a saved checkout once, then use the same task records from the terminal:
115
-
116
- ```sh
117
- toolroll project use /path/to/project
118
- toolroll project show
119
- toolroll brief
120
- toolroll assignment show <task>
121
- toolroll task review <task> --brief
122
- toolroll task complete <task>
123
- toolroll task revise <task> --feedback "Keep the filter selected after reload."
124
- ```
125
-
126
- `task review <task> --brief` combines the latest finished build or report's conclusion,
127
- file counts, checks, review findings, screenshot paths, plan and next actions.
128
- Use `--run <id>` for an earlier attempt, `--json` for the same fields, and `--all`
129
- to include LOW findings. Lists stay bounded, with omitted entries counted; missing
130
- fields say `not recorded`. The lead token works through `--token` or `TOOLROLL_LEAD_TOKEN`.
131
-
132
- Completion and revisions use the local sign-in already saved by `up`. Completion
133
- reports the exact run, commit and check outcome it handled. Agents use a scoped
134
- credential (`project use /path/to/project --token-file /path/to/credential`) and
135
- complete only with the exact `--digest` from `assignment show`; JSON completion
136
- also requires that digest. The profile stores a file reference, never a secret,
137
- and grants no additional access. It supplies defaults for database briefs,
138
- knowledge commands, assignment commands, and these two task actions.
139
-
140
- For an exact revision replay, reuse `--run`, `--source` and `--key` from its JSON
141
- result. A revision keeps the original task history and approval boundaries; a
142
- stale result cannot create another current version. Actual failed checks remain
143
- failed when a result is marked complete.
144
-
145
- ### What is in the current build
146
-
147
- - **Guided workflow recipes.** Choose a starter, customize its outcome and
148
- success checks, and preview the steps before creating one-time or scheduled
149
- work. Save project recipes for teammates, reuse a task's scope, or share a
150
- portable JSON definition. Creation retries return the same work; existing
151
- approval and recovery rules apply. [Get started](docs/WORKFLOW_RECIPES.md).
152
- - **A creator for your usual work.** Write instructions once and add questions
153
- for the parts that change, such as a module or feature. Save the recipe,
154
- then use a short answer form to kick off another run. Saved recipes are
155
- searchable, show recently used work first, and can be shared with teammates.
156
- - **Flows: your process on a canvas.** Draw zones (triage, a person's
157
- go-ahead, build, review, tell the team) and drop cards into them. Each zone
158
- runs its step: build and research zones file ordinary tasks, so every
159
- approval, check and agent fence still applies; decision zones wait for a
160
- named person; a send back becomes a revision of the same work. The engine
161
- is model-free and runs in the worker's pass. Or describe the process in
162
- chat: the lead drafts the flow, and adds, moves or decides cards, as
163
- cards you confirm from the console or your phone.
164
- - **Triggers start cards on their own.** A button with a few questions, a
165
- schedule, GitHub (new issues, a label being added, new pull requests,
166
- failed checks), Linear (a team, a state, a label), or another flow's cards
167
- reaching a zone. A schedule can carry a standing order — the exact task to
168
- file each time, with its own per-run budget and a rolling 7-day cost
169
- ceiling — and runs one at a time, skipping while the last task is
170
- unfinished. GitHub is checked through your `gh` login and Linear
171
- with an API key kept on this computer; neither spends model tokens. Each
172
- issue or run makes at most one card; text from outside the repository's
173
- team is left out unless you say anyone. With a public address, GitHub,
174
- Linear or any service can post to a trigger's secret webhook instead
175
- (see [Webhooks](#webhooks-through-a-reverse-proxy)). A button can also be
176
- shared as a secret form link, so someone without an account can report
177
- something straight into a flow.
178
- - **Steps with no AI, and where flows break.** A project keeps a library of
179
- scripts — `run-tests`, `lint`, `smoke-staging` — written on a flow's
180
- Scripts panel or drafted by the lead in chat, and any flow runs one from a
181
- "Run a script" zone in a fresh copy of the card's work: exit 0 passes,
182
- anything else takes the failure path with the log kept. A Build whose
183
- project checks fail takes its failure path too, and an "Update the issue"
184
- zone comments on and closes the GitHub or Linear issue a card came from.
185
- Each flow's Insights show, per zone, how many cards passed, failed or were
186
- sent back and how long they waited, how each script does, and every run's
187
- log; the lead reads the same numbers to tell you where things break.
188
- - **Sorting with Jev.** A "Sort" zone asks [Jev](https://openrouter.ai/typesafe),
189
- TypeSafe's decision model, one question about each card through your own
190
- OpenRouter key: which of the zone's answers fits, how sure it is, and a few
191
- scores or yes/no notes (how urgent, asking for a refund). It answers in
192
- well under a second for a fraction of a cent, and can only ever pick one
193
- of your answers. Cards it's sure about go where their answer leads; the
194
- rest wait for a person, and every card shows what Jev decided. Insights
195
- count how often people moved a sorted card elsewhere, by how sure Jev
196
- was, so you can see when to trust it more. Five templates start from it:
197
- issue triage, a spam filter for public forms, lead routing, effort routing
198
- (small changes straight to a build, big ones through a plan) and exception
199
- routing (orders, invoices, deliveries).
200
- - **Drafts, approved from your phone.** A "Draft" zone has Claude write a
201
- reply, summary or note from the card in a few seconds, with no repository
202
- and no tools, through the lead chat's sign-in. Nothing is sent by itself: the
203
- next "Person decides" zone puts the draft in front of the flow's owner (or
204
- whoever it names) in their chat app. On Telegram the message carries
205
- Approve, Edit and Send back: Edit takes your own version as a reply and
206
- brings it back to approve, and Send back takes a note and has Claude try
207
- again. In the console the same draft is an editable box on the card. Each
208
- flow has an owner (whoever made it, until handed on) whom these decisions
209
- go to.
210
- - **Steps that reach outside.** A "Web request" zone calls an API with the
211
- card's details (its host is written out, so a card can't redirect it;
212
- secrets you save on the step go only into its headers). A "Send email" zone
213
- mails through your own mail server (Settings → Email: Gmail, Outlook,
214
- Fastmail, Resend, SES or any SMTP), and {{card.email}} is the address a card
215
- mentions. A "Use a tool" zone calls one of the project's MCP servers from
216
- the Tools page, like posting to Slack or adding a page to Notion. The Email
217
- replies template puts it together: Claude drafts, the flow's owner approves
218
- from their phone, and the reply is emailed.
219
- - **Unified portfolio chat.** Read every project, prioritize queues, answer
220
- decisions, repair failed or cancelled dependencies, and confirm rich action
221
- cards from one conversation. The chat proposes; durable workflow state
222
- remains the source of truth.
223
- - **Chat-first task handoff.** The default form is one outcome prompt. The
224
- repository-aware planner drafts the goal, boundaries, acceptance criteria,
225
- likely files, and a concise execution plan with milestones, dependencies,
226
- risks, and proof. Review or refine that plan before starting; approval locks
227
- the exact revision the builder receives. Expert controls remain under
228
- **Edit details**.
229
- - **A plan that adapts without quietly widening what you signed.** While a
230
- build runs, it checkpoints which milestone is pending, in progress, done,
231
- or blocked — reported by the agent, never counted as completion proof. When
232
- the repository shows a stated dependency, risk, or approach was wrong, the
233
- builder can file one evidence-linked replacement plan and pause at a safe
234
- point. A plan-only refinement appends an immutable revision and resumes on
235
- its own; anything that would touch the goal, boundaries, touches,
236
- acceptance, permissions, quality, budget, or publication authority stays
237
- paused for your accept or reject. The task page and focused chat always
238
- show the same live progress, the same revision, and the same pending
239
- decision.
240
- - **Structured handoffs repair their shape, not their meaning.** A malformed
241
- planner reply gets conservative syntax normalization, then at
242
- most two correction turns in the same session with the exact validation
243
- errors. Corrections cannot invent scope or criteria; every reply is sealed
244
- for audit, including replies rejected by provider or session checks, and
245
- workspace integrity is re-proved
246
- after each turn.
247
- - **Long-running, recoverable execution.** There is no arbitrary task
248
- countdown. Installed workers survive terminal closure and reboot, recover
249
- expired claims, and continue until a terminal result, a real decision, or a
250
- signed no-progress/runaway breaker.
251
- - **Subscription-native agents.** Use the Codex and Claude logins already on
252
- the machine. Dollar caps are optional; subscription usage is labeled as an
253
- API-price equivalent, never presented as an API charge.
254
- - **Per-task autonomy with a global default.** Choose **Auto** or **Full
255
- access** for the installation, then override it on any task. The exact
256
- provider permission mode is sealed into the approved scope.
257
- - **Explicit quality choices.** Default uses configured everyday agents;
258
- Strict / release requests stronger configured agents. The repository check
259
- remains authoritative for checks. Quality never starts a reviewer loop.
260
- - **Revisions retain context.** Feedback, source result and selected project
261
- context remain attached to the task. Each requested revision receives its
262
- own scope and approval; earlier results remain available.
263
- - **Honest completion.** Ready results include actual checks and saved work.
264
- The lead or user marks Complete after inspection. Failed checks stay failed;
265
- absent optional historical assessments do not block completion.
266
-
267
-
268
- ## Install
269
-
270
- Choose your projects folder the first time:
271
-
272
- ```sh
273
- npx toolroll up --project-root ~/Projects # or: bunx toolroll up
274
- ```
275
-
276
- That is the install and the setup. It needs Node 22.13 or newer on the
277
- machine (Bun's runtime has no `node:sqlite`; `bunx` hands the shebang to
278
- Node, so it works too), and git 2.41 or newer: Toolroll reads agent-written
279
- checkouts with `git --attr-source`, which older git refuses, and `toolroll
280
- up`, `serve`, `watch` and `doctor` say so when the installed git is older.
281
- Ubuntu 24.04 ships 2.43, which works; Debian 12 ships 2.39: install a newer
282
- one there. On git older than 2.45 (no `git --no-lazy-fetch`), a project that
283
- is a partial clone (`git clone --filter=…`) is refused for Toolroll's
284
- protected reads: use git 2.45 or newer for those, or a full clone. CI runs
285
- the git tests on 2.41 and on 2.47.
286
- `npm install -g toolroll` gives you the bare `toolroll` command for later
287
- (`standing-orders`, the older name, still works).
288
-
289
- `up` saves your password beside the database as `up-login.txt` (every
290
- start prints where, and the `cat` command that shows it; never the password
291
- itself), opens the app in your browser, and connects this machine as the
292
- builder. Add an existing folder or a GitHub repository from **Projects**;
293
- the builder and unified chat pick it up while the app keeps running. The
294
- projects folder and every added repository are remembered. Later,
295
- `toolroll up` can be run from any directory and reconnects all of them.
296
-
297
- To reach it from your phone over a tailnet:
298
- `toolroll up --host 0.0.0.0 --allow-host <your-machine>.ts.net:4180`.
299
-
300
- If the inbox says **Builder disconnected**, reopen Toolroll on the
301
- machine where the projects live; queued work resumes automatically. You do not
302
- run `up` separately in each project.
303
-
304
- Advanced deployments can start the console alone with
305
- `toolroll serve --repo .`: with no account yet it
306
- prints a six-digit setup code, and the login page offers **create the
307
- first account** — enter the code, pick a username and password, and you are
308
- in. A second person joins by invite link from the people page, never by
309
- another setup code.
310
-
311
- ```sh
312
- npx toolroll demo # a seeded sandbox — see it working in 90 seconds, zero spend
313
- npx toolroll # what's in flight across your repos — read-only, zero config
314
- ```
315
-
316
- ## Getting started
317
-
318
- There is one normal road: keep one `toolroll up` running on the machine.
319
- It is the app and the builder for every saved project. The separate console,
320
- worker, and OS service commands documented later are advanced deployment tools
321
- for people splitting those parts across machines.
322
-
323
- ### In the console
324
-
325
- 1. **Sign in** with the login `up` printed. You land on the **inbox**:
326
- everything that waits on you, and nothing else.
327
- 2. **Describe the outcome** with **+ new task**. The normal path is one
328
- ChatGPT-style prompt: the planner inspects the open repository, drafts the
329
- goal, boundaries, acceptance rubric, and implementation approach, then asks
330
- only when a missing answer would materially change the work. Project and
331
- quality stay in the compact footer; **Edit details** reveals the full
332
- contract, research-only mode, permissions, dependencies, and expert fields.
333
- 3. **Review and approve the proposed scope.** A scope needs at least one
334
- criterion — a plain outcome statement and the evidence kind (check,
335
- screenshot, changed-path, or manual review) that will answer it — before it
336
- can be signed. The task page leads with a concise approval card; the full
337
- structured, editable execution plan and full contract remain one click
338
- away. It restates the exact scope AND rubric you are signing, the provider
339
- and model it will run on, and your password. Nothing spends a token until
340
- this yes.
341
- 4. **Watch it build.** The **board** moves the card to *building*; the
342
- card's own page shows the stage, the live transcript, and — once the
343
- agent checkpoints one — which milestone is pending, in progress, done,
344
- or blocked; **peek** (`/peek`, or *peek at the live ones →* on the builds
345
- page) shows every live agent at once. If the repository disproves a
346
- named dependency or risk, the task page shows the replacement plan with
347
- its evidence; a plan-only fix resumes on its own, while anything that
348
- would touch what you signed waits for your accept or reject, right
349
- there next to the plan.
350
- 5. **Answer when asked.** An agent that hits a judgement call parks a typed
351
- decision — question, options, consequences, which are reversible. It
352
- arrives in the inbox, on `/next`, and on your phone if Telegram is
353
- paired; one tap answers it and the build resumes.
354
- 6. **Collect the result.** A build becomes Ready with its saved diff, checks,
355
- available screenshots and limitations. Open the result to mark Complete or
356
- request a specific revision. A scout returns a report. Publication requires
357
- its own approved grant; task completion alone never publishes or deploys.
358
-
359
- Verification can recover one common environment failure without hiding it.
360
- Run `toolroll verify set ... --self-heal` without `--yes` first. The
361
- preview shows the exact approved setup and its digest; confirm only that
362
- preview by rerunning with `--setup-digest <shown> --yes`. If the project
363
- check cannot start because a required project executable is missing,
364
- Toolroll may run that setup once and retry the exact check once. It
365
- does not recover ordinary test failures, timeouts, or an executable that
366
- exists but cannot run. Every step stays in the check log. Recovery stops if
367
- the setup or project check changes, setup fails, files change, the checkout
368
- moves, unchanged files cannot be confirmed, the worker loses custody, or
369
- the executable is still missing.
370
- 7. **Inspect without the transcript.** Open the task's result for its summary,
371
- changes and checks. Annotate exact lines and request a revision when needed.
372
- Saved history and diagnostics remain available without becoming another
373
- mandatory review step. Older results retain their own links.
374
-
375
- Specialized views remain in **Tools** and **Settings**: the activity ledger, the review cockpit,
376
- the fleet,
377
- people (invite a second approver), the operating mode (a signed, expiring
378
- envelope that pre-approves your own filings), and **chat** — your lead, one
379
- conversation across every project, which only ever proposes.
380
-
381
- ### In the terminal
382
-
383
- ```sh
384
- toolroll task add "Give outbound webhooks a bounded retry policy" --id retries --repo .
385
- toolroll task scope retries --goal "Exponential backoff, dead-letter after 24h, no payload changes" \
386
- --acceptance "A failing webhook retries with exponential backoff and dead-letters after 24h.|check"
387
- toolroll task show retries --json # the scope's digest is what you sign
388
- toolroll task approve retries --as you --digest <digest> --yes # asks for your password
389
-
390
- toolroll peek # one pane per live agent; q leaves
391
- toolroll decide <id> --choose <option> # answer a parked decision
392
- toolroll task show retries # attempts, outcome, where the branch is
393
-
394
- toolroll task add "Why does the login test flake?" --id flaky --report # a scout
395
- toolroll chat --say "what is waiting on me across every project?" # your lead
396
- ```
397
-
398
- Every command takes `--json` and answers with one envelope; every mutation
399
- takes `--key` so a retry never files twice. `toolroll --help` and
400
- `toolroll skills get console` are the live references — the second
401
- is what your coding agent reads when you ask it how something works.
402
-
403
- An agent that hits a judgement call **parks a typed decision instead of
404
- guessing** — answer it from the terminal, the console, or a Telegram tap,
405
- and the freed build resumes in seconds. Built work leaves only as a pushed
406
- branch and a pull request, under a publication grant whose exact terms you
407
- approved.
408
-
409
- ## Unattended is not auto-accept
410
-
411
- Every tool in this category has a mode where the agent stops asking —
412
- usually named something like *auto-accept*, or worse. Here the boundaries
413
- do not loosen when you leave the room:
414
-
415
- | An agent here can never | Enforced by |
416
- |---|---|
417
- | touch a default branch | builds land on `toolroll/<task>` in a leased worktree; push + PR happen only under a publication grant naming the exact repo, branch prefix, and base |
418
- | approve its own work | approval nonces are minted only on screens that restate the digest-bound terms, and require your approver token typed again — **no LLM sits in any approval path** — and the [agent fence](#what-an-agent-can-reach) keeps your remembered login, runner tokens and the database out of the agent's reach |
419
- | act on an irreversible option | `reversible` is a schema field; irreversible choices never auto-apply, and answering one from a phone takes a second minted confirmation tap |
420
- | see Toolroll's secrets | the [agent fence](#what-an-agent-can-reach) blocks your login, runner and bot tokens, stored provider keys and project tool secrets at the operating system; other providers' keys are stripped from each agent's environment; tool secrets rest sealed in the OS keychain ([how](#how-build-sessions-are-protected)) and other secrets in 0600 files, never in the database, URLs, or logs |
421
- | spend while idle | **an LLM never polls** — the daemon does every no-judgement chore at zero token cost and wakes an agent only on a real event |
422
- | spend without being counted | every provider spawn is stamped *before* it spends, so cost is measured, never asserted |
423
- | guess at a judgement call | it parks a typed decision — recap, options with reversibility, recommendation, evidence — and the other eleven tasks keep going |
424
-
425
- The whole claim is executable: one test,
426
- [`src/unattended.slow.test.ts`](src/unattended.slow.test.ts), queues twelve tasks,
427
- walks away, and comes back to pull requests.
428
-
429
- The name comes from a captain's night orders — the written standing instructions left for the officer of the watch: *proceed on this course without me, and wake me under exactly these conditions.* That is the product, and it is not about the hour: it is for **long-running work that outlasts your attention** — an afternoon of errands, a weekend, or yes, a night.
430
-
431
- Toolroll is a control plane for coding agents, optimized for the stretch where **nobody is watching**. It owns the scheduler, the attention surface — the typed queue of things waiting on a human — and an append-only event log.
432
-
433
- It owns a deliberately small local task store, adapts richer trackers when they are already there, and owns no worktree pool, no review gate, and no agents. Those are adapters over [`beads`](https://github.com/gastownhall/beads), [`treehouse`](https://github.com/kunchenguid/treehouse), [`no-mistakes`](https://github.com/kunchenguid/no-mistakes), `claude`, and `codex`.
434
-
435
- ## Two claims
436
-
437
- **Sixty seconds to first value.** No init, no daemon start, no wizard, no OAuth app.
438
-
439
- ```sh
440
- npx toolroll ~/code # or: git clone … && npm install && npm run dev -- ~/code
441
- ```
442
-
443
- It walks the filesystem for `.git` and reads every repo through the `git` credentials already on your machine, then shows what is in flight:
444
-
445
- ```
446
- 10 branches in flight across 24 repositories
447
-
448
- vamarketplacenew main
449
- feat/wise-payouts upstream gone 4d ago
450
- feature/public-api-v1 ahead 17 1mo ago
451
- api-pricing-impl behind 84 2mo ago
452
-
453
- oddcircle redesign/instrumentation-cash-flag
454
- main ahead 3, behind 56 23d ago
455
- ```
456
-
457
- No agent has run. Nothing has been configured, written, or installed. Every other tool in this space starts from an empty database it expects you to fill. `--json` emits the same thing as `{ scannedAt, roots, repos }`, because half the intended audience is an agent.
458
-
459
- Reads are priced before they are made. Listing refs is O(refs) and finishes in milliseconds; `git status` is O(working tree) and was measured at over two minutes on a real repo, so it is off by default behind `--dirty`. Computing ahead/behind walks history — 22s cold on a 304MB repo — so it is bounded at 5s and degrades to a branch list that says what it withheld. Every call goes through `--no-optional-locks`, so a scan never takes the index lock from an editor you have open.
460
-
461
- `toolroll pulls` answers the narrower question of what is waiting on a person, and `toolroll graph` says which work graph is already here:
462
-
463
- ```
464
- Work graph — detected in your repos
465
-
466
- ▸ beads 2 repos · 47 ready · native deps · runtime ok (1.4.0)
467
- GitHub Issues 112 open · native deps · 2.67.0 too old, needs 2.94.0
468
-
469
- Suggested: beads — the only work graph in your repos, and its runtime answers.
470
- Nothing is enrolled, and detection grants nothing.
471
- ```
472
-
473
- Backends are chosen by looking rather than asking, but **detection is not authorization** — finding a populated tracker says it exists, not that anyone wants an agent scheduling or closing what is in it. Data and runtime are detected separately, so a tracker whose binary is missing is reported as real work this machine cannot dispatch, which is a visible gap at 9am instead of a dead loop at 3am. Two populated trackers means neither is chosen: task count is not authority, and the biggest one may be the abandoned one. Where a fact is not established — Backlog.md's dependency edges, for instance — it is marked unverified and **fails closed**, because a private dependency graph other tools cannot see is shadow data.
474
-
475
- **Nothing is ever installed for you.** `bd init` stages files, edits agent integrations, and can create a commit, so Toolroll prints the command and its side effects and lets you run it.
476
-
477
- ## Queueing work, and taking it
478
-
479
- The built-in store is the fallback backend, and the commands over it are written for an agent first — because the agent is what runs them ten thousand times while you are away.
480
-
481
- ```sh
482
- toolroll task add "migrate the payouts schema" --id schema
483
- toolroll task add "wire the payouts API" --id api
484
- toolroll task block api --on schema # api waits for schema
485
-
486
- toolroll ready --json # what could be dispatched now
487
- toolroll claim schema --runner builder-1 --key dispatch-schema
488
- toolroll heartbeat <lease> # still working
489
- toolroll worker release <lease> # done holding it
490
- ```
491
-
492
- Four properties make that loop safe to run unattended.
493
-
494
- **Every outcome is data.** `--json` returns the same envelope from every command, failures included: `{ ok, command, reason, message }`. `reason` is a stable token — `held`, `fenced`, `unknown-task` — because prose gets reworded and anything branching on it breaks silently. The binary teaches its own surface: `contract --commands` dumps the declared command guide, and `skills get <name>` serves version-matched operating guides straight from the exact build an agent is driving — never a stale snapshot.
495
-
496
- **Exit codes separate "no" from "broken".** `0` got it · `1` something broke · `2` bad usage · `3` ran fine, the answer is no. Losing a claim race and finding the ready set empty are correct answers, not errors, and a loop that stops on them is as wrong as one that ignores real breakage.
497
-
498
- **Every mutation takes `--key`.** An agent whose command succeeded but whose output was lost *will* retry. With a key that retry returns the first answer instead of queueing a second task or taking a second lease. Mutations that changed nothing are never recorded, so a refusal never becomes a permanent no.
499
-
500
- **`fenced` means stop.** A runner whose machine slept, whose lease expired, and whose task was reclaimed will be told exactly that at its next heartbeat — long before it finishes work nobody will accept. Dispatch is a compare-and-swap on `(task, lease_generation)`, enforced by the database rather than by anything the caller remembers to check.
501
-
502
- ## The unattended pass
503
-
504
- `toolroll tick` is the loop above with nobody typing it, once per invocation:
32
+ macOS or Linux, Node.js 22.13+, git 2.41+, and a signed-in `claude`, `codex` or
33
+ `gemini` CLI.
505
34
 
506
35
  ```sh
507
- toolroll tick --runner builder-1 --token <t> --repo ~/code/thing --max 1
36
+ npm install -g toolroll # or: brew install ap9000/toolroll/toolroll
37
+ toolroll demo # optional: a seeded sandbox, no model calls, no spend
38
+ toolroll up # the app and a builder; opens http://127.0.0.1:4180
508
39
  ```
509
40
 
510
- One pass: take the ready set, skip what nobody approved, claim what is left — re-proving readiness inside the same transaction as the claim, because the world moves between a list and a take — build each task in a leased worktree on `toolroll/<task-id>`, and commit. **Tick itself never pushes** and cannot touch the default branch; pushing and opening the pull request happen only under a publication grant whose exact repository, branch prefix, and base you approved — and merging stays yours, on GitHub.
511
-
512
- It is deliberately a pass and not a daemon: point cron at it and the fences make repetition safe — a second pass finds the first's work done and converges to `empty` (exit 3) instead of building anything twice. A broken build marks its task `failed` and the pass exits 1 even if other tasks succeeded, because exit 0 has to mean "nothing needs you". Refusals that are really a person's pending decision — a scope nobody approved, or one that changed after approval — leave the task queued and untouched.
513
-
514
- ## Advanced: a separate background builder
515
-
516
- Normal local use does not require this section: `toolroll up` is the
517
- product command. For a remote or split deployment, the builder loop can manage
518
- itself as an OS service — launchd on macOS, systemd on
519
- Linux, Task Scheduler on Windows, chosen automatically — so "set it
520
- running" is one command, and reboots and crashes are the supervisor's
521
- problem:
522
-
523
- ```sh
524
- toolroll daemon install --runner builder-1 --token <runner-token> --repo ~/code/thing
525
- toolroll daemon status # running, as which pid, logs where
526
- toolroll daemon logs # the file to tail
527
- toolroll daemon uninstall # take it back off
528
- ```
529
-
530
- The service restarts after a crash and after an unexpected clean exit alike
531
- (launchd `KeepAlive`, systemd `Restart=always`, a restart loop under Task
532
- Scheduler); `daemon install` is idempotent on a healthy running service and
533
- really reloads a changed definition; `daemon uninstall` unloads and disables
534
- it. `--containment observed|preferred|required` chooses how provider, setup
535
- and check processes are bounded: a delegated cgroup v2 on Linux or a Job
536
- Object on Windows when native, the observational tree scan otherwise —
537
- `required` refuses to spawn rather than silently downgrading (macOS has no
538
- native equivalent; the status says so and names the Linux route). The
539
- contract and boundaries are in
540
- [docs/PROCESS_CONTAINMENT.md](docs/PROCESS_CONTAINMENT.md).
541
-
542
- Under the hood it runs `toolroll watch`: a work-conserving loop that
543
- composes the same passes cron would call — but wakes on events (a decision
544
- answered from your phone dispatches the next build in seconds), recovers
545
- its own predecessor's mid-flight work after a crash, and spends zero tokens
546
- while idle. The runner token lives in a 0600 file beside the database; the
547
- service unit never carries it. Cron remains first-class if you prefer it —
548
- `reconcile && tick ; bridge telegram` on a schedule does the same jobs at
549
- cron's cadence, and a stray cron tick alongside a watch is safe (ordinary
550
- claims settle the race), it just is not needed.
551
-
552
- An honesty note for Windows: every pull request builds Toolroll on Windows
553
- with Node 22 and runs the native Job Object containment tests there; the full
554
- suite runs on Ubuntu (Node 22 and 24), and on macOS nightly and for every
555
- release. Approved setup and verification commands use
556
- Windows' native command shell. The scheduled-task definition follows the Task
557
- Scheduler XML schema and every `schtasks` interaction is covered by scripted
558
- tests. A physical Windows install has not yet been certified; the exact
559
- real-provider and post-reboot checklist is in the
560
- [Never Stuck release certification](https://github.com/ap9000/toolroll/blob/main/docs/CERTIFICATION.md).
561
-
562
- ### Unattended permissions
563
-
564
- The console's **Settings → unattended permissions** control chooses the
565
- starting policy for new tasks. **Auto** lets routine repository commands and
566
- edits proceed while the provider may stop on a risky permission request.
567
- **Full access** runs Claude with `--dangerously-skip-permissions`, Codex (and
568
- its OpenRouter transport) in its own sandbox widened to write anywhere with
569
- network on, and Gemini with `--approval-mode yolo`, so permission prompts
570
- cannot pause work while you are away. A Full access agent can change files
571
- anywhere on your computer outside the [agent fence](#what-an-agent-can-reach).
572
- Use Full access only for repositories and setup commands you trust.
573
-
574
- ### What an agent can reach
575
-
576
- #### Sandboxing: built on Anthropic's sandbox-runtime (v0.0.79)
577
-
578
- Every fenced launch (a build's agent, its setup and check commands, a saved
579
- result's checks, a flow's setup and script, a project tool's server) runs inside
580
- [Anthropic's sandbox-runtime](https://github.com/anthropics/sandbox-runtime)
581
- (`@anthropic-ai/sandbox-runtime`, pinned to 0.0.79): the same sandbox Claude Code
582
- uses. Its own code writes the macOS Seatbelt profile and the Linux bubblewrap and
583
- seccomp command for each launch, with its baseline, its protected names and its
584
- limits; Toolroll only hands it a short config. `toolroll doctor` and Settings →
585
- Project → **Home folder** name the engine and its version. Where it can't run
586
- (Windows; Linux without bubblewrap, socat or ripgrep, or with unprivileged user
587
- namespaces off), nothing starts unless an instance operator allows unconfined
588
- agents (`toolroll config unconfined-agents allow`). Codex builds use Codex's own
589
- sandbox, given the same rules.
590
-
591
- What Toolroll adds to the runtime's config, and nothing else:
592
-
593
- - **Toolroll's own folders** are denied to read and write: the state folder
594
- beside the database (your remembered login `up-login.txt`, runner and
595
- coordinator tokens, chat bot tokens, the database and its backups, other runs'
596
- evidence) except the checkout pool, and `~/.toolroll` (stored provider keys and
597
- project tool secrets); other launches' private folders are unread.
598
- - **The build's own checkout** is writable; **other tasks' checkouts** are read,
599
- never written (those there when it starts).
600
- - **Your home folder** is readable, as in the runtime (a scope approved before
601
- 0.9.70 keeps hiding your credentials and agent settings, as it was approved). A
602
- project hides more with Settings → Project → **Home folder**, or `toolroll
603
- project sandbox --repo <p> --read-deny "~/.ssh,~/.aws"`; each approved scope
604
- seals that list.
605
- - **The network**: open, or only through the run's own proxy (below).
606
-
607
- The runtime's limits are accepted as they are: rules are fixed when a launch
608
- starts; on Linux a deny for a path that isn't there yet is the runtime's to handle;
609
- concurrent builds share the system temp folder; another process's arguments and
610
- environment can be read on macOS; and a folder or checkout made after a build
611
- starts is writable to it unless something above denies it.
612
-
613
- | | Auto | Full access |
614
- |---|---|---|
615
- | **Claude, Gemini, ACP agents** | Anthropic's sandbox-runtime (Seatbelt on macOS; bubblewrap and its seccomp filter on Linux, which also needs socat and ripgrep): reads your home folder except the folders the project lists, never Toolroll's folders; other tasks' work read, never written; writes only the checkout, its Git data, the project's caches, the run's temp folder and the agent's own session files (anywhere outside the fence, under a project set to write anywhere), never the runtime's protected names in the checkout (Git hooks and config, shell profiles, `.mcp.json`, editor settings); no Apple Events. Neither (Windows, or a Linux missing one of those): the build doesn't start, unless an instance operator allows unconfined agents | same |
616
- | **Codex / OpenRouter** (any OS) | Codex's own sandbox, given the same fence: reads your home folder except the folders the project lists, never Toolroll's folders; other tasks' work read, never written; writes only the checkout, its Git data and the project's caches (anywhere outside the fence, under a project set to write anywhere); no network | the same reads and writes, with the fence; its commands reach the network only when the project's network is open |
617
-
618
- **Where a build writes.** Each approved scope also seals where its build may
619
- write. By default (Settings → Project → **Where builds write**, or `toolroll
620
- project writes --repo <p> workspace`) a build writes only its checkout, its
621
- checkout's commit data (never the repository's Git config, hooks or info, other
622
- checkouts' data or submodules), the project's own package caches (npm, pnpm,
623
- yarn, pip, uv, Go, Cargo, Gradle: its package managers are pointed there), the
624
- run's temp folder, and the session files its agent CLI must keep. Your shell
625
- profile, login items, `~/.claude` settings and everything else stay as they
626
- are; Claude's other live sessions aren't even readable. A project whose tools
627
- must write elsewhere can choose `anywhere` (outside the fence, as before);
628
- approvals from before this setting keep writing anywhere, as they were approved.
629
- The build's setup, check, follow-up and batch commands run in the same fence.
630
- Toolroll's own Git on a build's checkout runs hardened (no hooks, fsmonitor,
631
- submodules or signing), reads none of your global Git config but its plain values
632
- (identity, line endings, a standard git-lfs install), and refuses a checkout
633
- whose config includes a file or names a command; a project's tool servers can't
634
- read the checkout and never run a file the build wrote.
635
-
636
- **The network.** Each approved scope says what its build may reach: the
637
- agent's provider, the package registries the project uses (npm, PyPI,
638
- crates.io, the Go proxy, RubyGems, Maven), and any hosts an approver added
639
- with `toolroll project network --repo <p> --allow api.example.com`. Every
640
- connection goes through the run's own proxy, which admits only those hosts;
641
- the sandbox refuses everything else, name lookups included. On a Mac a build
642
- reaches no local service but its own proxy and tools: a project whose tests
643
- start a local server sets `--local any` (every local service on that Mac then
644
- becomes reachable). A result's **Network** row says what the build connected
645
- to and what was refused.
646
-
647
- Each attempt records how it was fenced. Two limits to know: in **API-key
648
- mode** an agent's own provider key is in its environment, so its shell can
649
- read it (subscription mode, the default, puts no key there); and a project's
650
- own tool secrets reach that project's tools. They stay in a per-run broker
651
- outside the fence: the agent gets only its address and a token that stops
652
- working when the run ends. A tool server's own environment (its secrets among it)
653
- is readable to a build on macOS through the process list, a limit of the sandbox
654
- runtime's baseline. Reviews and the lead chat run with no tools and are
655
- confined to their own files. See [SECURITY.md](SECURITY.md).
656
-
657
- ### How build sessions are protected
658
-
659
- A build runs as your own user, so Toolroll keeps the secrets it holds (tool
660
- keys and sign-ins, the Linear key, a Google mail connection, flow webhook
661
- secrets) away from it in layers:
662
-
663
- - **The fence.** The operating system denies the build Toolroll's own
664
- folders, your home configuration and other projects (the table above).
665
- - **The broker.** A run's tools are served by a broker in Toolroll's own
666
- process, outside the fence. The agent gets only the broker's local address
667
- and a key for that run, which stops working when the run ends. Another
668
- run's key opens nothing.
669
- - **The keychain.** At rest, secrets are in the macOS Keychain (through
670
- `security`, with the value on its input) or the Linux Secret Service (the
671
- system's `secret-tool`, value on its input). A fenced build can still ask
672
- the keychain for an item, so each is sealed with a key in `tool-secrets`
673
- beside Toolroll's database. Toolroll makes that folder when it starts,
674
- before any build, and records which key it made; a folder, key or link put
675
- there by anything else is refused. What a build reads is ciphertext.
676
- Secrets are read only when a run starts. Files from before move into the
677
- keychain the first time they are used, and the plaintext copy is removed.
678
- Where there is no keychain, or the keyring doesn't answer, secrets stay in
679
- owner-only files, and Settings and `toolroll integrations` say so.
680
- - **Short-lived tokens.** A service connected by signing in gives each run
681
- a fresh access token of its own, made outside the fence when the run starts
682
- and limited to read access for research steps where the service allows.
683
- The refresh token never leaves Toolroll, and one renewal runs at a time
684
- across Toolroll's processes. If a renewed sign-in can't be saved, the run
685
- doesn't start and every token made for it is revoked. The run's token is
686
- revoked when the run ends, or runs out on its own where the service has no
687
- way to revoke it. Keys you paste in stay in the broker. Settings → Tools
688
- shows which each tool uses.
689
-
690
- What remains: any program of yours running outside the fence (not started by
691
- a build) can read what you can, including Toolroll's folder and the keychain.
692
- Toolroll protects your secrets from its builds, not from other software you
693
- run.
694
-
695
- Every new-task and task-scope form has the same two-choice control. A task's
696
- choice is durable through planning rewrites and is sealed into the approved
697
- execution profile; changing the installation default never broadens an
698
- existing scope or approval.
699
-
700
- ### Quality modes
701
-
702
- The **quality mode** setting selects routine or stronger configured agents.
703
- **Strict / release** requests the stronger tier; it does not start an isolated
704
- reviewer or automatic repair. The choice is signed into each scope, survives
705
- later global changes, and remains visible in approval and run details.
706
- Repository checks still run through the approved verifier. Publication and
707
- deployment require their own authority and checks.
708
-
709
- ### Explainable phase routing
710
-
711
- Which agent plans, builds, and repairs a task is decided once, from
712
- signed facts, and written down with its reasons. The route reads the task's
713
- **size** (small, medium, large, risky or not), its quality mode, what the
714
- acceptance rubric demands (screenshots, manual review), how far a live
715
- operating mode may carry the result unattended, each provider's plan room, and
716
- the agents you configured for each phase. Strength is never
717
- inferred from a model's name: the ordinary phase row is the routine tier, and
718
- `config set <phase> --tier strong --provider <p> --model <m>` names the agent
719
- large or risky, strict, screenshot-proof, and automerge routes reach for. With no
720
- strong row, a demanding task keeps the default and says so.
721
-
722
- ```
723
- toolroll task route <id> --size large --as you --token <t>
724
- toolroll task route <id> # every leg, its reason, its readiness
725
- toolroll task route <id> --phase build --provider codex --model gpt-5-codex --as you --token <t>
726
- toolroll task route <id> --clear-phase build --as you --token <t>
727
- toolroll providers --report --runner <name> --token <t> # this machine's readiness
728
- ```
729
-
730
- Every leg is **exact**: approvals bind a provider *and* a model id for the
731
- planner, builder, and repair alike, so each phase names its model
732
- once (`config set plan --provider claude --model <m>`, and the same for
733
- `build`; repair inherits the build's model unless a same-provider
734
- repair row names another). A phase without an exact model, a repair row on
735
- another provider, or an unknown provider files the scope **unresolved** with
736
- the words to fix it — nothing is guessed or substituted. Every override names
737
- an exact model too, and a plan override becomes the planner pin.
738
-
739
- Every override is recorded under the approver's name, in one transaction that
740
- checks the scope you were reading is still the one on file (`--digest`, or the
741
- form's own field). Approval seals the route — routine-shaped routes included —
742
- exactly as it seals the execution profile; a later size change or override
743
- re-files the scope and the old
744
- approval reads stale, while a global configuration change can never rewrite a
745
- sealed route. A row filed before routing existed is recognised by a durable
746
- marker and stays governed by its sealed profile; a routed row whose route data
747
- is missing or unreadable is refused everywhere until re-filed and approved
748
- again. Repairs always stay on the build provider. Runners report provider
749
- readiness without spending — at startup and with `providers --report`, never
750
- on a timer — and the task page, the chat, and `task show` say **ready**,
751
- **unavailable** (with the runner's own words), or **unknown** beside the
752
- agents, outside what the approval signs; an unavailable provider halts before
753
- any claim and is never substituted. When a provider's plan runs out mid-build,
754
- the attempt fails with its reason like any other failure and the task waits
755
- for a retry or for you; nothing switches to another agent or account on its
756
- own. Every run is stamped with its route and the actual provider and model at
757
- admission — set once; a run that would spend as anything else refuses.
758
-
759
- Admission proves that stamp before any run row exists: its shape (a known
760
- phase, provenance word, and provider; a digest; an exact, argv-safe model id),
761
- its phase against the run's role, its provider and model against what the run
762
- would spend as, and its provenance against the authority the task actually
763
- holds — the sealed route's digest and that phase's exact leg, or a proven
764
- pre-routing row for `legacy`, whose stamp must name the very sealed profile
765
- (and, for a build or repair, its exact pair) — the bare word `legacy` belongs
766
- only to a task with no scope. A task filed under routing never opens an
767
- unstamped run, and the store dictates nothing: every planner, builder, scout,
768
- reviewer, and repair turn **presents** the exact authority it holds
769
- (`routeAuthorityFor` puts it in the caller's hands, in words), and a missing,
770
- forged, stale, or inexact stamp opens no row — the refusal names what would
771
- have had to be presented. A repair turn mends exactly its same-task parent
772
- under the claim that holds the task now. A run admitted under a route the scope
773
- has since re-sealed away refuses to spend. Malformed authority — corrupt route
774
- or profile JSON, a model id that is not one, a turn bound or clock that is not
775
- a positive whole number — fails closed in words and never shrinks.
776
-
777
- Fallback chains and the declared risk level were removed (schema v115). An
778
- unfinished task that was filed or approved with fallback agents asks again
779
- after the update — its scope says so, and saving it once chooses its
780
- agents; finished tasks and routes sealed at elevated or high risk keep their
781
- exact bytes and still verify.
782
-
783
- Codex resumes carry their sandbox as a configuration override (`-c
784
- sandbox_mode=…`): `codex exec resume` has no `--sandbox` flag, so a structured
785
- correction or repair-by-resume handed one exited before it initialized. A
786
- resume the harness refuses by its own protocol, or never comes up for, ends
787
- the planning attempt with its typed reason — the recorded session is not
788
- resumed twice — and the next attempt, after the planning backoff, is a fresh
789
- planner root in a fresh session.
790
-
791
- A **scheduled flow** with a standing order files an ordinary task each time
792
- it fires: the order's terms (goal, exclusions, touches, requirements, success
793
- checks, per-run budget) are copied into the task's scope unchanged, and the
794
- task waits for approval under the project's approval rules like any other
795
- proposal. A standing order moved over from an old routine keeps that routine's
796
- approval and its frozen agents while they still verify: each firing re-hashes
797
- the frozen snapshot against the approval, holds the build and repair legs to
798
- the sealed profile's exact provider and model, and rolls the whole firing back
799
- unless the task seals under it — a later `config set` cannot re-route it. Once
800
- that approval no longer verifies, each firing says why and waits for approval
801
- as an ordinary proposal. `toolroll flows show` prints a standing order's
802
- terms; `toolroll flows trigger pause|resume` (or **Resume** on the flow canvas)
803
- stops and starts its schedule.
804
-
805
- Every approval surface — the task page, the focused chat, and `/next` — shows
806
- the same concise line of exact agents above the password, with why stronger
807
- agents run explained in plain words and the runtime limits one tap away; changing
808
- any agent invalidates the approval every surface signed under. Where no yes
809
- could bind — an unreadable route, a route that cannot run, or a pre-routing
810
- row whose old approval no longer stands — those surfaces mint no nonce and
811
- show no password or approve button, only the reason and the act that opens it
812
- (re-file the scope or change the agents) — the inbox row reads *needs
813
- attention* rather than *review & approve*; an old approval already on a
814
- pre-routing row is grandfathered, but no new yes lands on it. In the demo sandbox, Chat is a
815
- scripted lead that never calls a model; real chat evidence is a subscription-backed plane. The task page's controls offer,
816
- per role, only the agents you configured *for that role* (gemini never
817
- reviews; repairs stay on the build provider), a current agent the
818
- configuration no longer names is shown for what runs today and never offered
819
- again, and each size says what it does — truthfully under strict quality and
820
- screenshot proof too. Chat reads the same route (`get_agents`)
821
- and proposes one confirmation-gated change (`propose_agents`) — a size, one
822
- role switched to a listed agent, or a hand-picked role cleared — which lands,
823
- when you confirm the card, through the same authenticated route edit the page
824
- uses; the chosen agent is re-proved against the role's configured choices
825
- *inside* that transaction, so a card drafted against yesterday's
826
- configuration changes nothing.
827
-
828
- ## The phone, both directions
829
-
830
- The Telegram bridge closes the loop without a terminal: a parked decision
831
- arrives as a message with one button per option, and a tap answers it
832
- through the same authenticated path as the CLI and the web view — the hold
833
- lifts, and the next pass resumes the task with the answer in the agent's
834
- brief. No LLM is anywhere in this path.
835
-
836
- Setup, once:
837
-
838
- 1. In Telegram, message **@BotFather**: `/newbot`, pick a name and a
839
- username. Copy the token it hands you.
840
- 2. `toolroll bridge telegram token <that-token>` — stored in a 0600 file
841
- beside the database (or set `TOOLROLL_TELEGRAM_TOKEN`, which wins;
842
- or paste it into `serve`'s settings card from your phone).
843
- 3. `toolroll approver add you --password <yours>` if you have no
844
- sign-in yet — that name and password are the login for the console and
845
- every approving act. (Omit `--password` and a high-entropy one is
846
- minted and printed once instead — better for API/bearer use.)
847
- 4. `toolroll bridge telegram pair --as you --token <approver-token>` —
848
- prints a one-time code, good for ten minutes.
849
- 5. From your phone, open your bot's chat, press Start, send
850
- `/pair <that-code>`, then run `toolroll bridge telegram` once to
851
- complete it. The bot replies with who the chat now answers as.
852
-
853
- Then cron the pass next to `tick`:
41
+ `up` saves your password in `up-login.txt` and prints the command that shows
42
+ it (never the password itself), then keeps running. Then, in a repository:
854
43
 
855
44
  ```sh
856
- toolroll bridge telegram # sends pending, applies taps, exits
45
+ toolroll onboard --yes # add it as a project, install the agent skill
857
46
  ```
858
47
 
859
- Once paired, an ordinary message in that chat talks to the same assistant
860
- as the console's chat page and `toolroll chat`: the same saved
861
- thread, the same proposal cards (Confirm or Dismiss under each one), the
862
- same confirm doors, with the phone recorded as the source. `/status`,
863
- `/task <id>` and `/help` stay cheap, model-free reads. Reply to a result
864
- message to ask for changes to that exact result; approvals that take a
865
- password, cancelling and publishing still happen on the computer. Chat from
866
- the phone uses your configured membership provider only; a direct-API
867
- configuration is never spent from Telegram.
868
-
869
- `bridge telegram status` shows the token source, the binding, and what is
870
- waiting. For answers in seconds instead of at the next cron firing,
871
- `toolroll bridge telegram --follow` stays on the wire — one long-poll
872
- actor holding the same poll lease, so a cron pass overlapping it simply
873
- loses the race. `toolroll watch` embeds the same follower automatically
874
- when a bot token is configured: a tap on your phone answers the decision,
875
- the answer wakes the loop, and the freed task resumes — phone to build,
876
- no timer in between.
877
-
878
- **Away mode.** `toolroll bridge telegram digest --every 2h` (or
879
- `--off`, or the console's settings card) holds routine facts — merges,
880
- reports, retries, plans ready — and sends them as one digest on that
881
- cadence. A decision, and anything that needs a person now (a stalled
882
- task, a malformed payload, a gap that blocks work), still pages the
883
- moment it lands. `bridge telegram status` says how many facts are held.
884
-
885
- **Check work from your phone.** In the paired private chat, send `/status`
886
- for recent work across enrolled projects, `/task <id>` for one task's exact
887
- state, recorded evidence, delivery status and next step, or `/help` for the
888
- available commands. These read existing workflow records without a model call
889
- or task mutation. A saved branch, a pending review, and a merged PR stay
890
- distinct. `/status` covers the newest 60 tasks, explicitly says when older
891
- work is omitted, and shows up to two rows per group; `/task` can look up older
892
- tasks directly. The computer and bridge must be awake and connected. These
893
- commands are not yet free-form task creation or revision chat; use the console
894
- for those. See [phone status and its limits](docs/PHONE_STATUS.md).
895
-
896
- A chat is not a person: pairing binds one private chat and one immutable
897
- Telegram user id to one approver credential. Buttons carry opaque one-time
898
- tokens whose meaning lives in the local database — a stolen bot token can
899
- read what was sent and repaint keyboards, but it cannot mint a token,
900
- answer as you, or arm an irreversible choice, which takes a second minted
901
- confirmation tap. Rotating your approver credential strands the chat and
902
- every outstanding button, and the bot token itself is stripped from every
903
- agent's environment.
48
+ Open **Chat**, say what you want, approve the plan. The result comes back
49
+ **Ready**. More: [Getting started](docs/guide/getting-started.md).
904
50
 
905
- ## Peeking at the agents
51
+ ## How it works
906
52
 
907
- ```sh
908
- toolroll peek # one pane per live run: stage, clock, what the agent is saying
909
- toolroll peek 42 # follow one run until it finishes
910
- toolroll peek --tmux # a real tmux session, one window per run
911
53
  ```
912
-
913
- The panes tail each run's live transcript, the same file the console's
914
- run page follows: the text the agent said and the kind of tool it reached
915
- for (editing files, running a command, searching the code), never file
916
- contents or command lines, with credential-shaped lines redacted at
917
- write. Digits focus one pane, `a` shows them all, `q` leaves. Outside a
918
- terminal, or with `--json`, it prints one snapshot and exits.
919
-
920
- ## The lead, its subagents, and the gateway
921
-
922
- `/chat` in the console (or `toolroll chat` in the terminal, or your chat app on
923
- the phone) is one conversation with your lead across every project you serve.
924
- The console, the terminal, Telegram, Slack, Discord and Teams all talk to the
925
- same lead with the same tools. The lead reads the fleet
926
- and **only proposes**: file a task (or a scout), move one to the front,
927
- reserve it for a worker, hold it, rewrite a scope, retry/replace/unlink a
928
- terminal dependency, send a task's agent guidance, cancel, or suggest an answer to a parked decision. Every
929
- proposal is a card you confirm, with
930
- every consequence and the builder's recommendation shown beside the
931
- lead's pick; a scope the lead wrote never seals under an operating mode.
932
- Absolute paths, internal digests and account names are redacted; source context includes relative file citations. Direct API use spends
933
- against a ceiling you set per conversation. The console keeps a live pulse for every
934
- admitted project beside that shared thread, with one-click fleet questions
935
- and a direct road to each project's board.
936
-
937
- The lead has **subagents**: named helpers, each with its own personality,
938
- instructions and rules (what it does on its own, what it asks first, what it
939
- never does). Say "ask Maya to draft the refund reply" and the lead shows a card
940
- with exactly what goes to Maya; once you confirm, Maya works it within her rules
941
- and her answer comes back to you. A flow step can call a subagent by name too.
942
- They live in **Settings → Lead → Subagents** ([guide](docs/guide/subagents.md)).
943
- Subagents used to be called AI teammates; each carried over unchanged.
944
-
945
- The central team service (`toolroll connect`, the central `toolroll lead
946
- list|create|update|member|transfer`, `toolroll conversation …`, team chat) and
947
- native coding sessions (`toolroll session …`, the `/code` page) are deprecated:
948
- they still work for this release, hidden from help and the console, print one warning
949
- when used, and are removed in the next minor release.
950
-
951
- Every task has an **Overview / Ask** switch. **Ask** opens a focused companion
952
- to that task without creating another conversation: Toolroll attaches
953
- the current task to each new message, keeps the live status beside the thread,
954
- and offers plain-language starters for status, scope revision, steering, and
955
- result inspection. Proposed guidance is inert until you confirm its card. A
956
- running build's agent then reads it when it next checks for notes; otherwise
957
- the next attempt does. Each note says whether the agent has read it.
958
-
959
- New work starts the same way: describe the outcome once in ordinary language.
960
- The lead infers a concise title, narrow scope, safe non-goals, and proof
961
- criteria; it asks only when the project or outcome is genuinely ambiguous, or
962
- when an irreversible or compatibility tradeoff changes what should be built.
963
- Questions are grouped, carry a recommended default, and stop for reversible
964
- choices when you say **use your judgment**. The task card says whether Standing
965
- Orders will inspect the repository and draft a plan before asking you to
966
- approve anything.
967
-
968
- When a task finishes, both views lead with the same Ready status and result.
969
- Open the work and its actual checks, then mark Complete or request changes.
970
- Historical diagnostics remain available in details; optional missing assessments
971
- do not create another review stage. Chat cannot rewrite the stored result.
972
-
973
- The evidence page opens the sealed patch in a clean **View** mode. Switch to
974
- **Annotate** only when you need a change: select the exact line, leave plain-
975
- language feedback, and collect as many notes as needed. Creating a revision is
976
- a separate, optional act that seals the exact annotation batch into one scoped
977
- task for approval; ordinary result review never requires it.
978
-
979
- The chat setup screen defaults to **Codex membership · default model**.
980
- Run `codex login` once on the machine serving Toolroll, choose that
981
- provider, and there is no Toolroll dollar maximum. The conversation
982
- stays live until you end it; the daily turn limit and your plan's own upstream
983
- limits still apply. Anthropic
984
- membership works the same way after signing in with the `claude` CLI. Direct
985
- `anthropic-api` and `openrouter-api` modes remain available; only those modes
986
- ask for weekly and per-conversation dollar ceilings.
987
-
988
- ```sh
989
- codex login
990
- toolroll config set chat --provider codex-subscription --as you --token <password>
991
- toolroll serve --repo /path/to/project-a --repo /path/to/project-b
992
- # Open /chat, type your password once to start the conversation, then talk.
54
+ describe ─▶ scope ─▶ approve ─▶ build ─▶ check ─▶ Ready ─▶ you decide
55
+ you agent exact diff Complete,
56
+ commit + proof revise or merge
993
57
  ```
994
58
 
995
- Coding agents you run elsewhere reach the same plane through the MCP
996
- gateway: `toolroll mcp` serves a coordinator credential you mint,
997
- bound to named repositories, that can read the fleet, file quarantined
998
- proposals, and propose the same guarded acts — `toolroll proposals`
999
- and the task page are where you confirm them. Both roads keep the one
1000
- rule: the plane never acts on a model's word.
1001
-
1002
- ## The console
1003
-
1004
- `toolroll serve --repo <path>` is no longer just the decision view — it
1005
- is the whole built-in queue, operable from a phone: an inbox of everything
1006
- waiting on you, a live activity report (run counts, measured spend,
1007
- decisions, incidents, stranded work, gaps), every task with its scope, holds, runs, decisions and
1008
- incidents on one screen, run pages with the economics and the agent's
1009
- concluding words, and read-only capabilities. Adding a task, holding,
1010
- requeuing, cancelling, and editing a scope all happen from the page — each
1011
- re-proved server-side, so a stale tab never erases what the world did in
1012
- the meantime, and a task a runner is building right now refuses to be
1013
- cancelled out from under it.
59
+ 1. **Describe** the outcome in Chat, the terminal or your phone.
60
+ 2. **Scope.** The lead reads the repository and drafts the goal, what's out of
61
+ bounds, acceptance criteria, and the exact agent and model.
62
+ 3. **Approve** once. Nothing spends until you do; changing the terms asks again.
63
+ 4. **Build.** An agent works in its own worktree and branch. A judgement call
64
+ becomes a question for you, not a guess.
65
+ 5. **Check.** Your project's own check runs on the exact commit.
66
+ 6. **Ready.** The diff, the check log and screenshots. Mark it Complete, ask
67
+ for a revision, or merge through the pull request.
1014
68
 
1015
- Approving a scope is deliberately heavier than a click: the form restates
1016
- the goal, the exclusions, and the touched paths — exactly the fields the
1017
- approval digest binds — and requires your approver token typed again. A
1018
- logged-in session alone can read everything and approve nothing.
69
+ ## Use cases
1019
70
 
1020
- Plain HTTP, so keep it on localhost or a tailnet and put TLS in front for
1021
- anything else.
71
+ **Clear the backlog overnight.** Queue the tasks you never get to. Each builds
72
+ under its approved scope, in parallel, and recovers by itself after a
73
+ restart. You wake up to results, not transcripts.
1022
74
 
1023
- ### Webhooks through a reverse proxy
75
+ **Ship behind a real check.** Your project's command decides what passes, on
76
+ the exact commit being released. A deploy refuses anything that wasn't
77
+ checked and marked Complete.
1024
78
 
1025
- Flow triggers can take webhooks from GitHub, Linear or any service at a
1026
- secret address under `/hooks/`. Keep the console itself private (on your
1027
- tailnet or localhost) and expose only that path. With Caddy:
79
+ **Decide from your phone.** Plans, questions and results arrive in Telegram,
80
+ Slack, Discord or Teams with buttons. One tap answers; the build resumes.
1028
81
 
1029
- ```caddy
1030
- hooks.example.com {
1031
- handle /hooks/* {
1032
- reverse_proxy 127.0.0.1:4180 {
1033
- header_up Host {upstream_hostport}
1034
- }
1035
- }
1036
- respond 404
1037
- }
1038
- ```
82
+ **Triage issues as they arrive.** A new GitHub or Linear issue starts a card
83
+ in a flow. Jev, a small sorting model, triages it; real bugs become tasks you approve.
1039
84
 
1040
- Then save `https://hooks.example.com` as the public webhook address on a
1041
- flow's Triggers panel. GitHub deliveries are proved with the secret the
1042
- panel shows once; Linear deliveries with Linear's own signing secret, pasted
1043
- on the panel behind your password. Addresses are never stored readable: a
1044
- lost one is replaced with **New address**, which retires the old.
85
+ **Repeat work on a schedule.** Dependency bumps, coverage, docs drift: a
86
+ scheduled flow files the same approved terms each time, with a per-run budget
87
+ and an optional 7-day cost ceiling.
1045
88
 
1046
- ## Steering a fleet, not just a task
89
+ **Run one server for the team.** Each engineer signs in with your identity
90
+ provider or their own API token, sees only their projects, and reaches it from
91
+ the CLI or MCP. Every act lands in one ledger.
1047
92
 
1048
- Everything below ships in 0.4.0:
93
+ ## Why Toolroll
1049
94
 
1050
- - **The queue screen** — every worker's up-next list as columns, like a
1051
- music queue: drag to reorder, drag into a worker's column to reserve a
1052
- task for it (each column wears an editable theme note), top is taken
1053
- first. A worker drains its own column, then the shared queue. The
1054
- reservation is enforced in the claim primitive itself — the wrong
1055
- worker's claim gets a typed `reserved` refusal, however it asks.
1056
- - **Chains and "this one first"** — `task block/unblock` wires
1057
- dependencies (cycles refused), "starts after" on the filing form,
1058
- `task next` moves work to the front of its own queue. Scheduling,
1059
- never authority: approvals are untouched by any of it.
1060
- - **The live peek** — a running build's page shows what is changing in
1061
- its checkout right now (names and counts, never contents), through a
1062
- native reader that executes nothing — no git command ever runs
1063
- against an agent-controlled worktree.
1064
- - **External dispatch** — enroll a GitHub repository with an explicit
1065
- dispatch grant and its labeled issues become ordinary local tasks:
1066
- scoped and approved HERE (issue bodies are never imported — a tracker
1067
- anyone can write to is a prompt-injection surface), built unattended,
1068
- answered back with a PR-link comment under exactly the write classes
1069
- you granted. An issue closed mid-build can never publish: the
1070
- completion transaction disowns it, keeps the branch as evidence, and
1071
- says so. Done stays done — remote closure never regresses a completed
1072
- dependency. Revisions ride review comments: mark up the finished
1073
- diff (or let granted reviewers do it from the PR) and seal the batch
1074
- into one new approval-bound task.
1075
- - **Operating modes** — a per-repository, password-signed, expiring
1076
- envelope that pre-authorizes the SIGNER'S OWN future acts: your
1077
- filings approve themselves the moment you file them, merges fire themselves when CI
1078
- is seen green on the exact authorized commit (only through a merge
1079
- grant, never around one), and daily run/dollar rails bound the spend.
1080
- Every term renders in words at the signing ceremony — including the
1081
- sentence "your signed-in browser session becomes a spend credential
1082
- for this repository" — and ending it all is one click, for any
1083
- approver, at any moment. No mode signed means nothing changes: every
1084
- act keeps its own ceremony, the default forever.
1085
- - **The reviewer** — an agent pass over a finished build's sealed diff,
1086
- and nothing else: no worktree, no repository access — the patch is
1087
- re-verified against its recorded hash, comments are proven
1088
- patch-local, and they land beside your own for YOU to prune and seal
1089
- into a revision task. A revision keeps the source's contract — its
1090
- goal, exclusions, touches, exact rubric, quality,
1091
- permission posture, and budget ceiling — however the installation's
1092
- defaults have changed since, re-resolves its agents for a fresh
1093
- approval, and inherits no approval, session, publication, or merge
1094
- grant (the policy is [docs/REVISION_TERMS.md](docs/REVISION_TERMS.md)).
1095
- One successful review per build, ever; a mode
1096
- can run one on every finished build automatically. A review that
1097
- fails or is interrupted may be retried EXPLICITLY — `task review
1098
- <run>` again, or the task/result page's **Retry review** — at most
1099
- twice (three root attempts in all). Each retry is a fresh request and
1100
- a fresh reviewer admitted under the build's current sealed route with
1101
- every sealed input re-verified; the failed attempts stay on record;
1102
- a review that succeeded, or one still queued or running, is never
1103
- retried; nothing retries by itself, and the source build is never
1104
- rerun. A retry is an operator's act only: the mode's and the Strict /
1105
- release scope's automatic review asks are one shot per build, and a
1106
- replayed one is refused at request and again at admission, before any
1107
- money.
1108
- - **People** — invite someone with a single-use link that pins their
1109
- powers at mint (watch everything, or approve and act), see who is
1110
- doing what, and remove access with one ceremony that actually severs:
1111
- sessions, invites, and every mode they signed end together, while
1112
- history stays attributed forever.
1113
- - **Scout tasks** — `task add … --report` (or the "scout" checkbox, or
1114
- the lead's `propose_task` with `report: true`) files a task whose
1115
- deliverable is a report, never a branch: once its scope is approved,
1116
- a read-only session investigates the goal as a question and hands
1117
- back a title, a summary, a document, and up to five follow-ups, each
1118
- of which files as a task with one tap. The workspace is proven
1119
- untouched before a byte of the report is read; a scout that changed
1120
- anything gets nothing ingested.
95
+ - **You approve scope once.** The approval binds to the exact goal, bounds,
96
+ criteria, agent and model. No model sits in any approval path.
97
+ - **Evidence, not trust.** Ready means the check ran on that commit. A failed
98
+ check stays failed.
99
+ - **Your machine, your logins.** Agents use the Claude and Codex subscriptions
100
+ you already have. An OS-level fence keeps them away from Toolroll's secrets.
101
+ - **Any agent.** Claude Code, Codex, Gemini and OpenRouter, routed per phase.
102
+ - **Open source.** MIT. Your data is one SQLite file on your disk.
1121
103
 
1122
- ## Writing to a tracker you already have
104
+ ## Features
1123
105
 
1124
- Detection tells you what is there; a grant is what lets anything be written to it.
106
+ | Area | What you get |
107
+ |---|---|
108
+ | **Approvals** | Digest-bound scopes, password step-up, typed decisions with reversibility, expiring operating modes |
109
+ | **Agents** | Claude Code, Codex, Gemini, OpenRouter; an exact model per phase; subscription or API key |
110
+ | **Models** | One editor (Settings → Models): "Sized by job" by default (Haiku for small tasks, Sonnet for routine, Opus for large or risky, Opus plans and reviews), or "Opus for everything"; every change shown before → after and logged |
111
+ | **Surfaces** | Web console (desktop and phone), CLI, Telegram, Slack, Discord, Teams, MCP |
112
+ | **Flows** | Zones on a canvas; triggers from schedules, GitHub, Linear, webhooks, email and chat; scripts, drafts, AI triage |
113
+ | **Team** | Team server, OpenID Connect sign-in, per-person API tokens, project grants, subagents |
114
+ | **Audit** | Hash-chained action ledger (`toolroll ledger verify`), evidence packs, full export |
115
+ | **Spend** | A Spend page in Settings: API dollars, plan usage and unknown cost kept apart, by project, model, role and person, with CSV export; monthly limits, plan windows, zero tokens while idle |
116
+ | **Safety** | Agent fence on Anthropic's sandbox-runtime (Seatbelt, bubblewrap) and Codex's sandbox, per-scope network and write rules, keychain-sealed secrets, per-run tool broker |
117
+ | **Operations** | Crash recovery, backups and restore, Prometheus metrics, OpenTelemetry traces |
118
+
119
+ ## For agents
120
+
121
+ Toolroll is built to be driven by agents. Every command answers `--json`
122
+ with one envelope and a stable `reason`; exit codes are `0` ok, `1` broke,
123
+ `2` usage, `3` the answer is no; every mutation takes `--key`.
1125
124
 
1126
125
  ```sh
1127
- toolroll enroll . --backend github-issues --paths owner/name # shows the terms
1128
- toolroll enroll . --backend github-issues --paths owner/name --yes
1129
- toolroll grants # what has been granted, and to what
1130
- toolroll revoke . # take it back
1131
-
1132
- toolroll ready --backend github-issues # reads need no grant
1133
- toolroll task add "..." --backend beads # writes do
126
+ toolroll contract --commands --json # the whole command surface
127
+ toolroll skills get operating # the rules, from the binary you're running
1134
128
  ```
1135
129
 
1136
- The grant is not a boolean. It records which paths or repositories may be touched, which mutation classes are allowed, which tasks are covered, which credential scope applies, and whether the writes will turn up in `git status` — that last one asked of `git check-ignore` rather than assumed. Two defaults carry weight: only tasks Toolroll created or was given, because enrolling a repo with four hundred open issues is not volunteering all four hundred; and `close` is withheld, because closing what somebody else filed is not the same act as transitioning your own task.
130
+ Start at [docs/agents.md](docs/agents.md). [`llms.txt`](llms.txt) indexes the
131
+ docs for language models.
1137
132
 
1138
- Every backend goes through the same contract, and the authorization wraps it rather than living inside each adapter — an adapter written later inherits the check instead of having to remember it.
133
+ ## Docs
1139
134
 
1140
- **Edges are never emulated.** beads has native dependencies and they are used. This GitHub adapter has not confirmed the dependency endpoint against a live repository, so `addEdge` refuses rather than storing a graph only Toolroll can see — one that would read as ready to every human on the repo. That is the design's rule, and the refusal says so.
135
+ - [Getting started](docs/guide/getting-started.md): install, first task, terminal, desktop app
136
+ - [Tasks, results and revisions](docs/guide/tasks.md)
137
+ - [Chat and your phone](docs/guide/chat-and-phone.md)
138
+ - [Flows](docs/guide/flows.md) · [Steps that reach outside](docs/guide/steps-outside.md) · [Subagents](docs/guide/subagents.md)
139
+ - [Running unattended](docs/guide/unattended.md) · [Fleets and trackers](docs/guide/fleet.md)
140
+ - [Security](docs/guide/security.md) · [Models, spend and routing](docs/guide/routing.md)
141
+ - [A team server](docs/team-server.md) · [Linux](docs/guide/linux.md)
142
+ - [All docs](docs/guide/README.md)
1141
143
 
1142
- The beads adapter is built to beads' own documentation and exercised against a stubbed runner; it has never run against a real installation, because `bd` was not present on the machine it was written on. Commands whose flags could not be established — a general status update, in particular — refuse rather than guess.
1143
-
1144
- The materialised snapshot M0 promised shipped as **external dispatch**: a `sync` pass mirrors a tracker's nominated issues into the queue as ordinary local tasks (titles only, validated; bodies never), so the scheduler's hot path never touches the network — see below.
1145
-
1146
- **It survives the night, cheaply.** Work dispatches itself from a dependency graph, fails safely, and parks a *typed* decision — recap, options with reversibility, a recommendation, evidence — instead of guessing. Parking never stalls the loop; the blocked task steps aside and eleven others keep going.
1147
-
1148
- And it costs nothing while idle. **An LLM never polls.** The daemon handles everything that needs no judgement — ticks, capability probes, lease reaping, CI polling, notifications — at zero token cost, and wakes an agent only on a real event. The target is a testable invariant: an eight-hour run with twelve tasks shows near-zero token spend across idle windows.
1149
-
1150
- ## What breaks overnight, and the answer
1151
-
1152
- | Failure | Mechanism |
1153
- |---|---|
1154
- | Expired key found at 3am after 40k wasted tokens | capabilities probed *before* dispatch; gaps ranked by tasks unblocked |
1155
- | A runner dies holding a worktree | `Claim` with an immutable lease id and a fencing generation; late completions rejected |
1156
- | A build fails, then fails the same way again | typed strikes with doubling backoff; three strikes stalls the task for a person, who exits it with `task requeue` |
1157
- | You wake to five transcripts | one briefing: what ran, what is blocked, what needs deciding |
1158
-
1159
- ## Status
1160
-
1161
- **0.4.0 — schema v29, suite 1,369.** The M4 loop plus tournaments, the
1162
- live peek and live transcript, chains and queue ordering, per-worker
1163
- queue columns, external dispatch, merge grants with observed-green CI
1164
- and a fourteen-transition merge machine (per-merge human authorization
1165
- by default; a signed automerge mode may substitute for exactly that
1166
- yes, re-proved at the moment of firing), the phone PWA with
1167
- zero-dependency push, the attended core (governed live sessions:
1168
- signed terms, mid-session conversation, crash custody, continuation,
1169
- N parallel sessions per worker), the attested runtime (four providers
1170
- — Claude, Codex, OpenRouter, Gemini — the last admitted by versioned
1171
- conformance, never a registry row), labeled cross-runtime comparisons
1172
- with honest per-lane money, operating modes with their daily rails,
1173
- the artifact-only reviewer, and multi-user instances with invite
1174
- links, roles, and a People screen. Project access now supports viewer/operator
1175
- invitations restricted to selected repositories, with an action ledger for
1176
- people and unattended work. See [Project access and action ledger v1](docs/PROJECT_ACCESS_LEDGER.md)
1177
-
1178
- [Automatic approvals](docs/AUTO_APPROVAL.md) explains the signed project policy for scope filings, unchanged plans, reviews, repairs, and merges.
1179
-
1180
- for its permissions, history coverage, and migration behavior.
1181
- Earlier arcs shipped behind their own adversarial review rounds;
1182
- docs/PROGRESS.md records those findings.
1183
-
1184
- **M4 built.** The whole loop runs: `toolroll watch` (or `daemon
1185
- install` — no crontab) dispatches approved work, spends nothing while idle,
1186
- survives crashes by recovering exactly its own predecessor's claims, and
1187
- stops taking work on the first signal. Failures are typed — strikes,
1188
- doubling backoff, three-strike stalls a person exits with `task requeue` —
1189
- and every provider spawn is stamped before it spends, so cost is measured,
1190
- never asserted. CI on published PRs is watched as episodes that never call
1191
- silence green. The whole unattended stretch is one test,
1192
- [`src/unattended.slow.test.ts`](src/unattended.slow.test.ts): queue twelve, walk
1193
- away, come back to PRs. Architecture: [`docs/DESIGN.md`](docs/DESIGN.md);
1194
- the item-by-item ledger: [`docs/PROGRESS.md`](docs/PROGRESS.md).
1195
-
1196
- ## Milestones
1197
-
1198
- | | | |
1199
- |---|---|---|
1200
- | M0 | discovery, graph adapters, leases, CLI | `npx toolroll` shows what is in flight — **useful before it is autonomous** |
1201
- | M1 | runners, worktrees, first builder | one task goes queued → branch → commit unattended |
1202
- | M2 | capability probes, secrets, briefing | fill one gap, three tasks start |
1203
- | M3 | decisions, evidence, web view | a park renders as one screen, answerable on a phone — **and it does, executably** |
1204
- | M4 | the loop | **queue twelve, sleep, wake to PRs — with near-zero idle spend** |
1205
-
1206
- Deferred until M4 earns them: the spatial board, multiplayer, in-browser terminals, Postgres, RBAC.
1207
-
1208
- M4 is the product. M0 is what makes anyone install it long enough to reach M4.
1209
-
1210
- ## Not competing with
1211
-
1212
- [**agor**](https://github.com/preset-io/agor) owns the execution-plane category and does it well — browser UI, six runtimes, multiplayer, a spatial board. It optimizes for a team steering agents *live*; we optimize for nobody being awake. It is BSL 1.1; this is MIT.
1213
-
1214
- [**firstmate**](https://github.com/kunchenguid/firstmate) proves the orchestrator role works as conventions plus tmux, with no UI and no schema. Its event-driven bash watcher is where the zero-token supervision rule came from. Our bet is that the same role is better with a typed decision record and a browser you can answer from.
144
+ Coming from Standing Orders? Same product, renamed. The `standing-orders`
145
+ command and your data keep working.
1215
146
 
1216
147
  ## Contributing
1217
148
 
1218
- The most useful surface is a **provider adapter** — `src/provider.ts` is
1219
- the only module that names an agent binary, and
1220
- [CONTRIBUTING.md](CONTRIBUTING.md) walks the contract. Bug reports want
1221
- `--json` output; the issue forms say what else. Every behavior lands with
1222
- a test — the suite is the specification.
1223
-
1224
- `npm run e2e:flows` checks flows end to end with nothing stubbed: a throwaway
1225
- instance (the real CLI, console and worker) on a scratch repository, driven
1226
- through a real browser, with real Claude turns for the lead and one real
1227
- build. It needs `claude` and `gh` logged in and Playwright's Chromium, takes
1228
- about seven minutes, and writes `report.md`, screenshots and both logs to
1229
- `output/e2e/`.
1230
-
1231
- ## Credits
1232
-
1233
- Every sandbox Toolroll runs is [Anthropic's sandbox-runtime](https://github.com/anthropics/sandbox-runtime) (Apache-2.0), used as a dependency; see THIRD_PARTY_NOTICES.md.
1234
-
1235
- The workflow this formalizes comes from [Jason Ku's agentic engineering session](https://youtu.be/Ukju3maxbEQ) and his [`agents-md-snippets`](https://github.com/jasonku09/agents-md-snippets), plus Kun Chen's `treehouse`, `no-mistakes`, `gnhf`, `tasks-axi`, and `axi`. The design was reviewed adversarially by Codex; the appendix in `docs/DESIGN.md` lists every claim that review falsified, because the corrections are more useful than a clean spec would have been.
149
+ Provider adapters are the most useful place to start. See
150
+ [CONTRIBUTING.md](CONTRIBUTING.md). Report security issues as
151
+ [SECURITY.md](SECURITY.md) describes.
1236
152
 
1237
153
  ## License
1238
154
 
1239
- [MIT](LICENSE).
1240
-
1241
- ### Desktop app and project setup
1242
-
1243
- A local macOS shell, guided project setup, provider/model discovery, and weekly
1244
- schedules with timezones use the same controller and approval flow as the CLI.
1245
- The local native build also includes **File → Install app update** and
1246
- **Update status**: same-schema updates drain current work, verify a private
1247
- backup, atomically swap the app, and restore the previous app on failed health
1248
- checks without replacing newer task data. An independent temporary macOS job
1249
- automatically recovers an interrupted updater without reopening the window;
1250
- bounded retries and a persistent Stop request prevent endless recovery or
1251
- restarting work you stopped. Signed-release permission persistence
1252
- and physical reboot acceptance remain release gates, not claims from unit tests.
1253
- See [build and usage instructions](docs/control-app.md) and
1254
- [the integration assessment](docs/CONTROL_APP_INTEGRATION.md).
155
+ [MIT](LICENSE)