Health
Project health dashboard.
This skill gives a full-stack view of open WTF issues in under a minute. It reports what is blocked, what is stale, and the clear next action for each problem found.
Process
0. GitHub CLI setup
Run steps 1–2 of ../references/gh-setup.md.
Stop if gh is not installed or not authenticated.
1. Choose the scope
Call AskUserQuestion (per ../references/questioning-style.md):
- question: "What scope do you want to check?"
- header: "Scope"
- options:
- Full project → all open Epics, Features, and Tasks
- One Epic → all work under a specific Epic
- One Feature → all Tasks under a specific Feature
For Epic or Feature scope, prompt for the issue number with options pre-filled from recent open issues.
2. Fetch all open issues
Run in parallel:
# Resolve $WTF_CLASS once — see ../references/issue-classification.md.
# labels mode → query by kind label; types mode → query by native issue type.
if [ "$WTF_CLASS" = types ]; then
gh issue list --search 'type:"Epic" state:open' --json number,title,labels,updatedAt --limit 50
gh issue list --search 'type:"Feature" state:open' --json number,title,labels,updatedAt --limit 100
gh issue list --search 'type:"Task" state:open' --json number,title,labels,updatedAt --limit 200
gh issue list --search 'type:"Bug" state:open' --json number,title,labels,updatedAt --limit 50
else
gh issue list --label "epic" --state open --json number,title,labels,updatedAt --limit 50
gh issue list --label "feature" --state open --json number,title,labels,updatedAt --limit 100
gh issue list --label "task" --state open --json number,title,labels,updatedAt --limit 200
gh issue list --label "bug" --state open --json number,title,labels,updatedAt --limit 50
fi
Also fetch open PRs to detect tasks with an open PR but no verified label:
gh pr list --state open --json number,title,headRefName,body --limit 50
3. Classify issues into health categories
For each issue, check its labels against the expected lifecycle:
Epics:
| Signal | Category |
|---|---|
| No child Features linked | ⚠️ Epic has no Features |
| All child Features closed | ✅ Epic complete — needs wtf.retro |
Features:
| Signal | Category |
|---|---|
No designed label, no child Tasks |
⚠️ Feature not designed, no tasks |
Has child Tasks, none implemented |
🔵 In progress |
All child Tasks verified, Feature still open |
✅ Feature complete — needs Feature PR |
Tasks:
| Signal | Category |
|---|---|
No designed label |
⚠️ Not designed — blocked before implement |
designed but not implemented for > 7 days |
🕐 Stale — may be forgotten |
implemented but not verified |
⏳ Waiting for QA |
verified but no open or merged PR |
⏳ Waiting for PR |
Has open PR but not verified |
⚠️ PR open without QA sign-off |
implemented + verified + PR merged |
✅ Done |
Bugs:
| Signal | Category |
|---|---|
| Open, no task linked in body | ⚠️ Bug not linked to a task |
| Open > 14 days | 🕐 Stale bug |
Staleness threshold for tasks is 7 days since last update. For bugs, it is 14 days. These are heuristics — flag but do not auto-close anything.
4. Render the health report
Project Health — <scope> — <YYYY-MM-DD>
────────────────────────────────────────────────────────
Epics: [n open]
Features: [n open]
Tasks: [n open] ([n] implemented, [n] verified, [n] stale)
Bugs: [n open] ([n] stale)
────────────────────────────────────────────────────────
⚠️ Needs attention ([n])
[#n] Task: <title>
Label gap: designed — not yet implemented (stale [n days])
Next: run implement-task
[#n] Task: <title>
implemented — not verified
Next: run verify-task
[#n] Feature: <title>
All tasks verified — Feature PR not opened
Next: run create-pr targeting main
[#n] Bug: <title>
Open [n days], no linked task
Next: run write-task to create a fix task
🕐 Stale ([n])
[#n] Task: <title>
Last updated [n days ago] — no activity since designed
────────────────────────────────────────────────────────
✅ Clean
[n] tasks verified and merged
[n] features closed
If everything is clean, print: "All open issues are in a healthy state. Nothing needs attention."
5. Offer to act on findings
If findings exist, call AskUserQuestion (per ../references/questioning-style.md):
- question: "Would you like to act on any of these findings now?"
- header: "Next action"
- options:
- One option per ⚠️ finding (e.g. Verify Task #42 → run
verify-task) - Done — just the report → exit
- One option per ⚠️ finding (e.g. Verify Task #42 → run
Route each selection to the appropriate skill with the issue number pre-loaded as context.