[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E5Q2PBA58S540BMB6GXTN3":3,"skill-same:01M6E5Q2PBA58S540BMB6GXTN3":69},{"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":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":13,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":42,"install":43,"resources":56},"01M6E5Q2PBA58S540BMB6GXTN3","promotion-audit",null,"Deterministic memory->charter->skill->hook promotion auditor — auto-promotes AUTO-tier candidates, files DECIDE-tier draft issues, writes a per-wave audit log.","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\u002Fframework\u002Fassets\u002Fskills\u002Fpromotion-audit\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30],"audit","promotion audit","memory","issues","decide","auto","log","files","deterministic","draft","id","audit log","wave audit","2026-11-10 10:12:30",false,"---\nname: promotion-audit\ndescription: \"Deterministic memory->charter->skill->hook promotion auditor — auto-promotes AUTO-tier candidates, files DECIDE-tier draft issues, writes a per-wave audit log.\"\nargs: Wave id (defaults to the current\u002Flast wave)\n---\n\n# Promotion Audit\n\nMechanically works the backlog the `suggest_generic_prompt` PostToolUse hook silently\naccumulates in the generic-prompt ledger (`generic_prompt_tracker.py`): every project-local\n`.claude\u002F{memory,skills,hooks,lib,team\u002Fcharter}\u002F**` artifact touched since it was last\ndecided. This skill is the periodic, deterministic surface for that signal — there is no\nper-edit nudge (that pattern decayed on an earlier per-edit `systemMessage` design and was\ndeliberately de-escalated to this silent-ledger-plus-periodic-audit shape).\n\n**Enforcement hierarchy this pipeline serves:** `hook > skill > charter > memory`. A rule\nthat keeps needing to be restated belongs promoted one level up; this skill is the\nmechanical check that promotion actually happens instead of staying a memory note forever.\n\n> Config-driven + fail-open: reads `.claude\u002Fframework.config.json` via `jq`. All classification\n> logic (`helpers.py`) is pure-function backed for byte-identical output — the plan for a given\n> ledger + artifact set never varies between runs.\n\n## Instructions\n\n### 0. Resolve config + paths\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull || pwd)\"\nCFG=\"$REPO_ROOT\u002F.claude\u002Fframework.config.json\"\nget() { jq -r \"$1 \u002F\u002F empty\" \"$CFG\" 2>\u002Fdev\u002Fnull; }   # fail-open dotted read\n\nLEDGER_REL=\"$(get '.paths.generic_prompt_ledger')\"; : \"${LEDGER_REL:=.claude\u002Fgeneric_prompt_ledger.json}\"\nLEDGER=\"$REPO_ROOT\u002F$LEDGER_REL\"\n\n# helpers.py: installed location first, framework-source checkout as fallback (mirrors\n# wave-retro's lib-path resolution).\nHELPERS=\"$REPO_ROOT\u002F.claude\u002Fskills\u002Fpromotion-audit\u002Fhelpers.py\"\n[ -f \"$HELPERS\" ] || HELPERS=\"$REPO_ROOT\u002Fframework\u002Fassets\u002Fskills\u002Fpromotion-audit\u002Fhelpers.py\"\n\n# The wave under audit: the argument, else the current\u002Flast wave from lifecycle state.\nLIB=\"$REPO_ROOT\u002F.claude\u002Flib\"; [ -f \"$LIB\u002Flifecycle.py\" ] || LIB=\"$REPO_ROOT\u002Fframework\u002Fassets\u002Flib\"\nWAVE=\"{args}\"; [ -n \"$WAVE\" ] || WAVE=\"$(python3 \"$LIB\u002Flifecycle.py\" state show | jq -r '.current_wave \u002F\u002F .last_completed_wave \u002F\u002F empty')\"\n```\n\n### 1. Read-only plan (always run this first)\n\n```bash\npython3 \"$HELPERS\" plan \"$WAVE\" --ledger \"$LEDGER\" --root \"$REPO_ROOT\"\n```\n\nEmits `{\"auto\": [...], \"decide\": [...], \"done\": [...]}` — the deterministic classification\nof every ledger candidate:\n\n- **`auto`** — the artifact's current content already carries BOTH halves of the charter's\n  Promotion Pipeline Marker Convention (`team\u002Fcharter\u002Fskills.md`): an\n  `\u003C!-- Promoted from memory... -->` comment AND a `**Promotion provenance:**` line. A human\n  already did the promotion; nothing here is a judgment call.\n- **`decide`** — pending, no markers found. Needs a human call.\n- **`done`** — already decided (`genericized` or `skip`) in a prior pass. No action.\n\nReview the plan. If `decide` is non-empty, skim each artifact briefly so the draft issues\nStep 2 files make sense — this skill never guesses which side of genericize\u002Fskip a `decide`\ncandidate falls on.\n\n### 2. Apply the plan\n\n```bash\npython3 \"$HELPERS\" run \"$WAVE\" --ledger \"$LEDGER\" --root \"$REPO_ROOT\" --label promotion-audit\n```\n\nThis **always**:\n\n- Mechanically flips every `auto`-tier ledger entry to `decision: genericized` (a local,\n  reversible write — never gated; there is no judgment call to make when the markers are\n  already present).\n- Writes the per-wave audit log to `paths.promotion_audit_log\u002Fwave_\u003Cid>.md` (default\n  `.claude\u002Fteam\u002Fpromotion_audit_log\u002Fwave_\u003Cid>.md`).\n\nBy **default it runs `--dry-run`**: `decide`-tier candidates get their draft-issue title\u002Fbody\nprinted but nothing is filed. Review the printed bodies, then re-run with `--apply` to\nactually file them:\n\n```bash\npython3 \"$HELPERS\" run \"$WAVE\" --ledger \"$LEDGER\" --root \"$REPO_ROOT\" --label promotion-audit --apply\n```\n\n### 3. Report\n\nSummarize to the user: counts per tier, the audit-log path written, and (if `--apply` ran)\nthe issue numbers filed for `decide`-tier candidates. An empty ledger (`{\"candidates\": {}}`)\nor a ledger with only `done` entries is a clean pass — say so plainly, do not manufacture\nfindings.\n\n### 4. Finalizing a `decide` candidate\n\nOnce a human makes the genericize\u002Fskip call for a filed issue:\n\n- **Genericize:** port the artifact into `framework\u002Fassets\u002F**`, add the marker convention to\n  the LIVE project-local copy (see `team\u002Fcharter\u002Fskills.md`), then\n  `python3 \"$LIB\u002Fgeneric_prompt_tracker.py\" record \u003Cartifact> --decision genericized --wave $WAVE --ledger \"$LEDGER\"`.\n- **Skip:** `python3 \"$LIB\u002Fgeneric_prompt_tracker.py\" record \u003Cartifact> --decision skip --detail \"\u003Cwhy>\" --wave $WAVE --ledger \"$LEDGER\"`.\n\nEither way, close the draft issue referencing the ledger update.\n","# Promotion Audit\n\nMechanically works the backlog the `suggest_generic_prompt` PostToolUse hook silently\naccumulates in the generic-prompt ledger (`generic_prompt_tracker.py`): every project-local\n`.claude\u002F{memory,skills,hooks,lib,team\u002Fcharter}\u002F**` artifact touched since it was last\ndecided. This skill is the periodic, deterministic surface for that signal — there is no\nper-edit nudge (that pattern decayed on an earlier per-edit `systemMessage` design and was\ndeliberately de-escalated to this silent-ledger-plus-periodic-audit shape).\n\n**Enforcement hierarchy this pipeline serves:** `hook > skill > charter > memory`. A rule\nthat keeps needing to be restated belongs promoted one level up; this skill is the\nmechanical check that promotion actually happens instead of staying a memory note forever.\n\n> Config-driven + fail-open: reads `.claude\u002Fframework.config.json` via `jq`. All classification\n> logic (`helpers.py`) is pure-function backed for byte-identical output — the plan for a given\n> ledger + artifact set never varies between runs.\n\n## Instructions\n\n### 0. Resolve config + paths\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull || pwd)\"\nCFG=\"$REPO_ROOT\u002F.claude\u002Fframework.config.json\"\nget() { jq -r \"$1 \u002F\u002F empty\" \"$CFG\" 2>\u002Fdev\u002Fnull; }   # fail-open dotted read\n\nLEDGER_REL=\"$(get '.paths.generic_prompt_ledger')\"; : \"${LEDGER_REL:=.claude\u002Fgeneric_prompt_ledger.json}\"\nLEDGER=\"$REPO_ROOT\u002F$LEDGER_REL\"\n\n# helpers.py: installed location first, framework-source checkout as fallback (mirrors\n# wave-retro's lib-path resolution).\nHELPERS=\"$REPO_ROOT\u002F.claude\u002Fskills\u002Fpromotion-audit\u002Fhelpers.py\"\n[ -f \"$HELPERS\" ] || HELPERS=\"$REPO_ROOT\u002Fframework\u002Fassets\u002Fskills\u002Fpromotion-audit\u002Fhelpers.py\"\n\n# The wave under audit: the argument, else the current\u002Flast wave from lifecycle state.\nLIB=\"$REPO_ROOT\u002F.claude\u002Flib\"; [ -f \"$LIB\u002Flifecycle.py\" ] || LIB=\"$REPO_ROOT\u002Fframework\u002Fassets\u002Flib\"\nWAVE=\"{args}\"; [ -n \"$WAVE\" ] || WAVE=\"$(python3 \"$LIB\u002Flifecycle.py\" state show | jq -r '.current_wave \u002F\u002F .last_completed_wave \u002F\u002F empty')\"\n```\n\n### 1. Read-only plan (always run this first)\n\n```bash\npython3 \"$HELPERS\" plan \"$WAVE\" --ledger \"$LEDGER\" --root \"$REPO_ROOT\"\n```\n\nEmits `{\"auto\": [...], \"decide\": [...], \"done\": [...]}` — the deterministic classification\nof every ledger candidate:\n\n- **`auto`** — the artifact's current content already carries BOTH halves of the charter's\n  Promotion Pipeline Marker Convention (`team\u002Fcharter\u002Fskills.md`): an\n  `\u003C!-- Promoted from memory... -->` comment AND a `**Promotion provenance:**` line. A human\n  already did the promotion; nothing here is a judgment call.\n- **`decide`** — pending, no markers found. Needs a human call.\n- **`done`** — already decided (`genericized` or `skip`) in a prior pass. No action.\n\nReview the plan. If `decide` is non-empty, skim each artifact briefly so the draft issues\nStep 2 files make sense — this skill never guesses which side of genericize\u002Fskip a `decide`\ncandidate falls on.\n\n### 2. Apply the plan\n\n```bash\npython3 \"$HELPERS\" run \"$WAVE\" --ledger \"$LEDGER\" --root \"$REPO_ROOT\" --label promotion-audit\n```\n\nThis **always**:\n\n- Mechanically flips every `auto`-tier ledger entry to `decision: genericized` (a local,\n  reversible write — never gated; there is no judgment call to make when the markers are\n  already present).\n- Writes the per-wave audit log to `paths.promotion_audit_log\u002Fwave_\u003Cid>.md` (default\n  `.claude\u002Fteam\u002Fpromotion_audit_log\u002Fwave_\u003Cid>.md`).\n\nBy **default it runs `--dry-run`**: `decide`-tier candidates get their draft-issue title\u002Fbody\nprinted but nothing is filed. Review the printed bodies, then re-run with `--apply` to\nactually file them:\n\n```bash\npython3 \"$HELPERS\" run \"$WAVE\" --ledger \"$LEDGER\" --root \"$REPO_ROOT\" --label promotion-audit --apply\n```\n\n### 3. Report\n\nSummarize to the user: counts per tier, the audit-log path written, and (if `--apply` ran)\nthe issue numbers filed for `decide`-tier candidates. An empty ledger (`{\"candidates\": {}}`)\nor a ledger with only `done` entries is a clean pass — say so plainly, do not manufacture\nfindings.\n\n### 4. Finalizing a `decide` candidate\n\nOnce a human makes the genericize\u002Fskip call for a filed issue:\n\n- **Genericize:** port the artifact into `framework\u002Fassets\u002F**`, add the marker convention to\n  the LIVE project-local copy (see `team\u002Fcharter\u002Fskills.md`), then\n  `python3 \"$LIB\u002Fgeneric_prompt_tracker.py\" record \u003Cartifact> --decision genericized --wave $WAVE --ledger \"$LEDGER\"`.\n- **Skip:** `python3 \"$LIB\u002Fgeneric_prompt_tracker.py\" record \u003Cartifact> --decision skip --detail \"\u003Cwhy>\" --wave $WAVE --ledger \"$LEDGER\"`.\n\nEither way, close the draft issue referencing the ledger update.\n",{"args":36,"name":5,"description":7},"Wave id (defaults to the current\u002Flast wave)","main","53ec1032b93d41533a48603e8fae7a92f56cc66c","framework\u002Fassets\u002Fskills\u002Fpromotion-audit","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework","https:\u002F\u002Fgithub.com\u002Fparametrization","2026-09-21 01:06:30",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add parametrization\u002F2real-team-framework --skill promotion-audit",{"tool":49,"command":50},"bunx","bunx skills add parametrization\u002F2real-team-framework --skill promotion-audit",{"tool":52,"command":53},"pnpm","pnpm dlx skills add parametrization\u002F2real-team-framework --skill promotion-audit","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fframework\u002Fassets\u002Fskills\u002Fpromotion-audit\u002FSKILL.md",true,[57,63],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"anti-patterns.md","REFERENCE","参考文档",4294,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fplaywright-pro\u002Fskills\u002Freview\u002Fanti-patterns.md",{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"helpers.py","SCRIPT","脚本",16508,"https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fframework\u002Fassets\u002Fskills\u002Fpromotion-audit\u002Fhelpers.py",[70,92,109,124,138,151],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":31},"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",[],[77,78,79,80,81,82,83,84,85,86,87,88,89,90,91],"wave wrapup","wrapup","review","handoff","merge","pr review","pr","cleanup","worktree","retro","team","issue","worktree cleanup","name","sequencing",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":31},"01M6E5V9GDF75GV4YD2WPSH912","wave-start","Initialize a new wave — worktree cleanup, branch creation, label setup, status file update","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-start\u002FSKILL.md",[],[99,100,101,84,102,85,103,87,104,105,106,89,107,90,108],"wave start","start","setup","update","file","branch","file update","initialize","creation","status",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":31},"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",[],[116,117,20,118,119,86,120,121,122,88,123],"wave scope","scope","collect","Meta","refresh","reconcile","Fold","kickoff",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":31},"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",[],[131,86,24,132,83,133,134,87,135,136,137,90],"wave retro","change","retrospective","analysis","feedback","proposals","trust",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":31},"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",[],[145,123,146,88,107,90,147,87,148,104,149,150],"wave kickoff","management","plan","execution","planning","execution plan",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":31},"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",[],[18,30,158,159,160,21],"close","find","open"]