[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BZFCM31QYASHF2XF6G105C":3,"skill-same:01M6BZFCM31QYASHF2XF6G105C":83},{"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":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":45,"ownerHtmlUrl":46,"ownerBlogUrl":47,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M6BZFCM31QYASHF2XF6G105C","triage",null,"Use when asked to triage issues — classifies untriaged issues with codex, validates the labels, and returns proposed labels plus an activity digest. Read-only; runs in a forked context.","clice-io\u002Fclice","clice-io","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F176553789?v=4","01M6BZEJH3SKDZ3SMSS1V6CKKB","clice","01M6BZEJN97S3AQVRQ4V7GGE5C",1380,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftriage\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"when","codex","labels","fork","read-only","with","activity","digest","only","use","context","read","activity digest","returns","issues","triage issues","2026-11-10 10:12:30",false,"---\nname: triage\ndescription: Use when asked to triage issues — classifies untriaged issues with codex, validates the labels, and returns proposed labels plus an activity digest. Read-only; runs in a forked context.\ncontext: fork\n---\n\nTriage one batch of untriaged issues: issues without the `triaged` marker,\nwhich apply stamps on every processed issue (title patterns and kind labels\nprove nothing — reporters set both). The issue templates add `needs-triage`\nas a visible awaiting signal; apply removes it. The state lives in the\nlabels, so there is no bookkeeping file.\n\nThe classification needs codex logged in with quota (`codex login status`).\nWithout it, stop and say so: issue bodies are untrusted input, so the\nclassification never moves to an unsandboxed agent.\n\n## 1. Snapshot\n\n```bash\npython3 .claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fsnapshot.py\n```\n\nFetches every open untriaged issue (body + comments) into\n`\u002Ftmp\u002Fclice-triage\u002Fissues\u002Fchunk-N\u002F` (25 per chunk), plus `digest.json`\n(new issues in the last 7 days, `needs-info`\u002F`needs-repro` threads with no\nactivity for over 14 days), `existing-labels.json`, `titles.json` and\n`states.json` (what apply checks for drift). `--state all` sweeps closed\nissues too, paired with apply's `--include-closed`, for a backfill. With\nzero untriaged issues, skip straight to the digest section of the report.\n\n## 2. Classify\n\nOne codex call per chunk; run chunks as parallel background jobs:\n\n```bash\ncodex_root=\"$(cd \"$(dirname \"$(command -v codex)\")\u002F..\" && pwd)\"\nsystemd-run --user --pipe --wait --collect --same-dir \\\n  --setenv=PATH=\"$codex_root\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\" \\\n  -p ProtectHome=tmpfs \\\n  -p BindReadOnlyPaths=\"$PWD\" \\\n  -p BindReadOnlyPaths=\"$codex_root\" \\\n  -p BindPaths=\"$HOME\u002F.codex\" \\\n  codex exec -m gpt-6-astra -c model_reasoning_effort=xhigh \\\n  --sandbox read-only \\\n  -o \u002Ftmp\u002Fclice-triage\u002Fverdicts-N.md \\\n  \"Read .claude\u002Fskills\u002Ftriage\u002Frules.md, .github\u002Flabels.yml, and every\nissue file in \u002Ftmp\u002Fclice-triage\u002Fissues\u002Fchunk-N\u002F. Work ONLY from these\nlocal files — no gh, no network. Classify every issue per the rules and\nreply with ONLY the JSON array defined by the rules' output schema.\" \u003C \u002Fdev\u002Fnull\n```\n\nBoth sandbox layers are mandatory, never the usual full bypass. Codex's\n`--sandbox read-only` blocks writes and command network access but still\nlets model-run commands read the whole filesystem, so an injected issue\ncould exfiltrate credentials through the verdict text. The `systemd-run`\nwrapper masks `$HOME` and rebinds only the repo (read-only), the codex\ninstall prefix, and `~\u002F.codex` (codex's own state — the one residual\nexposure).\n\n## 3. Validate\n\n```bash\npython3 .claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fvalidate.py \u002Ftmp\u002Fclice-triage\u002Fverdicts-*.md\n```\n\nA deterministic gate over the model output: every label exists in\n`.github\u002Flabels.yml`, exactly one `kind:`, no `good first issue` or\n`help wanted`, no `os:wsl` beside a native os label, every snapshot issue\ncovered. It writes `\u002Ftmp\u002Fclice-triage\u002Fvalidated.json` with `add` (proposed\nminus existing labels) and `suggest_remove` (existing labels the model\nomitted — reported, never removed). A verdict that fails validation is\nreported, never applied, and never hand-edited back in.\n\n## 4. Report\n\nReturn to the main conversation:\n\n- Proposed changes, one line per issue: `#N [conf] +labels — rationale`,\n  with `title →` \u002F `ask →` sub-lines where the model proposed them.\n- Validation failures and taxonomy gaps.\n- Digest: new issues this week, stale waiting threads (with day counts),\n  open\u002Funtriaged totals.\n\nDo NOT apply anything in the forked run — the maintainer reviews the\nproposals first.\n\n## 5. Apply (main conversation, after approval)\n\n```bash\npython3 .claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fapply.py \u002Ftmp\u002Fclice-triage\u002Fvalidated.json \\\n  [--only N,N | --skip N,N] [--retitle N,N | --retitle all] [--include-closed]\n```\n\napply refetches each issue's live labels and title. It skips an issue\nwhose state changed since the snapshot, that gained `triaged` meanwhile,\na closed one without `--include-closed`, and one that needs manual\nresolution (several maintainer kinds, `os:wsl` beside a native os label).\nWhile `needs-triage` is present the model's kind replaces the template's;\nonce it is gone the existing kind is the maintainer's, and when the model\nproposes another kind, the maintainer's wins and the model's kind,\n`status:` labels and title are dropped. A closed issue loses\nevery `status:` label. Beyond that apply only adds labels — removals stay\nmanual via `suggest_remove` — and stamps `triaged` in a separate final\ncall, so a failed edit leaves the issue visible to the next snapshot.\nTitles change only for the issues `--retitle` names whose title did not\nchange since the snapshot. `ask_reporter` suggestions are never posted —\nthe maintainer sends them personally if worthwhile.\n","Triage one batch of untriaged issues: issues without the `triaged` marker,\nwhich apply stamps on every processed issue (title patterns and kind labels\nprove nothing — reporters set both). The issue templates add `needs-triage`\nas a visible awaiting signal; apply removes it. The state lives in the\nlabels, so there is no bookkeeping file.\n\nThe classification needs codex logged in with quota (`codex login status`).\nWithout it, stop and say so: issue bodies are untrusted input, so the\nclassification never moves to an unsandboxed agent.\n\n## 1. Snapshot\n\n```bash\npython3 .claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fsnapshot.py\n```\n\nFetches every open untriaged issue (body + comments) into\n`\u002Ftmp\u002Fclice-triage\u002Fissues\u002Fchunk-N\u002F` (25 per chunk), plus `digest.json`\n(new issues in the last 7 days, `needs-info`\u002F`needs-repro` threads with no\nactivity for over 14 days), `existing-labels.json`, `titles.json` and\n`states.json` (what apply checks for drift). `--state all` sweeps closed\nissues too, paired with apply's `--include-closed`, for a backfill. With\nzero untriaged issues, skip straight to the digest section of the report.\n\n## 2. Classify\n\nOne codex call per chunk; run chunks as parallel background jobs:\n\n```bash\ncodex_root=\"$(cd \"$(dirname \"$(command -v codex)\")\u002F..\" && pwd)\"\nsystemd-run --user --pipe --wait --collect --same-dir \\\n  --setenv=PATH=\"$codex_root\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\" \\\n  -p ProtectHome=tmpfs \\\n  -p BindReadOnlyPaths=\"$PWD\" \\\n  -p BindReadOnlyPaths=\"$codex_root\" \\\n  -p BindPaths=\"$HOME\u002F.codex\" \\\n  codex exec -m gpt-6-astra -c model_reasoning_effort=xhigh \\\n  --sandbox read-only \\\n  -o \u002Ftmp\u002Fclice-triage\u002Fverdicts-N.md \\\n  \"Read .claude\u002Fskills\u002Ftriage\u002Frules.md, .github\u002Flabels.yml, and every\nissue file in \u002Ftmp\u002Fclice-triage\u002Fissues\u002Fchunk-N\u002F. Work ONLY from these\nlocal files — no gh, no network. Classify every issue per the rules and\nreply with ONLY the JSON array defined by the rules' output schema.\" \u003C \u002Fdev\u002Fnull\n```\n\nBoth sandbox layers are mandatory, never the usual full bypass. Codex's\n`--sandbox read-only` blocks writes and command network access but still\nlets model-run commands read the whole filesystem, so an injected issue\ncould exfiltrate credentials through the verdict text. The `systemd-run`\nwrapper masks `$HOME` and rebinds only the repo (read-only), the codex\ninstall prefix, and `~\u002F.codex` (codex's own state — the one residual\nexposure).\n\n## 3. Validate\n\n```bash\npython3 .claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fvalidate.py \u002Ftmp\u002Fclice-triage\u002Fverdicts-*.md\n```\n\nA deterministic gate over the model output: every label exists in\n`.github\u002Flabels.yml`, exactly one `kind:`, no `good first issue` or\n`help wanted`, no `os:wsl` beside a native os label, every snapshot issue\ncovered. It writes `\u002Ftmp\u002Fclice-triage\u002Fvalidated.json` with `add` (proposed\nminus existing labels) and `suggest_remove` (existing labels the model\nomitted — reported, never removed). A verdict that fails validation is\nreported, never applied, and never hand-edited back in.\n\n## 4. Report\n\nReturn to the main conversation:\n\n- Proposed changes, one line per issue: `#N [conf] +labels — rationale`,\n  with `title →` \u002F `ask →` sub-lines where the model proposed them.\n- Validation failures and taxonomy gaps.\n- Digest: new issues this week, stale waiting threads (with day counts),\n  open\u002Funtriaged totals.\n\nDo NOT apply anything in the forked run — the maintainer reviews the\nproposals first.\n\n## 5. Apply (main conversation, after approval)\n\n```bash\npython3 .claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fapply.py \u002Ftmp\u002Fclice-triage\u002Fvalidated.json \\\n  [--only N,N | --skip N,N] [--retitle N,N | --retitle all] [--include-closed]\n```\n\napply refetches each issue's live labels and title. It skips an issue\nwhose state changed since the snapshot, that gained `triaged` meanwhile,\na closed one without `--include-closed`, and one that needs manual\nresolution (several maintainer kinds, `os:wsl` beside a native os label).\nWhile `needs-triage` is present the model's kind replaces the template's;\nonce it is gone the existing kind is the maintainer's, and when the model\nproposes another kind, the maintainer's wins and the model's kind,\n`status:` labels and title are dropped. A closed issue loses\nevery `status:` label. Beyond that apply only adds labels — removals stay\nmanual via `suggest_remove` — and stamps `triaged` in a separate final\ncall, so a failed edit leaves the issue visible to the next snapshot.\nTitles change only for the issues `--retitle` names whose title did not\nchange since the snapshot. `ask_reporter` suggestions are never posted —\nthe maintainer sends them personally if worthwhile.\n",{"name":5,"context":22,"description":7},"main","ff37a8a321b684fde2cf6b228bb7ed735f85f30d",".claude\u002Fskills\u002Ftriage",89,"https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice","https:\u002F\u002Fdocs.clice.io\u002Fclice\u002F","https:\u002F\u002Fgithub.com\u002Fclice-io","https:\u002F\u002Fclice.io\u002F","2026-11-12 03:28:11",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add clice-io\u002Fclice --skill triage",{"tool":55,"command":56},"bunx","bunx skills add clice-io\u002Fclice --skill triage",{"tool":58,"command":59},"pnpm","pnpm dlx skills add clice-io\u002Fclice --skill triage","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftriage\u002FSKILL.md",true,[63,69,75,79],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"rules.md","REFERENCE","参考文档",5905,"https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftriage\u002Frules.md",{"path":70,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":73,"sourceHtmlUrl":74},"scripts\u002Fapply.py","SCRIPT","脚本",6072,"https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fapply.py",{"path":76,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Fsnapshot.py",5670,"https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fsnapshot.py",{"path":80,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Fvalidate.py",5054,"https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftriage\u002Fscripts\u002Fvalidate.py",[84,112,132,151,173,192],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":100,"publishedAt":35},"01M6BZFHCK196E4Z66DGN9QDYJ","write-tests","Read before writing or modifying anything under tests\u002F or unittests\u002F, or the tools' own tests — the case workflow, unit tests, hard rules and known pitfalls.","https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwrite-tests\u002FSKILL.md",[90,95],{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[101,102,103,104,30,105,106,107,108,109,110,111],"write tests","tests","write","pitfalls","case","unit","unit tests","Tools","workflow","Rules","writing",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":35},"01M6BZFEQ2NCYCKQX0RTMQM55A","upgrade-llvm","Read before upgrading xclang\u002FLLVM (arg = the xclang version, e.g. 23.1.2.1), touching MODULE.bazel, .bazelrc, BUILD.bazel or bazel\u002F, or regenerating modules\u002F — after a library bump, or when clice needs a header or macro it does not export.","https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fupgrade-llvm\u002FSKILL.md",[],[119,120,121,122,123,124,125,126,127,30,128,129,19,130,131],"llvm","upgrade","upgrade llvm","modules","library","macro","it","bazel","export","build","version","module","bump",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":35},"01M6BZFAW6TTR0FK91HZ0TVNFS","translate-docs","Read before translating, reviewing or editing any docs\u002Fzh page — clice's glossary and page conventions, on top of the shared translation rules of clice-io\u002Fdocs.","https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftranslate-docs\u002FSKILL.md",[],[139,140,141,142,143,144,30,145,146,147,148,149,150,110],"translate","docs","translate docs","shared","translation","top","glossary","zh","conventions","io","editing","page",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":160,"publishedAt":35},"01M6BZF86F54V9BZCW3MJW82VY","test","Run the clice test suites, on a box unless a local run is truly necessary; also how to test on Windows. Optional args = suite (unit | cases | all, default all) build type (Debug | RelWithDebInfo, default RelWithDebInfo) and the box id the build ran on. Runs in a forked context; only a digest returns.","https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest\u002FSKILL.md",[157],{"categoryNo":158,"categoryName":159,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000008","测试与质量",[153,29,161,162,26,128,22,163,164,27,165,166,167,106,32,168,169,170,171,172],"default","suite","id","type","how to","local","local run","run","how","debug","box","windows",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":35},"01M6BZF5WRJ6PKYJVW4YKPYD20","resolve-comments","Use in each watch round of an open PR — pulls its unresolved review threads, fixes them in the worktree, resolves them, and returns a compact summary.","https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fresolve-comments\u002FSKILL.md",[],[180,181,182,28,183,184,185,32,186,187,188,189,190,191],"comments","resolve comments","open","summary","fixes","threads","review","open pr","worktree","pr","compact","watch",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":198,"publishedAt":35},"01M6BZF3RPE8A4Z9KMJJBJPCPD","release","Read before any release work — instant builds, nightlies, stable tags, publishing, release workflows — or symbolizing a user's crash log.","https:\u002F\u002Fgithub.com\u002Fclice-io\u002Fclice\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frelease\u002FSKILL.md",[],[194,199,200,201,202,203,30,204,205,206],"log","user","crash","tags","publishing","workflows","instant","work"]