@caddis/cli 0.4.34 → 0.4.35

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 (166) 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 +185 -4
  6. package/bundles/antigravity-plugin/scripts/caddis_inventory.py +9 -9
  7. package/bundles/antigravity-plugin/scripts/caddis_relay_git.py +159 -0
  8. package/bundles/antigravity-plugin/scripts/caddis_tidy.py +579 -40
  9. package/bundles/antigravity-plugin/scripts/caddis_todo.py +462 -0
  10. package/bundles/antigravity-plugin/scripts/caddis_workstreams.py +631 -0
  11. package/bundles/antigravity-plugin/scripts/check_doc_coverage.py +27 -13
  12. package/bundles/antigravity-plugin/scripts/oss_review.py +30 -3
  13. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +5 -0
  14. package/bundles/antigravity-plugin/scripts/usage_review.py +2 -2
  15. package/bundles/antigravity-plugin/session_end_agy.py +16 -1
  16. package/bundles/antigravity-plugin/skills/_registry.md +34 -32
  17. package/bundles/antigravity-plugin/skills/adopt-app/SKILL.md +1 -1
  18. package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +1 -1
  19. package/bundles/antigravity-plugin/skills/api-design/SKILL.md +1 -1
  20. package/bundles/antigravity-plugin/skills/backend-development/SKILL.md +1 -1
  21. package/bundles/antigravity-plugin/skills/catchup/SKILL.md +31 -33
  22. package/bundles/antigravity-plugin/skills/ci-cd-pipeline/SKILL.md +1 -1
  23. package/bundles/antigravity-plugin/skills/code-documentation/SKILL.md +1 -1
  24. package/bundles/antigravity-plugin/skills/code-review/SKILL.md +1 -1
  25. package/bundles/antigravity-plugin/skills/codebase-audit/SKILL.md +1 -1
  26. package/bundles/antigravity-plugin/skills/confluence-hla/SKILL.md +1 -1
  27. package/bundles/antigravity-plugin/skills/cross-review/SKILL.md +9 -1
  28. package/bundles/antigravity-plugin/skills/css-architecture/SKILL.md +1 -1
  29. package/bundles/antigravity-plugin/skills/dashboard-perf-sweep/SKILL.md +1 -1
  30. package/bundles/antigravity-plugin/skills/database-design/SKILL.md +1 -1
  31. package/bundles/antigravity-plugin/skills/db-diagram/SKILL.md +1 -1
  32. package/bundles/antigravity-plugin/skills/decide/SKILL.md +61 -0
  33. package/bundles/antigravity-plugin/skills/digress/SKILL.md +41 -23
  34. package/bundles/antigravity-plugin/skills/error-handling/SKILL.md +1 -1
  35. package/bundles/antigravity-plugin/skills/explainer-doc/SKILL.md +1 -1
  36. package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +5 -0
  37. package/bundles/antigravity-plugin/skills/frontend-design/SKILL.md +1 -1
  38. package/bundles/antigravity-plugin/skills/gate-preflight/SKILL.md +12 -0
  39. package/bundles/antigravity-plugin/skills/handoff/SKILL.md +74 -13
  40. package/bundles/antigravity-plugin/skills/implement/SKILL.md +21 -0
  41. package/bundles/antigravity-plugin/skills/mermaid-diagrams/SKILL.md +1 -1
  42. package/bundles/antigravity-plugin/skills/mmr/SKILL.md +8 -0
  43. package/bundles/antigravity-plugin/skills/particle-art/SKILL.md +1 -1
  44. package/bundles/antigravity-plugin/skills/playwright/SKILL.md +1 -1
  45. package/bundles/antigravity-plugin/skills/port-to-github/SKILL.md +1 -1
  46. package/bundles/antigravity-plugin/skills/pr-merge/SKILL.md +15 -0
  47. package/bundles/antigravity-plugin/skills/python/SKILL.md +1 -1
  48. package/bundles/antigravity-plugin/skills/rca/SKILL.md +97 -0
  49. package/bundles/antigravity-plugin/skills/react-dev/SKILL.md +1 -1
  50. package/bundles/antigravity-plugin/skills/safe-cleanup/SKILL.md +1 -1
  51. package/bundles/antigravity-plugin/skills/ship/SKILL.md +19 -4
  52. package/bundles/antigravity-plugin/skills/ship-merge/SKILL.md +15 -0
  53. package/bundles/antigravity-plugin/skills/skill-creator/SKILL.md +1 -1
  54. package/bundles/antigravity-plugin/skills/sql/SKILL.md +1 -1
  55. package/bundles/antigravity-plugin/skills/tech-explainer/SKILL.md +7 -12
  56. package/bundles/antigravity-plugin/skills/technical-writing/SKILL.md +1 -1
  57. package/bundles/antigravity-plugin/skills/test-strategy/SKILL.md +1 -1
  58. package/bundles/antigravity-plugin/skills/ui-review/SKILL.md +1 -1
  59. package/bundles/antigravity-plugin/skills/using-git-worktrees/SKILL.md +1 -1
  60. package/bundles/antigravity-plugin/skills/warm-editorial-ui/SKILL.md +1 -1
  61. package/bundles/antigravity-plugin/skills/webapp-testing/SKILL.md +1 -1
  62. package/bundles/antigravity-plugin/skills/windows-deployment/SKILL.md +1 -1
  63. package/bundles/antigravity-plugin/warm_start_agy.py +138 -42
  64. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  65. package/bundles/antigravity-plugin-extras/skills/_registry.md +61 -61
  66. package/bundles/antigravity-plugin-extras/skills/agent-md-refactor/SKILL.md +1 -1
  67. package/bundles/antigravity-plugin-extras/skills/agent-orchestration/SKILL.md +1 -1
  68. package/bundles/antigravity-plugin-extras/skills/algorithmic-art/SKILL.md +1 -1
  69. package/bundles/antigravity-plugin-extras/skills/api-client-patterns/SKILL.md +1 -1
  70. package/bundles/antigravity-plugin-extras/skills/architecture-diagram/SKILL.md +1 -1
  71. package/bundles/antigravity-plugin-extras/skills/architecture-document/SKILL.md +1 -1
  72. package/bundles/antigravity-plugin-extras/skills/artifacts-builder/SKILL.md +1 -1
  73. package/bundles/antigravity-plugin-extras/skills/ascii-art/SKILL.md +1 -1
  74. package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/SKILL.md +1 -1
  75. package/bundles/antigravity-plugin-extras/skills/aws-cdk-development/SKILL.md +1 -1
  76. package/bundles/antigravity-plugin-extras/skills/aws-cost-operations/SKILL.md +1 -1
  77. package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/SKILL.md +1 -1
  78. package/bundles/antigravity-plugin-extras/skills/backend-to-frontend-handoff/SKILL.md +1 -1
  79. package/bundles/antigravity-plugin-extras/skills/banner-design/SKILL.md +1 -1
  80. package/bundles/antigravity-plugin-extras/skills/brand-design/SKILL.md +1 -1
  81. package/bundles/antigravity-plugin-extras/skills/brand-guidelines/SKILL.md +1 -1
  82. package/bundles/antigravity-plugin-extras/skills/brand-voice/SKILL.md +1 -1
  83. package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/SKILL.md +3 -7
  84. package/bundles/antigravity-plugin-extras/skills/building-mcp-server-on-cloudflare/SKILL.md +3 -7
  85. package/bundles/antigravity-plugin-extras/skills/canvas-design/SKILL.md +1 -1
  86. package/bundles/antigravity-plugin-extras/skills/changelog-generator/SKILL.md +1 -1
  87. package/bundles/antigravity-plugin-extras/skills/code-explainer/SKILL.md +1 -1
  88. package/bundles/antigravity-plugin-extras/skills/component-testing/SKILL.md +1 -1
  89. package/bundles/antigravity-plugin-extras/skills/cross-review/SKILL.md +10 -2
  90. package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/SKILL.md +1 -1
  91. package/bundles/antigravity-plugin-extras/skills/data-loader/SKILL.md +1 -1
  92. package/bundles/antigravity-plugin-extras/skills/data-validation/SKILL.md +1 -1
  93. package/bundles/antigravity-plugin-extras/skills/deploy-local/SKILL.md +1 -1
  94. package/bundles/antigravity-plugin-extras/skills/design-md/SKILL.md +1 -1
  95. package/bundles/antigravity-plugin-extras/skills/design-system-tokens/SKILL.md +1 -1
  96. package/bundles/antigravity-plugin-extras/skills/developer-growth-analysis/SKILL.md +1 -1
  97. package/bundles/antigravity-plugin-extras/skills/doc-coauthoring/SKILL.md +1 -1
  98. package/bundles/antigravity-plugin-extras/skills/documentation-analyzer/SKILL.md +1 -1
  99. package/bundles/antigravity-plugin-extras/skills/enterprise-dashboard-aesthetic-system/SKILL.md +1 -1
  100. package/bundles/antigravity-plugin-extras/skills/file-organizer/SKILL.md +1 -1
  101. package/bundles/antigravity-plugin-extras/skills/game-changing-features/SKILL.md +1 -1
  102. package/bundles/antigravity-plugin-extras/skills/golden-nuggets/SKILL.md +1 -1
  103. package/bundles/antigravity-plugin-extras/skills/golden-plan/SKILL.md +1 -1
  104. package/bundles/antigravity-plugin-extras/skills/hld/SKILL.md +1 -1
  105. package/bundles/antigravity-plugin-extras/skills/internal-comms/SKILL.md +1 -1
  106. package/bundles/antigravity-plugin-extras/skills/jira-issues/SKILL.md +1 -1
  107. package/bundles/antigravity-plugin-extras/skills/lld/SKILL.md +1 -1
  108. package/bundles/antigravity-plugin-extras/skills/llm-application-dev/SKILL.md +1 -1
  109. package/bundles/antigravity-plugin-extras/skills/mcp-builder/SKILL.md +1 -1
  110. package/bundles/antigravity-plugin-extras/skills/monorepo/SKILL.md +1 -1
  111. package/bundles/antigravity-plugin-extras/skills/nextjs-app-router/SKILL.md +1 -1
  112. package/bundles/antigravity-plugin-extras/skills/observability/SKILL.md +1 -1
  113. package/bundles/antigravity-plugin-extras/skills/performance-testing/SKILL.md +1 -1
  114. package/bundles/antigravity-plugin-extras/skills/popular-web-designs/SKILL.md +1 -1
  115. package/bundles/antigravity-plugin-extras/skills/prd-to-code/SKILL.md +1 -1
  116. package/bundles/antigravity-plugin-extras/skills/react-useeffect/SKILL.md +1 -1
  117. package/bundles/antigravity-plugin-extras/skills/receiving-code-review/SKILL.md +1 -1
  118. package/bundles/antigravity-plugin-extras/skills/responsive-mobile-native/SKILL.md +4 -9
  119. package/bundles/antigravity-plugin-extras/skills/safe-cleanup/SKILL.md +1 -1
  120. package/bundles/antigravity-plugin-extras/skills/schema-migration/SKILL.md +1 -1
  121. package/bundles/antigravity-plugin-extras/skills/setup-project-ai/SKILL.md +1 -1
  122. package/bundles/antigravity-plugin-extras/skills/shadcn-radix/SKILL.md +1 -1
  123. package/bundles/antigravity-plugin-extras/skills/sketch/SKILL.md +1 -1
  124. package/bundles/antigravity-plugin-extras/skills/streamlit-dev/SKILL.md +1 -1
  125. package/bundles/antigravity-plugin-extras/skills/theme-factory/SKILL.md +1 -1
  126. package/bundles/antigravity-plugin-extras/skills/ui-styling-patterns/SKILL.md +1 -1
  127. package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/SKILL.md +1 -1
  128. package/bundles/antigravity-plugin-extras/skills/understand-anything/SKILL.md +5 -9
  129. package/bundles/antigravity-plugin-extras/skills/update-readme/SKILL.md +1 -1
  130. package/bundles/antigravity-plugin-extras/skills/word-cloud/SKILL.md +1 -1
  131. package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +1 -1
  132. package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +1 -1
  133. package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +1 -1
  134. package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +1 -1
  135. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +1 -1
  136. package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +1 -1
  137. package/bundles/codex/.codex/skills/coding/python/SKILL.md +1 -1
  138. package/bundles/codex/.codex/skills/coding/sql/SKILL.md +1 -1
  139. package/bundles/codex/.codex/skills/data/database-design/SKILL.md +1 -1
  140. package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +1 -1
  141. package/bundles/codex/.codex/skills/devops/adopt-app/SKILL.md +1 -1
  142. package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +1 -1
  143. package/bundles/codex/.codex/skills/devops/port-to-github/SKILL.md +1 -1
  144. package/bundles/codex/.codex/skills/devops/safe-cleanup/SKILL.md +1 -1
  145. package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +1 -1
  146. package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +1 -1
  147. package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +1 -1
  148. package/bundles/codex/.codex/skills/docs/confluence-hla/SKILL.md +1 -1
  149. package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +1 -1
  150. package/bundles/codex/.codex/skills/docs/tech-explainer/SKILL.md +7 -12
  151. package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +1 -1
  152. package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +1 -1
  153. package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +1 -1
  154. package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +1 -1
  155. package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +1 -1
  156. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +1 -1
  157. package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +1 -1
  158. package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +1 -1
  159. package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +1 -1
  160. package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +1 -1
  161. package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +1 -1
  162. package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +1 -1
  163. package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +1 -1
  164. package/bundles/codex/AGENTS.md +5 -1
  165. package/bundles/manifest.json +3 -3
  166. package/package.json +1 -1
@@ -96,10 +96,18 @@ as a diff that silently is not read. Name a provider explicitly only when you ha
96
96
  ## Interpret the exit code
97
97
  - **0 — REVIEW: CLEAN** → no blocking issues. Proceed.
98
98
  - **1 — REVIEW: BLOCKING** → read the printed findings, then **FIX each blocking item** (or explicitly
99
- justify why one is a false positive). Re-run until CLEAN.
99
+ justify why one is a false positive). Re-run once. A second BLOCKING goes to the owner (rule 3).
100
100
  - **4 — error** → no verdict parsed, or a git/endpoint failure. Read stderr; do NOT treat as clean.
101
101
  - **3 — misconfigured** → `REVIEW_API_KEY` is unset. Set it (see Prerequisite) and re-run.
102
102
 
103
+ ## Three rules: one attempt, one review
104
+ 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).
105
+ 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.
106
+ 3. **Review once.** Use whatever reviewer is available. Stop at the first CLEAN. After two blocking reviews, ask the owner.
107
+
108
+ A diff over the batch ceiling is split into batches. Each batch prompt lists every file in the
109
+ change, so a batch does not report the others as missing.
110
+
103
111
  ## Rules
104
112
  - Read-only second opinion — the tool never edits, commits, or pushes. YOU apply fixes in the main thread.
105
113
  - Treat exit **3 or 4** as blocking-unknown, never as approval (the tool is fail-closed by
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: css-architecture
3
- description: CSS architecture, design token strategy, Tailwind conventions, CSS Modules, container queries, dark mode, responsive patterns, and animation architecture. Use for design token naming, CSS custom properties, Tailwind config, container queries, dark mode implementation, fluid typography, or CSS animation decisions. Complements frontend-design (what to achieve) with how to implement it.
3
+ description: "CSS architecture: design tokens, custom properties, Tailwind config, CSS Modules, container queries, dark mode, fluid typography, animation. Covers how to implement styling; frontend-design covers what to achieve."
4
4
  ---
5
5
 
6
6
  # CSS Architecture Skill
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: dashboard-perf-sweep
3
3
  context: fork
4
- description: Re-measure an app's dashboard/API endpoints for load-time regressions and decide, with a documented checklist (not a black-box verdict), whether a slow one is a candidate for the rs-kit summary-table refresher pattern — or needs an index, keyset paging, gzip, or nothing at all. Use when the user says "sweep dashboard performance", "check if this app needs rs-kit", "re-measure the perf tracker", "is this endpoint a refresher candidate", or when a dashboard-performance-tracker.md is stale and needs re-validating. Read-only by default (dev servers only; prod requires an explicit opt-in and human confirmation) and human-invoked, never scheduled -- it surfaces candidates, it does not enroll them.
4
+ description: Re-measure dashboard/API endpoints for load-time regressions and decide by checklist if a slow one needs the rs-kit refresher, an index, keyset paging, gzip, or nothing. Use when the user says "sweep dashboard performance", "check if this app needs rs-kit", "re-measure the perf tracker", "is this endpoint a refresher candidate", or dashboard-performance-tracker.md is stale. Read-only.
5
5
  ---
6
6
 
7
7
  # dashboard-perf-sweep — re-measure, then judge the shape, not just the time
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: database-design
3
- description: Database schema design, optimization, and migration patterns for PostgreSQL, MySQL, and NoSQL databases. Use for designing schemas, writing migrations, or optimizing queries.
3
+ description: Database schema design, migrations and query optimization for PostgreSQL, MySQL and NoSQL.
4
4
  source: wshobson/agents
5
5
  license: MIT
6
6
  ---
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: db-diagram
3
3
  context: fork
4
- description: Turn a SQL artifact — a stored procedure, view, query, .sql file, or table name — into a diagram that explains it to a human. Use when the user says "diagram this query/proc/view/schema", "explain this SQL visually", "draw the ER diagram", "show me the data flow of this stored proc", "/mermaid-db", or "/excalidraw-db". Produces Mermaid (default, git-diffable) or Excalidraw (for design reviews). Read-only — never touches the database.
4
+ description: Diagram a SQL artifact (stored proc, view, query, .sql file, table) as Mermaid or Excalidraw. Use when the user says "diagram this query/proc/view/schema", "explain this SQL visually", "draw the ER diagram", "show me the data flow of this stored proc", "/mermaid-db", or "/excalidraw-db". Read-only.
5
5
  ---
6
6
 
7
7
  # db-diagram — explain SQL as a diagram
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: decide
3
+ description: Record a decision in one step — .caddis/decisions/<date>-<slug>.md
4
+ ---
5
+
6
+ # /caddis:decide — record a decision, once, before it gets re-litigated
7
+
8
+ A decision made mid-task and never written down gets re-argued the next time someone hits the same
9
+ fork. This command writes it as a single-step decision record.
10
+
11
+ The request is **$ARGUMENTS** — the decision, in a few words.
12
+
13
+ ## Step 1 — build the slug
14
+ Lower-case the decision text, replace each run of characters outside `a-z0-9` with one `-`, trim
15
+ `-` from both ends, cap at 60 characters (`Use SQLite, not Postgres` → `use-sqlite-not-postgres`). If nothing is left after cleaning, **stop and ask the user for a shorter title** — the
16
+ one question this command may ask.
17
+
18
+ ## Step 2 — pick the path
19
+ `.caddis/decisions/<YYYY-MM-DD>-<slug>.md`, using today's date (UTC). Create
20
+ `.caddis/decisions/` first if it does not exist.
21
+
22
+ **If that exact path already exists, refuse — never overwrite it.** Print the existing path and
23
+ stop; the user can open it directly, or pick different (more specific) decision text so the slug
24
+ comes out differently.
25
+
26
+ ## Step 3 — write the file
27
+
28
+ ```markdown
29
+ ---
30
+ type: adr
31
+ status: accepted
32
+ found: <YYYY-MM-DD>
33
+ ---
34
+
35
+ # <decision, verbatim>
36
+
37
+ ## Context
38
+ <what forced the decision — the constraint, the conflicting options>
39
+
40
+ ## Decision
41
+ <what was decided, as one plain sentence>
42
+
43
+ ## Consequences
44
+ <what this makes easier, what it makes harder, what it rules out>
45
+ ```
46
+
47
+ ## Step 4 — verify
48
+
49
+ ```bash
50
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" docs-check --root .
51
+ ```
52
+
53
+ Exit 0 means the header is valid. Do not report the item as filed until this passes.
54
+
55
+ ## Step 5 — report
56
+ One line: the path. Nothing else.
57
+
58
+ ## Rules
59
+ - **Never** overwrite an existing decision file. There is no ID allocator and no revision counter —
60
+ a changed decision is new decision text, which naturally gives it a new slug and a new file.
61
+ - This command records a decision already made; it does not itself weigh the options.
@@ -6,9 +6,9 @@ description: Park the current workstream on the stack and switch to a new task
6
6
  # /caddis:digress — park the current task, switch, never lose the thread
7
7
 
8
8
  You are about to leave the current task for a related-but-different one (a design decision, a sub-feature,
9
- or a blocker that must be fixed first). This command **records the original task on a workstream stack** so
10
- neither you nor the user has to remember and re-state it later — `/catchup [name]` pops it back with its exact
11
- resume point, and every SessionStart surfaces it (`⛏ Parked workstream: …`).
9
+ or a blocker that must be fixed first). This command **saves the original task as a workstream relay** (`.caddis/relay/<name>.md`) so
10
+ neither you nor the user has to remember and re-state it later — `/catchup <name>` loads it back with its exact
11
+ resume point, and every SessionStart lists it in the workstream index. Loading never removes it.
12
12
 
13
13
  The reason for the detour is **$ARGUMENTS** (if empty, derive a one-line reason yourself from what the
14
14
  user just asked for).
@@ -27,30 +27,48 @@ next-not-started one).
27
27
  The single next concrete action for the parked task — copy it from the plan's Tracker or from relay.md's
28
28
  `## Next step`. Example: `next: wire the parser to the staging table (see plan Tracker row 2)`.
29
29
 
30
- ## Step 3 — push the frame onto `.caddis/workstreams.json`
31
- The state file is a JSON object `{"version": 1, "stack": [ … ]}`; `stack` is LIFO (last element = most
32
- recently parked). Each frame has exactly these fields:
33
-
34
- ```json
35
- {
36
- "plan": ".caddis/plans/<slug>.md",
37
- "phase": "<current phase>",
38
- "resumePointer": "<the one-line next action from Step 2>",
39
- "reason": "<$ARGUMENTS or your derived one-liner>",
40
- "repo": null,
41
- "pushedAt": "<now, ISO-8601 UTC>"
42
- }
30
+ ## Step 3 — write the workstream relay to `.caddis/relay/<name>.md`
31
+ Write it through the locked script, never with a plain file edit (that would skip the conflict
32
+ check another session relies on). Scripts are in `${CLAUDE_PLUGIN_ROOT}/scripts/` (source
33
+ checkout: `scripts/`).
34
+
35
+ Your session id is printed at session start as `[caddis] this session's id: <id>`; use it for
36
+ `session_id` and `--session-id`, never a guess.
37
+
38
+ 1. `caddis_workstreams.py hash <name>` — note the printed hash (`none` for a new workstream).
39
+ 2. Put the relay below in a temp file, then
40
+ `caddis_workstreams.py write <name> <temp-file> --expected-hash <hash>`. Exit 1 prints the diff
41
+ against what another session saved and writes nothing: show it, merge, retry with the new hash.
42
+ 3. `caddis_workstreams.py render-index --session-id <id> --branch <branch>` refreshes `.caddis/relay.md`.
43
+ If it refuses a legacy `.caddis/relay.md`, or an old `.caddis/workstreams.json` stack exists, run
44
+ `caddis_workstreams.py migrate-legacy` once (it backs up both), then retry.
45
+
46
+ Relay content, with the standard frontmatter:
47
+
48
+ ```markdown
49
+ ---
50
+ type: relay
51
+ workstream: <name>
52
+ branch: <branch>
53
+ session_id: <session_id>
54
+ plan: <plan>
55
+ generated:
56
+ at: <now, ISO-8601 UTC>
57
+ ---
58
+
59
+ # Relay — <name>
60
+
61
+ ## Current workstream
62
+ <Active plan path + phase>
63
+
64
+ ## Next step (exact)
65
+ <the one-line next action from Step 2>
43
66
  ```
44
67
 
45
- - `repo`: `null` means "the plan lives in THIS repo". If the parked plan lives in a **different** repo, set
46
- `repo` to that repo's absolute path (the digression spanned repos).
47
- - Read the file (create `{"version": 1, "stack": []}` if absent). **Idempotency guard:** if the
48
- top-of-stack frame's `plan` already equals the plan you are parking, UPDATE that frame in place (refresh
49
- `phase`, `resumePointer`, `reason`, `pushedAt`) instead of pushing a duplicate. Otherwise APPEND the new
50
- frame. Preserve any unknown fields already present. Write the whole file back (pretty-printed is fine).
68
+ - **Idempotency:** parking the same workstream again replaces its relay through the same hash-checked write; it never duplicates it.
51
69
 
52
70
  ## Step 4 — confirm, then continue
53
- Tell the user: `Parked: <plan> @ <phase>. Now switching to: <the new task>.` Then proceed with whatever the
71
+ Tell the user: `Parked workstream: <name>. Saved to .caddis/relay/<name>.md. Now switching to: <the new task>.` Then proceed with whatever the
54
72
  user asked — the digression IS the new work.
55
73
 
56
74
  ## Rules
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: error-handling
3
- description: Error handling patterns for Python and TypeScript applications. Use when designing error hierarchies, implementing retry logic, building error boundaries, or establishing logging strategies. Covers custom exceptions, result types, circuit breakers, and user-facing error messages.
3
+ description: "Error handling for Python and TypeScript: error hierarchies, custom exceptions, result types, retries, circuit breakers, error boundaries, logging, user-facing messages."
4
4
  ---
5
5
 
6
6
  # Error Handling Skill
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: explainer-doc
3
3
  context: fork
4
- description: Write a document that hands off work to a team who did NOT do the investigation — an external vendor, another team, a contractor — and who must be able to act on it alone. Use when the user says "write a spec for the X team", "document this for someone outside the team", "explainer doc", "implementation spec for a vendor", "hand this off to Y", or is about to write a design doc whose primary reader did not live through the debugging/design process. NOT for internal specs where the reader already has full context (use technical-writing or writing-plans instead) — this is specifically for the "stranger must follow it alone" case.
4
+ description: Hand-off doc for a team that did NOT do the investigation (vendor, contractor, another team) — the "stranger must follow it alone" case. Use when the user says "write a spec for the X team", "document this for someone outside the team", "explainer doc", "implementation spec for a vendor", or "hand this off to Y". Not for readers with full context.
5
5
  ---
6
6
 
7
7
  # explainer-doc — write for the reader who has no other context
@@ -257,6 +257,11 @@ yourself (relay + Tracker) before stopping — do not hand back "run `/caddis:ha
257
257
  <same structure>
258
258
 
259
259
  ## Execution protocol (standing rules — this plan is the memory, not anyone's head)
260
+ Three rules: one attempt, one review.
261
+ 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).
262
+ 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.
263
+ 3. **Review once.** Use whatever reviewer is available. Stop at the first CLEAN. After two blocking reviews, ask the owner.
264
+
260
265
  - One phase at a time: read this plan → run the phase on its **Lane** → RED→GREEN→VERIFY→CROSS-REVIEW→
261
266
  COMMIT → update the **Tracker** row. The Tracker is the resume signal for every future session.
262
267
  - **Session boundaries:** the executor WRITES the handoff (durable `relay.md` + Tracker) after any
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: frontend-design
3
- description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications. Generates creative, polished code that avoids generic AI aesthetics while strictly adhering to the user's technical standards.
3
+ description: Create distinctive, production-grade frontend interfaces that avoid generic AI aesthetics. Use when the user asks to build web components, pages, artifacts, posters or applications.
4
4
  ---
5
5
 
6
6
  # Frontend Design Skill
@@ -8,6 +8,18 @@ description: Deterministic headless preflight — validates a plan against the a
8
8
  Validate the implementation plan at **$ARGUMENTS** against the ACTUAL codebase before any code is
9
9
  written.
10
10
 
11
+ **Which plan.** An explicit plan argument always wins. Only when `$ARGUMENTS` is empty, find the
12
+ active plan:
13
+
14
+ ```bash
15
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_todo.py" active-plan
16
+ ```
17
+
18
+ - **Exit 0** → stdout is the plan path. Say which plan you picked ("No plan given; using
19
+ `<path>`.") and validate it.
20
+ - **Exit 3** → no single active plan. Do not ask: name the candidates it printed on stderr (or
21
+ "none") and end with `PREFLIGHT: FAIL`.
22
+
11
23
  This command exists because `/caddis:preflight` is a model-invoked `context: fork` **SKILL**, and
12
24
  skills do not reliably activate under headless `claude -p` — proven live (2026-07-08): a run saw
13
25
  the raw `/caddis:code-review <sha-range>` text, didn't recognise it, and replied "I don't see a
@@ -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
@@ -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
@@ -98,6 +98,20 @@ Watch the PR's checks job-by-job until completion:
98
98
  - If any check fails (red check): report the failure, classify the cause, and **stop before merging**.
99
99
  Do not merge a failing PR. Apply the minimum source fix and re-push.
100
100
 
101
+ ## Step 6b — Deploy boundary (before the merge; nothing skips it)
102
+
103
+ The PR exists and is green. Run this before the merge:
104
+
105
+ ```bash
106
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" deploy-boundary --repo .
107
+ ```
108
+
109
+ Exit **0** — go on to Step 7. Exit **1** (a push to the default branch deploys to production), exit
110
+ **3** (it cannot tell), or any other non-zero code — **stop. Do not merge.** Hand the merge to the
111
+ owner with the PR link; skip Steps 7–9. Show the gate's output and end the command. This holds
112
+ whatever confirmation was given: `--yes`, a confirm flag, "just merge it" or an earlier approval
113
+ cannot bypass it.
114
+
101
115
  ## Step 7 — Merge to default branch
102
116
 
103
117
  Once all required checks are **green**, there are no merge conflicts, and review requirements are satisfied:
@@ -143,6 +157,7 @@ Cleanup: remote branch deleted / local branch deleted / backup ref dropped
143
157
  ## Rules
144
158
 
145
159
  - Never merge a PR whose required checks are red or absent.
160
+ - Never merge unless `deploy-boundary` exited 0 on this run. No confirmation overrides it.
146
161
  - Never delete a feature branch before its merge is confirmed and any deploy validated.
147
162
  - Never `git add -A` without reviewing `git status` first (stage named files only).
148
163
  - 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
  ---