[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C22A7FFBYQYV6XMKZ71AGE":3,"skill-same:01M6C22A7FFBYQYV6XMKZ71AGE":64},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6C22A7FFBYQYV6XMKZ71AGE","disk-root-cause",null,"Use when a user asks why a disk is filling, what grew, or how much can be reclaimed. Reclaimable-amount estimates require leaf-level attribution; plain capacity checks use disk-audit.","jleechanorg\u002Fjleechan-skills","jleechanorg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F221404966?v=4","01M6C1VJ99XG950X1DWPEBCBGX","01M6C1VJDK5YVDNT3362RT5WSB",6,"MIT","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fdisk-root-cause\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"disk","disk root cause","root cause","root","when","simple","check","can","for","ZeRO","capacity check","du","audit","question","time","quick","attribution","capacity","use","why","2026-11-10 10:12:30",false,"---\nname: disk-root-cause\ndescription: Use when a user asks why a disk is filling, what grew, or how much can be reclaimed. Reclaimable-amount estimates require leaf-level attribution; plain capacity checks use disk-audit.\n---\n\n# disk-root-cause — forensic attribution skill\n\nWhen a user asks **why the disk filled up**, **what grew over a window**, or **where a specific bucket came from**, this skill is the entry point. A plain capacity check routes to the zero-`du` triage in `..\u002Fdisk-audit\u002FSKILL.md`. For disk attribution and reclaim estimates, use the state repository reported by `diskm state status` and prefer parallel fan-out when resources permit.\n\n## Mandatory 100 MiB directory descent\n\nEvery measurement, inventory, report, age decision, and reclaim-candidate scan must resolve directories to individual files and directories smaller than 104857600 bytes (100 MiB). A directory at exactly 100 MiB must be descended into. Files are terminal items at any size; name and size every file at or above 100 MiB. Never treat a fixed class name, depth, Git marker, protected status, or configuration ceiling as a successful measurement stop.\n\nContinue read-only metadata measurement inside Git worktrees, source trees, sessions, and other protected paths. Measurement does not authorize deletion, content reads, or changes: preserve existing owner, lease, cwd, open-file, dirty\u002Funpushed, secret, and retention gates. Never follow a symlink; measure it as a link leaf. Preserve inode and hardlink deduplication.\n\nA real permission, identity, enumeration, or deadline failure is unfinished work. Name the blocked path and reason, preserve its resume point, and exclude its parent and subtree from complete totals, floors, age decisions, and reclaim estimates. Report aggregate directory sizes as navigation hints only; they do not replace leaf itemization or prove reclaimability.\n\n## Default first-use workflow\n\nStart with the ground-truth probes defined in `..\u002Fdisk-audit\u002FSKILL.md`, including the fleet check, existing per-host ledger, and 7-day growth history. Read those results before drilling down.\n\nFor root-cause, floor, growth, or reclaim-estimate requests, run the full `diskm audit` after these probes unless an existing current report already proves complete 100 MiB leaf coverage for every requested path and period. Directory-aggregate snapshots cannot prove that coverage. A quick capacity-only request may stop after the triage if its answer is sufficient.\n\nThe audit is the three-lane diagnostic. Its top-down accounting must resolve requested Data paths into file leaves and directories below 100 MiB. This instruction defines the required result; it does not change the scanner. Check the emitted report's actual resolution and unfinished paths. Until the installed runtime produces complete leaf itemization, treat coarse or unfinished paths as incomplete and any reclaim estimate that depends on them as unknown. The audit launches in parallel:\n\n1. top-down whole-disk accounting from physical\u002FAPFS capacity through the Data volume to individual files and directories smaller than 100 MiB;\n2. coverage-validated snapshot deltas, so a coverage change cannot masquerade as physical growth; and\n3. safe quick wins and obvious outliers, with cleanup commands still behind repository safety gates.\n\nRead the whole report before drilling down. Keep permission\u002FTCC denial, time budget, node budget, cross-device boundaries, APFS sibling allocations, purgeable estimates, and residual bytes as separate fields. The residual is an attribution gap: it is **not backup size and not reclaimable without evidence**.\n\nThe 900-second wall-clock cap is the infinite-process guard; live whole-volume runs on this host vary from about 6.5 minutes to more than 8 minutes under I\u002FO load, so 480 seconds was empirically insufficient. Separately, the 100,000,000-record ceiling is a deliberately remote post-scan parser\u002Fledger sanity guard (or a visited-path guard in the legacy fallback), not a normal coverage budget. GNU `du` stdout is spooled to a temporary file rather than retained in memory before that validation. The human-readable report must show the backend, records\u002Fpaths processed, and this ceiling.\n\nThe displayed Data equation must use one accepted leaf ledger: measured file leaves + measured directory leaves below 100 MiB + measured tail + purgeable estimate + unresolved residual = Data used. Report APFS container-free space and sibling-volume allocations in a separate container-level reconciliation so they are not mistaken for Data leaves or counted twice. A directory total, synthetic direct-allocation segment, or arbitrary size bucket is not a resolved leaf. Measure every file leaf and descend every directory at or above 100 MiB; name files at or above 100 MiB individually. Smaller file leaves may be compactly displayed as lossless count-and-size totals only after each file was measured and inode deduplication applied. Permission, identity, time, node, enumeration, or unscanned cross-device children stay on the named unfinished frontier and inside residual. Never reuse an earlier parent observation. A hidden measured-total equation does not validate the displayed leaves. Capture Data used before and after the namespace walk; when it changes, report the residual interval and mark the measurement non-atomic.\n\nThe top-down scanner prefers one NUL-delimited, multi-root GNU `gdu` inventory process. Never sum independent per-shard `du` processes: hardlink deduplication is process-local. The one pass must traverse all measurable directories to the 100 MiB stop floor and preserve hardlink\u002Finode deduplication. Do not replace file rows with synthetic direct-allocation chunks. Localized permission\u002FTCC errors taint their subtree and every ancestor; unreadable or unfinished subtrees remain explicitly incomplete. Unknown diagnostics, malformed output, or timeout fail closed to the bounded frontier fallback (`gdu`, then `dua`, then macOS `du`) and preserve the resume point. Fast backends must not be wrapped in `taskpolicy -b`, which can starve them under host I\u002FO pressure. Symlink leaves never pull their targets into the ledger.\n\n**Pair with** `disk-magician` skill (measurement + safe cleanup) and the `CLAUDE.md` \u002F `AGENTS.md` in this repo (cross-repo authorization + never-delete list).\n\n## When to use\n\nTrigger when the user asks any of:\n- \"Why is my disk filling up\"\n- \"What grew over the last day\u002Fweek\u002Fmonth\"\n- \"Find the minimum disk used in the last month\" (floor)\n- \"Root cause the disk growth\"\n- \"Show me the delta between then and now\"\n- \"Which bucket is worth reclaiming, and why\" or \"how much can I free\" — both require full leaf-level attribution. A quick available-space question with no reclaim estimate goes to `..\u002Fdisk-audit\u002FSKILL.md`. This skill reports findings and typed recommendations; cleanup commands are separate.\n\nFor a one-file size query, report that file's size directly. A directory below 100 MiB may be reported as one measured unit; for any directory at or above 100 MiB, descend into files and smaller directories before reporting age, attribution, or reclaimability.\n\n## Hard rules (skill-wide)\n\n1. **Action scope and cleanup gates:** Perform cleanup only when the live request or standing authorization covers the same action, targets, and result. Authorization persists across the steps needed to complete that task; do not ask again for those steps. Route each deletion through its canonical `diskm` command and satisfy its current target-specific gates. Ask before adding new actions or targets not already covered; never use `rm -rf` directly.\n2. **Never-delete list** (hard stop for removal by every route): `~\u002F.codex\u002Fsessions*`, `~\u002F.codex\u002Fstate*.sqlite`, `~\u002F.codex\u002Flog`, and `~\u002F.claude\u002Fprojects`. Continue read-only metadata descent through directories at or above 100 MiB; never delete, alter, or read protected file contents.\n3. **Symlink gotcha — always realpath-verify:** agent-home aliases (for example backup or prod copies of `${HERMES_HOME:-$HOME\u002F.hermes}`) are often symlinks to the live home; `\u002Ftmp`, `\u002Fvar`, `\u002Fetc` are volume-root symlinks to `\u002Fprivate\u002F*`. Naive `du` over args triples-counts them. Use `du -P` (no-follow) and dedup by realpath when comparing totals.\n4. **No VACATE-without-name.** When a user says \"vacate \u002F pause \u002F stop the CI runners\", verify the runners' actual supervisor first — self-hosted GitHub Actions runners are often plain **processes** under their install directory, not a service job. Stopping the wrong thing (e.g. an unrelated service) is harmless but accomplishes nothing; stopping the GH Actions runners pauses live CI. Always inspect the service list (`launchctl list` on macOS, `systemctl --user list-units` on Linux) and `ps aux | grep \u003Chint>` before any destructive action, and report the candidate names back to the user verbatim.\n5. **Read-first, deduce-later.** Do not assert \"X grew 5 GB\" from one `du`; cross-check against snapshot history (a committed git repo on disk) and the live `df -k` output. If two sources disagree, attribute honestly.\n6. **Stay within authorized scope.** Do not use an auto-remediator outside the canonical `diskm` commands. Continue cleanup that the current request authorizes and that the canonical per-target gates permit; ask only before a new action or target the request does not cover.\n7. **Honest attribution in final report.** If disk improved mid-analysis for reasons outside this session (concurrent sweepers, OS reclaims), say so explicitly. Never claim a delta whose source you didn't observe.\n\n## Phase 0 — environment ground truth (always run)\n\n```bash\n# Resolve the snapshot from the machine-specific state repository reported by the CLI.\ndf -h\nSTATE_REPO=\"$(diskm state status | sed -n 's\u002F^\\[state_repo\\] state repo: \u002F\u002Fp')\"\nif [[ -z \"$STATE_REPO\" || ! -d \"$STATE_REPO\" ]]; then\n  echo \"state repo unavailable; snapshot history is incomplete\" >&2\n  exit 1\nfi\nSNAP=\"$STATE_REPO\u002Fsnapshots\u002Fdisk_snapshot.json\"\ngit -C \"$STATE_REPO\" log --oneline -1 -- 'backup\u002F*\u002Fdisk_snapshot.json' snapshots\u002Fdisk_snapshot.json 2>\u002Fdev\u002Fnull\nif [[ -r \"$SNAP\" ]]; then\n  python3 -c 'import json,sys; from pathlib import Path; d=json.loads(Path(sys.argv[1]).read_text()); print(\"schema_version:\", d.get(\"schema_version\"), \"coverage:\", d.get(\"snapshot_coverage_pct\"))' \"$SNAP\"\nelse\n  echo \"snapshot unavailable at resolved state-repo path: $SNAP\" >&2\nfi\n```\n\nIf `schema_version != 2`, the snapshot is pre-v2 (coverage inflates by parent\u002Fchild double-count). Use `coverage_pct_raw_v1` from `snapshot_metadata` for trend continuity and note the inflation.\n\n## Phase 1 — floor + deltas (snapshot history)\n\nThe Git root for current state is the repository reported by `diskm state status`. Use resolver-backed history commands for archived samples; do not assume frozen `backup\u002F\u003Chost>\u002Fdisk_snapshot.json` files live under the current state repo. A frozen archive may contribute only a historical sample whose embedded capture time is in the requested window and whose coverage is at least 70%. Never use an archived file as the current snapshot or count duplicate captures twice.\n\nThree deltas, always reported:\n\n| Window | Find | Compare to |\n|---|---|---|\n| **Last week** (7 d) | Minimum `disk_used_gb` in window from snapshots with `snapshot_coverage_pct >= 70%` | live `df -k` |\n| **Last month** (30 d) | Minimum `disk_used_gb` in window from snapshots with `snapshot_coverage_pct >= 70%` | live `df -k` |\n| **All time floor** | Minimum covered `disk_used_gb` over reachable + reflog-recovered commits | live `df -k` |\n\nPull both `disk_used_gb` (denominator, in GiB — verified to use `1024*1024` divisor in `disk_snapshot.sh:200-201`) and `disk_free_gb`. Compute:\n\n```\ndelta_used = used_now − used_min\ndelta_free = free_min − free_now\n```\n\nPer-directory snapshot deltas locate growers but remain directory aggregates. They do not establish file-level age, full attribution, or reclaimability. For a current attribution or reclaim estimate, descend every directory at or above 100 MiB to file and small-directory leaves. For null keys under disk pressure (the `timeout_keys` field), continue bounded itemization or report the exact unfinished key; a live `du -sk` parent total is not a substitute.\n\n**Coverage gate:** exclude snapshots with missing, null, or `snapshot_coverage_pct \u003C 70%` from floor selection and exact per-directory delta comparisons; keep them as low-coverage context only. The `topdown_coverage` field embeds the frontier scanner's `~\u002F.disk_magician_state\u002Ffrontier_last.json` summary if \u003C36h old; use `frontier_unfinished_count` and `residual_kb` to name unmeasured tails. If no qualifying snapshot remains, report the snapshot floor unavailable and use the df-only daily `host_disk.used_kb` history in the configured disk observer log and its rotations. Report observed days and earliest\u002Flatest dates; do not infer all-time floors or per-path deltas from that fallback.\n\n## Phase 2 — parallel-subagent fan-out (when scope demands it)\n\nFor a point size query on an individual file, report that file's size. A parent `du` total locates a directory; it never replaces descent at or above 100 MiB. When the attribution crosses the boundary into \"find everything growing in category X\", fan out via \u002Fswarm:\n\n| Lane | Fan-out scope | Sample prompt shape |\n|---|---|---|\n| **lane-audit** | Reclaim-candidate inventory across dev caches, worktrees, AO sessions, \u002Ftmp, and Library caches | \"Descend each directory at or above 100 MiB; measure file-level size\u002Factivity. Use cleanup previews and preserve their delete gates. Report unfinished paths and skip reasons.\" |\n| **lane-history** | Snapshot-history growth attribution | \"From the state repository reported by `diskm state status`, identify directory aggregates that grew between \u003Cfloor-sha> and HEAD; treat these as navigation hints and itemize any current directory at or above 100 MiB before attributing or estimating reclaim. Cite commit SHAs.\" |\n| **lane-tmp** | \u002Fprivate\u002Ftmp live holders vs orphan candidates | \"Use directory sizes to locate candidates; descend each directory at or above 100 MiB to files and smaller directories. List each terminal item's size, age, open-handle\u002Fcwd owner, and cleanup gate.\" |\n| **lane-colima** | Colima sparse-disk inflation + recovery sequence | \"Measure the VM image file and its allocation; do not treat the enclosing ~\u002F.colima directory total as itemized. Run the authorized fstrim sequence and measure its result. NEVER docker prune -af.\" |\n| **lane-frontier** | Configure `disk_frontier_scan.py --granularity-gib 0.09765625 --output-default` after the scanner passes the inclusive-boundary and file-leaf checks | Do not claim complete leaves from this flag alone; verify that equality descends and that no synthetic chunks or skipped children remain. Record unfinished paths. |\n| **lane-critic** | Adversarial reality-check on top claims | \"Try to refute each finding by recomputing from raw data. Cite file:line.\" |\n\nFan-out rule: **single-writer per file**, `grep -n \"agent(\" \u003Cswarm-script>` cost-routed (haiku for mechanical, sonnet for analysis), staggered starts (`\u002Fswarm`, \"Long runs\"), explicit `--model:` on every call. Adversarial verify ≥3 lenses before any actionable claim.\n\n## Phase 3 — readout format (always)\n\n```text\n⚠ Limits: coverage \u003C X% \u002F timeouts \u002F pinned-subtrees HELD\n↘ FLOOR (last month): used=YGB \u002F free=YGB @ \u003Ciso> (commit \u003Csha>)\n↘ FLOOR (last week):  used=YGB \u002F free=YGB @ \u003Ciso> (commit \u003Csha>)\n↘ NOW (live df):      used=YGB \u002F free=YGB (GiB, GiB; units confirmed)\n↘ DELTA (30 d):       used_now − used_min = ±Y GB;    free_min − free_now = ±Y GB\n↘ Per-bucket attribution (non-overlapping sums of measured file\u002Fsmall-directory leaves; directory aggregates are navigation hints only):\n  - colima: +X (sum of measured leaves; sawtooth Y; what range over time)\n  - \u002Ftmp: +X (sum of measured leaves)\n  - AO sessions: +X (sum of measured leaves; post-.bak-drop, mostly live)\n  - ~\u002Fprojects: +X (sum of measured leaves)\n  - residual (unaccounted): X (frontalier scanner names these within 36h of first nightly run)\n↘ Safe-cleanup recommendations (require explicit OK):\n  - run A: cleanup_tmp.sh --clean (~X GB, low risk)\n  - run B: VACATE_CI_RUNNERS_APPROVED — needs user to confirm GitHub Actions runner target\n  - run C: ...\n↘ Evidence \u002F proofs (commit SHAs, snapshot JSON keys, df outputs, du numbers)\n```\n\n## Cleanup-command catalogue (read-only — never auto-runs)\n\n| Cmd | Use | Requires |\n|---|---|---|\n| `.\u002Fscripts\u002Fcleanup_tmp.sh --clean` | >240min \u002Ftmp + agent scratch | Nothing (script dry-runs when defaults don't apply) |\n| `.\u002Fscripts\u002Fcleanup_dev_caches.sh --clean` (via `disk_audit.sh --clean`) | uv\u002Fpre-commit\u002Fcursor-agent\u002Fclaude-cli caches | DISK_MAGICIAN_AUTO_CLEAN=1 |\n| `user_scope\u002Fscripts\u002Fcleanup-ao-sessions.sh --drop-bak --days N` | .bak chains (post-6poe fix) | N chosen by caller |\n| `.\u002Fscripts\u002Fcleanup_colima.sh --clean` | Docker prune + fstrim (compresses host sparse disk) | Nothing (preserves running containers via docker prune semantics) |\n| `.\u002Fscripts\u002Fcleanup_worktrees.sh --clean` | Antigravity worktree GC | pre-WORKTREE-APPROVED if plan targets stale |\n| `.\u002Fscripts\u002Fcleanup_apfs_snapshots.sh --clean` | OS update snapshots >24h old | sudo (script silently fails without) |\n| `cleanup-ao-sessions.sh --days 0` | Force ALL AO backups drop (aggressive) | User OK |\n| `tmutil thinlocalsnapshots` | APFS local TM snapshots reclaim | sudo + user OK (impacts Time Machine reversibility) |\n\n## Known traps (read this before answering)\n\n1. **Snapshot coverage collapses under disk pressure** — directories can be `null` or unfinished after a timeout. A live parent `du -sk` total only locates the path; it does not restore file-leaf coverage. Continue itemization within the available budget or report the exact unfinished paths.\n2. **`discover` times out at 120s with zero output** — do not treat parent sizes as a completed inventory; use the bounded frontier and preserve every unfinished path.\n3. **`cleanup_tmp.sh` defaults to DRY-RUN despite header claiming otherwise** — header was fixed in v0.2.0 (commit `5341a6f`); callers still must pass `--clean`.\n4. **Colima wedges with I\u002FO errors when host disk hits 100%** — fstrim can't run; **must** `colima stop && colima start` first. 49.6→6.8 GB recovery verified live.\n5. **Confirm the runner supervisor** — `launchctl list | grep -i runner` (macOS) or `systemctl --user list-units | grep -i runner` (Linux), plus `ps aux | grep -i runner`, before any VACATE-style directive.\n6. **Legacy snapshot path:** `backup\u002F\u003Chost>\u002Fdisk_snapshot.json` is frozen historical data, not a current measurement. Consider it only as an in-window historical sample with a valid embedded capture timestamp and coverage of at least 70%. Current measurement uses `snapshots\u002Fdisk_snapshot.json`; `diskm state status` identifies the per-host state repository.\n\n## Anti-patterns to flag in code review\n\n- Re-implementing du\u002Fdedup in shell when `disk_snapshot.sh` already dedups with a realpath containment trie (schema v2). Live measure if a one-off is needed.\n- Source-level `grep` for keys with substrings (e.g. `assert 'measured' not in json.dumps(td)` false-fail when the wanted key is `measured_total_kb`). Test contract: assert on dict keys, not substring matching.\n- Heredoc stdin race: `python3 - \u003C\u003C'PY' … | something` — the heredoc wins the fd, so the pipe isn't read. Write to a temp file and pass it as argv.\n- Symlink dedup at parent (`\u002Fvar → \u002Fprivate\u002Fvar`) for paths given to `du`. Add `-P` always.\n\n## What this skill is NOT\n\n- Not a cleaner (use `disk-magician` for cleanup; this skill explains why something grew).\n- Not a real-time monitor (left to `disk-root-cause` + `pressure_sweep.sh`).\n- Not authorized to push commits or merge PRs (read-only forensics + typed recommendations only).\n\n## Exit criteria for the skill\n\nA complete root-cause answer for this machine has:\n- [ ] Default `diskm audit` three-lane report completed or its named limits were reported\n- [ ] Every resolved directory leaf is below 100 MiB; every directory at or above 100 MiB was descended, and every file is individually itemized with hardlinks deduplicated and symlinks not followed\n- [ ] Every traversal failure is named as unfinished and excluded from complete leaf totals, floors, age decisions, and reclaim estimates\n- [ ] Displayed Data equation reconciles measured file leaves + measured directories below 100 MiB + measured tail + purgeable estimate + unresolved residual = Data used, with APFS siblings reported separately\n- [ ] Data-used before\u002Fafter bracket is shown; any drift is marked non-atomic with a residual interval\n- [ ] Residual is explicitly not called backup or reclaimable without evidence\n- [ ] Phase 0 ground-truth probe done\n- [ ] Phase 1 floor deltas computed (last week + last month + all-time min)\n- [ ] Phase 2 attribution buckets are non-overlapping sums of measured leaves; directory aggregates remain navigation hints\n- [ ] Phase 3 readout in the format above, with explicit limits listed\n- [ ] No destructive command proposed without an explicit human-OK gate\n- [ ] Honest attribution: where any bucket delta is sourced from a concurrent agent or external sweep, say so\n","# disk-root-cause — forensic attribution skill\n\nWhen a user asks **why the disk filled up**, **what grew over a window**, or **where a specific bucket came from**, this skill is the entry point. A plain capacity check routes to the zero-`du` triage in `..\u002Fdisk-audit\u002FSKILL.md`. For disk attribution and reclaim estimates, use the state repository reported by `diskm state status` and prefer parallel fan-out when resources permit.\n\n## Mandatory 100 MiB directory descent\n\nEvery measurement, inventory, report, age decision, and reclaim-candidate scan must resolve directories to individual files and directories smaller than 104857600 bytes (100 MiB). A directory at exactly 100 MiB must be descended into. Files are terminal items at any size; name and size every file at or above 100 MiB. Never treat a fixed class name, depth, Git marker, protected status, or configuration ceiling as a successful measurement stop.\n\nContinue read-only metadata measurement inside Git worktrees, source trees, sessions, and other protected paths. Measurement does not authorize deletion, content reads, or changes: preserve existing owner, lease, cwd, open-file, dirty\u002Funpushed, secret, and retention gates. Never follow a symlink; measure it as a link leaf. Preserve inode and hardlink deduplication.\n\nA real permission, identity, enumeration, or deadline failure is unfinished work. Name the blocked path and reason, preserve its resume point, and exclude its parent and subtree from complete totals, floors, age decisions, and reclaim estimates. Report aggregate directory sizes as navigation hints only; they do not replace leaf itemization or prove reclaimability.\n\n## Default first-use workflow\n\nStart with the ground-truth probes defined in `..\u002Fdisk-audit\u002FSKILL.md`, including the fleet check, existing per-host ledger, and 7-day growth history. Read those results before drilling down.\n\nFor root-cause, floor, growth, or reclaim-estimate requests, run the full `diskm audit` after these probes unless an existing current report already proves complete 100 MiB leaf coverage for every requested path and period. Directory-aggregate snapshots cannot prove that coverage. A quick capacity-only request may stop after the triage if its answer is sufficient.\n\nThe audit is the three-lane diagnostic. Its top-down accounting must resolve requested Data paths into file leaves and directories below 100 MiB. This instruction defines the required result; it does not change the scanner. Check the emitted report's actual resolution and unfinished paths. Until the installed runtime produces complete leaf itemization, treat coarse or unfinished paths as incomplete and any reclaim estimate that depends on them as unknown. The audit launches in parallel:\n\n1. top-down whole-disk accounting from physical\u002FAPFS capacity through the Data volume to individual files and directories smaller than 100 MiB;\n2. coverage-validated snapshot deltas, so a coverage change cannot masquerade as physical growth; and\n3. safe quick wins and obvious outliers, with cleanup commands still behind repository safety gates.\n\nRead the whole report before drilling down. Keep permission\u002FTCC denial, time budget, node budget, cross-device boundaries, APFS sibling allocations, purgeable estimates, and residual bytes as separate fields. The residual is an attribution gap: it is **not backup size and not reclaimable without evidence**.\n\nThe 900-second wall-clock cap is the infinite-process guard; live whole-volume runs on this host vary from about 6.5 minutes to more than 8 minutes under I\u002FO load, so 480 seconds was empirically insufficient. Separately, the 100,000,000-record ceiling is a deliberately remote post-scan parser\u002Fledger sanity guard (or a visited-path guard in the legacy fallback), not a normal coverage budget. GNU `du` stdout is spooled to a temporary file rather than retained in memory before that validation. The human-readable report must show the backend, records\u002Fpaths processed, and this ceiling.\n\nThe displayed Data equation must use one accepted leaf ledger: measured file leaves + measured directory leaves below 100 MiB + measured tail + purgeable estimate + unresolved residual = Data used. Report APFS container-free space and sibling-volume allocations in a separate container-level reconciliation so they are not mistaken for Data leaves or counted twice. A directory total, synthetic direct-allocation segment, or arbitrary size bucket is not a resolved leaf. Measure every file leaf and descend every directory at or above 100 MiB; name files at or above 100 MiB individually. Smaller file leaves may be compactly displayed as lossless count-and-size totals only after each file was measured and inode deduplication applied. Permission, identity, time, node, enumeration, or unscanned cross-device children stay on the named unfinished frontier and inside residual. Never reuse an earlier parent observation. A hidden measured-total equation does not validate the displayed leaves. Capture Data used before and after the namespace walk; when it changes, report the residual interval and mark the measurement non-atomic.\n\nThe top-down scanner prefers one NUL-delimited, multi-root GNU `gdu` inventory process. Never sum independent per-shard `du` processes: hardlink deduplication is process-local. The one pass must traverse all measurable directories to the 100 MiB stop floor and preserve hardlink\u002Finode deduplication. Do not replace file rows with synthetic direct-allocation chunks. Localized permission\u002FTCC errors taint their subtree and every ancestor; unreadable or unfinished subtrees remain explicitly incomplete. Unknown diagnostics, malformed output, or timeout fail closed to the bounded frontier fallback (`gdu`, then `dua`, then macOS `du`) and preserve the resume point. Fast backends must not be wrapped in `taskpolicy -b`, which can starve them under host I\u002FO pressure. Symlink leaves never pull their targets into the ledger.\n\n**Pair with** `disk-magician` skill (measurement + safe cleanup) and the `CLAUDE.md` \u002F `AGENTS.md` in this repo (cross-repo authorization + never-delete list).\n\n## When to use\n\nTrigger when the user asks any of:\n- \"Why is my disk filling up\"\n- \"What grew over the last day\u002Fweek\u002Fmonth\"\n- \"Find the minimum disk used in the last month\" (floor)\n- \"Root cause the disk growth\"\n- \"Show me the delta between then and now\"\n- \"Which bucket is worth reclaiming, and why\" or \"how much can I free\" — both require full leaf-level attribution. A quick available-space question with no reclaim estimate goes to `..\u002Fdisk-audit\u002FSKILL.md`. This skill reports findings and typed recommendations; cleanup commands are separate.\n\nFor a one-file size query, report that file's size directly. A directory below 100 MiB may be reported as one measured unit; for any directory at or above 100 MiB, descend into files and smaller directories before reporting age, attribution, or reclaimability.\n\n## Hard rules (skill-wide)\n\n1. **Action scope and cleanup gates:** Perform cleanup only when the live request or standing authorization covers the same action, targets, and result. Authorization persists across the steps needed to complete that task; do not ask again for those steps. Route each deletion through its canonical `diskm` command and satisfy its current target-specific gates. Ask before adding new actions or targets not already covered; never use `rm -rf` directly.\n2. **Never-delete list** (hard stop for removal by every route): `~\u002F.codex\u002Fsessions*`, `~\u002F.codex\u002Fstate*.sqlite`, `~\u002F.codex\u002Flog`, and `~\u002F.claude\u002Fprojects`. Continue read-only metadata descent through directories at or above 100 MiB; never delete, alter, or read protected file contents.\n3. **Symlink gotcha — always realpath-verify:** agent-home aliases (for example backup or prod copies of `${HERMES_HOME:-$HOME\u002F.hermes}`) are often symlinks to the live home; `\u002Ftmp`, `\u002Fvar`, `\u002Fetc` are volume-root symlinks to `\u002Fprivate\u002F*`. Naive `du` over args triples-counts them. Use `du -P` (no-follow) and dedup by realpath when comparing totals.\n4. **No VACATE-without-name.** When a user says \"vacate \u002F pause \u002F stop the CI runners\", verify the runners' actual supervisor first — self-hosted GitHub Actions runners are often plain **processes** under their install directory, not a service job. Stopping the wrong thing (e.g. an unrelated service) is harmless but accomplishes nothing; stopping the GH Actions runners pauses live CI. Always inspect the service list (`launchctl list` on macOS, `systemctl --user list-units` on Linux) and `ps aux | grep \u003Chint>` before any destructive action, and report the candidate names back to the user verbatim.\n5. **Read-first, deduce-later.** Do not assert \"X grew 5 GB\" from one `du`; cross-check against snapshot history (a committed git repo on disk) and the live `df -k` output. If two sources disagree, attribute honestly.\n6. **Stay within authorized scope.** Do not use an auto-remediator outside the canonical `diskm` commands. Continue cleanup that the current request authorizes and that the canonical per-target gates permit; ask only before a new action or target the request does not cover.\n7. **Honest attribution in final report.** If disk improved mid-analysis for reasons outside this session (concurrent sweepers, OS reclaims), say so explicitly. Never claim a delta whose source you didn't observe.\n\n## Phase 0 — environment ground truth (always run)\n\n```bash\n# Resolve the snapshot from the machine-specific state repository reported by the CLI.\ndf -h\nSTATE_REPO=\"$(diskm state status | sed -n 's\u002F^\\[state_repo\\] state repo: \u002F\u002Fp')\"\nif [[ -z \"$STATE_REPO\" || ! -d \"$STATE_REPO\" ]]; then\n  echo \"state repo unavailable; snapshot history is incomplete\" >&2\n  exit 1\nfi\nSNAP=\"$STATE_REPO\u002Fsnapshots\u002Fdisk_snapshot.json\"\ngit -C \"$STATE_REPO\" log --oneline -1 -- 'backup\u002F*\u002Fdisk_snapshot.json' snapshots\u002Fdisk_snapshot.json 2>\u002Fdev\u002Fnull\nif [[ -r \"$SNAP\" ]]; then\n  python3 -c 'import json,sys; from pathlib import Path; d=json.loads(Path(sys.argv[1]).read_text()); print(\"schema_version:\", d.get(\"schema_version\"), \"coverage:\", d.get(\"snapshot_coverage_pct\"))' \"$SNAP\"\nelse\n  echo \"snapshot unavailable at resolved state-repo path: $SNAP\" >&2\nfi\n```\n\nIf `schema_version != 2`, the snapshot is pre-v2 (coverage inflates by parent\u002Fchild double-count). Use `coverage_pct_raw_v1` from `snapshot_metadata` for trend continuity and note the inflation.\n\n## Phase 1 — floor + deltas (snapshot history)\n\nThe Git root for current state is the repository reported by `diskm state status`. Use resolver-backed history commands for archived samples; do not assume frozen `backup\u002F\u003Chost>\u002Fdisk_snapshot.json` files live under the current state repo. A frozen archive may contribute only a historical sample whose embedded capture time is in the requested window and whose coverage is at least 70%. Never use an archived file as the current snapshot or count duplicate captures twice.\n\nThree deltas, always reported:\n\n| Window | Find | Compare to |\n|---|---|---|\n| **Last week** (7 d) | Minimum `disk_used_gb` in window from snapshots with `snapshot_coverage_pct >= 70%` | live `df -k` |\n| **Last month** (30 d) | Minimum `disk_used_gb` in window from snapshots with `snapshot_coverage_pct >= 70%` | live `df -k` |\n| **All time floor** | Minimum covered `disk_used_gb` over reachable + reflog-recovered commits | live `df -k` |\n\nPull both `disk_used_gb` (denominator, in GiB — verified to use `1024*1024` divisor in `disk_snapshot.sh:200-201`) and `disk_free_gb`. Compute:\n\n```\ndelta_used = used_now − used_min\ndelta_free = free_min − free_now\n```\n\nPer-directory snapshot deltas locate growers but remain directory aggregates. They do not establish file-level age, full attribution, or reclaimability. For a current attribution or reclaim estimate, descend every directory at or above 100 MiB to file and small-directory leaves. For null keys under disk pressure (the `timeout_keys` field), continue bounded itemization or report the exact unfinished key; a live `du -sk` parent total is not a substitute.\n\n**Coverage gate:** exclude snapshots with missing, null, or `snapshot_coverage_pct \u003C 70%` from floor selection and exact per-directory delta comparisons; keep them as low-coverage context only. The `topdown_coverage` field embeds the frontier scanner's `~\u002F.disk_magician_state\u002Ffrontier_last.json` summary if \u003C36h old; use `frontier_unfinished_count` and `residual_kb` to name unmeasured tails. If no qualifying snapshot remains, report the snapshot floor unavailable and use the df-only daily `host_disk.used_kb` history in the configured disk observer log and its rotations. Report observed days and earliest\u002Flatest dates; do not infer all-time floors or per-path deltas from that fallback.\n\n## Phase 2 — parallel-subagent fan-out (when scope demands it)\n\nFor a point size query on an individual file, report that file's size. A parent `du` total locates a directory; it never replaces descent at or above 100 MiB. When the attribution crosses the boundary into \"find everything growing in category X\", fan out via \u002Fswarm:\n\n| Lane | Fan-out scope | Sample prompt shape |\n|---|---|---|\n| **lane-audit** | Reclaim-candidate inventory across dev caches, worktrees, AO sessions, \u002Ftmp, and Library caches | \"Descend each directory at or above 100 MiB; measure file-level size\u002Factivity. Use cleanup previews and preserve their delete gates. Report unfinished paths and skip reasons.\" |\n| **lane-history** | Snapshot-history growth attribution | \"From the state repository reported by `diskm state status`, identify directory aggregates that grew between \u003Cfloor-sha> and HEAD; treat these as navigation hints and itemize any current directory at or above 100 MiB before attributing or estimating reclaim. Cite commit SHAs.\" |\n| **lane-tmp** | \u002Fprivate\u002Ftmp live holders vs orphan candidates | \"Use directory sizes to locate candidates; descend each directory at or above 100 MiB to files and smaller directories. List each terminal item's size, age, open-handle\u002Fcwd owner, and cleanup gate.\" |\n| **lane-colima** | Colima sparse-disk inflation + recovery sequence | \"Measure the VM image file and its allocation; do not treat the enclosing ~\u002F.colima directory total as itemized. Run the authorized fstrim sequence and measure its result. NEVER docker prune -af.\" |\n| **lane-frontier** | Configure `disk_frontier_scan.py --granularity-gib 0.09765625 --output-default` after the scanner passes the inclusive-boundary and file-leaf checks | Do not claim complete leaves from this flag alone; verify that equality descends and that no synthetic chunks or skipped children remain. Record unfinished paths. |\n| **lane-critic** | Adversarial reality-check on top claims | \"Try to refute each finding by recomputing from raw data. Cite file:line.\" |\n\nFan-out rule: **single-writer per file**, `grep -n \"agent(\" \u003Cswarm-script>` cost-routed (haiku for mechanical, sonnet for analysis), staggered starts (`\u002Fswarm`, \"Long runs\"), explicit `--model:` on every call. Adversarial verify ≥3 lenses before any actionable claim.\n\n## Phase 3 — readout format (always)\n\n```text\n⚠ Limits: coverage \u003C X% \u002F timeouts \u002F pinned-subtrees HELD\n↘ FLOOR (last month): used=YGB \u002F free=YGB @ \u003Ciso> (commit \u003Csha>)\n↘ FLOOR (last week):  used=YGB \u002F free=YGB @ \u003Ciso> (commit \u003Csha>)\n↘ NOW (live df):      used=YGB \u002F free=YGB (GiB, GiB; units confirmed)\n↘ DELTA (30 d):       used_now − used_min = ±Y GB;    free_min − free_now = ±Y GB\n↘ Per-bucket attribution (non-overlapping sums of measured file\u002Fsmall-directory leaves; directory aggregates are navigation hints only):\n  - colima: +X (sum of measured leaves; sawtooth Y; what range over time)\n  - \u002Ftmp: +X (sum of measured leaves)\n  - AO sessions: +X (sum of measured leaves; post-.bak-drop, mostly live)\n  - ~\u002Fprojects: +X (sum of measured leaves)\n  - residual (unaccounted): X (frontalier scanner names these within 36h of first nightly run)\n↘ Safe-cleanup recommendations (require explicit OK):\n  - run A: cleanup_tmp.sh --clean (~X GB, low risk)\n  - run B: VACATE_CI_RUNNERS_APPROVED — needs user to confirm GitHub Actions runner target\n  - run C: ...\n↘ Evidence \u002F proofs (commit SHAs, snapshot JSON keys, df outputs, du numbers)\n```\n\n## Cleanup-command catalogue (read-only — never auto-runs)\n\n| Cmd | Use | Requires |\n|---|---|---|\n| `.\u002Fscripts\u002Fcleanup_tmp.sh --clean` | >240min \u002Ftmp + agent scratch | Nothing (script dry-runs when defaults don't apply) |\n| `.\u002Fscripts\u002Fcleanup_dev_caches.sh --clean` (via `disk_audit.sh --clean`) | uv\u002Fpre-commit\u002Fcursor-agent\u002Fclaude-cli caches | DISK_MAGICIAN_AUTO_CLEAN=1 |\n| `user_scope\u002Fscripts\u002Fcleanup-ao-sessions.sh --drop-bak --days N` | .bak chains (post-6poe fix) | N chosen by caller |\n| `.\u002Fscripts\u002Fcleanup_colima.sh --clean` | Docker prune + fstrim (compresses host sparse disk) | Nothing (preserves running containers via docker prune semantics) |\n| `.\u002Fscripts\u002Fcleanup_worktrees.sh --clean` | Antigravity worktree GC | pre-WORKTREE-APPROVED if plan targets stale |\n| `.\u002Fscripts\u002Fcleanup_apfs_snapshots.sh --clean` | OS update snapshots >24h old | sudo (script silently fails without) |\n| `cleanup-ao-sessions.sh --days 0` | Force ALL AO backups drop (aggressive) | User OK |\n| `tmutil thinlocalsnapshots` | APFS local TM snapshots reclaim | sudo + user OK (impacts Time Machine reversibility) |\n\n## Known traps (read this before answering)\n\n1. **Snapshot coverage collapses under disk pressure** — directories can be `null` or unfinished after a timeout. A live parent `du -sk` total only locates the path; it does not restore file-leaf coverage. Continue itemization within the available budget or report the exact unfinished paths.\n2. **`discover` times out at 120s with zero output** — do not treat parent sizes as a completed inventory; use the bounded frontier and preserve every unfinished path.\n3. **`cleanup_tmp.sh` defaults to DRY-RUN despite header claiming otherwise** — header was fixed in v0.2.0 (commit `5341a6f`); callers still must pass `--clean`.\n4. **Colima wedges with I\u002FO errors when host disk hits 100%** — fstrim can't run; **must** `colima stop && colima start` first. 49.6→6.8 GB recovery verified live.\n5. **Confirm the runner supervisor** — `launchctl list | grep -i runner` (macOS) or `systemctl --user list-units | grep -i runner` (Linux), plus `ps aux | grep -i runner`, before any VACATE-style directive.\n6. **Legacy snapshot path:** `backup\u002F\u003Chost>\u002Fdisk_snapshot.json` is frozen historical data, not a current measurement. Consider it only as an in-window historical sample with a valid embedded capture timestamp and coverage of at least 70%. Current measurement uses `snapshots\u002Fdisk_snapshot.json`; `diskm state status` identifies the per-host state repository.\n\n## Anti-patterns to flag in code review\n\n- Re-implementing du\u002Fdedup in shell when `disk_snapshot.sh` already dedups with a realpath containment trie (schema v2). Live measure if a one-off is needed.\n- Source-level `grep` for keys with substrings (e.g. `assert 'measured' not in json.dumps(td)` false-fail when the wanted key is `measured_total_kb`). Test contract: assert on dict keys, not substring matching.\n- Heredoc stdin race: `python3 - \u003C\u003C'PY' … | something` — the heredoc wins the fd, so the pipe isn't read. Write to a temp file and pass it as argv.\n- Symlink dedup at parent (`\u002Fvar → \u002Fprivate\u002Fvar`) for paths given to `du`. Add `-P` always.\n\n## What this skill is NOT\n\n- Not a cleaner (use `disk-magician` for cleanup; this skill explains why something grew).\n- Not a real-time monitor (left to `disk-root-cause` + `pressure_sweep.sh`).\n- Not authorized to push commits or merge PRs (read-only forensics + typed recommendations only).\n\n## Exit criteria for the skill\n\nA complete root-cause answer for this machine has:\n- [ ] Default `diskm audit` three-lane report completed or its named limits were reported\n- [ ] Every resolved directory leaf is below 100 MiB; every directory at or above 100 MiB was descended, and every file is individually itemized with hardlinks deduplicated and symlinks not followed\n- [ ] Every traversal failure is named as unfinished and excluded from complete leaf totals, floors, age decisions, and reclaim estimates\n- [ ] Displayed Data equation reconciles measured file leaves + measured directories below 100 MiB + measured tail + purgeable estimate + unresolved residual = Data used, with APFS siblings reported separately\n- [ ] Data-used before\u002Fafter bracket is shown; any drift is marked non-atomic with a residual interval\n- [ ] Residual is explicitly not called backup or reclaimable without evidence\n- [ ] Phase 0 ground-truth probe done\n- [ ] Phase 1 floor deltas computed (last week + last month + all-time min)\n- [ ] Phase 2 attribution buckets are non-overlapping sums of measured leaves; directory aggregates remain navigation hints\n- [ ] Phase 3 readout in the format above, with explicit limits listed\n- [ ] No destructive command proposed without an explicit human-OK gate\n- [ ] Honest attribution: where any bucket delta is sourced from a concurrent agent or external sweep, say so\n",{"name":5,"description":7},"main","8e9e0f1d69c0cd3ceaf77b4fed39bb3c54403ba9",".claude\u002Fskills\u002Fdisk-root-cause",0,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills","https:\u002F\u002Fgithub.com\u002Fjleechanorg","2026-11-14 03:18:13",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add jleechanorg\u002Fjleechan-skills --skill disk-root-cause",{"tool":56,"command":57},"bunx","bunx skills add jleechanorg\u002Fjleechan-skills --skill disk-root-cause",{"tool":59,"command":60},"pnpm","pnpm dlx skills add jleechanorg\u002Fjleechan-skills --skill disk-root-cause","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fdisk-root-cause\u002FSKILL.md",true,[],[65,80,101,115,129,145],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":38},"01M716Y5MTJ6GYJZ2ATXCJK8G4","instinct","Use when the user invokes \u002Finstinct or \u002Fin, or asks to \"message Instinct\", \"ask Instinct\", \"tell Instinct\", \"check Instinct\", or read replies from the configured peer assistant. iMessage first, WhatsApp Web as fallback.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Finstinct\u002FSKILL.md",[],[67,72,22,73,24,36,74,75,76,77,78,79],"user","replies","identity","whatsapp","gmail","read","message","ask",{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":91,"publishedAt":38},"01M716Y4HF7FVVMJSA2CCVN5VF","hr","Compatibility alias for history-resume; produce the same fresh-state, provenance-aware resume briefing.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhr\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[82,92,93,94,26,95,96,97,98,99,100],"resume","compatibility","provenance","history","produce","alias","briefing","state","fresh",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":108,"publishedAt":38},"01M716Y1FFNFKFJYYKF8HQA6T8","history-resume","Resume briefing for the current repository branch or worktree using fresh state and admitted history sources.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhistory-resume\u002FSKILL.md",[107],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},[95,92,109,110,72,111,98,112,26,113,114,99,100],"history resume","branch","analysis","repository","worktree","sources",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":38},"01M716XWXJ8EPHK4RH9T14TR85","grok","Alias for the canonical grokbot browser conversation workflow; \u002Fgrok talks to the Grok bot the same way \u002Fdot talks to Dot.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgrok\u002FSKILL.md",[],[117,122,123,124,26,125,97,126,127,128],"dot","bot","workflow","canonical","conversation","browser","grokbot",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":38},"01M70N9Q07DTE0EW5KFXMMMSJ0","codexa-bench","Compare `codexa` and normal `codex` on a fair split of comparable work by default; use `--strict` for duplicate runs of the exact same task.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcodexa-bench\u002FSKILL.md",[],[136,137,138,36,139,26,140,141,142,143,144],"codexa bench","work","split","default","duplicate","task","compare","normal","codex",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":149,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":164,"publishedAt":38},"01M6C24S2X60SP8BBFGAEKPEGW","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FSKILL.md",[153,158,161],{"categoryNo":154,"categoryName":155,"taxonomyType":156,"taxonomyTypeDesc":157},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":159,"categoryName":160,"taxonomyType":156,"taxonomyTypeDesc":157},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":162,"categoryName":163,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000032","设计师",[165,166,167,36,168,169,170,72,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,22,189],"frontend","design","frontend design","generic","ui design","react","html","components","code","artifacts","ui","aesthetics","Production","web components","landing","applications","quality","web","css","create","examples","with","react components","web ui","pages"]