@calltelemetry/openclaw-linear 0.9.1 → 0.9.2
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.
- package/README.md +301 -255
- package/package.json +1 -1
- package/src/__test__/smoke-linear-api.test.ts +147 -0
- package/src/infra/doctor.test.ts +762 -2
- package/src/pipeline/dag-dispatch.test.ts +444 -0
- package/src/pipeline/pipeline.test.ts +1247 -1
- package/src/pipeline/planner.test.ts +457 -3
- package/src/pipeline/planning-state.test.ts +164 -3
- package/src/pipeline/webhook.test.ts +2438 -19
- package/src/tools/planner-tools.test.ts +722 -0
package/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/logo.jpeg" alt="OpenClaw Linear Plugin" width="720" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
1
5
|
# @calltelemetry/openclaw-linear
|
|
2
6
|
|
|
3
7
|
[](https://github.com/calltelemetry/openclaw-linear-plugin/actions/workflows/ci.yml)
|
|
@@ -8,6 +12,34 @@
|
|
|
8
12
|
|
|
9
13
|
Connect Linear to AI agents. Issues get triaged, implemented, and audited — automatically.
|
|
10
14
|
|
|
15
|
+
> **Real human here.** I'm actively building this and beta testing it on real projects.
|
|
16
|
+
> Looking for feedback, bug reports, and fellow mad scientists.
|
|
17
|
+
> [Open an issue](https://github.com/calltelemetry/openclaw-linear-plugin/issues) — feedback and bug reports welcome.
|
|
18
|
+
|
|
19
|
+
### Project Status
|
|
20
|
+
|
|
21
|
+
- [x] Cloudflare tunnel setup (webhook ingress, no inbound ports)
|
|
22
|
+
- [x] Linear webhook sync (Comment + Issue events)
|
|
23
|
+
- [x] Linear API integration (issues, comments, labels, state transitions)
|
|
24
|
+
- [x] Agent routing (`@mentions`, natural language intent classifier)
|
|
25
|
+
- [ ] Linear OAuth app webhook (AgentSessionEvent created/prompted)
|
|
26
|
+
- [x] Auto-triage (story points, labels, priority — read-only)
|
|
27
|
+
- [x] Complexity-tier dispatch (small → Haiku, medium → Sonnet, high → Opus)
|
|
28
|
+
- [x] Isolated git worktrees per dispatch
|
|
29
|
+
- [x] Worker → Auditor pipeline (hard-enforced, not LLM-mediated)
|
|
30
|
+
- [ ] Audit rework loop (gaps fed back, automatic retry)
|
|
31
|
+
- [ ] Watchdog timeout + escalation
|
|
32
|
+
- [x] Webhook deduplication (60s sliding window across session/comment/assignment)
|
|
33
|
+
- [ ] Multi-repo worktree support
|
|
34
|
+
- [ ] Project planner (interview → user stories → sub-issues → DAG dispatch)
|
|
35
|
+
- [ ] Cross-model plan review (Claude ↔ Codex ↔ Gemini)
|
|
36
|
+
- [ ] Issue closure with summary report
|
|
37
|
+
- [ ] Sub-issue decomposition (orchestrator-level only)
|
|
38
|
+
- [x] `spawn_agent` / `ask_agent` sub-agent tools
|
|
39
|
+
- [ ] **Worktree → PR merge** — `createPullRequest()` exists but is not wired into the pipeline. After audit pass, commits sit on a `codex/{identifier}` branch. You create the PR manually.
|
|
40
|
+
- [ ] **Sub-agent worktree sharing** — Sub-agents spawned via `spawn_agent`/`ask_agent` do not inherit the parent worktree. They run in their own session without code access.
|
|
41
|
+
- [ ] **Parallel worktree conflict resolution** — DAG dispatch runs up to 3 issues concurrently in separate worktrees, but there's no merge conflict detection across them.
|
|
42
|
+
|
|
11
43
|
---
|
|
12
44
|
|
|
13
45
|
## Why This Exists
|
|
@@ -16,60 +48,78 @@ Linear is a great project tracker. But it doesn't orchestrate AI agents — it j
|
|
|
16
48
|
|
|
17
49
|
This plugin makes the full lifecycle hands-off:
|
|
18
50
|
|
|
19
|
-
```mermaid
|
|
20
|
-
sequenceDiagram
|
|
21
|
-
actor You
|
|
22
|
-
participant Linear
|
|
23
|
-
participant Plugin
|
|
24
|
-
participant Worker as Worker Agent
|
|
25
|
-
participant Auditor as Auditor Agent
|
|
26
|
-
|
|
27
|
-
You->>Linear: Create issue
|
|
28
|
-
Note over Plugin: auto-triage
|
|
29
|
-
Linear-->>You: Estimate, labels, priority
|
|
30
|
-
|
|
31
|
-
You->>Linear: Assign to agent
|
|
32
|
-
Plugin->>Worker: dispatch (isolated worktree)
|
|
33
|
-
Worker-->>Plugin: implementation done
|
|
34
|
-
Plugin->>Auditor: audit (automatic, hard-enforced)
|
|
35
|
-
alt Pass
|
|
36
|
-
Auditor-->>Plugin: ✅ verdict
|
|
37
|
-
Plugin-->>Linear: Done
|
|
38
|
-
else Fail (retries left)
|
|
39
|
-
Auditor-->>Plugin: ❌ gaps
|
|
40
|
-
Plugin->>Worker: rework (gaps injected)
|
|
41
|
-
else Fail (no retries)
|
|
42
|
-
Auditor-->>Plugin: ❌ stuck
|
|
43
|
-
Plugin-->>You: 🚨 needs your help
|
|
44
|
-
end
|
|
45
51
|
```
|
|
52
|
+
You create an issue
|
|
53
|
+
│
|
|
54
|
+
▼
|
|
55
|
+
Agent triages it ──── estimate, labels, priority
|
|
56
|
+
│
|
|
57
|
+
▼
|
|
58
|
+
You assign it
|
|
59
|
+
│
|
|
60
|
+
▼
|
|
61
|
+
Plugin dispatches ─── picks model tier, creates worktree
|
|
62
|
+
│
|
|
63
|
+
▼
|
|
64
|
+
Worker implements ─── code, tests, commits
|
|
65
|
+
│
|
|
66
|
+
▼
|
|
67
|
+
Auditor verifies ─── independent, hard-enforced
|
|
68
|
+
│
|
|
69
|
+
┌───┴───┐
|
|
70
|
+
▼ ▼
|
|
71
|
+
Done Rework ────── gaps fed back, retry automatic
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
You work in Linear. The agents handle the rest.
|
|
46
75
|
|
|
47
76
|
**What Linear can't do on its own — and what this plugin handles:**
|
|
48
77
|
|
|
49
|
-
|
|
|
78
|
+
| Gap | What the plugin does |
|
|
50
79
|
|---|---|
|
|
51
|
-
| **No agent orchestration** |
|
|
80
|
+
| **No agent orchestration** | Assesses complexity, picks the right model tier, creates isolated worktrees, runs workers, triggers audits, processes verdicts — all from a single issue assignment |
|
|
52
81
|
| **No independent verification** | Hard-enforces a worker → auditor boundary in plugin code. The worker cannot mark its own work done. The audit is not optional and not LLM-mediated. |
|
|
53
|
-
| **No failure recovery** | Watchdog kills hung agents after configurable silence.
|
|
82
|
+
| **No failure recovery** | Watchdog kills hung agents after configurable silence. Feeds audit failures back as rework context. Escalates when retries are exhausted. |
|
|
54
83
|
| **No multi-agent routing** | Routes `@mentions` and natural language ("hey kaylee look at this") to specific agents. Intent classifier handles plan requests, questions, close commands, and work requests. |
|
|
55
|
-
| **No webhook deduplication** | Linear sends events from two separate webhook systems that can overlap. The plugin deduplicates across session IDs, comment IDs, and assignment events with a 60s sliding window. |
|
|
56
84
|
| **No project-scale planning** | Planner interviews you, creates issues with user stories and acceptance criteria, runs a cross-model review, then dispatches the full dependency graph — up to 3 issues in parallel. |
|
|
57
85
|
|
|
58
86
|
The end result: you work in Linear. You create issues, assign them, comment in plain English. The agents do the rest — or tell you when they can't.
|
|
59
87
|
|
|
60
88
|
---
|
|
61
89
|
|
|
62
|
-
##
|
|
90
|
+
## Features
|
|
91
|
+
|
|
92
|
+
### Core Pipeline
|
|
93
|
+
|
|
94
|
+
- **Auto-triage** — New issues get story point estimates, labels, and priority within seconds. Read-only mode — no side effects.
|
|
95
|
+
- **Worker → Auditor pipeline** — Assign an issue and a worker implements it in an isolated git worktree. An independent auditor verifies the work. The worker cannot self-certify — the audit is hard-enforced in plugin code.
|
|
96
|
+
- **Complexity-tier dispatch** — The plugin assesses each issue and picks the right model. Simple typo? Haiku. Multi-service refactor? Opus. Saves cost and latency without manual intervention.
|
|
97
|
+
- **Automatic rework** — Failed audits feed gaps back to the worker as context. Retries up to N times before escalating. No human needed until the agents are stuck.
|
|
98
|
+
|
|
99
|
+
### Planning & Closure
|
|
100
|
+
|
|
101
|
+
- **Project planner** — Comment "plan this project" and the agent interviews you, builds user stories with acceptance criteria, creates the full issue hierarchy, and dispatches in dependency order — up to 3 issues in parallel.
|
|
102
|
+
- **Cross-model review** — Plans are automatically audited by a different AI model (Claude ↔ Codex ↔ Gemini) before dispatch. Two perspectives, one plan.
|
|
103
|
+
- **Issue closure** — Say "close this" or "mark as done" and the agent generates a closure report and transitions the issue to completed.
|
|
104
|
+
- **Sub-issue decomposition** — Orchestrators and the planner break complex work into sub-issues via `linear_issues`. Sub-issues inherit team and project from the parent automatically.
|
|
105
|
+
|
|
106
|
+
### Multi-Agent & Routing
|
|
107
|
+
|
|
108
|
+
- **Named agents** — Define agents with different roles and expertise. Route work by `@mention` or natural language ("hey kaylee look at this").
|
|
109
|
+
- **Intent classification** — An LLM classifier (~300 tokens, ~2s) understands what you want from any comment. Regex fallback if the classifier fails.
|
|
110
|
+
- **One-time detour** — `@mention` a different agent in a session and it handles that single interaction. The session stays with the original agent.
|
|
111
|
+
|
|
112
|
+
### Multi-Backend & Multi-Repo
|
|
113
|
+
|
|
114
|
+
- **Three coding backends** — Codex (OpenAI), Claude (Anthropic), Gemini (Google). Configurable globally or per-agent. The agent writes the prompt; the plugin handles backend selection.
|
|
115
|
+
- **Multi-repo dispatch** — Tag an issue with `<!-- repos: api, frontend -->` and the worker gets isolated worktrees for each repo. One issue, multiple codebases, one agent session.
|
|
63
116
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- **
|
|
67
|
-
- **
|
|
68
|
-
- **
|
|
69
|
-
- **
|
|
70
|
-
- **Agent goes silent?** A watchdog kills it and retries automatically.
|
|
71
|
-
- **Linear guidance?** Workspace and team-level guidance from Linear flows into every agent prompt — triage, dispatch, worker, audit.
|
|
72
|
-
- **Want updates?** Get notified on Discord, Slack, Telegram, or Signal.
|
|
117
|
+
### Operations
|
|
118
|
+
|
|
119
|
+
- **Linear Guidance** — Workspace and team-level guidance configured in Linear's admin UI flows into every agent prompt — triage, dispatch, worker, audit. Admins steer agent behavior without touching config files.
|
|
120
|
+
- **Watchdog** — Kills agents that go silent after configurable inactivity. Retries once, then escalates. Covers LLM hangs, API timeouts, and CLI lockups.
|
|
121
|
+
- **Notifications** — Dispatch lifecycle events (started, auditing, done, stuck) to Discord, Slack, Telegram, or Signal. Rich formatting optional.
|
|
122
|
+
- **Webhook deduplication** — Two-tier guard (in-memory set + 60s TTL map) prevents double-processing across Linear's two webhook systems.
|
|
73
123
|
|
|
74
124
|
---
|
|
75
125
|
|
|
@@ -81,20 +131,88 @@ The end result: you work in Linear. You create issues, assign them, comment in p
|
|
|
81
131
|
openclaw plugins install @calltelemetry/openclaw-linear
|
|
82
132
|
```
|
|
83
133
|
|
|
84
|
-
### 2. Expose the gateway
|
|
134
|
+
### 2. Expose the gateway
|
|
135
|
+
|
|
136
|
+
Linear delivers webhooks over the public internet, so the gateway needs a public HTTPS URL. See [Tunnel Setup (Cloudflare)](#tunnel-setup-cloudflare) for the recommended approach. Any reverse proxy or tunnel that forwards HTTPS to `localhost:18789` will work.
|
|
137
|
+
|
|
138
|
+
### 3. Create a Linear OAuth app
|
|
139
|
+
|
|
140
|
+
Go to **Linear Settings > API > Applications** and create an app:
|
|
141
|
+
|
|
142
|
+
- Set **Webhook URL** to `https://your-domain.com/linear/webhook`
|
|
143
|
+
- Set **Redirect URI** to `https://your-domain.com/linear/oauth/callback`
|
|
144
|
+
- Enable events: **Agent Sessions**, **Comments**, **Issues**
|
|
145
|
+
- Save your **Client ID** and **Client Secret**
|
|
146
|
+
|
|
147
|
+
> You also need a **workspace webhook** — run `openclaw openclaw-linear webhooks setup` to auto-provision it, or manually create one in Settings > API > Webhooks pointing to the same URL with **Comment + Issue** events enabled. Both webhooks are required.
|
|
148
|
+
|
|
149
|
+
### 4. Set credentials
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
export LINEAR_CLIENT_ID="your_client_id"
|
|
153
|
+
export LINEAR_CLIENT_SECRET="your_client_secret"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
For systemd services, add these to your unit file:
|
|
157
|
+
|
|
158
|
+
```ini
|
|
159
|
+
[Service]
|
|
160
|
+
Environment=LINEAR_CLIENT_ID=your_client_id
|
|
161
|
+
Environment=LINEAR_CLIENT_SECRET=your_client_secret
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Then reload: `systemctl --user daemon-reload && systemctl --user restart openclaw-gateway`
|
|
165
|
+
|
|
166
|
+
### 5. Authorize
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
openclaw openclaw-linear auth
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
This opens your browser. Approve the authorization, then restart:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
systemctl --user restart openclaw-gateway
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 6. Verify
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
openclaw openclaw-linear status
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
You should see a valid token and connected status. Check the gateway logs for a clean startup:
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
Linear agent extension registered (agent: default, token: profile, orchestration: enabled)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Test the webhook endpoint:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
curl -s -X POST https://your-domain.com/linear/webhook \
|
|
194
|
+
-H "Content-Type: application/json" \
|
|
195
|
+
-d '{"type":"test","action":"ping"}'
|
|
196
|
+
# Returns: "ok"
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
That's it. Create an issue in Linear and watch the agent respond.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Tunnel Setup (Cloudflare)
|
|
85
204
|
|
|
86
|
-
Linear
|
|
205
|
+
Linear delivers webhooks over the public internet. The gateway listens on `localhost:18789` and needs a public HTTPS endpoint. A [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) is the recommended approach — no open ports, no TLS cert management, no static IP required.
|
|
87
206
|
|
|
88
207
|
```mermaid
|
|
89
208
|
flowchart TB
|
|
90
209
|
subgraph Internet
|
|
91
210
|
LW["Linear Webhooks<br/><i>Comment, Issue, AgentSession</i>"]
|
|
92
211
|
LO["Linear OAuth<br/><i>callback redirect</i>"]
|
|
93
|
-
You["You<br/><i>browser, curl</i>"]
|
|
94
212
|
end
|
|
95
213
|
|
|
96
214
|
subgraph CF["Cloudflare Edge"]
|
|
97
|
-
TLS["TLS termination
|
|
215
|
+
TLS["TLS termination + DDoS protection"]
|
|
98
216
|
end
|
|
99
217
|
|
|
100
218
|
subgraph Server["Your Server"]
|
|
@@ -104,14 +222,13 @@ flowchart TB
|
|
|
104
222
|
|
|
105
223
|
LW -- "POST /linear/webhook" --> TLS
|
|
106
224
|
LO -- "GET /linear/oauth/callback" --> TLS
|
|
107
|
-
You -- "HTTPS" --> TLS
|
|
108
225
|
TLS -- "tunnel" --> CD
|
|
109
226
|
CD -- "HTTP" --> GW
|
|
110
227
|
```
|
|
111
228
|
|
|
112
229
|
**How it works:** `cloudflared` opens an outbound connection to Cloudflare's edge and keeps it alive. Cloudflare routes incoming HTTPS requests for your hostname back through the tunnel to `localhost:18789`. No inbound firewall rules needed.
|
|
113
230
|
|
|
114
|
-
|
|
231
|
+
### Install cloudflared
|
|
115
232
|
|
|
116
233
|
```bash
|
|
117
234
|
# RHEL / Rocky / Alma
|
|
@@ -127,7 +244,7 @@ sudo apt update && sudo apt install -y cloudflared
|
|
|
127
244
|
brew install cloudflare/cloudflare/cloudflared
|
|
128
245
|
```
|
|
129
246
|
|
|
130
|
-
|
|
247
|
+
### Authenticate with Cloudflare
|
|
131
248
|
|
|
132
249
|
```bash
|
|
133
250
|
cloudflared tunnel login
|
|
@@ -142,7 +259,7 @@ Cloudflare writes an origin certificate to `~/.cloudflared/cert.pem`. This cert
|
|
|
142
259
|
|
|
143
260
|
> **Prerequisite:** Your domain must already be on Cloudflare (nameservers pointed to Cloudflare). If it's not, add it in the Cloudflare dashboard first.
|
|
144
261
|
|
|
145
|
-
|
|
262
|
+
### Create a tunnel
|
|
146
263
|
|
|
147
264
|
```bash
|
|
148
265
|
cloudflared tunnel create openclaw-linear
|
|
@@ -150,7 +267,7 @@ cloudflared tunnel create openclaw-linear
|
|
|
150
267
|
|
|
151
268
|
This outputs a **Tunnel ID** (UUID like `da1f21bf-856e-...`) and writes credentials to `~/.cloudflared/<TUNNEL_ID>.json`.
|
|
152
269
|
|
|
153
|
-
|
|
270
|
+
### DNS — point your hostname to the tunnel
|
|
154
271
|
|
|
155
272
|
```bash
|
|
156
273
|
cloudflared tunnel route dns openclaw-linear linear.yourdomain.com
|
|
@@ -160,7 +277,7 @@ This creates a CNAME record in Cloudflare DNS: `linear.yourdomain.com → <TUNNE
|
|
|
160
277
|
|
|
161
278
|
The hostname you choose here is what you'll use for **both** webhook URLs and the OAuth redirect URI in Linear. Make sure they all match.
|
|
162
279
|
|
|
163
|
-
|
|
280
|
+
### Configure the tunnel
|
|
164
281
|
|
|
165
282
|
Create `/etc/cloudflared/config.yml` (system-wide) or `~/.cloudflared/config.yml` (user):
|
|
166
283
|
|
|
@@ -176,7 +293,7 @@ ingress:
|
|
|
176
293
|
|
|
177
294
|
The `ingress` rule routes all traffic for your hostname to the gateway on localhost. The catch-all `http_status:404` rejects requests for any other hostname.
|
|
178
295
|
|
|
179
|
-
|
|
296
|
+
### Run as a service
|
|
180
297
|
|
|
181
298
|
```bash
|
|
182
299
|
# Install as system service (recommended for production)
|
|
@@ -190,7 +307,7 @@ To test without installing as a service:
|
|
|
190
307
|
cloudflared tunnel run openclaw-linear
|
|
191
308
|
```
|
|
192
309
|
|
|
193
|
-
|
|
310
|
+
### Verify end-to-end
|
|
194
311
|
|
|
195
312
|
```bash
|
|
196
313
|
curl -s https://linear.yourdomain.com/linear/webhook \
|
|
@@ -201,134 +318,99 @@ curl -s https://linear.yourdomain.com/linear/webhook \
|
|
|
201
318
|
|
|
202
319
|
> **Tip:** Keep the tunnel running at all times. If `cloudflared` stops, Linear webhook deliveries will fail silently — the gateway won't know about new issues, comments, or agent sessions until the tunnel is restored.
|
|
203
320
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
Go to **Linear Settings > API > Applications** and create an app:
|
|
207
|
-
|
|
208
|
-
- Set **Webhook URL** to `https://your-domain.com/linear/webhook`
|
|
209
|
-
- Set **Redirect URI** to `https://your-domain.com/linear/oauth/callback`
|
|
210
|
-
- Enable events: **Agent Sessions**, **Comments**, **Issues**
|
|
211
|
-
- Save your **Client ID** and **Client Secret**
|
|
212
|
-
|
|
213
|
-
> You also need a **workspace webhook** — run `openclaw openclaw-linear webhooks setup` to auto-provision it, or manually create one in Settings > API > Webhooks pointing to the same URL with **Comment + Issue** events enabled. Both webhooks are required.
|
|
214
|
-
|
|
215
|
-
### 4. Set credentials
|
|
216
|
-
|
|
217
|
-
```bash
|
|
218
|
-
export LINEAR_CLIENT_ID="your_client_id"
|
|
219
|
-
export LINEAR_CLIENT_SECRET="your_client_secret"
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
For systemd services, add these to your unit file:
|
|
223
|
-
|
|
224
|
-
```ini
|
|
225
|
-
[Service]
|
|
226
|
-
Environment=LINEAR_CLIENT_ID=your_client_id
|
|
227
|
-
Environment=LINEAR_CLIENT_SECRET=your_client_secret
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
Then reload: `systemctl --user daemon-reload && systemctl --user restart openclaw-gateway`
|
|
231
|
-
|
|
232
|
-
### 5. Authorize
|
|
233
|
-
|
|
234
|
-
```bash
|
|
235
|
-
openclaw openclaw-linear auth
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
This opens your browser. Approve the authorization, then restart:
|
|
239
|
-
|
|
240
|
-
```bash
|
|
241
|
-
systemctl --user restart openclaw-gateway
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### 6. Verify
|
|
245
|
-
|
|
246
|
-
```bash
|
|
247
|
-
openclaw openclaw-linear status
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
You should see a valid token and connected status. Check the gateway logs for a clean startup:
|
|
321
|
+
---
|
|
251
322
|
|
|
252
|
-
|
|
253
|
-
Linear agent extension registered (agent: default, token: profile, orchestration: enabled)
|
|
254
|
-
```
|
|
323
|
+
## How It Works — Step by Step
|
|
255
324
|
|
|
256
|
-
|
|
325
|
+
A project goes through a complete lifecycle — from planning to implementation to closure. Here's every phase, what triggers it, and what you'll see in Linear.
|
|
257
326
|
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
327
|
+
```mermaid
|
|
328
|
+
flowchart LR
|
|
329
|
+
P["Plan<br/><i>(optional)</i>"] --> T["Triage<br/><i>(auto)</i>"]
|
|
330
|
+
T --> D["Dispatch<br/><i>(assign)</i>"]
|
|
331
|
+
D --> W["Worker<br/><i>(auto)</i>"]
|
|
332
|
+
W --> A["Audit<br/><i>(auto)</i>"]
|
|
333
|
+
A --> Done["Done ✔"]
|
|
334
|
+
A --> R["Rework<br/><i>(auto retry)</i>"]
|
|
335
|
+
A --> S["Escalate ⚠"]
|
|
336
|
+
R --> W
|
|
337
|
+
Done --> CL["Close<br/><i>(comment or auto)</i>"]
|
|
263
338
|
```
|
|
264
339
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
---
|
|
340
|
+
### Phase 1: Planning (optional)
|
|
268
341
|
|
|
269
|
-
|
|
342
|
+
**Trigger:** Comment "let's plan the features" on a project issue.
|
|
270
343
|
|
|
271
|
-
|
|
344
|
+
For larger work, the planner breaks a project into issues before any code is written. It enters **interview mode** — asking questions, creating issues with user stories and acceptance criteria, and building a dependency graph in real time.
|
|
272
345
|
|
|
273
346
|
```mermaid
|
|
274
347
|
sequenceDiagram
|
|
275
|
-
|
|
348
|
+
actor Human
|
|
276
349
|
participant Linear
|
|
277
350
|
participant Plugin
|
|
278
|
-
participant
|
|
351
|
+
participant Planner as Planner Agent
|
|
352
|
+
participant Reviewer as Cross-Model Reviewer
|
|
353
|
+
|
|
354
|
+
Human->>Linear: "plan this project"
|
|
355
|
+
Plugin->>Planner: start interview
|
|
356
|
+
loop Until plan is complete
|
|
357
|
+
Planner-->>Linear: question
|
|
358
|
+
Human->>Linear: reply
|
|
359
|
+
Planner-->>Linear: create/update issues
|
|
360
|
+
end
|
|
361
|
+
Human->>Linear: "looks good"
|
|
362
|
+
Plugin->>Plugin: validate DAG + descriptions
|
|
363
|
+
Plugin->>Reviewer: cross-model audit
|
|
364
|
+
Reviewer-->>Plugin: recommendations
|
|
365
|
+
Plugin-->>Linear: summary + ask for approval
|
|
366
|
+
Human->>Linear: "approve plan"
|
|
367
|
+
Plugin-->>Linear: dispatch issues in dependency order
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
The planner proactively asks for:
|
|
371
|
+
- **User stories** — "As a [role], I want [feature] so that [benefit]"
|
|
372
|
+
- **Acceptance criteria** — Given/When/Then format
|
|
373
|
+
- **UAT test scenarios** — How to manually verify the feature
|
|
279
374
|
|
|
280
|
-
|
|
281
|
-
Linear->>Plugin: Webhook (Issue.create)
|
|
282
|
-
Plugin->>Agents: Triage agent
|
|
283
|
-
Agents-->>Plugin: Estimate + labels
|
|
284
|
-
Plugin-->>Linear: Update issue
|
|
285
|
-
Plugin-->>Linear: Post assessment
|
|
375
|
+
**What you'll see in Linear:**
|
|
286
376
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
Plugin-->>Linear: Result comment
|
|
377
|
+
> I've created 3 issues:
|
|
378
|
+
> - **PROJ-2:** Build search API endpoint (3 pts, blocks PROJ-3)
|
|
379
|
+
> - **PROJ-3:** Search results page (2 pts, blocked by PROJ-2)
|
|
380
|
+
> - **PROJ-4:** Autocomplete suggestions (1 pt, independent)
|
|
381
|
+
>
|
|
382
|
+
> Does that cover it? Should the autocomplete call a separate endpoint or share the search API?
|
|
294
383
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
384
|
+
When you say "looks good", the planner validates the plan (descriptions, estimates, no circular deps) and sends it to a **different AI model** for a cross-model review:
|
|
385
|
+
|
|
386
|
+
| Your primary model | Auto-reviewer |
|
|
387
|
+
|---|---|
|
|
388
|
+
| Claude / Anthropic | Codex |
|
|
389
|
+
| Codex / OpenAI | Gemini |
|
|
390
|
+
| Gemini / Google | Codex |
|
|
391
|
+
| Other (Kimi, Mistral, etc.) | Gemini |
|
|
301
392
|
|
|
302
|
-
|
|
393
|
+
After approval, issues are dispatched automatically in dependency order — up to 3 in parallel.
|
|
303
394
|
|
|
304
|
-
|
|
305
|
-
flowchart LR
|
|
306
|
-
A["Triage<br/><i>(auto)</i>"] --> B["Dispatch<br/><i>(you assign)</i>"]
|
|
307
|
-
B --> C["Worker<br/><i>(auto)</i>"]
|
|
308
|
-
C --> D["Audit<br/><i>(auto)</i>"]
|
|
309
|
-
D --> E["Done ✔"]
|
|
310
|
-
D --> F["Rework<br/><i>(auto retry)</i>"]
|
|
311
|
-
D --> G["Needs Your<br/>Help ⚠<br/><i>(escalated)</i>"]
|
|
312
|
-
F --> C
|
|
313
|
-
```
|
|
395
|
+
> `📊 Search Feature: 2/3 complete`
|
|
314
396
|
|
|
315
|
-
###
|
|
397
|
+
### Phase 2: Triage (automatic)
|
|
316
398
|
|
|
317
|
-
**Trigger:**
|
|
399
|
+
**Trigger:** A new issue is created (manually or by the planner).
|
|
318
400
|
|
|
319
|
-
The agent reads
|
|
401
|
+
The agent reads the issue, estimates story points, adds labels, sets priority, and posts an assessment comment — all within seconds. Triage runs in **read-only mode** (no file writes, no code execution) to prevent side effects.
|
|
320
402
|
|
|
321
403
|
**What you'll see in Linear:**
|
|
322
404
|
|
|
323
405
|
> **[Mal]** This looks like a medium complexity change — the search API integration touches both the backend GraphQL schema and the frontend query layer. I've estimated 3 points and tagged it `backend` + `frontend`.
|
|
324
406
|
|
|
325
|
-
The estimate, labels, and priority are applied silently to the issue fields.
|
|
407
|
+
The estimate, labels, and priority are applied silently to the issue fields.
|
|
326
408
|
|
|
327
|
-
###
|
|
409
|
+
### Phase 3: Dispatch (assign the issue)
|
|
328
410
|
|
|
329
|
-
**Trigger:**
|
|
411
|
+
**Trigger:** The issue is assigned to the agent (manually or auto-assigned after planning).
|
|
330
412
|
|
|
331
|
-
The
|
|
413
|
+
The plugin assesses complexity, picks an appropriate model tier, creates an isolated git worktree, and starts the worker.
|
|
332
414
|
|
|
333
415
|
**What you'll see in Linear:**
|
|
334
416
|
|
|
@@ -353,25 +435,23 @@ The agent assesses complexity, picks an appropriate model, creates an isolated g
|
|
|
353
435
|
| Medium | claude-sonnet-4-6 | Standard features, multi-file changes |
|
|
354
436
|
| High | claude-opus-4-6 | Complex refactors, architecture changes |
|
|
355
437
|
|
|
356
|
-
###
|
|
438
|
+
### Phase 4: Implementation (automatic)
|
|
357
439
|
|
|
358
|
-
The worker agent reads the issue, plans its approach, writes code, and runs tests — all in the isolated worktree.
|
|
440
|
+
The worker agent reads the issue, plans its approach, writes code, and runs tests — all in the isolated worktree.
|
|
359
441
|
|
|
360
442
|
If this is a **retry** after a failed audit, the worker gets the previous audit feedback as context so it knows exactly what to fix.
|
|
361
443
|
|
|
362
|
-
**
|
|
363
|
-
> `ENG-100 working on it (attempt 1)`
|
|
444
|
+
**Notification:** `ENG-100 working on it (attempt 1)`
|
|
364
445
|
|
|
365
|
-
###
|
|
446
|
+
### Phase 5: Audit (automatic)
|
|
366
447
|
|
|
367
|
-
After the worker finishes, a separate auditor agent independently verifies the work
|
|
448
|
+
After the worker finishes, a separate auditor agent independently verifies the work — checking issue requirements against what was actually implemented, running tests, and reviewing the diff.
|
|
368
449
|
|
|
369
450
|
This is **not optional** — the worker cannot mark its own work as done. The audit is triggered by the plugin, not by the AI.
|
|
370
451
|
|
|
371
|
-
**
|
|
372
|
-
> `ENG-100 checking the work...`
|
|
452
|
+
**Notification:** `ENG-100 checking the work...`
|
|
373
453
|
|
|
374
|
-
###
|
|
454
|
+
### Phase 6: Verdict
|
|
375
455
|
|
|
376
456
|
The audit produces one of three outcomes:
|
|
377
457
|
|
|
@@ -399,7 +479,7 @@ The issue is marked done automatically. A summary is posted.
|
|
|
399
479
|
|
|
400
480
|
#### Fail (retries left) — Automatic rework
|
|
401
481
|
|
|
402
|
-
The worker gets the audit feedback and tries again
|
|
482
|
+
The worker gets the audit feedback and tries again automatically.
|
|
403
483
|
|
|
404
484
|
**What you'll see in Linear:**
|
|
405
485
|
|
|
@@ -417,9 +497,9 @@ The worker gets the audit feedback and tries again. You don't need to do anythin
|
|
|
417
497
|
|
|
418
498
|
**Notification:** `ENG-100 needs more work (attempt 1). Issues: missing validation, no empty query test`
|
|
419
499
|
|
|
420
|
-
#### Fail (no retries left) —
|
|
500
|
+
#### Fail (no retries left) — Escalation
|
|
421
501
|
|
|
422
|
-
After all retries are exhausted (default: 3 attempts), the issue is escalated
|
|
502
|
+
After all retries are exhausted (default: 3 attempts), the issue is escalated.
|
|
423
503
|
|
|
424
504
|
**What you'll see in Linear:**
|
|
425
505
|
|
|
@@ -440,26 +520,52 @@ After all retries are exhausted (default: 3 attempts), the issue is escalated to
|
|
|
440
520
|
|
|
441
521
|
**Notification:** `🚨 ENG-100 needs your help — couldn't fix it after 3 tries`
|
|
442
522
|
|
|
443
|
-
**
|
|
523
|
+
**Options:**
|
|
444
524
|
1. **Clarify the issue** — Add more detail to the description, then re-assign to try again
|
|
445
525
|
2. **Fix it yourself** — The agent's work is in the worktree, ready to edit
|
|
446
526
|
3. **Force retry** — `/dispatch retry ENG-100`
|
|
447
527
|
4. **Check logs** — Worker output in `.claw/worker-*.md`, audit verdicts in `.claw/audit-*.json`
|
|
448
528
|
|
|
449
|
-
###
|
|
529
|
+
### Phase 7: Closure
|
|
450
530
|
|
|
451
|
-
|
|
531
|
+
**Trigger:** Comment "close this", "mark as done", or "this is resolved" on any issue.
|
|
532
|
+
|
|
533
|
+
The plugin generates a closure report and transitions the issue to completed. This is a **static action** — the plugin orchestrates the API calls directly, the agent only writes the report text.
|
|
534
|
+
|
|
535
|
+
```mermaid
|
|
536
|
+
flowchart LR
|
|
537
|
+
A["'close this'"] --> B["Fetch issue details"]
|
|
538
|
+
B --> C["Generate closure report<br/><i>(read-only agent)</i>"]
|
|
539
|
+
C --> D["Transition → completed"]
|
|
540
|
+
D --> E["Post report to issue"]
|
|
541
|
+
```
|
|
452
542
|
|
|
453
543
|
**What you'll see in Linear:**
|
|
454
544
|
|
|
455
|
-
> ##
|
|
545
|
+
> ## Closed
|
|
456
546
|
>
|
|
457
|
-
>
|
|
547
|
+
> This issue has been reviewed and closed.
|
|
458
548
|
>
|
|
459
|
-
> **
|
|
549
|
+
> **Summary:** The search API endpoint was implemented with pagination, input validation, and error handling. All 14 tests pass. The frontend search page renders results correctly.
|
|
550
|
+
|
|
551
|
+
### Timeout recovery
|
|
552
|
+
|
|
553
|
+
If an agent produces no output for 2 minutes (configurable), the watchdog kills it and retries once. If the retry also times out, the issue is escalated.
|
|
460
554
|
|
|
461
555
|
**Notification:** `⚡ ENG-100 timed out (no activity for 120s). Will retry.`
|
|
462
556
|
|
|
557
|
+
### Project-level progress
|
|
558
|
+
|
|
559
|
+
When issues are dispatched from a plan, you get project-level progress tracking:
|
|
560
|
+
|
|
561
|
+
> `📊 Search Feature: 2/3 complete`
|
|
562
|
+
|
|
563
|
+
When everything is done:
|
|
564
|
+
|
|
565
|
+
> `✅ Search Feature: complete (3/3 issues)`
|
|
566
|
+
|
|
567
|
+
If an issue gets stuck, dependent issues are blocked and you're notified.
|
|
568
|
+
|
|
463
569
|
### What's in the worktree
|
|
464
570
|
|
|
465
571
|
Every dispatch creates a `.claw/` folder inside the worktree with everything the agent did:
|
|
@@ -572,73 +678,16 @@ The webhook handler prevents double-processing through a two-tier guard system:
|
|
|
572
678
|
|
|
573
679
|
---
|
|
574
680
|
|
|
575
|
-
## Planning
|
|
576
|
-
|
|
577
|
-
For larger work, the planner helps you break a project into issues with dependencies, then dispatches them automatically.
|
|
578
|
-
|
|
579
|
-
### Start planning
|
|
580
|
-
|
|
581
|
-
Comment on any issue that belongs to a Linear project — use natural language:
|
|
582
|
-
|
|
583
|
-
> "let's plan out the features for this project"
|
|
584
|
-
|
|
585
|
-
The planner enters **interview mode** and asks you questions one at a time:
|
|
586
|
-
|
|
587
|
-
> I'm entering planning mode for **Search Feature**. I'll interview you about the features you want to build, then structure everything into Linear issues.
|
|
588
|
-
>
|
|
589
|
-
> Let's start — what is this project about, and what are the main feature areas?
|
|
590
|
-
|
|
591
|
-
### Build the plan
|
|
592
|
-
|
|
593
|
-
Reply with your ideas. The planner creates issues with **user stories** and **acceptance criteria**, sets dependencies, and asks follow-up questions:
|
|
594
|
-
|
|
595
|
-
> I've created 3 issues:
|
|
596
|
-
> - **PROJ-2:** Build search API endpoint (3 pts, blocks PROJ-3)
|
|
597
|
-
> - **PROJ-3:** Search results page (2 pts, blocked by PROJ-2)
|
|
598
|
-
> - **PROJ-4:** Autocomplete suggestions (1 pt, independent)
|
|
599
|
-
>
|
|
600
|
-
> For PROJ-2, here's what I wrote for acceptance criteria:
|
|
601
|
-
> - *Given* a user sends a search query, *When* results exist, *Then* they are returned with pagination
|
|
602
|
-
>
|
|
603
|
-
> Does that cover it? Should the autocomplete call a separate endpoint or share the search API?
|
|
604
|
-
|
|
605
|
-
The planner proactively asks for:
|
|
606
|
-
- **User stories** — "As a [role], I want [feature] so that [benefit]"
|
|
607
|
-
- **Acceptance criteria** — Given/When/Then format
|
|
608
|
-
- **UAT test scenarios** — How to manually verify the feature
|
|
681
|
+
## Planning — Validation Details
|
|
609
682
|
|
|
610
|
-
|
|
683
|
+
See [Phase 1: Planning](#phase-1-planning-optional) for the full walkthrough. This section covers the validation rules that run when you say "finalize plan".
|
|
611
684
|
|
|
612
|
-
###
|
|
685
|
+
### Validation checks
|
|
613
686
|
|
|
614
|
-
When you're happy, say something like "looks good" or "finalize plan". The planner runs a validation check:
|
|
615
687
|
- Every issue has a description (50+ characters) with acceptance criteria
|
|
616
688
|
- Every non-epic issue has an estimate and priority
|
|
617
689
|
- No circular dependencies in the DAG
|
|
618
690
|
|
|
619
|
-
**If validation passes, a cross-model review runs automatically:**
|
|
620
|
-
|
|
621
|
-
> ## Plan Passed Checks
|
|
622
|
-
>
|
|
623
|
-
> **3 issues** with valid dependency graph.
|
|
624
|
-
>
|
|
625
|
-
> Let me have **Codex** audit this and make recommendations.
|
|
626
|
-
|
|
627
|
-
A different AI model (always the complement of your primary model) reviews the plan for gaps:
|
|
628
|
-
|
|
629
|
-
| Your primary model | Auto-reviewer |
|
|
630
|
-
|---|---|
|
|
631
|
-
| Claude / Anthropic | Codex |
|
|
632
|
-
| Codex / OpenAI | Gemini |
|
|
633
|
-
| Gemini / Google | Codex |
|
|
634
|
-
| Other (Kimi, Mistral, etc.) | Gemini |
|
|
635
|
-
|
|
636
|
-
After the review, the planner summarizes recommendations and asks you to approve:
|
|
637
|
-
|
|
638
|
-
> Codex suggested adding error handling scenarios to PROJ-2 and noted PROJ-4 could be split into frontend/backend. I've updated PROJ-2's acceptance criteria. The PROJ-4 split is optional — your call.
|
|
639
|
-
>
|
|
640
|
-
> If you're happy with this plan, say **approve plan** to start dispatching.
|
|
641
|
-
|
|
642
691
|
**If validation fails:**
|
|
643
692
|
|
|
644
693
|
> ## Plan Audit Failed
|
|
@@ -652,19 +701,7 @@ After the review, the planner summarizes recommendations and asks you to approve
|
|
|
652
701
|
>
|
|
653
702
|
> Please address these issues, then say "finalize plan" again.
|
|
654
703
|
|
|
655
|
-
Fix the issues and try again.
|
|
656
|
-
|
|
657
|
-
### DAG dispatch progress
|
|
658
|
-
|
|
659
|
-
After approval, issues are assigned to the agent automatically in dependency order. Up to 3 issues run in parallel.
|
|
660
|
-
|
|
661
|
-
> `📊 Search Feature: 2/3 complete`
|
|
662
|
-
|
|
663
|
-
When everything is done:
|
|
664
|
-
|
|
665
|
-
> `✅ Search Feature: complete (3/3 issues)`
|
|
666
|
-
|
|
667
|
-
If an issue gets stuck (all retries failed), dependent issues are blocked and you'll be notified.
|
|
704
|
+
Fix the issues and try again. Say "cancel" or "stop planning" to exit without dispatching.
|
|
668
705
|
|
|
669
706
|
---
|
|
670
707
|
|
|
@@ -1113,7 +1150,7 @@ For programmatic access, the plugin registers these RPC methods:
|
|
|
1113
1150
|
If an agent goes silent (LLM timeout, API hang, CLI lockup), the watchdog handles it automatically:
|
|
1114
1151
|
|
|
1115
1152
|
1. No output for `inactivitySec` → kill and retry once
|
|
1116
|
-
2. Second silence → escalate to stuck (you get notified, see [
|
|
1153
|
+
2. Second silence → escalate to stuck (you get notified, see [Timeout recovery](#timeout-recovery) above)
|
|
1117
1154
|
|
|
1118
1155
|
| Setting | Default | What it controls |
|
|
1119
1156
|
|---|---|---|
|
|
@@ -1146,26 +1183,35 @@ Agents call `linear_issues` with typed JSON parameters. The tool wraps the Linea
|
|
|
1146
1183
|
| `list_states` | Get available workflow states for a team | `teamId` |
|
|
1147
1184
|
| `list_labels` | Get available labels for a team | `teamId` |
|
|
1148
1185
|
|
|
1149
|
-
**Sub-issues:** Use `action="create"` with `parentIssueId` to create sub-issues under an existing issue. The new issue inherits `teamId` and `projectId` from its parent automatically.
|
|
1186
|
+
**Sub-issues:** Use `action="create"` with `parentIssueId` to create sub-issues under an existing issue. The new issue inherits `teamId` and `projectId` from its parent automatically. Only orchestrators on triaged issues have `create` access — workers and auditors cannot create issues.
|
|
1150
1187
|
|
|
1151
1188
|
### `spawn_agent` / `ask_agent` — Multi-agent orchestration
|
|
1152
1189
|
|
|
1153
1190
|
Delegate work to other crew agents. `spawn_agent` is fire-and-forget (parallel), `ask_agent` waits for a reply (synchronous). Disabled with `enableOrchestration: false`.
|
|
1154
1191
|
|
|
1192
|
+
Sub-agents run in their own context — they do **not** share the parent's worktree or get `code_run` access. They're useful for reasoning, research, and coordination (e.g., "ask Inara how to phrase this error message") but cannot directly modify code. To give a sub-agent code context, include the relevant snippets in the task message.
|
|
1193
|
+
|
|
1155
1194
|
### `dispatch_history` — Recent dispatch context
|
|
1156
1195
|
|
|
1157
1196
|
Returns recent dispatch activity. Agents use this for situational awareness when working on related issues.
|
|
1158
1197
|
|
|
1159
1198
|
### Access model
|
|
1160
1199
|
|
|
1161
|
-
|
|
1200
|
+
Tool access varies by context. Orchestrators get the full toolset; workers and auditors are restricted:
|
|
1162
1201
|
|
|
1163
|
-
| Context | `linear_issues`
|
|
1164
|
-
|
|
1165
|
-
|
|
|
1166
|
-
|
|
|
1167
|
-
|
|
|
1168
|
-
|
|
|
1202
|
+
| Context | `linear_issues` | `code_run` | `spawn_agent` / `ask_agent` | Filesystem |
|
|
1203
|
+
|---|---|---|---|---|
|
|
1204
|
+
| Orchestrator (triaged issue) | Full (read, create, update, comment) | Yes | Yes | Read + write |
|
|
1205
|
+
| Orchestrator (untriaged issue) | Read only | Yes | Yes | Read + write |
|
|
1206
|
+
| Worker | None | None | None | Read + write |
|
|
1207
|
+
| Auditor | Prompt-constrained (has tool, instructed to verify only) | None | None | Read only (by prompt) |
|
|
1208
|
+
| Sub-agent (spawn/ask) | None | None | Yes (can chain) | Inherited from parent |
|
|
1209
|
+
|
|
1210
|
+
**Workers** run inside the coding backend (Codex, Claude, Gemini) — they have full filesystem access to the worktree but no Linear tools and no orchestration. Their only job is to write code and return a summary.
|
|
1211
|
+
|
|
1212
|
+
**Auditors** have access to `linear_issues` (the tool is registered) but are instructed via prompt to verify only — they return a JSON verdict, not code or issue mutations. Write access is not enforced at the tool level.
|
|
1213
|
+
|
|
1214
|
+
**Sub-agents** spawned via `spawn_agent`/`ask_agent` run in their own session with no worktree access and no `code_run`. They're information workers — useful for reasoning and coordination, not code execution.
|
|
1169
1215
|
|
|
1170
1216
|
---
|
|
1171
1217
|
|
|
@@ -1302,14 +1348,14 @@ The full dispatch flow for implementing an issue:
|
|
|
1302
1348
|
|
|
1303
1349
|
```mermaid
|
|
1304
1350
|
flowchart TD
|
|
1305
|
-
A["Issue assigned to app user"] --> B["1. Assess complexity tier<br/><i>
|
|
1351
|
+
A["Issue assigned to app user"] --> B["1. Assess complexity tier<br/><i>small / medium / high</i>"]
|
|
1306
1352
|
B --> C["2. Create isolated git worktree"]
|
|
1307
1353
|
C --> D["3. Register dispatch in state file"]
|
|
1308
1354
|
D --> E["4. Write .claw/manifest.json"]
|
|
1309
1355
|
E --> F["5. Notify: dispatched as tier"]
|
|
1310
1356
|
|
|
1311
|
-
F --> W["6. Worker phase<br/><i>
|
|
1312
|
-
W -->|"plugin code — automatic"| AU["7. Audit phase<br/><i>
|
|
1357
|
+
F --> W["6. Worker phase<br/><i>filesystem: full, linear_issues: NO</i><br/>Build prompt → implement → save to .claw/"]
|
|
1358
|
+
W -->|"plugin code — automatic"| AU["7. Audit phase<br/><i>filesystem: read, linear_issues: prompt-constrained</i><br/>Verify criteria → inspect diff → JSON verdict"]
|
|
1313
1359
|
|
|
1314
1360
|
AU --> V{"8. Verdict"}
|
|
1315
1361
|
V -->|PASS| DONE["Done ✔<br/>updateIssue → notify"]
|