@bradygaster/squad-cli 0.9.0 → 0.9.2-insider.5
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/README.md +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +10 -10
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +157 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/consult.d.ts.map +1 -1
- package/dist/cli/commands/consult.js +9 -4
- package/dist/cli/commands/consult.js.map +1 -1
- package/dist/cli/commands/copilot.d.ts.map +1 -1
- package/dist/cli/commands/copilot.js +8 -7
- package/dist/cli/commands/copilot.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +50 -17
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/economy.d.ts.map +1 -1
- package/dist/cli/commands/economy.js +3 -2
- package/dist/cli/commands/economy.js.map +1 -1
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +22 -16
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/extract.d.ts.map +1 -1
- package/dist/cli/commands/extract.js +14 -10
- package/dist/cli/commands/extract.js.map +1 -1
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +21 -18
- package/dist/cli/commands/import.js.map +1 -1
- package/dist/cli/commands/init-remote.d.ts.map +1 -1
- package/dist/cli/commands/init-remote.js +7 -6
- package/dist/cli/commands/init-remote.js.map +1 -1
- package/dist/cli/commands/link.d.ts.map +1 -1
- package/dist/cli/commands/link.js +11 -10
- package/dist/cli/commands/link.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +19 -18
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/personal.d.ts.map +1 -1
- package/dist/cli/commands/personal.js +12 -20
- package/dist/cli/commands/personal.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts.map +1 -1
- package/dist/cli/commands/plugin.js +8 -7
- package/dist/cli/commands/plugin.js.map +1 -1
- package/dist/cli/commands/rc.d.ts.map +1 -1
- package/dist/cli/commands/rc.js +19 -12
- package/dist/cli/commands/rc.js.map +1 -1
- package/dist/cli/commands/schedule.d.ts.map +1 -1
- package/dist/cli/commands/schedule.js +6 -5
- package/dist/cli/commands/schedule.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +18 -11
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/streams.d.ts.map +1 -1
- package/dist/cli/commands/streams.js +3 -2
- package/dist/cli/commands/streams.js.map +1 -1
- package/dist/cli/commands/upstream.d.ts.map +1 -1
- package/dist/cli/commands/upstream.js +23 -19
- package/dist/cli/commands/upstream.js.map +1 -1
- package/dist/cli/commands/watch/capabilities/board.d.ts +22 -0
- package/dist/cli/commands/watch/capabilities/board.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/board.js +121 -0
- package/dist/cli/commands/watch/capabilities/board.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts +14 -0
- package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/decision-hygiene.js +72 -0
- package/dist/cli/commands/watch/capabilities/decision-hygiene.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/execute.d.ts +33 -0
- package/dist/cli/commands/watch/capabilities/execute.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/execute.js +119 -0
- package/dist/cli/commands/watch/capabilities/execute.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/index.d.ts +7 -0
- package/dist/cli/commands/watch/capabilities/index.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/index.js +28 -0
- package/dist/cli/commands/watch/capabilities/index.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/monitor-email.d.ts +14 -0
- package/dist/cli/commands/watch/capabilities/monitor-email.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/monitor-email.js +54 -0
- package/dist/cli/commands/watch/capabilities/monitor-email.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts +14 -0
- package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/monitor-teams.js +55 -0
- package/dist/cli/commands/watch/capabilities/monitor-teams.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/retro.d.ts +14 -0
- package/dist/cli/commands/watch/capabilities/retro.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/retro.js +81 -0
- package/dist/cli/commands/watch/capabilities/retro.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/self-pull.d.ts +14 -0
- package/dist/cli/commands/watch/capabilities/self-pull.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/self-pull.js +33 -0
- package/dist/cli/commands/watch/capabilities/self-pull.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/two-pass.d.ts +14 -0
- package/dist/cli/commands/watch/capabilities/two-pass.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/two-pass.js +66 -0
- package/dist/cli/commands/watch/capabilities/two-pass.js.map +1 -0
- package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts +14 -0
- package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/watch/capabilities/wave-dispatch.js +117 -0
- package/dist/cli/commands/watch/capabilities/wave-dispatch.js.map +1 -0
- package/dist/cli/commands/watch/config.d.ts +25 -0
- package/dist/cli/commands/watch/config.d.ts.map +1 -0
- package/dist/cli/commands/watch/config.js +82 -0
- package/dist/cli/commands/watch/config.js.map +1 -0
- package/dist/cli/commands/watch/index.d.ts +95 -0
- package/dist/cli/commands/watch/index.d.ts.map +1 -0
- package/dist/cli/commands/watch/index.js +704 -0
- package/dist/cli/commands/watch/index.js.map +1 -0
- package/dist/cli/commands/watch/registry.d.ts +19 -0
- package/dist/cli/commands/watch/registry.d.ts.map +1 -0
- package/dist/cli/commands/watch/registry.js +28 -0
- package/dist/cli/commands/watch/registry.js.map +1 -0
- package/dist/cli/commands/watch/types.d.ts +57 -0
- package/dist/cli/commands/watch/types.d.ts.map +1 -0
- package/dist/cli/commands/watch/types.js +8 -0
- package/dist/cli/commands/watch/types.js.map +1 -0
- package/dist/cli/core/cast.d.ts.map +1 -1
- package/dist/cli/core/cast.js +15 -19
- package/dist/cli/core/cast.js.map +1 -1
- package/dist/cli/core/detect-squad-dir.d.ts.map +1 -1
- package/dist/cli/core/detect-squad-dir.js +12 -10
- package/dist/cli/core/detect-squad-dir.js.map +1 -1
- package/dist/cli/core/email-scrub.d.ts.map +1 -1
- package/dist/cli/core/email-scrub.js +12 -11
- package/dist/cli/core/email-scrub.js.map +1 -1
- package/dist/cli/core/gh-cli.d.ts +13 -0
- package/dist/cli/core/gh-cli.d.ts.map +1 -1
- package/dist/cli/core/gh-cli.js +24 -0
- package/dist/cli/core/gh-cli.js.map +1 -1
- package/dist/cli/core/init.d.ts +2 -0
- package/dist/cli/core/init.d.ts.map +1 -1
- package/dist/cli/core/init.js +22 -5
- package/dist/cli/core/init.js.map +1 -1
- package/dist/cli/core/migrate-directory.d.ts.map +1 -1
- package/dist/cli/core/migrate-directory.js +14 -13
- package/dist/cli/core/migrate-directory.js.map +1 -1
- package/dist/cli/core/migrations.d.ts.map +1 -1
- package/dist/cli/core/migrations.js +22 -8
- package/dist/cli/core/migrations.js.map +1 -1
- package/dist/cli/core/nap.d.ts.map +1 -1
- package/dist/cli/core/nap.js +111 -49
- package/dist/cli/core/nap.js.map +1 -1
- package/dist/cli/core/project-type.d.ts.map +1 -1
- package/dist/cli/core/project-type.js +11 -10
- package/dist/cli/core/project-type.js.map +1 -1
- package/dist/cli/core/team-md.d.ts.map +1 -1
- package/dist/cli/core/team-md.js +9 -4
- package/dist/cli/core/team-md.js.map +1 -1
- package/dist/cli/core/templates.d.ts.map +1 -1
- package/dist/cli/core/templates.js +4 -3
- package/dist/cli/core/templates.js.map +1 -1
- package/dist/cli/core/upgrade.d.ts.map +1 -1
- package/dist/cli/core/upgrade.js +68 -55
- package/dist/cli/core/upgrade.js.map +1 -1
- package/dist/cli/core/version.d.ts.map +1 -1
- package/dist/cli/core/version.js +8 -7
- package/dist/cli/core/version.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/self-update.d.ts.map +1 -1
- package/dist/cli/self-update.js +7 -4
- package/dist/cli/self-update.js.map +1 -1
- package/dist/cli/shell/agent-name-parser.d.ts +16 -0
- package/dist/cli/shell/agent-name-parser.d.ts.map +1 -0
- package/dist/cli/shell/agent-name-parser.js +54 -0
- package/dist/cli/shell/agent-name-parser.js.map +1 -0
- package/dist/cli/shell/commands.d.ts.map +1 -1
- package/dist/cli/shell/commands.js +4 -3
- package/dist/cli/shell/commands.js.map +1 -1
- package/dist/cli/shell/coordinator.d.ts +4 -1
- package/dist/cli/shell/coordinator.d.ts.map +1 -1
- package/dist/cli/shell/coordinator.js +29 -26
- package/dist/cli/shell/coordinator.js.map +1 -1
- package/dist/cli/shell/index.d.ts.map +1 -1
- package/dist/cli/shell/index.js +33 -35
- package/dist/cli/shell/index.js.map +1 -1
- package/dist/cli/shell/lifecycle.d.ts +13 -2
- package/dist/cli/shell/lifecycle.d.ts.map +1 -1
- package/dist/cli/shell/lifecycle.js +26 -13
- package/dist/cli/shell/lifecycle.js.map +1 -1
- package/dist/cli/shell/session-store.d.ts.map +1 -1
- package/dist/cli/shell/session-store.js +16 -12
- package/dist/cli/shell/session-store.js.map +1 -1
- package/dist/cli/shell/spawn.d.ts +4 -1
- package/dist/cli/shell/spawn.d.ts.map +1 -1
- package/dist/cli/shell/spawn.js +28 -10
- package/dist/cli/shell/spawn.js.map +1 -1
- package/dist/cli-entry.js +83 -12
- package/dist/cli-entry.js.map +1 -1
- package/package.json +8 -4
- package/templates/scribe-charter.md +4 -0
- package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
- package/templates/skills/error-recovery/SKILL.md +99 -0
- package/templates/skills/iterative-retrieval/SKILL.md +165 -0
- package/templates/skills/notification-routing/SKILL.md +105 -0
- package/templates/skills/pr-screenshots/SKILL.md +149 -0
- package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
- package/templates/skills/reflect/SKILL.md +229 -0
- package/templates/skills/release-process/SKILL.md +84 -376
- package/templates/skills/retro-enforcement/SKILL.md +148 -0
- package/templates/skills/tiered-memory/SKILL.md +234 -0
- package/templates/skills/windows-compatibility/SKILL.md +24 -0
- package/templates/{squad.agent.md → squad.agent.md.template} +1316 -1287
- package/templates/workflows/squad-ci.yml +1 -1
- package/templates/workflows/squad-heartbeat.yml +0 -4
- package/templates/workflows/squad-insider-release.yml +1 -1
- package/templates/workflows/squad-preview.yml +1 -1
- package/templates/workflows/squad-release.yml +1 -1
- package/dist/cli/commands/watch.d.ts +0 -18
- package/dist/cli/commands/watch.d.ts.map +0 -1
- package/dist/cli/commands/watch.js +0 -306
- package/dist/cli/commands/watch.js.map +0 -1
|
@@ -1,423 +1,131 @@
|
|
|
1
|
-
|
|
2
|
-
name: "release-process"
|
|
3
|
-
description: "Step-by-step release checklist for Squad — prevents v0.8.22-style disasters"
|
|
4
|
-
domain: "release-management"
|
|
5
|
-
confidence: "high"
|
|
6
|
-
source: "team-decision"
|
|
7
|
-
---
|
|
1
|
+
# Release Process
|
|
8
2
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
This is the **definitive release runbook** for Squad. Born from the v0.8.22 release disaster (4-part semver mangled by npm, draft release never triggered publish, wrong NPM_TOKEN type, 6+ hours of broken `latest` dist-tag).
|
|
12
|
-
|
|
13
|
-
**Rule:** No agent releases Squad without following this checklist. No exceptions. No improvisation.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Pre-Release Validation
|
|
18
|
-
|
|
19
|
-
Before starting ANY release work, validate the following:
|
|
20
|
-
|
|
21
|
-
### 1. Version Number Validation
|
|
22
|
-
|
|
23
|
-
**Rule:** Only 3-part semver (major.minor.patch) or prerelease (major.minor.patch-tag.N) are valid. 4-part versions (0.8.21.4) are NOT valid semver and npm will mangle them.
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# Check version is valid semver
|
|
27
|
-
node -p "require('semver').valid('0.8.22')"
|
|
28
|
-
# Output: '0.8.22' = valid
|
|
29
|
-
# Output: null = INVALID, STOP
|
|
30
|
-
|
|
31
|
-
# For prerelease versions
|
|
32
|
-
node -p "require('semver').valid('0.8.23-preview.1')"
|
|
33
|
-
# Output: '0.8.23-preview.1' = valid
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**If `semver.valid()` returns `null`:** STOP. Fix the version. Do NOT proceed.
|
|
37
|
-
|
|
38
|
-
### 2. NPM_TOKEN Verification
|
|
39
|
-
|
|
40
|
-
**Rule:** NPM_TOKEN must be an **Automation token** (no 2FA required). User tokens with 2FA will fail in CI with EOTP errors.
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
# Check token type (requires npm CLI authenticated)
|
|
44
|
-
npm token list
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Look for:
|
|
48
|
-
- ✅ `read-write` tokens with NO 2FA requirement = Automation token (correct)
|
|
49
|
-
- ❌ Tokens requiring OTP = User token (WRONG, will fail in CI)
|
|
50
|
-
|
|
51
|
-
**How to create an Automation token:**
|
|
52
|
-
1. Go to npmjs.com → Settings → Access Tokens
|
|
53
|
-
2. Click "Generate New Token"
|
|
54
|
-
3. Select **"Automation"** (NOT "Publish")
|
|
55
|
-
4. Copy token and save as GitHub secret: `NPM_TOKEN`
|
|
56
|
-
|
|
57
|
-
**If using a User token:** STOP. Create an Automation token first.
|
|
58
|
-
|
|
59
|
-
### 3. Branch and Tag State
|
|
60
|
-
|
|
61
|
-
**Rule:** Release from `main` branch. Ensure clean state, no uncommitted changes, latest from origin.
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
# Ensure on main and clean
|
|
65
|
-
git checkout main
|
|
66
|
-
git pull origin main
|
|
67
|
-
git status # Should show: "nothing to commit, working tree clean"
|
|
68
|
-
|
|
69
|
-
# Check tag doesn't already exist
|
|
70
|
-
git tag -l "v0.8.22"
|
|
71
|
-
# Output should be EMPTY. If tag exists, release already done or collision.
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
**If tag exists:** STOP. Either release was already done, or there's a collision. Investigate before proceeding.
|
|
75
|
-
|
|
76
|
-
### 4. Disable bump-build.mjs
|
|
77
|
-
|
|
78
|
-
**Rule:** `bump-build.mjs` is for dev builds ONLY. It must NOT run during release builds (it increments build numbers, creating 4-part versions).
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
# Set env var to skip bump-build.mjs
|
|
82
|
-
export SKIP_BUILD_BUMP=1
|
|
83
|
-
|
|
84
|
-
# Verify it's set
|
|
85
|
-
echo $SKIP_BUILD_BUMP
|
|
86
|
-
# Output: 1
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**For Windows PowerShell:**
|
|
90
|
-
```powershell
|
|
91
|
-
$env:SKIP_BUILD_BUMP = "1"
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
**If not set:** `bump-build.mjs` will run and mutate versions. This causes disasters (see v0.8.22).
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Release Workflow
|
|
99
|
-
|
|
100
|
-
### Step 1: Version Bump
|
|
101
|
-
|
|
102
|
-
Update version in all 3 package.json files (root + both workspaces) in lockstep.
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
# Set target version (no 'v' prefix)
|
|
106
|
-
VERSION="0.8.22"
|
|
107
|
-
|
|
108
|
-
# Validate it's valid semver BEFORE proceeding
|
|
109
|
-
node -p "require('semver').valid('$VERSION')"
|
|
110
|
-
# Must output the version string, NOT null
|
|
111
|
-
|
|
112
|
-
# Update all 3 package.json files
|
|
113
|
-
npm version $VERSION --workspaces --include-workspace-root --no-git-tag-version
|
|
114
|
-
|
|
115
|
-
# Verify all 3 match
|
|
116
|
-
grep '"version"' package.json packages/squad-sdk/package.json packages/squad-cli/package.json
|
|
117
|
-
# All 3 should show: "version": "0.8.22"
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Checkpoint:** All 3 package.json files have identical versions. Run `semver.valid()` one more time to be sure.
|
|
121
|
-
|
|
122
|
-
### Step 2: Commit and Tag
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
# Commit version bump
|
|
126
|
-
git add package.json packages/squad-sdk/package.json packages/squad-cli/package.json
|
|
127
|
-
git commit -m "chore: bump version to $VERSION
|
|
128
|
-
|
|
129
|
-
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>"
|
|
130
|
-
|
|
131
|
-
# Create tag (with 'v' prefix)
|
|
132
|
-
git tag -a "v$VERSION" -m "Release v$VERSION"
|
|
133
|
-
|
|
134
|
-
# Push commit and tag
|
|
135
|
-
git push origin main
|
|
136
|
-
git push origin "v$VERSION"
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
**Checkpoint:** Tag created and pushed. Verify with `git tag -l "v$VERSION"`.
|
|
140
|
-
|
|
141
|
-
### Step 3: Create GitHub Release
|
|
142
|
-
|
|
143
|
-
**CRITICAL:** Release must be **published**, NOT draft. Draft releases don't trigger `publish.yml` workflow.
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
# Create GitHub Release (NOT draft)
|
|
147
|
-
gh release create "v$VERSION" \
|
|
148
|
-
--title "v$VERSION" \
|
|
149
|
-
--notes "Release notes go here" \
|
|
150
|
-
--latest
|
|
151
|
-
|
|
152
|
-
# Verify release is PUBLISHED (not draft)
|
|
153
|
-
gh release view "v$VERSION"
|
|
154
|
-
# Output should NOT contain "(draft)"
|
|
155
|
-
```
|
|
3
|
+
> Earned knowledge from the v0.9.0→v0.9.1 incident. Every agent involved in releases MUST read this before starting release work.
|
|
156
4
|
|
|
157
|
-
|
|
5
|
+
## SCOPE
|
|
158
6
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
7
|
+
✅ THIS SKILL PRODUCES:
|
|
8
|
+
- Pre-release validation checks that prevent broken publishes
|
|
9
|
+
- Correct npm publish commands (never workspace-scoped)
|
|
10
|
+
- Fallback procedures when CI workflows fail
|
|
11
|
+
- Post-publish verification steps
|
|
163
12
|
|
|
164
|
-
|
|
13
|
+
❌ THIS SKILL DOES NOT PRODUCE:
|
|
14
|
+
- Feature implementation or test code
|
|
15
|
+
- Architecture decisions
|
|
16
|
+
- Documentation content
|
|
165
17
|
|
|
166
|
-
|
|
18
|
+
## Confidence: high
|
|
167
19
|
|
|
168
|
-
|
|
20
|
+
Established through the v0.9.1 incident (8-hour recovery). Every rule below is battle-tested.
|
|
169
21
|
|
|
170
|
-
|
|
171
|
-
# Watch workflow runs
|
|
172
|
-
gh run list --workflow=publish.yml --limit 1
|
|
22
|
+
## Context
|
|
173
23
|
|
|
174
|
-
|
|
175
|
-
gh run view --log
|
|
176
|
-
```
|
|
24
|
+
Squad publishes two npm packages: `@bradygaster/squad-sdk` and `@bradygaster/squad-cli`. The release pipeline flows: dev → preview → main → GitHub Release → npm publish. Brady (project owner) triggers releases — the coordinator does NOT.
|
|
177
25
|
|
|
178
|
-
|
|
179
|
-
1. `publish-sdk` job runs → publishes `@bradygaster/squad-sdk`
|
|
180
|
-
2. Verify step runs with retry loop (up to 5 attempts, 15s interval) to confirm SDK on npm registry
|
|
181
|
-
3. `publish-cli` job runs → publishes `@bradygaster/squad-cli`
|
|
182
|
-
4. Verify step runs with retry loop to confirm CLI on npm registry
|
|
26
|
+
## Rules (Non-Negotiable)
|
|
183
27
|
|
|
184
|
-
|
|
185
|
-
- EOTP error = wrong NPM_TOKEN type (use Automation token)
|
|
186
|
-
- Verify step timeout = npm propagation delay (retry loop should handle this, but propagation can take up to 2 minutes in rare cases)
|
|
187
|
-
- Version mismatch = package.json version doesn't match tag
|
|
28
|
+
### 1. Coordinator Does NOT Publish
|
|
188
29
|
|
|
189
|
-
|
|
30
|
+
The coordinator routes work and manages agents. It does NOT run `npm publish`, trigger release workflows, or make release decisions. Brady owns the release trigger. If an agent or the coordinator is asked to publish, escalate to Brady.
|
|
190
31
|
|
|
191
|
-
###
|
|
32
|
+
### 2. Pre-Publish Dependency Validation
|
|
192
33
|
|
|
193
|
-
|
|
34
|
+
Before ANY release is tagged, scan every `packages/*/package.json` for:
|
|
35
|
+
- `file:` references (workspace leak — the v0.9.0 root cause)
|
|
36
|
+
- `link:` references
|
|
37
|
+
- Absolute paths in dependency values
|
|
38
|
+
- Non-semver version strings
|
|
194
39
|
|
|
40
|
+
**Command:**
|
|
195
41
|
```bash
|
|
196
|
-
|
|
197
|
-
npm view @bradygaster/squad-sdk version
|
|
198
|
-
# Output: 0.8.22
|
|
199
|
-
|
|
200
|
-
npm dist-tag ls @bradygaster/squad-sdk
|
|
201
|
-
# Output should show: latest: 0.8.22
|
|
202
|
-
|
|
203
|
-
# Check CLI
|
|
204
|
-
npm view @bradygaster/squad-cli version
|
|
205
|
-
# Output: 0.8.22
|
|
206
|
-
|
|
207
|
-
npm dist-tag ls @bradygaster/squad-cli
|
|
208
|
-
# Output should show: latest: 0.8.22
|
|
42
|
+
grep -r '"file:\|"link:\|"/' packages/*/package.json
|
|
209
43
|
```
|
|
44
|
+
If anything matches, STOP. Do not proceed. Fix the reference first.
|
|
210
45
|
|
|
211
|
-
|
|
46
|
+
### 3. Never Use `npm -w` for Publishing
|
|
212
47
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
### Step 6: Test Installation
|
|
216
|
-
|
|
217
|
-
Verify packages can be installed from npm (real-world smoke test).
|
|
48
|
+
`npm -w packages/squad-sdk publish` hangs silently when 2FA is enabled. Always `cd` into the package directory:
|
|
218
49
|
|
|
219
50
|
```bash
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
# Test SDK installation
|
|
224
|
-
npm init -y
|
|
225
|
-
npm install @bradygaster/squad-sdk
|
|
226
|
-
node -p "require('@bradygaster/squad-sdk/package.json').version"
|
|
227
|
-
# Output: 0.8.22
|
|
228
|
-
|
|
229
|
-
# Test CLI installation
|
|
230
|
-
npm install -g @bradygaster/squad-cli
|
|
231
|
-
squad --version
|
|
232
|
-
# Output: 0.8.22
|
|
233
|
-
|
|
234
|
-
# Cleanup
|
|
235
|
-
cd -
|
|
236
|
-
rm -rf /tmp/squad-release-test
|
|
51
|
+
cd packages/squad-sdk && npm publish --access public
|
|
52
|
+
cd packages/squad-cli && npm publish --access public
|
|
237
53
|
```
|
|
238
54
|
|
|
239
|
-
|
|
55
|
+
### 4. Fallback Protocol
|
|
240
56
|
|
|
241
|
-
|
|
57
|
+
If `workflow_dispatch` or the publish workflow fails:
|
|
58
|
+
1. Try once more (ONE retry, not four)
|
|
59
|
+
2. If it fails again → local publish immediately
|
|
60
|
+
3. Do NOT attempt GitHub UI file operations to fix workflow indexing
|
|
61
|
+
4. GitHub has a ~15min workflow cache TTL after file renames/deletes — waiting helps, retrying doesn't
|
|
242
62
|
|
|
243
|
-
###
|
|
244
|
-
|
|
245
|
-
After main release, sync dev to the next preview version.
|
|
63
|
+
### 5. Post-Publish Smoke Test
|
|
246
64
|
|
|
65
|
+
After every publish, verify in a clean shell:
|
|
247
66
|
```bash
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
# Bump to next preview version (e.g., 0.8.23-preview.1)
|
|
253
|
-
NEXT_VERSION="0.8.23-preview.1"
|
|
254
|
-
|
|
255
|
-
# Validate semver
|
|
256
|
-
node -p "require('semver').valid('$NEXT_VERSION')"
|
|
257
|
-
# Must output the version string, NOT null
|
|
258
|
-
|
|
259
|
-
# Update all 3 package.json files
|
|
260
|
-
npm version $NEXT_VERSION --workspaces --include-workspace-root --no-git-tag-version
|
|
261
|
-
|
|
262
|
-
# Commit
|
|
263
|
-
git add package.json packages/squad-sdk/package.json packages/squad-cli/package.json
|
|
264
|
-
git commit -m "chore: bump dev to $NEXT_VERSION
|
|
265
|
-
|
|
266
|
-
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>"
|
|
267
|
-
|
|
268
|
-
# Push
|
|
269
|
-
git push origin dev
|
|
67
|
+
npm install -g @bradygaster/squad-cli@latest
|
|
68
|
+
squad --version # should match published version
|
|
69
|
+
squad doctor # should pass in a test repo
|
|
270
70
|
```
|
|
271
71
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
|
|
276
|
-
## Manual Publish (Fallback)
|
|
72
|
+
If the smoke test fails, rollback immediately.
|
|
277
73
|
|
|
278
|
-
|
|
74
|
+
### 6. npm Token Must Be Automation Type
|
|
279
75
|
|
|
280
|
-
|
|
281
|
-
# Trigger manual publish
|
|
282
|
-
gh workflow run publish.yml -f version="0.8.22"
|
|
76
|
+
NPM_TOKEN in CI must be an Automation token (not a user token with 2FA prompts). User tokens with `auth-and-writes` 2FA cause silent hangs in non-interactive environments.
|
|
283
77
|
|
|
284
|
-
|
|
285
|
-
gh run watch
|
|
286
|
-
```
|
|
78
|
+
### 7. No Draft GitHub Releases
|
|
287
79
|
|
|
288
|
-
|
|
80
|
+
Never create draft GitHub Releases. The `release: published` event only fires when a release is published — drafts don't trigger the npm publish workflow.
|
|
289
81
|
|
|
290
|
-
|
|
82
|
+
### 8. Version Format
|
|
291
83
|
|
|
292
|
-
|
|
84
|
+
Semantic versioning only: `MAJOR.MINOR.PATCH` (e.g., `0.9.1`). Four-part versions like `0.8.21.4` are NOT valid semver and will break npm publish.
|
|
293
85
|
|
|
294
|
-
|
|
86
|
+
### 9. SKIP_BUILD_BUMP=1 in CI
|
|
295
87
|
|
|
296
|
-
|
|
88
|
+
Set this environment variable in all CI build steps to prevent the build script from mutating versions during CI runs.
|
|
297
89
|
|
|
298
|
-
|
|
90
|
+
## Release Checklist (Quick Reference)
|
|
299
91
|
|
|
300
|
-
```bash
|
|
301
|
-
# Unpublish (requires npm owner privileges)
|
|
302
|
-
npm unpublish @bradygaster/squad-sdk@0.8.22
|
|
303
|
-
npm unpublish @bradygaster/squad-cli@0.8.22
|
|
304
92
|
```
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
93
|
+
□ All tests passing on dev
|
|
94
|
+
□ No file:/link: references in packages/*/package.json
|
|
95
|
+
□ CHANGELOG.md updated
|
|
96
|
+
□ Version bumps committed (node -e script)
|
|
97
|
+
□ npm auth verified (Automation token)
|
|
98
|
+
□ No draft GitHub Releases pending
|
|
99
|
+
□ Local build + test: npm run build && npx vitest run
|
|
100
|
+
□ Push dev → CI green
|
|
101
|
+
□ Promote dev → preview (squad-promote workflow)
|
|
102
|
+
□ Preview CI green (squad-preview validates)
|
|
103
|
+
□ Promote preview → main
|
|
104
|
+
□ squad-release auto-creates GitHub Release
|
|
105
|
+
□ squad-npm-publish auto-triggers
|
|
106
|
+
□ Monitor publish workflow
|
|
107
|
+
□ Post-publish smoke test
|
|
317
108
|
```
|
|
318
109
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
```bash
|
|
322
|
-
# Delete GitHub Release
|
|
323
|
-
gh release delete "v0.8.22" --yes
|
|
324
|
-
|
|
325
|
-
# Delete tag locally and remotely
|
|
326
|
-
git tag -d "v0.8.22"
|
|
327
|
-
git push origin --delete "v0.8.22"
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
### 4. Revert Commit on main
|
|
331
|
-
|
|
332
|
-
```bash
|
|
333
|
-
# Revert version bump commit
|
|
334
|
-
git checkout main
|
|
335
|
-
git revert HEAD
|
|
336
|
-
git push origin main
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
**Checkpoint:** Tag and release deleted. main branch reverted. npm packages deprecated or unpublished.
|
|
340
|
-
|
|
341
|
-
---
|
|
342
|
-
|
|
343
|
-
## Common Failure Modes
|
|
344
|
-
|
|
345
|
-
### EOTP Error (npm OTP Required)
|
|
346
|
-
|
|
347
|
-
**Symptom:** Workflow fails with `EOTP` error.
|
|
348
|
-
**Root cause:** NPM_TOKEN is a User token with 2FA enabled. CI can't provide OTP.
|
|
349
|
-
**Fix:** Replace NPM_TOKEN with an Automation token (no 2FA). See "NPM_TOKEN Verification" above.
|
|
350
|
-
|
|
351
|
-
### Verify Step 404 (npm Propagation Delay)
|
|
352
|
-
|
|
353
|
-
**Symptom:** Verify step fails with 404 even though publish succeeded.
|
|
354
|
-
**Root cause:** npm registry propagation delay (5-30 seconds).
|
|
355
|
-
**Fix:** Verify step now has retry loop (5 attempts, 15s interval). Should auto-resolve. If not, wait 2 minutes and re-run workflow.
|
|
356
|
-
|
|
357
|
-
### Version Mismatch (package.json ≠ tag)
|
|
358
|
-
|
|
359
|
-
**Symptom:** Verify step fails with "Package version (X) does not match target version (Y)".
|
|
360
|
-
**Root cause:** package.json version doesn't match the tag version.
|
|
361
|
-
**Fix:** Ensure all 3 package.json files were updated in Step 1. Re-run `npm version` if needed.
|
|
362
|
-
|
|
363
|
-
### 4-Part Version Mangled by npm
|
|
364
|
-
|
|
365
|
-
**Symptom:** Published version on npm doesn't match package.json (e.g., 0.8.21.4 became 0.8.2-1.4).
|
|
366
|
-
**Root cause:** 4-part versions are NOT valid semver. npm's parser misinterprets them.
|
|
367
|
-
**Fix:** NEVER use 4-part versions. Only 3-part (0.8.22) or prerelease (0.8.23-preview.1). Run `semver.valid()` before ANY commit.
|
|
368
|
-
|
|
369
|
-
### Draft Release Didn't Trigger Workflow
|
|
370
|
-
|
|
371
|
-
**Symptom:** Release created but `publish.yml` never ran.
|
|
372
|
-
**Root cause:** Release was created as a draft. Draft releases don't emit `release: published` event.
|
|
373
|
-
**Fix:** Edit release and change to published: `gh release edit "v$VERSION" --draft=false`. Workflow should trigger immediately.
|
|
374
|
-
|
|
375
|
-
---
|
|
376
|
-
|
|
377
|
-
## Validation Checklist
|
|
378
|
-
|
|
379
|
-
Before starting ANY release, confirm:
|
|
380
|
-
|
|
381
|
-
- [ ] Version is valid semver: `node -p "require('semver').valid('VERSION')"` returns the version string (NOT null)
|
|
382
|
-
- [ ] NPM_TOKEN is an Automation token (no 2FA): `npm token list` shows `read-write` without OTP requirement
|
|
383
|
-
- [ ] Branch is clean: `git status` shows "nothing to commit, working tree clean"
|
|
384
|
-
- [ ] Tag doesn't exist: `git tag -l "vVERSION"` returns empty
|
|
385
|
-
- [ ] `SKIP_BUILD_BUMP=1` is set: `echo $SKIP_BUILD_BUMP` returns `1`
|
|
386
|
-
|
|
387
|
-
Before creating GitHub Release:
|
|
388
|
-
|
|
389
|
-
- [ ] All 3 package.json files have matching versions: `grep '"version"' package.json packages/*/package.json`
|
|
390
|
-
- [ ] Commit is pushed: `git log origin/main..main` returns empty
|
|
391
|
-
- [ ] Tag is pushed: `git ls-remote --tags origin vVERSION` returns the tag SHA
|
|
392
|
-
|
|
393
|
-
After GitHub Release:
|
|
394
|
-
|
|
395
|
-
- [ ] Release is published (NOT draft): `gh release view "vVERSION"` output doesn't contain "(draft)"
|
|
396
|
-
- [ ] Workflow is running: `gh run list --workflow=publish.yml --limit 1` shows "in_progress"
|
|
397
|
-
|
|
398
|
-
After workflow completes:
|
|
399
|
-
|
|
400
|
-
- [ ] Both jobs succeeded: Workflow shows green checkmarks
|
|
401
|
-
- [ ] SDK on npm: `npm view @bradygaster/squad-sdk version` returns correct version
|
|
402
|
-
- [ ] CLI on npm: `npm view @bradygaster/squad-cli version` returns correct version
|
|
403
|
-
- [ ] `latest` tags correct: `npm dist-tag ls @bradygaster/squad-sdk` shows `latest: VERSION`
|
|
404
|
-
- [ ] Packages install: `npm install @bradygaster/squad-cli` succeeds
|
|
405
|
-
|
|
406
|
-
After dev sync:
|
|
110
|
+
## Known Gotchas
|
|
407
111
|
|
|
408
|
-
|
|
112
|
+
| Gotcha | Impact | Mitigation |
|
|
113
|
+
|--------|--------|------------|
|
|
114
|
+
| npm workspaces rewrite `"*"` → `"file:../path"` | Broken global installs | Preflight scan in CI (squad-npm-publish.yml) |
|
|
115
|
+
| GitHub Actions workflow cache (~15min TTL) | 422 on workflow_dispatch after file renames | Wait 15min or use local publish fallback |
|
|
116
|
+
| `npm -w publish` hangs with 2FA | Silent hang, no error | Never use `-w` for publish |
|
|
117
|
+
| Draft GitHub Releases | npm publish workflow doesn't trigger | Never create drafts |
|
|
118
|
+
| User npm tokens with 2FA | EOTP errors in CI | Use Automation token type |
|
|
409
119
|
|
|
410
|
-
|
|
120
|
+
## CI Gate: Workspace Publish Policy
|
|
411
121
|
|
|
412
|
-
|
|
122
|
+
The `publish-policy` job in `squad-ci.yml` scans all workflow files for bare `npm publish` commands that are missing `-w`/`--workspace` flags. Any workflow that attempts a non-workspace-scoped publish will fail CI. This prevents accidental root-level publishes that would push the wrong `package.json` to npm.
|
|
413
123
|
|
|
414
|
-
|
|
124
|
+
See `.github/workflows/squad-ci.yml` → `publish-policy` job for implementation details.
|
|
415
125
|
|
|
416
|
-
|
|
417
|
-
1. No release without a runbook = improvisation = disaster
|
|
418
|
-
2. Semver validation is mandatory — 4-part versions break npm
|
|
419
|
-
3. NPM_TOKEN type matters — User tokens with 2FA fail in CI
|
|
420
|
-
4. Draft releases are a footgun — they don't trigger automation
|
|
421
|
-
5. Retry logic is essential — npm propagation takes time
|
|
126
|
+
## Related
|
|
422
127
|
|
|
423
|
-
|
|
128
|
+
- Issues: #556–#564 (release:next)
|
|
129
|
+
- Retro: `.squad/decisions/inbox/surgeon-v091-retrospective.md`
|
|
130
|
+
- CI audit: `.squad/decisions/inbox/booster-ci-audit.md`
|
|
131
|
+
- Playbook: `PUBLISH-README.md` (repo root)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Skill: Retro Enforcement
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Ensure retrospectives happen on schedule and that their action items are tracked in GitHub Issues — not markdown checklists.
|
|
6
|
+
|
|
7
|
+
This skill addresses a specific, measured failure mode: **0% completion rate on markdown retro action items across 6 consecutive retrospectives**. GitHub Issues have an 85%+ completion rate in the same squad. The format was the problem, not the people.
|
|
8
|
+
|
|
9
|
+
## Core Function: Test-RetroOverdue
|
|
10
|
+
|
|
11
|
+
```powershell
|
|
12
|
+
function Test-RetroOverdue {
|
|
13
|
+
param(
|
|
14
|
+
[string]$LogDir = ".squad/log",
|
|
15
|
+
[int]$WindowDays = 7,
|
|
16
|
+
[string]$Pattern = "*retrospective*"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
$cutoff = (Get-Date).AddDays(-$WindowDays)
|
|
20
|
+
|
|
21
|
+
$retroLogs = Get-ChildItem -Path $LogDir -Filter $Pattern -ErrorAction SilentlyContinue |
|
|
22
|
+
Where-Object { $_.LastWriteTime -ge $cutoff }
|
|
23
|
+
|
|
24
|
+
return ($retroLogs.Count -eq 0)
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Returns
|
|
29
|
+
- `$true` — No retro log found within the window. **Retro is overdue. Block other work.**
|
|
30
|
+
- `$false` — At least one retro log found within the window. Proceed normally.
|
|
31
|
+
|
|
32
|
+
### Detection Logic
|
|
33
|
+
|
|
34
|
+
The function checks `.squad/log/` for any file matching `*retrospective*` dated within the last `$WindowDays` days (default: 7). If none is found, the retro is overdue.
|
|
35
|
+
|
|
36
|
+
**File naming convention:** `.squad/log/{ISO8601-timestamp}-retrospective.md`
|
|
37
|
+
|
|
38
|
+
Example: `.squad/log/2026-03-24T14-45-00Z-retrospective.md`
|
|
39
|
+
|
|
40
|
+
## Coordinator Integration
|
|
41
|
+
|
|
42
|
+
Call `Test-RetroOverdue` **at the start of every round**, before building the work queue.
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
# At round start — before any work queue construction
|
|
46
|
+
if (Test-RetroOverdue -LogDir ".squad/log" -WindowDays 7) {
|
|
47
|
+
Write-Host "[RETRO] Retrospective overdue. Running before other work."
|
|
48
|
+
|
|
49
|
+
# Spawn retro facilitator
|
|
50
|
+
Invoke-RetroSession -Mode "catch-up"
|
|
51
|
+
|
|
52
|
+
# Wait for retro log to be written
|
|
53
|
+
# Then resume normal round
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Proceed with normal work queue
|
|
57
|
+
$workQueue = Get-PendingIssues | Sort-Object -Property Priority
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Blocking Semantics
|
|
61
|
+
|
|
62
|
+
When `Test-RetroOverdue` returns `$true`:
|
|
63
|
+
|
|
64
|
+
1. **Do not start any other work** until the retro completes
|
|
65
|
+
2. **Spawn the facilitator agent** (Scribe or designated) with retro mode
|
|
66
|
+
3. **Wait for the log file** to be written to `.squad/log/`
|
|
67
|
+
4. **Verify action items** were created as GitHub Issues (not markdown)
|
|
68
|
+
5. **Resume normal round** after retro log confirmed
|
|
69
|
+
|
|
70
|
+
## Action Item Enforcement
|
|
71
|
+
|
|
72
|
+
Every retro action item MUST become a GitHub Issue. The facilitator agent is responsible for this. The coordinator verifies.
|
|
73
|
+
|
|
74
|
+
### Verification Check
|
|
75
|
+
|
|
76
|
+
```powershell
|
|
77
|
+
function Test-RetroActionItemsCreated {
|
|
78
|
+
param([string]$RetroLogPath)
|
|
79
|
+
|
|
80
|
+
$content = Get-Content $RetroLogPath -Raw
|
|
81
|
+
|
|
82
|
+
# Check for Issue references (e.g., #1478, https://github.com/.../issues/1478)
|
|
83
|
+
$issueRefs = [regex]::Matches($content, '(?:#\d{3,}|issues/\d{3,})')
|
|
84
|
+
|
|
85
|
+
# Check for unclosed markdown checkboxes (bad pattern)
|
|
86
|
+
$openCheckboxes = [regex]::Matches($content, '- \[ \]')
|
|
87
|
+
|
|
88
|
+
if ($openCheckboxes.Count -gt 0) {
|
|
89
|
+
Write-Warning "[RETRO] Found $($openCheckboxes.Count) markdown checkboxes — convert to Issues"
|
|
90
|
+
return $false
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return ($issueRefs.Count -gt 0)
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Why Not Markdown Checklists
|
|
98
|
+
|
|
99
|
+
From production data in tamirdresher/tamresearch1:
|
|
100
|
+
|
|
101
|
+
| Retro | Action Items Format | Completion |
|
|
102
|
+
|-------|---------------------|------------|
|
|
103
|
+
| 2025-12-05 | Markdown `- [ ]` | 0/4 = **0%** |
|
|
104
|
+
| 2025-12-19 | Markdown `- [ ]` | 0/3 = **0%** |
|
|
105
|
+
| 2026-01-09 | Markdown `- [ ]` | 0/5 = **0%** |
|
|
106
|
+
| 2026-01-23 | Markdown `- [ ]` | 0/4 = **0%** |
|
|
107
|
+
| 2026-02-07 | Markdown `- [ ]` | 0/3 = **0%** |
|
|
108
|
+
| 2026-02-21 | Markdown `- [ ]` | 0/4 = **0%** |
|
|
109
|
+
| 2026-03-24 | GitHub Issues | 4/4 = **100%** (after enforcement) |
|
|
110
|
+
|
|
111
|
+
**Root cause:** Markdown checklists have no assignee, no notifications, no close event, and no query surface. They are invisible to every workflow that drives completion.
|
|
112
|
+
|
|
113
|
+
## Cadence Enforcement
|
|
114
|
+
|
|
115
|
+
### Recommended schedule
|
|
116
|
+
- Weekly squads: window = 7 days
|
|
117
|
+
- Bi-weekly squads: window = 14 days
|
|
118
|
+
|
|
119
|
+
### Ralph integration example
|
|
120
|
+
|
|
121
|
+
```powershell
|
|
122
|
+
# ralph-watch.ps1 — round start hook
|
|
123
|
+
function Invoke-RoundStart {
|
|
124
|
+
# 1. Always check retro first
|
|
125
|
+
if (Test-RetroOverdue -LogDir "$RepoRoot/.squad/log" -WindowDays 7) {
|
|
126
|
+
Write-Host "[RALPH] Retro overdue — enforcing before work queue"
|
|
127
|
+
Invoke-RetroSession
|
|
128
|
+
return # Re-enter round after retro completes
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
# 2. Normal work queue
|
|
132
|
+
$issues = Get-ReadyIssues
|
|
133
|
+
foreach ($issue in $issues) {
|
|
134
|
+
Invoke-WorkItem -Issue $issue
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Skill Metadata
|
|
140
|
+
|
|
141
|
+
| Field | Value |
|
|
142
|
+
|-------|-------|
|
|
143
|
+
| **Skill ID** | `retro-enforcement` |
|
|
144
|
+
| **Category** | Ceremonies / Process |
|
|
145
|
+
| **Trigger** | Coordinator round start |
|
|
146
|
+
| **Dependencies** | `.squad/log/` directory, GitHub Issues API |
|
|
147
|
+
| **Tested in** | tamirdresher/tamresearch1 (production, March 2026) |
|
|
148
|
+
| **Outcome** | Retro cadence restored; action item completion 0% → 100% |
|