@caddis/cli 0.4.64 → 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.
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_fleet.py +104 -3
- package/bundles/antigravity-plugin/scripts/caddis_roadmap_page.py +205 -70
- package/bundles/antigravity-plugin/scripts/oss_review.py +77 -45
- package/bundles/antigravity-plugin/scripts/roadmap_assets/LICENSE-Lucide.txt +43 -0
- package/bundles/antigravity-plugin/scripts/roadmap_assets/{OFL-JetBrainsMono.txt → OFL-Atkinson.txt} +2 -2
- package/bundles/antigravity-plugin/scripts/roadmap_assets/fonts.css +3 -3
- package/bundles/antigravity-plugin/scripts/roadmap_assets/icons.svg +2 -0
- package/bundles/antigravity-plugin/skills/_registry.md +1 -1
- package/bundles/antigravity-plugin/skills/catchup/SKILL.md +11 -5
- package/bundles/antigravity-plugin/skills/cross-review/SKILL.md +10 -7
- package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/fleet-close/SKILL.md +5 -2
- package/bundles/antigravity-plugin/skills/handoff/SKILL.md +59 -24
- package/bundles/antigravity-plugin/skills/roadmap/assets/plan-resume-prompt.md +3 -3
- package/bundles/antigravity-plugin/skills/use-model/SKILL.md +3 -1
- package/bundles/antigravity-plugin-extras/plugin.json +1 -1
- package/bundles/antigravity-plugin-extras/skills/_registry.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/agent-orchestration/SKILL.md +2 -2
- package/bundles/antigravity-plugin-extras/skills/cross-review/SKILL.md +9 -8
- package/bundles/codex/.codex/skills/workflow/roadmap/assets/plan-resume-prompt.md +3 -3
- package/bundles/manifest.json +3 -3
- package/package.json +1 -1
|
@@ -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
|
|
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.
|
|
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`,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cross-review
|
|
3
|
-
description: Cross-vendor code review of the current diff — a second-vendor model (DeepSeek
|
|
3
|
+
description: Cross-vendor code review of the current diff — a second-vendor model (agy Argon by default; DeepSeek, GLM or any OpenAI-compatible endpoint) reviews your changes to catch bugs a same-vendor reviewer misses
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /caddis:cross-review — a second-vendor set of eyes on your diff
|
|
7
7
|
|
|
8
8
|
Run a cross-vendor review of the current changes with a DIFFERENT model family than the one that wrote them
|
|
9
|
-
(default **
|
|
9
|
+
(default **agy Argon** since 2026-10-21 — it needs no key; DeepSeek and GLM are fallbacks). Use after a phase
|
|
10
10
|
is green and before you commit, or for a second opinion on a risky diff. This is the *cross-vendor*
|
|
11
11
|
complement to `/caddis:code-review`, not a replacement.
|
|
12
12
|
|
|
@@ -16,7 +16,7 @@ complement to `/caddis:code-review`, not a replacement.
|
|
|
16
16
|
python "$TOOL" --check-config # resolve $TOOL first, see "Run it" below
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
Exit 0 means ready; it prints which providers
|
|
19
|
+
Exit 0 means ready; it prints which providers are available (agy-argon needs no key, only agy on PATH and caddis_spend.py). **Exit 3 means nothing is configured —
|
|
20
20
|
STOP and ask the user now.** Do not proceed to the review, and do not silently skip it.
|
|
21
21
|
|
|
22
22
|
Ask with `AskUserQuestion`: which provider to set up (DeepSeek, GLM, or another OpenAI-compatible
|
|
@@ -65,7 +65,7 @@ fi
|
|
|
65
65
|
> copied weeks earlier silently won. `caddis_gate.py vendor-drift` now fails on the same condition.
|
|
66
66
|
```
|
|
67
67
|
python "$TOOL" $ARGUMENTS # pass the user's flags THROUGH, raw
|
|
68
|
-
python "$TOOL" # no arguments:
|
|
68
|
+
python "$TOOL" # no arguments: agy Argon eyes on the working tree
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
**`$ARGUMENTS` goes through raw, and must not be re-prefixed.** Callers are told to type the flag
|
|
@@ -74,7 +74,7 @@ writes. This line used to prefix the flag itself, which turned that into a doubl
|
|
|
74
74
|
`--range --range main..HEAD` and made every plan-emitted call fail. Whatever the user typed is already a complete flag list:
|
|
75
75
|
|
|
76
76
|
```
|
|
77
|
-
/caddis:cross-review -> the working tree,
|
|
77
|
+
/caddis:cross-review -> the working tree, agy Argon
|
|
78
78
|
/caddis:cross-review --range main..HEAD -> that range
|
|
79
79
|
/caddis:cross-review --provider glm -> GLM eyes
|
|
80
80
|
```
|
|
@@ -86,8 +86,8 @@ now means the narrower case — a **single file** too big to split, or more batc
|
|
|
86
86
|
see it, the fix is usually to review that one file separately, not to narrow `--range`; don't raise
|
|
87
87
|
`--max-diff-chars` blind.
|
|
88
88
|
|
|
89
|
-
**Do not alternate providers on a schedule.** The order is the owner policy: **
|
|
90
|
-
then GLM** (`REVIEW_ORDER` in `oss_review.py`). A named `--provider` goes first; on a provider failure
|
|
89
|
+
**Do not alternate providers on a schedule.** The order is the owner policy (21 Oct 2026): **agy Argon,
|
|
90
|
+
then DeepSeek, then GLM** (`REVIEW_ORDER` in `oss_review.py`). A named `--provider` goes first; on a provider failure
|
|
91
91
|
(HTTP 429, any 5xx, a timeout, a connection error, an empty reply) the tool moves to the next one in
|
|
92
92
|
that order and prints which provider gave the verdict. A provider with no key is skipped. agy runs
|
|
93
93
|
through `caddis_spend.py run` (the spend cap); if the cap refuses, agy is skipped. On a 429 the tool
|
|
@@ -95,6 +95,9 @@ waits for `Retry-After` once (at most 60 s); it never splits the diff because of
|
|
|
95
95
|
reply. A custom endpoint (`--base-url`/`--model`) never falls back. Name a provider only when you have
|
|
96
96
|
a reason.
|
|
97
97
|
|
|
98
|
+
**Change the default.** The first provider comes from `--provider`, then the process env `REVIEW_PROVIDER`, then
|
|
99
|
+
`REVIEW_PROVIDER` in `~/.caddis/keys.env`, then agy Argon. The others follow in `REVIEW_ORDER`. To make DeepSeek the default again, add `REVIEW_PROVIDER=deepseek` to ~/.caddis/keys.env.
|
|
100
|
+
|
|
98
101
|
## Interpret the exit code
|
|
99
102
|
- **0 — REVIEW: CLEAN** → no blocking issues. Proceed.
|
|
100
103
|
- **1 — REVIEW: BLOCKING** → read the printed findings, then **FIX each blocking item** (or explicitly
|
|
@@ -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.**
|
|
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
|
|
|
@@ -72,7 +72,10 @@ FLEET CLOSE from <coordinator>: write your handoff and ack.
|
|
|
72
72
|
Then these close rules, in the message:
|
|
73
73
|
1. Run `/caddis:handoff` for **your own** relay only. Never touch another session's files. Skip its
|
|
74
74
|
Step 7 (the `Push this note for another machine?` question): the restart sheet carries your prompt,
|
|
75
|
-
and a question nobody answers would stop you before you ack.
|
|
75
|
+
and a question nobody answers would stop you before you ack. Run the handoff's Step 9 as
|
|
76
|
+
`resume-block ... --fleet`: it prints your Session, Workstream and prompt, and
|
|
77
|
+
`Start line: from the restart sheet`. The restart sheet holds the only start line. The ack stays a
|
|
78
|
+
separate reply (rule 5).
|
|
76
79
|
2. In a shared checkout (its `AGENTS.md` says `Shared checkout: yes`, or `git status` shows changes you
|
|
77
80
|
did not make), skip the steps the handoff checklist skips there.
|
|
78
81
|
3. If you run watchers: copy each watcher script to `.caddis/relay/<your name>-files/watchers/`, and fill
|
|
@@ -132,7 +135,7 @@ remove that session from the `--no-ack` list before the next `write`.
|
|
|
132
135
|
|
|
133
136
|
## Step 6 — your own handoff and ack
|
|
134
137
|
|
|
135
|
-
Run `/caddis:handoff` for this session (the coordinator's own relay)
|
|
138
|
+
Run `/caddis:handoff` for this session (the coordinator's own relay), with Step 9 as `resume-block ... --fleet`. Then write your own ack (the
|
|
136
139
|
`FLEET-ACK` block with your fields and your resume prompt) to a temp file and save it with
|
|
137
140
|
`ack add`, as in Step 4. The coordinator's ack is never skipped. Then record this session's presence
|
|
138
141
|
(your session id is printed at session start as `[caddis] this session's id: <id>`; never guess one):
|
|
@@ -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:
|
|
37
|
-
|
|
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:
|
|
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` |
|
|
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` |
|
|
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
|
|
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,11 +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. **
|
|
161
|
-
>
|
|
162
|
-
>
|
|
163
|
-
>
|
|
164
|
-
>
|
|
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.
|
|
165
175
|
> **Order of work:** when the repo has a roadmap (`caddis_roadmap.py list` prints a slug), the
|
|
166
176
|
> roadmap on origin is the order of work. Write the relay's "Next step (exact)" as
|
|
167
177
|
> `next: top open item of roadmap <slug> (caddis_roadmap.py status --roadmap <slug>)`. Never copy a
|
|
@@ -209,7 +219,8 @@ Paths are relative to the repo root.
|
|
|
209
219
|
<Commands run this session and their result: pass / fail / not-run. Be honest.>
|
|
210
220
|
|
|
211
221
|
## Open questions / blockers
|
|
212
|
-
<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.>
|
|
213
224
|
|
|
214
225
|
## Learnings captured
|
|
215
226
|
knowledge-transfer: <✓ ran → files written | ✗ skipped → reason>
|
|
@@ -228,7 +239,7 @@ STATUS: <CONTINUE | OWNER-GATE <P>-OG<n> | BLOCKED <owner> | FAILED <reason>>
|
|
|
228
239
|
|
|
229
240
|
Small work that does not meet a trigger skips its block.
|
|
230
241
|
|
|
231
|
-
**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.
|
|
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.
|
|
232
243
|
|
|
233
244
|
## Step 3c - Save the open tasks
|
|
234
245
|
The task list dies with the session unless it is saved. Write this session's open tasks beside
|
|
@@ -258,7 +269,7 @@ be blocked by a script it does not have. Include its report in your output. A **
|
|
|
258
269
|
(`done/<name>` already exists) is reported by the script, not fatal — surface it, do not fail the
|
|
259
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.
|
|
260
271
|
|
|
261
|
-
After step 4, for each item this session closed (a phase `<plan>#<n>`, a plan slug, or
|
|
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:
|
|
262
273
|
```
|
|
263
274
|
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_workstreams.py" mentions --item "<item>" --except <name>
|
|
264
275
|
```
|
|
@@ -280,12 +291,10 @@ incoming session looking for a prompt that was never written. Fix what it lists,
|
|
|
280
291
|
It also notes any generated artefact committed before its generator last changed. That is advisory,
|
|
281
292
|
not blocking — but do not quote a report the note names without rebuilding it first.
|
|
282
293
|
|
|
283
|
-
## Step 6 —
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
```
|
|
288
|
-
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.
|
|
289
298
|
|
|
290
299
|
## Step 6b — record usage and tidy session state
|
|
291
300
|
The Stop hook only writes the session-state file. These two used to run on every turn; they run
|
|
@@ -350,18 +359,18 @@ index or staged files — after the secret filter passes. Report its one-line re
|
|
|
350
359
|
On the other machine, `/catchup <name>` fetches it.
|
|
351
360
|
|
|
352
361
|
## Step 8 — the checklist report
|
|
353
|
-
|
|
362
|
+
Print this block, every row filled with `done`, `skipped: <reason>` or `failed: <error>`:
|
|
354
363
|
|
|
355
364
|
```
|
|
356
365
|
=== HANDOFF CHECKLIST ===
|
|
357
366
|
1 knowledge-transfer done | skipped: <reason> | failed: <error>
|
|
358
367
|
2 plan-tracker <same three forms>
|
|
359
|
-
3 open-work-row
|
|
368
|
+
3 open-work-row skipped: retired (see the 3-store model)
|
|
360
369
|
4 relay <same three forms>
|
|
361
370
|
5 tasks-file <same three forms>
|
|
362
371
|
6 kb-index <same three forms>
|
|
363
372
|
7 violations-report <same three forms>
|
|
364
|
-
8 todo-reconcile
|
|
373
|
+
8 todo-reconcile skipped: retired (see the 3-store model)
|
|
365
374
|
9 usage-record <same three forms>
|
|
366
375
|
10 tidy-apply <same three forms>
|
|
367
376
|
11 state-prune <same three forms>
|
|
@@ -372,6 +381,32 @@ Shared checkout: yes|no <reason>
|
|
|
372
381
|
|
|
373
382
|
Then, in a shared checkout, `Docs PR needed:` with the `PR:` line and the file list from Step 0.
|
|
374
383
|
|
|
384
|
+
Step 9 prints after this report. It is the last output of the handoff.
|
|
385
|
+
|
|
386
|
+
## Step 9 — print the resume prompt (always the last output)
|
|
387
|
+
The owner should never have to ask for the resume prompt. After the checklist report, run:
|
|
388
|
+
```
|
|
389
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_fleet.py" resume-block --name <name> --session-id <session-id> --root .
|
|
390
|
+
```
|
|
391
|
+
`<name>` is the workstream name from Step 3. It reads the relay's `## Resume prompt` block verbatim, and
|
|
392
|
+
the session name (`session-state/<session-id>.name` when `whoami` wrote it, else the first 8 characters of
|
|
393
|
+
the id). It prints, and you print its output as it is, with nothing after it:
|
|
394
|
+
```
|
|
395
|
+
=== RESUME ===
|
|
396
|
+
Session: <session name> (<session id>)
|
|
397
|
+
Workstream: <name>
|
|
398
|
+
<the resume prompt, in a fenced block>
|
|
399
|
+
Start line:
|
|
400
|
+
claude --name <role>-<MMDD>-<HH> '<the resume prompt on one line>'
|
|
401
|
+
```
|
|
402
|
+
- **Fleet close.** When this handoff runs because a peer sent `FLEET CLOSE from <coordinator>`, add
|
|
403
|
+
`--fleet`. The Start line is then `Start line: from the restart sheet`: the restart sheet is the only
|
|
404
|
+
start line in a fleet close. The `FLEET-ACK` reply is a separate message and does not change.
|
|
405
|
+
- **Exit 1** (no `## Resume prompt` block, or no relay) prints nothing on stdout. The handoff is not
|
|
406
|
+
complete: fix the relay (Step 3, point 5) and run the command again. Never write the block by hand.
|
|
407
|
+
- Workstream with no `whoami` record: the new name uses the workstream name as its role. Pass
|
|
408
|
+
`--role <role>` to set another.
|
|
409
|
+
|
|
375
410
|
## Rules
|
|
376
411
|
- **One next action, by priority ladder.** `## Next step` names exactly ONE action — not a menu. Pick it in
|
|
377
412
|
order: (1) interrupted mid-phase work → finish + commit it; else (2) the active plan's next not-started
|
|
@@ -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-
|
|
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.
|
|
51
|
-
|
|
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
|
|
|
@@ -17,7 +17,9 @@ command is the quick-reference + do-it-now version.
|
|
|
17
17
|
| **Primary** | `claude` | your Anthropic plan |
|
|
18
18
|
| **OSS lane** | `claude-oss <provider> [claude args…]` | the provider's plan/pay-per-token |
|
|
19
19
|
| **Convenience alias** | `claude-glm [claude args…]` | same as `claude-oss glm` |
|
|
20
|
-
| **Cross-vendor review** | `/caddis:cross-review` (`oss_review.py
|
|
20
|
+
| **Cross-vendor review** | `/caddis:cross-review` (`oss_review.py`; default reviewer agy Argon, then DeepSeek, then GLM) | the reviewer's plan |
|
|
21
|
+
|
|
22
|
+
To make DeepSeek the default again, add `REVIEW_PROVIDER=deepseek` to ~/.caddis/keys.env.
|
|
21
23
|
|
|
22
24
|
`claude-oss` / `claude-glm` are launchers at `claude-harness/scripts/claude-oss.{sh,ps1}`. Each
|
|
23
25
|
resolves the endpoint/model/key, sets `ANTHROPIC_BASE_URL` / `ANTHROPIC_MODEL` / `ANTHROPIC_AUTH_TOKEN`
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
| Caching Patterns | `caching-patterns/` | Caching strategies for Streamlit and FastAPI applications |
|
|
31
31
|
| Case Management | `case-management/` | >- |
|
|
32
32
|
| Code Explainer | `code-explainer/` | Explain code with diagrams, analogies and step-by-step walkthroughs. Use when teaching a codebase or answering "how does this work?" |
|
|
33
|
-
| Cross Review | `cross-review/` | Have a different vendor's model (DeepSeek, GLM, any OpenAI-compatible endpoint) review the current diff. Use after a phase is green and before commit/merge, or for a second opinion on a risky diff. |
|
|
33
|
+
| Cross Review | `cross-review/` | Have a different vendor's model (agy Argon by default; DeepSeek, GLM, any OpenAI-compatible endpoint) review the current diff. Use after a phase is green and before commit/merge, or for a second opinion on a risky diff. |
|
|
34
34
|
| Llm Application Dev | `llm-application-dev/` | LLM applications: prompt engineering, RAG and LLM integration. Use for AI-powered features, chatbots or LLM automation. |
|
|
35
35
|
| Mcp Builder | `mcp-builder/` | Build high-quality MCP (Model Context Protocol) servers that let LLMs use external APIs and services, in Python (FastMCP) or Node/TypeScript (MCP SDK). |
|
|
36
36
|
| Observability | `observability/` | Structured logging, correlation IDs, PII redaction, OpenTelemetry tracing, metrics (RED), SLO alerting, health probes and Sentry, in Python and TypeScript. Use when adding logs, traces, metrics or error tracking. |
|
|
@@ -458,7 +458,7 @@ LiteLLM cutover. **This table is the single place the intent→model mapping liv
|
|
|
458
458
|
| **deepest** | Subtle correctness, security invariants, novel architecture, judgment-heavy seams | `opus` | `/model opus`; `Agent(model: "opus")` | **High** — Anthropic plan quota |
|
|
459
459
|
| **broad** | Wide parallel coverage of a large but not-subtle surface; the workhorse | `sonnet` | `/model sonnet`; `Agent(model: "sonnet")` | Medium — the default; budget for several |
|
|
460
460
|
| **mechanical** | Fully-specced, repeat-of-a-known-pattern, no judgment required | `haiku` | `/model haiku`; `Agent(model: "haiku")` | Low |
|
|
461
|
-
| **cross-vendor-reviewer** | A *different vendor's* blind spots on a diff — **code review only** | `
|
|
461
|
+
| **cross-vendor-reviewer** | A *different vendor's* blind spots on a diff — **code review only** | `agy-argon` (default), `deepseek`, `glm` | `/caddis:cross-review`, `/glm`, `/deepseek` | **Scarce** — separate starter-tier subscription, NOT Anthropic quota. Ration it. |
|
|
462
462
|
| **synthesis / long-horizon** | Orchestrating many lanes, or work that can't self-verify across a large codebase | `fable` | `/model fable` | **Very high** — ~2× opus's rate-limit burn. RARE. |
|
|
463
463
|
|
|
464
464
|
**Update this table, not the callers**, when a model is added, retired, or re-tiered. A plan that says
|
|
@@ -512,7 +512,7 @@ Invent no new machinery. Everything needed already ships:
|
|
|
512
512
|
| Per-phase model + lane assignment in a plan | `/caddis:feature-plan` — every phase already carries **Model**, **Lane**, and a cross-review provider |
|
|
513
513
|
|
|
514
514
|
**Reviewer rule (standing):** the reviewer is always a different vendor than whoever wrote the code.
|
|
515
|
-
Claude or GLM implemented →
|
|
515
|
+
Claude or GLM implemented → agy Argon reviews by default (DeepSeek, then GLM, as fallbacks). Never same-vendor.
|
|
516
516
|
|
|
517
517
|
Full command/billing decision table: `docs/guide/multi-model-workflow.md`.
|
|
518
518
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cross-review
|
|
3
|
-
description: Have a different vendor's model (DeepSeek, GLM, any OpenAI-compatible endpoint) review the current diff. Use after a phase is green and before commit/merge, or for a second opinion on a risky diff.
|
|
3
|
+
description: Have a different vendor's model (agy Argon by default; DeepSeek, GLM, any OpenAI-compatible endpoint) review the current diff. Use after a phase is green and before commit/merge, or for a second opinion on a risky diff.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Cross-Review — a second-vendor set of eyes on your diff
|
|
7
7
|
|
|
8
8
|
A different vendor's model has different blind spots. Claude reviewing Claude's diff shares those
|
|
9
|
-
blind spots;
|
|
9
|
+
blind spots; an **agy Argon** (default), DeepSeek, GLM or other OpenAI-compatible reviewer catches a different class of
|
|
10
10
|
issue. This skill runs that second reviewer over the current changes and acts on its verdict.
|
|
11
11
|
|
|
12
12
|
## When to use
|
|
@@ -20,7 +20,7 @@ issue. This skill runs that second reviewer over the current changes and acts on
|
|
|
20
20
|
python "$TOOL" --check-config
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
Exit 0 prints which providers
|
|
23
|
+
Exit 0 prints which providers are available (agy-argon needs no key, only agy on PATH and caddis_spend.py). **Exit 3 means nothing is configured — stop and ask the
|
|
24
24
|
user before reading any diff.** Do not proceed, and do not silently skip the review.
|
|
25
25
|
|
|
26
26
|
Ask with `AskUserQuestion` which provider to set up, then write the key to `~/.caddis/keys.env` as
|
|
@@ -36,15 +36,16 @@ If a key exists for a *different* provider than the one requested, the error nam
|
|
|
36
36
|
exact flag (`--provider glm`). Read the message before concluding anything is missing.
|
|
37
37
|
|
|
38
38
|
## Prerequisites (one-time)
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
The default reviewer is **agy Argon** (since 2026-10-21; no key, but agy and `caddis_spend.py` must be present). For an HTTP
|
|
40
|
+
provider only the key is mandatory — the tool ships **provider presets** (`deepseek`, `glm`, `openrouter`):
|
|
41
41
|
```
|
|
42
42
|
REVIEW_API_KEY = <your provider key> # REQUIRED (exit 3 without it)
|
|
43
|
-
REVIEW_PROVIDER = deepseek # optional: deepseek | glm | openrouter (default
|
|
43
|
+
REVIEW_PROVIDER = deepseek # optional: agy-argon | deepseek | glm | openrouter (default agy-argon)
|
|
44
44
|
REVIEW_BASE_URL = ... # optional: overrides the preset's URL
|
|
45
45
|
REVIEW_MODEL = ... # optional: overrides the preset's model id
|
|
46
46
|
```
|
|
47
|
-
Switch provider with one flag: `--provider glm` (or `REVIEW_PROVIDER=glm
|
|
47
|
+
Switch provider with one flag: `--provider glm` (or `REVIEW_PROVIDER=glm`, in the env or in `~/.caddis/keys.env`; flag, then env,
|
|
48
|
+
then keys file, then agy Argon). To make DeepSeek the default again, add `REVIEW_PROVIDER=deepseek` to ~/.caddis/keys.env. **Future-proofing:** model ids
|
|
48
49
|
churn — the preset table in `oss_review.py` is the one place to edit a rename, and `REVIEW_MODEL` /
|
|
49
50
|
`REVIEW_BASE_URL` always win, so you can point at any new id without touching code.
|
|
50
51
|
|
|
@@ -91,7 +92,7 @@ smaller chunks; don't just raise `--max-diff-chars` without knowing the endpoint
|
|
|
91
92
|
Fix it, then re-review only the fix diff. After 3 rounds, ask the owner (rule 3).
|
|
92
93
|
- **4 — error** → no verdict parsed, a git failure, or an endpoint/parse failure. Read stderr; do not
|
|
93
94
|
treat this as CLEAN — investigate.
|
|
94
|
-
- **3 —
|
|
95
|
+
- **3 — could not run** → no reviewer is available (no agy on PATH and no API key), or every provider failed. Fix it (see Prerequisites) and re-run.
|
|
95
96
|
|
|
96
97
|
## Three rules: one attempt, one review
|
|
97
98
|
1. **Think before you send.** Before a task goes to any coder, write its edge cases and check the facts it depends on (one query or one file read).
|
|
@@ -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-
|
|
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.
|
|
51
|
-
|
|
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
|
|
package/bundles/manifest.json
CHANGED
package/package.json
CHANGED