[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E5SFPRR2YJ4TGH4MC5DRDM":3,"skill-same:01M6E5SFPRR2YJ4TGH4MC5DRDM":52},{"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":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":32,"commitSha":33,"skillDirectory":34,"forksCount":13,"repositoryHtmlUrl":35,"repositoryHomepageUrl":6,"ownerHtmlUrl":36,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":37,"install":38,"resources":51},"01M6E5SFPRR2YJ4TGH4MC5DRDM","phase-review",null,"Phase track-check before \u002Fwave-scope — review what's done, what's remaining, what's blocked. Surface the tech-debt ratio. Allow phase-plan revision before the next wave is scoped.","parametrization\u002F2real-team-framework","parametrization","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1111097?v=4","01M6E5MC117M94CEXKX3C96PPX","01M6E5MC7YWG5N3VV4792VFK85",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fphase-review\u002FSKILL.md",[],[18,19,20,21,22,23,24,25],"review","phase review","plan","check","done","next","scope","tech","2026-11-10 10:12:30",false,"---\nname: phase-review\ndescription: Phase track-check before \u002Fwave-scope — review what's done, what's remaining, what's blocked. Surface the tech-debt ratio. Allow phase-plan revision before the next wave is scoped.\nargs: Phase number\n---\n\nPhase-level track check. **Mandatory before every `\u002Fwave-scope`.** Surfaces accomplishments, blockers, and remaining end-state criteria so the owner can choose the next wave's theme deliberately, not reactively.\n\n> See [`.claude\u002Fteam\u002Flifecycle.md`](..\u002F..\u002Fteam\u002Flifecycle.md) § Phase Lifecycle for the canonical skill order and preconditions.\n\n> Note: all repo paths in bash blocks below are rooted at `$REPO_ROOT` to avoid cwd drift when the skill is invoked from a worktree or child-repo subdirectory (#149).\n\n## When to use\n\n- **Before every `\u002Fwave-scope`.** Mandatory pre-step. `\u002Fwave-scope` Step 0.5 will block until `\u002Fphase-review` has been invoked in the same session.\n- **On demand** — owner can run anytime to check phase health.\n- Not a replacement for `\u002Fretro` (per-wave) or `\u002Fplan-phase` (phase-creation).\n\n## What this skill is NOT\n\n- Not a wave reconciliation step — that's `\u002Fwave-scope`.\n- Not a retrospective — that's `\u002Fwave-retro`.\n- Not a phase-creation step — `\u002Fplan-phase` is the phase-creation skill.\n- Does NOT pick the next wave's theme — that's the owner's call after seeing the picture.\n- Does NOT modify the phase plan doc without owner confirmation.\n\n## Instructions\n\n### 0. Inputs\n\n- `{P}` — phase number (e.g. `3`)\n\n### 1. Load phase plan\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel)\"\nPHASE_DOC=\"$REPO_ROOT\u002F.claude\u002Fteam\u002Fphases\u002Fphase-{P}.md\"\nif [ ! -f \"$PHASE_DOC\" ]; then\n  echo \"ERROR: phase plan doc missing at $PHASE_DOC\"\n  echo \"Run \u002Fplan-phase first to draft the phase scope, then hand-author the phase plan doc — without it, \u002Fphase-review has nothing to check against.\"\n  exit 1\nfi\ncat \"$PHASE_DOC\"\n```\n\nIf the phase plan doc is missing, STOP and direct the owner to `\u002Fplan-phase` (which proposes the wave structure that the phase plan doc captures). The phase plan doc itself is hand-authored.\n\n### 2. Pull current state of each tracking issue\n\nExtract tracking issue numbers from the phase plan and pull live state for each:\n\n```bash\nTRACKING_ISSUES=$(grep -oE 'noorinalabs-main#[0-9]+' \"$PHASE_DOC\" | sort -u)\n\n# `while read`, NOT `for issue in $TRACKING_ISSUES` — zsh does not word-split an\n# unquoted scalar, so the multi-line list would collapse into one bogus iteration\n# (#759, same class as main#688). The `[ -n ]` guard keeps the no-op-on-empty\n# behaviour `for` gives when no tracking issues are found.\nwhile IFS= read -r issue; do\n  [ -n \"$issue\" ] || continue\n  num=${issue#noorinalabs-main#}\n  gh issue view \"$num\" --repo noorinalabs\u002Fnoorinalabs-main \\\n    --json number,title,state,labels,closedAt \\\n    --jq '\"\\(.state)\\t#\\(.number)\\t[\\(.labels|map(.name)|join(\",\"))]\\t\\(.title)\"'\ndone \u003C\u003C\u003C \"$TRACKING_ISSUES\"\n```\n\nCategorize each criterion:\n- **Done** — tracking issue closed\n- **In flight** — tracking issue open + has linked open PRs\n- **Open \u002F not started** — tracking issue open + no linked PRs\n- **Blocked** — tracking issue open + has `blocked` label or commented blocker\n\n### 3. Tech-debt ratio (P3 exit gate)\n\n```bash\nPHASE_START=$(grep '^created:' \"$PHASE_DOC\" | head -1 | awk '{print $2}')\n\n# New issues filed during phase, all states\nTOTAL_NEW=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --search \"created:>=$PHASE_START\" --state all --limit 500 --json number | jq length)\nTOTAL_NEW_TD=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --search \"created:>=$PHASE_START label:tech-debt\" --state all --limit 500 --json number | jq length)\n\n# Cumulative open\nCUM_OPEN=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --state open --limit 500 --json number | jq length)\nCUM_OPEN_TD=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --state open --label tech-debt --limit 500 --json number | jq length)\n\n[ \"$TOTAL_NEW\" -gt 0 ] && new_pct=$((TOTAL_NEW_TD * 100 \u002F TOTAL_NEW)) || new_pct=0\n[ \"$CUM_OPEN\" -gt 0 ] && cum_pct=$((CUM_OPEN_TD * 100 \u002F CUM_OPEN)) || cum_pct=0\n\necho \"New filed this phase: $TOTAL_NEW_TD \u002F $TOTAL_NEW = ${new_pct}% tech-debt\"\necho \"Cumulative open:      $CUM_OPEN_TD \u002F $CUM_OPEN = ${cum_pct}% tech-debt\"\n```\n\nIf either >10%, flag — phase exit gate not yet met (regardless of criterion-by-criterion checkboxes).\n\nThe same query should also run across all 7 child repos for a cross-repo view; aggregate counts.\n\n### 4. Surface to owner\n\nPresent a single status block:\n\n```\n**Phase {P} Review — {date}**\n\n| # | Criterion | Tracker | State | Notes |\n|---|-----------|---------|-------|-------|\n| 1 | ... | main#NNN | Open | No PRs |\n| 2 | ... | main#NNN | In flight | PR#XXX |\n| ... | | | | |\n\n**Tech-debt ratio (exit criterion 9):**\n- New filed (phase-to-date): X% (gate: \u003C10%)\n- Cumulative open:           X% (gate: \u003C10%)\n\n**Phase exit gate:** {NOT MET \u002F MET}\n```\n\n### 5. Allow phase-plan revision\n\nAsk the owner:\n- Has the track drifted? (criteria thought-done but actually open, or new urgent items surfaced)\n- Should the phase plan be revised before `\u002Fwave-scope` runs?\n\nIf yes, edit `$PHASE_DOC` with the owner's input, then commit (orchestrator commit identity).\n\n### 6. Hand off to \u002Fwave-scope\n\nPrint:\n```\nPhase review complete. Ready to run \u002Fwave-scope for the next wave.\n```\n\n`\u002Fwave-scope` Step 0.5 will check that `\u002Fphase-review` ran in this session and proceed.\n","Phase-level track check. **Mandatory before every `\u002Fwave-scope`.** Surfaces accomplishments, blockers, and remaining end-state criteria so the owner can choose the next wave's theme deliberately, not reactively.\n\n> See [`.claude\u002Fteam\u002Flifecycle.md`](..\u002F..\u002Fteam\u002Flifecycle.md) § Phase Lifecycle for the canonical skill order and preconditions.\n\n> Note: all repo paths in bash blocks below are rooted at `$REPO_ROOT` to avoid cwd drift when the skill is invoked from a worktree or child-repo subdirectory (#149).\n\n## When to use\n\n- **Before every `\u002Fwave-scope`.** Mandatory pre-step. `\u002Fwave-scope` Step 0.5 will block until `\u002Fphase-review` has been invoked in the same session.\n- **On demand** — owner can run anytime to check phase health.\n- Not a replacement for `\u002Fretro` (per-wave) or `\u002Fplan-phase` (phase-creation).\n\n## What this skill is NOT\n\n- Not a wave reconciliation step — that's `\u002Fwave-scope`.\n- Not a retrospective — that's `\u002Fwave-retro`.\n- Not a phase-creation step — `\u002Fplan-phase` is the phase-creation skill.\n- Does NOT pick the next wave's theme — that's the owner's call after seeing the picture.\n- Does NOT modify the phase plan doc without owner confirmation.\n\n## Instructions\n\n### 0. Inputs\n\n- `{P}` — phase number (e.g. `3`)\n\n### 1. Load phase plan\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel)\"\nPHASE_DOC=\"$REPO_ROOT\u002F.claude\u002Fteam\u002Fphases\u002Fphase-{P}.md\"\nif [ ! -f \"$PHASE_DOC\" ]; then\n  echo \"ERROR: phase plan doc missing at $PHASE_DOC\"\n  echo \"Run \u002Fplan-phase first to draft the phase scope, then hand-author the phase plan doc — without it, \u002Fphase-review has nothing to check against.\"\n  exit 1\nfi\ncat \"$PHASE_DOC\"\n```\n\nIf the phase plan doc is missing, STOP and direct the owner to `\u002Fplan-phase` (which proposes the wave structure that the phase plan doc captures). The phase plan doc itself is hand-authored.\n\n### 2. Pull current state of each tracking issue\n\nExtract tracking issue numbers from the phase plan and pull live state for each:\n\n```bash\nTRACKING_ISSUES=$(grep -oE 'noorinalabs-main#[0-9]+' \"$PHASE_DOC\" | sort -u)\n\n# `while read`, NOT `for issue in $TRACKING_ISSUES` — zsh does not word-split an\n# unquoted scalar, so the multi-line list would collapse into one bogus iteration\n# (#759, same class as main#688). The `[ -n ]` guard keeps the no-op-on-empty\n# behaviour `for` gives when no tracking issues are found.\nwhile IFS= read -r issue; do\n  [ -n \"$issue\" ] || continue\n  num=${issue#noorinalabs-main#}\n  gh issue view \"$num\" --repo noorinalabs\u002Fnoorinalabs-main \\\n    --json number,title,state,labels,closedAt \\\n    --jq '\"\\(.state)\\t#\\(.number)\\t[\\(.labels|map(.name)|join(\",\"))]\\t\\(.title)\"'\ndone \u003C\u003C\u003C \"$TRACKING_ISSUES\"\n```\n\nCategorize each criterion:\n- **Done** — tracking issue closed\n- **In flight** — tracking issue open + has linked open PRs\n- **Open \u002F not started** — tracking issue open + no linked PRs\n- **Blocked** — tracking issue open + has `blocked` label or commented blocker\n\n### 3. Tech-debt ratio (P3 exit gate)\n\n```bash\nPHASE_START=$(grep '^created:' \"$PHASE_DOC\" | head -1 | awk '{print $2}')\n\n# New issues filed during phase, all states\nTOTAL_NEW=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --search \"created:>=$PHASE_START\" --state all --limit 500 --json number | jq length)\nTOTAL_NEW_TD=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --search \"created:>=$PHASE_START label:tech-debt\" --state all --limit 500 --json number | jq length)\n\n# Cumulative open\nCUM_OPEN=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --state open --limit 500 --json number | jq length)\nCUM_OPEN_TD=$(gh issue list --repo noorinalabs\u002Fnoorinalabs-main \\\n    --state open --label tech-debt --limit 500 --json number | jq length)\n\n[ \"$TOTAL_NEW\" -gt 0 ] && new_pct=$((TOTAL_NEW_TD * 100 \u002F TOTAL_NEW)) || new_pct=0\n[ \"$CUM_OPEN\" -gt 0 ] && cum_pct=$((CUM_OPEN_TD * 100 \u002F CUM_OPEN)) || cum_pct=0\n\necho \"New filed this phase: $TOTAL_NEW_TD \u002F $TOTAL_NEW = ${new_pct}% tech-debt\"\necho \"Cumulative open:      $CUM_OPEN_TD \u002F $CUM_OPEN = ${cum_pct}% tech-debt\"\n```\n\nIf either >10%, flag — phase exit gate not yet met (regardless of criterion-by-criterion checkboxes).\n\nThe same query should also run across all 7 child repos for a cross-repo view; aggregate counts.\n\n### 4. Surface to owner\n\nPresent a single status block:\n\n```\n**Phase {P} Review — {date}**\n\n| # | Criterion | Tracker | State | Notes |\n|---|-----------|---------|-------|-------|\n| 1 | ... | main#NNN | Open | No PRs |\n| 2 | ... | main#NNN | In flight | PR#XXX |\n| ... | | | | |\n\n**Tech-debt ratio (exit criterion 9):**\n- New filed (phase-to-date): X% (gate: \u003C10%)\n- Cumulative open:           X% (gate: \u003C10%)\n\n**Phase exit gate:** {NOT MET \u002F MET}\n```\n\n### 5. Allow phase-plan revision\n\nAsk the owner:\n- Has the track drifted? (criteria thought-done but actually open, or new urgent items surfaced)\n- Should the phase plan be revised before `\u002Fwave-scope` runs?\n\nIf yes, edit `$PHASE_DOC` with the owner's input, then commit (orchestrator commit identity).\n\n### 6. Hand off to \u002Fwave-scope\n\nPrint:\n```\nPhase review complete. Ready to run \u002Fwave-scope for the next wave.\n```\n\n`\u002Fwave-scope` Step 0.5 will check that `\u002Fphase-review` ran in this session and proceed.\n",{"args":31,"name":5,"description":7},"Phase number","main","53ec1032b93d41533a48603e8fae7a92f56cc66c","intake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fphase-review","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework","https:\u002F\u002Fgithub.com\u002Fparametrization","2026-09-21 01:06:30",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add parametrization\u002F2real-team-framework --skill phase-review",{"tool":44,"command":45},"bunx","bunx skills add parametrization\u002F2real-team-framework --skill phase-review",{"tool":47,"command":48},"pnpm","pnpm dlx skills add parametrization\u002F2real-team-framework --skill phase-review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fphase-review\u002FSKILL.md",true,[],[53,74,91,106,121,133],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":26},"01M6E5VG1R7FF1025BZAV6BDTS","wave-wrapup","Finalize a wave — PR review, merge sequencing, issue cleanup, worktree cleanup, and handoff to retro","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-wrapup\u002FSKILL.md",[],[60,61,18,62,63,64,65,66,67,68,69,70,71,72,73],"wave wrapup","wrapup","handoff","merge","pr review","pr","cleanup","worktree","retro","team","issue","worktree cleanup","name","sequencing",{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":26},"01M6E5V9GDF75GV4YD2WPSH912","wave-start","Initialize a new wave — worktree cleanup, branch creation, label setup, status file update","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-start\u002FSKILL.md",[],[81,82,83,66,84,67,85,69,86,87,88,71,89,72,90],"wave start","start","setup","update","file","branch","file update","initialize","creation","status",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":26},"01M6E5V4VXEJ39V87VHN1A3AW9","wave-scope","Reconcile declared-vs-labeled wave scope between \u002Fwave-retro and \u002Fwave-kickoff — collect dispositions, fold in retro carry-forwards and memory must-includes, and refresh the meta-issue","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-scope\u002FSKILL.md",[],[98,24,99,100,101,68,102,103,104,70,105],"wave scope","memory","collect","Meta","refresh","reconcile","Fold","kickoff",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":26},"01M6E5TZNPGG5EXZEN1FKJJT6K","wave-retro","Automated wave retrospective — PR analysis, assessments, trust matrix updates, feedback log, charter change proposals","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-retro\u002FSKILL.md",[],[113,68,114,115,65,116,117,69,118,119,120,72],"wave retro","log","change","retrospective","analysis","feedback","proposals","trust",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":26},"01M6E5TR8XB3Z10A9SD4ZYNV45","wave-kickoff","Automated wave planning — branch creation, label management, issue labeling, kickoff comments, and execution plan","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-kickoff\u002FSKILL.md",[],[128,105,129,70,89,72,20,69,130,86,131,132],"wave kickoff","management","execution","planning","execution plan",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":26},"01M6E5TMZAFB6MTVYT750FZDVY","wave-audit","Audit open issues against merged PRs — find and close orphaned issues with proper comments","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-audit\u002FSKILL.md",[],[140,141,142,143,144,145],"audit","wave audit","close","find","open","issues"]