Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Ensure retrospectives happen on schedule and that their action items are tracked in GitHub Issues — not markdown checklists.
.claude/skills/github-skill-retro-enforcement/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 221% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 48% | 0% |
Ensure retrospectives happen on schedule and that their action items are tracked in GitHub Issues — not markdown checklists.
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.
powershellfunction Test-RetroOverdue { param( [string]$LogDir = ".squad/log", [int]$WindowDays = 7, [string]$Pattern = "*retrospective*" ) $cutoff = (Get-Date).AddDays(-$WindowDays) $retroLogs = Get-ChildItem -Path $LogDir -Filter $Pattern -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $cutoff } return ($retroLogs.Count -eq 0) }
$true — No retro log found within the window. Retro is overdue. Block other work.$false — At least one retro log found within the window. Proceed normally.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.
File naming convention: .squad/log/{ISO8601-timestamp}-retrospective.md
Example: .squad/log/2026-03-24T14-45-00Z-retrospective.md
Call Test-RetroOverdue at the start of every round, before building the work queue.
powershell# At round start — before any work queue construction if (Test-RetroOverdue -LogDir ".squad/log" -WindowDays 7) { Write-Host "[RETRO] Retrospective overdue. Running before other work." # Spawn retro facilitator Invoke-RetroSession -Mode "catch-up" # Wait for retro log to be written # Then resume normal round } # Proceed with normal work queue $workQueue = Get-PendingIssues | Sort-Object -Property Priority
When Test-RetroOverdue returns $true:
.squad/log/Every retro action item MUST become a GitHub Issue. The facilitator agent is responsible for this. The coordinator verifies.
powershellfunction Test-RetroActionItemsCreated { param([string]$RetroLogPath) $content = Get-Content $RetroLogPath -Raw # Check for Issue references (e.g., #1478, https://github.com/.../issues/1478) $issueRefs = [regex]::Matches($content, '(?:#\d{3,}|issues/\d{3,})') # Check for unclosed markdown checkboxes (bad pattern) $openCheckboxes = [regex]::Matches($content, '- \[ \]') if ($openCheckboxes.Count -gt 0) { Write-Warning "[RETRO] Found $($openCheckboxes.Count) markdown checkboxes — convert to Issues" return $false } return ($issueRefs.Count -gt 0) }
From production data in tamirdresher/tamresearch1:
| Retro | Action Items Format | Completion | |-------|---------------------|------------| | 2025-12-05 | Markdown - [ ] | 0/4 = 0% | | 2025-12-19 | Markdown - [ ] | 0/3 = 0% | | 2026-01-09 | Markdown - [ ] | 0/5 = 0% | | 2026-01-23 | Markdown - [ ] | 0/4 = 0% | | 2026-02-07 | Markdown - [ ] | 0/3 = 0% | | 2026-02-21 | Markdown - [ ] | 0/4 = 0% | | 2026-03-24 | GitHub Issues | 4/4 = 100% (after enforcement) |
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.
powershell# ralph-watch.ps1 — round start hook function Invoke-RoundStart { # 1. Always check retro first if (Test-RetroOverdue -LogDir "$RepoRoot/.squad/log" -WindowDays 7) { Write-Host "[RALPH] Retro overdue — enforcing before work queue" Invoke-RetroSession return # Re-enter round after retro completes } # 2. Normal work queue $issues = Get-ReadyIssues foreach ($issue in $issues) { Invoke-WorkItem -Issue $issue } }
| Field | Value | |-------|-------| | Skill ID | retro-enforcement | | Category | Ceremonies / Process | | Trigger | Coordinator round start | | Dependencies | .squad/log/ directory, GitHub Issues API | | Tested in | tamirdresher/tamresearch1 (production, March 2026) | | Outcome | Retro cadence restored; action item completion 0% → 100% |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 17,345 | 24,034 | +39% | 1 | 1 | 0% | 3,270 | 4,116 | +26% | 0 | 0 | — |
case-02 | fail→fail | 19,009 | 13,679 | -28% | 1 | 1 | 0% | 3,174 | 4,087 | +29% | 0 | 0 | — |
case-03 | fail→pass | 61,472 | 15,760 | -74% | 1 | 1 | 0% | 1,272 | 4,077 | +221% | 0 | 0 | — |
case-04 | pass→pass | 12,322 | 8,809 | -29% | 1 | 1 | 0% | 2,125 | 3,056 | +44% | 0 | 0 | — |
case-05 | pass→pass | 15,888 | 24,925 | +57% | 1 | 1 | 0% | 3,226 | 5,914 | +83% | 0 | 0 | — |
case-06 | pass→pass | 15,472 | 14,837 | -4% | 1 | 1 | 0% | 2,406 | 3,732 | +55% | 0 | 0 | — |
case-07 | fail→pass | 11,006 | 6,893 | -37% | 1 | 1 | 0% | 1,854 | 2,558 | +38% | 0 | 0 | — |
case-08 | fail→pass | 10,817 | 5,193 | -52% | 1 | 1 | 0% | 1,650 | 2,412 | +46% | 0 | 0 | — |
case-09 | pass→pass | 12,072 | 4,739 | -61% | 1 | 1 | 0% | 1,567 | 2,162 | +38% | 0 | 0 | — |
case-10 | fail→pass | 12,301 | 5,117 | -58% | 1 | 1 | 0% | 1,541 | 2,278 | +48% | 0 | 0 | — |
case-11 | fail→pass | 16,469 | 15,851 | -4% | 1 | 1 | 0% | 2,149 | 3,089 | +44% | 0 | 0 | — |
case-12 | pass→pass | 22,491 | 13,354 | -41% | 1 | 1 | 0% | 2,100 | 3,577 | +70% | 0 | 0 | — |
case-13 | pass→pass | 22,090 | 6,856 | -69% | 1 | 1 | 0% | 2,464 | 2,360 | -4% | 0 | 0 | — |
case-14 | fail→fail | 9,039 | 3,119 | -65% | 1 | 1 | 0% | 1,413 | 1,829 | +29% | 0 | 0 | — |
case-15 | pass→pass | 8,814 | 6,576 | -25% | 1 | 1 | 0% | 1,329 | 2,371 | +78% | 0 | 0 | — |
case-16 | fail→pass | 17,090 | 2,350 | -86% | 1 | 1 | 0% | 1,543 | 1,689 | +9% | 0 | 0 | — |
case-17 | pass→pass | 9,377 | 5,719 | -39% | 1 | 1 | 0% | 1,458 | 2,266 | +55% | 0 | 0 | — |
case-18 | fail→pass | 11,771 | 3,749 | -68% | 1 | 1 | 0% | 1,825 | 1,992 | +9% | 0 | 0 | — |
case-19 | fail→pass | 10,707 | 6,601 | -38% | 1 | 1 | 0% | 1,558 | 2,472 | +59% | 0 | 0 | — |
case-20 | pass→pass | 24,831 | 5,227 | -79% | 1 | 1 | 0% | 2,109 | 2,118 | +0% | 0 | 0 | — |
case-21 | pass→pass | 17,452 | 32,565 | +87% | 1 | 1 | 0% | 2,913 | 3,351 | +15% | 0 | 0 | — |
case-22 | fail→pass | 16,337 | 3,835 | -77% | 1 | 1 | 0% | 2,701 | 2,075 | -23% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.