[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M719CJMQMW4FSE0AD32H5KJX":3,"skill-same:01M719CJMQMW4FSE0AD32H5KJX":59},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":44,"install":45,"resources":58},"01M719CJMQMW4FSE0AD32H5KJX","release-process",null,"Step-by-step release checklist for Squad — prevents v0.8.22 and v0.9.4-style disasters","DeDuva\u002Fsquad","DeDuva","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F8153108?v=4","01M719BQB25861D0TKS3RVHMN2","01M719BQBSWR380PSYDD5M9YD4",1,"MIT","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002F.copilot\u002Fskills\u002Frelease-process\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30],"release process","release","process","release checklist","decision","team","v0","squad","for","style","high","checklist","management","2026-11-10 10:12:30",false,"---\nname: \"release-process\"\ndescription: \"Step-by-step release checklist for Squad — prevents v0.8.22 and v0.9.4-style disasters\"\ndomain: \"release-management\"\nconfidence: \"high\"\nsource: \"team-decision\"\n---\n\n## Context\n\nThis 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) and hardened by v0.9.4 lessons (root package.json drift, CHANGELOG validation, GITHUB_TOKEN propagation limitation — PRs #1042, #1043, #1044).\n\nSee also: `.squad\u002Fskills\u002Frelease-process\u002FSKILL.md` for the team-level skill with full incident history.\n\n**Rule:** No agent releases Squad without following this checklist. No exceptions. No improvisation.\n\n---\n\n## Pre-Release Validation\n\nBefore starting ANY release work, validate the following:\n\n### 1. Version Number Validation\n\n**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.\n\n```bash\n# Check version is valid semver\nnode -p \"require('semver').valid('0.8.22')\"\n# Output: '0.8.22' = valid\n# Output: null = INVALID, STOP\n\n# For prerelease versions\nnode -p \"require('semver').valid('0.8.23-preview.1')\"\n# Output: '0.8.23-preview.1' = valid\n```\n\n**If `semver.valid()` returns `null`:** STOP. Fix the version. Do NOT proceed.\n\n### 2. NPM_TOKEN Verification\n\n**Rule:** NPM_TOKEN must be an **Automation token** (no 2FA required). User tokens with 2FA will fail in CI with EOTP errors.\n\n```bash\n# Check token type (requires npm CLI authenticated)\nnpm token list\n```\n\nLook for:\n- ✅ `read-write` tokens with NO 2FA requirement = Automation token (correct)\n- ❌ Tokens requiring OTP = User token (WRONG, will fail in CI)\n\n**How to create an Automation token:**\n1. Go to npmjs.com → Settings → Access Tokens\n2. Click \"Generate New Token\"\n3. Select **\"Automation\"** (NOT \"Publish\")\n4. Copy token and save as GitHub secret: `NPM_TOKEN`\n\n**If using a User token:** STOP. Create an Automation token first.\n\n### 3. Branch and Tag State\n\n**Rule:** Release from `main` branch. Ensure clean state, no uncommitted changes, latest from origin.\n\n```bash\n# Ensure on main and clean\ngit checkout main\ngit pull origin main\ngit status  # Should show: \"nothing to commit, working tree clean\"\n\n# Check tag doesn't already exist\ngit tag -l \"v0.8.22\"\n# Output should be EMPTY. If tag exists, release already done or collision.\n```\n\n**If tag exists:** STOP. Either release was already done, or there's a collision. Investigate before proceeding.\n\n### 4. Disable bump-build.mjs\n\n**Rule:** `bump-build.mjs` is for dev builds ONLY. It must NOT run during release builds (it increments build numbers, creating 4-part versions).\n\n```bash\n# Set env var to skip bump-build.mjs\nexport SKIP_BUILD_BUMP=1\n\n# Verify it's set\necho $SKIP_BUILD_BUMP\n# Output: 1\n```\n\n**For Windows PowerShell:**\n```powershell\n$env:SKIP_BUILD_BUMP = \"1\"\n```\n\n**If not set:** `bump-build.mjs` will run and mutate versions. This causes disasters (see v0.8.22).\n\n### 5. Root package.json Version Sync (v0.9.4 Lesson — PR #1043)\n\n**Rule:** `squad-release.yml` reads version from ROOT `package.json` (lines 31-35). If root is behind sub-packages (e.g., 0.9.1 while sub-packages are 0.9.4), the release workflow FAILS.\n\n```bash\n# Verify all 3 package.json files match\ngrep '\"version\"' package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\n# All 3 MUST show the same version\n\n# Fix if mismatched:\nnpm version $VERSION --workspaces --include-workspace-root --no-git-tag-version\n```\n\n**If versions don't match:** STOP. Run the `npm version` command above. This was the root cause of the v0.9.4 release delay.\n\n### 6. CHANGELOG.md Version Entry (v0.9.4 Lesson — PR #1042)\n\n**Rule:** `squad-release.yml` validates that `CHANGELOG.md` contains `## [$VERSION]`. An `[Unreleased]` section alone is NOT sufficient.\n\n```bash\n# Check CHANGELOG has the version entry\ngrep -q \"## \\[$VERSION\\]\" CHANGELOG.md && echo \"OK\" || echo \"MISSING — add version section\"\n```\n\n**Before promoting to main:**\n1. Convert `[Unreleased]` to `[$VERSION] - YYYY-MM-DD` in CHANGELOG.md\n2. Add a fresh `[Unreleased]` section above it\n\n**If `## [$VERSION]` is missing:** STOP. Update CHANGELOG.md before promoting.\n\n---\n\n## Release Workflow\n\n### Step 1: Version Bump\n\nUpdate version in all 3 package.json files (root + both workspaces) in lockstep.\n\n```bash\n# Set target version (no 'v' prefix)\nVERSION=\"0.8.22\"\n\n# Validate it's valid semver BEFORE proceeding\nnode -p \"require('semver').valid('$VERSION')\"\n# Must output the version string, NOT null\n\n# Update all 3 package.json files\nnpm version $VERSION --workspaces --include-workspace-root --no-git-tag-version\n\n# Verify all 3 match\ngrep '\"version\"' package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\n# All 3 should show: \"version\": \"0.8.22\"\n```\n\n**Checkpoint:** All 3 package.json files have identical versions. Run `semver.valid()` one more time to be sure.\n\n### Step 2: Commit and Tag\n\n```bash\n# Commit version bump\ngit add package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\ngit commit -m \"chore: bump version to $VERSION\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\"\n\n# Create tag (with 'v' prefix)\ngit tag -a \"v$VERSION\" -m \"Release v$VERSION\"\n\n# Push commit and tag\ngit push origin main\ngit push origin \"v$VERSION\"\n```\n\n**Checkpoint:** Tag created and pushed. Verify with `git tag -l \"v$VERSION\"`.\n\n### Step 3: Create GitHub Release\n\n**CRITICAL:** Release must be **published**, NOT draft. Draft releases don't trigger `publish.yml` workflow.\n\n```bash\n# Create GitHub Release (NOT draft)\ngh release create \"v$VERSION\" \\\n  --title \"v$VERSION\" \\\n  --notes \"Release notes go here\" \\\n  --latest\n\n# Verify release is PUBLISHED (not draft)\ngh release view \"v$VERSION\"\n# Output should NOT contain \"(draft)\"\n```\n\n**If output contains `(draft)`:** STOP. Delete the release and recreate without `--draft` flag.\n\n```bash\n# If you accidentally created a draft, fix it:\ngh release edit \"v$VERSION\" --draft=false\n```\n\n**Checkpoint:** Release is published (NOT draft). The `release: published` event fired and triggered `publish.yml`.\n\n### Step 4: Monitor Workflow\n\nThe `publish.yml` workflow should start automatically within 10 seconds of release creation.\n\n```bash\n# Watch workflow runs\ngh run list --workflow=publish.yml --limit 1\n\n# Get detailed status\ngh run view --log\n```\n\n**Expected flow:**\n1. `publish-sdk` job runs → publishes `@bradygaster\u002Fsquad-sdk`\n2. Verify step runs with retry loop (up to 5 attempts, 15s interval) to confirm SDK on npm registry\n3. `publish-cli` job runs → publishes `@bradygaster\u002Fsquad-cli`\n4. Verify step runs with retry loop to confirm CLI on npm registry\n\n**If workflow fails:** Check the logs. Common issues:\n- EOTP error = wrong NPM_TOKEN type (use Automation token)\n- Verify step timeout = npm propagation delay (retry loop should handle this, but propagation can take up to 2 minutes in rare cases)\n- Version mismatch = package.json version doesn't match tag\n\n**Checkpoint:** Both jobs succeeded. Workflow shows green checkmarks.\n\n### Step 5: Verify npm Publication\n\nManually verify both packages are on npm with correct `latest` dist-tag.\n\n```bash\n# Check SDK\nnpm view @bradygaster\u002Fsquad-sdk version\n# Output: 0.8.22\n\nnpm dist-tag ls @bradygaster\u002Fsquad-sdk\n# Output should show: latest: 0.8.22\n\n# Check CLI\nnpm view @bradygaster\u002Fsquad-cli version\n# Output: 0.8.22\n\nnpm dist-tag ls @bradygaster\u002Fsquad-cli\n# Output should show: latest: 0.8.22\n```\n\n**If versions don't match:** Something went wrong. Check workflow logs. DO NOT proceed with GitHub Release announcement until npm is correct.\n\n**Checkpoint:** Both packages show correct version. `latest` dist-tags point to the new version.\n\n### Step 6: Test Installation\n\nVerify packages can be installed from npm (real-world smoke test).\n\n```bash\n# Create temp directory\nmkdir \u002Ftmp\u002Fsquad-release-test && cd \u002Ftmp\u002Fsquad-release-test\n\n# Test SDK installation\nnpm init -y\nnpm install @bradygaster\u002Fsquad-sdk\nnode -p \"require('@bradygaster\u002Fsquad-sdk\u002Fpackage.json').version\"\n# Output: 0.8.22\n\n# Test CLI installation\nnpm install -g @bradygaster\u002Fsquad-cli\nsquad --version\n# Output: 0.8.22\n\n# Cleanup\ncd -\nrm -rf \u002Ftmp\u002Fsquad-release-test\n```\n\n**If installation fails:** npm registry issue or package metadata corruption. DO NOT announce release until this works.\n\n**Checkpoint:** Both packages install cleanly. Versions match.\n\n### Step 7: Sync dev to Next Preview\n\nAfter main release, sync dev to the next preview version.\n\n```bash\n# Checkout dev\ngit checkout dev\ngit pull origin dev\n\n# Bump to next preview version (e.g., 0.8.23-preview.1)\nNEXT_VERSION=\"0.8.23-preview.1\"\n\n# Validate semver\nnode -p \"require('semver').valid('$NEXT_VERSION')\"\n# Must output the version string, NOT null\n\n# Update all 3 package.json files\nnpm version $NEXT_VERSION --workspaces --include-workspace-root --no-git-tag-version\n\n# Commit\ngit add package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\ngit commit -m \"chore: bump dev to $NEXT_VERSION\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\"\n\n# Push\ngit push origin dev\n```\n\n**Checkpoint:** dev branch now shows next preview version. Future dev builds will publish to `@preview` dist-tag.\n\n---\n\n## Manual Publish (Fallback)\n\nIf `publish.yml` workflow fails or needs to be bypassed, use `workflow_dispatch` to manually trigger publish.\n\n```bash\n# Trigger manual publish — ALWAYS use --ref main\ngh workflow run squad-npm-publish.yml --ref main -f version=\"0.8.22\"\n\n# Monitor the run\ngh run watch\n```\n\n**Rule:** Only use this if automated publish failed. Always investigate why automation failed and fix it for next release.\n\n### GITHUB_TOKEN Event Propagation Limitation (v0.9.4 — CRITICAL)\n\nWhen `squad-release.yml` creates a GitHub Release using the default `GITHUB_TOKEN`, the `release: published` event does **NOT** trigger `squad-npm-publish.yml`. This is a GitHub security feature to prevent infinite workflow loops.\n\n**After the release workflow succeeds**, check if `squad-npm-publish.yml` started automatically. If it didn't:\n```bash\ngh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z\n```\n\nIMPORTANT: Use `--ref main` — the repo default branch is `dev`, and the workflow must run against `main` where the release tag and artifacts exist.\n\n**Permanent fix (TODO):** Use a PAT or GitHub App token in `squad-release.yml` instead of `GITHUB_TOKEN`.\n\n---\n\n## Rollback Procedure\n\nIf a release is broken and needs to be rolled back:\n\n### 1. Unpublish from npm (Nuclear Option)\n\n**WARNING:** npm unpublish is time-limited (24 hours) and leaves the version slot burned. Only use if version is critically broken.\n\n```bash\n# Unpublish (requires npm owner privileges)\nnpm unpublish @bradygaster\u002Fsquad-sdk@0.8.22\nnpm unpublish @bradygaster\u002Fsquad-cli@0.8.22\n```\n\n### 2. Deprecate on npm (Preferred)\n\n**Preferred approach:** Mark version as deprecated, publish a hotfix.\n\n```bash\n# Deprecate broken version\nnpm deprecate @bradygaster\u002Fsquad-sdk@0.8.22 \"Broken release, use 0.8.22.1 instead\"\nnpm deprecate @bradygaster\u002Fsquad-cli@0.8.22 \"Broken release, use 0.8.22.1 instead\"\n\n# Publish hotfix version\n# (Follow this runbook with version 0.8.22.1)\n```\n\n### 3. Delete GitHub Release and Tag\n\n```bash\n# Delete GitHub Release\ngh release delete \"v0.8.22\" --yes\n\n# Delete tag locally and remotely\ngit tag -d \"v0.8.22\"\ngit push origin --delete \"v0.8.22\"\n```\n\n### 4. Revert Commit on main\n\n```bash\n# Revert version bump commit\ngit checkout main\ngit revert HEAD\ngit push origin main\n```\n\n**Checkpoint:** Tag and release deleted. main branch reverted. npm packages deprecated or unpublished.\n\n---\n\n## Common Failure Modes\n\n### EOTP Error (npm OTP Required)\n\n**Symptom:** Workflow fails with `EOTP` error.  \n**Root cause:** NPM_TOKEN is a User token with 2FA enabled. CI can't provide OTP.  \n**Fix:** Replace NPM_TOKEN with an Automation token (no 2FA). See \"NPM_TOKEN Verification\" above.\n\n### Verify Step 404 (npm Propagation Delay)\n\n**Symptom:** Verify step fails with 404 even though publish succeeded.  \n**Root cause:** npm registry propagation delay (5-30 seconds).  \n**Fix:** Verify step now has retry loop (5 attempts, 15s interval). Should auto-resolve. If not, wait 2 minutes and re-run workflow.\n\n### Version Mismatch (package.json ≠ tag)\n\n**Symptom:** Verify step fails with \"Package version (X) does not match target version (Y)\".  \n**Root cause:** package.json version doesn't match the tag version.  \n**Fix:** Ensure all 3 package.json files were updated in Step 1. Re-run `npm version` if needed.\n\n### 4-Part Version Mangled by npm\n\n**Symptom:** Published version on npm doesn't match package.json (e.g., 0.8.21.4 became 0.8.2-1.4).  \n**Root cause:** 4-part versions are NOT valid semver. npm's parser misinterprets them.  \n**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.\n\n### Draft Release Didn't Trigger Workflow\n\n**Symptom:** Release created but `publish.yml` never ran.  \n**Root cause:** Release was created as a draft. Draft releases don't emit `release: published` event.  \n**Fix:** Edit release and change to published: `gh release edit \"v$VERSION\" --draft=false`. Workflow should trigger immediately.\n\n### Root package.json Version Drift (v0.9.4 — PR #1043)\n\n**Symptom:** `squad-release.yml` fails with \"Version $VERSION not found in CHANGELOG.md\" even though CHANGELOG looks correct.  \n**Root cause:** Root `package.json` version is behind sub-packages. The workflow reads version from root, not from workspace packages.  \n**Fix:** Run `npm version $VERSION --workspaces --include-workspace-root --no-git-tag-version` to sync all 3 package.json files.\n\n### CHANGELOG Missing Version Section (v0.9.4 — PR #1042)\n\n**Symptom:** `squad-release.yml` fails with \"Version $VERSION not found in CHANGELOG.md\".  \n**Root cause:** CHANGELOG.md still has `[Unreleased]` but no `## [$VERSION]` section.  \n**Fix:** Convert `[Unreleased]` to `[$VERSION] - YYYY-MM-DD` and add a fresh `[Unreleased]` above it.\n\n### Publish Workflow Not Triggered After Release (v0.9.4 — GITHUB_TOKEN)\n\n**Symptom:** `squad-release.yml` succeeds, creates tag + GitHub Release, but `squad-npm-publish.yml` never starts.  \n**Root cause:** `GITHUB_TOKEN`-created events don't trigger other workflows (GitHub security feature).  \n**Fix:** Manually trigger: `gh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z`\n\n### Lockfile Integrity Check Rejects Workspace Packages (v0.9.4 — PR #1044)\n\n**Symptom:** `squad-npm-publish.yml` lockfile stability check fails on workspace packages.  \n**Root cause:** Workspace packages resolve to bare relative paths (`packages\u002Fsquad-sdk`), not `file:` URLs. The check tried to validate integrity hashes on non-registry packages.  \n**Fix:** Filter lockfile integrity check to only validate packages resolved from npm registry (`startsWith('https:\u002F\u002F')`).\n\n### Prebuild Bump Breaks Workspace Linking (v0.9.4)\n\n**Symptom:** Local `npm run build` fails with resolution errors after running prebuild.  \n**Root cause:** `scripts\u002Fbump-build.mjs` bumps `0.9.4` → `0.9.4-build.1`, breaking exact version match in CLI's dependency on SDK.  \n**Fix:** Reset and reinstall:\n```bash\ngit checkout -- package.json packages\u002F*\u002Fpackage.json\nrm -rf node_modules packages\u002F*\u002Fnode_modules\nnpm install\nnpm run build\n```\n\n---\n\n## Validation Checklist\n\nBefore starting ANY release, confirm:\n\n- [ ] Version is valid semver: `node -p \"require('semver').valid('VERSION')\"` returns the version string (NOT null)\n- [ ] NPM_TOKEN is an Automation token (no 2FA): `npm token list` shows `read-write` without OTP requirement\n- [ ] Branch is clean: `git status` shows \"nothing to commit, working tree clean\"\n- [ ] Tag doesn't exist: `git tag -l \"vVERSION\"` returns empty\n- [ ] `SKIP_BUILD_BUMP=1` is set: `echo $SKIP_BUILD_BUMP` returns `1`\n- [ ] **Root package.json version matches sub-packages** (v0.9.4): `grep '\"version\"' package.json packages\u002F*\u002Fpackage.json` — all 3 identical\n- [ ] **CHANGELOG.md has `## [$VERSION]` section** (v0.9.4): `grep \"## \\[$VERSION\\]\" CHANGELOG.md` returns a match\n\nBefore creating GitHub Release:\n\n- [ ] All 3 package.json files have matching versions: `grep '\"version\"' package.json packages\u002F*\u002Fpackage.json`\n- [ ] Commit is pushed: `git log origin\u002Fmain..main` returns empty\n- [ ] Tag is pushed: `git ls-remote --tags origin vVERSION` returns the tag SHA\n\nAfter GitHub Release:\n\n- [ ] Release is published (NOT draft): `gh release view \"vVERSION\"` output doesn't contain \"(draft)\"\n- [ ] Workflow is running: `gh run list --workflow=squad-npm-publish.yml --limit 1` shows \"in_progress\"\n- [ ] **If workflow didn't trigger** (GITHUB_TOKEN limitation): `gh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z`\n\nAfter workflow completes:\n\n- [ ] Both jobs succeeded: Workflow shows green checkmarks\n- [ ] SDK on npm: `npm view @bradygaster\u002Fsquad-sdk version` returns correct version\n- [ ] CLI on npm: `npm view @bradygaster\u002Fsquad-cli version` returns correct version\n- [ ] `latest` tags correct: `npm dist-tag ls @bradygaster\u002Fsquad-sdk` shows `latest: VERSION`\n- [ ] Packages install: `npm install @bradygaster\u002Fsquad-cli` succeeds\n\nAfter dev sync:\n\n- [ ] dev branch has next preview version: `git show dev:package.json | grep version` shows next preview\n\n---\n\n## Post-Mortem Reference\n\nThis skill was created after the v0.8.22 release disaster and updated after v0.9.4. Full retrospective: `.squad\u002Fdecisions\u002Finbox\u002Fkeaton-v0822-retrospective.md`\n\n**Key learnings (v0.8.22):**\n1. No release without a runbook = improvisation = disaster\n2. Semver validation is mandatory — 4-part versions break npm\n3. NPM_TOKEN type matters — User tokens with 2FA fail in CI\n4. Draft releases are a footgun — they don't trigger automation\n5. Retry logic is essential — npm propagation takes time\n\n**Key learnings (v0.9.4 — PRs #1042, #1043, #1044):**\n6. Root package.json MUST match sub-packages — squad-release.yml reads from root\n7. CHANGELOG.md must have `## [$VERSION]` section — `[Unreleased]` is not enough\n8. GITHUB_TOKEN events don't trigger downstream workflows — manual dispatch required\n9. Lockfile integrity checks must filter out workspace packages (not from registry)\n10. Prebuild version bump breaks local workspace linking — reset with git checkout\n\n**The full promotion chain (v0.9.4 documented):**\n```\ndev → preview → main (via squad-promote.yml)\nmain push → squad-release.yml validates CHANGELOG, creates tag + GitHub Release\nrelease published → squad-npm-publish.yml (⚠️ may be BLOCKED by GITHUB_TOKEN limitation)\nmanual workaround → gh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z\n```\n\n**Never again.**\n\n---\n\n## Local Development\n\n### Recovering from Prebuild Version Bump (v0.9.4)\n\n`scripts\u002Fbump-build.mjs` runs during `npm run prebuild` and mutates versions (e.g., `0.9.4` → `0.9.4-build.1`). This breaks workspace linking because CLI depends on exact version match with SDK.\n\n**Recovery steps:**\n```bash\ngit checkout -- package.json packages\u002F*\u002Fpackage.json\nrm -rf node_modules packages\u002F*\u002Fnode_modules\nnpm install\nnpm run build\n```\n\n**Prevention:** Set `SKIP_BUILD_BUMP=1` before running builds locally if you don't need build-number incrementing.\n\n---\n\n## Related\n\n- Team-level skill: `.squad\u002Fskills\u002Frelease-process\u002FSKILL.md`\n- v0.9.4 fixes: PR #1042 (CHANGELOG), PR #1043 (root package.json), PR #1044 (lockfile integrity)\n- v0.8.22 retrospective: `.squad\u002Fdecisions\u002Finbox\u002Fkeaton-v0822-retrospective.md`\n- Playbook: `PUBLISH-README.md` (repo root)\n","## Context\n\nThis 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) and hardened by v0.9.4 lessons (root package.json drift, CHANGELOG validation, GITHUB_TOKEN propagation limitation — PRs #1042, #1043, #1044).\n\nSee also: `.squad\u002Fskills\u002Frelease-process\u002FSKILL.md` for the team-level skill with full incident history.\n\n**Rule:** No agent releases Squad without following this checklist. No exceptions. No improvisation.\n\n---\n\n## Pre-Release Validation\n\nBefore starting ANY release work, validate the following:\n\n### 1. Version Number Validation\n\n**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.\n\n```bash\n# Check version is valid semver\nnode -p \"require('semver').valid('0.8.22')\"\n# Output: '0.8.22' = valid\n# Output: null = INVALID, STOP\n\n# For prerelease versions\nnode -p \"require('semver').valid('0.8.23-preview.1')\"\n# Output: '0.8.23-preview.1' = valid\n```\n\n**If `semver.valid()` returns `null`:** STOP. Fix the version. Do NOT proceed.\n\n### 2. NPM_TOKEN Verification\n\n**Rule:** NPM_TOKEN must be an **Automation token** (no 2FA required). User tokens with 2FA will fail in CI with EOTP errors.\n\n```bash\n# Check token type (requires npm CLI authenticated)\nnpm token list\n```\n\nLook for:\n- ✅ `read-write` tokens with NO 2FA requirement = Automation token (correct)\n- ❌ Tokens requiring OTP = User token (WRONG, will fail in CI)\n\n**How to create an Automation token:**\n1. Go to npmjs.com → Settings → Access Tokens\n2. Click \"Generate New Token\"\n3. Select **\"Automation\"** (NOT \"Publish\")\n4. Copy token and save as GitHub secret: `NPM_TOKEN`\n\n**If using a User token:** STOP. Create an Automation token first.\n\n### 3. Branch and Tag State\n\n**Rule:** Release from `main` branch. Ensure clean state, no uncommitted changes, latest from origin.\n\n```bash\n# Ensure on main and clean\ngit checkout main\ngit pull origin main\ngit status  # Should show: \"nothing to commit, working tree clean\"\n\n# Check tag doesn't already exist\ngit tag -l \"v0.8.22\"\n# Output should be EMPTY. If tag exists, release already done or collision.\n```\n\n**If tag exists:** STOP. Either release was already done, or there's a collision. Investigate before proceeding.\n\n### 4. Disable bump-build.mjs\n\n**Rule:** `bump-build.mjs` is for dev builds ONLY. It must NOT run during release builds (it increments build numbers, creating 4-part versions).\n\n```bash\n# Set env var to skip bump-build.mjs\nexport SKIP_BUILD_BUMP=1\n\n# Verify it's set\necho $SKIP_BUILD_BUMP\n# Output: 1\n```\n\n**For Windows PowerShell:**\n```powershell\n$env:SKIP_BUILD_BUMP = \"1\"\n```\n\n**If not set:** `bump-build.mjs` will run and mutate versions. This causes disasters (see v0.8.22).\n\n### 5. Root package.json Version Sync (v0.9.4 Lesson — PR #1043)\n\n**Rule:** `squad-release.yml` reads version from ROOT `package.json` (lines 31-35). If root is behind sub-packages (e.g., 0.9.1 while sub-packages are 0.9.4), the release workflow FAILS.\n\n```bash\n# Verify all 3 package.json files match\ngrep '\"version\"' package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\n# All 3 MUST show the same version\n\n# Fix if mismatched:\nnpm version $VERSION --workspaces --include-workspace-root --no-git-tag-version\n```\n\n**If versions don't match:** STOP. Run the `npm version` command above. This was the root cause of the v0.9.4 release delay.\n\n### 6. CHANGELOG.md Version Entry (v0.9.4 Lesson — PR #1042)\n\n**Rule:** `squad-release.yml` validates that `CHANGELOG.md` contains `## [$VERSION]`. An `[Unreleased]` section alone is NOT sufficient.\n\n```bash\n# Check CHANGELOG has the version entry\ngrep -q \"## \\[$VERSION\\]\" CHANGELOG.md && echo \"OK\" || echo \"MISSING — add version section\"\n```\n\n**Before promoting to main:**\n1. Convert `[Unreleased]` to `[$VERSION] - YYYY-MM-DD` in CHANGELOG.md\n2. Add a fresh `[Unreleased]` section above it\n\n**If `## [$VERSION]` is missing:** STOP. Update CHANGELOG.md before promoting.\n\n---\n\n## Release Workflow\n\n### Step 1: Version Bump\n\nUpdate version in all 3 package.json files (root + both workspaces) in lockstep.\n\n```bash\n# Set target version (no 'v' prefix)\nVERSION=\"0.8.22\"\n\n# Validate it's valid semver BEFORE proceeding\nnode -p \"require('semver').valid('$VERSION')\"\n# Must output the version string, NOT null\n\n# Update all 3 package.json files\nnpm version $VERSION --workspaces --include-workspace-root --no-git-tag-version\n\n# Verify all 3 match\ngrep '\"version\"' package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\n# All 3 should show: \"version\": \"0.8.22\"\n```\n\n**Checkpoint:** All 3 package.json files have identical versions. Run `semver.valid()` one more time to be sure.\n\n### Step 2: Commit and Tag\n\n```bash\n# Commit version bump\ngit add package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\ngit commit -m \"chore: bump version to $VERSION\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\"\n\n# Create tag (with 'v' prefix)\ngit tag -a \"v$VERSION\" -m \"Release v$VERSION\"\n\n# Push commit and tag\ngit push origin main\ngit push origin \"v$VERSION\"\n```\n\n**Checkpoint:** Tag created and pushed. Verify with `git tag -l \"v$VERSION\"`.\n\n### Step 3: Create GitHub Release\n\n**CRITICAL:** Release must be **published**, NOT draft. Draft releases don't trigger `publish.yml` workflow.\n\n```bash\n# Create GitHub Release (NOT draft)\ngh release create \"v$VERSION\" \\\n  --title \"v$VERSION\" \\\n  --notes \"Release notes go here\" \\\n  --latest\n\n# Verify release is PUBLISHED (not draft)\ngh release view \"v$VERSION\"\n# Output should NOT contain \"(draft)\"\n```\n\n**If output contains `(draft)`:** STOP. Delete the release and recreate without `--draft` flag.\n\n```bash\n# If you accidentally created a draft, fix it:\ngh release edit \"v$VERSION\" --draft=false\n```\n\n**Checkpoint:** Release is published (NOT draft). The `release: published` event fired and triggered `publish.yml`.\n\n### Step 4: Monitor Workflow\n\nThe `publish.yml` workflow should start automatically within 10 seconds of release creation.\n\n```bash\n# Watch workflow runs\ngh run list --workflow=publish.yml --limit 1\n\n# Get detailed status\ngh run view --log\n```\n\n**Expected flow:**\n1. `publish-sdk` job runs → publishes `@bradygaster\u002Fsquad-sdk`\n2. Verify step runs with retry loop (up to 5 attempts, 15s interval) to confirm SDK on npm registry\n3. `publish-cli` job runs → publishes `@bradygaster\u002Fsquad-cli`\n4. Verify step runs with retry loop to confirm CLI on npm registry\n\n**If workflow fails:** Check the logs. Common issues:\n- EOTP error = wrong NPM_TOKEN type (use Automation token)\n- Verify step timeout = npm propagation delay (retry loop should handle this, but propagation can take up to 2 minutes in rare cases)\n- Version mismatch = package.json version doesn't match tag\n\n**Checkpoint:** Both jobs succeeded. Workflow shows green checkmarks.\n\n### Step 5: Verify npm Publication\n\nManually verify both packages are on npm with correct `latest` dist-tag.\n\n```bash\n# Check SDK\nnpm view @bradygaster\u002Fsquad-sdk version\n# Output: 0.8.22\n\nnpm dist-tag ls @bradygaster\u002Fsquad-sdk\n# Output should show: latest: 0.8.22\n\n# Check CLI\nnpm view @bradygaster\u002Fsquad-cli version\n# Output: 0.8.22\n\nnpm dist-tag ls @bradygaster\u002Fsquad-cli\n# Output should show: latest: 0.8.22\n```\n\n**If versions don't match:** Something went wrong. Check workflow logs. DO NOT proceed with GitHub Release announcement until npm is correct.\n\n**Checkpoint:** Both packages show correct version. `latest` dist-tags point to the new version.\n\n### Step 6: Test Installation\n\nVerify packages can be installed from npm (real-world smoke test).\n\n```bash\n# Create temp directory\nmkdir \u002Ftmp\u002Fsquad-release-test && cd \u002Ftmp\u002Fsquad-release-test\n\n# Test SDK installation\nnpm init -y\nnpm install @bradygaster\u002Fsquad-sdk\nnode -p \"require('@bradygaster\u002Fsquad-sdk\u002Fpackage.json').version\"\n# Output: 0.8.22\n\n# Test CLI installation\nnpm install -g @bradygaster\u002Fsquad-cli\nsquad --version\n# Output: 0.8.22\n\n# Cleanup\ncd -\nrm -rf \u002Ftmp\u002Fsquad-release-test\n```\n\n**If installation fails:** npm registry issue or package metadata corruption. DO NOT announce release until this works.\n\n**Checkpoint:** Both packages install cleanly. Versions match.\n\n### Step 7: Sync dev to Next Preview\n\nAfter main release, sync dev to the next preview version.\n\n```bash\n# Checkout dev\ngit checkout dev\ngit pull origin dev\n\n# Bump to next preview version (e.g., 0.8.23-preview.1)\nNEXT_VERSION=\"0.8.23-preview.1\"\n\n# Validate semver\nnode -p \"require('semver').valid('$NEXT_VERSION')\"\n# Must output the version string, NOT null\n\n# Update all 3 package.json files\nnpm version $NEXT_VERSION --workspaces --include-workspace-root --no-git-tag-version\n\n# Commit\ngit add package.json packages\u002Fsquad-sdk\u002Fpackage.json packages\u002Fsquad-cli\u002Fpackage.json\ngit commit -m \"chore: bump dev to $NEXT_VERSION\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\"\n\n# Push\ngit push origin dev\n```\n\n**Checkpoint:** dev branch now shows next preview version. Future dev builds will publish to `@preview` dist-tag.\n\n---\n\n## Manual Publish (Fallback)\n\nIf `publish.yml` workflow fails or needs to be bypassed, use `workflow_dispatch` to manually trigger publish.\n\n```bash\n# Trigger manual publish — ALWAYS use --ref main\ngh workflow run squad-npm-publish.yml --ref main -f version=\"0.8.22\"\n\n# Monitor the run\ngh run watch\n```\n\n**Rule:** Only use this if automated publish failed. Always investigate why automation failed and fix it for next release.\n\n### GITHUB_TOKEN Event Propagation Limitation (v0.9.4 — CRITICAL)\n\nWhen `squad-release.yml` creates a GitHub Release using the default `GITHUB_TOKEN`, the `release: published` event does **NOT** trigger `squad-npm-publish.yml`. This is a GitHub security feature to prevent infinite workflow loops.\n\n**After the release workflow succeeds**, check if `squad-npm-publish.yml` started automatically. If it didn't:\n```bash\ngh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z\n```\n\nIMPORTANT: Use `--ref main` — the repo default branch is `dev`, and the workflow must run against `main` where the release tag and artifacts exist.\n\n**Permanent fix (TODO):** Use a PAT or GitHub App token in `squad-release.yml` instead of `GITHUB_TOKEN`.\n\n---\n\n## Rollback Procedure\n\nIf a release is broken and needs to be rolled back:\n\n### 1. Unpublish from npm (Nuclear Option)\n\n**WARNING:** npm unpublish is time-limited (24 hours) and leaves the version slot burned. Only use if version is critically broken.\n\n```bash\n# Unpublish (requires npm owner privileges)\nnpm unpublish @bradygaster\u002Fsquad-sdk@0.8.22\nnpm unpublish @bradygaster\u002Fsquad-cli@0.8.22\n```\n\n### 2. Deprecate on npm (Preferred)\n\n**Preferred approach:** Mark version as deprecated, publish a hotfix.\n\n```bash\n# Deprecate broken version\nnpm deprecate @bradygaster\u002Fsquad-sdk@0.8.22 \"Broken release, use 0.8.22.1 instead\"\nnpm deprecate @bradygaster\u002Fsquad-cli@0.8.22 \"Broken release, use 0.8.22.1 instead\"\n\n# Publish hotfix version\n# (Follow this runbook with version 0.8.22.1)\n```\n\n### 3. Delete GitHub Release and Tag\n\n```bash\n# Delete GitHub Release\ngh release delete \"v0.8.22\" --yes\n\n# Delete tag locally and remotely\ngit tag -d \"v0.8.22\"\ngit push origin --delete \"v0.8.22\"\n```\n\n### 4. Revert Commit on main\n\n```bash\n# Revert version bump commit\ngit checkout main\ngit revert HEAD\ngit push origin main\n```\n\n**Checkpoint:** Tag and release deleted. main branch reverted. npm packages deprecated or unpublished.\n\n---\n\n## Common Failure Modes\n\n### EOTP Error (npm OTP Required)\n\n**Symptom:** Workflow fails with `EOTP` error.  \n**Root cause:** NPM_TOKEN is a User token with 2FA enabled. CI can't provide OTP.  \n**Fix:** Replace NPM_TOKEN with an Automation token (no 2FA). See \"NPM_TOKEN Verification\" above.\n\n### Verify Step 404 (npm Propagation Delay)\n\n**Symptom:** Verify step fails with 404 even though publish succeeded.  \n**Root cause:** npm registry propagation delay (5-30 seconds).  \n**Fix:** Verify step now has retry loop (5 attempts, 15s interval). Should auto-resolve. If not, wait 2 minutes and re-run workflow.\n\n### Version Mismatch (package.json ≠ tag)\n\n**Symptom:** Verify step fails with \"Package version (X) does not match target version (Y)\".  \n**Root cause:** package.json version doesn't match the tag version.  \n**Fix:** Ensure all 3 package.json files were updated in Step 1. Re-run `npm version` if needed.\n\n### 4-Part Version Mangled by npm\n\n**Symptom:** Published version on npm doesn't match package.json (e.g., 0.8.21.4 became 0.8.2-1.4).  \n**Root cause:** 4-part versions are NOT valid semver. npm's parser misinterprets them.  \n**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.\n\n### Draft Release Didn't Trigger Workflow\n\n**Symptom:** Release created but `publish.yml` never ran.  \n**Root cause:** Release was created as a draft. Draft releases don't emit `release: published` event.  \n**Fix:** Edit release and change to published: `gh release edit \"v$VERSION\" --draft=false`. Workflow should trigger immediately.\n\n### Root package.json Version Drift (v0.9.4 — PR #1043)\n\n**Symptom:** `squad-release.yml` fails with \"Version $VERSION not found in CHANGELOG.md\" even though CHANGELOG looks correct.  \n**Root cause:** Root `package.json` version is behind sub-packages. The workflow reads version from root, not from workspace packages.  \n**Fix:** Run `npm version $VERSION --workspaces --include-workspace-root --no-git-tag-version` to sync all 3 package.json files.\n\n### CHANGELOG Missing Version Section (v0.9.4 — PR #1042)\n\n**Symptom:** `squad-release.yml` fails with \"Version $VERSION not found in CHANGELOG.md\".  \n**Root cause:** CHANGELOG.md still has `[Unreleased]` but no `## [$VERSION]` section.  \n**Fix:** Convert `[Unreleased]` to `[$VERSION] - YYYY-MM-DD` and add a fresh `[Unreleased]` above it.\n\n### Publish Workflow Not Triggered After Release (v0.9.4 — GITHUB_TOKEN)\n\n**Symptom:** `squad-release.yml` succeeds, creates tag + GitHub Release, but `squad-npm-publish.yml` never starts.  \n**Root cause:** `GITHUB_TOKEN`-created events don't trigger other workflows (GitHub security feature).  \n**Fix:** Manually trigger: `gh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z`\n\n### Lockfile Integrity Check Rejects Workspace Packages (v0.9.4 — PR #1044)\n\n**Symptom:** `squad-npm-publish.yml` lockfile stability check fails on workspace packages.  \n**Root cause:** Workspace packages resolve to bare relative paths (`packages\u002Fsquad-sdk`), not `file:` URLs. The check tried to validate integrity hashes on non-registry packages.  \n**Fix:** Filter lockfile integrity check to only validate packages resolved from npm registry (`startsWith('https:\u002F\u002F')`).\n\n### Prebuild Bump Breaks Workspace Linking (v0.9.4)\n\n**Symptom:** Local `npm run build` fails with resolution errors after running prebuild.  \n**Root cause:** `scripts\u002Fbump-build.mjs` bumps `0.9.4` → `0.9.4-build.1`, breaking exact version match in CLI's dependency on SDK.  \n**Fix:** Reset and reinstall:\n```bash\ngit checkout -- package.json packages\u002F*\u002Fpackage.json\nrm -rf node_modules packages\u002F*\u002Fnode_modules\nnpm install\nnpm run build\n```\n\n---\n\n## Validation Checklist\n\nBefore starting ANY release, confirm:\n\n- [ ] Version is valid semver: `node -p \"require('semver').valid('VERSION')\"` returns the version string (NOT null)\n- [ ] NPM_TOKEN is an Automation token (no 2FA): `npm token list` shows `read-write` without OTP requirement\n- [ ] Branch is clean: `git status` shows \"nothing to commit, working tree clean\"\n- [ ] Tag doesn't exist: `git tag -l \"vVERSION\"` returns empty\n- [ ] `SKIP_BUILD_BUMP=1` is set: `echo $SKIP_BUILD_BUMP` returns `1`\n- [ ] **Root package.json version matches sub-packages** (v0.9.4): `grep '\"version\"' package.json packages\u002F*\u002Fpackage.json` — all 3 identical\n- [ ] **CHANGELOG.md has `## [$VERSION]` section** (v0.9.4): `grep \"## \\[$VERSION\\]\" CHANGELOG.md` returns a match\n\nBefore creating GitHub Release:\n\n- [ ] All 3 package.json files have matching versions: `grep '\"version\"' package.json packages\u002F*\u002Fpackage.json`\n- [ ] Commit is pushed: `git log origin\u002Fmain..main` returns empty\n- [ ] Tag is pushed: `git ls-remote --tags origin vVERSION` returns the tag SHA\n\nAfter GitHub Release:\n\n- [ ] Release is published (NOT draft): `gh release view \"vVERSION\"` output doesn't contain \"(draft)\"\n- [ ] Workflow is running: `gh run list --workflow=squad-npm-publish.yml --limit 1` shows \"in_progress\"\n- [ ] **If workflow didn't trigger** (GITHUB_TOKEN limitation): `gh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z`\n\nAfter workflow completes:\n\n- [ ] Both jobs succeeded: Workflow shows green checkmarks\n- [ ] SDK on npm: `npm view @bradygaster\u002Fsquad-sdk version` returns correct version\n- [ ] CLI on npm: `npm view @bradygaster\u002Fsquad-cli version` returns correct version\n- [ ] `latest` tags correct: `npm dist-tag ls @bradygaster\u002Fsquad-sdk` shows `latest: VERSION`\n- [ ] Packages install: `npm install @bradygaster\u002Fsquad-cli` succeeds\n\nAfter dev sync:\n\n- [ ] dev branch has next preview version: `git show dev:package.json | grep version` shows next preview\n\n---\n\n## Post-Mortem Reference\n\nThis skill was created after the v0.8.22 release disaster and updated after v0.9.4. Full retrospective: `.squad\u002Fdecisions\u002Finbox\u002Fkeaton-v0822-retrospective.md`\n\n**Key learnings (v0.8.22):**\n1. No release without a runbook = improvisation = disaster\n2. Semver validation is mandatory — 4-part versions break npm\n3. NPM_TOKEN type matters — User tokens with 2FA fail in CI\n4. Draft releases are a footgun — they don't trigger automation\n5. Retry logic is essential — npm propagation takes time\n\n**Key learnings (v0.9.4 — PRs #1042, #1043, #1044):**\n6. Root package.json MUST match sub-packages — squad-release.yml reads from root\n7. CHANGELOG.md must have `## [$VERSION]` section — `[Unreleased]` is not enough\n8. GITHUB_TOKEN events don't trigger downstream workflows — manual dispatch required\n9. Lockfile integrity checks must filter out workspace packages (not from registry)\n10. Prebuild version bump breaks local workspace linking — reset with git checkout\n\n**The full promotion chain (v0.9.4 documented):**\n```\ndev → preview → main (via squad-promote.yml)\nmain push → squad-release.yml validates CHANGELOG, creates tag + GitHub Release\nrelease published → squad-npm-publish.yml (⚠️ may be BLOCKED by GITHUB_TOKEN limitation)\nmanual workaround → gh workflow run squad-npm-publish.yml --ref main -f version=X.Y.Z\n```\n\n**Never again.**\n\n---\n\n## Local Development\n\n### Recovering from Prebuild Version Bump (v0.9.4)\n\n`scripts\u002Fbump-build.mjs` runs during `npm run prebuild` and mutates versions (e.g., `0.9.4` → `0.9.4-build.1`). This breaks workspace linking because CLI depends on exact version match with SDK.\n\n**Recovery steps:**\n```bash\ngit checkout -- package.json packages\u002F*\u002Fpackage.json\nrm -rf node_modules packages\u002F*\u002Fnode_modules\nnpm install\nnpm run build\n```\n\n**Prevention:** Set `SKIP_BUILD_BUMP=1` before running builds locally if you don't need build-number incrementing.\n\n---\n\n## Related\n\n- Team-level skill: `.squad\u002Fskills\u002Frelease-process\u002FSKILL.md`\n- v0.9.4 fixes: PR #1042 (CHANGELOG), PR #1043 (root package.json), PR #1044 (lockfile integrity)\n- v0.8.22 retrospective: `.squad\u002Fdecisions\u002Finbox\u002Fkeaton-v0822-retrospective.md`\n- Playbook: `PUBLISH-README.md` (repo root)\n",{"name":5,"domain":36,"source":37,"confidence":28,"description":7},"release-management","team-decision","dev","4ffda80d1bb1043d9169688cf161e53097345c72",".copilot\u002Fskills\u002Frelease-process",0,"https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad","https:\u002F\u002Fgithub.com\u002FDeDuva","2026-11-09 20:24:44",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add DeDuva\u002Fsquad --skill release-process",{"tool":51,"command":52},"bunx","bunx skills add DeDuva\u002Fsquad --skill release-process",{"tool":54,"command":55},"pnpm","pnpm dlx skills add DeDuva\u002Fsquad --skill release-process","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002F.copilot\u002Fskills\u002Frelease-process\u002FSKILL.md",true,[],[60,76,84,99,122,137],{"skillNo":61,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":70,"publishedAt":31},"01M719NE6ZPZT80MKVWFDECJZ3","My Skill","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fmy-skill\u002FSKILL.md",[65],{"categoryNo":66,"categoryName":67,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[71,72,73,74,75],"my","my skill","testing","vitest","tester",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":31},"01M719NDJAMEWM8D9H355SCNA8","bad-skill","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fbad-skill\u002FSKILL.md",[],[82,83],"bad skill","bad",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":31},"01M719NCC1AZ02GHZ1V71YPEV7","squad-conventions","Core conventions and patterns used in the Squad codebase","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fsquad-conventions\u002FSKILL.md",[],[91,25,92,93,94,95,96,28,97,98],"conventions","squad conventions","project-conventions","core","project","manual","codebase","patterns",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":31},"01M719NAYM17B7X8MGP681EHKQ","rework-rate","Measure and interpret PR rework rate — the emerging 5th DORA metric","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Frework-rate\u002FSKILL.md",[],[106,107,108,109,28,110,111,112,25,113,114,115,116,96,117,118,119,23,120,121],"rate","rework rate","health","analyze","review efficiency","quality","metric","metrics","efficiency","code quality","pr","prs","when","code","code-review","review",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":31},"01M719NA136PDC3SQ10R4R88TH","nap","Context hygiene — compress, prune, archive .squad\u002F state","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fnap\u002FSKILL.md",[],[124,129,130,131,132,133,134,135,25,136],"prune","state","maintenance","context hygiene","archive","hygiene","compress","context",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":147,"publishedAt":31},"01M719N7B4PBQPNXW78TEJY4HQ","e2e-template-testing","End-to-end validation of coordinator and agent template changes","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fe2e-template-testing\u002FSKILL.md",[143,146],{"categoryNo":144,"categoryName":145,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":66,"categoryName":67,"taxonomyType":68,"taxonomyTypeDesc":69},[73,148,149,150,151,152,153,96,154,28,155],"e2e template testing","e2e","template","end","coordinator","development","changes","validation"]