[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6R7S48XJ1YEJD2RV1S0YJS2":3,"skill-same:01M6R7S48XJ1YEJD2RV1S0YJS2":44},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":12,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":29,"install":30,"resources":43},"01M6R7S48XJ1YEJD2RV1S0YJS2","retro-enforcement",null,"barichter\u002Fsquad","barichter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F96797186?v=4","01M6R712K8ESMDF089BFENBR16","01M6R712R74BSQQSG2GTXBWR8P",0,"MIT","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fretro-enforcement\u002FSKILL.md",[],[17,18,19],"retro enforcement","retro","enforcement","2026-11-10 10:12:30",false,"# Skill: Retro Enforcement\n\n## Purpose\n\nEnsure retrospectives happen on schedule and that their action items are tracked in GitHub Issues — not markdown checklists.\n\nThis 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.\n\n## Core Function: Test-RetroOverdue\n\n```powershell\nfunction Test-RetroOverdue {\n    param(\n        [string]$LogDir    = \".squad\u002Flog\",\n        [int]$WindowDays   = 7,\n        [string]$Pattern   = \"*retrospective*\"\n    )\n\n    $cutoff = (Get-Date).AddDays(-$WindowDays)\n\n    $retroLogs = Get-ChildItem -Path $LogDir -Filter $Pattern -ErrorAction SilentlyContinue |\n                 Where-Object { $_.LastWriteTime -ge $cutoff }\n\n    return ($retroLogs.Count -eq 0)\n}\n```\n\n### Returns\n- `$true` — No retro log found within the window. **Retro is overdue. Block other work.**\n- `$false` — At least one retro log found within the window. Proceed normally.\n\n### Detection Logic\n\nThe function checks `.squad\u002Flog\u002F` for any file matching `*retrospective*` dated within the last `$WindowDays` days (default: 7). If none is found, the retro is overdue.\n\n**File naming convention:** `.squad\u002Flog\u002F{ISO8601-timestamp}-retrospective.md`\n\nExample: `.squad\u002Flog\u002F2026-03-24T14-45-00Z-retrospective.md`\n\n## Coordinator Integration\n\nCall `Test-RetroOverdue` **at the start of every round**, before building the work queue.\n\n```powershell\n# At round start — before any work queue construction\nif (Test-RetroOverdue -LogDir \".squad\u002Flog\" -WindowDays 7) {\n    Write-Host \"[RETRO] Retrospective overdue. Running before other work.\"\n\n    # Spawn retro facilitator\n    Invoke-RetroSession -Mode \"catch-up\"\n\n    # Wait for retro log to be written\n    # Then resume normal round\n}\n\n# Proceed with normal work queue\n$workQueue = Get-PendingIssues | Sort-Object -Property Priority\n```\n\n### Blocking Semantics\n\nWhen `Test-RetroOverdue` returns `$true`:\n\n1. **Do not start any other work** until the retro completes\n2. **Spawn the facilitator agent** (Scribe or designated) with retro mode\n3. **Wait for the log file** to be written to `.squad\u002Flog\u002F`\n4. **Verify action items** were created as GitHub Issues (not markdown)\n5. **Resume normal round** after retro log confirmed\n\n## Action Item Enforcement\n\nEvery retro action item MUST become a GitHub Issue. The facilitator agent is responsible for this. The coordinator verifies.\n\n### Verification Check\n\n```powershell\nfunction Test-RetroActionItemsCreated {\n    param([string]$RetroLogPath)\n\n    $content = Get-Content $RetroLogPath -Raw\n\n    # Check for Issue references (e.g., #1478, https:\u002F\u002Fgithub.com\u002F...\u002Fissues\u002F1478)\n    $issueRefs = [regex]::Matches($content, '(?:#\\d{3,}|issues\u002F\\d{3,})')\n\n    # Check for unclosed markdown checkboxes (bad pattern)\n    $openCheckboxes = [regex]::Matches($content, '- \\[ \\]')\n\n    if ($openCheckboxes.Count -gt 0) {\n        Write-Warning \"[RETRO] Found $($openCheckboxes.Count) markdown checkboxes — convert to Issues\"\n        return $false\n    }\n\n    return ($issueRefs.Count -gt 0)\n}\n```\n\n### Why Not Markdown Checklists\n\nFrom production data in tamirdresher\u002Ftamresearch1:\n\n| Retro | Action Items Format | Completion |\n|-------|---------------------|------------|\n| 2025-12-05 | Markdown `- [ ]` | 0\u002F4 = **0%** |\n| 2025-12-19 | Markdown `- [ ]` | 0\u002F3 = **0%** |\n| 2026-01-09 | Markdown `- [ ]` | 0\u002F5 = **0%** |\n| 2026-01-23 | Markdown `- [ ]` | 0\u002F4 = **0%** |\n| 2026-02-07 | Markdown `- [ ]` | 0\u002F3 = **0%** |\n| 2026-02-21 | Markdown `- [ ]` | 0\u002F4 = **0%** |\n| 2026-03-24 | GitHub Issues | 4\u002F4 = **100%** (after enforcement) |\n\n**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.\n\n## Cadence Enforcement\n\n### Recommended schedule\n- Weekly squads: window = 7 days\n- Bi-weekly squads: window = 14 days\n\n### Ralph integration example\n\n```powershell\n# ralph-watch.ps1 — round start hook\nfunction Invoke-RoundStart {\n    # 1. Always check retro first\n    if (Test-RetroOverdue -LogDir \"$RepoRoot\u002F.squad\u002Flog\" -WindowDays 7) {\n        Write-Host \"[RALPH] Retro overdue — enforcing before work queue\"\n        Invoke-RetroSession\n        return  # Re-enter round after retro completes\n    }\n\n    # 2. Normal work queue\n    $issues = Get-ReadyIssues\n    foreach ($issue in $issues) {\n        Invoke-WorkItem -Issue $issue\n    }\n}\n```\n\n## Skill Metadata\n\n| Field | Value |\n|-------|-------|\n| **Skill ID** | `retro-enforcement` |\n| **Category** | Ceremonies \u002F Process |\n| **Trigger** | Coordinator round start |\n| **Dependencies** | `.squad\u002Flog\u002F` directory, GitHub Issues API |\n| **Tested in** | tamirdresher\u002Ftamresearch1 (production, March 2026) |\n| **Outcome** | Retro cadence restored; action item completion 0% → 100% |\n",{},"dev","ec19f5e92325e634e3c6eff500e3cefa56131cc9","packages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fretro-enforcement","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad","https:\u002F\u002Fgithub.com\u002Fbarichter","2026-04-13 22:53:46",{"source":7,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add barichter\u002Fsquad --skill retro-enforcement",{"tool":36,"command":37},"bunx","bunx skills add barichter\u002Fsquad --skill retro-enforcement",{"tool":39,"command":40},"pnpm","pnpm dlx skills add barichter\u002Fsquad --skill retro-enforcement","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fretro-enforcement\u002FSKILL.md",true,[],[45,61,69,86,109,115],{"skillNo":46,"name":47,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":48,"categories":49,"keywords":55,"publishedAt":20},"01M6R7VE8SZD1E37WWJN4ZFPWB","My Skill","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fmy-skill\u002FSKILL.md",[50],{"categoryNo":51,"categoryName":52,"taxonomyType":53,"taxonomyTypeDesc":54},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[56,57,58,59,60],"my","my skill","tester","vitest","testing",{"skillNo":62,"name":63,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":20},"01M6R7VD19M4TMAA74XGD6QSZX","bad-skill","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fbad-skill\u002FSKILL.md",[],[67,68],"bad skill","bad",{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":20},"01M6R7V9TYTX6Z621V6RWA51G6","squad-conventions","Core conventions and patterns used in the Squad codebase","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fsquad-conventions\u002FSKILL.md",[],[76,77,78,79,80,81,82,83,84,85],"squad conventions","squad","conventions","project-conventions","core","patterns","project","manual","high","codebase",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":20},"01M6R7TTF0ABMGSVWASVYF6D51","rework-rate","Measure and interpret PR rework rate — the emerging 5th DORA metric","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Frework-rate\u002FSKILL.md",[],[93,94,95,96,97,98,99,100,101,84,77,102,103,104,105,106,107,108,83],"rate","rework rate","metric","efficiency","prs","when","pr","review","code quality","code","code-review","metrics","health","team","analyze","quality",{"skillNo":110,"name":111,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":20},"01M6R7TRZPET44JRCSQF08EEA8","nap","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fnap\u002FSKILL.md",[],[111],{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":122,"publishedAt":20},"01M6R7TK10WCT77A52E27GR5R3","{skill-name}","{what this skill teaches agents}","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskill.md",[121],{"categoryNo":51,"categoryName":52,"taxonomyType":53,"taxonomyTypeDesc":54},[123,124,125,126,127,128,129,130,131,132,83,84,60],"{skill name}","skill name","name","design","api","how","error-handling","learned","error","api-design"]