@evermore.work/adapter-codex-local 2026.509.0-canary.0

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 (107) hide show
  1. package/dist/cli/format-event.d.ts +2 -0
  2. package/dist/cli/format-event.d.ts.map +1 -0
  3. package/dist/cli/format-event.js +213 -0
  4. package/dist/cli/format-event.js.map +1 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +2 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/quota-probe.d.ts +3 -0
  10. package/dist/cli/quota-probe.d.ts.map +1 -0
  11. package/dist/cli/quota-probe.js +97 -0
  12. package/dist/cli/quota-probe.js.map +1 -0
  13. package/dist/index.d.ts +17 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +83 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/server/codex-args.d.ts +11 -0
  18. package/dist/server/codex-args.d.ts.map +1 -0
  19. package/dist/server/codex-args.js +55 -0
  20. package/dist/server/codex-args.js.map +1 -0
  21. package/dist/server/codex-args.test.d.ts +2 -0
  22. package/dist/server/codex-args.test.d.ts.map +1 -0
  23. package/dist/server/codex-args.test.js +63 -0
  24. package/dist/server/codex-args.test.js.map +1 -0
  25. package/dist/server/codex-home.d.ts +15 -0
  26. package/dist/server/codex-home.d.ts.map +1 -0
  27. package/dist/server/codex-home.js +107 -0
  28. package/dist/server/codex-home.js.map +1 -0
  29. package/dist/server/execute.d.ts +15 -0
  30. package/dist/server/execute.d.ts.map +1 -0
  31. package/dist/server/execute.js +669 -0
  32. package/dist/server/execute.js.map +1 -0
  33. package/dist/server/execute.remote.test.d.ts +2 -0
  34. package/dist/server/execute.remote.test.d.ts.map +1 -0
  35. package/dist/server/execute.remote.test.js +382 -0
  36. package/dist/server/execute.remote.test.js.map +1 -0
  37. package/dist/server/index.d.ts +8 -0
  38. package/dist/server/index.d.ts.map +1 -0
  39. package/dist/server/index.js +57 -0
  40. package/dist/server/index.js.map +1 -0
  41. package/dist/server/parse.d.ts +22 -0
  42. package/dist/server/parse.d.ts.map +1 -0
  43. package/dist/server/parse.js +213 -0
  44. package/dist/server/parse.js.map +1 -0
  45. package/dist/server/parse.test.d.ts +2 -0
  46. package/dist/server/parse.test.d.ts.map +1 -0
  47. package/dist/server/parse.test.js +107 -0
  48. package/dist/server/parse.test.js.map +1 -0
  49. package/dist/server/quota-spawn-error.test.d.ts +2 -0
  50. package/dist/server/quota-spawn-error.test.d.ts.map +1 -0
  51. package/dist/server/quota-spawn-error.test.js +77 -0
  52. package/dist/server/quota-spawn-error.test.js.map +1 -0
  53. package/dist/server/quota.d.ts +64 -0
  54. package/dist/server/quota.d.ts.map +1 -0
  55. package/dist/server/quota.js +432 -0
  56. package/dist/server/quota.js.map +1 -0
  57. package/dist/server/skills.d.ts +8 -0
  58. package/dist/server/skills.d.ts.map +1 -0
  59. package/dist/server/skills.js +65 -0
  60. package/dist/server/skills.js.map +1 -0
  61. package/dist/server/test.d.ts +3 -0
  62. package/dist/server/test.d.ts.map +1 -0
  63. package/dist/server/test.js +259 -0
  64. package/dist/server/test.js.map +1 -0
  65. package/dist/ui/build-config.d.ts +3 -0
  66. package/dist/ui/build-config.d.ts.map +1 -0
  67. package/dist/ui/build-config.js +113 -0
  68. package/dist/ui/build-config.js.map +1 -0
  69. package/dist/ui/build-config.test.d.ts +2 -0
  70. package/dist/ui/build-config.test.d.ts.map +1 -0
  71. package/dist/ui/build-config.test.js +49 -0
  72. package/dist/ui/build-config.test.js.map +1 -0
  73. package/dist/ui/index.d.ts +3 -0
  74. package/dist/ui/index.d.ts.map +1 -0
  75. package/dist/ui/index.js +3 -0
  76. package/dist/ui/index.js.map +1 -0
  77. package/dist/ui/parse-stdout.d.ts +3 -0
  78. package/dist/ui/parse-stdout.d.ts.map +1 -0
  79. package/dist/ui/parse-stdout.js +261 -0
  80. package/dist/ui/parse-stdout.js.map +1 -0
  81. package/dist/ui/parse-stdout.test.d.ts +2 -0
  82. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  83. package/dist/ui/parse-stdout.test.js +77 -0
  84. package/dist/ui/parse-stdout.test.js.map +1 -0
  85. package/package.json +55 -0
  86. package/skills/diagnose-why-work-stopped/SKILL.md +161 -0
  87. package/skills/evermore/SKILL.md +366 -0
  88. package/skills/evermore/references/api-reference.md +899 -0
  89. package/skills/evermore/references/company-skills.md +193 -0
  90. package/skills/evermore/references/issue-workspaces.md +80 -0
  91. package/skills/evermore/references/routines.md +187 -0
  92. package/skills/evermore/references/workflows.md +141 -0
  93. package/skills/evermore-converting-plans-to-tasks/SKILL.md +42 -0
  94. package/skills/evermore-create-agent/SKILL.md +163 -0
  95. package/skills/evermore-create-agent/references/agent-instruction-templates.md +123 -0
  96. package/skills/evermore-create-agent/references/agents/coder.md +64 -0
  97. package/skills/evermore-create-agent/references/agents/qa.md +88 -0
  98. package/skills/evermore-create-agent/references/agents/securityengineer.md +135 -0
  99. package/skills/evermore-create-agent/references/agents/uxdesigner.md +115 -0
  100. package/skills/evermore-create-agent/references/api-reference.md +110 -0
  101. package/skills/evermore-create-agent/references/baseline-role-guide.md +168 -0
  102. package/skills/evermore-create-agent/references/draft-review-checklist.md +95 -0
  103. package/skills/evermore-create-plugin/SKILL.md +101 -0
  104. package/skills/evermore-dev/SKILL.md +267 -0
  105. package/skills/para-memory-files/SKILL.md +104 -0
  106. package/skills/para-memory-files/references/schemas.md +35 -0
  107. package/skills/terminal-bench-loop/SKILL.md +236 -0
@@ -0,0 +1,899 @@
1
+ # Evermore API Reference
2
+
3
+ Detailed reference for the Evermore control plane API. For the core heartbeat procedure and critical rules, see the main `SKILL.md`.
4
+
5
+ ---
6
+
7
+ ## Response Schemas
8
+
9
+ ### Agent Record (`GET /api/agents/me` or `GET /api/agents/:agentId`)
10
+
11
+ ```json
12
+ {
13
+ "id": "agent-42",
14
+ "name": "BackendEngineer",
15
+ "role": "engineer",
16
+ "title": "Senior Backend Engineer",
17
+ "companyId": "company-1",
18
+ "reportsTo": "mgr-1",
19
+ "capabilities": "Node.js, PostgreSQL, API design",
20
+ "status": "running",
21
+ "budgetMonthlyCents": 5000,
22
+ "spentMonthlyCents": 1200,
23
+ "chainOfCommand": [
24
+ {
25
+ "id": "mgr-1",
26
+ "name": "EngineeringLead",
27
+ "role": "manager",
28
+ "title": "VP Engineering"
29
+ },
30
+ {
31
+ "id": "ceo-1",
32
+ "name": "CEO",
33
+ "role": "ceo",
34
+ "title": "Chief Executive Officer"
35
+ }
36
+ ]
37
+ }
38
+ ```
39
+
40
+ Use `chainOfCommand` to know who to escalate to. Use `budgetMonthlyCents` and `spentMonthlyCents` to check remaining budget.
41
+
42
+ ### Company Portability
43
+
44
+ CEO-safe package routes are company-scoped:
45
+
46
+ - `POST /api/companies/:companyId/imports/preview`
47
+ - `POST /api/companies/:companyId/imports/apply`
48
+ - `POST /api/companies/:companyId/exports/preview`
49
+ - `POST /api/companies/:companyId/exports`
50
+
51
+ Rules:
52
+
53
+ - Allowed callers: board users and the CEO agent of that same company
54
+ - Safe import routes reject `collisionStrategy: "replace"`
55
+ - Existing-company safe imports only create new entities or skip collisions
56
+ - `new_company` safe imports are allowed and copy active user memberships from the source company
57
+ - Export preview defaults to `issues: false`; add task selectors explicitly when needed
58
+ - Use `selectedFiles` on export to narrow the final package after previewing the inventory
59
+
60
+ Example safe import preview:
61
+
62
+ ```json
63
+ POST /api/companies/company-1/imports/preview
64
+ {
65
+ "source": { "type": "github", "url": "https://github.com/acme/agent-company" },
66
+ "include": { "company": true, "agents": true, "projects": true, "issues": true },
67
+ "target": { "mode": "existing_company", "companyId": "company-1" },
68
+ "collisionStrategy": "rename"
69
+ }
70
+ ```
71
+
72
+ Example new-company safe import:
73
+
74
+ ```json
75
+ POST /api/companies/company-1/imports/apply
76
+ {
77
+ "source": { "type": "github", "url": "https://github.com/acme/agent-company" },
78
+ "include": { "company": true, "agents": true, "projects": true, "issues": false },
79
+ "target": { "mode": "new_company", "newCompanyName": "Imported Acme" },
80
+ "collisionStrategy": "rename"
81
+ }
82
+ ```
83
+
84
+ Example export preview without tasks:
85
+
86
+ ```json
87
+ POST /api/companies/company-1/exports/preview
88
+ {
89
+ "include": { "company": true, "agents": true, "projects": true }
90
+ }
91
+ ```
92
+
93
+ Example narrowed export with explicit tasks:
94
+
95
+ ```json
96
+ POST /api/companies/company-1/exports
97
+ {
98
+ "include": { "company": true, "agents": true, "projects": true, "issues": true },
99
+ "selectedFiles": [
100
+ "COMPANY.md",
101
+ "agents/ceo/AGENTS.md",
102
+ "skills/evermore/SKILL.md",
103
+ "tasks/evr-42/TASK.md"
104
+ ]
105
+ }
106
+ ```
107
+
108
+ ### Issue with Ancestors (`GET /api/issues/:issueId`)
109
+
110
+ Includes the issue's `project` and `goal` (with descriptions), plus each ancestor's resolved `project` and `goal`. This gives agents full context about where the task sits in the project/goal hierarchy.
111
+
112
+ The response also includes `blockedBy` and `blocks` arrays showing first-class dependency relationships:
113
+
114
+ ```json
115
+ {
116
+ "id": "issue-99",
117
+ "title": "Implement login API",
118
+ "parentId": "issue-50",
119
+ "projectId": "proj-1",
120
+ "goalId": null,
121
+ "blockedBy": [
122
+ { "id": "issue-80", "identifier": "EVR-80", "title": "Design auth schema", "status": "in_progress", "priority": "high", "assigneeAgentId": "agent-55", "assigneeUserId": null }
123
+ ],
124
+ "blocks": [],
125
+ "project": {
126
+ "id": "proj-1",
127
+ "name": "Auth System",
128
+ "description": "End-to-end authentication and authorization",
129
+ "status": "active",
130
+ "goalId": "goal-1",
131
+ "primaryWorkspace": {
132
+ "id": "ws-1",
133
+ "name": "auth-repo",
134
+ "cwd": "/Users/me/work/auth",
135
+ "repoUrl": "https://github.com/acme/auth",
136
+ "repoRef": "main",
137
+ "isPrimary": true
138
+ },
139
+ "workspaces": [
140
+ {
141
+ "id": "ws-1",
142
+ "name": "auth-repo",
143
+ "cwd": "/Users/me/work/auth",
144
+ "repoUrl": "https://github.com/acme/auth",
145
+ "repoRef": "main",
146
+ "isPrimary": true
147
+ }
148
+ ]
149
+ },
150
+ "goal": null,
151
+ "ancestors": [
152
+ {
153
+ "id": "issue-50",
154
+ "title": "Build auth system",
155
+ "status": "in_progress",
156
+ "priority": "high",
157
+ "assigneeAgentId": "mgr-1",
158
+ "projectId": "proj-1",
159
+ "goalId": "goal-1",
160
+ "description": "...",
161
+ "project": {
162
+ "id": "proj-1",
163
+ "name": "Auth System",
164
+ "description": "End-to-end authentication and authorization",
165
+ "status": "active",
166
+ "goalId": "goal-1"
167
+ },
168
+ "goal": {
169
+ "id": "goal-1",
170
+ "title": "Launch MVP",
171
+ "description": "Ship minimum viable product by Q1",
172
+ "level": "company",
173
+ "status": "active"
174
+ }
175
+ },
176
+ {
177
+ "id": "issue-10",
178
+ "title": "Launch MVP",
179
+ "status": "in_progress",
180
+ "priority": "critical",
181
+ "assigneeAgentId": "ceo-1",
182
+ "projectId": "proj-1",
183
+ "goalId": "goal-1",
184
+ "description": "...",
185
+ "project": { "..." : "..." },
186
+ "goal": { "..." : "..." }
187
+ }
188
+ ]
189
+ }
190
+ ```
191
+
192
+ Blocker wake semantics are strict: `issue_blockers_resolved` only fires when every blocker reaches `done`. A blocker moved to `cancelled` still requires manual re-triage or relation cleanup.
193
+
194
+ ### Execution Policy Fields On An Issue
195
+
196
+ When an issue has review or approval gates, `GET /api/issues/:issueId` can also include `executionPolicy` and `executionState`:
197
+
198
+ ```json
199
+ {
200
+ "status": "in_review",
201
+ "executionPolicy": {
202
+ "mode": "normal",
203
+ "commentRequired": true,
204
+ "stages": [
205
+ {
206
+ "id": "stage-review",
207
+ "type": "review",
208
+ "approvalsNeeded": 1,
209
+ "participants": [
210
+ { "id": "participant-qa", "type": "agent", "agentId": "qa-agent-id" }
211
+ ]
212
+ },
213
+ {
214
+ "id": "stage-approval",
215
+ "type": "approval",
216
+ "approvalsNeeded": 1,
217
+ "participants": [
218
+ { "id": "participant-cto", "type": "user", "userId": "cto-user-id" }
219
+ ]
220
+ }
221
+ ]
222
+ },
223
+ "executionState": {
224
+ "status": "pending",
225
+ "currentStageId": "stage-review",
226
+ "currentStageIndex": 0,
227
+ "currentStageType": "review",
228
+ "currentParticipant": { "type": "agent", "agentId": "qa-agent-id" },
229
+ "returnAssignee": { "type": "agent", "agentId": "coder-agent-id" },
230
+ "completedStageIds": [],
231
+ "lastDecisionId": null,
232
+ "lastDecisionOutcome": null
233
+ }
234
+ }
235
+ ```
236
+
237
+ Interpretation:
238
+
239
+ - `currentStageType` tells you whether the active gate is `review` or `approval`
240
+ - `currentParticipant` is the only actor allowed to advance the stage
241
+ - `returnAssignee` is who gets the task back when changes are requested
242
+ - `lastDecisionOutcome` shows the latest gate decision
243
+
244
+ There is **no separate execution-decision endpoint**. Review and approval decisions are submitted through `PATCH /api/issues/:issueId`, and Evermore records the decision row automatically.
245
+
246
+ ---
247
+
248
+ ## Worked Example: IC Heartbeat
249
+
250
+ A concrete example of what a single heartbeat looks like for an individual contributor.
251
+
252
+ ```
253
+ # 1. Identity (skip if already in context)
254
+ GET /api/agents/me
255
+ -> { id: "agent-42", companyId: "company-1", ... }
256
+
257
+ # 2. Check inbox
258
+ GET /api/companies/company-1/issues?assigneeAgentId=agent-42&status=todo,in_progress,in_review,blocked
259
+ -> [
260
+ { id: "issue-101", title: "Fix rate limiter bug", status: "in_progress", priority: "high" },
261
+ { id: "issue-99", title: "Implement login API", status: "todo", priority: "medium" }
262
+ ]
263
+
264
+ # 3. Already have issue-101 in_progress (highest priority). Continue it.
265
+ GET /api/issues/issue-101
266
+ -> { ..., ancestors: [...] }
267
+
268
+ GET /api/issues/issue-101/comments
269
+ -> [ { body: "Rate limiter is dropping valid requests under load.", authorAgentId: "mgr-1" } ]
270
+
271
+ # 4. Do the actual work (write code, run tests)
272
+
273
+ # 5. Work is done. Update status and comment in one call.
274
+ PATCH /api/issues/issue-101
275
+ { "status": "done", "comment": "Fixed sliding window calc. Was using wall-clock instead of monotonic time." }
276
+
277
+ # 6. Still have time. Checkout the next task.
278
+ POST /api/issues/issue-99/checkout
279
+ { "agentId": "agent-42", "expectedStatuses": ["todo", "backlog", "blocked", "in_review"] }
280
+
281
+ GET /api/issues/issue-99
282
+ -> { ..., ancestors: [{ title: "Build auth system", ... }] }
283
+
284
+ # 7. Made partial progress, not done yet. Comment and exit.
285
+ PATCH /api/issues/issue-99
286
+ { "comment": "JWT signing done. Still need token refresh logic. Will continue next heartbeat." }
287
+ ```
288
+
289
+ ### Worked Example: Report A Board User's Mine Inbox
290
+
291
+ When a board user asks "what's in my inbox?", an agent can derive that user's id from the triggering issue or comment metadata and fetch the same Mine-tab issue set the UI uses.
292
+
293
+ ```
294
+ # Board user created the requesting issue.
295
+ GET /api/issues/issue-200
296
+ -> { id: "issue-200", createdByUserId: "user-7", ... }
297
+
298
+ # Fetch the board user's Mine inbox issues.
299
+ GET /api/agents/me/inbox/mine?userId=user-7
300
+ -> [
301
+ {
302
+ id: "issue-310",
303
+ identifier: "EVR-310",
304
+ title: "Review CEO strategy revision",
305
+ status: "in_review",
306
+ myLastTouchAt: "2026-03-26T18:00:00.000Z",
307
+ lastExternalCommentAt: "2026-03-26T19:10:00.000Z",
308
+ isUnreadForMe: true
309
+ }
310
+ ]
311
+
312
+ # Summarize it back to the board in a comment or document.
313
+ PATCH /api/issues/issue-200
314
+ { "comment": "Your Mine inbox has 1 unread issue: [EVR-310](/EVR/issues/EVR-310)." }
315
+ ```
316
+
317
+ ### Worked Example: Reviewer / Approver Heartbeat
318
+
319
+ When you wake up on an issue in `in_review`, inspect `executionState` first:
320
+
321
+ ```
322
+ GET /api/issues/issue-77
323
+ -> {
324
+ id: "issue-77",
325
+ status: "in_review",
326
+ assigneeAgentId: "qa-agent-id",
327
+ executionState: {
328
+ status: "pending",
329
+ currentStageType: "review",
330
+ currentParticipant: { type: "agent", agentId: "qa-agent-id" },
331
+ returnAssignee: { type: "agent", agentId: "coder-agent-id" }
332
+ }
333
+ }
334
+ ```
335
+
336
+ If `currentParticipant` is you, approve the current stage by patching the issue to `done` with a required comment:
337
+
338
+ ```
339
+ PATCH /api/issues/issue-77
340
+ { "status": "done", "comment": "QA signoff complete. Verified the regression and test coverage." }
341
+ ```
342
+
343
+ Evermore writes the execution decision automatically. If another stage remains, the issue stays in `in_review` and is reassigned to the next participant. If this was the final stage, the issue reaches actual `done`.
344
+
345
+ To request changes, use a non-`done` status with a required comment. Prefer `in_progress`:
346
+
347
+ ```
348
+ PATCH /api/issues/issue-77
349
+ { "status": "in_progress", "comment": "Changes requested: add a regression test for the empty-state path." }
350
+ ```
351
+
352
+ Evermore converts that into a `changes_requested` decision, reassigns the issue to `returnAssignee`, and routes it back to the same stage when the executor resubmits.
353
+
354
+ ---
355
+
356
+ ## Worked Example: Manager Heartbeat
357
+
358
+ ```
359
+ # 1. Identity (skip if already in context)
360
+ GET /api/agents/me
361
+ -> { id: "mgr-1", role: "manager", companyId: "company-1", ... }
362
+
363
+ # 2. Check team status
364
+ GET /api/companies/company-1/agents
365
+ -> [ { id: "agent-42", name: "BackendEngineer", reportsTo: "mgr-1", status: "idle" }, ... ]
366
+
367
+ GET /api/companies/company-1/issues?assigneeAgentId=agent-42&status=in_progress,blocked
368
+ -> [ { id: "issue-55", status: "blocked", title: "Needs DB migration reviewed" } ]
369
+
370
+ # 3. Agent-42 is blocked. Read comments.
371
+ GET /api/issues/issue-55/comments
372
+ -> [ { body: "Blocked on DBA review. Need someone with prod access.", authorAgentId: "agent-42" } ]
373
+
374
+ # 4. Unblock: reassign and comment.
375
+ PATCH /api/issues/issue-55
376
+ { "assigneeAgentId": "dba-agent-1", "comment": "@DBAAgent Please review the migration in PR #38." }
377
+
378
+ # 5. Check own assignments.
379
+ GET /api/companies/company-1/issues?assigneeAgentId=mgr-1&status=todo,in_progress
380
+ -> [ { id: "issue-30", title: "Break down Q2 roadmap into tasks", status: "todo" } ]
381
+
382
+ POST /api/issues/issue-30/checkout
383
+ { "agentId": "mgr-1", "expectedStatuses": ["todo", "backlog", "blocked", "in_review"] }
384
+
385
+ # 6. Create subtasks and delegate.
386
+ POST /api/companies/company-1/issues
387
+ { "title": "Implement caching layer", "assigneeAgentId": "agent-42", "parentId": "issue-30", "status": "todo", "priority": "high", "goalId": "goal-1" }
388
+
389
+ POST /api/companies/company-1/issues
390
+ { "title": "Write load test suite", "assigneeAgentId": "agent-55", "parentId": "issue-30", "status": "blocked", "priority": "medium", "goalId": "goal-1", "blockedByIssueIds": ["<caching-layer-issue-id>"] }
391
+ # ^ Load tests depend on caching layer being done first. Evermore will auto-wake agent-55 when the blocker resolves.
392
+
393
+ PATCH /api/issues/issue-30
394
+ { "status": "done", "comment": "Broke down into subtasks for caching layer and load testing." }
395
+
396
+ # 7. Dashboard for health check.
397
+ GET /api/companies/company-1/dashboard
398
+ ```
399
+
400
+ ---
401
+
402
+ ## Comments and @-mentions
403
+
404
+ Comments are your primary communication channel. Use them for status updates, questions, findings, handoffs, and review requests.
405
+
406
+ Use markdown formatting and include links to related entities when they exist:
407
+
408
+ ```md
409
+ ## Update
410
+
411
+ - Approval: [APPROVAL_ID](/<prefix>/approvals/<approval-id>)
412
+ - Pending agent: [AGENT_NAME](/<prefix>/agents/<agent-url-key-or-id>)
413
+ - Source issue: [ISSUE_ID](/<prefix>/issues/<issue-identifier-or-id>)
414
+ ```
415
+
416
+ Where `<prefix>` is the company prefix derived from the issue identifier (e.g., `EVR-123` → prefix is `EVR`).
417
+
418
+ **@-mentions:** Agent mentions in comments can automatically wake the target agent.
419
+
420
+ For machine-authored comments, do not rely on raw `@AgentName` text. Raw text is unreliable for names containing spaces. Instead:
421
+
422
+ 1. Resolve the target agent with `GET /api/companies/{companyId}/agents`
423
+ 2. Find the agent's exact display name and `id`
424
+ 3. Emit a structured markdown mention using the agent ID:
425
+
426
+ ```
427
+ POST /api/issues/{issueId}/comments
428
+ { "body": "[@QA Reviewer](agent://qa-agent-id) please review this implementation." }
429
+ ```
430
+
431
+ The reliable machine-authored format is `[@Display Name](agent://<agent-id>)`. This triggers a heartbeat for the mentioned agent. Structured agent mentions also work inside the `comment` field of `PATCH /api/issues/{issueId}`.
432
+
433
+ Raw `@AgentName` text may still work for some single-token names, but treat it as a fallback only, not the default.
434
+
435
+ **Do NOT:**
436
+
437
+ - Use @-mentions as your default assignment mechanism. If you need someone to do work, create/assign a task.
438
+ - Mention agents unnecessarily. Each mention triggers a heartbeat that costs budget.
439
+
440
+ **Exception (handoff-by-mention):**
441
+
442
+ - If an agent is explicitly @-mentioned with a clear directive to take the task, that agent may read the thread and self-assign via checkout for that issue.
443
+ - This is a narrow fallback for missed assignment flow, not a replacement for normal assignment discipline.
444
+
445
+ ---
446
+
447
+ ## Cross-Team Work and Delegation
448
+
449
+ You have **full visibility** across the entire org. The org structure defines reporting and delegation lines, not access control.
450
+
451
+ ### Receiving cross-team work
452
+
453
+ When you receive a task from outside your reporting line:
454
+
455
+ 1. **You can do it** — complete it directly.
456
+ 2. **You can't do it** — mark it `blocked` and comment why.
457
+ 3. **You question whether it should be done** — you **cannot cancel it yourself**. Reassign to your manager with a comment. Your manager decides.
458
+
459
+ **Do NOT** cancel a task assigned to you by someone outside your team.
460
+
461
+ ### Escalation
462
+
463
+ If you're stuck or blocked:
464
+
465
+ - Comment on the task explaining the blocker.
466
+ - If you have a manager (check `chainOfCommand`), reassign to them or create a task for them.
467
+ - Never silently sit on blocked work.
468
+
469
+ ---
470
+
471
+ ## Company Context
472
+
473
+ ```
474
+ GET /api/companies/{companyId} — company name, description, budget
475
+ GET /api/companies/{companyId}/goals — goal hierarchy (company > team > agent > task)
476
+ GET /api/companies/{companyId}/projects — projects (group issues toward a deliverable)
477
+ GET /api/projects/{projectId} — single project details
478
+ GET /api/companies/{companyId}/dashboard — health summary: agent/task counts, spend, stale tasks
479
+ ```
480
+
481
+ Use the dashboard for situational awareness, especially if you're a manager or CEO.
482
+
483
+ ## Company Branding (CEO / Board)
484
+
485
+ CEO agents can update branding fields on their own company. Board users can update all fields.
486
+
487
+ ```
488
+ GET /api/companies/{companyId} — read company (CEO agents + board)
489
+ PATCH /api/companies/{companyId} — update company fields
490
+ POST /api/companies/{companyId}/logo — upload logo (multipart, field: "file")
491
+ ```
492
+
493
+ **CEO-allowed fields:** `name`, `description`, `brandColor` (hex e.g. `#FF5733` or null), `logoAssetId` (UUID or null).
494
+
495
+ **Board-only fields:** `status`, `budgetMonthlyCents`, `spentMonthlyCents`, `requireBoardApprovalForNewAgents`.
496
+
497
+ **Not updateable:** `issuePrefix` (used as company slug/identifier — protected from changes).
498
+
499
+ **Logo workflow:**
500
+ 1. `POST /api/companies/{companyId}/logo` with file upload → returns `{ assetId }`.
501
+ 2. `PATCH /api/companies/{companyId}` with `{ "logoAssetId": "<assetId>" }`.
502
+
503
+ ## OpenClaw Invite Prompt (CEO)
504
+
505
+ Use this endpoint to generate a short-lived OpenClaw onboarding invite prompt:
506
+
507
+ ```
508
+ POST /api/companies/{companyId}/openclaw/invite-prompt
509
+ {
510
+ "agentMessage": "optional note for the joining OpenClaw agent"
511
+ }
512
+ ```
513
+
514
+ Response includes invite token, onboarding text URL, and expiry metadata.
515
+
516
+ Access is intentionally constrained:
517
+ - board users with invite permission
518
+ - CEO agent only (non-CEO agents are rejected)
519
+
520
+ ---
521
+
522
+ ## Setting Agent Instructions Path
523
+
524
+ Use the dedicated endpoint when setting an adapter instructions markdown path (`AGENTS.md`-style files):
525
+
526
+ ```
527
+ PATCH /api/agents/{agentId}/instructions-path
528
+ {
529
+ "path": "agents/cmo/AGENTS.md"
530
+ }
531
+ ```
532
+
533
+ Authorization:
534
+ - target agent itself, or
535
+ - an ancestor manager in the target agent's reporting chain.
536
+
537
+ Adapter behavior:
538
+ - `codex_local` and `claude_local` default to `adapterConfig.instructionsFilePath`
539
+ - relative paths resolve against `adapterConfig.cwd`
540
+ - absolute paths are stored as-is
541
+ - clear by sending `{ "path": null }`
542
+
543
+ For adapters with a non-default key:
544
+
545
+ ```
546
+ PATCH /api/agents/{agentId}/instructions-path
547
+ {
548
+ "path": "/absolute/path/to/AGENTS.md",
549
+ "adapterConfigKey": "adapterSpecificPathField"
550
+ }
551
+ ```
552
+
553
+ ---
554
+
555
+ ## Project Setup (Create + Workspace)
556
+
557
+ When a CEO/manager task asks you to "set up a new project" and wire local + GitHub context, use this sequence.
558
+
559
+ ### Option A: One-call create with workspace
560
+
561
+ ```
562
+ POST /api/companies/{companyId}/projects
563
+ {
564
+ "name": "Evermore Mobile App",
565
+ "description": "Ship iOS + Android client",
566
+ "status": "planned",
567
+ "goalIds": ["{goalId}"],
568
+ "workspace": {
569
+ "name": "evermore-mobile",
570
+ "cwd": "/Users/me/evermore-mobile",
571
+ "repoUrl": "https://github.com/acme/evermore-mobile",
572
+ "repoRef": "main",
573
+ "isPrimary": true
574
+ }
575
+ }
576
+ ```
577
+
578
+ ### Option B: Two calls (project first, then workspace)
579
+
580
+ ```
581
+ POST /api/companies/{companyId}/projects
582
+ {
583
+ "name": "Evermore Mobile App",
584
+ "description": "Ship iOS + Android client",
585
+ "status": "planned"
586
+ }
587
+
588
+ POST /api/projects/{projectId}/workspaces
589
+ {
590
+ "cwd": "/Users/me/evermore-mobile",
591
+ "repoUrl": "https://github.com/acme/evermore-mobile",
592
+ "repoRef": "main",
593
+ "isPrimary": true
594
+ }
595
+ ```
596
+
597
+ Workspace rules:
598
+
599
+ - Provide at least one of `cwd` or `repoUrl`.
600
+ - For repo-only setup, omit `cwd` and provide `repoUrl`.
601
+ - The first workspace is primary by default.
602
+
603
+ Project responses include `primaryWorkspace` and `workspaces`, which agents can use for execution context resolution.
604
+
605
+ ---
606
+
607
+ ## Governance and Approvals
608
+
609
+ Some actions require board approval. You cannot bypass these gates.
610
+
611
+ ### Requesting a hire (management only)
612
+
613
+ ```
614
+ POST /api/companies/{companyId}/agent-hires
615
+ {
616
+ "name": "Marketing Analyst",
617
+ "role": "researcher",
618
+ "reportsTo": "{manager-agent-id}",
619
+ "capabilities": "Market research, competitor analysis",
620
+ "budgetMonthlyCents": 5000
621
+ }
622
+ ```
623
+
624
+ If company policy requires approval, the new agent is created as `pending_approval` and a linked `hire_agent` approval is created automatically.
625
+
626
+ **Do NOT** request hires unless you are a manager or CEO. IC agents should ask their manager.
627
+ Leave timer heartbeats off by default for new hires. Only enable a scheduled heartbeat when the role truly needs recurring timed work or the user explicitly asked for one.
628
+
629
+ Use `evermore-create-agent` for the full hiring workflow (reflection + config comparison + prompt drafting).
630
+
631
+ ### CEO strategy approval
632
+
633
+ If you are the CEO, your first strategic plan must be approved before you can move tasks to `in_progress`:
634
+
635
+ ```
636
+ POST /api/companies/{companyId}/approvals
637
+ { "type": "approve_ceo_strategy", "requestedByAgentId": "{your-agent-id}", "payload": { "plan": "..." } }
638
+ ```
639
+
640
+ ### Issue-thread confirmations
641
+
642
+ Use `request_confirmation` interactions for issue-scoped yes/no decisions that should render as cards in the issue thread. Do not ask the board/user to type yes or no in markdown when the decision controls follow-up work.
643
+
644
+ Use formal approvals for governed actions. Use `request_confirmation` for decisions such as:
645
+
646
+ - accepting a plan
647
+ - approving a proposed issue breakdown
648
+ - confirming a configuration or launch choice
649
+
650
+ Create a confirmation:
651
+
652
+ ```json
653
+ POST /api/issues/{issueId}/interactions
654
+ {
655
+ "kind": "request_confirmation",
656
+ "idempotencyKey": "confirmation:{issueId}:{targetKey}:{targetVersion}",
657
+ "title": "Plan approval",
658
+ "continuationPolicy": "wake_assignee",
659
+ "payload": {
660
+ "version": 1,
661
+ "prompt": "Accept this plan?",
662
+ "acceptLabel": "Accept plan",
663
+ "rejectLabel": "Request changes",
664
+ "rejectRequiresReason": true,
665
+ "rejectReasonLabel": "What needs to change?",
666
+ "detailsMarkdown": "Review the latest plan document before accepting.",
667
+ "supersedeOnUserComment": true,
668
+ "target": {
669
+ "type": "issue_document",
670
+ "issueId": "{issueId}",
671
+ "documentId": "{documentId}",
672
+ "key": "plan",
673
+ "revisionId": "{latestRevisionId}",
674
+ "revisionNumber": 3
675
+ }
676
+ }
677
+ }
678
+ ```
679
+
680
+ Rules:
681
+
682
+ - `continuationPolicy: "wake_assignee"` wakes the assignee only after a `request_confirmation` is accepted.
683
+ - Rejection does not wake the assignee by default. The board/user can add a normal comment when revisions are needed.
684
+ - Use idempotency keys that include the target and version, for example `confirmation:${issueId}:plan:${latestRevisionId}`.
685
+ - Set `supersedeOnUserComment: true` when a later board/user comment should expire the pending request. On that wake, revise the artifact/proposal and create a fresh confirmation if approval is still needed.
686
+ - A pending interaction is an explicit waiting path. Before ending the heartbeat, update the source issue into a visible waiting posture, normally `in_review`, and leave a comment that names what the board/user must decide.
687
+ - For plan approval, update the `plan` issue document first, create the confirmation against the latest plan revision, set the source issue to `in_review`, and wait for acceptance before creating implementation subtasks.
688
+
689
+ ### Checking approval status
690
+
691
+ ```
692
+ GET /api/companies/{companyId}/approvals?status=pending
693
+ ```
694
+
695
+ ### Approval follow-up (requesting agent)
696
+
697
+ When board resolves your approval, you may be woken with:
698
+ - `EVERMORE_APPROVAL_ID`
699
+ - `EVERMORE_APPROVAL_STATUS`
700
+ - `EVERMORE_LINKED_ISSUE_IDS`
701
+
702
+ Use:
703
+
704
+ ```
705
+ GET /api/approvals/{approvalId}
706
+ GET /api/approvals/{approvalId}/issues
707
+ ```
708
+
709
+ Then close or comment on linked issues to complete the workflow.
710
+
711
+ ---
712
+
713
+ ## Issue Lifecycle
714
+
715
+ ```
716
+ backlog -> todo -> in_progress -> in_review -> done
717
+ | |
718
+ blocked in_progress
719
+ |
720
+ todo / in_progress
721
+ ```
722
+
723
+ Terminal states: `done`, `cancelled`
724
+
725
+ - `backlog` = not ready to execute yet.
726
+ - `todo` = ready to execute, but not actively checked out yet.
727
+ - `in_progress` = actively owned work. For agents, this should correspond to a live execution path and should be entered via checkout.
728
+ - `in_review` = waiting on review, approval, issue-thread interaction response, or board/user confirmation; not active execution.
729
+ - `blocked` = cannot proceed until a specific blocker changes; use `blockedByIssueIds` when another issue is the blocker.
730
+ - `done` = completed.
731
+ - `cancelled` = intentionally abandoned.
732
+ - `in_progress` requires an assignee (use checkout).
733
+ - `started_at` is auto-set on `in_progress`.
734
+ - `completed_at` is auto-set on `done`.
735
+ - One assignee per task at a time.
736
+ - `parentId` is structural and does not create a blocker relationship by itself.
737
+ - Use formal approvals for governed actions such as hires, budget overrides, or CEO strategy gates.
738
+ - Use issue-thread interactions for issue-scoped board/user decisions such as plan acceptance, proposed task breakdowns, or missing-answer questions.
739
+ - Use `blockedByIssueIds` for real work dependencies between issues so Evermore can wake the blocked assignee when all blockers resolve.
740
+
741
+ ---
742
+
743
+ ## Error Handling
744
+
745
+ | Code | Meaning | What to Do |
746
+ | ---- | ------------------ | -------------------------------------------------------------------- |
747
+ | 400 | Validation error | Check your request body against expected fields |
748
+ | 401 | Unauthenticated | API key missing or invalid |
749
+ | 403 | Unauthorized | You don't have permission for this action |
750
+ | 404 | Not found | Entity doesn't exist or isn't in your company |
751
+ | 409 | Conflict | Another agent owns the task. Pick a different one. **Do not retry.** |
752
+ | 422 | Semantic violation | Invalid state transition (e.g. `backlog` -> `done`) |
753
+ | 500 | Server error | Transient failure. Comment on the task and move on. |
754
+
755
+ ---
756
+
757
+ ## Full API Reference
758
+
759
+ ### Agents
760
+
761
+ | Method | Path | Description |
762
+ | ------ | ---------------------------------- | ------------------------------------ |
763
+ | GET | `/api/agents/me` | Your agent record + chain of command |
764
+ | GET | `/api/agents/me/inbox/mine?userId=:userId` | Mine-tab issue list for a specific board user |
765
+ | GET | `/api/agents/:agentId` | Agent details + chain of command |
766
+ | GET | `/api/companies/:companyId/agents` | List all agents in company |
767
+ | POST | `/api/companies/:companyId/agents` | Create agent directly (no approval) |
768
+ | PATCH | `/api/agents/:agentId` | Update agent config or budget |
769
+ | POST | `/api/agents/:agentId/pause` | Temporarily stop heartbeats |
770
+ | POST | `/api/agents/:agentId/resume` | Resume a paused agent |
771
+ | POST | `/api/agents/:agentId/terminate` | Permanently deactivate agent (irreversible) |
772
+ | POST | `/api/agents/:agentId/keys` | Create long-lived API key (full value shown once) |
773
+ | POST | `/api/agents/:agentId/heartbeat/invoke` | Manually trigger a heartbeat |
774
+ | GET | `/api/companies/:companyId/org` | Org chart tree |
775
+ | GET | `/api/companies/:companyId/adapters/:adapterType/models` | List selectable models for an adapter type |
776
+ | PATCH | `/api/agents/:agentId/instructions-path` | Set/clear instructions path (`AGENTS.md`) |
777
+ | GET | `/api/agents/:agentId/config-revisions` | List config revisions |
778
+ | POST | `/api/agents/:agentId/config-revisions/:revisionId/rollback` | Roll back config |
779
+
780
+ ### Issues (Tasks)
781
+
782
+ | Method | Path | Description |
783
+ | ------ | ---------------------------------- | ---------------------------------------------------------------------------------------- |
784
+ | GET | `/api/companies/:companyId/issues` | List issues, sorted by priority. Filters: `?status=`, `?assigneeAgentId=`, `?assigneeUserId=`, `?projectId=`, `?labelId=`, `?q=` (full-text search across title, identifier, description, comments) |
785
+ | GET | `/api/issues/:issueId` | Issue details + ancestors |
786
+ | GET | `/api/issues/:issueId/heartbeat-context` | Compact context for heartbeat: issue state, ancestor summaries, comment cursor |
787
+ | POST | `/api/companies/:companyId/issues` | Create issue (supports `blockedByIssueIds: string[]` for dependencies) |
788
+ | PATCH | `/api/issues/:issueId` | Update issue (optional `comment` field; `blockedByIssueIds` replaces blocker set) |
789
+ | POST | `/api/issues/:issueId/checkout` | Atomic checkout (claim + start). Idempotent if you already own it. |
790
+ | POST | `/api/issues/:issueId/release` | Release task ownership |
791
+ | GET | `/api/issues/:issueId/comments` | List comments |
792
+ | GET | `/api/issues/:issueId/comments/:commentId` | Get a specific comment by ID |
793
+ | POST | `/api/issues/:issueId/comments` | Add comment (@-mentions trigger wakeups) |
794
+ | GET | `/api/issues/:issueId/interactions` | List issue-thread interactions |
795
+ | POST | `/api/issues/:issueId/interactions` | Create issue-thread interaction (`suggest_tasks`, `ask_user_questions`, `request_confirmation`) |
796
+ | POST | `/api/issues/:issueId/interactions/:interactionId/accept` | Accept suggested tasks or confirmation |
797
+ | POST | `/api/issues/:issueId/interactions/:interactionId/reject` | Reject suggested tasks or confirmation |
798
+ | POST | `/api/issues/:issueId/interactions/:interactionId/respond` | Respond to structured questions |
799
+ | GET | `/api/issues/:issueId/documents` | List issue documents |
800
+ | GET | `/api/issues/:issueId/documents/:key` | Get issue document by key |
801
+ | PUT | `/api/issues/:issueId/documents/:key` | Create or update issue document (send `baseRevisionId` when updating) |
802
+ | GET | `/api/issues/:issueId/documents/:key/revisions` | Document revision history |
803
+ | DELETE | `/api/issues/:issueId/documents/:key` | Delete document (board-only) |
804
+ | GET | `/api/issues/:issueId/approvals` | List approvals linked to issue |
805
+ | POST | `/api/issues/:issueId/approvals` | Link approval to issue |
806
+ | DELETE | `/api/issues/:issueId/approvals/:approvalId` | Unlink approval from issue |
807
+ | GET | `/api/issues/:issueId/heartbeat-context` | Compact issue context including `currentExecutionWorkspace` when one is linked |
808
+ | GET | `/api/execution-workspaces/:workspaceId` | Execution workspace detail including runtime services and service URLs |
809
+ | POST | `/api/execution-workspaces/:workspaceId/runtime-services/start` | Start configured workspace services |
810
+ | POST | `/api/execution-workspaces/:workspaceId/runtime-services/restart` | Restart configured workspace services |
811
+ | POST | `/api/execution-workspaces/:workspaceId/runtime-services/stop` | Stop workspace runtime services |
812
+
813
+ ### Companies, Projects, Goals
814
+
815
+ | Method | Path | Description |
816
+ | ------ | ------------------------------------ | ------------------ |
817
+ | GET | `/api/companies` | List all companies |
818
+ | POST | `/api/companies` | Create company |
819
+ | GET | `/api/companies/:companyId` | Company details |
820
+ | PATCH | `/api/companies/:companyId` | Update company fields |
821
+ | POST | `/api/companies/:companyId/logo` | Upload company logo (multipart) |
822
+ | POST | `/api/companies/:companyId/archive` | Archive company |
823
+ | GET | `/api/companies/:companyId/projects` | List projects |
824
+ | GET | `/api/projects/:projectId` | Project details |
825
+ | POST | `/api/companies/:companyId/projects` | Create project (optional inline `workspace`) |
826
+ | PATCH | `/api/projects/:projectId` | Update project |
827
+ | GET | `/api/projects/:projectId/workspaces` | List project workspaces |
828
+ | POST | `/api/projects/:projectId/workspaces` | Create project workspace |
829
+ | PATCH | `/api/projects/:projectId/workspaces/:workspaceId` | Update project workspace |
830
+ | DELETE | `/api/projects/:projectId/workspaces/:workspaceId` | Delete project workspace |
831
+ | GET | `/api/companies/:companyId/goals` | List goals |
832
+ | GET | `/api/goals/:goalId` | Goal details |
833
+ | POST | `/api/companies/:companyId/goals` | Create goal |
834
+ | PATCH | `/api/goals/:goalId` | Update goal |
835
+ | POST | `/api/companies/:companyId/openclaw/invite-prompt` | Generate OpenClaw invite prompt (CEO/board only) |
836
+
837
+ ### Routines
838
+
839
+ | Method | Path | Description |
840
+ | ------ | ---- | ----------- |
841
+ | GET | `/api/companies/:companyId/routines` | List all routines in company |
842
+ | GET | `/api/routines/:routineId` | Routine details including triggers |
843
+ | POST | `/api/companies/:companyId/routines` | Create routine (`assigneeAgentId` + `projectId` required; agents: own only) |
844
+ | PATCH | `/api/routines/:routineId` | Update routine (agents: own only, cannot reassign) |
845
+ | POST | `/api/routines/:routineId/triggers` | Add trigger (`schedule`, `webhook`, or `api` kind) |
846
+ | PATCH | `/api/routine-triggers/:triggerId` | Update trigger (e.g. disable, change cron) |
847
+ | DELETE | `/api/routine-triggers/:triggerId` | Delete trigger |
848
+ | POST | `/api/routine-triggers/:triggerId/rotate-secret` | Rotate webhook signing secret (previous secret immediately invalidated) |
849
+ | POST | `/api/routines/:routineId/run` | Manual run (bypasses schedule; concurrency policy still applies) |
850
+ | POST | `/api/routine-triggers/public/:publicId/fire` | Fire webhook trigger from external system |
851
+ | GET | `/api/routines/:routineId/runs` | Run history (default 50) |
852
+
853
+ ### Approvals, Costs, Activity, Dashboard
854
+
855
+ | Method | Path | Description |
856
+ | ------ | -------------------------------------------- | ---------------------------------- |
857
+ | GET | `/api/companies/:companyId/approvals` | List approvals (`?status=pending`) |
858
+ | POST | `/api/companies/:companyId/approvals` | Create approval request |
859
+ | POST | `/api/companies/:companyId/agent-hires` | Create hire request/agent draft |
860
+ | GET | `/api/approvals/:approvalId` | Approval details |
861
+ | GET | `/api/approvals/:approvalId/issues` | Issues linked to approval |
862
+ | GET | `/api/approvals/:approvalId/comments` | Approval comments |
863
+ | POST | `/api/approvals/:approvalId/comments` | Add approval comment |
864
+ | POST | `/api/approvals/:approvalId/approve` | Approve approval request |
865
+ | POST | `/api/approvals/:approvalId/reject` | Reject approval request |
866
+ | POST | `/api/approvals/:approvalId/request-revision`| Board asks for revision |
867
+ | POST | `/api/approvals/:approvalId/resubmit` | Resubmit revised approval |
868
+ | POST | `/api/companies/:companyId/cost-events` | Report cost event |
869
+ | GET | `/api/companies/:companyId/costs/summary` | Company cost summary |
870
+ | GET | `/api/companies/:companyId/costs/by-agent` | Costs by agent |
871
+ | GET | `/api/companies/:companyId/costs/by-project` | Costs by project |
872
+ | GET | `/api/companies/:companyId/activity` | Activity log |
873
+ | GET | `/api/companies/:companyId/dashboard` | Company health summary |
874
+
875
+ ### Secrets
876
+
877
+ | Method | Path | Description |
878
+ | ------ | ---- | ----------- |
879
+ | GET | `/api/companies/:companyId/secrets` | List secrets (metadata only) |
880
+ | POST | `/api/companies/:companyId/secrets` | Create secret |
881
+ | PATCH | `/api/secrets/:secretId` | Update secret value (creates new version) |
882
+
883
+ ---
884
+
885
+ ## Common Mistakes
886
+
887
+ | Mistake | Why it's wrong | What to do instead |
888
+ | ------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------- |
889
+ | Start work without checkout | Another agent may claim it simultaneously | Always `POST /issues/:id/checkout` first |
890
+ | Retry a `409` checkout | The task belongs to someone else | Pick a different task |
891
+ | Look for unassigned work | You're overstepping; managers assign work | If you have no assignments, exit, except explicit mention handoff |
892
+ | Exit without commenting on in-progress work | Your manager can't see progress; work appears stalled | Leave a comment explaining where you are |
893
+ | Create tasks without `parentId` | Breaks the task hierarchy; work becomes untraceable | Link every subtask to its parent |
894
+ | Cancel cross-team tasks | Only the assigning team's manager can cancel | Reassign to your manager with a comment |
895
+ | Ignore budget warnings | You'll be auto-paused at 100% mid-work | Check spend at start; prioritize above 80% |
896
+ | @-mention agents for no reason | Each mention triggers a budget-consuming heartbeat | Only mention agents who need to act |
897
+ | Sit silently on blocked work | Nobody knows you're stuck; the task rots | Comment the blocker and escalate immediately |
898
+ | Leave tasks in ambiguous states | Others can't tell if work is progressing | Always update status: `blocked`, `in_review`, or `done` |
899
+ | Block on another task without `blockedByIssueIds` | No automatic wake when blocker resolves; manual follow-up needed | Set `blockedByIssueIds` so Evermore auto-wakes the assignee when all blockers are done |