@lumoai/cli 1.57.0 → 1.58.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.
@@ -27,6 +27,9 @@ The command catalog below is a **map**: it lists every command grouped by domain
27
27
  | `task context`, retrieval (`slack/web/figma context`, `comments list`, `pr show`) | [references/task-context.md](references/task-context.md) |
28
28
  | `task create/update/list/show/comment`, `next` | [references/tasks.md](references/tasks.md) |
29
29
  | `task deps add/list/confirm/dismiss/rm` (dependency edges) | [references/task-deps.md](references/task-deps.md) |
30
+ | `idea*` — capture pool, lifecycle, evidence, comments | [references/ideas.md](references/ideas.md) |
31
+ | `plan`, `plan status` — the idea→plan converter run | [references/plan-runs.md](references/plan-runs.md) |
32
+ | `initiative create/list` (`LUM-INIT-<n>`) | [references/initiatives.md](references/initiatives.md) |
30
33
  | `task artifact*`, `task figma*` | [references/artifacts-figma.md](references/artifacts-figma.md) |
31
34
  | `task criteria set/list`, drafting the acceptance contract | [references/criteria.md](references/criteria.md) |
32
35
  | `verify`, `task status` — machine verification loop, claim-done flow, self-check/resume | [references/verify.md](references/verify.md) |
@@ -44,14 +47,14 @@ The command catalog below is a **map**: it lists every command grouped by domain
44
47
 
45
48
  ## Command catalog
46
49
 
47
- **Onboarding / auth / update** — see [onboarding.md](references/onboarding.md)
50
+ ### Onboarding / auth / update — see [onboarding.md](references/onboarding.md)
48
51
 
49
52
  - `lumo setup [--user|--project] [--force] [--agent <token>]` — install skill files + hooks
50
53
  - `lumo auth login` / `lumo auth logout` — paste an API key / clear credentials
51
54
  - `lumo whoami` — show current identity (email, workspace, key)
52
55
  - `lumo update` — upgrade the CLI to the latest npm release
53
56
 
54
- **Task context & retrieval** — see [task-context.md](references/task-context.md)
57
+ ### Task context & retrieval — see [task-context.md](references/task-context.md)
55
58
 
56
59
  - `lumo task context <id>` — load task background (memory, source cards, PR review todos, prior sessions)
57
60
  - `lumo task slack show <id> <contextId>` — full stored Slack thread
@@ -61,7 +64,7 @@ The command catalog below is a **map**: it lists every command grouped by domain
61
64
  - `lumo task pr show <id> <number>` — synced PR metadata (v1)
62
65
  - `lumo task lineage <id>` — read-only causal-trail audit: fragments that fed the task + each one's disclosure tag/outcome, the run's token/loop cost, a disclosure-funnel summary, and a Top-5 "operations by token cost"; `--signal` appends workspace-level usage signal-health (see [task-context.md](references/task-context.md))
63
66
 
64
- **Tasks** — see [tasks.md](references/tasks.md)
67
+ ### Tasks — see [tasks.md](references/tasks.md)
65
68
 
66
69
  - `lumo task create <title> [flags]` — create a task. **Mid-task** (your session is bound to an in-flight task) it requires `--rework-of <id>` (redirects you to fix the existing task — creates nothing) or `--new-scope` (genuinely new, out-of-scope work). On a send-back, fix in place / amend the contract instead of spinning off a new task — see [verify.md](references/verify.md) and [criteria.md](references/criteria.md).
67
70
  - `lumo task update <id> [flags]` — patch status/title/priority/assignee/milestone/sprint/tags; `--claimable`/`--not-claimable` set the agent-claimable marker (LUM-646)
@@ -70,79 +73,25 @@ The command catalog below is a **map**: it lists every command grouped by domain
70
73
  - `lumo task show <id>` — print one task's detail
71
74
  - `lumo task comment <id> <body>` — leave a comment
72
75
 
73
- **Ideas (team-level capture pool)**
74
-
75
- - `lumo idea "<statement>" [--context <text>]` — capture a team-level idea into the pool in <10s. Provenance is grabbed opportunistically and never blocks the capture: the current `CLAUDE_CODE_SESSION_ID` (→ sourceSessionId) and the session's bound task (→ sourceTaskId, null when nothing is bound). Prints an **I-prefixed** id (`✓ 想法 LUM-I42 已入池`) the `I` keeps ideas from colliding with task ids (`LUM-42`) in the same team namespace. Ideas are team-scoped (no project); the workspace's default team owns them. The unprocessed (CAPTURED) pool is what the Phase-2 transformer consumes.
76
- - **When to suggest**: the user has a stray idea/thought/improvement they want to park without derailing the current task ("记一下这个想法", "capture this idea", "add to the backlog of ideas"). Prefer this over `task create` for un-triaged sparks — an idea is above projects and isn't yet actionable work.
77
- - **Example**:
78
- ```bash
79
- lumo idea "Add a quick-capture keyboard shortcut" --context "raised in standup"
80
- ```
81
- - `lumo idea list` — print the team idea pool **newest-first**, one line per idea: the `LUM-I<n>` id, status (`CAPTURED` | `DEVELOPING` | `PLANNED` | `DROPPED`) and statement. Reads `GET /api/ideas`, which returns the whole pool (every status), not just the unprocessed slice. Empty pool prints `No ideas.`. The same pool is browsable/searchable in web at `/workspace/<slug>/ideas` (sidebar → Ideas), where a PLANNED idea links to the plan run that materialised it and the status filter hides DROPPED by default.
82
- - **When to suggest**: the user wants to see what's parked in the idea pool / "看看想法池" / "list the ideas" / triage before running `lumo plan`.
83
- - **Example**:
84
- ```bash
85
- lumo idea list
86
- ```
87
- - `lumo idea update <id> --status <captured|developing|planned|dropped>` — move an idea through its lifecycle (LUM-679). `<id>` is the `LUM-I<n>` id (a bare number also resolves); `--status` is case-insensitive. The four states are `CAPTURED` (pooled) → `DEVELOPING` (in triage / pre-work) → `PLANNED` (consumed by an initiative/plan), with `DROPPED` the terminal discard. Allowed transitions: `CAPTURED↔DEVELOPING`, `DEVELOPING→PLANNED`, and **any non-terminal → DROPPED**; nothing transitions out of `DROPPED`, and `CAPTURED→PLANNED` is not a manual move (only the converter's materialisation lands an idea in PLANNED). An illegal move is rejected with a clear error (400); an unknown id → 404.
88
- - **When to suggest**: the user wants to triage the pool by hand — start pre-work on an idea ("开始预研这个想法" → `developing`), or discard one ("废弃/丢掉这个想法" `dropped`). The status control also lives on the Idea detail page in web.
89
- - **Example**:
90
- ```bash
91
- lumo idea update LUM-I42 --status developing
92
- lumo idea update LUM-I42 --status dropped
93
- ```
94
- - `lumo idea slack add/show/rm <idea> ...`, `lumo idea web add/show/rm <idea> ...`, `lumo idea figma add/list/rm/refresh/context <idea> ...` (LUM-681) — attach & inspect evidence (Slack threads, web links, Figma design links) on an idea, mirroring the `task slack/web/figma` source-card commands but hitting `/api/ideas/:id/...`. `<idea>` is the `LUM-I<n>` id. `show`/`context` are Tier-2 retrieval (stored snapshot / fetched body / cached design metadata, no live re-fetch) and stamp the disclosure funnel like their task-side counterparts; `figma refresh` re-fetches metadata for every link on the idea.
95
- - **When to suggest**: the user wants to attach supporting evidence (a Slack discussion, a spec doc link, a Figma mock) to an idea before it goes through `lumo plan` — the converter carries this evidence forward into the resulting task/initiative. Prefer attaching to the idea over waiting until after conversion.
96
- - **Example**:
97
- ```bash
98
- lumo idea web add LUM-I42 https://example.com/spec
99
- lumo idea web show LUM-I42 wl_1
100
- lumo idea web rm LUM-I42 wl_1
101
- lumo idea slack add LUM-I42 https://myteam.slack.com/archives/C1/p123
102
- lumo idea slack show LUM-I42 ctx_1
103
- lumo idea slack rm LUM-I42 ctx_1
104
- lumo idea figma add LUM-I42 https://www.figma.com/file/abc/Mock
105
- lumo idea figma list LUM-I42
106
- lumo idea figma context LUM-I42 cfl_1
107
- lumo idea figma refresh LUM-I42
108
- lumo idea figma rm LUM-I42 cfl_1
109
- ```
110
-
111
- - `lumo idea comment <id> <body>` — post a comment on an idea (LUM-680). `<id>` is the `LUM-I<n>` id (a bare number also resolves) or a cuid; the body is plain text — quote it to pass spaces/newlines. Ideas reuse the task Comment model via a polymorphic `ideaId`; the thread is flat (no replies). Posting also records a `COMMENT_ADDED` entry on the idea's activity timeline. Comments/activity also render on the Idea detail slide-over in web.
112
- - `lumo idea comments list <id> [--full]` — print an idea's comment thread (oldest first), capped to the output budget like `task comments list`; `--full` prints every comment. Empty thread → `(no comments)`.
113
- - **When to suggest**: the user wants to discuss or annotate a parked idea ("给这个想法加条评论", "comment on the idea"), or review an idea's discussion/history ("看看这个想法的评论/活动"). For the activity timeline (status changes, statement edits, materialisation) there is no CLI reader — it's shown on the Idea detail slide-over in web.
114
- - **Example**:
115
- ```bash
116
- lumo idea comment LUM-I42 "Let's scope this for next sprint"
117
- lumo idea comments list LUM-I42
118
- ```
119
-
120
- **Plan runs (design-thinking 转换器)**
121
-
122
- - `lumo plan [--abandon-active]` — start a converter run that turns the team's captured idea pool + current priority into an executable plan through a 3-gate recoverable state machine (聚类→对齐→成计划). Freezes the input snapshot at start and enforces **one active run per team**: if a run is already active it refuses and points to `lumo plan status`; `--abandon-active` abandons the prior run first, then starts fresh. On success it prints (and opens) the **gate-A** web deep-link (`/workspace/<slug>/plan/<runId>`). The CLI only triggers — **all editing and gate confirmation happen in web**.
123
- - `lumo plan status` — print the active run's current stage (working segment or the open `*_READY` gate) and the deep-link to act on its next gate; with no active run, prompts to run `lumo plan`.
124
- - **When to suggest**: the user wants to turn the parked idea pool into a plan / "跑一下转换器" / "start a planning run" / "把想法变成计划"; or asks where an in-flight plan run stands ("plan 到哪一步了", "plan status"). The gate work itself is web-only — the CLI hands off the deep-link.
125
- - **Example** — check where the active run stands:
126
- ```bash
127
- lumo plan status
128
- ```
129
-
130
- **Initiatives (team-level, LUM-INIT-<n>)**
131
-
132
- - `lumo initiative create "<goal>" [--assumption <text>]` — create a team-level Initiative **directly, no plan run required** (`planRunId=null`, status `ACTIVE`). Prints the `LUM-INIT-<n>` id; `--assumption` records the bet (赌注旁注) behind it. A blank goal is rejected (400). Converter-materialised initiatives (from `lumo plan`) live in the same list.
133
- - **When to suggest**: the user wants to stand up a strategic initiative directly — "建一个 initiative" / "create an initiative" / "开一个举措" — without running the converter.
134
- - **Example**:
135
- ```bash
136
- lumo initiative create "Ship the initiatives browse surface" --assumption "teams curate initiatives directly"
137
- ```
138
- - `lumo initiative list` — print the team's initiatives newest-first, one line per initiative: the `LUM-INIT-<n>` id, status (`ACTIVE` | `DONE` | `DROPPED`) and goal. Browsable in web at `/workspace/<slug>/initiatives` (sidebar → Initiatives), where each links to its lineage (consumed ideas + attached tasks).
139
- - **When to suggest**: the user wants to see the team's initiatives / "看看 initiatives" / "list the initiatives".
140
- - **Example**:
141
- ```bash
142
- lumo initiative list
143
- ```
144
-
145
- **Task dependencies** — see [task-deps.md](references/task-deps.md)
76
+ ### Ideas (team-level capture pool) — see [ideas.md](references/ideas.md)
77
+
78
+ - `lumo idea "<statement>" [--context <text>]` — capture an un-triaged spark into the team pool (<10s); prints an **I-prefixed** id (`LUM-I42`) that cannot collide with task ids
79
+ - `lumo idea list` the whole pool newest-first (every status); also browsable at `/workspace/<slug>/ideas`
80
+ - `lumo idea update <id> --status <captured|developing|planned|dropped>` — manual lifecycle move; `CAPTURED→PLANNED` is converter-only
81
+ - `lumo idea slack|web|figma …` — attach & inspect evidence on an idea, mirroring the task-side source cards
82
+ - `lumo idea comment <id> <body>` · `lumo idea comments list <id> [--full]` flat comment thread on an idea
83
+
84
+ ### Plan runs (design-thinking 转换器) see [plan-runs.md](references/plan-runs.md)
85
+
86
+ - `lumo plan [--abandon-active]` — start a converter run (聚类→对齐→成计划) over the captured pool + current priority; one active run per team; prints the gate-A web deep-link
87
+ - `lumo plan status` — the active run's stage plus the deep-link to its next gate. Gate work is **web-only**
88
+
89
+ ### Initiatives (team-level, `LUM-INIT-<n>`) — see [initiatives.md](references/initiatives.md)
90
+
91
+ - `lumo initiative create "<goal>" [--assumption <text>]` create directly, no plan run required
92
+ - `lumo initiative list` — team initiatives newest-first; lineage browsable in web
93
+
94
+ ### Task dependencies see [task-deps.md](references/task-deps.md)
146
95
 
147
96
  - `lumo task deps list <id>` — list dependency edges both directions, grouped CONFIRMED / SUGGESTED / DISMISSED (each row: short edge id + other task + detected evidence)
148
97
  - `lumo task deps add <id> --blocked-by <LUM-N>` — declare a manual hard dependency (CONFIRMED)
@@ -151,52 +100,47 @@ The command catalog below is a **map**: it lists every command grouped by domain
151
100
  - `lumo task deps rm <id> <edge> --yes` — delete an edge (refuses without `--yes`)
152
101
  - `<edge>` = short edge-id prefix (≥6 chars) or the other task's identifier; ambiguous/unknown selectors list candidates and exit 1. See [tasks.md](references/tasks.md)
153
102
 
154
- **Acceptance criteria (contract)** — see [criteria.md](references/criteria.md)
103
+ ### Acceptance criteria (contract) — see [criteria.md](references/criteria.md)
155
104
 
156
105
  - `lumo task criteria set <task> --file <criteria.json> [--human] [--cause <tag>]` — submit the whole contract (full-group replace). Default = agent draft (AGENT_DRAFT, editable until DONE); `--human` = a HUMAN_EDIT revision transcribed from the conversation; `--cause` annotates why the contract drifted. See [criteria.md](references/criteria.md)
157
106
  - `lumo task criteria list <task>` — print the contract (id, MACHINE/HUMAN, provenance source@round, checkpointer)
158
107
 
159
- **Verification (machine acceptance loop)** — see [verify.md](references/verify.md)
108
+ ### Verification (machine acceptance loop) — see [verify.md](references/verify.md)
160
109
 
161
110
  - `lumo verify [task] --note "<self-report>" [--timeout <seconds>]` — run every MACHINE criterion's checkpointer locally and report a structured PASS/FAIL verdict per criterion. **`--note` is required** when a round will be posted: a one-line self-report ("我改了 X,因为 Y 可验收") frozen as your task's claim (source AGENT) the moment the round passes into IN_REVIEW, then checked against the diff for faithfulness. No note → no round posted (none burned). The round cap is the workspace's `verificationMaxRounds` (default 3) — read the actual budget off the `Round N/M` line the command prints, never assume a number. All-pass → task to IN_REVIEW (agent stops); a fail on the last round → escalate to human. **Run this before claiming a task is done.**
162
111
  - `lumo task status [task] [--json]` — read-only acceptance self-check (no LLM): the contract with each criterion's latest verdict, verification history/round, last failure reasons, `nextActions` (the unmet criteria), and any OPEN boundary crossings (fails closed — `null`/`⚠` means "could not confirm", not safe). **Run it first when resuming a task or after a round was rejected.**
163
112
  - `lumo verdict [task] --pass | --fail` — acceptance verdicts. `--pass` deep-links to the human verdict bar (records nothing). `--fail --reason <enum> …` records an AGENT send-back → IN_PROGRESS. **An unresolved send-back blocks the DONE transition with 409.**
164
113
  - `lumo crossing explain <id> --note "<text>"` — append an agent self-explanation ("申辩") to a boundary crossing; append-only, **never clears the crossing or unblocks Done** (disposition stays web + human-only). A review aid, not a self-clear.
165
114
 
166
- **Cost (per-operation token read-out)** — see [task-context.md](references/task-context.md)
115
+ ### Cost (per-operation token read-out) — see [task-context.md](references/task-context.md)
167
116
 
168
117
  - `lumo cost [--task <id>|--session <id>|--since <date>] [--by tool|model|member|session] [--json]` — per-operation token cost read-out, attributing each model step's token delta to the tool(s) it ran. Scope is mutually exclusive (default = workspace last-30-days). For the per-task Top-5 inline, see `lumo task lineage`.
169
118
 
170
- **Priority (team-level declaration)** — see [priority.md](references/priority.md)
119
+ ### Priority (team-level declaration) — see [priority.md](references/priority.md)
171
120
 
172
121
  - `lumo priority [text]` — declare the team's current priority (a 1-3 sentence plain-text statement). With `text`, records it directly; with no argument, prompts interactively. **Append-only**: a new declaration supersedes the old by a later `effectiveFrom` — nothing is ever overwritten or deleted.
173
122
  - `lumo priority list` — print the append history newest-first (the current declaration is marked `*`).
174
123
 
175
- **Criteria audit**workspace-level referent-kind analytics
124
+ ### Criteria audit — see [criteria.md](references/criteria.md)
176
125
 
177
126
  - `lumo criteria audit` — workspace-level read-out: count of acceptance criteria by effective referent kind (EXTERNAL_FACT / AGENT_CONSTRUCTED_STATE / PENDING_OUTCOME / UNVERIFIED_ASSERTION / UNCLASSIFIED) + the self-confirming-green ratio
178
127
 
179
- **Outcome well (post-hoc oracle)** — see [outcome.md](references/outcome.md)
128
+ ### Outcome well (post-hoc oracle) — see [outcome.md](references/outcome.md)
180
129
 
181
130
  - `lumo outcome show <task>` — read the post-hoc outcome well: the **falsifier** verdict (`REJECTED` | `INCONCLUSIVE` — never a "pass") plus its backing rejection signals. `INCONCLUSIVE` = no rejection on record, **not** "satisfied".
182
131
  - `lumo outcome record <task> --note "<what reality did>" [--kind <kind>]` — record a human-observed post-hoc **rejection** of a delivery (revert / rollback / CI regression / downstream redirect / bypass). Append-only; **there is no "mark satisfied" counterpart** — the well only asserts rejection. `--note` is required (the observed referent).
183
132
  - `lumo outcome rate [--min N] [--json]` — workspace **trust × post-hoc-fate** join (LUM-603, LUM-606): per delivery-time **verification-friction** bucket (`no-verification` / `single-round` / `multi-round-or-sendback` — two raw counts frozen at delivery, replacing the saturating forecast-confidence axis), the post-hoc REJECTED rate from the well. Honest by construction — thin buckets read `insufficient` (no fabricated rate), the single-round-vs-multi comparison stays `inconclusive` until CIs separate, and the rate is a **lower bound** (no signal = INCONCLUSIVE, never satisfied). Bucket names are value-neutral — direction is decided by the correlation, never welded into the label. Under-sampled today by design — the skeleton produces real strata once the well fills.
184
133
 
185
- **Fidelity read-out (mechanical change-pattern)** — see [fidelity.md](references/fidelity.md)
134
+ ### Fidelity read-out (mechanical change-pattern) — see [fidelity.md](references/fidelity.md)
186
135
 
187
136
  - `lumo fidelity show <task> [--json]` — per delivery snapshot (LUM-609), a **composition table, not a single score**: (1) the **grounding** of the frozen contract — grounded (`EXTERNAL_FACT`, a machine-checkable upper bound) / self-confirming (`AGENT_CONSTRUCTED_STATE` + `UNVERIFIED_ASSERTION`) / inconclusive (`PENDING_OUTCOME` + `UNCLASSIFIED`, surfaced not swallowed) + the full effective-kind tally; (2) the **independence** signal — criteria `ADDED`/`UPDATED` at round>0 (after work started) that the delivery rode on = backward-inference suspects. Purely mechanical (timing + op + grounding) — **no direction verdict**. A no-snapshot task is reported explicitly (not a pass). Zero new storage — reads the snapshot + `CRITERION_CHANGED` trail.
188
137
 
189
- ```bash
190
- lumo fidelity show LUM-42
191
- lumo fidelity show LUM-42 --json
192
- ```
193
-
194
- **Artifacts & Figma** — see [artifacts-figma.md](references/artifacts-figma.md)
138
+ ### Artifacts & Figma — see [artifacts-figma.md](references/artifacts-figma.md)
195
139
 
196
140
  - `lumo task artifact add/update/list/show/rm` — record spec/plan products on a task
197
141
  - `lumo task figma add/list/rm/refresh` — attach & manage Figma designs
198
142
 
199
- **Projects & milestones** — see [milestones.md](references/milestones.md)
143
+ ### Projects & milestones — see [milestones.md](references/milestones.md)
200
144
 
201
145
  - `lumo project list` — list projects (slugs feed `--project`)
202
146
  - `lumo milestone list/create/show/update/delete` — milestone CRUD (`show` includes a Sprint-coverage section)
@@ -208,7 +152,7 @@ lumo fidelity show LUM-42 --json
208
152
  - `lumo milestone reorder/move` — manual ordering
209
153
  - `lumo milestone criteria set/list/verdict` — milestone-level **exit criteria** (LUM-643): the close contract, drafted & adjudicated (裁定) by the steward (LUM-640) or a human. Unresolved criteria (pending or NOT_MET) block `--status completed` **and** the LUM-624 auto-rollup with 409/fail-closed; human override is web-only (`?force=1`, stamped as a persistent trail). `verdict --met` on `EXTERNAL_FACT` requires `--evidence` (422); `PENDING_OUTCOME` can never be MET
210
154
 
211
- **Documents** — CRUD/sharing → [docs.md](references/docs.md); **editing live docs** (raw/section/patch/append/diff/rebuild) → [doc-editing.md](references/doc-editing.md)
155
+ ### Documents — CRUD/sharing → [docs.md](references/docs.md); **editing live docs** (raw/section/patch/append/diff/rebuild) → [doc-editing.md](references/doc-editing.md)
212
156
 
213
157
  - `lumo doc create/update/show/list/delete` — document CRUD; `doc update` takes `--if-revision <n>` (mismatch → 409, re-read and retry) and is structure-guarded (drops to tables/rows/headings → 422 unless `--allow-shrink`)
214
158
  - `lumo doc show <doc> --raw` / `--section "<heading>"` — print the byte-identical markdown source (the only legal edit base; never the lossy HTML→md render), whole or one heading-addressed slice
@@ -219,14 +163,14 @@ lumo fidelity show LUM-42 --json
219
163
  - `lumo doc move/bind/unbind/share/unshare/share-list` — reparent · task linkage · member sharing
220
164
  - `lumo doc import-gdoc` / `lumo doc sync` — Google Doc import & re-sync
221
165
 
222
- **Sprints** — see [sprints.md](references/sprints.md)
166
+ ### Sprints — see [sprints.md](references/sprints.md)
223
167
 
224
168
  - `lumo sprint list/create/show/update/delete` — sprint CRUD (`show` includes Progress / Health / Blockers)
225
169
  - `lumo sprint start/close` — status transitions (no `--status` flag)
226
170
  - `lumo sprint add/remove <id> <task>` — bind/unbind a task
227
171
  - `lumo sprint summary [--retry]` — AI retro
228
172
 
229
- **Memory** — see [memory.md](references/memory.md)
173
+ ### Memory — see [memory.md](references/memory.md)
230
174
 
231
175
  - `lumo task memory add/list` · `lumo project memory add/list` — record/curate Memory (TASK vs PROJECT)
232
176
  - `lumo memory show <id>` — show one memory's full card (category + content) by id (progressive disclosure from a one-line index entry)
@@ -235,7 +179,7 @@ lumo fidelity show LUM-42 --json
235
179
  - `lumo memory push [--dry-run]` — upsync locally-authored memories from `<memory-dir>/outbox/*.json` to the team
236
180
  - `lumo memory fold [project-ref] --dry-run` — read-only PREVIEW of the autonomous topic-fold pass (folding runs via a daily cron; no manual apply, no `unfold`). See [memory.md](references/memory.md)
237
181
 
238
- **Sessions** — see [sessions.md](references/sessions.md)
182
+ ### Sessions — see [sessions.md](references/sessions.md)
239
183
 
240
184
  - `lumo session attach <id>` — bind this session to a task (then run `task context`). **Lifetime lock**: re-attaching to the same task is a no-op; attaching to a _different_ task is refused with 409 — start a new Claude Code session instead. No `--force`, no `session detach`.
241
185
  - `lumo session attach --steward <milestone>` — bind this session to a **milestone** as a **STEWARD (governance) session** (LUM-640): plan & accept only. Governance passes (task create/update, criteria set incl. `--human`, deps confirm/dismiss, `verdict --fail` with session provenance, milestone add/remove, milestone triage (LUM-646 claimable), all reads); implementation is gated (`lumo verify` → 409 **without burning a round**; moving a task to in_progress assigned to yourself → 409); commits/PRs produced anyway are recorded as milestone-scoped boundary crossings (fail-closed; disposition stays web+human-only, no CLI clear path). Same lifetime lock: same milestone idempotent, any other attach (a task, or a different milestone) → 409; multiple stewards per milestone are fine. See [sessions.md](references/sessions.md)
@@ -243,31 +187,12 @@ lumo fidelity show LUM-42 --json
243
187
  - End-of-session housekeeping is fully automatic (no command). On DONE the server runs three best-effort silent passes: Layer-1 memory curation, fragment-usage audit, and blocked-tag automation. See [sessions.md](references/sessions.md)
244
188
  - Git-suggest at session start (suggests `session attach`, never auto-binds) + Layer-2 project-memory review — see the reference
245
189
 
246
- **Worktrees (local dev tooling)** — see [worktree.md](references/worktree.md)
190
+ ### Worktrees (local dev tooling) — see [worktree.md](references/worktree.md)
247
191
 
248
192
  - `lumo worktree add <LUM-N> [slug]` — scaffold `.worktrees/<LUM-N>` + node_modules symlink off origin/main; run from the main checkout
249
193
  - `lumo worktree rm <LUM-N> --yes` — remove a worktree (keeps the branch unless `--delete-branch`)
250
194
  - `lumo worktree list` — list `.worktrees/` worktrees (task id, branch, dirty, node_modules link)
251
195
 
252
- ## Criteria audit
253
-
254
- ```bash
255
- lumo criteria audit
256
- ```
257
-
258
- `lumo criteria audit` — workspace-level acceptance-criteria analytics. Calls `GET /api/criteria/audit` and prints two things:
259
-
260
- 1. **Declared-kind distribution** — count of criteria by effective referent kind:
261
- - `EXTERNAL_FACT` — declared as externally observable (git SHA, CI status, DB row) and the checkpointer invokes real external tooling
262
- - `AGENT_CONSTRUCTED_STATE` — passes by checking output the agent itself produced
263
- - `PENDING_OUTCOME` — deferred to post-hoc falsifier
264
- - `UNVERIFIED_ASSERTION` — declared `EXTERNAL_FACT` but the checkpointer does **not** actually invoke external tooling (git/CI/HTTP); auto-downgraded. As of LUM-605 this is an **enforced gate, not just a label**: `lumo task criteria set` warns on it, and `lumo verify` blocks a PASS on it with **422 (no round burned)** until it's re-grounded or honestly re-declared `AGENT_CONSTRUCTED_STATE` (see references/criteria.md "referentKind")
265
- - `UNCLASSIFIED` — legacy rows predating the `referentKind` field (null in DB)
266
-
267
- 2. **Self-confirming-green headline ratio** — `(AGENT_CONSTRUCTED_STATE + UNVERIFIED_ASSERTION) / classified`. Criteria in these two buckets pass by confirming only the agent's own work, not an independent external state.
268
-
269
- **When to suggest**: when the user wants to audit how much of the workspace's "green" criteria are self-confirming vs externally anchored; when diagnosing whether acceptance criteria have real external hooks or are circular.
270
-
271
196
  ## Next-step hints (the trailing `Next:` block)
272
197
 
273
198
  `task create`, `task update`, `session attach`, `task context` and `next` end with a short `Next:` block naming what to do now — attach an unbound session, draft a missing contract, run `lumo verify`, read `task status` after a rejected round, explain an open boundary crossing, or stop and wait when the task is IN_REVIEW.
@@ -300,7 +225,7 @@ Don't guess these:
300
225
 
301
226
  1. `lumo session attach LUM-42` — bind this session (the binding is a lifetime lock; one session = one task)
302
227
  2. `lumo task context LUM-42` — load background; review unresolved items, PR-review todos, the description
303
- 3. **If the task has no acceptance criteria** (context shows the draft reminder, not a contract): draft outcome-level criteria sized to the task (3–7 for a typical multi-file task; 1–2 for a micro task) and submit them with `lumo task criteria set` **before writing the first line of code**see [criteria.md](references/criteria.md)
228
+ 3. **If the task has no acceptance criteria** (context shows the draft reminder, not a contract): draft outcome-level criteria sized to the task (3–7 for a typical multi-file task; 1–2 for a micro task) and submit them with `lumo task criteria set` **before writing the first line of code**. When a `### Reference class (outside view)` block follows the reminder, draft against it it lists how similar delivered tasks actually failed; treat it as material to reason from, never as a checklist to cover. See [criteria.md](references/criteria.md)
304
229
  4. Do the work
305
230
  5. **Before claiming done: `lumo verify`** — the machine half of the acceptance loop. Fix failures and re-run (the cap is workspace-configurable — see the `Round N/M` line in the output). All-pass → task moves to IN_REVIEW and you stop. See [verify.md](references/verify.md)
306
231
 
@@ -12,6 +12,35 @@ If `lumo task context` / session-start shows the draft reminder ("This task has
12
12
  2. Draft **3–7 criteria** for a typical multi-file task (soft range — the server warns outside it but never rejects; if you genuinely need more, merge related checks instead). Scale the count down for small tasks (see "Scale the contract to the task size").
13
13
  3. `lumo task criteria set <task> --file <criteria.json>` — submit.
14
14
 
15
+ ### The reference-class block (outside view) — LUM-497
16
+
17
+ Below the draft reminder you may see a `### Reference class (outside view)` block: mechanical statistics over **similar delivered tasks** — the send-back reasons they hit, how often their contract was still being written after work started, and the boundary crossings they tripped. It exists because an agent drafting its own acceptance criteria is systematically optimistic: you write down what you intend to build, not what tasks like this one historically got sent back for.
18
+
19
+ ```
20
+ ### Reference class (outside view)
21
+
22
+ Based on: 14 delivered tasks in milestone "Trust and cognitive load"
23
+
24
+ · Most common send-back reasons: evidence insufficient 5/14 · work did not match the criterion 3/14
25
+ · Contract still being written after work started: 9/14 deliveries
26
+ · Most common boundary crossing: edited a file a checkpointer depends on 3/14
27
+
28
+ Tasks here most often come back for insufficient evidence — what will your key criteria point at as proof?
29
+ ```
30
+
31
+ **How to use it:** read the failure modes, then ask which of them this task can plausibly hit, and let that change what you write. "Evidence insufficient" leads the class → decide what your key criteria will actually point at as proof. "Work did not match the criterion" leads → check that your statements describe outcomes rather than the steps you plan to take.
32
+
33
+ **How NOT to use it — this is the failure mode the block itself is most likely to cause:** do not treat the lines as a checklist to be "covered". Adding one criterion per listed failure mode, or setting `evidenceRequired` on everything because evidence leads the distribution, inflates the criterion count without adding information and taxes every verification round. The trailing line is deliberately a **question, not an instruction** — answer it for this task.
34
+
35
+ Reading the numbers honestly:
36
+
37
+ - Counts are **raw fractions over a small class** (`5/14`), never percentages, on purpose — `5/14` is a handful of tasks, not a rate. Weight them accordingly.
38
+ - The block names its own class and sample size (`Based on: N delivered tasks in <scope>`) — a milestone-level class is far more relevant to your task than a team-level fallback. Check which one you got.
39
+ - **`Insufficient sample: …` is a correct, deliberate output**, not a failure or a missing feature. It means no scope reached the minimum class size (the block states the floor in its own message), and a distribution over fewer tasks would read as evidence while carrying none. Draft from the task itself and move on.
40
+ - A class with no recorded send-backs, post-start contract edits or crossings says so explicitly. That is a stated fact about the class, not missing data.
41
+
42
+ The block is derived server-side from delivery history; it is not a claim by any agent, and there is nothing to reply to or act on beyond your own drafting.
43
+
15
44
  **The contract is editable until DONE — changes after work starts leave a recorded drift trail.** Behaviour changes at two thresholds tracked by `Task.workStartedAt` (set the first time the task leaves TODO; never resets even if the task bounces back to TODO):
16
45
 
17
46
  | Stage | `criteria set` resubmit behaviour |
@@ -214,9 +243,29 @@ lumo task criteria list LUM-42
214
243
 
215
244
  - **Session start** (bound task): the contract is the highest-priority section in the injection budget — ahead of memory/PR/Slack/Figma/web. If a still-open task has no criteria, the draft reminder is injected instead.
216
245
  - **`lumo session attach`**: prints the contract (or the draft reminder) right after binding.
246
+ - **The reference-class block** rides on the draft reminder at all three of those surfaces, so it appears only when the task has no contract yet — the one moment it can still change what gets written. It is capped at a few lines, sits outside the injection budget, and is skipped silently if the read fails or the workspace has acceptance mode off.
217
247
  - **`lumo task context`**: the `## Acceptance criteria (contract)` section appears after the task description, before memory.
218
248
  - **Review-time gap findings** are appended at the round they surface and show up in the contract automatically — `REVIEW_ADDED` provenance via human review paths; findings a human raises in conversation are transcribed with `--human` + `--cause` (see verify.md "Review-time drift habits").
219
249
 
220
250
  ## After the contract: the verification loop
221
251
 
222
252
  The contract is judged by `lumo verify` — run it before claiming the task is done. See [verify.md](verify.md) for the loop (a workspace-configurable round cap — `verificationMaxRounds`, default 3, shown as `Round N/M` in the output — IN_REVIEW on all-pass, escalation on a last-round fail).
253
+
254
+ ## `lumo criteria audit` — workspace referent-kind analytics
255
+
256
+ ```bash
257
+ lumo criteria audit
258
+ ```
259
+
260
+ `lumo criteria audit` — workspace-level acceptance-criteria analytics. Calls `GET /api/criteria/audit` and prints two things:
261
+
262
+ 1. **Declared-kind distribution** — count of criteria by effective referent kind:
263
+ - `EXTERNAL_FACT` — declared as externally observable (git SHA, CI status, DB row) and the checkpointer invokes real external tooling
264
+ - `AGENT_CONSTRUCTED_STATE` — passes by checking output the agent itself produced
265
+ - `PENDING_OUTCOME` — deferred to post-hoc falsifier
266
+ - `UNVERIFIED_ASSERTION` — declared `EXTERNAL_FACT` but the checkpointer does **not** actually invoke external tooling (git/CI/HTTP); auto-downgraded. As of LUM-605 this is an **enforced gate, not just a label**: `lumo task criteria set` warns on it, and `lumo verify` blocks a PASS on it with **422 (no round burned)** until it's re-grounded or honestly re-declared `AGENT_CONSTRUCTED_STATE` (see references/criteria.md "referentKind")
267
+ - `UNCLASSIFIED` — legacy rows predating the `referentKind` field (null in DB)
268
+
269
+ 2. **Self-confirming-green headline ratio** — `(AGENT_CONSTRUCTED_STATE + UNVERIFIED_ASSERTION) / classified`. Criteria in these two buckets pass by confirming only the agent's own work, not an independent external state.
270
+
271
+ **When to suggest**: when the user wants to audit how much of the workspace's "green" criteria are self-confirming vs externally anchored; when diagnosing whether acceptance criteria have real external hooks or are circular.
@@ -0,0 +1,82 @@
1
+ # Ideas (team-level capture pool)
2
+
3
+ An **idea** is an un-triaged spark parked above the project layer — not yet actionable work. Ideas are team-scoped (no project); the workspace's default team owns them. Ids are **I-prefixed** (`LUM-I42`) so they cannot collide with task ids (`LUM-42`) in the same team namespace.
4
+
5
+ The unprocessed (`CAPTURED`) pool is what the `lumo plan` converter consumes — see [plan-runs.md](plan-runs.md).
6
+
7
+ ## `lumo idea "<statement>" [--context <text>]`
8
+
9
+ Capture an idea into the pool in under 10 seconds. Provenance is grabbed opportunistically and **never blocks the capture**: the current `CLAUDE_CODE_SESSION_ID` (→ `sourceSessionId`) and the session's bound task (→ `sourceTaskId`, null when nothing is bound). Prints `✓ 想法 LUM-I42 已入池`.
10
+
11
+ **When to suggest**: the user has a stray idea / thought / improvement they want to park without derailing the current task ("记一下这个想法", "capture this idea", "add to the backlog of ideas"). Prefer this over `task create` for un-triaged sparks — an idea is above projects and isn't yet actionable work.
12
+
13
+ ```bash
14
+ lumo idea "Add a quick-capture keyboard shortcut" --context "raised in standup"
15
+ ```
16
+
17
+ ## `lumo idea list`
18
+
19
+ Print the pool **newest-first**, one line per idea: the `LUM-I<n>` id, status and statement. Reads `GET /api/ideas`, which returns the **whole** pool (every status), not just the unprocessed slice. Empty pool prints `No ideas.`
20
+
21
+ The same pool is browsable/searchable in web at `/workspace/<slug>/ideas` (sidebar → Ideas), where a `PLANNED` idea links to the plan run that materialised it and the status filter hides `DROPPED` by default.
22
+
23
+ **When to suggest**: the user wants to see what's parked ("看看想法池", "list the ideas"), or is triaging before running `lumo plan`.
24
+
25
+ ```bash
26
+ lumo idea list
27
+ ```
28
+
29
+ ## `lumo idea update <id> --status <captured|developing|planned|dropped>`
30
+
31
+ Move an idea through its lifecycle (LUM-679). `<id>` is the `LUM-I<n>` id (a bare number also resolves); `--status` is case-insensitive.
32
+
33
+ | State | Meaning |
34
+ | ------------ | -------------------------------- |
35
+ | `CAPTURED` | pooled, un-triaged |
36
+ | `DEVELOPING` | in triage / pre-work |
37
+ | `PLANNED` | consumed by an initiative / plan |
38
+ | `DROPPED` | terminal discard |
39
+
40
+ Allowed transitions: `CAPTURED ↔ DEVELOPING`, `DEVELOPING → PLANNED`, and **any non-terminal → DROPPED**. Nothing transitions out of `DROPPED`. `CAPTURED → PLANNED` is **not** a manual move — only the converter's materialisation lands an idea in `PLANNED`. An illegal move is rejected with a clear error (400); an unknown id → 404.
41
+
42
+ **When to suggest**: the user wants to triage by hand — start pre-work ("开始预研这个想法" → `developing`) or discard one ("废弃/丢掉这个想法" → `dropped`). The same control lives on the Idea detail page in web.
43
+
44
+ ```bash
45
+ lumo idea update LUM-I42 --status developing
46
+ lumo idea update LUM-I42 --status dropped
47
+ ```
48
+
49
+ ## Evidence on an idea — `slack` / `web` / `figma`
50
+
51
+ `lumo idea slack add|show|rm`, `lumo idea web add|show|rm`, `lumo idea figma add|list|rm|refresh|context` (LUM-681) attach and inspect supporting evidence, mirroring the `task slack/web/figma` source-card commands but hitting `/api/ideas/:id/...`. `<idea>` is the `LUM-I<n>` id.
52
+
53
+ `show` / `context` are **Tier-2 retrieval** (stored snapshot / fetched body / cached design metadata — no live re-fetch) and stamp the disclosure funnel like their task-side counterparts. `figma refresh` re-fetches metadata for every link on the idea.
54
+
55
+ **When to suggest**: the user wants to attach evidence (a Slack discussion, a spec link, a Figma mock) to an idea **before** it goes through `lumo plan` — the converter carries that evidence forward into the resulting task/initiative. Prefer attaching to the idea over waiting until after conversion.
56
+
57
+ ```bash
58
+ lumo idea web add LUM-I42 https://example.com/spec
59
+ lumo idea web show LUM-I42 wl_1
60
+ lumo idea web rm LUM-I42 wl_1
61
+ lumo idea slack add LUM-I42 https://myteam.slack.com/archives/C1/p123
62
+ lumo idea slack show LUM-I42 ctx_1
63
+ lumo idea slack rm LUM-I42 ctx_1
64
+ lumo idea figma add LUM-I42 https://www.figma.com/file/abc/Mock
65
+ lumo idea figma list LUM-I42
66
+ lumo idea figma context LUM-I42 cfl_1
67
+ lumo idea figma refresh LUM-I42
68
+ lumo idea figma rm LUM-I42 cfl_1
69
+ ```
70
+
71
+ ## Comments — `lumo idea comment` / `lumo idea comments list`
72
+
73
+ `lumo idea comment <id> <body>` posts a comment (LUM-680). `<id>` is the `LUM-I<n>` id (a bare number or a cuid also resolves); the body is plain text — quote it to pass spaces/newlines. Ideas reuse the task `Comment` model via a polymorphic `ideaId`; the thread is **flat** (no replies). Posting also records a `COMMENT_ADDED` entry on the idea's activity timeline.
74
+
75
+ `lumo idea comments list <id> [--full]` prints the thread oldest-first, capped to the output budget like `task comments list`; `--full` prints every comment. Empty thread → `(no comments)`.
76
+
77
+ **When to suggest**: the user wants to discuss or annotate a parked idea ("给这个想法加条评论"), or review its discussion/history ("看看这个想法的评论/活动"). For the **activity timeline** (status changes, statement edits, materialisation) there is no CLI reader — it renders on the Idea detail slide-over in web.
78
+
79
+ ```bash
80
+ lumo idea comment LUM-I42 "Let's scope this for next sprint"
81
+ lumo idea comments list LUM-I42
82
+ ```
@@ -0,0 +1,28 @@
1
+ # Initiatives (team-level, `LUM-INIT-<n>`)
2
+
3
+ An **Initiative** is a team-level strategic goal that tasks roll up to. Two origins land in the same list:
4
+
5
+ - **Direct** — `lumo initiative create`, no plan run required (`planRunId = null`, status `ACTIVE`).
6
+ - **Materialised** — produced by the `lumo plan` converter's gate C, carrying its lineage (see [plan-runs.md](plan-runs.md)).
7
+
8
+ ## `lumo initiative create "<goal>" [--assumption <text>]`
9
+
10
+ Create an Initiative directly. Prints the `LUM-INIT-<n>` id. `--assumption` records the bet (赌注旁注) behind it — the thing that, if false, makes the initiative the wrong call. A blank goal is rejected (400).
11
+
12
+ **When to suggest**: the user wants to stand up a strategic initiative directly — "建一个 initiative", "create an initiative", "开一个举措" — without running the converter.
13
+
14
+ ```bash
15
+ lumo initiative create "Ship the initiatives browse surface" --assumption "teams curate initiatives directly"
16
+ ```
17
+
18
+ ## `lumo initiative list`
19
+
20
+ Print the team's initiatives newest-first, one line each: the `LUM-INIT-<n>` id, status (`ACTIVE` | `DONE` | `DROPPED`) and goal.
21
+
22
+ Browsable in web at `/workspace/<slug>/initiatives` (sidebar → Initiatives), where each links to its lineage — the ideas it consumed and the tasks attached to it.
23
+
24
+ **When to suggest**: the user wants to see the team's initiatives ("看看 initiatives", "list the initiatives").
25
+
26
+ ```bash
27
+ lumo initiative list
28
+ ```
@@ -0,0 +1,27 @@
1
+ # Plan runs (design-thinking 转换器)
2
+
3
+ A **plan run** turns the team's captured idea pool + the current priority declaration into an executable plan, through a 3-gate recoverable state machine: **聚类 → 对齐 → 成计划**.
4
+
5
+ The CLI only **triggers and reports**. All editing and gate confirmation happen in **web** — the CLI hands off a deep-link.
6
+
7
+ Inputs come from [ideas.md](ideas.md) (the `CAPTURED` pool) and [priority.md](priority.md) (the current declaration). Materialisation produces tasks plus, when the plan calls for one, an Initiative — see [initiatives.md](initiatives.md).
8
+
9
+ ## `lumo plan [--abandon-active]`
10
+
11
+ Start a converter run. Freezes the input snapshot at start and enforces **one active run per team**: if a run is already active it refuses and points to `lumo plan status`. `--abandon-active` abandons the prior run first, then starts fresh.
12
+
13
+ On success it prints (and opens) the **gate-A** web deep-link, `/workspace/<slug>/plan/<runId>`.
14
+
15
+ Invoked bare (`lumo plan`) it starts a run; `lumo plan --abandon-active` clears a stuck one first. The command is a parent with its own action — `status` below is a subcommand added on top of it, not a required one.
16
+
17
+ **When to suggest**: the user wants to turn the parked idea pool into a plan — "跑一下转换器", "start a planning run", "把想法变成计划".
18
+
19
+ ## `lumo plan status`
20
+
21
+ Print the active run's current stage — either the working segment or the open `*_READY` gate — plus the deep-link to act on its next gate. With no active run, prompts to run `lumo plan`.
22
+
23
+ **When to suggest**: the user asks where an in-flight run stands ("plan 到哪一步了", "plan status"). The gate work itself is web-only.
24
+
25
+ ```bash
26
+ lumo plan status
27
+ ```
@@ -91,7 +91,7 @@ What it does:
91
91
  - Reads `CLAUDE_CODE_SESSION_ID` from the environment (Claude Code sets it automatically); errors out if unset — must run from inside a Claude Code session.
92
92
  - Calls `POST /api/sessions/<session_id>/bind-task`, which sets the Session row's `taskId` and re-tags previously-untagged HookEvent rows in this session.
93
93
  - The binding lives entirely on the server (`Session.taskId`); subsequent hooks read it back via the session row. The CLI keeps no local sentinel.
94
- - Prints the task's **acceptance contract** (`## Acceptance criteria (contract)`) right after the bind confirmation — or, when a still-open task has none, the draft reminder to draft 3–7 criteria before the first line of code (see [criteria.md](criteria.md)). The same section is auto-injected at session start when already bound (highest priority in the injection budget, ahead of memory).
94
+ - Prints the task's **acceptance contract** (`## Acceptance criteria (contract)`) right after the bind confirmation — or, when a still-open task has none, the draft reminder to draft 3–7 criteria before the first line of code, followed by the `### Reference class (outside view)` block when history supports one (see [criteria.md](criteria.md)). The same section is auto-injected at session start when already bound (highest priority in the injection budget, ahead of memory).
95
95
 
96
96
  After attaching, always run `lumo task context <identifier>` to load the task background.
97
97
 
@@ -176,7 +176,9 @@ The old end-of-session command was **removed**. The three passes it ran interact
176
176
  - confidently-unused → `used=false`
177
177
  - genuinely-uncertain edges stay `null` (honest "not voted", not "unused")
178
178
 
179
- Already-voted sessions are skipped; a cron backstop drains any backlog. **Why:** upgrades the flywheel signal from "co-loaded" (constant) to "actually used" (discriminative); `task context` then prefers each fragment's usage-based merge rate, falling back to the presence rate when usage samples are thin.
179
+ Already-voted sessions are skipped; a cron backstop drains any backlog. **Why:** upgrades the flywheel signal from "co-loaded" (constant) to "actually used" (discriminative). `task context` then reports each fragment's **judged-used track record** — of the N tasks it appeared in, X were judged to have actually used it. That is a **lower bound** (never-audited appearances are excluded from the proven/retire calls), and it **replaced the retired merge-rate signal** (RFC LUM-535).
180
+
181
+ > Don't confuse this with the used-vs-base **merge rate** still reported by `lumo task lineage --signal` ([task-context.md](task-context.md)) — that is a different, live metric for workspace signal-health, not the retired fragment-usefulness one.
180
182
 
181
183
  **3. Blocked-tag automation (server-side).** When a session crosses the same-tool failure threshold (**≥ 3** same-type failures, aggregated from `POST_TOOL_USE_FAILURE` grouped by tool name + `STOP_FAILURE` turn-level failures), the server **auto-applies the shared `blocked` tag** to the bound task. This inverts the old manual gate — no prompt, no human in the loop — and is safe via three safeguards:
182
184
 
@@ -13,7 +13,7 @@ lumo task context LUM-42
13
13
  The command prints a markdown document to stdout with these sections, in order:
14
14
 
15
15
  1. **Task header** — identifier, title, status, description.
16
- 2. **`## Acceptance criteria (contract)`** — shown right after the header. Each line `[MACHINE|HUMAN] statement`, with a `↳ check:` line for MACHINE checkpointers; HUMAN_EDIT / REVIEW_ADDED provenance tagged inline. A still-open task with none shows a draft reminder instead — draft 3–7 criteria **before writing code** (see [criteria.md](criteria.md)).
16
+ 2. **`## Acceptance criteria (contract)`** — shown right after the header. Each line `[MACHINE|HUMAN] statement`, with a `↳ check:` line for MACHINE checkpointers; HUMAN_EDIT / REVIEW_ADDED provenance tagged inline. A still-open task with none shows a draft reminder instead — draft 3–7 criteria **before writing code** — followed by a `### Reference class (outside view)` block giving the failure modes of similar delivered tasks, to draft against rather than to copy (see [criteria.md](criteria.md)).
17
17
  3. **Memory section** — cross-session learnings; trusted background context that persists, so you avoid re-learning decisions/constraints.
18
18
  4. **Inline source cards** — Slack / web / Figma / artifacts / documents / comments / Pull Requests (see "Context Retrieval" below).
19
19
  5. **`## PR review todos`** — mirrored PR review comments as a checkbox todo list. Each line-level comment shows `` `file:line` `` + reviewer's ask + GitHub comment link; each `changes_requested` review summary shows "🛑 Changes requested (whole PR)". Present only when the task's PR(s) have review comments. Each unchecked box is a TODO: resolve it, then reply on the PR (a Lumo comment mirrors back to GitHub).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumoai/cli",
3
- "version": "1.57.0",
3
+ "version": "1.58.0",
4
4
  "description": "Lumo CLI — manage tasks and sessions from the terminal",
5
5
  "license": "MIT",
6
6
  "author": "cli@uselumo.ai",