@lumoai/cli 1.28.0 → 1.29.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.
- package/dist/cli/src/commands/doc-section-edit.js +113 -0
- package/dist/cli/src/commands/doc-show.js +48 -1
- package/dist/cli/src/commands/doc-update.js +22 -1
- package/dist/cli/src/index.js +20 -1
- package/dist/cli/src/lib/markdown-sections.js +12 -0
- package/dist/shared/src/markdown-sections.js +162 -0
- package/package.json +1 -1
- package/assets/skill/SKILL.md +0 -160
- package/assets/skill/references/artifacts-figma.md +0 -124
- package/assets/skill/references/criteria.md +0 -160
- package/assets/skill/references/docs.md +0 -339
- package/assets/skill/references/memory.md +0 -103
- package/assets/skill/references/milestones.md +0 -244
- package/assets/skill/references/onboarding.md +0 -102
- package/assets/skill/references/sessions.md +0 -225
- package/assets/skill/references/sprints.md +0 -157
- package/assets/skill/references/task-context.md +0 -136
- package/assets/skill/references/tasks.md +0 -357
- package/assets/skill/references/verify.md +0 -148
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
# Task Management
|
|
2
|
-
|
|
3
|
-
## Task Management
|
|
4
|
-
|
|
5
|
-
### `lumo task create <title> [flags]` — create a new task
|
|
6
|
-
|
|
7
|
-
Use this when the user wants to file a new task from the terminal. Title is positional and required (non-empty).
|
|
8
|
-
|
|
9
|
-
| Flag | Type | Notes |
|
|
10
|
-
| ------------------------ | ------ | ----------------------------------------------------------------------------------- |
|
|
11
|
-
| `-d, --description <>` | string | Optional task description. |
|
|
12
|
-
| `-p, --priority <level>` | enum | `low \| medium \| high \| urgent` (case-insensitive). Defaults to `low`. |
|
|
13
|
-
| `-a, --assignee <ref>` | string | `me`, an email, or a member name. Defaults to `me`. |
|
|
14
|
-
| `--project <ref>` | string | Project name or slug. **Required when the workspace has more than one project.** |
|
|
15
|
-
| `--milestone <ref>` | string | Milestone name (case-insensitive) within the resolved project. Omit for no binding. |
|
|
16
|
-
| `--sprint <ref>` | string | Sprint number or UUID to bind the task to on creation. Omit for no sprint binding. |
|
|
17
|
-
| `--tag <name>` | string | Attach a tag by name (repeatable). The name is resolved to an id server-side. |
|
|
18
|
-
| `--tag-id <cuid>` | string | Attach a tag by cuid (repeatable). Combines with `--tag`. |
|
|
19
|
-
|
|
20
|
-
Examples:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
lumo task create "Fix Slack OAuth redirect bug"
|
|
24
|
-
lumo task create "Refactor task service" --priority high --description "Split into smaller files"
|
|
25
|
-
lumo task create "Investigate slow query" --assignee teammate@example.com --project backend
|
|
26
|
-
lumo task create "Plan API design" --milestone "v1.0"
|
|
27
|
-
lumo task create "Sprint task" --sprint 3
|
|
28
|
-
lumo task create "Add rate limiting" --tag bug --tag urgent
|
|
29
|
-
lumo task create "Spike: evaluate caching options" --tag rfc --tag-id clm_abc123
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
On success the command prints one or two lines to stdout:
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
Created LUM-55 "Title" https://www.uselumo.ai/workspace/<slug>/my-tasks/LUM-55
|
|
36
|
-
Tags: bug, urgent
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
The `Tags:` line is omitted when no tags were attached.
|
|
40
|
-
|
|
41
|
-
If the workspace has multiple projects and `--project` is omitted, the server will return an error naming available projects — re-run with `--project <slug>`.
|
|
42
|
-
|
|
43
|
-
### When to suggest `task create`
|
|
44
|
-
|
|
45
|
-
- The user describes wanting a new task ("create a task to ...", "file a bug for ...", "log a TODO that ...", "add a task: ...").
|
|
46
|
-
- After a discussion that ends in "let's track that separately" — offer to create the task with a sensible title and priority.
|
|
47
|
-
- For follow-ups discovered mid-work that shouldn't bloat the current change — propose `task create` rather than silently expanding scope.
|
|
48
|
-
|
|
49
|
-
### `lumo task update <identifier> [flags]` — patch a task
|
|
50
|
-
|
|
51
|
-
Pure flag-driven update. Provide at least one of:
|
|
52
|
-
|
|
53
|
-
| Flag | Type | Notes |
|
|
54
|
-
| ------------------------ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
55
|
-
| `-t, --title <text>` | string | Cannot be empty. |
|
|
56
|
-
| `-d, --description <>` | string | `--description ""` clears the field. |
|
|
57
|
-
| `-s, --status <value>` | enum | `todo \| in_progress \| in_review \| done` (case-insensitive). |
|
|
58
|
-
| `-p, --priority <lvl>` | enum | `low \| medium \| high \| urgent`. |
|
|
59
|
-
| `-a, --assignee <ref>` | string | `me`, an email, or a member name. `--assignee ""` clears the field. |
|
|
60
|
-
| `--milestone <ref>` | string | Milestone name (case-insensitive) within the task's project. `--milestone ""` unbinds. |
|
|
61
|
-
| `--sprint <ref>` | string | Sprint number or UUID to bind the task to. `--sprint ""` clears the current sprint binding (idempotent when already unbound). |
|
|
62
|
-
| `--tag <name>` | string (repeatable) | **Bulk replace** the tag set by name. Creates tag if missing. Max 20. Mutually exclusive with `--add-tag*` / `--remove-tag*`. |
|
|
63
|
-
| `--tag-id <cuid>` | string (repeatable) | **Bulk replace** the tag set by id. Max 20. Mutually exclusive with `--add-tag*` / `--remove-tag*`. |
|
|
64
|
-
| `--add-tag <name>` | string (repeatable) | Attach tag by name (find-or-create). Max 20. |
|
|
65
|
-
| `--add-tag-id <cuid>` | string (repeatable) | Attach tag by id. Max 20. |
|
|
66
|
-
| `--remove-tag <name>` | string (repeatable) | Detach tag by name. `--remove-tag <name>` resolves the name via find-or-create on the workspace. If the name was unknown, a new Tag row is created (orphan, no attachments) before the detach runs as a no-op. Use `--remove-tag-id <cuid>` to avoid orphans. Max 20. |
|
|
67
|
-
| `--remove-tag-id <cuid>` | string (repeatable) | Detach tag by id. Unknown ids are a no-op (no side effects). Max 20. |
|
|
68
|
-
|
|
69
|
-
`--tag` / `--tag-id` (bulk replace) are mutually exclusive with `--add-tag` / `--add-tag-id` / `--remove-tag` / `--remove-tag-id`. The CLI errors before any network call if both families are mixed.
|
|
70
|
-
|
|
71
|
-
Examples:
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
lumo task update LUM-48 --status in_progress
|
|
75
|
-
lumo task update LUM-48 --title "Update task from CLI" --priority high
|
|
76
|
-
lumo task update LUM-48 --assignee me
|
|
77
|
-
lumo task update LUM-48 --description "" # clear description
|
|
78
|
-
lumo task update LUM-48 --assignee "" # unassign
|
|
79
|
-
lumo task update LUM-48 --milestone "v1.0" # attach to milestone
|
|
80
|
-
lumo task update LUM-48 --milestone "" # unbind milestone
|
|
81
|
-
lumo task update LUM-48 --sprint 3 # bind to sprint #3
|
|
82
|
-
lumo task update LUM-48 --sprint "" # unbind from current sprint
|
|
83
|
-
lumo task update LUM-42 --add-tag urgent --remove-tag draft
|
|
84
|
-
lumo task update LUM-42 --tag final --tag approved # replace entire tag set
|
|
85
|
-
lumo task update LUM-42 --tag final --add-tag oops
|
|
86
|
-
# Error: --tag/--tag-id are mutually exclusive with --add-tag/--add-tag-id/--remove-tag/--remove-tag-id
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
On success the command prints one or two lines to stdout:
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
Updated LUM-48 "Title" https://www.uselumo.ai/workspace/<slug>/my-tasks/LUM-48
|
|
93
|
-
Tags: urgent
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
The `Tags:` line is omitted when the resulting tag set is empty.
|
|
97
|
-
|
|
98
|
-
### Status transitions — direct moves are legal
|
|
99
|
-
|
|
100
|
-
The server's transition matrix (`lib/task/state-machine.ts`):
|
|
101
|
-
|
|
102
|
-
| From | Allowed targets |
|
|
103
|
-
| ----------- | --------------------------------------------------- |
|
|
104
|
-
| TODO | IN_PROGRESS, IN_REVIEW, DONE |
|
|
105
|
-
| IN_PROGRESS | TODO, IN_REVIEW, DONE |
|
|
106
|
-
| IN_REVIEW | TODO, IN_PROGRESS, DONE |
|
|
107
|
-
| DONE | TODO, IN_PROGRESS (reopen only — **not** IN_REVIEW) |
|
|
108
|
-
|
|
109
|
-
Practical rules:
|
|
110
|
-
|
|
111
|
-
- **One call suffices.** `--status done` straight from TODO or IN_PROGRESS is legal — never walk `in_progress → in_review → done` as a ritual (measured in LUM-392: 70 such chains wasted ~75 calls).
|
|
112
|
-
- **Under the verify flow you don't set `in_review`/`done` at all** — `lumo verify` moves the task to IN_REVIEW on all-pass and the DONE adjudication is human-only.
|
|
113
|
-
- **DONE → IN_REVIEW is rejected (409).** To attach follow-up context to a DONE task, use `lumo task comment` instead of reopening.
|
|
114
|
-
|
|
115
|
-
### When to suggest `task update`
|
|
116
|
-
|
|
117
|
-
- The user describes a state change in natural language (e.g. "mark LUM-48 as in progress", "rename LUM-12 to ...", "assign LUM-30 to me", "bump the priority on LUM-7").
|
|
118
|
-
- After the agent finishes a task and the user confirms — offer to move it to `done`.
|
|
119
|
-
- Multiple status changes in a row should each be a separate `update` invocation rather than batched.
|
|
120
|
-
|
|
121
|
-
### Sprint output format
|
|
122
|
-
|
|
123
|
-
`--sprint <ref>` prints a `Sprint:` line after the update line showing old → new binding:
|
|
124
|
-
|
|
125
|
-
```
|
|
126
|
-
Sprint: - → #3 # newly bound (was backlog)
|
|
127
|
-
Sprint: #2 → #3 # rebound (moved from sprint 2 to 3)
|
|
128
|
-
Sprint: #3 → - # unbound
|
|
129
|
-
Task LUM-48 already in sprint #3 # noop (same sprint)
|
|
130
|
-
Task LUM-48 has no sprint binding # noop (already unbound)
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
`--sprint` can be combined with other update flags. The PATCH (field updates) runs first; the sprint operation runs after. Failures on either step pass through independently without rollback.
|
|
134
|
-
|
|
135
|
-
### Out of scope
|
|
136
|
-
|
|
137
|
-
The CLI does **not** currently update due date or parent task. Those need to be edited in the web UI.
|
|
138
|
-
|
|
139
|
-
Milestone updates (`--milestone`) and sprint binding (`--sprint`) both work. Full milestone CRUD is available via `lumo milestone create / show / update / delete`, tasks can be bound/unbound in bulk via `lumo milestone add / remove <identifier> <task...>`, and milestones can be manually reordered via `lumo milestone reorder <ref...>` / `lumo milestone move <ref> --before|--after <ref>` (see below). Full sprint CRUD is available via `lumo sprint create / show / update / delete / start / close / add / remove` (see below).
|
|
140
|
-
|
|
141
|
-
### `lumo task list [flags]` — list tasks assigned to you
|
|
142
|
-
|
|
143
|
-
Default behavior: prints every task currently assigned to the authenticated user (no project / status filter), one per line, as a fixed-width table:
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
LUM-42 IN_PROGRESS HIGH web Fix Slack OAuth redirect
|
|
147
|
-
LUM-48 TODO MEDIUM backend Investigate slow query
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
| Flag | Type | Notes |
|
|
151
|
-
| ----------------------- | ------- | -------------------------------------------------------------------------------- |
|
|
152
|
-
| `-s, --status <value>` | enum | Filter by status: `todo \| in_progress \| in_review \| done` (case-insensitive). |
|
|
153
|
-
| `-p, --project <ref>` | string | Filter by project name (case-insensitive match against display name). |
|
|
154
|
-
| `-m, --milestone <ref>` | string | Filter to my tasks under this milestone (name or UUID). |
|
|
155
|
-
| `-n, --limit <count>` | integer | Cap output to the first N rows. |
|
|
156
|
-
|
|
157
|
-
When `--milestone` is set, the CLI calls `GET /api/milestones/<id>/tasks?assigned=me` instead of `/api/tasks/me`. Other filters (`--status`, `--limit`) still apply client-side to the milestone-scoped result.
|
|
158
|
-
|
|
159
|
-
Filtering is currently client-side — the server returns the full "my tasks" set and the CLI slices it. This is fine for typical workspaces (dozens of tasks); revisit if a workspace has hundreds.
|
|
160
|
-
|
|
161
|
-
### When to suggest `task list`
|
|
162
|
-
|
|
163
|
-
- The user asks "what am I working on", "what tasks do I have", "list my tasks", "show me my queue".
|
|
164
|
-
- Before suggesting a status change ("mark something as done"), if no task ID is in context — run `task list` first to surface candidates.
|
|
165
|
-
|
|
166
|
-
### `lumo next [--count <N>]` — recommend the next task to work on
|
|
167
|
-
|
|
168
|
-
Ranks the tasks assigned to you and prints the top N (default 3), each with a
|
|
169
|
-
one-line reason. Read-only — it does **not** bind or load context. Pick one from
|
|
170
|
-
the list, then run `lumo session attach <LUM-N>` + `lumo task context <LUM-N>`.
|
|
171
|
-
|
|
172
|
-
Ranking is lexicographic: **priority** (URGENT→LOW) first, then **active-sprint
|
|
173
|
-
membership**, then **due date** (earlier first), then in-flight status
|
|
174
|
-
(IN_PROGRESS / IN_REVIEW ahead of TODO). DONE tasks are excluded. The active
|
|
175
|
-
sprint lookup is best-effort — if it fails the command still recommends, just
|
|
176
|
-
without the sprint boost.
|
|
177
|
-
|
|
178
|
-
| Flag | Type | Notes |
|
|
179
|
-
| ----------------- | ------- | ----------------------------------------------------------------------- |
|
|
180
|
-
| `-n, --count <N>` | integer | How many tasks to recommend. Defaults to 3. Must be a positive integer. |
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
lumo next
|
|
184
|
-
lumo next --count 1
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
Output:
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
Top 3 recommended tasks (of 12 open):
|
|
191
|
-
|
|
192
|
-
1. LUM-42 IN_PROGRESS URGENT Fix Slack OAuth redirect
|
|
193
|
-
↳ URGENT · active sprint · due 2026-06-03 (overdue) · in progress
|
|
194
|
-
2. LUM-48 TODO HIGH Investigate slow query
|
|
195
|
-
↳ HIGH · active sprint
|
|
196
|
-
3. LUM-12 TODO MEDIUM Add rate limiting
|
|
197
|
-
↳ MEDIUM · due 2026-06-10
|
|
198
|
-
|
|
199
|
-
Next: lumo session attach LUM-42 && lumo task context LUM-42
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
When to suggest: the user asks "what should I work on", "what's next", "recommend my next task" (in any language), "pick my next task", or starts a session without a task in mind. After they choose, run `session attach` + `task context` for the picked task.
|
|
203
|
-
|
|
204
|
-
### `lumo task show <identifier>` — print one task's detail
|
|
205
|
-
|
|
206
|
-
Returns a key:value block for a single task — title, status, priority, project, assignee (with display name from Clerk), URL, and the full description below. Lighter than `task context` because it does not load prior session summaries or memory.
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
lumo task show LUM-42
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
Use when the user wants the current state of a task without the agent-handoff payload.
|
|
213
|
-
|
|
214
|
-
### `lumo task comment <identifier> <body>` — leave a comment
|
|
215
|
-
|
|
216
|
-
Two-step under the hood (resolve LUM-N → POST comment). Body is plain text; quote it to embed spaces or newlines.
|
|
217
|
-
|
|
218
|
-
```bash
|
|
219
|
-
lumo task comment LUM-42 "Reproduced the redirect bug on staging — Safari only, not Chrome."
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
The CLI does not support @-mention chip syntax. If the user wants to ping someone, they should comment from the web UI.
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
## Task Dependencies (`lumo task deps …`)
|
|
227
|
-
|
|
228
|
-
### `lumo task deps list <LUM-N>` — show all dependency edges
|
|
229
|
-
|
|
230
|
-
Prints the task's dependency edges grouped into three sections: **CONFIRMED**, **SUGGESTED (pending confirmation)**, and **DISMISSED**. Each row includes a short 8-character edge id in square brackets, the direction (`blocked by` / `blocks`), the other task's identifier and title, the other task's current status, the source (`MANUAL` or `DETECTED`), and inline evidence for detected edges.
|
|
231
|
-
|
|
232
|
-
```bash
|
|
233
|
-
lumo task deps list LUM-42
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
Example output:
|
|
237
|
-
|
|
238
|
-
```
|
|
239
|
-
Dependencies for LUM-42 (3)
|
|
240
|
-
|
|
241
|
-
CONFIRMED
|
|
242
|
-
[a1b2c3d4] blocked by LUM-9 "Fix auth token expiry" IN_PROGRESS · MANUAL
|
|
243
|
-
|
|
244
|
-
SUGGESTED (pending confirmation)
|
|
245
|
-
[e5f6a7b8] blocks LUM-55 "Migrate DB schema" TODO · shared_files(4 shared files: src/db/schema.ts, src/db/migrate.ts, ...)
|
|
246
|
-
confirm: lumo task deps confirm LUM-42 e5f6a7b8 (add --reverse if direction is flipped; false positive: dismiss)
|
|
247
|
-
[c9d0e1f2] blocked by LUM-38 "Add OAuth scopes" IN_REVIEW · task_mention(description)
|
|
248
|
-
confirm: lumo task deps confirm LUM-42 c9d0e1f2 (add --reverse if direction is flipped; false positive: dismiss)
|
|
249
|
-
|
|
250
|
-
DISMISSED
|
|
251
|
-
[b3c4d5e6] blocks LUM-12 · dismissed
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
CONFIRMED and SUGGESTED rows show the other task's identifier, title, current status, and source/evidence. DISMISSED rows render as `[shortId] <direction> <identifier> · dismissed` only — no title, status, or source.
|
|
255
|
-
|
|
256
|
-
When there are no edges at all the output is:
|
|
257
|
-
|
|
258
|
-
```
|
|
259
|
-
Dependencies for LUM-42: no dependency edges.
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
**Evidence fields by detection signal:**
|
|
263
|
-
|
|
264
|
-
- `shared_files` — `shared_files(N shared files: path1, path2, …)` — number of shared write-touched files in the 14-day window, plus up to 5 sample paths.
|
|
265
|
-
- `task_mention` — `task_mention(description)` or `task_mention(comment)` — the surface where the mention appeared.
|
|
266
|
-
|
|
267
|
-
CONFIRMED rows also show `source`: `MANUAL` (user-declared via `deps add`) or `DETECTED` (auto-found then confirmed via `deps confirm`).
|
|
268
|
-
|
|
269
|
-
### `lumo task deps add <LUM-N> --blocked-by <LUM-M>` — declare a manual hard dependency
|
|
270
|
-
|
|
271
|
-
Asserts that LUM-N is blocked by LUM-M. The edge is created as CONFIRMED + MANUAL, meaning it is immediately in effect (no confirmation step required).
|
|
272
|
-
|
|
273
|
-
```bash
|
|
274
|
-
lumo task deps add LUM-42 --blocked-by LUM-9
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
Both `<LUM-N>` and `--blocked-by` are required. The command errors on usage if either is missing.
|
|
278
|
-
|
|
279
|
-
**Service semantics (read before using):**
|
|
280
|
-
|
|
281
|
-
- **Self-edge** → 400 ("A task cannot depend on itself").
|
|
282
|
-
- **CONFIRMED edge in the same direction already exists** → 409 ("Dependency already exists").
|
|
283
|
-
- **CONFIRMED edge in the reverse direction already exists** → the cycle guard fires and returns 409 ("Dependency would create a cycle").
|
|
284
|
-
- **Pair has a SUGGESTED or DISMISSED edge** in the same direction → `add` confirms it in place, preserving the original DETECTED source (so the edge transitions to CONFIRMED while keeping its auto-detected provenance). No new row is created.
|
|
285
|
-
- **Cycle guard** — the service runs a DFS over all CONFIRMED BLOCKS edges in the workspace before writing. If adding the edge would create a cycle → 409 ("Dependency would create a cycle").
|
|
286
|
-
|
|
287
|
-
### `lumo task deps confirm <LUM-N> <edge> [--reverse]` — confirm a detected candidate
|
|
288
|
-
|
|
289
|
-
Promotes a SUGGESTED edge to CONFIRMED. `<edge>` is a selector for the specific edge on LUM-N's edge list.
|
|
290
|
-
|
|
291
|
-
```bash
|
|
292
|
-
lumo task deps confirm LUM-42 e5f6a7b8 # confirm as detected direction
|
|
293
|
-
lumo task deps confirm LUM-42 LUM-55 # selector by other task's identifier
|
|
294
|
-
lumo task deps confirm LUM-42 e5f6a7b8 --reverse # flip direction before confirming
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
**Edge selector semantics** (shared by `confirm`, `dismiss`, `rm`):
|
|
298
|
-
|
|
299
|
-
- **Other task's identifier** (e.g., `LUM-55`) — case-insensitive exact match against the edge's other-task identifier. Resolves unambiguously when there is exactly one edge to that task.
|
|
300
|
-
- **Edge-id prefix** — at least 6 characters of the short id (e.g., `e5f6a7`). Must match exactly one edge.
|
|
301
|
-
- If zero or more than one edge matches → prints all candidate edges with short ids and exits 1. Retry with a more specific selector.
|
|
302
|
-
|
|
303
|
-
**`--reverse` semantics:**
|
|
304
|
-
|
|
305
|
-
- The detector's direction heuristic is best-effort. If the suggested direction is backwards (e.g., the detector says "LUM-42 blocks LUM-55" but actually LUM-55 blocks LUM-42), confirm with `--reverse` to flip before writing.
|
|
306
|
-
- The service checks that the reversed pair does not already have an edge (→ 409), and re-runs the cycle guard with the flipped direction.
|
|
307
|
-
|
|
308
|
-
### `lumo task deps dismiss <LUM-N> <edge>` — dismiss a candidate (immune to re-detection)
|
|
309
|
-
|
|
310
|
-
Marks the edge DISMISSED. The row is kept in the database — this is the key difference from `rm`. Because the row exists (in either direction), the detection service will never re-suggest this pair.
|
|
311
|
-
|
|
312
|
-
```bash
|
|
313
|
-
lumo task deps dismiss LUM-42 e5f6a7b8
|
|
314
|
-
lumo task deps dismiss LUM-42 LUM-38
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
Output: `Dismissed: [e5f6a7b8] LUM-38 "Add OAuth scopes" (won't be suggested again)`
|
|
318
|
-
|
|
319
|
-
Use `dismiss` for false positives. Use `rm` only when you want the pair to be eligible for re-detection in the future (the detection service can re-suggest pairs with no existing row).
|
|
320
|
-
|
|
321
|
-
### `lumo task deps rm <LUM-N> <edge> --yes` — delete an edge
|
|
322
|
-
|
|
323
|
-
Hard-deletes the edge row. **Requires `--yes`** — the CLI refuses without it (no interactive prompt exists).
|
|
324
|
-
|
|
325
|
-
```bash
|
|
326
|
-
lumo task deps rm LUM-42 a1b2c3d4 --yes
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
Output: `Removed [a1b2c3d4] from LUM-42`
|
|
330
|
-
|
|
331
|
-
**`rm` vs `dismiss`:** deleting removes the immunity — the detection service may re-suggest this pair the next time a shared-files sweep or task-mention event fires. Prefer `dismiss` for detection false positives; use `rm` to remove an incorrectly-declared MANUAL edge that you want fully erased.
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
### Detection red lines
|
|
336
|
-
|
|
337
|
-
- The detection service **never creates CONFIRMED edges automatically**. All auto-detected candidates are SUGGESTED; a human must `confirm` or `add` for an edge to become CONFIRMED.
|
|
338
|
-
- **Dismiss is pair-wise immunity**: once any edge exists between task A and task B (in either direction, regardless of status including DISMISSED), the detection service will not create a new candidate for that pair.
|
|
339
|
-
- **`rm` lifts the immunity**: after deleting the only edge between A and B, the detector may re-suggest them on the next event or sweep.
|
|
340
|
-
|
|
341
|
-
---
|
|
342
|
-
|
|
343
|
-
### Detection signals
|
|
344
|
-
|
|
345
|
-
**Signal 1 — `task_mention`**: fires when a task's description is updated or a comment is created. If the updated HTML contains @-mentions of other tasks, the mentioning task is recorded as depending on the mentioned task (direction heuristic: mentioner blocked by mentioned). Triggers immediately on write events; no cron needed.
|
|
346
|
-
|
|
347
|
-
**Signal 2 — `shared_files`**: hourly cron sweep. Looks at write-tool hook events (file edits, creates, etc.) in the past 14 days. For every pair of open (non-DONE) tasks that share **≥ 3 written files**, a SUGGESTED edge is created. Direction heuristic: older task blocks newer task. Parent–child task pairs are skipped (they share files by design). Edges are not created across different workspaces.
|
|
348
|
-
|
|
349
|
-
---
|
|
350
|
-
|
|
351
|
-
### When to suggest `task deps` commands
|
|
352
|
-
|
|
353
|
-
- **After `session attach` output shows a blocker warning or candidate-count hint** → run `lumo task deps list <LUM-N>` to review the full edge list, then `confirm` or `dismiss` each SUGGESTED candidate.
|
|
354
|
-
- **User says "X needs to wait for Y" or "LUM-42 is blocked by LUM-9"** → run `lumo task deps add LUM-42 --blocked-by LUM-9`.
|
|
355
|
-
- **Agent sees a `## ⚠ Dependency alerts` block (form A — live blockers) at session-start** → evaluate whether to wait for the blocker to merge before starting work; if the edge is stale or wrong, clean it with `deps rm` or `deps dismiss`.
|
|
356
|
-
- **Agent sees only a standalone hint line `Detected N candidate dependencies awaiting confirmation…` (form B — no live blockers)** → no immediate blocker, but run `lumo task deps list <LUM-N>` to review and confirm/dismiss SUGGESTED candidates. See [sessions.md](sessions.md) for the full alert format.
|
|
357
|
-
- **User reports a false positive dependency suggestion** → `lumo task deps dismiss <LUM-N> <edge>` to permanently suppress it for this pair.
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# lumo verify — machine verification loop
|
|
2
|
-
|
|
3
|
-
`lumo verify` is the machine half of the acceptance system (Acceptance v1,
|
|
4
|
-
LUM-343). It executes every **MACHINE** criterion's checkpointer in the local
|
|
5
|
-
repo, reports one structured PASS/FAIL verdict per criterion to the server,
|
|
6
|
-
and prints what to do next. The judge lives server-side: round numbering, the
|
|
7
|
-
3-round cap, escalation, and the IN_REVIEW transition all happen there
|
|
8
|
-
(execution on the client, adjudication on the server).
|
|
9
|
-
|
|
10
|
-
## The claim-done rule
|
|
11
|
-
|
|
12
|
-
**Before claiming a task is complete — in conversation, in a wrap-up, or by
|
|
13
|
-
touching its status — run `lumo verify`.** The loop replaces "I read the code
|
|
14
|
-
and it looks done" with executed evidence.
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
lumo verify # session-bound task
|
|
18
|
-
lumo verify LUM-42 # explicit task (overrides the session binding)
|
|
19
|
-
lumo verify --timeout 900 # per-checkpointer timeout in seconds (default 600)
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## What one round does
|
|
23
|
-
|
|
24
|
-
1. Loads the task's acceptance contract and picks out MACHINE criteria.
|
|
25
|
-
2. Runs each checkpointer locally (shell, cwd = current directory), one at a
|
|
26
|
-
time, echoing PASS/FAIL as it goes.
|
|
27
|
-
3. POSTs the structured verdicts; the server records one VerificationRun per
|
|
28
|
-
criterion at round = previous max + 1 and mirrors each verdict as a
|
|
29
|
-
TaskActivity event.
|
|
30
|
-
4. Prints the round outcome:
|
|
31
|
-
- **All PASS** → the task transitions to **IN_REVIEW** (existing state
|
|
32
|
-
machine + TASK_IN_REVIEW notification). **Stop here.** Human
|
|
33
|
-
adjudication and any HUMAN criteria take over; never set DONE yourself.
|
|
34
|
-
- **Any FAIL** → task status is untouched; the unmet criteria are printed
|
|
35
|
-
as next actions (statement, checkpointer, failure tail). Fix and re-run.
|
|
36
|
-
- **Round 3 still failing** → the loop escalates: a human is notified
|
|
37
|
-
(AGENT_VERIFY, requires action) and further `lumo verify` rounds are
|
|
38
|
-
rejected with 409. **Stop retrying**; fix only what the human directs.
|
|
39
|
-
|
|
40
|
-
Exit code 0 = all passed (or nothing to run); 1 = failures, escalation, or
|
|
41
|
-
errors.
|
|
42
|
-
|
|
43
|
-
## Verdict semantics (what the CLI sends)
|
|
44
|
-
|
|
45
|
-
- checkpointer exits 0 → `PASS` with evidence `cmd:<command>#exit=0`
|
|
46
|
-
- non-zero exit → `FAIL`, reason = output tail, enum `CRITERION_UNMET`
|
|
47
|
-
- spawn failure / timeout → `FAIL`, enum `CHECK_EXECUTION_ERROR`
|
|
48
|
-
|
|
49
|
-
evidencePointer is **not free text** — the server only accepts
|
|
50
|
-
`commit:<hash>`, `file:<path>:<line>`, or `cmd:<command>#exit=<code>`.
|
|
51
|
-
Verdicts are PASS|FAIL only; the agent path cannot write HUMAN verdicts or
|
|
52
|
-
`PASS_WITH_FOLLOWUP` (red line — those enter via human-initiated UI paths
|
|
53
|
-
only).
|
|
54
|
-
|
|
55
|
-
## Edge cases
|
|
56
|
-
|
|
57
|
-
- **No contract yet** → error pointing at `lumo task criteria set`; draft the
|
|
58
|
-
contract first (criteria.md golden rule).
|
|
59
|
-
- **HUMAN-only contract (zero MACHINE criteria)** → nothing to run; the CLI
|
|
60
|
-
says so and suggests handing off for human review
|
|
61
|
-
(`lumo task update <id> --status in_review`). No server write happens.
|
|
62
|
-
- **A round must cover every MACHINE criterion** — the CLI always runs all of
|
|
63
|
-
them; the server rejects partial rounds.
|
|
64
|
-
- Criteria added during review (`REVIEW_ADDED`) appear in the contract and
|
|
65
|
-
are picked up automatically by the next round.
|
|
66
|
-
|
|
67
|
-
## Round discipline
|
|
68
|
-
|
|
69
|
-
Rounds are a hard budget of 3, not a retry loop. Between rounds, actually fix
|
|
70
|
-
the failures — re-running without changes burns a round and (at round 3)
|
|
71
|
-
pages a human. A FAIL round never changes task status; only an all-pass round
|
|
72
|
-
moves it (to IN_REVIEW, never further).
|
|
73
|
-
|
|
74
|
-
## Review-time drift habits (gap findings)
|
|
75
|
-
|
|
76
|
-
A problem discovered during acceptance/review that the contract does NOT
|
|
77
|
-
cover is a **gap finding** — record it in the contract, never just fix it
|
|
78
|
-
silently:
|
|
79
|
-
|
|
80
|
-
1. **Append it on the spot.** Transcribe the human's finding as a criterion
|
|
81
|
-
via `lumo task criteria set <task> --file <desired-final-list> --human` —
|
|
82
|
-
the review-added semantics: the gap surfaced at review time, at the
|
|
83
|
-
current round.
|
|
84
|
-
2. **Tag why the contract drifted** with `--cause
|
|
85
|
-
<NEW_INFO|SCOPE_CHANGE|DRAFT_BLIND_SPOT|GRANULARITY|OTHER>`. Gap findings
|
|
86
|
-
are usually `DRAFT_BLIND_SPOT` (the draft missed it) or `NEW_INFO`
|
|
87
|
-
(information that didn't exist at drafting time).
|
|
88
|
-
3. **Then bounce.** The appended criterion shows up in `lumo task status`
|
|
89
|
-
nextActions and the next verify round picks it up automatically — no
|
|
90
|
-
side-channel to-do list.
|
|
91
|
-
|
|
92
|
-
How to read drift: information-lag and requirement-movement drift
|
|
93
|
-
(`NEW_INFO`, `SCOPE_CHANGE`) is healthy — don't optimize it away.
|
|
94
|
-
`DRAFT_BLIND_SPOT` clusters feed back into the drafting guide. **Zero drift
|
|
95
|
-
across many tasks is a red flag, not a trophy** — it usually means contracts
|
|
96
|
-
are too thin or state only sure-win clauses that can never be found wanting.
|
|
97
|
-
|
|
98
|
-
## lumo task status — the read half (self-check entry point)
|
|
99
|
-
|
|
100
|
-
`lumo task status [task] [--json]` is the read-only counterpart of the loop
|
|
101
|
-
(LUM-344): pure read, milliseconds, no LLM, never writes — running it costs
|
|
102
|
-
nothing and burns no round. Defaults to the session-bound task; an explicit
|
|
103
|
-
identifier overrides.
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
lumo task status # session-bound task
|
|
107
|
-
lumo task status LUM-42 # explicit task
|
|
108
|
-
lumo task status --json # versioned machine-readable payload
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### When to run it
|
|
112
|
-
|
|
113
|
-
**Status-first recovery:** run it FIRST — before re-reading code or
|
|
114
|
-
planning — whenever you:
|
|
115
|
-
|
|
116
|
-
- resume a task in a new session (yours or another agent's earlier work);
|
|
117
|
-
- come back after a verification round was rejected (`lumo verify` failed);
|
|
118
|
-
- were told the task bounced in review (REVIEW_ADDED criteria may have been
|
|
119
|
-
appended at the round they surfaced — they show up here automatically).
|
|
120
|
-
|
|
121
|
-
It answers "where does the loop stand": what already passed (don't redo it),
|
|
122
|
-
what's unmet and why (the exact failure tails), and how many rounds are left.
|
|
123
|
-
|
|
124
|
-
### What it prints
|
|
125
|
-
|
|
126
|
-
- Header: task identifier/title/status + `verification round N/3` (round 0 =
|
|
127
|
-
never verified) + an escalation warning when the machine loop is exhausted.
|
|
128
|
-
- **Criteria** — every criterion as `<glyph> <id> [TYPE] SOURCE@rN
|
|
129
|
-
statement` (✓ latest verdict passed / ✗ failed / ○ no verdict yet) with its
|
|
130
|
-
checkpointer and latest verdict line (evidence pointer on pass, failure
|
|
131
|
-
tail on fail). `REVIEW_ADDED@rN` provenance is visible per row.
|
|
132
|
-
- **History** — one line per recorded round: `rN · timestamp · X PASS / Y FAIL`.
|
|
133
|
-
- **Last round failures** — the most recent round's FAIL verdicts with their
|
|
134
|
-
rejection reasons (why the last round bounced).
|
|
135
|
-
- **Next actions** — the unmet criteria (latest verdict is not a pass:
|
|
136
|
-
failed or never verified, HUMAN ones included). This list IS the plan —
|
|
137
|
-
it is recomputed from the event log on every read, never maintained
|
|
138
|
-
separately. Empty + rounds recorded = awaiting human adjudication.
|
|
139
|
-
|
|
140
|
-
### --json contract
|
|
141
|
-
|
|
142
|
-
`--json` emits the full read model with a top-level `version` field
|
|
143
|
-
(currently `1`). The schema is versioned: breaking shape changes bump the
|
|
144
|
-
major; additive fields don't. Pin on `version` when scripting against it.
|
|
145
|
-
|
|
146
|
-
`status` reads; `verify` judges. Running status never starts a round, never
|
|
147
|
-
escalates, and never changes task state — loop rules (cap 3, IN_REVIEW on
|
|
148
|
-
all-pass, human-only DONE) live entirely in `lumo verify` and the server.
|