@caddis/cli 0.4.65 → 0.4.66

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.
@@ -0,0 +1,2 @@
1
+ <!-- Lucide icons v1.48.0 (lucide-icons/lucide, npm lucide-static), ISC licence; see LICENSE-Lucide.txt. Generated by scripts/build_roadmap_icons.py; do not edit. -->
2
+ <svg xmlns="http://www.w3.org/2000/svg" class="sprite" aria-hidden="true" focusable="false"><symbol id="ic-route" viewBox="0 0 24 24"><circle cx="6" cy="19" r="3"/><path d="M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15"/><circle cx="18" cy="5" r="3"/></symbol><symbol id="ic-search" viewBox="0 0 24 24"><path d="m21 21-4.34-4.34"/><circle cx="11" cy="11" r="8"/></symbol><symbol id="ic-sun" viewBox="0 0 24 24"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></symbol><symbol id="ic-moon" viewBox="0 0 24 24"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></symbol><symbol id="ic-menu" viewBox="0 0 24 24"><path d="M4 5h16"/><path d="M4 12h16"/><path d="M4 19h16"/></symbol><symbol id="ic-x" viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></symbol><symbol id="ic-clock" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></symbol><symbol id="ic-inbox" viewBox="0 0 24 24"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12"/><path d="M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"/></symbol><symbol id="ic-shield-alert" viewBox="0 0 24 24"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"/><path d="M12 8v4"/><path d="M12 16h.01"/></symbol><symbol id="ic-messages-square" viewBox="0 0 24 24"><path d="M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"/><path d="M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1"/></symbol><symbol id="ic-activity" viewBox="0 0 24 24"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></symbol><symbol id="ic-folder-git-2" viewBox="0 0 24 24"><path d="M18 19a5 5 0 0 1-5-5v8"/><path d="M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5"/><circle cx="13" cy="12" r="2"/><circle cx="20" cy="19" r="2"/></symbol><symbol id="ic-map" viewBox="0 0 24 24"><path d="M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z"/><path d="M15 5.764v15"/><path d="M9 3.236v15"/></symbol><symbol id="ic-git-branch" viewBox="0 0 24 24"><path d="M15 6a9 9 0 0 0-9 9V3"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/></symbol><symbol id="ic-git-commit-horizontal" viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><line x1="3" x2="9" y1="12" y2="12"/><line x1="15" x2="21" y1="12" y2="12"/></symbol><symbol id="ic-circle-check" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="m16 9-5.5 5.5L8 12"/></symbol><symbol id="ic-circle" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/></symbol><symbol id="ic-circle-dot" viewBox="0 0 24 24"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="12" r="10"/></symbol><symbol id="ic-octagon-alert" viewBox="0 0 24 24"><path d="M12 16h.01"/><path d="M12 8v4"/><path d="M15.312 2a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586l-4.688-4.688A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2z"/></symbol><symbol id="ic-user-check" viewBox="0 0 24 24"><path d="m16 11 2 2 4-4"/><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/></symbol><symbol id="ic-play" viewBox="0 0 24 24"><path d="M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"/></symbol><symbol id="ic-arrow-right-left" viewBox="0 0 24 24"><path d="m16 3 4 4-4 4"/><path d="M20 7H4"/><path d="m8 21-4-4 4-4"/><path d="M4 17h16"/></symbol><symbol id="ic-circle-minus" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M8 12h8"/></symbol><symbol id="ic-hourglass" viewBox="0 0 24 24"><path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/></symbol><symbol id="ic-bell-ring" viewBox="0 0 24 24"><path d="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M22 8c0-2.3-.8-4.3-2-6"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/><path d="M4 2C2.8 3.7 2 5.7 2 8"/></symbol><symbol id="ic-gauge" viewBox="0 0 24 24"><path d="m12 14 4-4"/><path d="M3.34 19a10 10 0 1 1 17.32 0"/></symbol><symbol id="ic-workflow" viewBox="0 0 24 24"><rect width="8" height="8" x="3" y="3" rx="2"/><path d="M7 11v4a2 2 0 0 0 2 2h4"/><rect width="8" height="8" x="13" y="13" rx="2"/></symbol><symbol id="ic-square-kanban" viewBox="0 0 24 24"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M8 7v7"/><path d="M12 7v4"/><path d="M16 7v9"/></symbol><symbol id="ic-chart-gantt" viewBox="0 0 24 24"><path d="M10 6h8"/><path d="M12 16h6"/><path d="M3 3v16a2 2 0 0 0 2 2h16"/><path d="M8 11h7"/></symbol><symbol id="ic-milestone" viewBox="0 0 24 24"><path d="M12 13v8"/><path d="M12 3v3"/><path d="M18.172 6a2 2 0 0 1 1.414.586l2.06 2.06a1.207 1.207 0 0 1 0 1.708l-2.06 2.06a2 2 0 0 1-1.414.586H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1z"/></symbol><symbol id="ic-cpu" viewBox="0 0 24 24"><path d="M12 20v2"/><path d="M12 2v2"/><path d="M17 20v2"/><path d="M17 2v2"/><path d="M2 12h2"/><path d="M2 17h2"/><path d="M2 7h2"/><path d="M20 12h2"/><path d="M20 17h2"/><path d="M20 7h2"/><path d="M7 20v2"/><path d="M7 2v2"/><rect x="4" y="4" width="16" height="16" rx="2"/><rect x="8" y="8" width="8" height="8" rx="1"/></symbol><symbol id="ic-circle-check-big" viewBox="0 0 24 24"><path d="M21.801 10A10 10 0 1 1 17 3.335"/><path d="m9 11 3 3L22 4"/></symbol><symbol id="ic-loader-circle" viewBox="0 0 24 24"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></symbol><symbol id="ic-triangle-alert" viewBox="0 0 24 24"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/></symbol><symbol id="ic-skip-forward" viewBox="0 0 24 24"><path d="M21 4v16"/><path d="M6.029 4.285A2 2 0 0 0 3 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z"/></symbol></svg>
@@ -70,6 +70,10 @@ on is worse than one sentence admitting there is nothing to recap.
70
70
 
71
71
  ## Workstreams and open work
72
72
 
73
+ Open items live in three stores (the 3-store model): this session's tasks (saved at handoff to
74
+ `.caddis/relay/<name>.tasks.md`), the open parking-lot items (`/caddis:park`), and the roadmap and the plan
75
+ Tracker for the order of work. Catchup reads those three and nothing else.
76
+
73
77
  **No argument:** this is the last step of the catchup procedure above, not a separate one.
74
78
  After the list, add the workstream index and the open work:
75
79
  0. The roadmap on origin is the order of work. List the roadmaps, then show each one's status line:
@@ -82,10 +86,8 @@ After the list, add the workstream index and the open work:
82
86
  1. Refresh and show the index: `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_workstreams.py" render-index`,
83
87
  then display `.caddis/relay.md`. If it refuses a legacy `.caddis/relay.md`, display that file
84
88
  as it is and suggest `/handoff`, which migrates it.
85
- 2. Show open work for the current workstream:
86
- ```
87
- python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_todo.py" open-work
88
- ```
89
+ 2. Show the open parking-lot items, the durable backlog: follow `/caddis:park list` (List mode). Print its table
90
+ and its counts; if the repo has no `.caddis/parking-lot/`, say `No parking-lot items.` and go on.
89
91
  Before saying `Nothing is parked.`, check for an old `/digress` stack: if `.caddis/workstreams.json`
90
92
  exists, run `caddis_workstreams.py migrate-legacy` (it keeps a backup and reports conflicts
91
93
  instead of overwriting), then show the index again. Only with no relays and no old stack, state:
@@ -97,7 +99,11 @@ instead of overwriting), then show the index again. Only with no relays and no o
97
99
  `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_relay_git.py" fetch <name>`. It reads only
98
100
  `refs/caddis/relay/<name>`, never checks out or merges, and refuses to replace a different local
99
101
  relay. Pass `--replace` only if the user confirms the local one may be overwritten.
100
- 3. Restate where you were and resume the workstream.
102
+ 3. Load the saved tasks, the same way `/caddis:fleet-open` does: if `.caddis/relay/<name>.tasks.md` exists (table
103
+ `| Old # | Status | Subject |`), make one `TaskCreate` per row with the Subject as its subject, then a
104
+ `TaskUpdate` to `in_progress` for each row with Status `in_progress`. No file means 0 tasks. If this session
105
+ already holds tasks (`TaskList`), do not create a row whose subject is already there. Count them.
106
+ 4. Restate where you were and resume the workstream; name the number of tasks you loaded.
101
107
 
102
108
  ## Rules
103
109
  - **Never** run a destructive or history-rewriting git action (no `git checkout`, `git reset`, `git stash`,
@@ -375,7 +375,7 @@ A `risk: high` phase gets two independent review runs: run by the roadmap/plan r
375
375
 
376
376
  Small work that does not meet a trigger skips its block.
377
377
 
378
- **Trigger: Always.** Add one open-work row for the plan in `.caddis/open-work.md`. Set its cells with `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_rows.py" set --file <open-work.md> --id <row id> --col Status=todo`, never with a regex edit.
378
+ **Trigger: Always.** The plan's own Tracker is its row of record: give every phase one Tracker row, and when the repo has a roadmap (`caddis_roadmap.py list` prints a slug), name the plan in a roadmap milestone through `/caddis:roadmap` (a docs PR). Work the plan defers on purpose goes to a parking-lot item with `/caddis:park`, and its Tracker row names the file. Open items live in three stores (the 3-store model): the session task list, parking-lot items, and the roadmap and Tracker. The older to-do and repo-backlog stores are retired: do not create them.
379
379
 
380
380
  **Trigger: The plan records a decision.** Record it with `/caddis:decide`.
381
381
 
@@ -33,11 +33,10 @@ them into its commit, so check first, before Step 1.
33
33
  `WORKTREE: <path>`. That worktree is this session's only; no other session's edits can enter it.
34
34
  Then, in the steps below:
35
35
  - Step 1: tell the `knowledge-transfer` subagent to edit files ONLY under the `WORKTREE:` path.
36
- - Step 3, point 4: run `caddis_rows.py set --file <worktree>/.caddis/open-work.md ...`, and make the
37
- plan's Tracker edit in `<worktree>/.caddis/plans/<feature>.md`, not in this checkout.
36
+ - Step 3, point 4: make the plan's Tracker edit in `<worktree>/.caddis/plans/<feature>.md`, and write
37
+ any new parking-lot item under `<worktree>/.caddis/parking-lot/`, not in this checkout.
38
38
  - Step 4: skip `caddis_tidy.py --apply` (report `skipped: shared checkout`).
39
- - Step 6: skip `caddis_todo.py reconcile` (report `skipped: shared checkout`; it writes tracked
40
- `.caddis/todo-list/` files and has no worktree option).
39
+ - Step 6: retired; nothing to skip (row 8 reports `skipped: retired (see the 3-store model)`).
41
40
  - Step 6b: skip `session_state.py prune` (report `skipped: shared checkout`).
42
41
  - Step 6c: run `--reindex` in the worktree (it edits the tracked `DOC-MAP.md`).
43
42
  - The relay stays in this checkout: `.caddis/relay/` is local and gitignored.
@@ -53,24 +52,27 @@ them into its commit, so check first, before Step 1.
53
52
  ## Checklist
54
53
  The handoff is a fixed checklist. Every row ends as `done`, `skipped: <reason>` or `failed: <error>`, and
55
54
  Step 8 prints all 13 in this order. Never drop a row from the report, even when its step did not apply.
55
+ Rows 3 and 8 are retired (the 3-store model, 21 Oct 2026): they stay in the list so the row numbers and the
56
+ 13-row report do not move for a fleet that mixes caddis versions, and each always reports
57
+ `skipped: retired (see the 3-store model)`. A later release removes them with their scripts.
56
58
 
57
59
  | # | Row | What it is | Shared checkout (Step 0) |
58
60
  |---|---|---|---|
59
61
  | 1 | `knowledge-transfer` | Step 1 | edits only in the Step 0 worktree |
60
62
  | 2 | `plan-tracker` | the plan's Tracker row (Rules) | edit in the Step 0 worktree |
61
- | 3 | `open-work-row` | Step 3, point 4: `caddis_rows.py set` | `--file <worktree>/...` |
63
+ | 3 | `open-work-row` | retired: always `skipped: retired (see the 3-store model)` | never runs |
62
64
  | 4 | `relay` | Step 3: the relay, written from scratch with current state only | the relay is local; runs |
63
65
  | 5 | `tasks-file` | Step 3c | runs |
64
66
  | 6 | `kb-index` | Step 6c: refresh the KB index | in the Step 0 worktree |
65
67
  | 7 | `violations-report` | Step 6c: report standing violations, each with a one-line fix command | runs (report only) |
66
- | 8 | `todo-reconcile` | Step 6: `caddis_todo.py reconcile` | `skipped: shared checkout` |
68
+ | 8 | `todo-reconcile` | retired: always `skipped: retired (see the 3-store model)` | never runs |
67
69
  | 9 | `usage-record` | Step 6b: `session_state.py usage` | runs |
68
70
  | 10 | `tidy-apply` | Step 4: `caddis_tidy.py --apply` | `skipped: shared checkout` |
69
71
  | 11 | `state-prune` | Step 6b: `session_state.py prune` | `skipped: shared checkout` |
70
72
  | 12 | `prune-list` | Step 6b: `caddis_tidy.py --prune`, list only | runs (lists, never applies) |
71
73
  | 13 | `handover-check` | Step 5 | runs |
72
74
 
73
- `tidy-apply`, `state-prune` and `todo-reconcile` run only on `SHARED: no`. Handoff never runs
75
+ `tidy-apply` and `state-prune` run only on `SHARED: no`. Handoff never runs
74
76
  `caddis_tidy.py --prune --apply` on its own, in any checkout; only the user can ask for it (Step 6b). In a
75
77
  shared checkout the report also lists every tracked file Step 1 changed, under `Docs PR needed:`.
76
78
 
@@ -157,15 +159,19 @@ history, and the relay has a 4,000-character budget (`caddis_budget.py`).
157
159
  > to the user and stop.
158
160
  > 3. **Read the stored version's hash** before you compose: `caddis_workstreams.py hash <name>`
159
161
  > (prints `none` for a new workstream).
160
- > 4. **Open-work rows** (only when `.caddis/open-work.md` exists and its frontmatter says
161
- > `type: open-work`): first set each row this session
162
- > finished, by id and column name, never by hand:
163
- > `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_rows.py" set --file .caddis/open-work.md --id <row id> --col Status=done --col Evidence=<evidence>`.
164
- > In a shared checkout (Step 0), use `--file <worktree>/.caddis/open-work.md` instead.
165
- > When the file is missing or has no `type: open-work` frontmatter, report row 3 exactly as
166
- > `skipped: no open-work.md with type: open-work (session tasks are saved by row 5)`, or, for a
167
- > file without the frontmatter, `skipped: open-work.md has no type: open-work frontmatter (session
168
- > tasks are saved by row 5)`. open-work.md is a repo backlog; this session's own tasks go to row 5.
162
+ > 4. **Place every open item in its store (the 3-store model).** An open item lives in the store that
163
+ > matches how long it lives:
164
+ > - **This session's own tasks:** the native task list. Step 3c saves it to
165
+ > `.caddis/relay/<name>.tasks.md`, a snapshot that the next handoff replaces. It is never a backlog.
166
+ > - **An item that must outlive the next handoff** (an owner decision, deferred work, a watch item):
167
+ > file it with `/caddis:park`, once, and name its slug in the relay's `## Open questions / blockers`.
168
+ > Park only work we will do later (`park.md` Step 1). A parking-lot file is tracked, so in a shared
169
+ > checkout (Step 0) write it in the Step 0 worktree.
170
+ > - **The order of work:** the plan Tracker and the roadmap (below). Set the Tracker row of each phase this
171
+ > session finished (Rules).
172
+ > Row 3 (`open-work-row`) is retired: report it exactly as `skipped: retired (see the 3-store model)`.
173
+ > The `.caddis/open-work.md` and `.caddis/todo-list/` stores are retired. Never write them. A repo that
174
+ > still holds an old file keeps it as its own document; caddis no longer reads or writes it.
169
175
  > **Order of work:** when the repo has a roadmap (`caddis_roadmap.py list` prints a slug), the
170
176
  > roadmap on origin is the order of work. Write the relay's "Next step (exact)" as
171
177
  > `next: top open item of roadmap <slug> (caddis_roadmap.py status --roadmap <slug>)`. Never copy a
@@ -213,7 +219,8 @@ Paths are relative to the repo root.
213
219
  <Commands run this session and their result: pass / fail / not-run. Be honest.>
214
220
 
215
221
  ## Open questions / blockers
216
- <Decisions needed, ambiguities, anything unverified. "None" if truly none.>
222
+ <Decisions needed, ambiguities, anything unverified. "None" if truly none. An item that must outlive the
223
+ next handoff is filed with `/caddis:park`: name its slug here, never copy its text.>
217
224
 
218
225
  ## Learnings captured
219
226
  knowledge-transfer: <✓ ran → files written | ✗ skipped → reason>
@@ -232,7 +239,7 @@ STATUS: <CONTINUE | OWNER-GATE <P>-OG<n> | BLOCKED <owner> | FAILED <reason>>
232
239
 
233
240
  Small work that does not meet a trigger skips its block.
234
241
 
235
- **Trigger: Always.** The relay ends with a status line, the last non-empty line, and it is exactly one of `STATUS: CONTINUE`, `STATUS: OWNER-GATE <P>-OG<n>`, `STATUS: BLOCKED <owner>` or `STATUS: FAILED <reason>`. In Step 3, point 5, write the relay with `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_workstreams.py" put <name> <temp-file> --require-status --expected-hash <hash>` instead of `write` (in short: put --require-status), with the same hash Step 3 read, so a peer's newer relay is never overwritten. It rejects a relay with no valid status line, and renders the index. When the repo has `.caddis/open-work.md` with `type: open-work` in its frontmatter, also set each open-work row's status with `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_rows.py" set --file <open-work.md> --id <row id> --col Status=<status>` (in a shared checkout, the copy in the Step 0 worktree). When the status is `done`, also pass `--col Evidence=<commit, PR or test>`: caddis_rows.py refuses `done` with no Evidence.
242
+ **Trigger: Always.** The relay ends with a status line, the last non-empty line, and it is exactly one of `STATUS: CONTINUE`, `STATUS: OWNER-GATE <P>-OG<n>`, `STATUS: BLOCKED <owner>` or `STATUS: FAILED <reason>`. In Step 3, point 5, write the relay with `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_workstreams.py" put <name> <temp-file> --require-status --expected-hash <hash>` instead of `write` (in short: put --require-status), with the same hash Step 3 read, so a peer's newer relay is never overwritten. It rejects a relay with no valid status line, and renders the index.
236
243
 
237
244
  ## Step 3c - Save the open tasks
238
245
  The task list dies with the session unless it is saved. Write this session's open tasks beside
@@ -262,7 +269,7 @@ be blocked by a script it does not have. Include its report in your output. A **
262
269
  (`done/<name>` already exists) is reported by the script, not fatal — surface it, do not fail the
263
270
  handoff over it. Exit 2 means a plan is held because its Tracker still has open rows (`held (open Tracker rows): ...` lines, from Phase 3): show those lines; finish, park (`.caddis/parking-lot/<file>.md` in the row) or mark the rows `dropped: <reason>`, or set the plan status back. Do not fail the handoff over it.
264
271
 
265
- After step 4, for each item this session closed (a phase `<plan>#<n>`, a plan slug, or an open-work row id), run `mentions` to check whether another relay's Next step still names it:
272
+ After step 4, for each item this session closed (a phase `<plan>#<n>`, a plan slug, or a parking-lot slug), run `mentions` to check whether another relay's Next step still names it:
266
273
  ```
267
274
  python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_workstreams.py" mentions --item "<item>" --except <name>
268
275
  ```
@@ -284,12 +291,10 @@ incoming session looking for a prompt that was never written. Fix what it lists,
284
291
  It also notes any generated artefact committed before its generator last changed. That is advisory,
285
292
  not blocking — but do not quote a report the note names without rebuilding it first.
286
293
 
287
- ## Step 6 — reconcile task rows from session-state
288
- Run task reconciliation against the newest session-state file:
289
- ```
290
- python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_todo.py" reconcile --session-state .caddis/session-state/<session-id>.md
291
- ```
292
- This marks ad-hoc to-do items done by metadata ID; it never edits the Tracker and ignores phase rows.
294
+ ## Step 6 — retired (task reconcile)
295
+ This step is retired. It used to reconcile the `todo-list/` store, which is retired too (the 3-store model),
296
+ so the step does nothing: do not run any script for it. Report row 8 (`todo-reconcile`) as
297
+ `skipped: retired (see the 3-store model)`. The script stays in place for older installs only.
293
298
 
294
299
  ## Step 6b — record usage and tidy session state
295
300
  The Stop hook only writes the session-state file. These two used to run on every turn; they run
@@ -360,12 +365,12 @@ Print this block, every row filled with `done`, `skipped: <reason>` or `failed:
360
365
  === HANDOFF CHECKLIST ===
361
366
  1 knowledge-transfer done | skipped: <reason> | failed: <error>
362
367
  2 plan-tracker <same three forms>
363
- 3 open-work-row <same three forms>
368
+ 3 open-work-row skipped: retired (see the 3-store model)
364
369
  4 relay <same three forms>
365
370
  5 tasks-file <same three forms>
366
371
  6 kb-index <same three forms>
367
372
  7 violations-report <same three forms>
368
- 8 todo-reconcile <same three forms>
373
+ 8 todo-reconcile skipped: retired (see the 3-store model)
369
374
  9 usage-record <same three forms>
370
375
  10 tidy-apply <same three forms>
371
376
  11 state-prune <same three forms>
@@ -15,7 +15,7 @@ Use the scripts in that folder; do not look for them in another caddis install.
15
15
 
16
16
  1. The plan `.caddis/plans/{{slug}}.md`: its goal, its decisions, its tracker. Every decision binds you.
17
17
  2. The relay `.caddis/relay/{{slug}}.md`. Its "Next step" says where to start.
18
- 3. The open-work list `.caddis/open-work.md`, when it exists.
18
+ 3. The open parking-lot items (`.caddis/parking-lot/*.md` with `status: open`) that name this plan, when any.
19
19
 
20
20
  ## 2. Step 0: reconcile
21
21
 
@@ -47,8 +47,8 @@ publish a branch that does). Commit the phase there, with its tracker row set to
47
47
  - The runner reviews `risk: high` phases. A phase marked `**Risk:** high`: do not halt for it and do not run the
48
48
  review yourself. When its exit gate is green, set its row `done` and end with `STATUS: CONTINUE`. The runner then
49
49
  reviews it twice and, on findings, starts one fix session.
50
- - Set the tracker row of the batch to `done` (with its evidence) when its exit gate is green. Set open-work rows with
51
- `python <scripts>/caddis_rows.py set` (by row id and column name).
50
+ - Set the tracker row of the batch to `done` (with its evidence) when its exit gate is green. Work you defer on
51
+ purpose is filed once with `/caddis:park` (a parking-lot item); never write a to-do or backlog file.
52
52
 
53
53
  ## 5. Write the relay
54
54
 
@@ -15,7 +15,7 @@ Use the scripts in that folder; do not look for them in another caddis install.
15
15
 
16
16
  1. The plan `.caddis/plans/{{slug}}.md`: its goal, its decisions, its tracker. Every decision binds you.
17
17
  2. The relay `.caddis/relay/{{slug}}.md`. Its "Next step" says where to start.
18
- 3. The open-work list `.caddis/open-work.md`, when it exists.
18
+ 3. The open parking-lot items (`.caddis/parking-lot/*.md` with `status: open`) that name this plan, when any.
19
19
 
20
20
  ## 2. Step 0: reconcile
21
21
 
@@ -47,8 +47,8 @@ publish a branch that does). Commit the phase there, with its tracker row set to
47
47
  - The runner reviews `risk: high` phases. A phase marked `**Risk:** high`: do not halt for it and do not run the
48
48
  review yourself. When its exit gate is green, set its row `done` and end with `STATUS: CONTINUE`. The runner then
49
49
  reviews it twice and, on findings, starts one fix session.
50
- - Set the tracker row of the batch to `done` (with its evidence) when its exit gate is green. Set open-work rows with
51
- `python <scripts>/caddis_rows.py set` (by row id and column name).
50
+ - Set the tracker row of the batch to `done` (with its evidence) when its exit gate is green. Work you defer on
51
+ purpose is filed once with `/caddis:park` (a parking-lot item); never write a to-do or backlog file.
52
52
 
53
53
  ## 5. Write the relay
54
54
 
@@ -1,7 +1,7 @@
1
1
  {
2
- "poolVersion": "1.3.151",
2
+ "poolVersion": "1.3.152",
3
3
  "bundles": {
4
- "antigravity-plugin": "1.3.151",
4
+ "antigravity-plugin": "1.3.152",
5
5
  "antigravity-plugin-extras": "1.3.46",
6
6
  "codex": "unknown"
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caddis/cli",
3
- "version": "0.4.65",
3
+ "version": "0.4.66",
4
4
  "description": "Install, update and diagnose the caddis dev harness across every coding agent you use (Claude Code, agy/Antigravity, and more).",
5
5
  "keywords": [
6
6
  "caddis",