[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79RGZX51N808E2ZP71A5CMB":3,"skill-same:01M79RGZX51N808E2ZP71A5CMB":100},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":14,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":29,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M79RGZX51N808E2ZP71A5CMB","bmad-eval-runner",null,"Run a skill's evals and report results. Use when the user wants to evaluate a skill, run evals, benchmark a skill, validate triggers, optimize a description, or grade skill outputs.","thkennedy\u002Ftk-studio","thkennedy","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F4164502?v=4","01M79QZ8DMP5FF2HC6GS3S6FDF","Tim Kennedy","01M79QZ8EM9JBWJ15R5JNC4PW3",0,"MIT","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: bmad-eval-runner\ndescription: Run a skill's evals and report results. Use when the user wants to evaluate a skill, run evals, benchmark a skill, validate triggers, optimize a description, or grade skill outputs.\n---\n\n# Skill Eval Runner\n\nYou run a skill's evals and report what they say. The user wants signal, not theatre, so cite specific findings, surface evals that pass for trivial reasons, and never widen a tolerance to make a run look like it succeeded.\n\nThe runner is platform-agnostic. Everything runtime-specific (how a skill is invoked, where its auth comes from, what its transcript looks like) lives behind the adapter seam described in `references\u002Fplatform-adapter.md`. No model name is hardcoded anywhere in this skill.\n\n## The four modes\n\nEach mode answers a different question about a skill. Pick the one that matches what the user is asking, or run several.\n\n| Mode | Question it answers | Script \u002F reference |\n|---|---|---|\n| baseline | Does the skill beat the bare model on the same input? | `references\u002Feval-format.md`, `scripts\u002Frun_evals.py` |\n| variant | Does a section earn its place, or does a stripped version do as well? | `references\u002Feval-format.md`, `scripts\u002Frun_evals.py` |\n| quality | Does the output meet the named rubric? | `references\u002Fgrader.md`, `references\u002Feval-format.md` |\n| trigger | Does the description fire on the right queries and stay quiet on the rest? | `references\u002Fplatform-adapter.md`, `scripts\u002Frun_triggers.py` |\n\nBaseline runs every case twice — once with the skill staged into the clean working directory and once with nothing staged — so the bare model is measured as the long-term floor under identical conditions. Variant runs the full skill against a stripped smallest-version of itself to settle whether a section is doing real work. Quality grades one config's output against a rubric with the read-only grader. Trigger measures real firing through the adapter and can optimize the description across rounds; the optimization loop lives in `references\u002Fdescription-optimization.md`.\n\nA case is `input + rubric + optional state_prefix + optional fixture files`. The `state_prefix` is a bracketed prime prepended to the input that places the skill mid-workflow in a single shot, so one input can exercise any turn without a multi-turn simulator. The full case format and the strong-versus-weak expectation taxonomy are in `references\u002Feval-format.md`.\n\n## Args\n\n- Positional: a path to the skill being evaluated (directory containing `SKILL.md`).\n- `--evals \u003Cpath>`: explicit path to the cases file. If omitted, discover.\n- `--mode baseline|variant|quality|trigger`: which mode to run. May be repeated.\n- `--variant-path \u003Cpath>`: for variant mode, the stripped or prior-version skill to compare against.\n- `--project-root \u003Cpath>`: root of the project the skill belongs to. Default: walk up from the skill path looking for `_bmad\u002F` or `.git\u002F`.\n- `--output-dir \u003Cpath>`: where run folders are written. Default: `{bmad_builder_reports}\u002Feval-runs\u002F` if configured, else `~\u002Fbmad-evals\u002F`.\n- `--runs \u003Cn>`: repeats per case for the variance benchmark. Default: 1 for a single check, higher when the user wants a stable mean.\n- `--headless` \u002F `-H`: non-interactive; emit final JSON only.\n\nThese map directly onto the script CLIs below; anything not listed there (case subsets, timeouts, workers) is in the script docstrings.\n\n## On activation\n\n1. Resolve config the way `bmad-workflow-builder` does (`{project-root}\u002F_bmad\u002Fconfig.yaml` then `config.user.yaml`, falling back to `bmb\u002Fconfig.yaml`). Resolve `{user_name}`, `{communication_language}`, `{bmad_builder_reports}` and apply them through the session.\n\n2. If `--headless` was passed, set `{headless_mode}=true`, skip every confirmation below, pick the safest defaults, and proceed.\n\n3. Resume check: glob the output dir for an in-progress run's `.memlog.md`. If one exists and matches this skill, read it once to rebuild state, then continue append-only. Capture decisions and direction changes into the run's memlog through `scripts\u002Fmemlog.py` as they land.\n\n4. Locate the skill and verify `\u003Cskill-path>\u002FSKILL.md` exists. Halt with a clear error if it does not.\n\n5. Resolve the adapter config per the discovery rules in `references\u002Fplatform-adapter.md` (explicit `--adapter`, `BMAD_EVAL_ADAPTER`, `adapter.json` beside the cases file). When nothing is configured and the current runtime is Claude Code, use `{skill-root}\u002Fassets\u002Fadapter-claude-code.json`.\n\n6. Discover the cases file. Look at `--evals` first, then `\u003Cskill-path>\u002Fevals\u002F`, then `\u003Cskill-path>\u002F..\u002F..\u002Fevals\u002F\u003Cskill-name>\u002F`, then `\u003Cproject-root>\u002Fevals\u002F\u003Cskill-name>\u002F`, then anywhere under `\u003Cproject-root>\u002Fevals\u002F`. Take the first match. If nothing is found, halt and say so; the runner does not invent cases.\n\n7. Confirm the run summary (skill, cases found, modes, output dir) unless headless, then execute.\n\n## Run execution\n\nEach case runs in a clean working directory with the skill under test staged into it and an environment built from scratch, so the host shell config, prior runs, and ancestor instruction files do not bias the result. The isolation contract lives in `references\u002Fplatform-adapter.md`; there is no container, no terminal emulation, and no credential staging.\n\nFor baseline, variant, and quality modes:\n\n```\npython3 {skill-root}\u002Fscripts\u002Frun_evals.py \\\n  --cases \u003Ccases-file> --skill-path \u003Cskill> --output-dir \u003Cdir> \\\n  --mode quality|baseline|variant [--variant-path \u003Cskill>] \\\n  [--adapter \u003Cadapter.json>] [--runs N]\n```\n\nThe script stages the skill and any case fixtures, applies any `state_prefix` to the input, runs each config (baseline = skill staged AND bare; variant = skill AND `--variant-path`), and writes `\u003Crun-dir>\u002F\u003Cconfig>\u002F\u003Ccase-id>\u002F`. It captures timing and token counts the moment each invocation completes and writes them to `timing.json` immediately, so a later crash never loses the measurement.\n\nFor trigger mode:\n\n```\npython3 {skill-root}\u002Fscripts\u002Frun_triggers.py \\\n  --skill-path \u003Cskill> --queries \u003Cqueries-file> --output-dir \u003Cdir> \\\n  [--adapter \u003Cadapter.json>] [--runs-per-query N]\n```\n\nIt stages a synthetic skill where the runtime discovers skills, sends each query through the adapter, and detects the skill-load tool call. Each query runs several times for stability. When the user wants to optimize the description rather than just measure it, follow `references\u002Fdescription-optimization.md`.\n\nFor quality mode, spawn the grader described in `references\u002Fgrader.md` per case, passing the case's rubric, transcript path, artifacts dir (the case's `cwd\u002F`), and a `grading_path` of `\u003Ccase-folder>\u002Fgrading.json`. The grader writes that file, gives no partial credit, and flags weak or non-discriminating assertions; relay that feedback. If a grader subagent errors, mark that case `grading_error` — never substitute a default verdict.\n\nWhen `--runs` is greater than one, call `python3 {skill-root}\u002Fscripts\u002Faggregate_benchmark.py --baseline \u003Crun-dir>\u002F\u003Cconfig-a> --variant \u003Crun-dir>\u002F\u003Cconfig-b>` to produce the mean, sample standard deviation, min, max, and the delta between configs (`--runs \u003Crun-dir>\u002F\u003Cconfig>` for a single config's spread).\n\nWhen a run fails or comes back weak and the user wants the skill improved from the results, follow `references\u002Fself-improvement.md`.\n\n## Artifacts\n\nEvery run writes a dated run folder under the output dir, and those artifacts are permanent. Each case folder holds its prompt, transcript, the `cwd\u002F` with any files the skill wrote, `timing.json`, and `grading.json` when quality mode ran. Never delete, overwrite, or rotate a run folder; disk usage is the user's call. The run's `.memlog.md` records the decisions and deltas so a resumed or audited run reads back cleanly.\n\nTell the user where the run folder is when you finish.\n\n## Outcomes\n\n- The run reflects the skill's behavior in a clean working directory, not the behavior of the host shell with its memories and configs.\n- Timing and token counts land on disk the moment they are measured.\n- Failures cite specific expectations with evidence, and a pass that looks superficial is flagged rather than papered over.\n- A baseline run that the skill no longer wins points to retiring the skill, not patching it.\n","# Skill Eval Runner\n\nYou run a skill's evals and report what they say. The user wants signal, not theatre, so cite specific findings, surface evals that pass for trivial reasons, and never widen a tolerance to make a run look like it succeeded.\n\nThe runner is platform-agnostic. Everything runtime-specific (how a skill is invoked, where its auth comes from, what its transcript looks like) lives behind the adapter seam described in `references\u002Fplatform-adapter.md`. No model name is hardcoded anywhere in this skill.\n\n## The four modes\n\nEach mode answers a different question about a skill. Pick the one that matches what the user is asking, or run several.\n\n| Mode | Question it answers | Script \u002F reference |\n|---|---|---|\n| baseline | Does the skill beat the bare model on the same input? | `references\u002Feval-format.md`, `scripts\u002Frun_evals.py` |\n| variant | Does a section earn its place, or does a stripped version do as well? | `references\u002Feval-format.md`, `scripts\u002Frun_evals.py` |\n| quality | Does the output meet the named rubric? | `references\u002Fgrader.md`, `references\u002Feval-format.md` |\n| trigger | Does the description fire on the right queries and stay quiet on the rest? | `references\u002Fplatform-adapter.md`, `scripts\u002Frun_triggers.py` |\n\nBaseline runs every case twice — once with the skill staged into the clean working directory and once with nothing staged — so the bare model is measured as the long-term floor under identical conditions. Variant runs the full skill against a stripped smallest-version of itself to settle whether a section is doing real work. Quality grades one config's output against a rubric with the read-only grader. Trigger measures real firing through the adapter and can optimize the description across rounds; the optimization loop lives in `references\u002Fdescription-optimization.md`.\n\nA case is `input + rubric + optional state_prefix + optional fixture files`. The `state_prefix` is a bracketed prime prepended to the input that places the skill mid-workflow in a single shot, so one input can exercise any turn without a multi-turn simulator. The full case format and the strong-versus-weak expectation taxonomy are in `references\u002Feval-format.md`.\n\n## Args\n\n- Positional: a path to the skill being evaluated (directory containing `SKILL.md`).\n- `--evals \u003Cpath>`: explicit path to the cases file. If omitted, discover.\n- `--mode baseline|variant|quality|trigger`: which mode to run. May be repeated.\n- `--variant-path \u003Cpath>`: for variant mode, the stripped or prior-version skill to compare against.\n- `--project-root \u003Cpath>`: root of the project the skill belongs to. Default: walk up from the skill path looking for `_bmad\u002F` or `.git\u002F`.\n- `--output-dir \u003Cpath>`: where run folders are written. Default: `{bmad_builder_reports}\u002Feval-runs\u002F` if configured, else `~\u002Fbmad-evals\u002F`.\n- `--runs \u003Cn>`: repeats per case for the variance benchmark. Default: 1 for a single check, higher when the user wants a stable mean.\n- `--headless` \u002F `-H`: non-interactive; emit final JSON only.\n\nThese map directly onto the script CLIs below; anything not listed there (case subsets, timeouts, workers) is in the script docstrings.\n\n## On activation\n\n1. Resolve config the way `bmad-workflow-builder` does (`{project-root}\u002F_bmad\u002Fconfig.yaml` then `config.user.yaml`, falling back to `bmb\u002Fconfig.yaml`). Resolve `{user_name}`, `{communication_language}`, `{bmad_builder_reports}` and apply them through the session.\n\n2. If `--headless` was passed, set `{headless_mode}=true`, skip every confirmation below, pick the safest defaults, and proceed.\n\n3. Resume check: glob the output dir for an in-progress run's `.memlog.md`. If one exists and matches this skill, read it once to rebuild state, then continue append-only. Capture decisions and direction changes into the run's memlog through `scripts\u002Fmemlog.py` as they land.\n\n4. Locate the skill and verify `\u003Cskill-path>\u002FSKILL.md` exists. Halt with a clear error if it does not.\n\n5. Resolve the adapter config per the discovery rules in `references\u002Fplatform-adapter.md` (explicit `--adapter`, `BMAD_EVAL_ADAPTER`, `adapter.json` beside the cases file). When nothing is configured and the current runtime is Claude Code, use `{skill-root}\u002Fassets\u002Fadapter-claude-code.json`.\n\n6. Discover the cases file. Look at `--evals` first, then `\u003Cskill-path>\u002Fevals\u002F`, then `\u003Cskill-path>\u002F..\u002F..\u002Fevals\u002F\u003Cskill-name>\u002F`, then `\u003Cproject-root>\u002Fevals\u002F\u003Cskill-name>\u002F`, then anywhere under `\u003Cproject-root>\u002Fevals\u002F`. Take the first match. If nothing is found, halt and say so; the runner does not invent cases.\n\n7. Confirm the run summary (skill, cases found, modes, output dir) unless headless, then execute.\n\n## Run execution\n\nEach case runs in a clean working directory with the skill under test staged into it and an environment built from scratch, so the host shell config, prior runs, and ancestor instruction files do not bias the result. The isolation contract lives in `references\u002Fplatform-adapter.md`; there is no container, no terminal emulation, and no credential staging.\n\nFor baseline, variant, and quality modes:\n\n```\npython3 {skill-root}\u002Fscripts\u002Frun_evals.py \\\n  --cases \u003Ccases-file> --skill-path \u003Cskill> --output-dir \u003Cdir> \\\n  --mode quality|baseline|variant [--variant-path \u003Cskill>] \\\n  [--adapter \u003Cadapter.json>] [--runs N]\n```\n\nThe script stages the skill and any case fixtures, applies any `state_prefix` to the input, runs each config (baseline = skill staged AND bare; variant = skill AND `--variant-path`), and writes `\u003Crun-dir>\u002F\u003Cconfig>\u002F\u003Ccase-id>\u002F`. It captures timing and token counts the moment each invocation completes and writes them to `timing.json` immediately, so a later crash never loses the measurement.\n\nFor trigger mode:\n\n```\npython3 {skill-root}\u002Fscripts\u002Frun_triggers.py \\\n  --skill-path \u003Cskill> --queries \u003Cqueries-file> --output-dir \u003Cdir> \\\n  [--adapter \u003Cadapter.json>] [--runs-per-query N]\n```\n\nIt stages a synthetic skill where the runtime discovers skills, sends each query through the adapter, and detects the skill-load tool call. Each query runs several times for stability. When the user wants to optimize the description rather than just measure it, follow `references\u002Fdescription-optimization.md`.\n\nFor quality mode, spawn the grader described in `references\u002Fgrader.md` per case, passing the case's rubric, transcript path, artifacts dir (the case's `cwd\u002F`), and a `grading_path` of `\u003Ccase-folder>\u002Fgrading.json`. The grader writes that file, gives no partial credit, and flags weak or non-discriminating assertions; relay that feedback. If a grader subagent errors, mark that case `grading_error` — never substitute a default verdict.\n\nWhen `--runs` is greater than one, call `python3 {skill-root}\u002Fscripts\u002Faggregate_benchmark.py --baseline \u003Crun-dir>\u002F\u003Cconfig-a> --variant \u003Crun-dir>\u002F\u003Cconfig-b>` to produce the mean, sample standard deviation, min, max, and the delta between configs (`--runs \u003Crun-dir>\u002F\u003Cconfig>` for a single config's spread).\n\nWhen a run fails or comes back weak and the user wants the skill improved from the results, follow `references\u002Fself-improvement.md`.\n\n## Artifacts\n\nEvery run writes a dated run folder under the output dir, and those artifacts are permanent. Each case folder holds its prompt, transcript, the `cwd\u002F` with any files the skill wrote, `timing.json`, and `grading.json` when quality mode ran. Never delete, overwrite, or rotate a run folder; disk usage is the user's call. The run's `.memlog.md` records the decisions and deltas so a resumed or audited run reads back cleanly.\n\nTell the user where the run folder is when you finish.\n\n## Outcomes\n\n- The run reflects the skill's behavior in a clean working directory, not the behavior of the host shell with its memories and configs.\n- Timing and token counts land on disk the moment they are measured.\n- Failures cite specific expectations with evidence, and a pass that looks superficial is flagged rather than papered over.\n- A baseline run that the skill no longer wins points to retiring the skill, not patching it.\n",{"name":5,"description":7},"main","ecd23b3c0458cd511812f643d9111e3d7c8235f4","apps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio","https:\u002F\u002Fgithub.com\u002Fthkennedy","https:\u002F\u002Ftimothyhkennedy.com","Just a guy who loves making tools, automation and games.","2026-11-10 20:38:16",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add thkennedy\u002Ftk-studio --skill bmad-eval-runner",{"tool":38,"command":39},"bunx","bunx skills add thkennedy\u002Ftk-studio --skill bmad-eval-runner",{"tool":41,"command":42},"pnpm","pnpm dlx skills add thkennedy\u002Ftk-studio --skill bmad-eval-runner","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002FSKILL.md",true,[46,52,58,62,66,70,74,80,84,88,92,96],{"path":47,"resourceType":48,"resourceTypeDesc":49,"sizeBytes":50,"sourceHtmlUrl":51},"assets\u002Fadapter-claude-code.json","ASSET","资产文件",359,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Fassets\u002Fadapter-claude-code.json",{"path":53,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":56,"sourceHtmlUrl":57},"references\u002Fdescription-optimization.md","REFERENCE","参考文档",6796,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Freferences\u002Fdescription-optimization.md",{"path":59,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Feval-format.md",8002,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Freferences\u002Feval-format.md",{"path":63,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":64,"sourceHtmlUrl":65},"references\u002Fgrader.md",5702,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Freferences\u002Fgrader.md",{"path":67,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":68,"sourceHtmlUrl":69},"references\u002Fplatform-adapter.md",5331,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Freferences\u002Fplatform-adapter.md",{"path":71,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Fself-improvement.md",5835,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Freferences\u002Fself-improvement.md",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"scripts\u002Faggregate_benchmark.py","SCRIPT","脚本",8559,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Fscripts\u002Faggregate_benchmark.py",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"scripts\u002Fmemlog.py",7446,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Fscripts\u002Fmemlog.py",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Frun_evals.py",23747,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Fscripts\u002Frun_evals.py",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"scripts\u002Frun_triggers.py",17445,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Fscripts\u002Frun_triggers.py",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"scripts\u002Ftests\u002Ftest_env_isolation.py",2944,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Fscripts\u002Ftests\u002Ftest_env_isolation.py",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Ftests\u002Ftest_trigger_detection.py",4303,"https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fapps\u002Fsupervisor\u002F.claude\u002Fskills\u002Fbmad-eval-runner\u002Fscripts\u002Ftests\u002Ftest_trigger_detection.py",[101,108,115,122,129,136],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":19},"01M79RYSQ8C3MWDFTDSRAYFJYA","tk-studio-track","Tracking verbs on the bound Jira project — `block` moves a story the loop cannot progress, and each dependent story, to \"Blocked - Awaiting User\" with a comment that @mentions the owner (or, with `--engagement`, one engagement's questions issue, which `close` later moves to \"Done\"); `reply` posts the owner's answer (or \"Done.\") with the owner's host-only token and moves the issue to \"Block Resolved\"; `validate` checks that resolution and passes the issue back to work or re-blocks it with a follow-up. Use when the user says \"block this story\", \"tk track block\", \"put it in the owner's inbox\", \"reply to the blocked issue\", \"validate the resolution\", or a supervisor or engagement payload names this skill.","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fplugins\u002Ftk-studio\u002Fskills\u002Ftk-studio-track\u002FSKILL.md",[],[],{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":19},"01M79RYMVE0031EV5B64MBGD8V","tk-studio-session","Session discipline as a surface — land a boundary handoff (optionally carrying knowledge deltas) and end the session, or resume a fresh session from a run workspace alone. Use when the user says \"hand off this run\", \"tk session\", \"resume the run\", or a boundary\u002Fbudget trigger says the session must split.","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fplugins\u002Ftk-studio\u002Fskills\u002Ftk-studio-session\u002FSKILL.md",[],[],{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":19},"01M79RYFM9ATWHM6HAXJ3D19WV","tk-studio-research","Run a chartered research pass — survey the topics a charter scopes, grade every finding by evidence, land the findings in the run workspace, and emit observation events for recommendation-worthy ones. Use when the user says \"run the ecosystem watch\", \"tk research\", or a research job's invoke-skill directive names this skill.","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fplugins\u002Ftk-studio\u002Fskills\u002Ftk-studio-research\u002FSKILL.md",[],[],{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":19},"01M79RYA1AWZZF83KBHGR6JDN3","tk-studio-report","One-verb human defect report — \"the skill did the wrong thing\" — recorded as a report event in the local measurement ledger. Use when the user says \"tk report\", \"report a defect\", \"that skill misbehaved\", or \"log a studio issue\".","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fplugins\u002Ftk-studio\u002Fskills\u002Ftk-studio-report\u002FSKILL.md",[],[],{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":19},"01M79RY33VMYR5YNPVFKWRNW9S","tk-studio-playable-judge","The playable-verify leg's screenshot judge (Story 34.3) — reads only a playable run's report.json and its frames, answers the fixed rubric (scene loaded, player visible and framed, no magenta or error overlay, HUD reads, the named moments shown) with pass or fail and findings each naming a frame and a rubric line. Driven headless by the supervisor's host leg on the project's sandbox tier; use when the payload names a playable `media` folder, or the user says \"judge the playable frames\".","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fplugins\u002Ftk-studio\u002Fskills\u002Ftk-studio-playable-judge\u002FSKILL.md",[],[],{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":19},"01M79RXY4AM8JM6ZK2MAR3W3X2","tk-studio-plan-sync","Planning adapter — canonicalize BMad-native planning artifacts (normalize pass, sole id authority) and sync them with the bound planning backend. Use when the user says \"sync the plan\", \"normalize planning artifacts\", \"tk plan sync\", or after stock BMad planning flows produce or change epics\u002Fstories.","https:\u002F\u002Fgithub.com\u002Fthkennedy\u002Ftk-studio\u002Fblob\u002Fmain\u002Fplugins\u002Ftk-studio\u002Fskills\u002Ftk-studio-plan-sync\u002FSKILL.md",[],[]]