[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J3XT01K7Z0JNHKM7ANGCPD":3,"skill-same:01M6J3XT01K7Z0JNHKM7ANGCPD":104},{"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":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":14,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6J3XT01K7Z0JNHKM7ANGCPD","audit-plan",null,"Iteratively audit a plan file (docs\u002Fplans\u002F*.md) with GPT + Gemini final gate.\nMulti-round refinement with an acceptance-rate early-stop (3 rounds default).\nLedger-driven suppression on R2+ rounds prevents finding churn.\nJudges the plan DOCUMENT before anyone builds it. \"Was the plan actually\nbuilt?\" is \u002Fux-lock verify — that reads a live app, this reads only the file.\nTriggers on: \"audit the plan\", \"iterate on the plan\", \"plan-audit\",\n\"audit docs\u002Fplans\u002F\", \"review the plan\", \"is this plan good\",\n\"check the plan\", \"\u002Faudit-plan\".\nUsage: \u002Faudit-plan \u003Cplan-file>             — Audit existing plan iteratively\nUsage: \u002Faudit-plan \u003Ctask-description>      — Generate plan with \u002Fplan, then audit","Lbstrydom\u002Fclaude-engineering-skills","Lbstrydom","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F77991486?v=4","01M6J3X4N2T0FTZT1RKFXDVS0K","Louis Strydom","01M6J3X4SXV0BXWDMXPW90D8BK",0,"MIT","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"plan","audit","audit plan","rate","plans","triggers","gemini","usage","stop","live","r2","ux","generate","lock","review","acceptance","only","good","default","churn","app","2026-11-10 10:12:30",false,"---\nname: audit-plan\ndescription: |\n  Iteratively audit a plan file (docs\u002Fplans\u002F*.md) with GPT + Gemini final gate.\n  Multi-round refinement with an acceptance-rate early-stop (3 rounds default).\n  Ledger-driven suppression on R2+ rounds prevents finding churn.\n  Judges the plan DOCUMENT before anyone builds it. \"Was the plan actually\n  built?\" is \u002Fux-lock verify — that reads a live app, this reads only the file.\n  Triggers on: \"audit the plan\", \"iterate on the plan\", \"plan-audit\",\n  \"audit docs\u002Fplans\u002F\", \"review the plan\", \"is this plan good\",\n  \"check the plan\", \"\u002Faudit-plan\".\n  Usage: \u002Faudit-plan \u003Cplan-file>             — Audit existing plan iteratively\n  Usage: \u002Faudit-plan \u003Ctask-description>      — Generate plan with \u002Fplan, then audit\n---\n\n# Plan Audit Loop\n\n> **This skill's last line is an end marker naming the skill between em-dashes, after\n> the Reference files table.** If that last line is not in your context (context\n> compaction keeps only the start of a skill), re-read\n> `.claude\u002Fskills\u002Faudit-plan\u002FSKILL.md` in full before continuing — the later steps,\n> including the mandatory final gate, still apply.\n\nIteratively refine a plan with GPT + Gemini final review until findings\nplateau, then gate with the independent reviewer.\n\n**Input**: `$ARGUMENTS` — either a plan file path (PLAN_AUDIT) or a task\ndescription with no path (PLAN_CYCLE: generate-then-audit).\n\n\u003C!-- host-contract: input-acquisition; grammar=path+flags; empty=ask-and-stop -->\n\n**Where `$ARGUMENTS` comes from** — orchestrator-supplied input first, else\nthe host's verbatim invocation suffix, else the span of the user's **current**\nmessage naming this skill or its subject. Never inferred from surrounding\nconversation. This site is `path+flags`; on empty input, ask whether to audit an existing plan or generate one, and stop — the two modes cost differently and are not interchangeable.\nFull contract: `references\u002Finput-acquisition.md`.\n\n\n> **Worktree preflight** — in a linked git worktree the synced tooling tree\n> `scripts\u002F.claude-skills\u002F` is absent — it is gitignored, so `git worktree add`\n> does not populate it, and every command below that uses it dies on a bare\n> `MODULE_NOT_FOUND`. Run `npm run skills:hydrate` first. If this repo defines\n> no such script, `references\u002Fworktree-preflight.md` holds the entry to add — ask\n> the user first, since it edits their `package.json`.\n\n---\n\n## Step 0 — Parse Input and Validate\n\n| Input | Mode |\n|---|---|\n| `\u003Cplan-file>` | PLAN_AUDIT — audit existing plan iteratively |\n| `\u003Ctask description>` (no path) | PLAN_CYCLE — generate plan, then audit |\n\nValidate: the helper scripts resolve, and a GPT route is available —\n`OPENAI_API_KEY` **or** an active Azure profile (`AZURE_OPENAI_ENDPOINT`); ask\nwhich ROUTE exists, not whether one variable is set. `GEMINI_API_KEY` for Step 6\n(falls back to Claude Opus when absent). `AUDIT_DB_URL` for cloud learning\n(optional).\n\n**If a prerequisite does not resolve, follow `references\u002Fprerequisite-ladder.md`\n— do not proceed as though it did, and do not die mid-flow.** It defines the\nhydrate-then-retry step for absent helper scripts, the labelled adversarial-agent\nsubstitute when the GPT legs have no route, and which of `AUDIT_DEGRADED` \u002F\n`AUDIT_NOT_RUN` to report so a run that did not happen stays distinguishable\nfrom one that passed.\n\nInitialise session ID: `SID=audit-plan-$(node -e \"process.stdout.write(Date.now()+'-'+process.pid)\")` — epoch ms plus a PID, so two sessions started in the same second get separate result, stderr and ledger files.\n\nKickoff card: `\u002Faudit-plan — [MODE] — Starting | Plan: \u003Cpath> | 3 rounds default | SID: $SID`.\n\n---\n\n## Step 1 — Plan Generation (PLAN_CYCLE only)\n\n\u003C!-- host-contract: no-dispatch; preserves=step-order,step3-pause,skip-flags,blocked-propagation -->\n\n> **No skill-to-skill dispatch on this host?** Open `.claude\u002Fskills\u002Fplan\u002FSKILL.md` and\n> follow it inline, passing the task description explicitly (orchestrator-supplied\n> input, rule 0 of `references\u002Finput-acquisition.md`), then return here with the\n> persisted plan path. Same fallback `\u002Fcycle` documents; blocked results must\n> still reach this skill rather than being swallowed by the inlined planner.\n\nGenerate the plan with `\u002Fplan` (auto-detects backend \u002F frontend \u002F full-stack; pass\n`--scope=…` if detection is wrong). Save to `docs\u002Fplans\u002F\u003Cname>.md`. Skip for PLAN_AUDIT.\n\n---\n\n## Step 2 — Run Plan Audit\n\n```bash\n# PLAN_FILE = the ONE plan path \u002Faudit-plan was invoked with, assigned verbatim.\n# Not a glob: an assignment does not expand it, so the CLI would get the pattern itself.\nnode scripts\u002Fopenai-audit.mjs plan \"$PLAN_FILE\" --mode plan --out .audit\u002F$SID-r1-result.json 2>.audit\u002F$SID-r1-stderr.log\n```\n\n**Critical**: always pass `--mode plan`. Without it, Gemini in Step 6 can flag\nabsent implementations (the plan describes work that doesn't exist yet, which\nis by design for plan-audit).\n\n**Round 2+** — injects prior rulings as exclusions and suppresses re-raises against\nthe ledger:\n\n```bash\nnode scripts\u002Fopenai-audit.mjs plan \"$PLAN_FILE\" --mode plan --round 2 --ledger .audit\u002F$SID-ledger.json --out .audit\u002F$SID-r2-result.json 2>.audit\u002F$SID-r2-stderr.log\n```\n\nPlan audit is single-file — no `--passes`, `--diff`, or `--changed`. When\n`.requirements\u002Fledger.json` exists the prompt gets a `\u003Crequirements_rubric>`\nautomatically; no flag. Show a results card per round:\n`ROUND N PLAN AUDIT — \u003Cverdict> | H:x M:y L:z | Cost: ~$… | Top: [H1] …`.\n\n---\n\n## Step 3 — Triage (validity × scope × action)\n\nFor each finding, record three orthogonal judgements:\n\n| Dimension | Values | Meaning |\n|---|---|---|\n| **validity** | `valid` \u002F `invalid` \u002F `uncertain` | Is the concern real for THIS plan? |\n| **scope** | `in-scope` \u002F `out-of-scope` | Does it cite a section the plan owns? |\n| **action** | `fix-now` \u002F `defer` \u002F `dismiss` \u002F `rebut` | What happens next? |\n\n### Triage rules\n\n- `validity=invalid` → action MUST be `dismiss` or `rebut`\n- `validity=uncertain` → action MUST be `rebut` (GPT deliberation)\n- `validity=valid` + `scope=in-scope` + HIGH\u002FMEDIUM → `fix-now`\n- `validity=valid` + `scope=out-of-scope` + **load-bearing** → `fix-now` (fold into the plan)\n- `validity=valid` + `scope=out-of-scope` + **independent** → `defer` to \"Out of Scope (Future)\" plan section\n- `validity=valid` + `scope=in-scope` + LOW → operator choice\n\n**Scope is decided by impact, not ownership (load-bearing test).** \"The plan\ndoesn't own that section\" is NOT a defer pass. Ask: *does the success of this\nplan's design depend on the cited concern?* **Load-bearing** → fold the resolution\ninto the plan (or an explicit dependency note stating the assumption and how it is\nvalidated); **never silent-defer it**. **Independent** → defer. A `defer` must name\nthe independence in one sentence; if you can't write it truthfully, it's\nload-bearing. When the cited concern is in a module\u002Ftable the plan's design reads or\nwrites, independence needs the two-part answer (same column\u002Fconstraint? same\ntransaction instance?) → `references\u002Ftriage-rubrics.md` §Same-module independence.\n\n**Rubrics — apply each; full text in `references\u002Ftriage-rubrics.md`, read the section\nwhen its condition holds:**\n- **Grounding** — a non-trivial plan (≥6 files, ≥2 subsystems, a dependency chain, or\n  >1 sitting) whose §1 Code Trace lacks concrete `file:line` refs **and a call path** is\n  **HIGH `ungrounded-plan`**; spot-check each \"what exists today\" claim that drives a\n  design decision — a design built on a mis-described existing contract is HIGH; an unpinned `file:line`\n  is LOW (ask for `path:line (sha)`).\n- **Test-premise lint** — \"tests already cover X\" with no executed command + result\n  attached is a build-time spike, not evidence: flag it. Naming a source\u002Ffield must\n  also prove its semantics match the contract.\n- **Campaign** (plan header has `- **Mode**: campaign`) — run `node scripts\u002Fcampaign-contract-check.mjs \"$PLAN_FILE\"`;\n  each problem it prints is a HIGH finding; exit 2 means it did not run — say so, never read it as complete.\n  It proves presence only: judge each control's adequacy yourself.\n- **§11 clustering** (plan has the block) — check partition, coupling soundness,\n  fix-gate placement, contiguous ordering, derived scope; a malformed block that would\n  make `\u002Fcycle` build on un-audited coupled code is HIGH. `author-tier:` is advisory —\n  never a finding.\n\n### Tiered rebuttal\n\n| Severity | Deliberation |\n|---|---|\n| HIGH | ALWAYS send to GPT deliberation |\n| MEDIUM | ALWAYS send to GPT deliberation |\n| LOW | Claude decides locally |\n\nOnly send rebuttal if rebut HIGH or MEDIUM findings exist:\n\n```bash\nREBUTTAL_FILE=.claude\u002Ftmp\u002Frebuttal.md   # the rebuttal text you wrote for the disputed finding(s)\nnode scripts\u002Fopenai-audit.mjs rebuttal \"$PLAN_FILE\" \"$REBUTTAL_FILE\" --out .audit\u002F$SID-resolution.json 2>.audit\u002F$SID-rebuttal-stderr.log\n```\n\n### Convergence — early-stop on rigor pressure\n\n**Key on the ACCEPTANCE RATE, not the finding count.** `write-ledger-entries`\nprints it for the round you just triaged (`acceptance 92% (accepted 11 ·\ndismissed 1 · deferred 0)`):\n\n| Acceptance rate this round | Read |\n|---|---|\n| **≥ ~⅔ accepted as fix-now** | **PRODUCTIVE** — the round bought real corrections. Continue (within the cap). |\n| **≤ ~⅓** | **STOP** — you are dismissing\u002Fdeferring most of what arrives. That is rigor pressure by definition. |\n| in between | Decide on finding *character* (below), not on counts. |\n\nThe count is a **secondary backstop**, read with the rate (a rising HIGH count alone\nis not a stop signal — fixes create new surface; evidence in\n`references\u002Fconvergence-evidence.md`):\n\n| Condition | Action |\n|---|---|\n| HIGH count rising **and** acceptance rate low | **STOP** — the loop is manufacturing work |\n| HIGH count rising **and** acceptance rate high | Continue — the plan is gaining real surface |\n| HIGH count dropping | Continue (the classic converging case) |\n| R2+ findings push for v2 features, parser deps | **STOP** — record as \"Out of Scope\" |\n\n**Cap: 3 rounds, 5 absolute — enforced by `openai-audit.mjs`.** Round 4 exits\n`4` (`CAPPED`) with a structural-or-stop card: a stop for a human call, never a\nretry (`references\u002Fround-cap-and-structural-card.md`). At round 3 without\nconvergence run `node scripts\u002Faudit-structural-card.mjs --sid \"$SID\" --mode plan --plan \"$PLAN_FILE\"`\nand **present the card to the operator** with its three choices (STOP \u002F\nSTRUCTURAL \u002F CONTINUE); continuing is their call. An **implementation-completeness**\nfinding (\"specify the store step\") belongs to the code audit. Record the call\n(rounds, acceptance rate, card verdicts, why) in the plan's audit trail.\n\nWhen stopping with deferrals, append a `## Out of Scope (Future)` section to\nthe plan listing deferred concerns with rationale.\n\n**Step 6 (Gemini final review) is MANDATORY** after the last audit round,\nregardless of convergence. No-key degradation ladder (same as audit-code's\n`references\u002Fgemini-gate.md` — never a silent skip): Gemini → Claude Opus\nfallback → an **independent adversarial review agent** over the plan +\nfindings (record its verdict in the same APPROVE\u002FCONCERNS\u002FREJECT shape) →\nonly when none of those is available, output `FINAL_GATE_SKIPPED` and do\nnot claim full final-gate validation.\n\n---\n\n## Step 3.5 — Update Adjudication Ledger\n\nAfter each deliberation round, write ledger entries for every finding before\nStep 4 — the ledger drives R2+ rulings injection and suppression. Write the\n`--triage` file with an editor, never as a shell string (rationale prose has\napostrophes). Invocation + status semantics: `references\u002Fledger-format.md`.\n\n**Step 3.5b — record triage outcomes.** Cloud labels are automatic:\n`write-ledger-entries.mjs` labels the round it triaged, and each R2+ `openai-audit.mjs\nplan` re-checks the prior round. **Only if a `[finalize] WARN` line appeared**, run the\nmanual fallback in `references\u002Fconvergence-evidence.md` §Step 3.5b. `labelled: 0` with a\nnon-zero `total` is a failure, never a pass. **Every round, also** record dismissed\nscope-pressure findings into the LOCAL PlanFpTracker, so future plan audits suppress the\nrecurring ones:\n\n```bash\n# --outcomes = THIS round's finding ids and actions (the two below are an example only)\nnode scripts\u002Fwrite-plan-outcomes.mjs --result \".audit\u002F$SID-r$ROUND-result.json\" --outcomes '[{\"id\":\"M3\",\"action\":\"dismiss\"},{\"id\":\"H1\",\"action\":\"fix-now\"}]'\n```\n\n## Execution order\n\n**Wait for rebuttal BEFORE editing the plan**: rebuttal → response → ledger (3.5) →\nedit (Step 4) → re-audit (Step 5).\n\n---\n\n## Step 4 — Edit Plan\n\nPlans are single files — apply fixes via `Edit`. ALL HIGH must be addressed (fix or\ndefer-with-rationale). MEDIUM until ≤2 remain. LOW optional. Show a card:\n`EDITING PLAN — N findings | Fixed: a | Deferred to \"Out of Scope\": b | Dismissed: c`.\nAfter editing, update ledger entries to `remediationState: 'fixed'` for fixed items.\n\n## Step 5 — Verify and Loop (R2+)\n\nRe-audit with R2+ mode (Step 2) on the same plan path, passing `--round \u003CN>` and\n`--ledger .audit\u002F$SID-ledger.json`; track churn with `_hash` (resolved \u002F recurring \u002F\nnew). Stop per the convergence rule above (acceptance rate primary; 3 rounds\ndefault, 5 absolute).\n\n---\n\n## Step 6 — Gemini Independent Review (MANDATORY)\n\nRun the final reviewer — the newest Gemini Pro by default (`latest-pro`, resolved at runtime; override with `FINAL_REVIEW_MODEL`) as the final gate. Falls back to Claude Opus when\n`GEMINI_API_KEY` is absent.\n\n**Build the transcript first** — the reviewer reads a file no earlier step\nwrites. One command; never hand-assemble the JSON:\n\n```bash\nnode scripts\u002Fbuild-audit-transcript.mjs --sid $SID\n```\n\nIt folds every `.audit\u002F$SID-r\u003CN>-result.json` and `.audit\u002F$SID-ledger.json` into\n`.audit\u002F$SID-transcript.json` (mode inferred from the `audit-plan-` prefix).\n\n```bash\nRUN_ID=$(node -e \"const fs=require('fs'); try { process.stdout.write(JSON.parse(fs.readFileSync(process.argv[1],'utf8'))._cloudRunId||''); } catch (e) { process.stderr.write('RUN_ID: result artifact unreadable (' + e.message + ') - the verdict will NOT be written back'); }\" \".audit\u002F$SID-r$ROUND-result.json\")\nnode scripts\u002Fgemini-review.mjs review \"$PLAN_FILE\" .audit\u002F$SID-transcript.json --mode plan --round 1 --run-id \"$RUN_ID\" --out .audit\u002F$SID-gemini-result.json 2>.audit\u002F$SID-gemini-stderr.log\n```\n\n**`--mode plan` is as load-bearing here as it is in Step 2** (it defaults to `code`,\nwhich flags the absent implementations). **`--run-id` arms the `gemini_verdict`\nwrite-back** — omit it and the verdict is recorded nowhere (measurement in\n`references\u002Fconvergence-evidence.md`).\n\nAct on the result's code-computed `gateDisposition` (the `verdict` word is the\nreviewer's own): `approve` → done. `approve_with_debt` → done — every remaining\nfinding is `release_blocking: false`; record each (id, severity, one line) in\nthe plan's Remaining \u002F debt section (or `node scripts\u002Fdebt-auto-capture.mjs\n--final-review .audit\u002F$SID-gemini-result.json`); never ask the user to override\nit. `blocked` → deliberate on the named blocking items, edit the plan, re-run\nas round 2 with `--round 2 --prior .audit\u002F$SID-gemini-result.json --out\n.audit\u002F$SID-gemini-result-v2.json`.\n\n### Gemini round cap — **max 2 rounds** (symmetric with the GPT cap)\n\n**Hard cap: 2 Gemini rounds** — `gemini-review.mjs` refuses `--round 3`. After\nround 2, if the disposition is still `blocked`:\n\n| Round-2 finding character | Action |\n|---|---|\n| Concrete **design** defect (wrong contract, unsafe migration, dangling FK) | Fix it in the plan, then escalate to the user with the round-2 result — there is no third round |\n| **Implementation-completeness** (missing step, parameter placement, \"specify X\") | **STOP** — fold into the plan as captured items; hand off to `\u002Fcycle`'s **code** audit, which verifies them against real code (the right artifact) |\n| Rising **coherence\u002Fpraise** + 1 nit\u002Fround | **STOP** — diminishing returns; record the nit, close the gate |\n\nNever a third round for rigor pressure or implementation detail (why:\n`references\u002Fconvergence-evidence.md`). Record the stop decision (round count + why)\nin the plan's audit trail. Deliberation protocol and category-error handling:\n`references\u002Fgemini-gate.md`.\n\n---\n\n## UX Rules\n\nStatus card after every phase; summarise, never dump raw JSON; show every plan edit\nwith file + line; batch all user decisions into one prompt.\n\n---\n\n## Reference files\n\nThis skill's canonical flow is above. The files below cover specialised\nsituations — read them only when the trigger applies.\n\n| File | Summary | Read when |\n|---|---|---|\n| `references\u002Finput-acquisition.md` | Where a skill's arguments come from on any host, and what to do when there are none. | Reading $ARGUMENTS on a host that does not substitute it, or deciding what empty input means at a site. |\n| `references\u002Ftriage-rubrics.md` | Step 3 rubrics in full — impact-test detail, grounding, test-premise lint, and the §11 execution-clustering checks. | Step 3 — applying a rubric whose one-line form leaves the call borderline, OR ruling on same-module independence. |\n| `references\u002Fconvergence-evidence.md` | Why the stop rules are what they are — acceptance-rate evidence, Gemini-cap rationale, outcome-recording fallback. | Step 3\u002F6 — a stop decision is contested, OR a `[finalize] WARN` line appeared and Step 3.5b needs the manual fallback. |\n| `references\u002Fledger-format.md` | Adjudication ledger schema + writer invocation example for each finding outcome. | Step 3.5 — about to write ledger entries, OR diagnosing R2+ suppression misbehaviour. |\n| `references\u002Fgemini-gate.md` | Step 7 Gemini independent review protocol — transcript, verdict handling, re-review loop. | Step 6 starting, OR Gemini returned CONCERNS\u002FREJECT and need deliberation rules. |\n| `references\u002Fround-cap-and-structural-card.md` | Enforced GPT round cap (plan 3\u002F5, code 6\u002F8), exit 4 CAPPED, and the structural-or-stop card read at the cap. | A round exited 4, OR the audit reached round 3 without converging. |\n| `references\u002Fprerequisite-ladder.md` | Step 0 prerequisite ladder — absent helper bundle or auditor route, and reporting a run that did not happen. | Step 0 — a prerequisite did not resolve (helper scripts missing, no GPT route), OR about to report a run that degraded or did not happen. |\n| `references\u002Fverification-discipline.md` | Verification discipline — pinned citations, figure provenance, two-direction proof, attribution, consumer-side checks. | Step 3 — applying the grounding rubric to a plan whose Code Trace cites `file:line`. |\n| `references\u002Fworktree-preflight.md` | Worktree preflight remedy — the skills:hydrate npm script to add when a linked worktree lacks the tooling tree. | A command dies with `MODULE_NOT_FOUND` in a linked worktree AND this repo has no `skills:hydrate` script. |\n\n— end of \u002Faudit-plan —\n","# Plan Audit Loop\n\n> **This skill's last line is an end marker naming the skill between em-dashes, after\n> the Reference files table.** If that last line is not in your context (context\n> compaction keeps only the start of a skill), re-read\n> `.claude\u002Fskills\u002Faudit-plan\u002FSKILL.md` in full before continuing — the later steps,\n> including the mandatory final gate, still apply.\n\nIteratively refine a plan with GPT + Gemini final review until findings\nplateau, then gate with the independent reviewer.\n\n**Input**: `$ARGUMENTS` — either a plan file path (PLAN_AUDIT) or a task\ndescription with no path (PLAN_CYCLE: generate-then-audit).\n\n\u003C!-- host-contract: input-acquisition; grammar=path+flags; empty=ask-and-stop -->\n\n**Where `$ARGUMENTS` comes from** — orchestrator-supplied input first, else\nthe host's verbatim invocation suffix, else the span of the user's **current**\nmessage naming this skill or its subject. Never inferred from surrounding\nconversation. This site is `path+flags`; on empty input, ask whether to audit an existing plan or generate one, and stop — the two modes cost differently and are not interchangeable.\nFull contract: `references\u002Finput-acquisition.md`.\n\n\n> **Worktree preflight** — in a linked git worktree the synced tooling tree\n> `scripts\u002F.claude-skills\u002F` is absent — it is gitignored, so `git worktree add`\n> does not populate it, and every command below that uses it dies on a bare\n> `MODULE_NOT_FOUND`. Run `npm run skills:hydrate` first. If this repo defines\n> no such script, `references\u002Fworktree-preflight.md` holds the entry to add — ask\n> the user first, since it edits their `package.json`.\n\n---\n\n## Step 0 — Parse Input and Validate\n\n| Input | Mode |\n|---|---|\n| `\u003Cplan-file>` | PLAN_AUDIT — audit existing plan iteratively |\n| `\u003Ctask description>` (no path) | PLAN_CYCLE — generate plan, then audit |\n\nValidate: the helper scripts resolve, and a GPT route is available —\n`OPENAI_API_KEY` **or** an active Azure profile (`AZURE_OPENAI_ENDPOINT`); ask\nwhich ROUTE exists, not whether one variable is set. `GEMINI_API_KEY` for Step 6\n(falls back to Claude Opus when absent). `AUDIT_DB_URL` for cloud learning\n(optional).\n\n**If a prerequisite does not resolve, follow `references\u002Fprerequisite-ladder.md`\n— do not proceed as though it did, and do not die mid-flow.** It defines the\nhydrate-then-retry step for absent helper scripts, the labelled adversarial-agent\nsubstitute when the GPT legs have no route, and which of `AUDIT_DEGRADED` \u002F\n`AUDIT_NOT_RUN` to report so a run that did not happen stays distinguishable\nfrom one that passed.\n\nInitialise session ID: `SID=audit-plan-$(node -e \"process.stdout.write(Date.now()+'-'+process.pid)\")` — epoch ms plus a PID, so two sessions started in the same second get separate result, stderr and ledger files.\n\nKickoff card: `\u002Faudit-plan — [MODE] — Starting | Plan: \u003Cpath> | 3 rounds default | SID: $SID`.\n\n---\n\n## Step 1 — Plan Generation (PLAN_CYCLE only)\n\n\u003C!-- host-contract: no-dispatch; preserves=step-order,step3-pause,skip-flags,blocked-propagation -->\n\n> **No skill-to-skill dispatch on this host?** Open `.claude\u002Fskills\u002Fplan\u002FSKILL.md` and\n> follow it inline, passing the task description explicitly (orchestrator-supplied\n> input, rule 0 of `references\u002Finput-acquisition.md`), then return here with the\n> persisted plan path. Same fallback `\u002Fcycle` documents; blocked results must\n> still reach this skill rather than being swallowed by the inlined planner.\n\nGenerate the plan with `\u002Fplan` (auto-detects backend \u002F frontend \u002F full-stack; pass\n`--scope=…` if detection is wrong). Save to `docs\u002Fplans\u002F\u003Cname>.md`. Skip for PLAN_AUDIT.\n\n---\n\n## Step 2 — Run Plan Audit\n\n```bash\n# PLAN_FILE = the ONE plan path \u002Faudit-plan was invoked with, assigned verbatim.\n# Not a glob: an assignment does not expand it, so the CLI would get the pattern itself.\nnode scripts\u002Fopenai-audit.mjs plan \"$PLAN_FILE\" --mode plan --out .audit\u002F$SID-r1-result.json 2>.audit\u002F$SID-r1-stderr.log\n```\n\n**Critical**: always pass `--mode plan`. Without it, Gemini in Step 6 can flag\nabsent implementations (the plan describes work that doesn't exist yet, which\nis by design for plan-audit).\n\n**Round 2+** — injects prior rulings as exclusions and suppresses re-raises against\nthe ledger:\n\n```bash\nnode scripts\u002Fopenai-audit.mjs plan \"$PLAN_FILE\" --mode plan --round 2 --ledger .audit\u002F$SID-ledger.json --out .audit\u002F$SID-r2-result.json 2>.audit\u002F$SID-r2-stderr.log\n```\n\nPlan audit is single-file — no `--passes`, `--diff`, or `--changed`. When\n`.requirements\u002Fledger.json` exists the prompt gets a `\u003Crequirements_rubric>`\nautomatically; no flag. Show a results card per round:\n`ROUND N PLAN AUDIT — \u003Cverdict> | H:x M:y L:z | Cost: ~$… | Top: [H1] …`.\n\n---\n\n## Step 3 — Triage (validity × scope × action)\n\nFor each finding, record three orthogonal judgements:\n\n| Dimension | Values | Meaning |\n|---|---|---|\n| **validity** | `valid` \u002F `invalid` \u002F `uncertain` | Is the concern real for THIS plan? |\n| **scope** | `in-scope` \u002F `out-of-scope` | Does it cite a section the plan owns? |\n| **action** | `fix-now` \u002F `defer` \u002F `dismiss` \u002F `rebut` | What happens next? |\n\n### Triage rules\n\n- `validity=invalid` → action MUST be `dismiss` or `rebut`\n- `validity=uncertain` → action MUST be `rebut` (GPT deliberation)\n- `validity=valid` + `scope=in-scope` + HIGH\u002FMEDIUM → `fix-now`\n- `validity=valid` + `scope=out-of-scope` + **load-bearing** → `fix-now` (fold into the plan)\n- `validity=valid` + `scope=out-of-scope` + **independent** → `defer` to \"Out of Scope (Future)\" plan section\n- `validity=valid` + `scope=in-scope` + LOW → operator choice\n\n**Scope is decided by impact, not ownership (load-bearing test).** \"The plan\ndoesn't own that section\" is NOT a defer pass. Ask: *does the success of this\nplan's design depend on the cited concern?* **Load-bearing** → fold the resolution\ninto the plan (or an explicit dependency note stating the assumption and how it is\nvalidated); **never silent-defer it**. **Independent** → defer. A `defer` must name\nthe independence in one sentence; if you can't write it truthfully, it's\nload-bearing. When the cited concern is in a module\u002Ftable the plan's design reads or\nwrites, independence needs the two-part answer (same column\u002Fconstraint? same\ntransaction instance?) → `references\u002Ftriage-rubrics.md` §Same-module independence.\n\n**Rubrics — apply each; full text in `references\u002Ftriage-rubrics.md`, read the section\nwhen its condition holds:**\n- **Grounding** — a non-trivial plan (≥6 files, ≥2 subsystems, a dependency chain, or\n  >1 sitting) whose §1 Code Trace lacks concrete `file:line` refs **and a call path** is\n  **HIGH `ungrounded-plan`**; spot-check each \"what exists today\" claim that drives a\n  design decision — a design built on a mis-described existing contract is HIGH; an unpinned `file:line`\n  is LOW (ask for `path:line (sha)`).\n- **Test-premise lint** — \"tests already cover X\" with no executed command + result\n  attached is a build-time spike, not evidence: flag it. Naming a source\u002Ffield must\n  also prove its semantics match the contract.\n- **Campaign** (plan header has `- **Mode**: campaign`) — run `node scripts\u002Fcampaign-contract-check.mjs \"$PLAN_FILE\"`;\n  each problem it prints is a HIGH finding; exit 2 means it did not run — say so, never read it as complete.\n  It proves presence only: judge each control's adequacy yourself.\n- **§11 clustering** (plan has the block) — check partition, coupling soundness,\n  fix-gate placement, contiguous ordering, derived scope; a malformed block that would\n  make `\u002Fcycle` build on un-audited coupled code is HIGH. `author-tier:` is advisory —\n  never a finding.\n\n### Tiered rebuttal\n\n| Severity | Deliberation |\n|---|---|\n| HIGH | ALWAYS send to GPT deliberation |\n| MEDIUM | ALWAYS send to GPT deliberation |\n| LOW | Claude decides locally |\n\nOnly send rebuttal if rebut HIGH or MEDIUM findings exist:\n\n```bash\nREBUTTAL_FILE=.claude\u002Ftmp\u002Frebuttal.md   # the rebuttal text you wrote for the disputed finding(s)\nnode scripts\u002Fopenai-audit.mjs rebuttal \"$PLAN_FILE\" \"$REBUTTAL_FILE\" --out .audit\u002F$SID-resolution.json 2>.audit\u002F$SID-rebuttal-stderr.log\n```\n\n### Convergence — early-stop on rigor pressure\n\n**Key on the ACCEPTANCE RATE, not the finding count.** `write-ledger-entries`\nprints it for the round you just triaged (`acceptance 92% (accepted 11 ·\ndismissed 1 · deferred 0)`):\n\n| Acceptance rate this round | Read |\n|---|---|\n| **≥ ~⅔ accepted as fix-now** | **PRODUCTIVE** — the round bought real corrections. Continue (within the cap). |\n| **≤ ~⅓** | **STOP** — you are dismissing\u002Fdeferring most of what arrives. That is rigor pressure by definition. |\n| in between | Decide on finding *character* (below), not on counts. |\n\nThe count is a **secondary backstop**, read with the rate (a rising HIGH count alone\nis not a stop signal — fixes create new surface; evidence in\n`references\u002Fconvergence-evidence.md`):\n\n| Condition | Action |\n|---|---|\n| HIGH count rising **and** acceptance rate low | **STOP** — the loop is manufacturing work |\n| HIGH count rising **and** acceptance rate high | Continue — the plan is gaining real surface |\n| HIGH count dropping | Continue (the classic converging case) |\n| R2+ findings push for v2 features, parser deps | **STOP** — record as \"Out of Scope\" |\n\n**Cap: 3 rounds, 5 absolute — enforced by `openai-audit.mjs`.** Round 4 exits\n`4` (`CAPPED`) with a structural-or-stop card: a stop for a human call, never a\nretry (`references\u002Fround-cap-and-structural-card.md`). At round 3 without\nconvergence run `node scripts\u002Faudit-structural-card.mjs --sid \"$SID\" --mode plan --plan \"$PLAN_FILE\"`\nand **present the card to the operator** with its three choices (STOP \u002F\nSTRUCTURAL \u002F CONTINUE); continuing is their call. An **implementation-completeness**\nfinding (\"specify the store step\") belongs to the code audit. Record the call\n(rounds, acceptance rate, card verdicts, why) in the plan's audit trail.\n\nWhen stopping with deferrals, append a `## Out of Scope (Future)` section to\nthe plan listing deferred concerns with rationale.\n\n**Step 6 (Gemini final review) is MANDATORY** after the last audit round,\nregardless of convergence. No-key degradation ladder (same as audit-code's\n`references\u002Fgemini-gate.md` — never a silent skip): Gemini → Claude Opus\nfallback → an **independent adversarial review agent** over the plan +\nfindings (record its verdict in the same APPROVE\u002FCONCERNS\u002FREJECT shape) →\nonly when none of those is available, output `FINAL_GATE_SKIPPED` and do\nnot claim full final-gate validation.\n\n---\n\n## Step 3.5 — Update Adjudication Ledger\n\nAfter each deliberation round, write ledger entries for every finding before\nStep 4 — the ledger drives R2+ rulings injection and suppression. Write the\n`--triage` file with an editor, never as a shell string (rationale prose has\napostrophes). Invocation + status semantics: `references\u002Fledger-format.md`.\n\n**Step 3.5b — record triage outcomes.** Cloud labels are automatic:\n`write-ledger-entries.mjs` labels the round it triaged, and each R2+ `openai-audit.mjs\nplan` re-checks the prior round. **Only if a `[finalize] WARN` line appeared**, run the\nmanual fallback in `references\u002Fconvergence-evidence.md` §Step 3.5b. `labelled: 0` with a\nnon-zero `total` is a failure, never a pass. **Every round, also** record dismissed\nscope-pressure findings into the LOCAL PlanFpTracker, so future plan audits suppress the\nrecurring ones:\n\n```bash\n# --outcomes = THIS round's finding ids and actions (the two below are an example only)\nnode scripts\u002Fwrite-plan-outcomes.mjs --result \".audit\u002F$SID-r$ROUND-result.json\" --outcomes '[{\"id\":\"M3\",\"action\":\"dismiss\"},{\"id\":\"H1\",\"action\":\"fix-now\"}]'\n```\n\n## Execution order\n\n**Wait for rebuttal BEFORE editing the plan**: rebuttal → response → ledger (3.5) →\nedit (Step 4) → re-audit (Step 5).\n\n---\n\n## Step 4 — Edit Plan\n\nPlans are single files — apply fixes via `Edit`. ALL HIGH must be addressed (fix or\ndefer-with-rationale). MEDIUM until ≤2 remain. LOW optional. Show a card:\n`EDITING PLAN — N findings | Fixed: a | Deferred to \"Out of Scope\": b | Dismissed: c`.\nAfter editing, update ledger entries to `remediationState: 'fixed'` for fixed items.\n\n## Step 5 — Verify and Loop (R2+)\n\nRe-audit with R2+ mode (Step 2) on the same plan path, passing `--round \u003CN>` and\n`--ledger .audit\u002F$SID-ledger.json`; track churn with `_hash` (resolved \u002F recurring \u002F\nnew). Stop per the convergence rule above (acceptance rate primary; 3 rounds\ndefault, 5 absolute).\n\n---\n\n## Step 6 — Gemini Independent Review (MANDATORY)\n\nRun the final reviewer — the newest Gemini Pro by default (`latest-pro`, resolved at runtime; override with `FINAL_REVIEW_MODEL`) as the final gate. Falls back to Claude Opus when\n`GEMINI_API_KEY` is absent.\n\n**Build the transcript first** — the reviewer reads a file no earlier step\nwrites. One command; never hand-assemble the JSON:\n\n```bash\nnode scripts\u002Fbuild-audit-transcript.mjs --sid $SID\n```\n\nIt folds every `.audit\u002F$SID-r\u003CN>-result.json` and `.audit\u002F$SID-ledger.json` into\n`.audit\u002F$SID-transcript.json` (mode inferred from the `audit-plan-` prefix).\n\n```bash\nRUN_ID=$(node -e \"const fs=require('fs'); try { process.stdout.write(JSON.parse(fs.readFileSync(process.argv[1],'utf8'))._cloudRunId||''); } catch (e) { process.stderr.write('RUN_ID: result artifact unreadable (' + e.message + ') - the verdict will NOT be written back'); }\" \".audit\u002F$SID-r$ROUND-result.json\")\nnode scripts\u002Fgemini-review.mjs review \"$PLAN_FILE\" .audit\u002F$SID-transcript.json --mode plan --round 1 --run-id \"$RUN_ID\" --out .audit\u002F$SID-gemini-result.json 2>.audit\u002F$SID-gemini-stderr.log\n```\n\n**`--mode plan` is as load-bearing here as it is in Step 2** (it defaults to `code`,\nwhich flags the absent implementations). **`--run-id` arms the `gemini_verdict`\nwrite-back** — omit it and the verdict is recorded nowhere (measurement in\n`references\u002Fconvergence-evidence.md`).\n\nAct on the result's code-computed `gateDisposition` (the `verdict` word is the\nreviewer's own): `approve` → done. `approve_with_debt` → done — every remaining\nfinding is `release_blocking: false`; record each (id, severity, one line) in\nthe plan's Remaining \u002F debt section (or `node scripts\u002Fdebt-auto-capture.mjs\n--final-review .audit\u002F$SID-gemini-result.json`); never ask the user to override\nit. `blocked` → deliberate on the named blocking items, edit the plan, re-run\nas round 2 with `--round 2 --prior .audit\u002F$SID-gemini-result.json --out\n.audit\u002F$SID-gemini-result-v2.json`.\n\n### Gemini round cap — **max 2 rounds** (symmetric with the GPT cap)\n\n**Hard cap: 2 Gemini rounds** — `gemini-review.mjs` refuses `--round 3`. After\nround 2, if the disposition is still `blocked`:\n\n| Round-2 finding character | Action |\n|---|---|\n| Concrete **design** defect (wrong contract, unsafe migration, dangling FK) | Fix it in the plan, then escalate to the user with the round-2 result — there is no third round |\n| **Implementation-completeness** (missing step, parameter placement, \"specify X\") | **STOP** — fold into the plan as captured items; hand off to `\u002Fcycle`'s **code** audit, which verifies them against real code (the right artifact) |\n| Rising **coherence\u002Fpraise** + 1 nit\u002Fround | **STOP** — diminishing returns; record the nit, close the gate |\n\nNever a third round for rigor pressure or implementation detail (why:\n`references\u002Fconvergence-evidence.md`). Record the stop decision (round count + why)\nin the plan's audit trail. Deliberation protocol and category-error handling:\n`references\u002Fgemini-gate.md`.\n\n---\n\n## UX Rules\n\nStatus card after every phase; summarise, never dump raw JSON; show every plan edit\nwith file + line; batch all user decisions into one prompt.\n\n---\n\n## Reference files\n\nThis skill's canonical flow is above. The files below cover specialised\nsituations — read them only when the trigger applies.\n\n| File | Summary | Read when |\n|---|---|---|\n| `references\u002Finput-acquisition.md` | Where a skill's arguments come from on any host, and what to do when there are none. | Reading $ARGUMENTS on a host that does not substitute it, or deciding what empty input means at a site. |\n| `references\u002Ftriage-rubrics.md` | Step 3 rubrics in full — impact-test detail, grounding, test-premise lint, and the §11 execution-clustering checks. | Step 3 — applying a rubric whose one-line form leaves the call borderline, OR ruling on same-module independence. |\n| `references\u002Fconvergence-evidence.md` | Why the stop rules are what they are — acceptance-rate evidence, Gemini-cap rationale, outcome-recording fallback. | Step 3\u002F6 — a stop decision is contested, OR a `[finalize] WARN` line appeared and Step 3.5b needs the manual fallback. |\n| `references\u002Fledger-format.md` | Adjudication ledger schema + writer invocation example for each finding outcome. | Step 3.5 — about to write ledger entries, OR diagnosing R2+ suppression misbehaviour. |\n| `references\u002Fgemini-gate.md` | Step 7 Gemini independent review protocol — transcript, verdict handling, re-review loop. | Step 6 starting, OR Gemini returned CONCERNS\u002FREJECT and need deliberation rules. |\n| `references\u002Fround-cap-and-structural-card.md` | Enforced GPT round cap (plan 3\u002F5, code 6\u002F8), exit 4 CAPPED, and the structural-or-stop card read at the cap. | A round exited 4, OR the audit reached round 3 without converging. |\n| `references\u002Fprerequisite-ladder.md` | Step 0 prerequisite ladder — absent helper bundle or auditor route, and reporting a run that did not happen. | Step 0 — a prerequisite did not resolve (helper scripts missing, no GPT route), OR about to report a run that degraded or did not happen. |\n| `references\u002Fverification-discipline.md` | Verification discipline — pinned citations, figure provenance, two-direction proof, attribution, consumer-side checks. | Step 3 — applying the grounding rubric to a plan whose Code Trace cites `file:line`. |\n| `references\u002Fworktree-preflight.md` | Worktree preflight remedy — the skills:hydrate npm script to add when a linked worktree lacks the tooling tree. | A command dies with `MODULE_NOT_FOUND` in a linked worktree AND this repo has no `skills:hydrate` script. |\n\n— end of \u002Faudit-plan —\n",{"name":5,"description":7},"main","6598878d5de2e58ba007c801042092e04d733e99",".claude\u002Fskills\u002Faudit-plan","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills","https:\u002F\u002Fgithub.com\u002FLbstrydom","Studying M.Sc Computer Science at Heriot Watt","2026-11-12 02:12:09",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add Lbstrydom\u002Fclaude-engineering-skills --skill audit-plan",{"tool":58,"command":59},"bunx","bunx skills add Lbstrydom\u002Fclaude-engineering-skills --skill audit-plan",{"tool":61,"command":62},"pnpm","pnpm dlx skills add Lbstrydom\u002Fclaude-engineering-skills --skill audit-plan","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002FSKILL.md",true,[66,72,76,80,84,88,92,96,100],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Fconvergence-evidence.md","REFERENCE","参考文档",3579,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Fconvergence-evidence.md",{"path":73,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":74,"sourceHtmlUrl":75},"references\u002Fgemini-gate.md",18929,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Fgemini-gate.md",{"path":77,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Finput-acquisition.md",4511,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Finput-acquisition.md",{"path":81,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fledger-format.md",9788,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Fledger-format.md",{"path":85,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fprerequisite-ladder.md",6277,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Fprerequisite-ladder.md",{"path":89,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fround-cap-and-structural-card.md",5400,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Fround-cap-and-structural-card.md",{"path":93,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Ftriage-rubrics.md",4713,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Ftriage-rubrics.md",{"path":97,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fverification-discipline.md",28340,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Fverification-discipline.md",{"path":101,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fworktree-preflight.md",3413,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-plan\u002Freferences\u002Fworktree-preflight.md",[105,123,134,153,167,201],{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":116,"publishedAt":40},"01M6J45X4FDB2AD5BGS4R4QY8X","stated-absent","Negative fixture — the contract's stated string never appears in this file.","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fgate-honesty\u002Fnegative\u002Fstated-absent\u002Fskills\u002Fstated-absent\u002FSKILL.md",[111],{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[117,118,119,120,121,122],"stated absent","STRING","contract","fixture","never","file",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":130,"publishedAt":40},"01M6J45TAX2PPHETZ5TJZG20QQ","nonexistent-implementation","Negative fixture — contract references an implementation file that does not exist.","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fgate-honesty\u002Fnegative\u002Fnonexistent-implementation\u002Fskills\u002Fnonexistent-implementation\u002FSKILL.md",[129],{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},[131,132,133,119,120,122],"implementation","nonexistent implementation","references",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":145,"publishedAt":40},"01M6J45P5GN52YFMZ81T7NN1VF","document-only-with-params","Negative fixture — a document-only gate illegally carries params (schema must refuse this fake-check pattern).","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fgate-honesty\u002Fnegative\u002Fdocument-only-with-params\u002Fskills\u002Fdocument-only-with-params\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[35,146,147,148,149,150,151,152,120],"document","with","document only with params","check","schema","gate","pattern",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":162,"publishedAt":40},"01M6J45J1CCZ7AXDGQKBA9VC8M","lying-skill","Fixture skill for the gate-honesty self-check — every gate here is deliberately dishonest.","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fgate-honesty\u002Flying-skill\u002Fskills\u002Flying-skill\u002FSKILL.md",[159],{"categoryNo":160,"categoryName":161,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000023","Skill与智能体开发",[163,149,151,164,165,120,166],"lying skill","fixture skill","self","for",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":182,"publishedAt":40},"01M6J45CW0DNN7K2W39E3PQHEY","visual-audit","Math-first, deterministic visual\u002Fpaint inspection — the 4th UX lens, complementing\npersona-test (journey), click-test (page), and nav-audit (system). Drives Playwright +\ncomputed styles + bounding boxes + CDP forced-pseudo-state to audit declared-token\nconformance, light\u002Fdark theme parity, layout physics, and affordance signifiers. A VLM\nis advisory-only and never gates. CI gate is drift-only on the changed contracted surface.\nTriggers on: \"visual audit\", \"check styling consistency\", \"theme parity\", \"dark mode parity\",\n\"design token drift\", \"paint audit\", \"button\u002Fcard consistency\", \"focus ring audit\",\n\"\u002Fvisual-audit\".","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002Fskills\u002Fvisual-audit\u002FSKILL.md",[173,176,179],{"categoryNo":174,"categoryName":175,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":177,"categoryName":178,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":180,"categoryName":181,"taxonomyType":114,"taxonomyTypeDesc":115},"01JBSEEDCAT000000000000032","设计师",[183,184,20,185,186,187,188,189,190,191,192,193,121,35,194,195,196,197,198,199,200],"visual audit","visual","mode","design token","click","inspection","lens","design","ci","persona","math","cdp","journey","drift","focus","physics","layout","card",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":205,"categories":206,"keywords":213,"publishedAt":40},"01M6J4569S40ZASFWW698CHBKP","ux-lock","Generate Playwright e2e specs. Two modes:\n  1. LOCK mode — pin a fix's DOM contract so it doesn't regress (default).\n  2. VERIFY mode — check that a \u002Fplan plan was actually implemented\n     by parsing its Acceptance Criteria section and driving the live URL.\nVERIFY mode grades a plan against a RUNNING app. To judge the plan document\nitself, before anything is built, that is \u002Faudit-plan.\nTriggers on: \"ux lock\", \"lock ux\", \"lock in the fix\", \"write regression spec\",\n\"generate e2e test for\", \"regression test for commit\", \"lock this fix\",\n\"verify the plan\", \"verify plan implementation\", \"check the plan was built\",\n\"audit frontend implementation\", \"did we ship the plan\".\nFull command syntax: see the Usage section in this skill.","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002Fskills\u002Fux-lock\u002FSKILL.md",[207,208,211,212],{"categoryNo":174,"categoryName":175,"taxonomyType":143,"taxonomyTypeDesc":144},{"categoryNo":209,"categoryName":210,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":180,"categoryName":181,"taxonomyType":114,"taxonomyTypeDesc":115},{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},[214,32,30,185,215,31,34,20,19,216,217,218,219,220,221,37,39,222,223,224,225],"ux lock","commit","regression","syntax","command","write","fix","e2e test","judge","URL","verify plan","frontend"]