@caddis/cli 0.4.55 → 0.4.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/bundles/antigravity-plugin/caddis_statusline.py +7 -3
  2. package/bundles/antigravity-plugin/guard_agy.py +378 -37
  3. package/bundles/antigravity-plugin/plugin.json +1 -1
  4. package/bundles/antigravity-plugin/repo_freshness.py +182 -4
  5. package/bundles/antigravity-plugin/scripts/caddis_adhoc.py +20 -12
  6. package/bundles/antigravity-plugin/scripts/caddis_docs_pr.py +14 -5
  7. package/bundles/antigravity-plugin/scripts/caddis_gate.py +6 -1
  8. package/bundles/antigravity-plugin/scripts/caddis_lanes.py +58 -6
  9. package/bundles/antigravity-plugin/scripts/caddis_relay_git.py +8 -2
  10. package/bundles/antigravity-plugin/scripts/caddis_review.py +231 -167
  11. package/bundles/antigravity-plugin/scripts/caddis_roadmap.py +226 -26
  12. package/bundles/antigravity-plugin/scripts/caddis_roadmap_page.py +2 -1
  13. package/bundles/antigravity-plugin/scripts/caddis_roadmap_run.py +89 -24
  14. package/bundles/antigravity-plugin/scripts/caddis_statusline.py +7 -3
  15. package/bundles/antigravity-plugin/scripts/caddis_tidy.py +10 -6
  16. package/bundles/antigravity-plugin/scripts/caddis_todo.py +7 -1
  17. package/bundles/antigravity-plugin/scripts/caddis_worktree_close.py +12 -5
  18. package/bundles/antigravity-plugin/scripts/caddis_worktree_safety.py +182 -0
  19. package/bundles/antigravity-plugin/scripts/check_doc_coverage.py +2 -0
  20. package/bundles/antigravity-plugin/scripts/claudster_doctor.py +6 -2
  21. package/bundles/antigravity-plugin/scripts/no_window.py +49 -0
  22. package/bundles/antigravity-plugin/scripts/oss_review.py +3 -0
  23. package/bundles/antigravity-plugin/scripts/secret_filter.py +190 -22
  24. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +2 -1
  25. package/bundles/antigravity-plugin/session_end_agy.py +14 -1
  26. package/bundles/antigravity-plugin/skills/cloud-phases/SKILL.md +2 -1
  27. package/bundles/antigravity-plugin/skills/gh-cli/SKILL.md +1 -1
  28. package/bundles/antigravity-plugin/skills/git-commit/SKILL.md +2 -3
  29. package/bundles/antigravity-plugin/skills/implement/SKILL.md +13 -6
  30. package/bundles/antigravity-plugin/skills/pr-merge/SKILL.md +1 -1
  31. package/bundles/antigravity-plugin/skills/refactoring/SKILL.md +4 -2
  32. package/bundles/antigravity-plugin/skills/roadmap/SKILL.md +28 -6
  33. package/bundles/antigravity-plugin/skills/roadmap/assets/review-protocol.md +16 -13
  34. package/bundles/antigravity-plugin/skills/ship/SKILL.md +6 -3
  35. package/bundles/antigravity-plugin/skills/ship-merge/SKILL.md +1 -1
  36. package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +2 -2
  37. package/bundles/antigravity-plugin/skills/writing-plans/SKILL.md +1 -1
  38. package/bundles/antigravity-plugin/warm_start_agy.py +14 -1
  39. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  40. package/bundles/antigravity-plugin-extras/skills/deploy-local/SKILL.md +2 -1
  41. package/bundles/antigravity-plugin-extras/skills/update-readme/SKILL.md +1 -1
  42. package/bundles/codex/.codex/skills/coding/refactoring/SKILL.md +4 -2
  43. package/bundles/codex/.codex/skills/devops/gh-cli/SKILL.md +1 -1
  44. package/bundles/codex/.codex/skills/devops/git-commit/SKILL.md +2 -3
  45. package/bundles/codex/.codex/skills/docs/writing-plans/SKILL.md +1 -1
  46. package/bundles/codex/.codex/skills/workflow/roadmap/SKILL.md +28 -6
  47. package/bundles/codex/.codex/skills/workflow/roadmap/assets/review-protocol.md +16 -13
  48. package/bundles/manifest.json +3 -3
  49. package/package.json +1 -1
@@ -36,13 +36,16 @@ names, branch, and service identifiers — never assume.
36
36
  - Tests: run only if the user says they're needed or a gate explicitly requires them
37
37
  - Fix any failures before proceeding. Do not commit broken code.
38
38
 
39
- **2. STAGE + COMMIT** — Stage only the intended files, by name (never `git add -A`, `git add .` or a folder):
39
+ **2. STAGE + COMMIT** — Stage only the intended files, by name (never `git add -A`, `git add .`, `git add -u`, a folder, or `git commit -a`):
40
40
  ```
41
41
  git status --short # confirm what's staged
42
42
  git add <specific files>
43
- git commit -m "<type>(<scope>): <message>"
43
+ git diff --cached --name-only # must list ONLY <specific files>
44
+ git commit -m "<type>(<scope>): <message>" -- <specific files>
44
45
  git rev-parse HEAD # record SHA for monitoring
45
46
  ```
47
+ If `git diff --cached --name-only` lists a path you did not change, **stop**: a peer staged it. Do not
48
+ commit, unstage or stash it; report it. `-- <files>` commits only the named files even then.
46
49
  Use conventional commits: `fix:`, `feat:`, `chore:`, `refactor:`, `docs:`. Scope = affected module.
47
50
 
48
51
  **2b. CROSS-REVIEW TRIGGER** — `ship` has no review pause at all, which is how sixteen fixes reached production unreviewed in one day.
@@ -119,7 +122,7 @@ Small work that does not meet a trigger skips its block.
119
122
 
120
123
  ## Rules
121
124
  - Never push before preflight gates are green.
122
- - Never `git add -A`, `git add .` or `git add <dir>`, even after reading `git status`: stage named files only (the guard denies the first two).
125
+ - Never `git add -A`, `git add .` or `git add <dir>`, even after reading `git status`: stage named files only (the guard denies all three, and `git add -u` and `git commit -a`). Commit with `git commit -m "..." -- <files>`, after `git diff --cached --name-only` shows only those files.
123
126
  - Do not edit a workflow file (`.gitea/workflows/` or `.github/workflows/`) to make a failing gate
124
127
  pass — fix the source.
125
128
  - Gitea lane: tag-triggered runs after `release_metadata` are expected; verify `deploy_prod` is
@@ -123,7 +123,7 @@ Cleanup: remote branch ✗ deleted / local ✗ deleted / backup ref droppe
123
123
  ## Rules
124
124
  - Never merge without: green required checks **and** the explicit human deploy-confirm.
125
125
  - Never delete a branch before its deploy is validated green.
126
- - Never `git add -A`, `git add .` or `git add <dir>`, even after reading `git status`: stage named files only (the guard denies the first two). Never edit a workflow file to make a gate pass.
126
+ - Never `git add -A`, `git add .` or `git add <dir>`, even after reading `git status`: stage named files only (the guard denies all three, and `git add -u` and `git commit -a`). Commit with `git commit -m "..." -- <files>`, after `git diff --cached --name-only` shows only those files. Never edit a workflow file to make a gate pass.
127
127
  - Local-only lane: no PR, no merge — refuse and point at `/ship`.
128
128
 
129
129
  ## Skill reference
@@ -56,7 +56,7 @@ source checkout; skip this step if the script is missing or the repo has no `.ca
56
56
  - Exit **1** — **stop; do not open the PR.** Show each `CHECK VIOLATION` or `ERROR` line.
57
57
  - `plan <path>: tracker done, status <s>` — run
58
58
  `caddis_tidy.py --repo-root . --apply --only <path>`, `git add` the moved plan by name,
59
- commit, and run this step again.
59
+ commit with `git commit -m "..." -- <old path> <new path>`, and run this step again.
60
60
  - `plan <path>: tracker done, but done/<name> already exists (rename one of them)` — `--apply`
61
61
  cannot fix this; it changes nothing while the name is taken. Rename the plan or the old
62
62
  `done/` copy with `git mv`, commit, and run this step again.
@@ -146,7 +146,7 @@ human-confirmed door.
146
146
 
147
147
  ## Rules
148
148
  - **Never merges, never deploys** — no merge action exists in this command, by design.
149
- - Never `git add -A`, `git add .` or `git add <dir>`, even after reading `git status`: stage named files only (the guard denies the first two).
149
+ - Never `git add -A`, `git add .` or `git add <dir>`, even after reading `git status`: stage named files only (the guard denies all three, and `git add -u` and `git commit -a`). Commit with `git commit -m "..." -- <files>`, after `git diff --cached --name-only` shows only those files.
150
150
  - Never force-push without a `backup/*-preship` recovery ref; force pushes are `--force-with-lease` only.
151
151
  - Never edit a workflow file (`.gitea/workflows/`, `.github/workflows/`) to make a gate pass — fix the source.
152
152
  - Local-only lane: refuse + point at `/ship`. On the default branch: stop + point at `/ship`.
@@ -102,7 +102,7 @@ Expected: PASS
102
102
 
103
103
  ```bash
104
104
  git add tests/path/test.py src/path/file.py
105
- git commit -m "feat: add specific feature"
105
+ git commit -m "feat: add specific feature" -- tests/path/test.py src/path/file.py
106
106
  ```
107
107
  ```
108
108
 
@@ -28,6 +28,19 @@ import os
28
28
  import subprocess
29
29
  import sys
30
30
 
31
+ # No child process of this hook opens a console window on Windows (scripts/no_window.py). agy hooks ship
32
+ # FLAT at the plugin root with scripts/ beside them; in the source repo scripts/ is one level up.
33
+ try:
34
+ _nw_here = os.path.dirname(os.path.abspath(__file__))
35
+ for _nw_cand in (os.path.join(_nw_here, "scripts"), os.path.join(os.path.dirname(_nw_here), "scripts")):
36
+ if os.path.isfile(os.path.join(_nw_cand, "no_window.py")):
37
+ if _nw_cand not in sys.path:
38
+ sys.path.insert(0, _nw_cand)
39
+ break
40
+ from no_window import NO_WINDOW_KW # noqa: E402
41
+ except Exception: # pragma: no cover - defensive
42
+ NO_WINDOW_KW = {"creationflags": 0x08000000} if os.name == "nt" else {}
43
+
31
44
  _ARTIFACT_DIRS = (".caddis",)
32
45
 
33
46
  INJECT_MAX_LINES = 120 # same budget as the Claude Code hook
@@ -151,7 +164,7 @@ def resolve_relay(root: str, session_id: str = "") -> tuple[str, str | None]:
151
164
  try:
152
165
  branch = subprocess.run(
153
166
  ["git", "-C", root, "rev-parse", "--abbrev-ref", "HEAD"],
154
- capture_output=True, text=True, timeout=3,
167
+ capture_output=True, text=True, timeout=3, **NO_WINDOW_KW,
155
168
  ).stdout.strip()
156
169
  except Exception:
157
170
  branch = ""
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "caddis-extras",
3
- "version": "1.3.43",
3
+ "version": "1.3.44",
4
4
  "description": "caddis-extras — the long-tail skills for the Antigravity (agy) caddis plugin; install alongside caddis for the full set."
5
5
  }
@@ -80,7 +80,8 @@ Example:
80
80
  ```powershell
81
81
  git status --short
82
82
  git add <files>
83
- git commit -m "fix(ci): resolve deploy health check"
83
+ git diff --cached --name-only # only <files>; else stop and report
84
+ git commit -m "fix(ci): resolve deploy health check" -- <files>
84
85
  git push origin main
85
86
  git rev-parse HEAD
86
87
  ```
@@ -54,7 +54,7 @@ Use this skill when users ask to:
54
54
  ### Phase 4 — Stage only README changes for docs commit
55
55
 
56
56
  1. Stage README files only:
57
- - `git add README.md **/README.md`
57
+ - `git add README.md <each changed README by path>` (no `**` pattern: the guard denies it)
58
58
  2. Verify staged diff contains no non-README files.
59
59
  3. Suggested conventional commit:
60
60
  - `docs(readme): document <feature summary>`
@@ -128,7 +128,8 @@ Activate when:
128
128
  ```bash
129
129
  git status --short # stage the files you changed, by name
130
130
  git add tests/test_<module>.py
131
- git commit -m "chore: add tests before refactoring"
131
+ git diff --cached --name-only # only the files you named
132
+ git commit -m "chore: add tests before refactoring" -- tests/test_<module>.py
132
133
  ```
133
134
 
134
135
  ---
@@ -387,7 +388,8 @@ DEPRECATED_VALUE = 5 # Not referenced
387
388
 
388
389
  2. **If tests pass, commit**
389
390
  ```bash
390
- git commit -m "refactor: extract validation to separate method"
391
+ git add <files you changed>
392
+ git commit -m "refactor: extract validation to separate method" -- <files you changed>
391
393
  ```
392
394
 
393
395
  3. **If tests fail, revert**
@@ -168,7 +168,7 @@ gh alias set review 'pr list --search "review-requested:@me"'
168
168
  ```bash
169
169
  gh issue develop 42 --branch fix/issue-42
170
170
  git add src/auth/login.py tests/test_login.py # named files only, never `git add .`
171
- git commit -m "fix: resolve login bug" && git push -u origin HEAD
171
+ git commit -m "fix: resolve login bug" -- src/auth/login.py tests/test_login.py && git push -u origin HEAD
172
172
  gh pr create --title "fix: resolve login bug" --body "Closes #42"
173
173
  gh pr checks --watch
174
174
  gh pr merge --squash --delete-branch
@@ -87,9 +87,8 @@ Optional area of change:
87
87
  # Stage specific files
88
88
  git add path/to/file1 path/to/file2
89
89
 
90
- # Stage by pattern
91
- git add *.test.*
92
- git add src/components/*
90
+ # Never stage by pattern or folder (`*.test.*`, `src/components/`): a pattern also takes
91
+ # files you did not change, and the caddis guard denies it. Name each file.
93
92
  ```
94
93
 
95
94
  **Never stage secrets** (`.env`, `credentials.json`, private keys).
@@ -102,7 +102,7 @@ Expected: PASS
102
102
 
103
103
  ```bash
104
104
  git add tests/path/test.py src/path/file.py
105
- git commit -m "feat: add specific feature"
105
+ git commit -m "feat: add specific feature" -- tests/path/test.py src/path/file.py
106
106
  ```
107
107
  ```
108
108
 
@@ -89,8 +89,26 @@ python scripts/caddis_roadmap.py recheck --roadmap <slug>
89
89
  `Depends on` milestone `done` or `not-needed`, and no open blocker other than `data-condition` (exit 1 names it),
90
90
  then runs the Exit check (300 s): pass -> `done`; fail with a `data-condition` blocker -> `code-done/data-pending`;
91
91
  fail otherwise -> an `external` blocker
92
- `exit check failing (exit <n>)` (never the command's output). A milestone with no phase refs and no Exit check is
93
- refused (exit 4).
92
+ `exit check failing (exit <n>): <tail>` (the last 3 non-empty output lines on one line, the whole reason at most
93
+ 200 characters, masked as below). The part before `: ` is the blocker's identity: a later rollup adds no second
94
+ row, and `unblock --reason "exit check failing (exit <n>)"` removes every row of that prefix. A check that fails
95
+ on a missing environment (exit 9009/127/126, or output in its last 40 lines such as `No module named`,
96
+ `Cannot find module`, `ENOENT`, `run npm run build first`) is exit 3: no blocker, no PR. Either way the last 64 KB
97
+ of output (masked the same way) go to `.local/exit-check-<id>-<utc>.log` (the newest 10 stay), and rollup prints
98
+ the path. A milestone with no phase refs and no Exit check is refused (exit 4).
99
+ **Masked** in the reason and the log: the values of secret-named variables (`caddis_redact`); a whole
100
+ `-----BEGIN ... PRIVATE KEY-----` block up to its END line (or the end of the output); AWS, GitHub, Slack and JWT
101
+ tokens; a quoted value after a `password`/`secret`/`api_key`/`token` name, spaces included; an unquoted
102
+ `*PASSWORD*=`/`*TOKEN*=`-style line value; URL credentials (`scheme://***@`); and absolute paths as `<path>`: a
103
+ drive or UNC path up to the end of the line, a quote, `<`, `>` or `|`, and a `/home/`, `/Users/`, `/tmp/`, `/root/`,
104
+ `/var/`, `/etc/` or `/opt/` path up to the end of the line or a quote. Other text is published as printed.
105
+ - **`**Exit setup:** <command>`** (optional, one per roadmap, beside `Runner host:`; no `|`) runs in the temp worktree
106
+ before every Exit check (900 s). It must install fresh into that worktree, for example
107
+ `python -m venv .venv && .venv\Scripts\pip install -e .[dev]` or `npm ci && npm run build`. Each command runs in a
108
+ new shell, so the Exit check must call the venv itself: `.venv\Scripts\python -m pytest tests -q`, not
109
+ `python -m pytest`. Never link or junction a shared venv or `node_modules`: the worktree is removed with `--force`
110
+ after the check. A setup that fails or times out is exit 3 and writes nothing; the runner stops
111
+ `BLOCKED rollup not run` and the owner decides (the stop names a docs PR that was opened but not merged).
94
112
  - **Owner-only changes:** `set` Status `not-needed`, any `set` Owner, `unblock` of an `owner-gate`, and `block --check`
95
113
  (recheck runs that command unattended later). They need `--by-owner` and are refused headless: `CADDIS_HEADLESS`
96
114
  or `CLAUDECODE` in the environment (even empty), stdin not a terminal, or on
@@ -179,8 +197,8 @@ Stops (each one notifies and releases the lock): a STOP file (`~/.caddis/STOP` o
179
197
  `caddis_spend.py` still counts across runs), a lock or batch claim that cannot be written
180
198
  (`BLOCKED claim not written`, before any session), the agy spend cap refusing a reservation, three sessions
181
199
  with no newly merged phase, a roadmap write that fails, and the **snapshot guard**: one baseline for the whole run.
182
- The Milestones and Blockers tables (every cell of every row, rows added, removed or moved) and the `Runner host` line
183
- are frozen. Every origin read (each `next`, after the runner's own writes, after each session) is compared with the
200
+ The Milestones and Blockers tables (every cell of every row, rows added, removed or moved), the `Runner host` line
201
+ and the `**Exit setup:**` line are frozen. Every origin read (each `next`, after the runner's own writes, after each session) is compared with the
184
202
  previous one; the only differences allowed are the exact edits the runner itself made and recorded for that read: a
185
203
  Status it set, a blocker row it added, and what a rollup's audit entry (`changes.jsonl`) says it actually wrote.
186
204
  Anything else stops the run `FAILED roadmap changed`.
@@ -206,7 +224,10 @@ refuses a plan that a roadmap lock names, at start and before every session. `-D
206
224
  the session command, the worktree and any pending rollup, skips the host check, writes no files and starts nothing; it
207
225
  does run `git fetch`, which updates the remote-tracking refs. `-GhAccount <login>` (recorded in the launch options,
208
226
  passed on by the recheck task and in the printed task) makes every gh call of the runner and of `--last-stop` use
209
- GH_TOKEN from `gh auth token -u <login>`; on a machine with several gh logins, give the repo's account. A gh call that
227
+ GH_TOKEN from `gh auth token -u <login>`; on a machine with several gh logins, give the repo's account. The sessions
228
+ never get that token, nor GH_TOKEN, GITHUB_TOKEN, GH_ENTERPRISE_TOKEN, NPM_TOKEN or NODE_AUTH_TOKEN from the
229
+ environment; with CADDIS_HEADLESS=1 the guard denies `git push`, `gh pr merge|create`, `gh release`, a write through
230
+ `gh api`, `gh workflow run` and package publishes. Only the runner publishes. A gh call that
210
231
  cannot answer (gh missing, 401, 404) is an error, never "not merged": the run stops
211
232
  `BLOCKED gh cannot see <repo> with account <login>`, notified and recorded.
212
233
 
@@ -223,7 +244,8 @@ phases) holds the whole plan for every other roadmap and for plan mode. At the t
223
244
  every milestone that waits only for its rollup (Status not finished, every phase merged, and the same rule as
224
245
  `next`: no blocker, dependencies finished, Owner the runner); `--last-stop` says `rollup-ready:` for such a milestone,
225
246
  so recheck restarts the runner. A sweep rollup that writes nothing stops `BLOCKED rollup of <id> wrote nothing`
226
- (recorded, not restartable) and is not retried or reported until the roadmap changes. The dry run lists them first. If
247
+ (recorded, not restartable) and is not retried or reported until the roadmap changes. A rollup that exits 3 (its
248
+ exit check or Exit setup could not run) stops `BLOCKED rollup not run: <id> ...` (not restartable; the owner decides). The dry run lists them first. If
227
249
  the owner edits the roadmap during a merge wait, the restart stops `FAILED roadmap changed ...` and names the
228
250
  recovery: `roadmap-run.ps1 -Roadmap <slug> -AcceptRoadmap` (owner only, refused headless) takes the runner lock (a live
229
251
  runner refuses it), prints the diff from the published baseline, asks you to type `accept` (or `--yes`), and accepts
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  type: reference
3
3
  title: Review protocol
4
- description: The review method one model can rely on - invariants, inputs and writers, shared state, execute what the change promises, tests, docs, then severity (only blocking stops the merge; each finding needs a reproduction), one FINDING line per finding and an END REVIEW line. caddis_review.py sends it to every review run.
4
+ description: The review method one model can rely on - invariants, inputs and writers, shared state, check what the change promises, tests, docs, then severity (only blocking stops the merge; each finding needs a reproduction), one FINDING line per finding and an END REVIEW line. caddis_review.py sends it to every review run.
5
5
  status: current
6
6
  ---
7
7
 
8
8
  # Review protocol (generic, any diff)
9
9
 
10
- You review a diff. You do NOT edit, create or delete files, and you do not commit. You may read files and run commands
11
- (tests, dry runs, the commands that plans, cards and docs name). Work through ALL steps in order. Do not stop at the
12
- first finding. Include a short section per step, in order.
10
+ You review a diff. You read only: you have Read, Grep and Glob and no shell, so you run no test and no command, and
11
+ you do not edit, create or delete files. The diff is in the prompt. Tests are the implementer's and CI's job. Work
12
+ through ALL steps in order. Do not stop at the first finding. Include a short section per step, in order.
13
13
 
14
14
  ## Step 1 - Purpose and invariants
15
15
  Read the card, the plan or design section it cites, and the diff. Write the list of INVARIANTS this change must keep:
@@ -26,12 +26,14 @@ accident or on purpose? This includes the agent or session the code is meant to
26
26
  List state that two runs, two kinds of target, or two processes could share (files, locks, relays, logs, caches).
27
27
  Can they collide? Can one read the other's output as its own?
28
28
 
29
- ## Step 4 - Execute what the change promises
30
- Run the tests the card names. Then run every command that the plan, its exit gates, the docs or the skill text say
31
- should work for this change (dry runs, the documented usage lines), exactly as written. Use the repo's OWN fixtures
32
- and example files, not ones you build, and run unattended scripts (hooks, runners) as they are really run (as a script,
33
- with a real payload). Compare risky behaviour with the parent commit when the change claims to fix or tighten
34
- something. Report any that fail or that cannot work as documented.
29
+ ## Step 4 - Check what the change promises
30
+ For every command that the plan, its exit gates, the docs or the skill text say should work for this change (the
31
+ documented usage lines, exactly as written), follow it through the code by reading: the argument parsing, the paths it
32
+ reads and writes, the repo's OWN fixtures and example files. Read unattended scripts (hooks, runners) as they are
33
+ really run (as a script, with a real payload). Compare risky behaviour with the code before the change (the `-` lines
34
+ of the diff) when the change claims to fix or tighten something. Report any that would fail or that cannot work as
35
+ documented. For a check you cannot settle by reading, write one line `not executed: <command> (reviewer has no
36
+ shell)`.
35
37
 
36
38
  ## Step 5 - Tests
37
39
  For each new or changed test: could it pass for the wrong reason (no assertion that can fail, mocked away the thing
@@ -52,9 +54,10 @@ Severity rule. Only **blocking** stops the merge, so use it with care:
52
54
  negative test, a doc that is wrong in a way that does not make a command fail, an error message that misleads.
53
55
  - **nit** = style and wording.
54
56
 
55
- Every finding needs a concrete reproduction: a command, an input or a test that shows the failure, written in the
56
- failure scenario. A finding without a reproduction is a **nit**, whatever its severity would otherwise be. Do not
57
- write "might", "could in theory" or "a future change may": show it or call it a nit.
57
+ Every finding needs a concrete reproduction: a command, an input or a test that would show the failure, written in
58
+ the failure scenario (you do not run it; the implementer does). A finding without a reproduction is a **nit**,
59
+ whatever its severity would otherwise be. Do not write "might", "could in theory" or "a future change may": show it
60
+ or call it a nit.
58
61
 
59
62
  The gate exits by the findings. A **blocking** finding fails it. **should-fix** and **nit** findings do not: they are
60
63
  listed in the report under "Follow-up (not blocking)". The tool allows 3 completed review rounds for a phase; the 4th completed round
@@ -1,8 +1,8 @@
1
1
  {
2
- "poolVersion": "1.3.141",
2
+ "poolVersion": "1.3.142",
3
3
  "bundles": {
4
- "antigravity-plugin": "1.3.141",
5
- "antigravity-plugin-extras": "1.3.43",
4
+ "antigravity-plugin": "1.3.142",
5
+ "antigravity-plugin-extras": "1.3.44",
6
6
  "codex": "unknown"
7
7
  }
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caddis/cli",
3
- "version": "0.4.55",
3
+ "version": "0.4.56",
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",