[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71KQ9W41RKC9130FP0XJECP":3,"skill-same:01M71KQ9W41RKC9130FP0XJECP":45},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":30,"install":31,"resources":44},"01M71KQ9W41RKC9130FP0XJECP","next",null,"tbeack\u002Ffsad_training","tbeack","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F206807984?v=4","01M6K7Q3C3VRTCVC55T71A1SY9","Theo Beack","01M71KPJZ6H9P6B793RT1JXX9R",4,"MIT","https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fnext\u002FSKILL.md",[],[5],"2026-11-10 10:56:23",false,"---\ndescription: Pick the next open task from the current project's todo file and invoke `\u002Ffsad-harness:do-task` with that task ID. Ranks candidates by readiness (has a task-detail file, no stated unmet dependency) and reports why one was chosen. Accepts an optional count (`\u002Ffsad-harness:next 3`) to hand off multiple ranked candidates to `do-task`'s concurrent multi-task dispatch. Auto-detects the current project from the working directory using the same YAML config as other fsd skills. Use when the user says \"do the next task\", \"what's next\", \"next task\", \"next 3 tasks\", or similar.\nargument-hint: `[N]`\n---\n\n# fsad-harness:next — pick the next ready task and hand off to do-task\n\nYou find the most **ready** unchecked task(s) in the current project's todo file and invoke `fsad-harness:do-task` with the chosen ID(s). Readiness — not file order — decides which candidate wins.\n\n## Step 0 — Detect the project\n\n1. Determine the current working directory.\n2. Read `~\u002F.claude\u002Fcommands\u002Ffsd\u002Fprojects.yaml`.\n3. Match cwd against each project's `match_paths` (expand `~`). Prefer the longest (most specific) match if multiple match.\n4. If a project matches, refer to its entry as `cfg` and the resolved project root as `project_root`. Proceed.\n5. If **no project matches**:\n   - Tell the user the project is not registered.\n   - Suggest running `\u002Ffsad-harness:add-task` from the project to register it.\n   - Stop.\n\n## Step 1 — Parse the optional count argument\n\n`$ARGUMENTS` is either empty or a single positive integer `N`.\n\n- Empty → `N = 1`.\n- A positive integer → `N` = that value.\n- Anything else (non-numeric, zero, negative) → tell the user: \"Expected an optional count, e.g. `\u002Ffsad-harness:next` or `\u002Ffsad-harness:next 3`.\" Stop.\n\n## Step 2 — Find candidate open tasks (targeted grep, not a full-file Read)\n\nRun a targeted grep against the todo file instead of reading it in full:\n\n```bash\ngrep -nE '^- \\[ \\] .*{prefix}-[0-9]+' \"{todo_file_path}\"\n```\n\nUse the resolved absolute path for `{todo_file_path}` and quote it to handle spaces. This returns only the open (`- [ ]`) lines that mention the project's `cfg.prefix`, each with its line number — never pull the whole backlog into context.\n\n- **No matches**: tell the user \"No open tasks found in `[cfg.todo_file]`. All done!\" Stop.\n- **One or more matches**: extract the canonical `PREFIX-NNN` identifier from each matching line. These are the candidate set. Continue.\n\n## Step 3 — Rank candidates by readiness\n\nFor each candidate ID, gather two readiness signals without a full-file read:\n\n1. **Has a task-detail file** — check whether `{project_root}\u002F{cfg.task_dir}\u002F{rendered cfg.task_filename_template}` exists for that ID (same path resolution `do-task` uses). A candidate with an existing task-detail file already has a plan drafted and is ready to execute immediately.\n2. **No stated unmet dependency** — inspect the candidate's todo-line text (and, if it has a task-detail file, its Summary\u002FAssessment section) for an explicit reference to another task ID as a blocker (e.g. \"depends on TBS-040\", \"blocked by\", \"after TBS-045 lands\"). If that referenced task is not yet checked `[x]` in the todo file, treat the candidate as **not ready**.\n\nRank the candidate set:\n\n- **Tier 1 — ready**: has a task-detail file AND no unmet dependency.\n- **Tier 2 — plannable**: no task-detail file, no unmet dependency (would enter `do-task` plan mode).\n- **Tier 3 — blocked**: has a stated unmet dependency. Exclude from selection unless every candidate is Tier 3 (in which case surface this to the user rather than silently picking one).\n\nWithin a tier, preserve file order (top-to-bottom) as the tiebreaker.\n\nSelect the top `N` candidates from this ranking (Tier 1 first, then Tier 2, then Tier 3 only if nothing else is available).\n\nReport the choice and reason before proceeding, e.g.:\n\n> Selected **TBS-042** (Tier 1 — ready: task-detail file exists, no unmet dependency) over TBS-044 (Tier 3 — blocked: references open TBS-041).\n\nIf `N > 1`, list all selected candidates with their tier and reason in the same format.\n\n## Step 4 — Verify before handoff\n\nBefore invoking `do-task`, validate every selected ID:\n\n1. Each ID matches the canonical `PREFIX-NNN` pattern exactly — correct prefix casing (`cfg.prefix`), a literal hyphen, and a numeric suffix zero-padded to `cfg.number_digits` digits.\n2. Each ID corresponds to exactly one open (`- [ ]`) line in the candidate set from Step 2 — no duplicates, no ambiguous partial matches (e.g. two lines that could both plausibly resolve to the same prefix\u002Fnumber).\n\nIf any selected ID fails either check — malformed pattern, or an ambiguous\u002Fduplicate match — **stop and ask** the user to disambiguate rather than guessing or handing off a bad value. Show the conflicting lines so the user can pick.\n\nIf `N` exceeds the number of available (non-Tier-3, or all-Tier-3-if-forced) candidates, hand off as many as are available and tell the user how many were found vs. requested.\n\n## Step 5 — No open tasks\n\n(Covered in Step 2 — no separate action needed here.)\n\n## Step 6 — Hand off to do-task\n\n- **`N = 1`**: Tell the user which task was selected and why, e.g.:\n\n  > Next task: **TBS-006** — \"Add a new skill `fsad-harness:next`\" (Tier 1 — ready). Handing off to `fsad-harness:do-task`…\n\n  Then invoke `fsad-harness:do-task` via the Skill tool, passing the single canonical task identifier as the argument.\n\n- **`N > 1`**: Tell the user the full ranked list being dispatched, e.g.:\n\n  > Dispatching 3 ready tasks to `fsad-harness:do-task`: **TBS-042, TBS-044, TBS-046**.\n\n  Then invoke `fsad-harness:do-task` via the Skill tool, passing all selected canonical identifiers space-separated as a single argument string (e.g. `TBS-042 TBS-044 TBS-046`). `do-task`'s own Step 0.5 multi-task dispatch takes over from there — each ID is planned\u002Fexecuted concurrently in its own isolated worktree.\n","# fsad-harness:next — pick the next ready task and hand off to do-task\n\nYou find the most **ready** unchecked task(s) in the current project's todo file and invoke `fsad-harness:do-task` with the chosen ID(s). Readiness — not file order — decides which candidate wins.\n\n## Step 0 — Detect the project\n\n1. Determine the current working directory.\n2. Read `~\u002F.claude\u002Fcommands\u002Ffsd\u002Fprojects.yaml`.\n3. Match cwd against each project's `match_paths` (expand `~`). Prefer the longest (most specific) match if multiple match.\n4. If a project matches, refer to its entry as `cfg` and the resolved project root as `project_root`. Proceed.\n5. If **no project matches**:\n   - Tell the user the project is not registered.\n   - Suggest running `\u002Ffsad-harness:add-task` from the project to register it.\n   - Stop.\n\n## Step 1 — Parse the optional count argument\n\n`$ARGUMENTS` is either empty or a single positive integer `N`.\n\n- Empty → `N = 1`.\n- A positive integer → `N` = that value.\n- Anything else (non-numeric, zero, negative) → tell the user: \"Expected an optional count, e.g. `\u002Ffsad-harness:next` or `\u002Ffsad-harness:next 3`.\" Stop.\n\n## Step 2 — Find candidate open tasks (targeted grep, not a full-file Read)\n\nRun a targeted grep against the todo file instead of reading it in full:\n\n```bash\ngrep -nE '^- \\[ \\] .*{prefix}-[0-9]+' \"{todo_file_path}\"\n```\n\nUse the resolved absolute path for `{todo_file_path}` and quote it to handle spaces. This returns only the open (`- [ ]`) lines that mention the project's `cfg.prefix`, each with its line number — never pull the whole backlog into context.\n\n- **No matches**: tell the user \"No open tasks found in `[cfg.todo_file]`. All done!\" Stop.\n- **One or more matches**: extract the canonical `PREFIX-NNN` identifier from each matching line. These are the candidate set. Continue.\n\n## Step 3 — Rank candidates by readiness\n\nFor each candidate ID, gather two readiness signals without a full-file read:\n\n1. **Has a task-detail file** — check whether `{project_root}\u002F{cfg.task_dir}\u002F{rendered cfg.task_filename_template}` exists for that ID (same path resolution `do-task` uses). A candidate with an existing task-detail file already has a plan drafted and is ready to execute immediately.\n2. **No stated unmet dependency** — inspect the candidate's todo-line text (and, if it has a task-detail file, its Summary\u002FAssessment section) for an explicit reference to another task ID as a blocker (e.g. \"depends on TBS-040\", \"blocked by\", \"after TBS-045 lands\"). If that referenced task is not yet checked `[x]` in the todo file, treat the candidate as **not ready**.\n\nRank the candidate set:\n\n- **Tier 1 — ready**: has a task-detail file AND no unmet dependency.\n- **Tier 2 — plannable**: no task-detail file, no unmet dependency (would enter `do-task` plan mode).\n- **Tier 3 — blocked**: has a stated unmet dependency. Exclude from selection unless every candidate is Tier 3 (in which case surface this to the user rather than silently picking one).\n\nWithin a tier, preserve file order (top-to-bottom) as the tiebreaker.\n\nSelect the top `N` candidates from this ranking (Tier 1 first, then Tier 2, then Tier 3 only if nothing else is available).\n\nReport the choice and reason before proceeding, e.g.:\n\n> Selected **TBS-042** (Tier 1 — ready: task-detail file exists, no unmet dependency) over TBS-044 (Tier 3 — blocked: references open TBS-041).\n\nIf `N > 1`, list all selected candidates with their tier and reason in the same format.\n\n## Step 4 — Verify before handoff\n\nBefore invoking `do-task`, validate every selected ID:\n\n1. Each ID matches the canonical `PREFIX-NNN` pattern exactly — correct prefix casing (`cfg.prefix`), a literal hyphen, and a numeric suffix zero-padded to `cfg.number_digits` digits.\n2. Each ID corresponds to exactly one open (`- [ ]`) line in the candidate set from Step 2 — no duplicates, no ambiguous partial matches (e.g. two lines that could both plausibly resolve to the same prefix\u002Fnumber).\n\nIf any selected ID fails either check — malformed pattern, or an ambiguous\u002Fduplicate match — **stop and ask** the user to disambiguate rather than guessing or handing off a bad value. Show the conflicting lines so the user can pick.\n\nIf `N` exceeds the number of available (non-Tier-3, or all-Tier-3-if-forced) candidates, hand off as many as are available and tell the user how many were found vs. requested.\n\n## Step 5 — No open tasks\n\n(Covered in Step 2 — no separate action needed here.)\n\n## Step 6 — Hand off to do-task\n\n- **`N = 1`**: Tell the user which task was selected and why, e.g.:\n\n  > Next task: **TBS-006** — \"Add a new skill `fsad-harness:next`\" (Tier 1 — ready). Handing off to `fsad-harness:do-task`…\n\n  Then invoke `fsad-harness:do-task` via the Skill tool, passing the single canonical task identifier as the argument.\n\n- **`N > 1`**: Tell the user the full ranked list being dispatched, e.g.:\n\n  > Dispatching 3 ready tasks to `fsad-harness:do-task`: **TBS-042, TBS-044, TBS-046**.\n\n  Then invoke `fsad-harness:do-task` via the Skill tool, passing all selected canonical identifiers space-separated as a single argument string (e.g. `TBS-042 TBS-044 TBS-046`). `do-task`'s own Step 0.5 multi-task dispatch takes over from there — each ID is planned\u002Fexecuted concurrently in its own isolated worktree.\n",{},"main","e32e0d2b9fad831f2915fc773e03fd68d98c8c1e","skills\u002Fnext",0,"https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training","https:\u002F\u002Ffsad-training.vercel.app","https:\u002F\u002Fgithub.com\u002Ftbeack","2026-10-12 21:23:30",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add tbeack\u002Ffsad_training --skill next",{"tool":37,"command":38},"bunx","bunx skills add tbeack\u002Ffsad_training --skill next",{"tool":40,"command":41},"pnpm","pnpm dlx skills add tbeack\u002Ffsad_training --skill next","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fnext\u002FSKILL.md",true,[],[46,55,64,86,107,116],{"skillNo":47,"name":48,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":49,"categories":50,"keywords":51,"publishedAt":18},"01M71KR8NEVXYHFZ9YF9PBEMH9","verify-ac","https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fverify-ac\u002FSKILL.md",[],[52,53,54],"verify ac","ac","verify",{"skillNo":56,"name":57,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":18},"01M71KR6NR71VM37PJX36EM18X","spec-review","https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fspec-review\u002FSKILL.md",[],[61,62,63],"spec","review","spec review",{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":18},"01M71KR55DS0Q45W9YF0516AX4","ship","Short alias for \u002Ffsad-harness:ship-it. Wrap up finished work, cut a version, commit, push, and open a PR.","https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fship\u002FSKILL.md",[],[66,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],"it","commit","version","wrap up","open","wrap","up","short","cut","for","pr","push","alias","work","harness",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":18},"01M71KR0YNJ99YAJGEDPHZTTTQ","ship-it","Wrap up a finished round of work — verify README and CHANGELOG are current, cut a version if warranted, move completed task files into the completed\u002F folder, then create a feature branch if needed, commit, push, and open a PR. Run after `\u002Ffsad-harness:do-task` has marked one or more tasks done. Takes no arguments.","https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fship-it\u002FSKILL.md",[],[71,66,93,94,95,96,97,98,99,100,77,75,101,102,103,104,72,105,106,84],"ship it","files","ls","branch","checkout","parse","move","gh pr","remote","done","Bash","tasks","log","create",{"skillNo":108,"name":109,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":18},"01M71KQZ640W3AQ707NFDANCMW","set-context","https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fset-context\u002FSKILL.md",[],[113,114,115],"context","set context","SET",{"skillNo":117,"name":118,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":18},"01M71KQV6HR3HP3G2K0BFC011Y","sec-review-team","https:\u002F\u002Fgithub.com\u002Ftbeack\u002Ffsad_training\u002Fblob\u002Fmain\u002Fskills\u002Fsec-review-team\u002FSKILL.md",[],[62,122,123,124],"team","review team","sec review team"]