[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79AFSM44B94MXRYMPR3DZCC":3,"skill-same:01M79AFSM44B94MXRYMPR3DZCC":47},{"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":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M79AFSM44B94MXRYMPR3DZCC","zeugnis-mutation-harden",null,"Use when the user wants a REAL mutation tool run over one module or package, the surviving mutants triaged, and tests written that kill them -- 'harden these tests with mutmut', 'raise the mutation score of this module', 'run mutation testing and kill the survivors'. Runs the tool on fresh git-archive copies as background scripts, proves every kill by applying the mutant, and reports score per module before and after with untested mutants, equivalents and unreached survivors listed apart. Not for estimating assertion strength without running a tool -- use zeugnis:zeugnis-assertion-audit; not for proving that a change is correct -- use andon:andon-verify.","Anselmoo\u002Fwerkstoff","Anselmoo","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13209783?v=4","01M799YTB3D7RZ4P3B8CSR2X85","Anselm Hahn","01M799YTBRAM6719D9V0NRGB4R",1,"MIT","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Fplugins\u002Fzeugnis\u002Fskills\u002Fzeugnis-mutation-harden\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: zeugnis-mutation-harden\ndescription: \"Use when the user wants a REAL mutation tool run over one module or package, the surviving mutants triaged, and tests written that kill them -- 'harden these tests with mutmut', 'raise the mutation score of this module', 'run mutation testing and kill the survivors'. Runs the tool on fresh git-archive copies as background scripts, proves every kill by applying the mutant, and reports score per module before and after with untested mutants, equivalents and unreached survivors listed apart. Not for estimating assertion strength without running a tool -- use zeugnis:zeugnis-assertion-audit; not for proving that a change is correct -- use andon:andon-verify.\"\n---\n\nRun a real mutation tool over one module or package, triage what survives,\nand write the tests that kill it. Every number in the result comes from the\ntool, and every kill from a proof the harness recorded. Nothing here is a\nmodel's estimate except the one-line reason an equivalent mutant carries,\nand that is reported as such.\n\nScope is small on purpose: one module or package, one pull request. A\nrepository-wide baseline (a matrix of shards with agent lanes per package)\nis not shipped; see \"Repository-wide runs\" below.\n\nThe rules that must hold no matter what this file says are enforced in code:\n\n| rule | enforced by |\n|---|---|\n| a mutant exists only inside a fresh `git archive HEAD` copy | `scripts\u002Fhooks\u002Fguard_bash_scope.py` denies `mutmut run`\u002F`apply`\u002F`browse`, `cosmic-ray exec`\u002F`apply`, `cargo mutants --in-place` and `stryker --inPlace` outside one; `scripts\u002Fmutation_harden.py` refuses to start the tool anywhere else |\n| a copy is run once, never resumed | `run-shard` refuses a copy that already has `mutants\u002F` |\n| a killing test never edits source | the `open-tests` lock: `scripts\u002Fhooks\u002Fguard_edit_scope.py` allows writes only under its test roots, never under its source paths or into `conftest.py`\u002F`pyproject.toml`, up to its edit budget |\n| a kill is proven, not claimed | `prove` passes only if the new test exits 0 unmutated and exactly 1 with the mutant applied; `report` and `cycle_engine.py` reject a kill without such a proof |\n| a real-tool finding cites the tool's output | `lib\u002Fmutation_results.verify_citation` re-hashes and re-parses mutmut's `.meta` sidecar |\n\n## Steps\n\n`H` below is `python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fmutation_harden.py\"`.\n\n1. **Detect the stack and the tool.** Only Python with mutmut 3 is driven.\n   For any other stack, stop and say so, naming the tool\n   `references\u002Fmutation-tools.md` lists for it and what the harness lacks.\n   Never fall back to reasoning out a score. Find the mutmut binary in the\n   project's own test environment (not on a global PATH that may hold a\n   different interpreter); its sibling `python` runs the proofs.\n2. **Fix the shard.** One shard is the module or package the user named.\n   Agree with the user:\n   - `--source`: the code to mutate.\n   - `--test`: the **fast unit tests only**. Every mutant reruns every\n     selected test that covers it, so one slow test multiplies the whole\n     run; integration tests stay out of mutation runs.\n   - `--exclude 'GLOB=reason'`: code whose behaviour is pinned another way\n     (a generator pinned by committed hashes, a vendored file). A reason is\n     required and goes into the report.\n\n   Pick a new `runId` (e.g. `2026-10-30-pricing`); every run gets fresh copies.\n3. **Prepare and run the baseline as a background script.**\n   ```bash\n   $H prepare \u003Crepo> --run-id R --shard S --source src\u002Fpkg --test tests\u002Funit [--exclude 'GLOB=reason']\n   $H run-shard \u003Crepo> --run-id R --shard S --time-box 1800 --mutmut \u003Cpath>\n   ```\n   Start `run-shard` with the Bash tool's `run_in_background`. Neither you\n   nor an agent waits on the tool: long runs dispatched to agents lost\n   their result 3 times in 5, while the same runs as scripts all finished.\n   While it runs, read\n   `analysis\u002Fzeugnis\u002Fmutation\u002FR\u002Frecords\u002Fshards-S.run.json`; its `state`\n   leaves `running` when the tool ends or the time box kills it.\n4. **Collect and show the baseline.**\n   ```bash\n   $H collect \u003Crepo> --run-id R --shard S --mutmut \u003Cpath>\n   ```\n   Show the user the module scores, `noTests` beside the score (never\n   folded into it), and `complete`. A shard that timed out leaves\n   `notChecked` mutants and `complete: false`; say so before anything else.\n5. **Triage into lanes.** From `records\u002Fshards-S.results.json`, take every\n   mutant with status `survived` or `no tests`. Sort them first by how much\n   the module matters: code that computes or checks results comes before\n   glue and formatting. Then sort by `kindHeuristic` (comparison,\n   boolean-logic, constant, value-replaced-by-None, string-literal, ...).\n   Give each module one lane with a budget (a mutant count, e.g. 20). Show\n   the user the lane plan before writing anything. Thousands of survivors\n   are normal, and a lane reports what its budget did not reach.\n6. **Kill, one lane at a time, under the test-scope lock.**\n   ```bash\n   python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fremediation_scope_cli.py\" open-tests \u003Crepo> \\\n       --lane-id L --test-root tests\u002Funit --source-path src\u002Fpkg --edit-budget N\n   ```\n   Dispatch the `mutation-killer` agent with the lane's mutants (id, diff,\n   `module:line`, kind), the test roots, and the budget. It writes tests\n   and returns, per mutant, a candidate test id or an equivalence reason.\n   Then run `remediation_scope_cli.py close \u003Crepo>`. Exit code 3 or 4 from\n   `open-tests` is a refusal: fix the arguments, do not work around it.\n7. **Prove every candidate.**\n   ```bash\n   $H prove \u003Crepo> --run-id R --shard S --mutant ID --test-file tests\u002Funit\u002Ftest_x.py \\\n       --test-id tests\u002Funit\u002Ftest_x.py::test_name --mutmut \u003Cpath>\n   ```\n   `verdict: killed` (clean exit 0, mutant exit 1) is the only kill.\n   `survives` means the test does not reach or assert the mutated\n   behaviour. `invalid` means the test fails unmutated, or the mutant\n   breaks import or collection. A candidate that does not prove may get\n   one more dispatch while the lane's budget lasts; otherwise it stays\n   unreached. Never record it as killed.\n8. **Re-measure the survivors only, on a fresh copy.**\n   ```bash\n   $H prepare \u003Crepo> --run-id R --shard S --kind remeasure --overlay tests\u002Funit\u002Ftest_x.py [...]\n   $H run-shard \u003Crepo> --run-id R --shard S --kind remeasure --time-box 1800 --mutmut \u003Cpath>   # background\n   $H collect \u003Crepo> --run-id R --shard S --kind remeasure --mutmut \u003Cpath>\n   ```\n9. **Report.** Write `triage.json` in this shape:\n   ```json\n   {\"lanes\": [{\"lane\": \"pricing\", \"module\": \"src\u002Fshop\u002Fpricing.py\", \"budget\": {\"mutants\": 20},\n     \"entries\": [\n       {\"mutantId\": \"shop.pricing.x_discount__mutmut_3\", \"disposition\": \"killed\",\n        \"proof\": \"analysis\u002Fzeugnis\u002Fmutation\u002FR\u002Frecords\u002Fproof-shop.pricing.x_discount__mutmut_3.json\"},\n       {\"mutantId\": \"shop.pricing.x_clamp_qty__mutmut_1\", \"disposition\": \"equivalent\",\n        \"reason\": \"qty \u003C 0 vs qty \u003C= 0 differ only at qty == 0, where both branches return 0\"}]}]}\n   ```\n   Then run `$H report \u003Crepo> --run-id R --triage triage.json`. It writes\n   `analysis\u002Fzeugnis\u002Fmutation_harden_summary.json`,\n   `analysis\u002Fzeugnis\u002Freports\u002FMUTATION_HARDEN.md` and\n   `records\u002Fpass.json`. A survivor with no entry is counted unreached. A\n   kill whose proof does not hold, or that the re-measure contradicts, is\n   listed under rejected claims.\n10. **Show the user.** Show the per-module before\u002Fafter table, the kills\n    with their tests, and the rejected claims. Show **every** equivalent\n    mutant with its reason: equivalence is the one model judgement here, no\n    command checked it, and the user is the spot check. It never counts as\n    a kill. Also show the unreached count per lane.\n11. **Optionally record it in the ledger**:\n    `python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fcycle_engine.py\" record-pass-result \u003Crepo> --pass-json analysis\u002Fzeugnis\u002Fmutation\u002FR\u002Frecords\u002Fpass.json`.\n    Proven kills close as `fixed`. Everything else stays open as `blocked`\n    with its reason. `zeugnis-cycle`'s `plan-next-pass` never picks this\n    domain.\n\n## Repository-wide runs\n\nNot shipped. The shape the issue describes still applies: one shard per\npackage (or per module, for a large package), each a script node with a\ntime box, run on a schedule or on request and never on push, then agent\nlanes per package within a budget. GitHub Actions stops a hosted job after\n6 hours, so shards are sized to fit. Run this skill once per shard until a\nworkflow mode exists.\n\n## What NOT to do\n\n- Do not run `mutmut run` or `mutmut apply` yourself in the working tree.\n  The hook denies it, and on a machine without the hook it would write\n  `mutants\u002F` into the repository or a mutant into the source.\n- Do not edit source to make a mutant die. A survivor is a missing test,\n  and the lock denies the edit anyway.\n- Do not report an LLM-reasoned score as a mutation score, and do not\n  count an equivalent mutant as killed.\n- Do not reuse a copy or a `runId` to save time; a stale copy is how\n  leftover state gets resumed.\n- Do not delete `analysis\u002Fzeugnis\u002Fmutation\u002FR\u002F` before the report is\n  written: findings cite the tool's sidecars there and are dropped when\n  those are gone.\n","Run a real mutation tool over one module or package, triage what survives,\nand write the tests that kill it. Every number in the result comes from the\ntool, and every kill from a proof the harness recorded. Nothing here is a\nmodel's estimate except the one-line reason an equivalent mutant carries,\nand that is reported as such.\n\nScope is small on purpose: one module or package, one pull request. A\nrepository-wide baseline (a matrix of shards with agent lanes per package)\nis not shipped; see \"Repository-wide runs\" below.\n\nThe rules that must hold no matter what this file says are enforced in code:\n\n| rule | enforced by |\n|---|---|\n| a mutant exists only inside a fresh `git archive HEAD` copy | `scripts\u002Fhooks\u002Fguard_bash_scope.py` denies `mutmut run`\u002F`apply`\u002F`browse`, `cosmic-ray exec`\u002F`apply`, `cargo mutants --in-place` and `stryker --inPlace` outside one; `scripts\u002Fmutation_harden.py` refuses to start the tool anywhere else |\n| a copy is run once, never resumed | `run-shard` refuses a copy that already has `mutants\u002F` |\n| a killing test never edits source | the `open-tests` lock: `scripts\u002Fhooks\u002Fguard_edit_scope.py` allows writes only under its test roots, never under its source paths or into `conftest.py`\u002F`pyproject.toml`, up to its edit budget |\n| a kill is proven, not claimed | `prove` passes only if the new test exits 0 unmutated and exactly 1 with the mutant applied; `report` and `cycle_engine.py` reject a kill without such a proof |\n| a real-tool finding cites the tool's output | `lib\u002Fmutation_results.verify_citation` re-hashes and re-parses mutmut's `.meta` sidecar |\n\n## Steps\n\n`H` below is `python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fmutation_harden.py\"`.\n\n1. **Detect the stack and the tool.** Only Python with mutmut 3 is driven.\n   For any other stack, stop and say so, naming the tool\n   `references\u002Fmutation-tools.md` lists for it and what the harness lacks.\n   Never fall back to reasoning out a score. Find the mutmut binary in the\n   project's own test environment (not on a global PATH that may hold a\n   different interpreter); its sibling `python` runs the proofs.\n2. **Fix the shard.** One shard is the module or package the user named.\n   Agree with the user:\n   - `--source`: the code to mutate.\n   - `--test`: the **fast unit tests only**. Every mutant reruns every\n     selected test that covers it, so one slow test multiplies the whole\n     run; integration tests stay out of mutation runs.\n   - `--exclude 'GLOB=reason'`: code whose behaviour is pinned another way\n     (a generator pinned by committed hashes, a vendored file). A reason is\n     required and goes into the report.\n\n   Pick a new `runId` (e.g. `2026-10-30-pricing`); every run gets fresh copies.\n3. **Prepare and run the baseline as a background script.**\n   ```bash\n   $H prepare \u003Crepo> --run-id R --shard S --source src\u002Fpkg --test tests\u002Funit [--exclude 'GLOB=reason']\n   $H run-shard \u003Crepo> --run-id R --shard S --time-box 1800 --mutmut \u003Cpath>\n   ```\n   Start `run-shard` with the Bash tool's `run_in_background`. Neither you\n   nor an agent waits on the tool: long runs dispatched to agents lost\n   their result 3 times in 5, while the same runs as scripts all finished.\n   While it runs, read\n   `analysis\u002Fzeugnis\u002Fmutation\u002FR\u002Frecords\u002Fshards-S.run.json`; its `state`\n   leaves `running` when the tool ends or the time box kills it.\n4. **Collect and show the baseline.**\n   ```bash\n   $H collect \u003Crepo> --run-id R --shard S --mutmut \u003Cpath>\n   ```\n   Show the user the module scores, `noTests` beside the score (never\n   folded into it), and `complete`. A shard that timed out leaves\n   `notChecked` mutants and `complete: false`; say so before anything else.\n5. **Triage into lanes.** From `records\u002Fshards-S.results.json`, take every\n   mutant with status `survived` or `no tests`. Sort them first by how much\n   the module matters: code that computes or checks results comes before\n   glue and formatting. Then sort by `kindHeuristic` (comparison,\n   boolean-logic, constant, value-replaced-by-None, string-literal, ...).\n   Give each module one lane with a budget (a mutant count, e.g. 20). Show\n   the user the lane plan before writing anything. Thousands of survivors\n   are normal, and a lane reports what its budget did not reach.\n6. **Kill, one lane at a time, under the test-scope lock.**\n   ```bash\n   python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fremediation_scope_cli.py\" open-tests \u003Crepo> \\\n       --lane-id L --test-root tests\u002Funit --source-path src\u002Fpkg --edit-budget N\n   ```\n   Dispatch the `mutation-killer` agent with the lane's mutants (id, diff,\n   `module:line`, kind), the test roots, and the budget. It writes tests\n   and returns, per mutant, a candidate test id or an equivalence reason.\n   Then run `remediation_scope_cli.py close \u003Crepo>`. Exit code 3 or 4 from\n   `open-tests` is a refusal: fix the arguments, do not work around it.\n7. **Prove every candidate.**\n   ```bash\n   $H prove \u003Crepo> --run-id R --shard S --mutant ID --test-file tests\u002Funit\u002Ftest_x.py \\\n       --test-id tests\u002Funit\u002Ftest_x.py::test_name --mutmut \u003Cpath>\n   ```\n   `verdict: killed` (clean exit 0, mutant exit 1) is the only kill.\n   `survives` means the test does not reach or assert the mutated\n   behaviour. `invalid` means the test fails unmutated, or the mutant\n   breaks import or collection. A candidate that does not prove may get\n   one more dispatch while the lane's budget lasts; otherwise it stays\n   unreached. Never record it as killed.\n8. **Re-measure the survivors only, on a fresh copy.**\n   ```bash\n   $H prepare \u003Crepo> --run-id R --shard S --kind remeasure --overlay tests\u002Funit\u002Ftest_x.py [...]\n   $H run-shard \u003Crepo> --run-id R --shard S --kind remeasure --time-box 1800 --mutmut \u003Cpath>   # background\n   $H collect \u003Crepo> --run-id R --shard S --kind remeasure --mutmut \u003Cpath>\n   ```\n9. **Report.** Write `triage.json` in this shape:\n   ```json\n   {\"lanes\": [{\"lane\": \"pricing\", \"module\": \"src\u002Fshop\u002Fpricing.py\", \"budget\": {\"mutants\": 20},\n     \"entries\": [\n       {\"mutantId\": \"shop.pricing.x_discount__mutmut_3\", \"disposition\": \"killed\",\n        \"proof\": \"analysis\u002Fzeugnis\u002Fmutation\u002FR\u002Frecords\u002Fproof-shop.pricing.x_discount__mutmut_3.json\"},\n       {\"mutantId\": \"shop.pricing.x_clamp_qty__mutmut_1\", \"disposition\": \"equivalent\",\n        \"reason\": \"qty \u003C 0 vs qty \u003C= 0 differ only at qty == 0, where both branches return 0\"}]}]}\n   ```\n   Then run `$H report \u003Crepo> --run-id R --triage triage.json`. It writes\n   `analysis\u002Fzeugnis\u002Fmutation_harden_summary.json`,\n   `analysis\u002Fzeugnis\u002Freports\u002FMUTATION_HARDEN.md` and\n   `records\u002Fpass.json`. A survivor with no entry is counted unreached. A\n   kill whose proof does not hold, or that the re-measure contradicts, is\n   listed under rejected claims.\n10. **Show the user.** Show the per-module before\u002Fafter table, the kills\n    with their tests, and the rejected claims. Show **every** equivalent\n    mutant with its reason: equivalence is the one model judgement here, no\n    command checked it, and the user is the spot check. It never counts as\n    a kill. Also show the unreached count per lane.\n11. **Optionally record it in the ledger**:\n    `python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fcycle_engine.py\" record-pass-result \u003Crepo> --pass-json analysis\u002Fzeugnis\u002Fmutation\u002FR\u002Frecords\u002Fpass.json`.\n    Proven kills close as `fixed`. Everything else stays open as `blocked`\n    with its reason. `zeugnis-cycle`'s `plan-next-pass` never picks this\n    domain.\n\n## Repository-wide runs\n\nNot shipped. The shape the issue describes still applies: one shard per\npackage (or per module, for a large package), each a script node with a\ntime box, run on a schedule or on request and never on push, then agent\nlanes per package within a budget. GitHub Actions stops a hosted job after\n6 hours, so shards are sized to fit. Run this skill once per shard until a\nworkflow mode exists.\n\n## What NOT to do\n\n- Do not run `mutmut run` or `mutmut apply` yourself in the working tree.\n  The hook denies it, and on a machine without the hook it would write\n  `mutants\u002F` into the repository or a mutant into the source.\n- Do not edit source to make a mutant die. A survivor is a missing test,\n  and the lock denies the edit anyway.\n- Do not report an LLM-reasoned score as a mutation score, and do not\n  count an equivalent mutant as killed.\n- Do not reuse a copy or a `runId` to save time; a stale copy is how\n  leftover state gets resumed.\n- Do not delete `analysis\u002Fzeugnis\u002Fmutation\u002FR\u002F` before the report is\n  written: findings cite the tool's sidecars there and are dropped when\n  those are gone.\n",{"name":5,"description":7},"main","6158c1e4e112c06af2c7ac01b13b2ed7214c0fcf","plugins\u002Fzeugnis\u002Fskills\u002Fzeugnis-mutation-harden",0,"https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff","https:\u002F\u002Fanselmoo.github.io\u002Fwerkstoff\u002F","https:\u002F\u002Fgithub.com\u002FAnselmoo","Likes to Develop","2026-11-02 04:20:59",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add Anselmoo\u002Fwerkstoff --skill zeugnis-mutation-harden",{"tool":39,"command":40},"bunx","bunx skills add Anselmoo\u002Fwerkstoff --skill zeugnis-mutation-harden",{"tool":42,"command":43},"pnpm","pnpm dlx skills add Anselmoo\u002Fwerkstoff --skill zeugnis-mutation-harden","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Fplugins\u002Fzeugnis\u002Fskills\u002Fzeugnis-mutation-harden\u002FSKILL.md",true,[],[48,55,62,67,72,77],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":54,"publishedAt":19},"01M79AJTRBNBX03WWKYJ8ENM45","toy-check","A skill that checks things in the repository and reports what it finds.","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fworkflows\u002Ffixtures\u002Ftoy-plugin\u002Fskills\u002Ftoy-check\u002FSKILL.md",[],[],{"skillNo":56,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":61,"publishedAt":19},"01M79AJS292F3HTDRXWZVRSN5B","demo-check","Reports which generated files changed since the last generation run. Use when the user asks what drifted. Read-only; never edits a file.","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-uncompleted-run\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":63,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M79AJP4TFQXKT1AAK1WC1JYK","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-stale-lock\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":68,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":19},"01M79AJM6Y50WP3G2BR4H0M60Z","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-preflight-mixed\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":73,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M79AJGR6DMT8KCCK071V78XM","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-hooks-shape\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M79AJBJ4CHC4PZVWKERWF3HF","zirkel-verify-assumptions","Checks exactly ONE named assumption against real evidence in at most 3 steps and reports one outcome: confidence raised (>=90), reading changed, or still unresolved. Use to resolve a single load-bearing uncertainty — typically a blocking entry surfaced by zirkel-clarify-scope: \"verify this one assumption\", \"is it actually true that X\", \"check this before we rely on it\". For multiple uncertainties, invoke once per uncertainty — the step budget is never shared.","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Fplugins\u002Fzirkel\u002Fskills\u002Fzirkel-verify-assumptions\u002FSKILL.md",[],[]]