@thebassclef/lite 1.1.0 → 1.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +258 -63
- package/dist/cli.js +258 -63
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
- package/dist/lite/.claude/bassclef-orientation.md +120 -0
- package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
- package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
- package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
- package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
- package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
- package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
- package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
- package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
- package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
- package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
- package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
- package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
- package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
- package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
- package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
- package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
- package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
- package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
- package/dist/lite/.claude/hooks/save-state.sh +268 -0
- package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
- package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
- package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
- package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
- package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
- package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
- package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
- package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
- package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
- package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
- package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
- package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
- package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
- package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
- package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
- package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
- package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
- package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
- package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
- package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
- package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
- package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
- package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
- package/dist/lite/.claude/rules/cost-governance.md +154 -0
- package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
- package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
- package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
- package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
- package/dist/lite/.claude/rules/session-artifacts.md +30 -0
- package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
- package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
- package/dist/lite/.claude/rules/usability.md +22 -0
- package/dist/lite/.claude/settings.json +20 -0
- package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
- package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
- package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
- package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
- package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
- package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
- package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
- package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
- package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
- package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
- package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
- package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
- package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
- package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
- package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
- package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
- package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
- package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
- package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
- package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
- package/dist/lite/.claude/skills/release/SKILL.md +311 -0
- package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
- package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
- package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
- package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
- package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
- package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
- package/dist/lite/.claude/skills/state/SKILL.md +204 -0
- package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
- package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
- package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
- package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
- package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
- package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
- package/dist/lite/README.md +5 -1
- package/dist/lite/gitignore +6 -0
- package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
- package/dist/lite/lib/clone-failure-classifier.sh +59 -0
- package/dist/lite/lib/fixture-builder.sh +190 -0
- package/dist/lite/lib/fresh-install-check.sh +49 -0
- package/dist/lite/lib/hook-heartbeat.sh +0 -1
- package/dist/lite/lib/mechanism-fidelity.sh +569 -0
- package/dist/lite/lib/npm-version-check.sh +112 -0
- package/dist/lite/lib/preview-state.sh +229 -0
- package/dist/lite/lib/session-rescue.sh +0 -1
- package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
- package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
- package/dist/lite/standards/architect-review-discipline.md +222 -0
- package/dist/lite/standards/bassclef-platform.md +249 -0
- package/dist/lite/standards/bassclef-test-repos.md +97 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
- package/dist/lite/standards/cold-adopter-harness.md +205 -0
- package/dist/lite/standards/data-management.md +135 -0
- package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
- package/dist/lite/standards/lite-manifest.json +1456 -14
- package/dist/lite/standards/mechanism-fidelity.md +205 -0
- package/dist/lite/standards/operator-private-discipline.md +200 -0
- package/dist/lite/standards/operator-to-public-flow.md +195 -0
- package/dist/lite/standards/prototype-gallery.md +251 -0
- package/dist/lite/standards/pseudonym-key-schema.md +109 -0
- package/dist/lite/standards/sibling-validation-checklist.md +181 -0
- package/dist/lite/standards/slack-notifications.md +161 -0
- package/dist/lite/standards/synthetic-user-testing.md +173 -0
- package/dist/lite/standards/vendor-bindings.md +165 -0
- package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
- package/dist/lite/standards/vpc-fit-validation.md +167 -0
- package/dist/lite/templates/gallery-yml.md +113 -0
- package/dist/lite/templates/product-canvas.md +169 -0
- package/dist/lite/templates/value-prop-canvas.md +180 -0
- package/package.json +12 -5
- /package/dist/lite/{whereami.md → docs/whereami.md} +0 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: autonomous
|
|
4
|
+
description: "Start or check an autonomous SDLC session. Two axes: who approves handoffs (you vs. the agent) and how work runs (one session vs. parallel agents). Defaults to operator-gated + sequential. Entry point for shipping features hands-off."
|
|
5
|
+
problem: "Some sessions need SDLC discipline but no operator to run each step. Ceremony blocks flow."
|
|
6
|
+
value: "Starts or checks an autonomous SDLC session. Two axes \u2014 who approves handoffs and how sequential the work is."
|
|
7
|
+
inputs: [start or check mode, Optional approver axis and sequence flags]
|
|
8
|
+
outputs: [Session goal doc, Handoff sequence, Approval gate list]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
requires:
|
|
12
|
+
cli: [git, gh]
|
|
13
|
+
network: true
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Autonomous Development
|
|
17
|
+
|
|
18
|
+
Entry point for autonomous and semi-autonomous development sessions.
|
|
19
|
+
Invoke at any point in any repo that inherits bassclef.
|
|
20
|
+
|
|
21
|
+
This file is a thin dispatcher. Deep procedural detail lives in:
|
|
22
|
+
|
|
23
|
+
- `strategy/autonomous-dry-run.md` — read-only boot-sequence preview
|
|
24
|
+
- `strategy/autonomous-boot-sequence.md` — `/autonomous start` scaffold +
|
|
25
|
+
activate, including Step 0–9, Construction automation A–E, pre-build
|
|
26
|
+
gates, branch stacking, context management, transition hierarchy
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
/autonomous → about + current readiness (default)
|
|
32
|
+
/autonomous dry-run → full boot sequence validation, read-only
|
|
33
|
+
/autonomous start → scaffold + activate (asks for choices below)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Two choices at boot
|
|
37
|
+
|
|
38
|
+
The agent asks these during Step 1. They are independent axes.
|
|
39
|
+
|
|
40
|
+
**1. Gating** — who approves handoffs between phases:
|
|
41
|
+
|
|
42
|
+
| Gating | What happens | Best for |
|
|
43
|
+
|--------|-------------|----------|
|
|
44
|
+
| **operator-gated** (default) | Agent pauses between phases for your approval. You steer. | Daytime supervised sessions, learning the system |
|
|
45
|
+
| **orchestrator-gated** | Agent chains through all phases autonomously, no pauses | Overnight runs, trusted workflows |
|
|
46
|
+
|
|
47
|
+
**2. Execution mode** — how work is performed:
|
|
48
|
+
|
|
49
|
+
| Mode | What happens | Burst cost | Best for |
|
|
50
|
+
|------|-------------|-----------|----------|
|
|
51
|
+
| **sequential** (default) | One session plays all roles in order. Persona switches, not subagent spawns. | $0 (Pro plan) | Overnight runs, budget-conscious, simpler debugging |
|
|
52
|
+
| **parallel** (opt-in) | Orchestrator spawns subagents per role. Independent work fans out to worktrees. | Burst tokens | Throughput, multi-branch parallel work |
|
|
53
|
+
|
|
54
|
+
### The 2x2
|
|
55
|
+
|
|
56
|
+
| | Sequential | Parallel |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| **Operator-gated** | You drive. All agents available, you approve each phase. One session, persona switches. | Agents fan out to worktrees. You approve each PR/handoff before next starts. |
|
|
59
|
+
| **Orchestrator-gated** | Agent chains through all roles in one session. No pauses. Reviews PRs after. | Full autonomy. Worktree fan-out. Agent merges on Reviewer approval. |
|
|
60
|
+
|
|
61
|
+
Default is **operator-gated + sequential**.
|
|
62
|
+
|
|
63
|
+
**Agent roster**: All agents are always available (Shaper, PM, Designer,
|
|
64
|
+
Architect, Builder, Reviewer, Creative Director, Deployer, Closer). The
|
|
65
|
+
two axes control HOW they run and WHO approves — not which agents exist.
|
|
66
|
+
|
|
67
|
+
In operator-gated mode, YOU decide which agents to invoke and when. In
|
|
68
|
+
orchestrator-gated mode, the system chains through the full choreography.
|
|
69
|
+
|
|
70
|
+
**How sequential mode works:**
|
|
71
|
+
- One continuous session (interactive or headless via `claude -p`)
|
|
72
|
+
- The agent reads the choreography and plays each role in order
|
|
73
|
+
- Between roles, it writes the handoff artifact, then switches persona
|
|
74
|
+
(e.g., "I am now acting as Architect" → reads Architect agent definition
|
|
75
|
+
→ produces ADRs → writes handoff → "I am now acting as Builder")
|
|
76
|
+
- If operator-gated: pauses between phases for approval
|
|
77
|
+
- If orchestrator-gated: chains through all phases without pausing
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## /autonomous (default — about + readiness)
|
|
82
|
+
|
|
83
|
+
Show what autonomous development is, how the 2x2 works, and how ready
|
|
84
|
+
this repo is right now.
|
|
85
|
+
|
|
86
|
+
### 0. Lead with `/value-prop flash` + `/kiss words` summary (bassclef#357)
|
|
87
|
+
|
|
88
|
+
If the repo has a most-recently-completed goal (read via
|
|
89
|
+
`state_iteration_bet_active` / chronicle / git log), open with:
|
|
90
|
+
|
|
91
|
+
- **Flash line** (`/value-prop flash` mode, ≤180 chars): one-sentence
|
|
92
|
+
claim of what last shipped. Plain language. The operator sees this
|
|
93
|
+
before any 2x2 axis explanation.
|
|
94
|
+
- **Kiss summary** (`/kiss words` mode, 2-3 sentences, grade-10
|
|
95
|
+
vocabulary): what delivered last, current readiness shape, and
|
|
96
|
+
what `/autonomous start` would do next. The grounding paragraph.
|
|
97
|
+
|
|
98
|
+
If there's no completed goal (fresh repo, first session), skip this
|
|
99
|
+
step and proceed to Step 1. Don't fabricate a flash where there's no
|
|
100
|
+
delivery to summarize.
|
|
101
|
+
|
|
102
|
+
This is bassclef#357's discipline: every autonomous-run status
|
|
103
|
+
surface opens with delivery, not methodology. Walls of tables come
|
|
104
|
+
AFTER this block, not before.
|
|
105
|
+
|
|
106
|
+
### 1. Explain the two axes
|
|
107
|
+
|
|
108
|
+
**Gating** — who approves handoffs (default: operator-gated):
|
|
109
|
+
|
|
110
|
+
| Gating | When to use |
|
|
111
|
+
|--------|-----------|
|
|
112
|
+
| operator-gated | Daytime sessions, learning the system, steering |
|
|
113
|
+
| orchestrator-gated | Overnight runs, trusted workflows |
|
|
114
|
+
|
|
115
|
+
**Execution mode** — how work runs (default: sequential):
|
|
116
|
+
|
|
117
|
+
| Mode | Burst cost | How it works |
|
|
118
|
+
|------|-----------|-------------|
|
|
119
|
+
| sequential | $0 (Pro plan) | One session, persona switches between roles |
|
|
120
|
+
| parallel | Burst tokens | Subagents spawned per role, worktrees for branches |
|
|
121
|
+
|
|
122
|
+
**Cost**: Sequential mode is $0 burst (Max plan covers everything).
|
|
123
|
+
Parallel mode adds burst cost per subagent spawn.
|
|
124
|
+
|
|
125
|
+
**All agents are always available.** The combination controls behavior:
|
|
126
|
+
|
|
127
|
+
| Combination | Behavior |
|
|
128
|
+
|-------------|----------|
|
|
129
|
+
| Operator + sequential | You drive, invoke agents as needed. Substrate assists with gates. |
|
|
130
|
+
| Operator + parallel | Agents fan out, you approve handoffs. Full ceremony with human steering. |
|
|
131
|
+
| Orchestrator + sequential | Agent chains all roles in one session. No pauses. Best overnight value. |
|
|
132
|
+
| Orchestrator + parallel | Max autonomy and throughput. Subagent spawns, worktree branches. |
|
|
133
|
+
|
|
134
|
+
### 2. Quick readiness check
|
|
135
|
+
|
|
136
|
+
Scan the repo for the key artifacts and report status:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
## Readiness
|
|
140
|
+
|
|
141
|
+
| Artifact | Status | Path |
|
|
142
|
+
|----------|--------|------|
|
|
143
|
+
| Manifest (substrate.config.md) | ✅ Found / ❌ Missing | ... |
|
|
144
|
+
| Phase state (docs/whereami.md) | ✅ / ❌ | ... |
|
|
145
|
+
| Iteration bet | ✅ / ❌ | ... |
|
|
146
|
+
| Risk register (docs/risk-register.md) | ✅ / ❌ / ⚠️ Disabled | ... |
|
|
147
|
+
| Deploy targets | ✅ Configured / ⚠️ Local only | ... |
|
|
148
|
+
| Skills | ✅ N local + M inherited | .claude/skills/ |
|
|
149
|
+
| Session lock | ✅ Clear / ⚠️ Active | ... |
|
|
150
|
+
| Chronicle (current) | ✅ / ⚠️ Stale — resolved during boot | ... |
|
|
151
|
+
| Architect review | ✅ / ⚠️ Overdue — resolved during boot | ... |
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**What NOT to surface in readiness** (these create noise, not signal):
|
|
155
|
+
- Untracked skill symlinks from bassclef-sync — these are expected, not a problem
|
|
156
|
+
- Stale dev processes on ports — only relevant if they'll conflict with the
|
|
157
|
+
current session. If you surface them, make it actionable: "Kill PIDs X, Y, Z?
|
|
158
|
+
They may conflict with dev server." Don't just list PIDs with no guidance.
|
|
159
|
+
- Auto-save checkpoint files (.test-baseline, etc.) — transient, not readiness-relevant
|
|
160
|
+
|
|
161
|
+
### 3. Show available capabilities
|
|
162
|
+
|
|
163
|
+
All skills and agents are available at any configuration. The gating axis
|
|
164
|
+
controls who decides when to invoke them:
|
|
165
|
+
|
|
166
|
+
| Gating | How skills/agents are invoked |
|
|
167
|
+
|--------|------------------------------|
|
|
168
|
+
| Operator-gated | You invoke skills explicitly (/canvas, /spec, /architect-review). Agent runs Builder + Reviewer automatically, pauses for approval on everything else. |
|
|
169
|
+
| Orchestrator-gated | Agent invokes skills per choreography. Full chain runs automatically: Shaper → PM → Architect → Designer → Builder → Reviewer. |
|
|
170
|
+
|
|
171
|
+
Key skills available in any mode:
|
|
172
|
+
- `/temperance`, `/verify`, `/diagnose`, `/chronicle` — gates that fire regardless
|
|
173
|
+
- `/canvas`, `/spec`, `/architect-review` — thinking/design skills
|
|
174
|
+
- `/riff-prototypes` — 2-3 visual variants with different dominant luminaries
|
|
175
|
+
- `/deploy-prod`, `/release-notes`, `/retro` — transition skills
|
|
176
|
+
- `/visual-review`, `/visual-qa`, `/synthetic-user` — verification skills
|
|
177
|
+
|
|
178
|
+
### 4. Show next steps
|
|
179
|
+
|
|
180
|
+
**MUST gates apply in ALL configurations:**
|
|
181
|
+
/temperance before building, /verify after, /diagnose before fixing,
|
|
182
|
+
tests with code, chronicle at phase transitions. These are not optional
|
|
183
|
+
in any configuration. The gating choice controls who approves handoffs,
|
|
184
|
+
not which gates fire.
|
|
185
|
+
|
|
186
|
+
Based on readiness, tell the operator what to do. Use the AskUserQuestion
|
|
187
|
+
tool to offer choices:
|
|
188
|
+
|
|
189
|
+
> Ready to start an autonomous session?
|
|
190
|
+
> 1. **Operator + sequential** (default) — you drive, agent assists
|
|
191
|
+
> 2. **Orchestrator + sequential** — agent chains all roles, no pauses
|
|
192
|
+
> 3. **Operator + parallel** — agents fan out, you approve each handoff
|
|
193
|
+
> 4. **Orchestrator + parallel** — full autonomy, max throughput
|
|
194
|
+
|
|
195
|
+
Note: stale artifacts (overdue chronicles, architect reviews) will be
|
|
196
|
+
resolved automatically during the `/autonomous start` boot sequence.
|
|
197
|
+
Don't present them as blockers — say "resolved during boot."
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## /autonomous dry-run
|
|
202
|
+
|
|
203
|
+
Full boot sequence validation, **read-only**. No files created, no
|
|
204
|
+
agents activated. Use this to validate the boot works in the current
|
|
205
|
+
environment before committing to `/autonomous start`.
|
|
206
|
+
|
|
207
|
+
**Procedure + output format + rules** → see
|
|
208
|
+
`strategy/autonomous-dry-run.md`.
|
|
209
|
+
|
|
210
|
+
Summary: runs all 8 boot steps from `strategy/agent-choreography.md`
|
|
211
|
+
Section 1, reports PASS / FAIL / WARN per step, produces a boot report
|
|
212
|
+
identical in shape to what `/autonomous start` Step 8 would emit.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## /autonomous start [gating] [mode] [flags]
|
|
217
|
+
|
|
218
|
+
Scaffold missing artifacts and boot the session with the requested
|
|
219
|
+
configuration. This is where autonomous work begins.
|
|
220
|
+
|
|
221
|
+
**Full procedure** → see `strategy/autonomous-boot-sequence.md`.
|
|
222
|
+
|
|
223
|
+
That doc covers:
|
|
224
|
+
|
|
225
|
+
- **The full chain** — ASCII diagram of Steps 1–9
|
|
226
|
+
- **CRITICAL EXECUTION RULES** — sequential exchanges, verbatim prompts,
|
|
227
|
+
confirmation, context-aware examples, smart defaults, recommended
|
|
228
|
+
configs, error recovery, permission pre-check
|
|
229
|
+
- **Step-by-step detail**:
|
|
230
|
+
- Step 0 — argument validation (rejects `standard`, `fast`, etc.)
|
|
231
|
+
- Selective-gate flag `gate-ux` — pulls UX decisions back under operator
|
|
232
|
+
gate in an otherwise-auto orchestrator-gated run
|
|
233
|
+
- Step 1 — determine gating and execution mode (AskUserQuestion)
|
|
234
|
+
- Step 2 — scaffold manifest (`substrate.config.md`)
|
|
235
|
+
- Step 3 — scaffold phase state
|
|
236
|
+
- Step 4 — scaffold iteration goal
|
|
237
|
+
- Step 5 — scaffold risk register
|
|
238
|
+
- Step 6 — resolve stale artifacts (chronicle, architect review, danger)
|
|
239
|
+
- Step 7 — execute 8-step boot
|
|
240
|
+
- Step 8 — report + confirm (personalized execution chain)
|
|
241
|
+
- Step 9 — activate choreography
|
|
242
|
+
- **Construction automation** A–E: parse scope → create issues →
|
|
243
|
+
write stack manifest → sequential execution → parallel execution
|
|
244
|
+
- **Pre-build gates** — spec exists, issues exist, stack manifest,
|
|
245
|
+
branches created
|
|
246
|
+
- **Branch stacking** — per-configuration table, rollback guidance
|
|
247
|
+
- **Context management** — survival kit re-read after compaction
|
|
248
|
+
- **Transition hierarchy** — role handoff / phase transition / iteration
|
|
249
|
+
complete: what fires when
|
|
250
|
+
- **Rules** — the hard invariants
|
|
251
|
+
|
|
252
|
+
**Valid args (fast reference; full validation in the boot-sequence doc):**
|
|
253
|
+
|
|
254
|
+
| Position | Accepted | Rejects |
|
|
255
|
+
|----------|----------|---------|
|
|
256
|
+
| gating | `operator-gated`, `orchestrator-gated`, short aliases | `standard`, `full`, `core` (those are `process_level`) |
|
|
257
|
+
| mode | `sequential`, `parallel` | `headless`, `napkin-mode`, etc. |
|
|
258
|
+
| selective-gate flags | `gate-ux` (orchestrator-gated only) | `pick-ux` etc. |
|
|
259
|
+
| PR strategy override | `bundle` (collapse N issues into 1 PR; default is stacked per `.claude/rules/pr-strategy.md`) | `stacked` (it's the default — explicit value not needed) |
|
|
260
|
+
|
|
261
|
+
Unknown args are rejected with a helpful message; the command does NOT
|
|
262
|
+
silently proceed with defaults.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Rules
|
|
267
|
+
|
|
268
|
+
- Never start work without operator confirmation
|
|
269
|
+
- Never assume iteration_ceiling — always ask
|
|
270
|
+
- If any boot step fails, scaffold the missing artifact before proceeding
|
|
271
|
+
- The Orchestrator coordinates but does not implement
|
|
272
|
+
- Spec and issues MUST exist before any Construction branch is created
|
|
273
|
+
- **Issue-first branch creation** (per bassclef#295): if a stack manifest
|
|
274
|
+
was pre-staged with `BASSCLEF-NNN` placeholder branch names, file the
|
|
275
|
+
issues + update the manifest with real numbers BEFORE creating the
|
|
276
|
+
branch. The placeholder-then-rename anti-pattern produces orphaned
|
|
277
|
+
gate markers because hooks fire against the placeholder filename. See
|
|
278
|
+
`strategy/autonomous-boot-sequence.md` Step D step 1 for the full
|
|
279
|
+
protocol.
|
|
280
|
+
- Every autonomous session ends with `/chronicle` + memory update
|
|
281
|
+
- **Prose output (per bassclef#790 — operator-facing-prose discipline):**
|
|
282
|
+
/autonomous handoff briefs, status reports, and turn-level prose
|
|
283
|
+
surface shorthand (WU-N, F-X.Y, ADR-NNN, #NNN, LF-N) with a plain-
|
|
284
|
+
language gloss at first mention per response. See
|
|
285
|
+
`standards/operator-facing-prose-discipline.md` for format examples.
|
|
286
|
+
Reserved-name allowlist per bassclef#763 holds.
|
|
287
|
+
- **PR-body scrub (per bassclef#787 — pr-body-discipline):** every
|
|
288
|
+
PR body authored by /autonomous-dispatched agents passes through
|
|
289
|
+
scrub before push. Three criteria: no `docs/operator-private/*`
|
|
290
|
+
path citations, no operator-strategic deliberation as PR
|
|
291
|
+
justification (mechanical framing only), plain-language gloss +
|
|
292
|
+
/kiss pass per bassclef#790. See `standards/pr-body-discipline.md`
|
|
293
|
+
for stub-framing examples.
|
|
294
|
+
- **SKILL.md edit meta-discipline (per bassclef#790 Rule 2):** any
|
|
295
|
+
/autonomous SKILL.md edit applies a /kiss pass to the whole file
|
|
296
|
+
in the same change.
|
|
297
|
+
|
|
298
|
+
## Output discipline
|
|
299
|
+
|
|
300
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: bind-subdomain
|
|
4
|
+
description: "Bind a friendly URL to a deployed sunj-labs app. Reads substrate.config.md, calls the deploy-host and DNS adapters. Creates records and polls cert validation. Replaces clickops per standards/domain-and-dns.md."
|
|
5
|
+
problem: "Deployed apps at sunj-labs need friendly URLs. Every operator sets it up by hand each time."
|
|
6
|
+
value: "One command binds a friendly URL to a deployed app. Reads config and calls deploy-host plus DNS."
|
|
7
|
+
inputs: [App name, Target subdomain, Optional deploy-host override]
|
|
8
|
+
outputs: [DNS record created, Deploy-host mapping, Verified URL]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# /bind-subdomain — Bassclef DNS + TLS Binding
|
|
14
|
+
|
|
15
|
+
Binds `<subdomain>` to a deployed app via Amplify (or future host
|
|
16
|
+
adapters) + Cloudflare (or future DNS adapters). One command, no
|
|
17
|
+
clickops, idempotent.
|
|
18
|
+
|
|
19
|
+
First consumer wired (`your-app.apps.your-domain.com` → Amplify app
|
|
20
|
+
`d154l5usyc80nk` in `eu-north-1`).
|
|
21
|
+
|
|
22
|
+
## When to invoke
|
|
23
|
+
|
|
24
|
+
- Setting up a friendly URL for a new sunj-labs app after its deploy
|
|
25
|
+
host (Amplify, etc.) is provisioned
|
|
26
|
+
- Re-running against an already-bound app (safe no-op — returns
|
|
27
|
+
current binding state)
|
|
28
|
+
- Troubleshooting a stuck binding (polls status, surfaces actionable
|
|
29
|
+
errors)
|
|
30
|
+
|
|
31
|
+
## When NOT to invoke
|
|
32
|
+
|
|
33
|
+
- Before the deploy host exists — this skill binds an existing app
|
|
34
|
+
to a subdomain, it doesn't create the app. Provision the Amplify
|
|
35
|
+
app first (via console or future `/provision-app` skill).
|
|
36
|
+
- If the DNS zone isn't owned by the operator in the configured
|
|
37
|
+
`dns_provider`. This skill doesn't create zones; it writes records
|
|
38
|
+
into existing zones.
|
|
39
|
+
|
|
40
|
+
## Sources read
|
|
41
|
+
|
|
42
|
+
- `standards/domain-and-dns.md` — the convention (subdomain pattern
|
|
43
|
+
+ TLS ownership + DNS automation) that this skill operationalizes
|
|
44
|
+
- `standards/substrate-config-schema.md` — field conventions the
|
|
45
|
+
script reads from consumer's `substrate.config.md`
|
|
46
|
+
- `scripts/bind-subdomain.sh` — main entry point
|
|
47
|
+
- `scripts/adapters/deploy/*.sh` — host-specific adapters (amplify)
|
|
48
|
+
- `scripts/adapters/dns/*.sh` — DNS-provider adapters (cloudflare)
|
|
49
|
+
- `docs/learnings/2026-04-19-mobile-to-preview.md` — manual pattern
|
|
50
|
+
this skill automates
|
|
51
|
+
- Bassclef #254 — ticket this skill closes
|
|
52
|
+
|
|
53
|
+
## Prerequisites
|
|
54
|
+
|
|
55
|
+
1. Consumer repo's `substrate.config.md` must declare:
|
|
56
|
+
```
|
|
57
|
+
hosting_platform: amplify # bassclef default per ADR-008
|
|
58
|
+
amplify_app_id: <app-id>
|
|
59
|
+
amplify_region: <aws-region>
|
|
60
|
+
amplify_branch: main # optional, defaults to main
|
|
61
|
+
subdomain: <full-dns-name>
|
|
62
|
+
dns_provider: cloudflare
|
|
63
|
+
dns_zone: <zone-root>
|
|
64
|
+
cloudflare_token_env: CLOUDFLARE_API_TOKEN
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`hosting_platform` enum: `amplify | ec2-tailscale | vercel | netlify | cloudflare-pages | none`. `none` is the explicit opt-out for docs-only / no-UI repos — bind-subdomain refuses with exit 3 + directive (bassclef#449). `BIND_SUBDOMAIN_OVERRIDE=1` bypasses the refusal. `vercel`, `netlify`, `cloudflare-pages` are reserved enum values; their adapters have not yet shipped (use `amplify` until they do).
|
|
68
|
+
2. AWS CLI authenticated with access to:
|
|
69
|
+
- `amplify:GetApp`
|
|
70
|
+
- `amplify:CreateDomainAssociation`
|
|
71
|
+
- `amplify:GetDomainAssociation`
|
|
72
|
+
- `amplify:UpdateBranch`
|
|
73
|
+
3. Env var named by `cloudflare_token_env` exported with a CF API
|
|
74
|
+
token that has:
|
|
75
|
+
- Zone → Zone:Read on the configured `dns_zone`
|
|
76
|
+
- Zone → DNS:Edit on the configured `dns_zone`
|
|
77
|
+
4. DNS zone exists in Cloudflare (or configured provider)
|
|
78
|
+
|
|
79
|
+
## Usage
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# From the consumer repo root:
|
|
83
|
+
bash scripts/bind-subdomain.sh
|
|
84
|
+
|
|
85
|
+
# Or with explicit config path:
|
|
86
|
+
bash scripts/bind-subdomain.sh path/to/substrate.config.md
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The script lives in bassclef's `scripts/` directory and is
|
|
90
|
+
distributed to consumer repos via bassclef-sync (symlinked to
|
|
91
|
+
`.claude/hooks/` peer directory — TBD per bassclef-sync extension
|
|
92
|
+
work; for now consumer repos invoke via the bassclef path in their
|
|
93
|
+
local clone, or copy-paste until distribution lands).
|
|
94
|
+
|
|
95
|
+
## Behavior
|
|
96
|
+
|
|
97
|
+
1. Read `substrate.config.md` from current directory (or argument)
|
|
98
|
+
2. Validate required fields present
|
|
99
|
+
3. Validate AWS CLI auth + Cloudflare token
|
|
100
|
+
4. Check if binding already exists:
|
|
101
|
+
- **Exists + AVAILABLE** → no-op, print URL, exit 0
|
|
102
|
+
- **Exists + not AVAILABLE** → poll to AVAILABLE (up to 20 min)
|
|
103
|
+
- **Does not exist** → proceed
|
|
104
|
+
5. Create Amplify domain association
|
|
105
|
+
6. Poll up to 2 min for validation records to populate
|
|
106
|
+
7. For each record, create in Cloudflare (idempotent: skip if exact
|
|
107
|
+
match exists; fail if name collision with different value)
|
|
108
|
+
8. Poll Amplify until `domainStatus: AVAILABLE` (up to 20 min)
|
|
109
|
+
9. Enable auto-build on the bound branch
|
|
110
|
+
10. Print the live URL
|
|
111
|
+
|
|
112
|
+
## Exit codes
|
|
113
|
+
|
|
114
|
+
| Code | Meaning |
|
|
115
|
+
|------|---------|
|
|
116
|
+
| 0 | Success (new binding OR already-bound no-op) |
|
|
117
|
+
| 1 | Config missing or invalid |
|
|
118
|
+
| 2 | Credentials missing or invalid |
|
|
119
|
+
| 3 | Deploy adapter failure (Amplify API error, timeout) |
|
|
120
|
+
| 4 | DNS adapter failure (Cloudflare API error, zone missing, record conflict) |
|
|
121
|
+
|
|
122
|
+
## Error recovery
|
|
123
|
+
|
|
124
|
+
### "Cannot access Amplify app"
|
|
125
|
+
|
|
126
|
+
- Check `amplify_app_id` matches the console
|
|
127
|
+
- Check `amplify_region` is correct (default eu-north-1)
|
|
128
|
+
- Run `aws amplify list-apps --region <region>` to verify access
|
|
129
|
+
|
|
130
|
+
### "Cloudflare token verification failed"
|
|
131
|
+
|
|
132
|
+
- Check env var named by `cloudflare_token_env` is set
|
|
133
|
+
- Verify token permissions (Zone:Read + DNS:Edit on the zone)
|
|
134
|
+
- Test independently: `curl -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" https://api.cloudflare.com/client/v4/user/tokens/verify`
|
|
135
|
+
|
|
136
|
+
### "Cannot resolve zone ID"
|
|
137
|
+
|
|
138
|
+
- Check `dns_zone` matches exactly (e.g., `your-domain.com`, not
|
|
139
|
+
`www.your-domain.com` or trailing dot)
|
|
140
|
+
- Check zone is in the same Cloudflare account the token was issued in
|
|
141
|
+
|
|
142
|
+
### "Record exists with different value"
|
|
143
|
+
|
|
144
|
+
Existing record conflicts with what this script wants to create.
|
|
145
|
+
Resolve manually in Cloudflare, then re-run:
|
|
146
|
+
1. Log into Cloudflare, locate the conflicting record
|
|
147
|
+
2. Decide whether existing value is correct (keep) or stale (delete)
|
|
148
|
+
3. If deleting: remove in CF console, then re-run script
|
|
149
|
+
4. If keeping: investigate why Amplify wants a different value
|
|
150
|
+
(possibly a stale prior binding; delete the Amplify domain
|
|
151
|
+
association first via console)
|
|
152
|
+
|
|
153
|
+
### "Timeout waiting for cert validation"
|
|
154
|
+
|
|
155
|
+
ACM cert validation typically completes in 5-15 min. Timeout after
|
|
156
|
+
20 min means one of:
|
|
157
|
+
- DNS records not propagating (check CF records are `proxied=false`)
|
|
158
|
+
- Conflicting records pointing to wrong target
|
|
159
|
+
- Zone not delegated correctly (if using nested subdomain)
|
|
160
|
+
|
|
161
|
+
Check Amplify console → Custom domains → see error detail. Fix,
|
|
162
|
+
then re-run.
|
|
163
|
+
|
|
164
|
+
## Adapter pattern
|
|
165
|
+
|
|
166
|
+
Two axes of variation, each with a separate adapter:
|
|
167
|
+
|
|
168
|
+
- **Deploy host** (`scripts/adapters/deploy/<host>.sh`): amplify, netlify (future), vercel (future), cloudflare-pages (future)
|
|
169
|
+
- **DNS provider** (`scripts/adapters/dns/<provider>.sh`): cloudflare, route53 (future)
|
|
170
|
+
|
|
171
|
+
Each adapter exposes a standard function set; the main script
|
|
172
|
+
dispatches without knowing platform details. Adding a new host/DNS
|
|
173
|
+
provider = new adapter file, no changes to the main script.
|
|
174
|
+
|
|
175
|
+
### Deploy adapter contract
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
deploy_check_auth → 0 if authenticated
|
|
179
|
+
deploy_binding_exists <subdomain> → 0 if exists
|
|
180
|
+
deploy_binding_status <subdomain> → prints status string
|
|
181
|
+
deploy_create_binding <subdomain> → creates association
|
|
182
|
+
deploy_get_records <subdomain> → prints <type>\t<name>\t<value> lines
|
|
183
|
+
deploy_wait_for_binding <subdomain> → polls to AVAILABLE
|
|
184
|
+
deploy_enable_auto_build → (optional) enables push-to-deploy
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### DNS adapter contract
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
dns_check_auth → 0 if authenticated; resolves zone ID
|
|
191
|
+
dns_create_record <type> <name> <value> → idempotent create
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Relationship to other skills
|
|
195
|
+
|
|
196
|
+
| Skill | Relationship |
|
|
197
|
+
|-------|-------------|
|
|
198
|
+
| `/onboard-repo` | Peer — provisions bassclef substrate for a new repo; `/bind-subdomain` binds its friendly URL after deploy host exists |
|
|
199
|
+
| `/deploy-prod` | Peer — handles deployment to the bound URL (POA's EC2+Tailscale pattern); orthogonal to this skill's DNS work |
|
|
200
|
+
| `/substrate-check` | Validates `substrate.config.md` schema; its checks cover the new fields added for this skill |
|
|
201
|
+
|
|
202
|
+
## Chain position
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
(deploy host provisioned externally)
|
|
206
|
+
↓
|
|
207
|
+
substrate.config.md declares hosting_platform + subdomain fields
|
|
208
|
+
↓
|
|
209
|
+
/bind-subdomain (this skill)
|
|
210
|
+
↓
|
|
211
|
+
friendly URL live
|
|
212
|
+
↓
|
|
213
|
+
/deploy-prod pushes code (or Amplify auto-build on push)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Provenance
|
|
217
|
+
|
|
218
|
+
Filed: bassclef #254 (shaping)
|
|
219
|
+
Shipped: iteration goal 2026-04-23a-bind-subdomain
|
|
220
|
+
First consumer wired (`your-app.apps.your-domain.com`), 2026-04-23
|
|
221
|
+
|
|
222
|
+
Replaces manual clickops documented in
|
|
223
|
+
`docs/learnings/2026-04-19-mobile-to-preview.md` §Step 2.
|
|
224
|
+
|
|
225
|
+
## Closes
|
|
226
|
+
|
|
227
|
+
- bassclef #254
|
|
228
|
+
- Integration-tests the domain + DNS strategy against a live binding
|
|
229
|
+
|
|
230
|
+
## Output discipline
|
|
231
|
+
|
|
232
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: canvas
|
|
4
|
+
description: "Create a new product canvas \u2014 three-stage template (Thesis \u2192 Shape \u2192 Build Sequence)."
|
|
5
|
+
problem: "Product canvases get authored ad-hoc. Structure drifts. Downstream skills can't parse them."
|
|
6
|
+
value: "Creates a new product canvas using the three-stage template \u2014 Thesis and Shape and Build Sequence."
|
|
7
|
+
inputs: [Product name or scope description]
|
|
8
|
+
outputs: [Canvas doc at strategy/canvases/, Thesis section, Shape section, Build Sequence section]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Canvas — Create Product Canvas
|
|
14
|
+
|
|
15
|
+
Create a new product canvas following the three-stage template.
|
|
16
|
+
|
|
17
|
+
## Steps
|
|
18
|
+
|
|
19
|
+
1. Ask the user for the initiative name (or infer from context)
|
|
20
|
+
2. Read `templates/product-canvas.md` for the template structure
|
|
21
|
+
3. Read the most recent canvas in `strategy/canvases/` for style reference
|
|
22
|
+
4. Walk through each stage with the user:
|
|
23
|
+
- **Stage 1: Thesis** (5 min) — one-sentence value proposition, audience scope, the problem, the bet
|
|
24
|
+
- **Stage 2: Shape** (30 min) — detailed design of the approach, data sources, architecture
|
|
25
|
+
- **Stage 3: Build Sequence** — phased implementation plan with checkboxes
|
|
26
|
+
|
|
27
|
+
## Output
|
|
28
|
+
|
|
29
|
+
Write to `strategy/canvases/{YYYY-MM-DD}-{slug}.md`
|
|
30
|
+
|
|
31
|
+
## Rules
|
|
32
|
+
|
|
33
|
+
- Do not skip stages — each forces a different kind of clarity
|
|
34
|
+
- Value proposition must be one sentence
|
|
35
|
+
- The Goal section must be concrete enough to falsify
|
|
36
|
+
- Build Sequence must have phased checkboxes
|
|
37
|
+
- If the user hasn't thought through a stage, help them — don't fill in assumptions silently
|
|
38
|
+
|
|
39
|
+
## Output discipline
|
|
40
|
+
|
|
41
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: deploy-prod
|
|
4
|
+
description: "Production deployment procedure \u2014 test, build, push, CI, verify. Template for any project."
|
|
5
|
+
problem: "Production deploys go different every time. Steps get missed. Rollbacks take manual rediscovery."
|
|
6
|
+
value: "Standardized production deployment procedure \u2014 test then build then push then CI then verify."
|
|
7
|
+
inputs: [Optional deploy-host override]
|
|
8
|
+
outputs: [Deploy log, Verify status per step, Rollback procedure]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
requires:
|
|
12
|
+
cli: [git, gh, node]
|
|
13
|
+
files: [substrate.config.md]
|
|
14
|
+
network: true
|
|
15
|
+
gating: orchestrator-gated
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Deploy to Production
|
|
19
|
+
|
|
20
|
+
Standard deployment procedure. Run after code is reviewed and ready to ship.
|
|
21
|
+
|
|
22
|
+
## Procedure
|
|
23
|
+
|
|
24
|
+
### Step 1: Pre-flight
|
|
25
|
+
|
|
26
|
+
- Working tree clean? (`git status`)
|
|
27
|
+
- All tests pass? (`npm run test` or project equivalent)
|
|
28
|
+
- Build succeeds? (`npm run build` or project equivalent)
|
|
29
|
+
- On the correct branch? (feature branch → merge to main, or main directly)
|
|
30
|
+
|
|
31
|
+
### Step 2: Push and CI
|
|
32
|
+
|
|
33
|
+
- Push to remote: `git push`
|
|
34
|
+
- **MUST watch CI until completion** (#529) — after every main-branch
|
|
35
|
+
merge on a deploy-configured repo, run:
|
|
36
|
+
```
|
|
37
|
+
gh run watch --exit-status
|
|
38
|
+
```
|
|
39
|
+
(or poll `gh run list --limit 1 --json status,conclusion` until
|
|
40
|
+
`status=completed`). Do NOT proceed to next work until CI finishes.
|
|
41
|
+
Why: silent CI failures age into the next session as BLOCKED items
|
|
42
|
+
or production drift. Surface immediately.
|
|
43
|
+
- Verify all checks pass: secret scan → lint → typecheck → SAST → audit → test → build → deploy
|
|
44
|
+
- If CI fails: fire `/diagnose` before any retry. Don't brute-force
|
|
45
|
+
retry without understanding the failure.
|
|
46
|
+
|
|
47
|
+
### Step 3: Post-deploy Verification
|
|
48
|
+
|
|
49
|
+
Run `/smoke-test` against production:
|
|
50
|
+
|
|
51
|
+
1. **Health check** — API health endpoint returns healthy
|
|
52
|
+
2. **Auth flow** — sign-in/sign-out cycle works
|
|
53
|
+
3. **Core pages** — main pages load with data
|
|
54
|
+
4. **API contracts** — key endpoints return expected shapes
|
|
55
|
+
5. **Pipeline** — background jobs running, recent jobs successful
|
|
56
|
+
|
|
57
|
+
### Step 4: Rollback (if verification fails)
|
|
58
|
+
|
|
59
|
+
- Revert the merge commit: `git revert <commit> && git push`
|
|
60
|
+
- CI redeploys previous version
|
|
61
|
+
- Run `/diagnose` on the failure before attempting again
|
|
62
|
+
|
|
63
|
+
## Pass Criteria
|
|
64
|
+
|
|
65
|
+
All post-deploy checks pass. If any fail, rollback and diagnose.
|
|
66
|
+
|
|
67
|
+
## Retroactive version tags (defer when capability missing)
|
|
68
|
+
|
|
69
|
+
When a version tag (`vX.Y.Z`) should be written for an already-deployed
|
|
70
|
+
release but the current session lacks the `git-tag` capability
|
|
71
|
+
(typical: ephemeral-mobile, cloud-web, or a desktop session whose
|
|
72
|
+
remote lacks push credentials), DO NOT silently skip. Write a
|
|
73
|
+
deferred-action entry so the next capable session creates the tag:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
TS=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
|
|
77
|
+
ID="${TS}-retro-tag-vX.Y.Z"
|
|
78
|
+
cp templates/deferred-action-template.md \
|
|
79
|
+
"docs/deferred-actions/${ID}.md"
|
|
80
|
+
# Fill frontmatter:
|
|
81
|
+
# pending_action: write-retroactive-version-tag
|
|
82
|
+
# requires_capability: [git-push, git-tag]
|
|
83
|
+
# priority: low
|
|
84
|
+
# origin_skill: /deploy-prod
|
|
85
|
+
# resolves_when: |
|
|
86
|
+
# git tag -l vX.Y.Z shows the tag; GitHub release created if policy requires it.
|
|
87
|
+
# Body: cite the commit SHA, release notes path, date-deployed.
|
|
88
|
+
git add "docs/deferred-actions/${ID}.md"
|
|
89
|
+
git commit -m "chore: defer retroactive version tag vX.Y.Z"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
See `.claude/rules/deferred-actions.md`. Silent skip violates
|
|
93
|
+
`session-artifacts.md` ("silence is not deferral").
|
|
94
|
+
|
|
95
|
+
## App-Specific Override
|
|
96
|
+
|
|
97
|
+
Your project's deploy-prod skill should specify:
|
|
98
|
+
- Production URL and health endpoint
|
|
99
|
+
- SSH/access commands for server verification
|
|
100
|
+
- CI job names and expected durations
|
|
101
|
+
- Worker/queue verification commands
|
|
102
|
+
- Rollback-specific steps for your infrastructure
|
|
103
|
+
|
|
104
|
+
## Output discipline
|
|
105
|
+
|
|
106
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|