@caddis/cli 0.4.34 → 0.4.36

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 (170) hide show
  1. package/bundles/antigravity-plugin/agents/code-reviewer.md +4 -0
  2. package/bundles/antigravity-plugin/plugin.json +1 -1
  3. package/bundles/antigravity-plugin/scripts/caddis_file_lock.py +121 -0
  4. package/bundles/antigravity-plugin/scripts/caddis_frontmatter.py +12 -0
  5. package/bundles/antigravity-plugin/scripts/caddis_gate.py +210 -6
  6. package/bundles/antigravity-plugin/scripts/caddis_inventory.py +9 -9
  7. package/bundles/antigravity-plugin/scripts/caddis_lanes.py +262 -1
  8. package/bundles/antigravity-plugin/scripts/caddis_relay_git.py +159 -0
  9. package/bundles/antigravity-plugin/scripts/caddis_routing.py +103 -0
  10. package/bundles/antigravity-plugin/scripts/caddis_tidy.py +579 -40
  11. package/bundles/antigravity-plugin/scripts/caddis_todo.py +462 -0
  12. package/bundles/antigravity-plugin/scripts/caddis_workstreams.py +631 -0
  13. package/bundles/antigravity-plugin/scripts/check_doc_coverage.py +27 -13
  14. package/bundles/antigravity-plugin/scripts/oss_review.py +30 -3
  15. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +5 -0
  16. package/bundles/antigravity-plugin/scripts/usage_review.py +2 -2
  17. package/bundles/antigravity-plugin/session_end_agy.py +16 -1
  18. package/bundles/antigravity-plugin/skills/_registry.md +35 -32
  19. package/bundles/antigravity-plugin/skills/adopt-app/SKILL.md +1 -1
  20. package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +1 -1
  21. package/bundles/antigravity-plugin/skills/api-design/SKILL.md +1 -1
  22. package/bundles/antigravity-plugin/skills/backend-development/SKILL.md +1 -1
  23. package/bundles/antigravity-plugin/skills/catchup/SKILL.md +31 -33
  24. package/bundles/antigravity-plugin/skills/ci-cd-pipeline/SKILL.md +1 -1
  25. package/bundles/antigravity-plugin/skills/cloud-phases/SKILL.md +185 -0
  26. package/bundles/antigravity-plugin/skills/code-documentation/SKILL.md +1 -1
  27. package/bundles/antigravity-plugin/skills/code-review/SKILL.md +1 -1
  28. package/bundles/antigravity-plugin/skills/codebase-audit/SKILL.md +1 -1
  29. package/bundles/antigravity-plugin/skills/confluence-hla/SKILL.md +1 -1
  30. package/bundles/antigravity-plugin/skills/cross-review/SKILL.md +9 -1
  31. package/bundles/antigravity-plugin/skills/css-architecture/SKILL.md +1 -1
  32. package/bundles/antigravity-plugin/skills/dashboard-perf-sweep/SKILL.md +1 -1
  33. package/bundles/antigravity-plugin/skills/database-design/SKILL.md +1 -1
  34. package/bundles/antigravity-plugin/skills/db-diagram/SKILL.md +1 -1
  35. package/bundles/antigravity-plugin/skills/decide/SKILL.md +61 -0
  36. package/bundles/antigravity-plugin/skills/digress/SKILL.md +41 -23
  37. package/bundles/antigravity-plugin/skills/error-handling/SKILL.md +1 -1
  38. package/bundles/antigravity-plugin/skills/explainer-doc/SKILL.md +1 -1
  39. package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +20 -0
  40. package/bundles/antigravity-plugin/skills/frontend-design/SKILL.md +1 -1
  41. package/bundles/antigravity-plugin/skills/gate-preflight/SKILL.md +12 -0
  42. package/bundles/antigravity-plugin/skills/handoff/SKILL.md +74 -13
  43. package/bundles/antigravity-plugin/skills/implement/SKILL.md +31 -2
  44. package/bundles/antigravity-plugin/skills/mermaid-diagrams/SKILL.md +1 -1
  45. package/bundles/antigravity-plugin/skills/mmr/SKILL.md +8 -0
  46. package/bundles/antigravity-plugin/skills/particle-art/SKILL.md +1 -1
  47. package/bundles/antigravity-plugin/skills/playwright/SKILL.md +1 -1
  48. package/bundles/antigravity-plugin/skills/port-to-github/SKILL.md +1 -1
  49. package/bundles/antigravity-plugin/skills/pr-merge/SKILL.md +33 -2
  50. package/bundles/antigravity-plugin/skills/python/SKILL.md +1 -1
  51. package/bundles/antigravity-plugin/skills/rca/SKILL.md +97 -0
  52. package/bundles/antigravity-plugin/skills/react-dev/SKILL.md +1 -1
  53. package/bundles/antigravity-plugin/skills/safe-cleanup/SKILL.md +1 -1
  54. package/bundles/antigravity-plugin/skills/ship/SKILL.md +27 -7
  55. package/bundles/antigravity-plugin/skills/ship-merge/SKILL.md +36 -3
  56. package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +6 -1
  57. package/bundles/antigravity-plugin/skills/skill-creator/SKILL.md +1 -1
  58. package/bundles/antigravity-plugin/skills/sql/SKILL.md +1 -1
  59. package/bundles/antigravity-plugin/skills/tech-explainer/SKILL.md +7 -12
  60. package/bundles/antigravity-plugin/skills/technical-writing/SKILL.md +1 -1
  61. package/bundles/antigravity-plugin/skills/test-strategy/SKILL.md +1 -1
  62. package/bundles/antigravity-plugin/skills/ui-review/SKILL.md +1 -1
  63. package/bundles/antigravity-plugin/skills/using-git-worktrees/SKILL.md +1 -1
  64. package/bundles/antigravity-plugin/skills/warm-editorial-ui/SKILL.md +1 -1
  65. package/bundles/antigravity-plugin/skills/webapp-testing/SKILL.md +1 -1
  66. package/bundles/antigravity-plugin/skills/windows-deployment/SKILL.md +1 -1
  67. package/bundles/antigravity-plugin/warm_start_agy.py +138 -42
  68. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  69. package/bundles/antigravity-plugin-extras/skills/_registry.md +61 -61
  70. package/bundles/antigravity-plugin-extras/skills/agent-md-refactor/SKILL.md +1 -1
  71. package/bundles/antigravity-plugin-extras/skills/agent-orchestration/SKILL.md +1 -1
  72. package/bundles/antigravity-plugin-extras/skills/algorithmic-art/SKILL.md +1 -1
  73. package/bundles/antigravity-plugin-extras/skills/api-client-patterns/SKILL.md +1 -1
  74. package/bundles/antigravity-plugin-extras/skills/architecture-diagram/SKILL.md +1 -1
  75. package/bundles/antigravity-plugin-extras/skills/architecture-document/SKILL.md +1 -1
  76. package/bundles/antigravity-plugin-extras/skills/artifacts-builder/SKILL.md +1 -1
  77. package/bundles/antigravity-plugin-extras/skills/ascii-art/SKILL.md +1 -1
  78. package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/SKILL.md +1 -1
  79. package/bundles/antigravity-plugin-extras/skills/aws-cdk-development/SKILL.md +1 -1
  80. package/bundles/antigravity-plugin-extras/skills/aws-cost-operations/SKILL.md +1 -1
  81. package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/SKILL.md +1 -1
  82. package/bundles/antigravity-plugin-extras/skills/backend-to-frontend-handoff/SKILL.md +1 -1
  83. package/bundles/antigravity-plugin-extras/skills/banner-design/SKILL.md +1 -1
  84. package/bundles/antigravity-plugin-extras/skills/brand-design/SKILL.md +1 -1
  85. package/bundles/antigravity-plugin-extras/skills/brand-guidelines/SKILL.md +1 -1
  86. package/bundles/antigravity-plugin-extras/skills/brand-voice/SKILL.md +1 -1
  87. package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/SKILL.md +3 -7
  88. package/bundles/antigravity-plugin-extras/skills/building-mcp-server-on-cloudflare/SKILL.md +3 -7
  89. package/bundles/antigravity-plugin-extras/skills/canvas-design/SKILL.md +1 -1
  90. package/bundles/antigravity-plugin-extras/skills/changelog-generator/SKILL.md +1 -1
  91. package/bundles/antigravity-plugin-extras/skills/code-explainer/SKILL.md +1 -1
  92. package/bundles/antigravity-plugin-extras/skills/component-testing/SKILL.md +1 -1
  93. package/bundles/antigravity-plugin-extras/skills/cross-review/SKILL.md +10 -2
  94. package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/SKILL.md +1 -1
  95. package/bundles/antigravity-plugin-extras/skills/data-loader/SKILL.md +1 -1
  96. package/bundles/antigravity-plugin-extras/skills/data-validation/SKILL.md +1 -1
  97. package/bundles/antigravity-plugin-extras/skills/deploy-local/SKILL.md +1 -1
  98. package/bundles/antigravity-plugin-extras/skills/design-md/SKILL.md +1 -1
  99. package/bundles/antigravity-plugin-extras/skills/design-system-tokens/SKILL.md +1 -1
  100. package/bundles/antigravity-plugin-extras/skills/developer-growth-analysis/SKILL.md +1 -1
  101. package/bundles/antigravity-plugin-extras/skills/doc-coauthoring/SKILL.md +1 -1
  102. package/bundles/antigravity-plugin-extras/skills/documentation-analyzer/SKILL.md +1 -1
  103. package/bundles/antigravity-plugin-extras/skills/enterprise-dashboard-aesthetic-system/SKILL.md +1 -1
  104. package/bundles/antigravity-plugin-extras/skills/file-organizer/SKILL.md +1 -1
  105. package/bundles/antigravity-plugin-extras/skills/game-changing-features/SKILL.md +1 -1
  106. package/bundles/antigravity-plugin-extras/skills/golden-nuggets/SKILL.md +1 -1
  107. package/bundles/antigravity-plugin-extras/skills/golden-plan/SKILL.md +1 -1
  108. package/bundles/antigravity-plugin-extras/skills/hld/SKILL.md +1 -1
  109. package/bundles/antigravity-plugin-extras/skills/internal-comms/SKILL.md +1 -1
  110. package/bundles/antigravity-plugin-extras/skills/jira-issues/SKILL.md +1 -1
  111. package/bundles/antigravity-plugin-extras/skills/lld/SKILL.md +1 -1
  112. package/bundles/antigravity-plugin-extras/skills/llm-application-dev/SKILL.md +1 -1
  113. package/bundles/antigravity-plugin-extras/skills/mcp-builder/SKILL.md +1 -1
  114. package/bundles/antigravity-plugin-extras/skills/monorepo/SKILL.md +1 -1
  115. package/bundles/antigravity-plugin-extras/skills/nextjs-app-router/SKILL.md +1 -1
  116. package/bundles/antigravity-plugin-extras/skills/observability/SKILL.md +1 -1
  117. package/bundles/antigravity-plugin-extras/skills/performance-testing/SKILL.md +1 -1
  118. package/bundles/antigravity-plugin-extras/skills/popular-web-designs/SKILL.md +1 -1
  119. package/bundles/antigravity-plugin-extras/skills/prd-to-code/SKILL.md +1 -1
  120. package/bundles/antigravity-plugin-extras/skills/react-useeffect/SKILL.md +1 -1
  121. package/bundles/antigravity-plugin-extras/skills/receiving-code-review/SKILL.md +1 -1
  122. package/bundles/antigravity-plugin-extras/skills/responsive-mobile-native/SKILL.md +4 -9
  123. package/bundles/antigravity-plugin-extras/skills/safe-cleanup/SKILL.md +1 -1
  124. package/bundles/antigravity-plugin-extras/skills/schema-migration/SKILL.md +1 -1
  125. package/bundles/antigravity-plugin-extras/skills/setup-project-ai/SKILL.md +1 -1
  126. package/bundles/antigravity-plugin-extras/skills/shadcn-radix/SKILL.md +1 -1
  127. package/bundles/antigravity-plugin-extras/skills/sketch/SKILL.md +1 -1
  128. package/bundles/antigravity-plugin-extras/skills/streamlit-dev/SKILL.md +1 -1
  129. package/bundles/antigravity-plugin-extras/skills/theme-factory/SKILL.md +1 -1
  130. package/bundles/antigravity-plugin-extras/skills/ui-styling-patterns/SKILL.md +1 -1
  131. package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/SKILL.md +1 -1
  132. package/bundles/antigravity-plugin-extras/skills/understand-anything/SKILL.md +5 -9
  133. package/bundles/antigravity-plugin-extras/skills/update-readme/SKILL.md +1 -1
  134. package/bundles/antigravity-plugin-extras/skills/word-cloud/SKILL.md +1 -1
  135. package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +1 -1
  136. package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +1 -1
  137. package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +1 -1
  138. package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +1 -1
  139. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +1 -1
  140. package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +1 -1
  141. package/bundles/codex/.codex/skills/coding/python/SKILL.md +1 -1
  142. package/bundles/codex/.codex/skills/coding/sql/SKILL.md +1 -1
  143. package/bundles/codex/.codex/skills/data/database-design/SKILL.md +1 -1
  144. package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +1 -1
  145. package/bundles/codex/.codex/skills/devops/adopt-app/SKILL.md +1 -1
  146. package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +1 -1
  147. package/bundles/codex/.codex/skills/devops/port-to-github/SKILL.md +1 -1
  148. package/bundles/codex/.codex/skills/devops/safe-cleanup/SKILL.md +1 -1
  149. package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +1 -1
  150. package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +1 -1
  151. package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +1 -1
  152. package/bundles/codex/.codex/skills/docs/confluence-hla/SKILL.md +1 -1
  153. package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +1 -1
  154. package/bundles/codex/.codex/skills/docs/tech-explainer/SKILL.md +7 -12
  155. package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +1 -1
  156. package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +1 -1
  157. package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +1 -1
  158. package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +1 -1
  159. package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +1 -1
  160. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +1 -1
  161. package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +1 -1
  162. package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +1 -1
  163. package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +1 -1
  164. package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +1 -1
  165. package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +1 -1
  166. package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +1 -1
  167. package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +1 -1
  168. package/bundles/codex/AGENTS.md +5 -1
  169. package/bundles/manifest.json +3 -3
  170. package/package.json +1 -1
@@ -5,7 +5,7 @@ description: End-of-session handoff — capture exact state so the next session
5
5
 
6
6
  # /handoff — stop cleanly, write the resume doc
7
7
 
8
- You are ending a work session. Produce/refresh the resume doc (`.caddis/relay.md`) so the next session
8
+ You are ending a work session. Produce/refresh this workstream's resume doc (`.caddis/relay/<name>.md`) so the next session
9
9
  (you, a future you, or another agent on any tool) can resume immediately. This is the anti-context-rot checkpoint.
10
10
 
11
11
  ## Step 1 — capture learnings FIRST (knowledge-transfer)
@@ -103,21 +103,42 @@ Nothing to say is the normal answer. Say nothing and move on — this must not b
103
103
  <!-- /shared:harness-friction-question -->
104
104
 
105
105
  ## Step 3 — write the resume doc (overwrite) with exactly these sections
106
- > **Where to write:** solo / single active branch → `.caddis/relay.md` (default).
107
- > **Team / parallel branches** → write `.caddis/relay/<current-branch>.md` instead, so two
108
- > developers never merge-conflict on one shared relay doc. The SessionStart hook prefers the
109
- > per-branch file automatically when it exists, then `.caddis/relay.md`, then the legacy
110
- > `.claude/relay/<branch>.md` and root `relay.md` (back-compat during the migration).
106
+ > **Where to write:** this session's own workstream relay, `.caddis/relay/<name>.md`, through the
107
+ > locked script — never with a plain file edit, which would skip the conflict check. `.caddis/relay.md`
108
+ > is a generated index of all workstreams; do not write it by hand.
111
109
  >
112
- > A repo still on the pre-rename `.claudster/` won't see this relay until it's converted —
113
- > `/caddis:migrate-dir` does that.
110
+ > Your session id is printed at session start as `[caddis] this session's id: <id>`; use it for
111
+ > `session_id` and `--session-id`. Never guess one: a wrong id disables session matching.
112
+ >
113
+ > 1. **Name the workstream** (active plan's `feature`, else the branch; the script prints nothing
114
+ > on the default branch with no plan — then ask the user for a short name):
115
+ > `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_workstreams.py" resolve --plan <feature> --branch <branch> --default-branch <main>`
116
+ > 2. **Legacy repo:** if `.caddis/relay.md` exists and does not start with
117
+ > `<!-- caddis-workstream-index-v1 -->`, or an old `/digress` stack `.caddis/workstreams.json`
118
+ > exists, run `caddis_workstreams.py migrate-legacy` once first.
119
+ > It backs up the old file and stops without deleting anything on a conflict; report a conflict
120
+ > to the user and stop.
121
+ > 3. **Read the stored version's hash** before you compose: `caddis_workstreams.py hash <name>`
122
+ > (prints `none` for a new workstream).
123
+ > 4. **Write** the relay below to a temp file, then
124
+ > `caddis_workstreams.py write <name> <temp-file> --expected-hash <hash>`. Exit 1 means another
125
+ > session changed the relay since step 3: it prints the diff and writes nothing. Show the diff,
126
+ > merge by hand, and retry with the new hash. Never force it.
127
+ > 5. **Refresh the index:** `caddis_workstreams.py render-index --session-id <id> --branch <branch>`.
128
+ >
129
+ > (Source checkout: `scripts/caddis_workstreams.py`.) A repo still on the pre-rename `.claudster/`
130
+ > won't see this relay until it's converted — `/caddis:migrate-dir` does that.
114
131
 
115
132
  ```markdown
116
133
  ---
117
134
  type: relay
118
135
  workstream: <name>
119
136
  branch: <branch>
120
- generated: { by: <model>, at: <ISO time> }
137
+ plan: <plan file name, or empty>
138
+ session_id: <session id>
139
+ generated:
140
+ by: <model>
141
+ at: <ISO time>
121
142
  ---
122
143
 
123
144
  # Relay — <feature>
@@ -148,7 +169,7 @@ advisory-context audit: <N candidates → M gaps → landed in <path>> | n/a (no
148
169
 
149
170
  ## Resume prompt
150
171
  \`\`\`
151
- Read relay.md, then the plan it points to. Continue from <phase/step>. Next action: <exact>.
172
+ Read .caddis/relay/<name>.md, then the plan it points to. Continue from <phase/step>. Next action: <exact>.
152
173
  \`\`\`
153
174
  ```
154
175
 
@@ -168,7 +189,7 @@ handoff over it.
168
189
  ## Step 5 — check the handover you just wrote
169
190
 
170
191
  ```
171
- python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" handover-check --doc .caddis/relay.md
192
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" handover-check --doc .caddis/relay/<name>.md --max-chars 4000
172
193
  ```
173
194
  (falls back to `scripts/caddis_gate.py` in a source checkout; degrades open when the script is
174
195
  missing.) **Run it in the repo the handover is about** — a handover describing another repo will
@@ -181,13 +202,53 @@ incoming Hub looking for a prompt that was never written. Fix what it lists, the
181
202
  It also notes any generated artefact committed before its generator last changed. That is advisory,
182
203
  not blocking — but do not quote a report the note names without rebuilding it first.
183
204
 
205
+ ## Step 6 — reconcile task rows from session-state
206
+ Run task reconciliation against the newest session-state file:
207
+ ```
208
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_todo.py" reconcile --session-state .caddis/session-state/<session-id>.md
209
+ ```
210
+ This marks ad-hoc to-do items done by metadata ID; it never edits the Tracker and ignores phase rows.
211
+
212
+ ## Step 6b — record usage and tidy session state
213
+ The Stop hook only writes the session-state file. These two used to run on every turn; they run
214
+ here, once:
215
+ ```
216
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/session_state.py" usage --session-id <session-id>
217
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/session_state.py" prune
218
+ ```
219
+ `usage` finds this session's transcript by its id and appends one token-and-skill record to
220
+ `.caddis/usage-log.jsonl`, which `/usage-review` reads. Pass `--transcript <path>` if you know the
221
+ path and it is not under the Claude config folder. `prune` keeps the newest 8 files in
222
+ `.caddis/session-state/`; run it after Step 6, which reads this session's file. Include the
223
+ `[USAGE]` line in your output. Both always exit 0; if the script is missing, skip this step.
224
+
225
+ Then list old local state (falls back to `scripts/caddis_tidy.py`; skip if missing):
226
+ ```
227
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_tidy.py" --prune
228
+ ```
229
+ It only lists: session-state files older than 7 days, logs over 5 MB to rotate, and (report
230
+ only, never deleted) orphan `.lock` files and lane worktrees older than 7 days. Include its report. **Never
231
+ add `--apply` yourself**; deleting is the user's choice. If they ask, run `--prune --apply`.
232
+
233
+ ## Step 7 — push prompt (interactive only)
234
+ If this is an interactive session, ask the user every time — never reuse an earlier answer:
235
+ `Push this note for another machine? (y/N)`
236
+ Only on an explicit `y` in this session, run:
237
+ ```
238
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_relay_git.py" push <name> --user-said-yes
239
+ ```
240
+ It publishes only `.caddis/relay/<name>.md` to `refs/caddis/relay/<name>` — never the branch, the
241
+ index or staged files — after the secret filter passes. Report its one-line result. Anything but
242
+ `y` means do nothing. Headless runs never ask and never push (the script also refuses headless).
243
+ On the other machine, `/catchup <name>` fetches it.
244
+
184
245
  ## Rules
185
246
  - **One next action, by priority ladder.** `## Next step` names exactly ONE action — not a menu. Pick it in
186
247
  order: (1) interrupted mid-phase work → finish + commit it; else (2) the active plan's next not-started
187
248
  phase; else (3) the top open question/decision. Everything else is context, not the next step.
188
249
  - Only verified facts and real paths. Mark anything unconfirmed as `Unknown`.
189
250
  - Update the plan's tracker rows too (status + last commit) — relay and tracker must agree.
190
- - Don't commit unless asked. Report where `relay.md` was written and the one next action.
251
+ - Don't commit unless asked. Report which `.caddis/relay/<name>.md` was written and the one next action.
191
252
  - **Never hand off a Hub session on the strength of "the context doc is designed for this."** That is the
192
253
  one instinct that has been measured and found wrong. Run Step 2b's audit instead.
193
254
  - **Prune the Done section — two rules, both apply:**
@@ -198,5 +259,5 @@ not blocking — but do not quote a report the note names without rebuilding it
198
259
  are more, collapse the oldest into one summary line:
199
260
  `- [N prior milestones — see git log for full history]`
200
261
  Keep the 8 most recent bullets below it.
201
- Target: relay.md stays under ~80 lines on disk. inject_relay.py caps injection at 120 lines as a
262
+ Target: the relay stays at most 4,000 characters (handover-check enforces it). inject_relay.py caps injection at 120 lines as a
202
263
  safety net, but the file itself should never reach that ceiling.
@@ -7,6 +7,19 @@ description: Headless plan executor — implement an approved plan phase-by-phas
7
7
 
8
8
  Implement the plan at **$ARGUMENTS** (falls back to the `DOCKET_PLAN` env var if `$ARGUMENTS` is empty).
9
9
 
10
+ **Which plan.** An explicit plan always wins: `$ARGUMENTS` first, then the `DOCKET_PLAN` env var
11
+ (it counts as an explicit argument). Only when both are empty, find the active plan:
12
+
13
+ ```bash
14
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_todo.py" active-plan
15
+ ```
16
+
17
+ - **Exit 0** → stdout is the plan path. Say which plan you picked ("No plan given; using
18
+ `<path>`.") and implement it.
19
+ - **Exit 3** → no single active plan. Do not guess and do not ask. Stop before any change, list the
20
+ candidates it printed on stderr (or "none") in the review file, and end with the
21
+ `"implemented":false` JSON block from step 6.
22
+
10
23
  This command is the **docket Implement lane's driver**. It is spawned autonomously by the docket runner —
11
24
  **no human is present**. It does not design or re-plan: the plan is the intelligence, you are the executor.
12
25
  The runner independently re-runs the tests and a fresh code-review after you finish and decides success
@@ -35,6 +48,14 @@ depend on them:
35
48
  AskUserQuestion. Where the plan leaves a genuine gap, make the smallest reasonable assumption, record it
36
49
  in the review file, and proceed — asking is always wrong here.
37
50
 
51
+ ## Three rules: one attempt, one review
52
+ 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).
53
+ 2. **Run it before review.** The coder runs the same checks as CI (name the exact commands in the task). Then run the change once on real data.
54
+ 3. **Review once.** Use whatever reviewer is available. Stop at the first CLEAN. After two blocking reviews, ask the owner.
55
+
56
+ This run is headless, so "ask the owner" means: stop the phase, do not commit it, and record the
57
+ two blocking reviews in the review file.
58
+
38
59
  ## What to do
39
60
 
40
61
  **1. Read the plan.** Load the plan file (`$ARGUMENTS` / `DOCKET_PLAN`). Read its `## Phases`, `## Affected
@@ -145,8 +166,16 @@ row, visible to any later reader without an Advisory Hub having to catch it live
145
166
  lane worktrees and branches. It reports unmerged or dirty ones. It pushes the feature branch.
146
167
  The plan is not done until it prints `LEFTOVERS: 0`. Then run `/caddis:ship-pr`. Merging and
147
168
  post-merge cleanup stay with `/caddis:ship-merge` after the owner's go.
148
- 10. **When Claude is out of budget**, the owner opens `caddis-run codex -m gpt-6-astra` and asks it
149
- to follow this same subsection.
169
+ 10. **When a dispatched Claude run is out of budget**, read the output from the subagent or
170
+ `claude -p`. If it holds Claude usage-limit text (for example `You've hit your session limit`
171
+ or `You're out of extra usage`; the full list is `BUDGET_PATTERNS["claude"]` in
172
+ `caddis_lanes.py`), run `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" next-lane --role <the phase's role> --after <the model that ran>`.
173
+ Re-dispatch the same phase prompt to the printed lane with its direct launch command:
174
+ `codex exec ...` or `agy ... -p "..."`, using the same form that `/feature-plan` writes.
175
+ An out-of-budget switch is not an attempt (item 4). Record the fallback in the Tracker
176
+ `Lane` column, for example `sonnet -> agy (claude out of budget)`.
177
+ If `next-lane` exits 3, stop and report that no lane is left. As a last resort, the owner can
178
+ open `caddis-run codex -m gpt-6-astra` and ask it to follow this same subsection.
150
179
 
151
180
  **Advisory-Hub mode (conditional — OFF by default).** Check whether a companion file
152
181
  `<plan-dir>/<plan-stem>-advisory-context.md` exists (e.g. plan `.caddis/plans/foo.md` → look for
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: mermaid-diagrams
3
3
  context: fork
4
- description: Create software diagrams using Mermaid text-based syntax. Use for class diagrams (domain modeling, OOP design), sequence diagrams (API flows, interactions), flowcharts (processes, algorithms, user journeys), ERD (database schemas), C4 architecture diagrams, state diagrams, git graphs, gantt charts, and data visualization.
4
+ description: "Software diagrams in Mermaid: class, sequence, flowchart, ERD, C4, state, git graph, gantt. Use for domain models, API flows, processes and database schemas."
5
5
  ---
6
6
 
7
7
  # Mermaid Diagramming
@@ -20,6 +20,14 @@ An unknown flag returns a usage error.
20
20
  The exit codes follow `caddis_exit.py`: 0 clean, 1 blocked, 2 advisory, 3 could not run,
21
21
  4 error or bad usage. In particular, `caddis_adhoc.py` returns 4 for bad usage.
22
22
 
23
+ ## Three rules: one attempt, one review
24
+ 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).
25
+ 2. **Run it before review.** The coder runs the same checks as CI (name the exact commands in the task). Then run the change once on real data.
26
+ 3. **Review once.** Use whatever reviewer is available. Stop at the first CLEAN. After two blocking reviews, ask the owner.
27
+
28
+ `/mmr` is for handing a task to another model, not for normal reviews. For a normal review, use
29
+ `/cross-review`.
30
+
23
31
  ## Natural Language Triggers
24
32
  You can trigger MMR naturally without typing the full slash command:
25
33
  - *"Run this on another lane: &lt;task&gt;"* &rarr; `/mmr "<task>"`
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: particle-art
3
3
  version: 1.0.0
4
- description: Generate animated particle art React/Next.js components — zero dependencies, spring physics, CSS-variable theming, DPR-correct canvas, mouse interaction. Use when the user wants animated hero art, a living logo, a branded initial or monogram, a constellation background, or any "particles that form a shape". Triggers on "particle animation", "node network", "animated letter/logo/initials", "living letter", "morphing particles", "constellation", "neural net art", "dot field", "stipple portrait", "halftone animation", "ASCII art animation", "background art for my site", or "art that reacts to mouse". Covers — text/initials → spring-node letter; preset patterns (constellation, helix, spiral, DNA, hex-grid, wave, infinity); custom SVG paths; custom polygon points; Unicode halftone stipple; Gaussian dot field with sparks; SVG circuit traces; hybrid combos. Outputs a complete, self-contained, copy-paste-ready React component. Prefer this over p5.js (zero-dep, React-native, TypeScript), tsParticles (richer spring physics, CSS-var theming), Three.js (lightweight, no WebGL).
4
+ description: Zero-dependency animated particle art as a React/Next.js component (spring physics, CSS-variable theming, mouse interaction). Use for animated hero art or a living logo, or on "particles that form a shape", "particle animation", "node network", "animated letter/logo/initials", "living letter", "morphing particles", "constellation", "neural net art", "dot field", "stipple portrait", "halftone animation", "ASCII art animation", "background art for my site", or "art that reacts to mouse".
5
5
  ---
6
6
 
7
7
  # Particle Art Generator
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: playwright
3
3
  context: fork
4
- description: Complete browser automation with Playwright. Auto-detects dev servers, writes clean test scripts to /tmp. Test pages, fill forms, take screenshots, check responsive design, validate UX, test login flows, check links, automate any browser task. Use when user wants to test websites, automate browser interactions, validate web functionality, or perform any browser-based testing.
4
+ description: "Browser automation and testing with Playwright: auto-detects dev servers; tests pages, forms, logins, links, screenshots and responsive layouts. Use to test websites or automate any browser task."
5
5
  ---
6
6
 
7
7
  **IMPORTANT - Path Resolution:**
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: port-to-github
3
- description: Move (port) an app or repository to GitHub from ANY source - a Gitea/GitLab/any git server URL, a local folder, a network (UNC) share, or a folder on a remote Windows box reached over WinRM - with or without existing git history. Keeps every branch and tag, verifies by SHA, translates Gitea/Forgejo Actions CI, enforces a source-only content policy (runtimes, binaries, data exports and dependencies stay out of the repo, over ALL history, with a runtime manifest and provisioning script so the environment is still reproducible), switches deploy checkouts to GitHub with automatic rollback, and retires the old host safely. Use when the user says "move this app to GitHub", "port X to GitHub", "migrate from Gitea", "put this folder on GitHub", "this app only exists on the server", "import the repo from the prod box", "keep binaries / MariaDB / PHP out of the repo", "check the repo only holds source", or "cut the deploy over to GitHub".
3
+ description: Port an app or repo to GitHub from any source (git server, local folder, UNC share, Windows box over WinRM) — all branches and tags, SHA-verified, CI translated, history kept source-only, deploy cut over with rollback. Use when the user says "move this app to GitHub", "port X to GitHub", "migrate from Gitea", "put this folder on GitHub", "this app only exists on the server", "import the repo from the prod box", "keep binaries / MariaDB / PHP out of the repo", "check the repo only holds source", or "cut the deploy over to GitHub".
4
4
  ---
5
5
 
6
6
  # port-to-github
@@ -94,13 +94,38 @@ what failed.
94
94
 
95
95
  Watch the PR's checks job-by-job until completion:
96
96
  - Gitea lane: poll the run for the PR's head SHA via the API (`deploy-local` skill procedure).
97
- - GitHub lane: `gh pr checks <pr> --watch` / `gh run watch` (`gh-cli` skill).
97
+ - GitHub lane: first record the head you are about to watch, then wait for PR checks outside the Claude session via `ci-watch`:
98
+ ```bash
99
+ gh pr view <pr> --json headRefOid # write down headRefOid as <watched-sha>
100
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --pr <pr>
101
+ ```
102
+ Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify the cause, apply the minimum source fix, and re-push (stop before merging); **3** could not tell → stop and report, do not merge.
103
+ Fallback when `caddis_lanes.py` is not available: watch in-session with `gh pr checks <pr> --watch` / `gh run watch` (`gh-cli` skill).
98
104
  - If any check fails (red check): report the failure, classify the cause, and **stop before merging**.
99
105
  Do not merge a failing PR. Apply the minimum source fix and re-push.
100
106
 
107
+ ## Step 6b — Deploy boundary (before the merge; nothing skips it)
108
+
109
+ The PR exists and is green. Run this before the merge:
110
+
111
+ ```bash
112
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" deploy-boundary --repo .
113
+ ```
114
+
115
+ Exit **0** — go on to Step 7. Exit **1** (a push to the default branch deploys to production), exit
116
+ **3** (it cannot tell), or any other non-zero code — **stop. Do not merge.** Hand the merge to the
117
+ owner with the PR link; skip Steps 7–9. Show the gate's output and end the command. This holds
118
+ whatever confirmation was given: `--yes`, a confirm flag, "just merge it" or an earlier approval
119
+ cannot bypass it.
120
+
101
121
  ## Step 7 — Merge to default branch
102
122
 
103
123
  Once all required checks are **green**, there are no merge conflicts, and review requirements are satisfied:
124
+ - Re-read PR head and merge state before merging (GitHub lane):
125
+ ```bash
126
+ gh pr view <pr> --json headRefOid,mergeStateStatus
127
+ ```
128
+ Merge only when `headRefOid` equals `<watched-sha>`, the head recorded before the watch started and `mergeStateStatus` is `CLEAN` (or `HAS_HOOKS`/`UNSTABLE` only if the repo's own rules allow it; else stop and report). The ci-watch report is a signal, not proof.
104
129
  - Use the repo's configured **merge strategy** — read it from repo settings (Gitea repo settings API /
105
130
  `gh repo view --json squashMergeAllowed,mergeCommitAllowed,rebaseMergeAllowed`) and `AGENTS.md`;
106
131
  an explicit argument wins. Options: **squash**, **merge-commit**, rebase-merge. **Don't assume** —
@@ -114,7 +139,12 @@ Once all required checks are **green**, there are no merge conflicts, and review
114
139
 
115
140
  If the default branch triggers an automated deployment pipeline:
116
141
  - Gitea: `lint_and_test` → `deploy_prod` → `release_metadata` (`deploy-local` skill).
117
- - GitHub: `gh run watch <run-id> --exit-status` on the default branch. If CI-only, note that no deploy occurs.
142
+ - GitHub: wait for the deploy run on the default branch outside the Claude session via `ci-watch`:
143
+ ```bash
144
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --run <run-id>
145
+ ```
146
+ Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix; **3** could not tell → stop, report, and **skip cleanup** (Step 9).
147
+ Fallback when `caddis_lanes.py` is not available: watch in-session with `gh run watch <run-id> --exit-status` on the default branch (`gh-cli` skill). If CI-only, note that no deploy occurs.
118
148
  - Validate health and deployed SHA if a live service is deployed. If deploy validation fails, report
119
149
  immediately and **skip cleanup** (Step 9).
120
150
 
@@ -143,6 +173,7 @@ Cleanup: remote branch deleted / local branch deleted / backup ref dropped
143
173
  ## Rules
144
174
 
145
175
  - Never merge a PR whose required checks are red or absent.
176
+ - Never merge unless `deploy-boundary` exited 0 on this run. No confirmation overrides it.
146
177
  - Never delete a feature branch before its merge is confirmed and any deploy validated.
147
178
  - Never `git add -A` without reviewing `git status` first (stage named files only).
148
179
  - Never force-push without a `backup/*-preship` recovery ref; force pushes are `--force-with-lease` only.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: python-development
3
- description: Modern Python development with Python 3.12+, Django, FastAPI, async patterns, and production best practices. Use for Python projects, APIs, data processing, or automation scripts.
3
+ description: Modern Python 3.12+ (Django, FastAPI, async) with production best practices. Use for Python projects, APIs, data processing or scripts.
4
4
  source: wshobson/agents
5
5
  license: MIT
6
6
  ---
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: rca
3
+ description: Record a root cause in one step — .caddis/rca/<date>-<slug>.md — or close one with the fixing commit
4
+ ---
5
+
6
+ # /caddis:rca — record a root cause, or close one
7
+
8
+ A root cause found mid-task gets forgotten by the next session that hits the same symptom. This
9
+ command writes one down in a single step, and closes it later with the commit that fixed it.
10
+
11
+ The request is **$ARGUMENTS**.
12
+
13
+ ## Mode select
14
+
15
+ | `$ARGUMENTS` | Do this |
16
+ |---|---|
17
+ | starts with `done ` | Go to **Close mode** |
18
+ | anything else | Go to **File mode** — the text is the symptom |
19
+
20
+ ---
21
+
22
+ ## File mode
23
+
24
+ ### Step 1 — build the slug
25
+ Lower-case the symptom text, replace each run of characters outside `a-z0-9` with one `-`, trim
26
+ `-` from both ends, cap at 60 characters (`Login fails: 401!` → `login-fails-401`). If nothing is left after cleaning, **stop and ask the user for a shorter title** — the
27
+ one question this command may ask.
28
+
29
+ ### Step 2 — pick the path
30
+ `.caddis/rca/<YYYY-MM-DD>-<slug>.md`, using today's date (UTC). Create `.caddis/rca/` first if it
31
+ does not exist.
32
+
33
+ **If that exact path already exists, refuse — never overwrite it.** Print the existing path and
34
+ stop; the user can open it directly, or pick different (more specific) symptom text so the slug
35
+ comes out differently.
36
+
37
+ ### Step 3 — write the file
38
+
39
+ ```markdown
40
+ ---
41
+ type: rca
42
+ status: open
43
+ found: <YYYY-MM-DD>
44
+ ---
45
+
46
+ # <symptom, verbatim>
47
+
48
+ ## Symptom
49
+ <what was observed — the exact error, command, or behaviour>
50
+
51
+ ## Root cause
52
+ <why it happened, not just what happened>
53
+
54
+ ## Fix
55
+ <what changed to remove the cause>
56
+
57
+ ## How verified
58
+ <the command or check that proves the fix, and its result>
59
+ ```
60
+
61
+ Leave a section as its one-line prompt if the answer is not known yet — `/rca done` below is where
62
+ it gets filled in for real.
63
+
64
+ ### Step 4 — verify
65
+
66
+ ```bash
67
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" docs-check --root .
68
+ ```
69
+
70
+ Exit 0 means the header is valid. Do not report the item as filed until this passes.
71
+
72
+ ### Step 5 — report
73
+ One line: the path. Nothing else.
74
+
75
+ ---
76
+
77
+ ## Close mode — `done <file>`
78
+
79
+ `<file>` is a path under `.caddis/rca/`, optionally followed by a commit SHA.
80
+
81
+ 1. If the file does not exist, say so and change nothing.
82
+ 2. If its header does not carry `type: rca`, say so and change nothing.
83
+ 3. If its `status:` is already `done`, say so and change nothing — closing an already-closed RCA is
84
+ a no-op, not a re-close.
85
+ 4. Otherwise set `status: done` and add `commit: <short SHA>` to the header. The SHA is whatever the
86
+ user gave after the filename in `$ARGUMENTS`; if none was given, use `git rev-parse --short HEAD`.
87
+ It must match `^[0-9a-f]{7,40}$`; if it does not, say so and change nothing.
88
+ 5. Fill in **Root cause**, **Fix**, and **How verified** only with facts from this session or the
89
+ fixing commit. A section you do not know stays as its Step 3 prompt; never guess.
90
+ 6. Run the Step 4 docs-check. If it does not exit 0, restore the file and report the error.
91
+ 7. Report the path and the recorded commit. Nothing else.
92
+
93
+ ## Rules
94
+ - **Never** overwrite an existing RCA file. A repeat symptom is either the same file (edit it by
95
+ hand) or genuinely different (use different symptom text so the slug comes out different).
96
+ - This command records facts about what already happened; it does not investigate or fix anything
97
+ itself.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: react-dev
3
3
  version: 1.0.0
4
- description: This skill should be used when building React components with TypeScript, typing hooks, handling events, or when React TypeScript, React 19, Server Components are mentioned. Covers type-safe patterns for React 18-19 including generic components, proper event typing, and routing integration (TanStack Router, React Router).
4
+ description: "Type-safe React 18-19 with TypeScript: components, generic components, hooks, events, Server Components, TanStack Router and React Router. Use when React TypeScript or React 19 is involved."
5
5
  ---
6
6
 
7
7
  # React TypeScript
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: safe-cleanup
3
- description: Use BEFORE deleting any directory tree, clearing a scratchpad, removing git worktrees, or "tidying up" generated folders - especially on Windows, where a recursive delete that meets a junction or symlink destroys the link's TARGET. Also use when verifying that a Python venv or node_modules survived a cleanup, because pip check and file counts both report healthy on a half-deleted environment.
3
+ description: Use BEFORE deleting a directory tree, scratchpad or git worktree, or "tidying up" generated folders, especially on Windows, where deleting through a junction or symlink destroys its target; and to verify a venv or node_modules survived.
4
4
  ---
5
5
 
6
6
  # Safe Cleanup
@@ -9,10 +9,11 @@ Ship the current working changes via this repo's actual delivery pipeline. The p
9
9
  repo, so **detect it first**, then follow the matching lane. Preflight, staging, and commit are
10
10
  identical across lanes; only monitoring and validation differ.
11
11
 
12
- > **This is the express lane** — on repos where a push to the default branch deploys, `/ship` sends
13
- > work straight to prod with no review pause. Right for a hotfix. **For feature work, use the
14
- > reviewed lane instead: `/ship-pr`** (open a PR, monitor CI, stop at green) **→ `/ship-merge`**
15
- > (merge the green PR behind a deploy-confirm, validate, clean up).
12
+ > **This is the express lane** — it pushes straight to the default branch with no review pause.
13
+ > Right for a hotfix. On a repo where that push deploys to production, Step 2c stops it before the
14
+ > push and the owner merges. **For feature work, use the reviewed lane instead: `/ship-pr`** (open a
15
+ > PR, monitor CI, stop at green) **→ `/ship-merge`** (merge the green PR behind a deploy-confirm,
16
+ > validate, clean up).
16
17
 
17
18
  Optional message: **$ARGUMENTS** (if empty, derive a conventional commit message from staged changes)
18
19
 
@@ -63,6 +64,19 @@ over 400 changed lines. No judgement in any of those — deliberately, because j
63
64
  what failed.
64
65
  <!-- /shared:cross-review-trigger -->
65
66
 
67
+ **2c. DEPLOY BOUNDARY** — before the push; nothing skips it:
68
+
69
+ ```bash
70
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" deploy-boundary --repo .
71
+ ```
72
+
73
+ Exit **0** (no deploy signal found) — push. Exit **1** (a push to the default branch deploys to
74
+ production), exit **3** (it cannot tell), or any other non-zero code — **stop. Do not merge or push to
75
+ the default branch.** The commit stays local. If it sits on the default branch, move it to a feature
76
+ branch first (`git switch -c <feature-branch>`). Then open a PR with `/ship-pr` and hand the merge
77
+ to the owner with the PR link. Show the gate's output and end the command. This holds whatever confirmation was given:
78
+ `--yes`, a confirm flag, "just merge it" or an earlier approval cannot bypass it.
79
+
66
80
  **3. PUSH** — to the repo's default branch (confirm the branch first; don't assume `main`):
67
81
  ```
68
82
  git push origin <branch>
@@ -81,12 +95,17 @@ Track jobs in order: `lint_and_test` → `frontend_checks` (if present) → `dep
81
95
  `release_metadata` → `notify`. Report status as each job completes. On failure, classify it and apply
82
96
  the minimum fix (see `deploy-local` skill §6).
83
97
 
84
- **GitHub lane** — Watch the run the push triggered via the `gh` CLI:
85
- ```
98
+ **GitHub lane** — Find the run id for the pushed SHA, then wait outside the Claude session via `ci-watch`:
99
+ ```bash
86
100
  gh run list --branch <branch> --limit 1 # find the run id for the pushed SHA
87
- gh run watch <run-id> --exit-status # stream until done; non-zero on failure
101
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --run <run-id>
102
+ ```
103
+ Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix; **3** could not tell → stop and report.
104
+ On failure, pull only the failing job logs:
105
+ ```bash
88
106
  gh run view <run-id> --log-failed # on failure, pull only the failing job logs
89
107
  ```
108
+ Fallback when `caddis_lanes.py` is not available: watch in-session with `gh run watch <run-id> --exit-status` (`gh-cli` skill).
90
109
  Report each job's status as it resolves. On failure, classify it and apply the minimum source fix.
91
110
 
92
111
  **Local-only lane** — no CI; skip monitoring.
@@ -113,6 +132,7 @@ Release tag: <tag> → <sha> | n/a
113
132
 
114
133
  ## Rules
115
134
  - Never push before preflight gates are green.
135
+ - Never push to the default branch unless `deploy-boundary` exited 0 on this run.
116
136
  - Never use `git add -A` without reviewing `git status` first.
117
137
  - Do not edit a workflow file (`.gitea/workflows/` or `.github/workflows/`) to make a failing gate
118
138
  pass — fix the source.
@@ -28,6 +28,20 @@ Resolve the target PR from `$ARGUMENTS`, else the current branch's open PR. No o
28
28
  that and point at `/ship-pr`. Read `AGENTS.md` + the workflow file(s) for the repo's real deploy
29
29
  job names and default branch — never assume.
30
30
 
31
+ ## Step 0b — Deploy boundary (before the confirm; nothing skips it)
32
+
33
+ Run it before asking for any confirmation, in a checkout of the PR's own repository. If the
34
+ PR belongs to another repository, treat that as exit **3**.
35
+
36
+ ```bash
37
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" deploy-boundary --repo .
38
+ ```
39
+
40
+ Exit **0** — go on to Step 1. Exit **1** (a push to the default branch deploys to production), exit
41
+ **3** (it cannot tell), or any other non-zero code — **stop. Do not merge.** Hand the merge to the
42
+ owner with the PR link. Show the gate's output and end the command. This holds whatever confirmation
43
+ was given: `--yes`, a confirm flag, "just merge it" or an earlier approval cannot bypass it.
44
+
31
45
  ## Step 1 — Refuse unless green + mergeable + reviewed
32
46
 
33
47
  All of, per the repo's own rules:
@@ -50,10 +64,24 @@ future run — ask every time, even for the same PR five minutes later.
50
64
 
51
65
  ## Step 3 — Merge
52
66
 
67
+ Re-read PR head and merge state before merging (GitHub lane):
68
+ ```bash
69
+ gh pr view <pr> --json headRefOid,mergeStateStatus
70
+ ```
71
+ Merge only when `headRefOid` equals `<head-sha>` (the head that Step 1 found green and Step 2's
72
+ confirmation named) and `mergeStateStatus` is `CLEAN` (or `HAS_HOOKS`/`UNSTABLE` only if the repo's
73
+ own rules allow it). Otherwise stop and report: a new push needs a fresh Step 1 and a fresh confirm.
74
+ A check report is a signal, not proof.
75
+
53
76
  Use the repo's configured **merge strategy** — read it from repo settings (Gitea repo settings API /
54
77
  `gh repo view --json squashMergeAllowed,mergeCommitAllowed,rebaseMergeAllowed`) and `AGENTS.md`;
55
- an explicit argument wins. Options: **squash**, **merge-commit**, rebase-merge. **Don't assume** —
78
+ an explicit argument wins. Options: **squash**, **merge-commit**, **rebase-merge**. **Don't assume** —
56
79
  if detection is inconclusive, say so and use merge-commit (never silently squash someone's history).
80
+
81
+ Then merge:
82
+ - GitHub: `gh pr merge <pr>` with `--squash` (squash), `--merge` (merge-commit) or `--rebase` (rebase-merge).
83
+ - Gitea: call the Gitea PR merge API with the chosen strategy.
84
+
57
85
  Record the merge SHA.
58
86
 
59
87
  ## Step 4 — Monitor the deploy
@@ -61,8 +89,12 @@ Record the merge SHA.
61
89
  The merge lands on the default branch and triggers the pipeline. Watch it via the lane's skill:
62
90
  - Gitea: `lint_and_test` → `frontend_checks` (if present) → **`deploy_prod`** → `release_metadata`
63
91
  → `notify` (`deploy-local` skill §monitoring; classify + minimum-fix on failure).
64
- - GitHub: `gh run watch <run-id> --exit-status` on the default branch; if the workflow has a deploy
65
- job, watch it through; if CI-only, note that no deploy occurs.
92
+ - GitHub: wait for the deploy run on the default branch outside the Claude session via `ci-watch`:
93
+ ```bash
94
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --run <run-id>
95
+ ```
96
+ Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix; **3** could not tell → stop, report, and **skip cleanup** (Step 6).
97
+ Fallback when `caddis_lanes.py` is not available: watch in-session with `gh run watch <run-id> --exit-status` on the default branch (`gh-cli` skill). If the workflow has a deploy job, watch it through; if CI-only, note that no deploy occurs.
66
98
 
67
99
  ## Step 5 — Post-deploy validation
68
100
 
@@ -94,6 +126,7 @@ Cleanup: remote branch ✗ deleted / local ✗ deleted / backup ref droppe
94
126
 
95
127
  ## Rules
96
128
  - Never merge without: green required checks **and** the explicit human deploy-confirm.
129
+ - Never merge unless `deploy-boundary` exited 0 on this run. No confirmation overrides it.
97
130
  - Never delete a branch before its deploy is validated green.
98
131
  - Never `git add -A` without reviewing `git status`; never edit a workflow file to make a gate pass.
99
132
  - Local-only lane: no PR, no merge — refuse and point at `/ship`.
@@ -103,7 +103,12 @@ what failed.
103
103
  Watch the PR's checks job-by-job (never the deploy — PRs don't deploy here), including the
104
104
  scope-guard check when present:
105
105
  - Gitea lane: poll the run for the PR's head SHA via the API (`deploy-local` skill procedure).
106
- - GitHub lane: `gh pr checks <pr> --watch` / `gh run watch` (`gh-cli` skill).
106
+ - GitHub lane: wait for PR checks outside the Claude session via `ci-watch`:
107
+ ```bash
108
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --pr <pr>
109
+ ```
110
+ Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix, then re-push (through Step 4's safety if history must change); **3** could not tell → stop and report, do not merge.
111
+ Fallback when `caddis_lanes.py` is not available: watch in-session with `gh pr checks <pr> --watch` / `gh run watch` (`gh-cli` skill).
107
112
  On a red check, classify the failure and apply the minimum **source** fix, then re-push (through
108
113
  Step 4's safety if history must change).
109
114
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: skill-creator
3
3
  context: fork
4
- description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
4
+ description: Create, edit and improve skills, run evals and benchmarks, and optimize a skill's description for triggering accuracy.
5
5
  ---
6
6
 
7
7
  # Skill Creator
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sql
3
- description: Write high-quality, optimized SQL with best practices for performance, NULL handling, security, and readability. Database-agnostic patterns with dialect-specific notes.
3
+ description: "Write optimized, secure, readable SQL: performance, NULL handling, dialect-specific notes."
4
4
  ---
5
5
 
6
6
  # SQL Expert Skill