[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E5V9GDF75GV4YD2WPSH912":3,"skill-same:01M6E5V9GDF75GV4YD2WPSH912":77},{"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":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":13,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":44,"install":45,"resources":58},"01M6E5V9GDF75GV4YD2WPSH912","wave-start",null,"Initialize a new wave — worktree cleanup, branch creation, label setup, status file update","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\u002Fwave-start\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"start","wave start","status","setup","cleanup","update","worktree","file","team","branch","file update","initialize","worktree cleanup","creation","name","2026-11-10 10:12:30",false,"---\nname: wave-start\ndescription: Initialize a new wave — worktree cleanup, branch creation, label setup, status file update\nargs: team_name, Phase number, Wave number\n---\n\nInitialize infrastructure for a new wave. This is the **setup step** that parks the orchestrator's checkout on fresh `main`, cleans up stale worktrees, and ensures the wave label. For full wave planning — including the `deployments\u002Fphase-{P}\u002Fwave-{M}` branch creation (now owned by `\u002Fwave-kickoff` Step 1) and issue assignment — use `\u002Fwave-kickoff` after this completes.\n\n> See [`.claude\u002Fteam\u002Flifecycle.md`](..\u002F..\u002Fteam\u002Flifecycle.md) § Wave 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## Instructions\n\n### 1. Clean stale worktrees\n\nRemove any leftover worktrees from previous waves:\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel)\"\ngit -C \"$REPO_ROOT\" worktree prune\ngit -C \"$REPO_ROOT\" worktree list\n```\n\nReport any worktrees that were pruned. If active worktrees remain, list them and confirm with the user before proceeding (they may belong to in-progress work).\n\n### 2. Park the orchestrator's checkout on fresh `main`\n\nGet the orchestrator's `noorinalabs-main` checkout onto a clean, up-to-date `main` **before** any branch or status work. Without this, a wave can be run while the working tree sits on a stale, already-merged feature branch (the P4W6 #653 hazard): the kickoff-comment hook reads an out-of-date local `cross-repo-status.json`, and any local commit lands against a stale base.\n\nThis step **guards** rather than auto-discards — only the regenerable session churn may be set aside. If there is genuine uncommitted or unmerged work, it STOPs so the operator decides.\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel)\"\ncd \"$REPO_ROOT\"\ngit fetch origin main\n\n# Paths that regenerate every session and may be safely stashed (NOT a reason to STOP):\n#   .claude\u002Fannunaki\u002Ferrors.jsonl, cross-repo-status.json, ontology\u002Fchecksums.json\nREGENERABLE='^(\\.claude\u002Fannunaki\u002Ferrors\\.jsonl|cross-repo-status\\.json|ontology\u002Fchecksums\\.json)$'\n\n# Guard A — non-regenerable uncommitted changes → STOP (do NOT auto-discard).\n# `cut -c4-` takes the path field of `git status --porcelain` (handles spaces\u002Frenames).\nNON_REGEN_DIRTY=$(git status --porcelain | cut -c4- | grep -vE \"$REGENERABLE\" || true)\nif [ -n \"$NON_REGEN_DIRTY\" ]; then\n  echo \"STOP: working tree has non-regenerable uncommitted changes:\"\n  echo \"$NON_REGEN_DIRTY\" | sed 's\u002F^\u002F  \u002F'\n  echo \"Commit, stash, or discard them deliberately before \u002Fwave-start — this skill will not auto-discard.\"\n  exit 1\nfi\n\n# Guard B — current branch is ahead of origin\u002Fmain (unmerged local work) → STOP.\nCURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)\nAHEAD=$(git rev-list --count origin\u002Fmain..HEAD)\nif [ \"$AHEAD\" -gt 0 ]; then\n  echo \"STOP: current branch '$CURRENT_BRANCH' is $AHEAD commit(s) ahead of origin\u002Fmain (unmerged work).\"\n  echo \"Land or set it aside before starting a wave — this skill will not auto-discard.\"\n  exit 1\nfi\n\n# Safe to park: stash only the regenerable churn (recoverable via `git stash list`), then\n# move to fresh main with a fast-forward-only pull (never a merge commit).\ngit stash push -- .claude\u002Fannunaki\u002Ferrors.jsonl cross-repo-status.json ontology\u002Fchecksums.json 2>\u002Fdev\u002Fnull || true\ngit checkout main\ngit pull --ff-only origin main\n\n# Assert: on a clean main before proceeding.\ntest \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" || { echo \"STOP: not on main after checkout\"; exit 1; }\ntest -z \"$(git status --porcelain | cut -c4- | grep -vE \"$REGENERABLE\" || true)\" \\\n  || { echo \"STOP: main checkout is not clean after pull\"; exit 1; }\necho \"Parked on clean main @ $(git rev-parse --short HEAD)\"\n```\n\nIf either guard STOPs, surface the reason to the user and wait — do not work around it. (zsh note: the block above avoids bash-isms like associative arrays; it runs the same under zsh and bash.)\n\n### 3. Determine base branch\n\n- **Wave 1 of a phase:** Base is `main`\n- **Wave N (N > 1):** Base is `main`. Each wave merges to main at its own `\u002Fwave-wrapup` (see `\u002Fwave-wrapup` Step 11, every-wave merge — changed 2026-06-09), so the previous wave is already integrated. The previous-wave-branch (`deployments\u002Fphase-{P}\u002Fwave-{M-1}`) is **retained, not deleted**, but it is not the base — it serves only as a safety-net reference if a prior wrapup's merge was somehow skipped (the warning below fires and the wave branch is still cut from `main` regardless — `\u002Fwave-kickoff` Step 1 always bases the ref on `origin\u002Fmain` HEAD).\n\n```bash\n# Check if previous wave branch exists\ngit -C \"$REPO_ROOT\" ls-remote --heads origin \"deployments\u002Fphase-{P}\u002Fwave-{M-1}\"\n```\n\nIf the previous wave branch exists but has not been merged to main, warn the user:\n\n```\nWARNING: Previous wave branch deployments\u002Fphase-{P}\u002Fwave-{M-1} has not been\nmerged to main. Starting from main instead. Ensure previous wave changes\nare integrated before merging this wave.\n```\n\n### 4. Wave branch creation — delegated to `\u002Fwave-kickoff`\n\n`\u002Fwave-start` does **not** create the `deployments\u002Fphase-{P}\u002Fwave-{M}` branch locally. Branch creation for **every** repo in the wave's scope — including `noorinalabs-main` — is owned by `\u002Fwave-kickoff` Step 1, which cuts the ref via `gh api` POST `…\u002Fgit\u002Frefs` from `origin\u002Fmain` HEAD. That path is idempotent (race-safe `Reference already exists` handling) and needs no clean local checkout by design, so a local `git checkout -b` here is dead weight.\n\nThe old local `git checkout main && git pull && git checkout -b …` flow was the only step that left the checkout on a branch; its hygiene half now lives in § 2 (park on `main`), and its branch-create half is superseded by `\u002Fwave-kickoff` Step 1. Stay on `main` (per § 2) — you do not need to create or check out the wave branch in this skill.\n\n### 5. Create wave label\n\nThe canonical wave label is the phase-agnostic `wave-{X}` (#810; `{X}` is the\nglobal wave id == `current_wave`). Legacy `p{N}-wave-{M}` labels are\ngrandfathered but new waves use `wave-{X}`.\n\n```bash\n# Check if label exists\ngh label list --search \"wave-{X}\" --json name\n\n# Create if missing\ngh label create \"wave-{X}\" --description \"Wave {X} (global id)\" --color \"8B5CF6\"\n```\n\nAlso ensure standard category labels exist:\n\n```bash\nfor label in \"tech-debt\" \"feature\" \"bug\" \"security\" \"infra\" \"process\"; do\n    gh label list --search \"$label\" --json name | grep -q \"$label\" || \\\n        gh label create \"$label\" --description \"$label\" --color \"auto\"\ndone\n```\n\n### 5a. Wave-key per-phase reset — RETIRED (main#804)\n\n**There is no per-phase reset anymore.** Design B (main#804) made wave ids a single **global monotonic counter** that never resets per phase — `{M}` is a global wave id (P6's first wave is `wave_16`, not `wave_1`), allocated once at `\u002Fwave-scope` Step 0.0 via `.claude\u002Flib\u002Fwave_seq.py`. Because a global id is never reused, two same-ordinal waves in different phases (the old P5W2 ↔ P6W2 collision) get DISTINCT keys by construction. There are no stale prior-phase `wave_{M}_*` keys to clear — the collision class is gone, so the reset (and its `wave_key_reset.py` helper) is deleted.\n\nPhase is now a **derived display attribute** of the wave, never part of the key:\n`wave_{M}_phase` + `wave_{M}_phase_ordinal` (the human-friendly \"Phase {P}, Wave {ordinal}\" framing) are written alongside the scope at `\u002Fwave-scope` Step 0.0. Nothing to do here at `\u002Fwave-start`.\n\n### 6. Update cross-repo status — PUT-contents on `main`\n\nSet the active-wave fields for this repo in `cross-repo-status.json`. This is a **main-targeting** status write, so use the **`gh api` PUT-contents recipe** — the atomic, no-local-orphan pattern documented in `\u002Fwave-kickoff` Step 1a (added P3W6 retro, supersedes local-commit-then-push). Do **not** `git add\u002Fcommit\u002Fpush` the file from the local tree: a local commit here re-introduces the orphan \u002F stale-tree hazard this issue (#653) closes, and the local `main` parked in § 2 races the remote after the PUT lands.\n\n```bash\n# Read current status (for reference \u002F field-setting). Quote the URL: the\n# unquoted `?` is a zsh glob metacharacter and, with NOMATCH on by default, zsh\n# aborts the command with \"no matches found\" before gh ever runs (#759).\ngh api \"repos\u002Fnoorinalabs\u002Fnoorinalabs-main\u002Fcontents\u002Fcross-repo-status.json?ref=main\" \\\n  --jq '.content' | base64 -d\n```\n\nRecipe (see `\u002Fwave-kickoff` Step 1a for the full payload shape):\n\n1. Fetch current `sha` + content via `gh api …\u002Fcontents\u002Fcross-repo-status.json?ref=main`.\n2. Set the active-wave fields for this repo via `jq`.\n3. base64-encode the new content.\n4. `gh api -X PUT repos\u002Fnoorinalabs\u002Fnoorinalabs-main\u002Fcontents\u002Fcross-repo-status.json --input \u003Cpayload>.json` with `message`, `content`, `sha` (current), `branch: \"main\"`, and `author`\u002F`committer` set to the role running `\u002Fwave-start` (typically the TPM).\n5. **Read-back-verify** the field landed on `main`: `gh api …\u002Fcontents\u002Fcross-repo-status.json?ref=main --jq '.content' | base64 -d | jq …`.\n\n### 7. Run mid-wave retro (if not Wave 1)\n\nIf this is not the first wave, run `\u002Fretro` to capture a health check from the previous wave before starting new work. This ensures carry-over items are surfaced.\n\n### 8. Report\n\n```\n**Wave Initialized: Phase {P} Wave {M}**\n\n- Checkout: parked on clean `main` @ `{short_sha}`\n- Wave branch: `deployments\u002Fphase-{P}\u002Fwave-{M}` (created by `\u002Fwave-kickoff` Step 1, not here)\n- Base: `{base_branch}`\n- Label: `p{P}-wave-{M}` ({created|already existed})\n- Stale worktrees pruned: {count}\n- Status file: `cross-repo-status.json` updated on `main` via PUT-contents ({updated|no changes needed})\n\nReady for `\u002Fwave-kickoff` to create the wave branch in all scoped repos, assign issues, and post kickoff comments.\n```\n\n## Relationship to wave-kickoff\n\n`\u002Fwave-start` handles local hygiene + setup: park the checkout on fresh `main` (§ 2), prune stale worktrees, ensure the wave label, and stamp the active-wave state onto `main` via PUT-contents.\n`\u002Fwave-kickoff` handles branch creation (the `deployments\u002Fphase-{P}\u002Fwave-{M}` ref in every scoped repo, via `gh api`) and planning: issue assignment, kickoff comments, execution plan.\n\nTypical flow: `\u002Fwave-start` first, then `\u002Fwave-kickoff`.\n\n## What remains manual\n\n- User confirms if active worktrees should be removed\n- The § 2 park-on-`main` guard STOPs (does not auto-discard) on non-regenerable dirty state or unmerged local commits — the user resolves these before re-running\n- Previous wave merge status may require user decision\n- The skill does not create the wave branch, assign issues, or post kickoff comments — use `\u002Fwave-kickoff` for that\n","Initialize infrastructure for a new wave. This is the **setup step** that parks the orchestrator's checkout on fresh `main`, cleans up stale worktrees, and ensures the wave label. For full wave planning — including the `deployments\u002Fphase-{P}\u002Fwave-{M}` branch creation (now owned by `\u002Fwave-kickoff` Step 1) and issue assignment — use `\u002Fwave-kickoff` after this completes.\n\n> See [`.claude\u002Fteam\u002Flifecycle.md`](..\u002F..\u002Fteam\u002Flifecycle.md) § Wave 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## Instructions\n\n### 1. Clean stale worktrees\n\nRemove any leftover worktrees from previous waves:\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel)\"\ngit -C \"$REPO_ROOT\" worktree prune\ngit -C \"$REPO_ROOT\" worktree list\n```\n\nReport any worktrees that were pruned. If active worktrees remain, list them and confirm with the user before proceeding (they may belong to in-progress work).\n\n### 2. Park the orchestrator's checkout on fresh `main`\n\nGet the orchestrator's `noorinalabs-main` checkout onto a clean, up-to-date `main` **before** any branch or status work. Without this, a wave can be run while the working tree sits on a stale, already-merged feature branch (the P4W6 #653 hazard): the kickoff-comment hook reads an out-of-date local `cross-repo-status.json`, and any local commit lands against a stale base.\n\nThis step **guards** rather than auto-discards — only the regenerable session churn may be set aside. If there is genuine uncommitted or unmerged work, it STOPs so the operator decides.\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel)\"\ncd \"$REPO_ROOT\"\ngit fetch origin main\n\n# Paths that regenerate every session and may be safely stashed (NOT a reason to STOP):\n#   .claude\u002Fannunaki\u002Ferrors.jsonl, cross-repo-status.json, ontology\u002Fchecksums.json\nREGENERABLE='^(\\.claude\u002Fannunaki\u002Ferrors\\.jsonl|cross-repo-status\\.json|ontology\u002Fchecksums\\.json)$'\n\n# Guard A — non-regenerable uncommitted changes → STOP (do NOT auto-discard).\n# `cut -c4-` takes the path field of `git status --porcelain` (handles spaces\u002Frenames).\nNON_REGEN_DIRTY=$(git status --porcelain | cut -c4- | grep -vE \"$REGENERABLE\" || true)\nif [ -n \"$NON_REGEN_DIRTY\" ]; then\n  echo \"STOP: working tree has non-regenerable uncommitted changes:\"\n  echo \"$NON_REGEN_DIRTY\" | sed 's\u002F^\u002F  \u002F'\n  echo \"Commit, stash, or discard them deliberately before \u002Fwave-start — this skill will not auto-discard.\"\n  exit 1\nfi\n\n# Guard B — current branch is ahead of origin\u002Fmain (unmerged local work) → STOP.\nCURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)\nAHEAD=$(git rev-list --count origin\u002Fmain..HEAD)\nif [ \"$AHEAD\" -gt 0 ]; then\n  echo \"STOP: current branch '$CURRENT_BRANCH' is $AHEAD commit(s) ahead of origin\u002Fmain (unmerged work).\"\n  echo \"Land or set it aside before starting a wave — this skill will not auto-discard.\"\n  exit 1\nfi\n\n# Safe to park: stash only the regenerable churn (recoverable via `git stash list`), then\n# move to fresh main with a fast-forward-only pull (never a merge commit).\ngit stash push -- .claude\u002Fannunaki\u002Ferrors.jsonl cross-repo-status.json ontology\u002Fchecksums.json 2>\u002Fdev\u002Fnull || true\ngit checkout main\ngit pull --ff-only origin main\n\n# Assert: on a clean main before proceeding.\ntest \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" || { echo \"STOP: not on main after checkout\"; exit 1; }\ntest -z \"$(git status --porcelain | cut -c4- | grep -vE \"$REGENERABLE\" || true)\" \\\n  || { echo \"STOP: main checkout is not clean after pull\"; exit 1; }\necho \"Parked on clean main @ $(git rev-parse --short HEAD)\"\n```\n\nIf either guard STOPs, surface the reason to the user and wait — do not work around it. (zsh note: the block above avoids bash-isms like associative arrays; it runs the same under zsh and bash.)\n\n### 3. Determine base branch\n\n- **Wave 1 of a phase:** Base is `main`\n- **Wave N (N > 1):** Base is `main`. Each wave merges to main at its own `\u002Fwave-wrapup` (see `\u002Fwave-wrapup` Step 11, every-wave merge — changed 2026-06-09), so the previous wave is already integrated. The previous-wave-branch (`deployments\u002Fphase-{P}\u002Fwave-{M-1}`) is **retained, not deleted**, but it is not the base — it serves only as a safety-net reference if a prior wrapup's merge was somehow skipped (the warning below fires and the wave branch is still cut from `main` regardless — `\u002Fwave-kickoff` Step 1 always bases the ref on `origin\u002Fmain` HEAD).\n\n```bash\n# Check if previous wave branch exists\ngit -C \"$REPO_ROOT\" ls-remote --heads origin \"deployments\u002Fphase-{P}\u002Fwave-{M-1}\"\n```\n\nIf the previous wave branch exists but has not been merged to main, warn the user:\n\n```\nWARNING: Previous wave branch deployments\u002Fphase-{P}\u002Fwave-{M-1} has not been\nmerged to main. Starting from main instead. Ensure previous wave changes\nare integrated before merging this wave.\n```\n\n### 4. Wave branch creation — delegated to `\u002Fwave-kickoff`\n\n`\u002Fwave-start` does **not** create the `deployments\u002Fphase-{P}\u002Fwave-{M}` branch locally. Branch creation for **every** repo in the wave's scope — including `noorinalabs-main` — is owned by `\u002Fwave-kickoff` Step 1, which cuts the ref via `gh api` POST `…\u002Fgit\u002Frefs` from `origin\u002Fmain` HEAD. That path is idempotent (race-safe `Reference already exists` handling) and needs no clean local checkout by design, so a local `git checkout -b` here is dead weight.\n\nThe old local `git checkout main && git pull && git checkout -b …` flow was the only step that left the checkout on a branch; its hygiene half now lives in § 2 (park on `main`), and its branch-create half is superseded by `\u002Fwave-kickoff` Step 1. Stay on `main` (per § 2) — you do not need to create or check out the wave branch in this skill.\n\n### 5. Create wave label\n\nThe canonical wave label is the phase-agnostic `wave-{X}` (#810; `{X}` is the\nglobal wave id == `current_wave`). Legacy `p{N}-wave-{M}` labels are\ngrandfathered but new waves use `wave-{X}`.\n\n```bash\n# Check if label exists\ngh label list --search \"wave-{X}\" --json name\n\n# Create if missing\ngh label create \"wave-{X}\" --description \"Wave {X} (global id)\" --color \"8B5CF6\"\n```\n\nAlso ensure standard category labels exist:\n\n```bash\nfor label in \"tech-debt\" \"feature\" \"bug\" \"security\" \"infra\" \"process\"; do\n    gh label list --search \"$label\" --json name | grep -q \"$label\" || \\\n        gh label create \"$label\" --description \"$label\" --color \"auto\"\ndone\n```\n\n### 5a. Wave-key per-phase reset — RETIRED (main#804)\n\n**There is no per-phase reset anymore.** Design B (main#804) made wave ids a single **global monotonic counter** that never resets per phase — `{M}` is a global wave id (P6's first wave is `wave_16`, not `wave_1`), allocated once at `\u002Fwave-scope` Step 0.0 via `.claude\u002Flib\u002Fwave_seq.py`. Because a global id is never reused, two same-ordinal waves in different phases (the old P5W2 ↔ P6W2 collision) get DISTINCT keys by construction. There are no stale prior-phase `wave_{M}_*` keys to clear — the collision class is gone, so the reset (and its `wave_key_reset.py` helper) is deleted.\n\nPhase is now a **derived display attribute** of the wave, never part of the key:\n`wave_{M}_phase` + `wave_{M}_phase_ordinal` (the human-friendly \"Phase {P}, Wave {ordinal}\" framing) are written alongside the scope at `\u002Fwave-scope` Step 0.0. Nothing to do here at `\u002Fwave-start`.\n\n### 6. Update cross-repo status — PUT-contents on `main`\n\nSet the active-wave fields for this repo in `cross-repo-status.json`. This is a **main-targeting** status write, so use the **`gh api` PUT-contents recipe** — the atomic, no-local-orphan pattern documented in `\u002Fwave-kickoff` Step 1a (added P3W6 retro, supersedes local-commit-then-push). Do **not** `git add\u002Fcommit\u002Fpush` the file from the local tree: a local commit here re-introduces the orphan \u002F stale-tree hazard this issue (#653) closes, and the local `main` parked in § 2 races the remote after the PUT lands.\n\n```bash\n# Read current status (for reference \u002F field-setting). Quote the URL: the\n# unquoted `?` is a zsh glob metacharacter and, with NOMATCH on by default, zsh\n# aborts the command with \"no matches found\" before gh ever runs (#759).\ngh api \"repos\u002Fnoorinalabs\u002Fnoorinalabs-main\u002Fcontents\u002Fcross-repo-status.json?ref=main\" \\\n  --jq '.content' | base64 -d\n```\n\nRecipe (see `\u002Fwave-kickoff` Step 1a for the full payload shape):\n\n1. Fetch current `sha` + content via `gh api …\u002Fcontents\u002Fcross-repo-status.json?ref=main`.\n2. Set the active-wave fields for this repo via `jq`.\n3. base64-encode the new content.\n4. `gh api -X PUT repos\u002Fnoorinalabs\u002Fnoorinalabs-main\u002Fcontents\u002Fcross-repo-status.json --input \u003Cpayload>.json` with `message`, `content`, `sha` (current), `branch: \"main\"`, and `author`\u002F`committer` set to the role running `\u002Fwave-start` (typically the TPM).\n5. **Read-back-verify** the field landed on `main`: `gh api …\u002Fcontents\u002Fcross-repo-status.json?ref=main --jq '.content' | base64 -d | jq …`.\n\n### 7. Run mid-wave retro (if not Wave 1)\n\nIf this is not the first wave, run `\u002Fretro` to capture a health check from the previous wave before starting new work. This ensures carry-over items are surfaced.\n\n### 8. Report\n\n```\n**Wave Initialized: Phase {P} Wave {M}**\n\n- Checkout: parked on clean `main` @ `{short_sha}`\n- Wave branch: `deployments\u002Fphase-{P}\u002Fwave-{M}` (created by `\u002Fwave-kickoff` Step 1, not here)\n- Base: `{base_branch}`\n- Label: `p{P}-wave-{M}` ({created|already existed})\n- Stale worktrees pruned: {count}\n- Status file: `cross-repo-status.json` updated on `main` via PUT-contents ({updated|no changes needed})\n\nReady for `\u002Fwave-kickoff` to create the wave branch in all scoped repos, assign issues, and post kickoff comments.\n```\n\n## Relationship to wave-kickoff\n\n`\u002Fwave-start` handles local hygiene + setup: park the checkout on fresh `main` (§ 2), prune stale worktrees, ensure the wave label, and stamp the active-wave state onto `main` via PUT-contents.\n`\u002Fwave-kickoff` handles branch creation (the `deployments\u002Fphase-{P}\u002Fwave-{M}` ref in every scoped repo, via `gh api`) and planning: issue assignment, kickoff comments, execution plan.\n\nTypical flow: `\u002Fwave-start` first, then `\u002Fwave-kickoff`.\n\n## What remains manual\n\n- User confirms if active worktrees should be removed\n- The § 2 park-on-`main` guard STOPs (does not auto-discard) on non-regenerable dirty state or unmerged local commits — the user resolves these before re-running\n- Previous wave merge status may require user decision\n- The skill does not create the wave branch, assign issues, or post kickoff comments — use `\u002Fwave-kickoff` for that\n",{"args":38,"name":5,"description":7},"team_name, Phase number, Wave number","main","53ec1032b93d41533a48603e8fae7a92f56cc66c","intake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-start","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework","https:\u002F\u002Fgithub.com\u002Fparametrization","2026-09-21 01:06:30",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add parametrization\u002F2real-team-framework --skill wave-start",{"tool":51,"command":52},"bunx","bunx skills add parametrization\u002F2real-team-framework --skill wave-start",{"tool":54,"command":55},"pnpm","pnpm dlx skills add parametrization\u002F2real-team-framework --skill wave-start","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-start\u002FSKILL.md",true,[59,65,69,73],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},"references\u002Fcited-by-path.md","REFERENCE","参考文档",257,"https:\u002F\u002Fgithub.com\u002Fhaxorize\u002Fskills\u002Fblob\u002Fmain\u002Fscripts\u002Flint-fixtures\u002Fsrc\u002Fhouse-style\u002Freferences\u002Fcited-by-path.md",{"path":66,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002Fcited-from-global.md",452,"https:\u002F\u002Fgithub.com\u002Fhaxorize\u002Fskills\u002Fblob\u002Fmain\u002Fscripts\u002Flint-fixtures\u002Fsrc\u002Fhouse-style\u002Freferences\u002Fcited-from-global.md",{"path":70,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fquiet-forms.md",3914,"https:\u002F\u002Fgithub.com\u002Fhaxorize\u002Fskills\u002Fblob\u002Fmain\u002Fscripts\u002Flint-fixtures\u002Fsrc\u002Fhouse-style\u002Freferences\u002Fquiet-forms.md",{"path":74,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fsibling-note.md",256,"https:\u002F\u002Fgithub.com\u002Fhaxorize\u002Fskills\u002Fblob\u002Fmain\u002Fscripts\u002Flint-fixtures\u002Fsrc\u002Fhouse-style\u002Freferences\u002Fsibling-note.md",[78,95,111,126,139,152],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":33},"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",[],[85,86,87,32,88,30,89,90,91,92,26,93,94,22,24],"wave wrapup","wrapup","sequencing","retro","issue","review","handoff","merge","pr review","pr",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":33},"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",[],[102,103,104,105,106,107,88,108,109,89,110],"scope","wave scope","Fold","memory","collect","Meta","refresh","reconcile","kickoff",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":33},"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",[],[88,118,119,120,121,122,32,123,124,94,125,26],"wave retro","proposals","log","retrospective","trust","feedback","change","analysis",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":33},"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",[],[133,110,134,135,136,26,137,27,138,89,31,32],"wave kickoff","execution plan","planning","execution","plan","management",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":33},"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",[],[146,147,148,149,150,151],"wave audit","audit","issues","open","find","close",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":163,"publishedAt":33},"01M6E5TG3MPXT1SVT4FTJZ4JNT","watch-deploy","Monitor (and, within bounds, remediate) a deploy triggered by a merge — staging automatically post-merge, production only after the owner approves the queued deploy. Polls the deploy run to a terminal state, classifies failures, attempts bounded fix-forward, and escalates with a precise diagnosis.","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwatch-deploy\u002FSKILL.md",[158],{"categoryNo":159,"categoryName":160,"taxonomyType":161,"taxonomyTypeDesc":162},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[164,165,166,92,167,168,169,170,171,172,173,174,175,176,177],"watch deploy","watch","deploy","monitor","run","state","Production","fix","only","env","id","diagnosis","post","terminal"]