[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J4189KES4PFCFDDWF9KTX4":3,"skill-same:01M6J4189KES4PFCFDDWF9KTX4":105},{"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":31,"publishedAt":53,"linkOnly":54,"markdownContent":55,"markdownBody":56,"frontMatter":57,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":14,"repositoryHtmlUrl":61,"repositoryHomepageUrl":6,"ownerHtmlUrl":62,"ownerBlogUrl":6,"ownerDescription":63,"updatedAt":64,"install":65,"resources":78},"01M6J4189KES4PFCFDDWF9KTX4","visual-audit",null,"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\".","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\u002Fvisual-audit\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"audit","visual audit","visual","inspection","design","design token","mode","lens","card","click","layout","physics","focus","drift","journey","cdp","only","never","math","persona","ci","2026-11-10 10:12:30",false,"---\nname: visual-audit\ndescription: |\n  Math-first, deterministic visual\u002Fpaint inspection — the 4th UX lens, complementing\n  persona-test (journey), click-test (page), and nav-audit (system). Drives Playwright +\n  computed styles + bounding boxes + CDP forced-pseudo-state to audit declared-token\n  conformance, light\u002Fdark theme parity, layout physics, and affordance signifiers. A VLM\n  is advisory-only and never gates. CI gate is drift-only on the changed contracted surface.\n  Triggers 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\".\n---\n\n# \u002Fvisual-audit — the visual\u002Fpaint inspection lens\n\nWhere **click-test** asserts semantic-HTML\u002FDOM contracts and **persona-test** does narrative\nQA, **visual-audit** asserts what the page *paints*: token conformance, theme parity, layout\nphysics, and affordance signifiers — deterministically, over computed-style evidence.\n\n> **The one rule that defines scope** (write it into every judgement):\n> **\"Include a check only if you can assert it on a computed style without knowing what the\n> page is FOR.\"** A focus ring's presence, a hover paint-delta, a disabled control's opacity —\n> all assertable blind. \"Is this the primary CTA?\" \u002F \"would a user know to click?\" require\n> intent → that's **persona-test**, not here.\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## Static-primary? No — verify-primary (read this first)\n\nPaint cannot be asserted without rendering. So unlike nav-audit (static-primary), visual-audit\nis **verify-primary**:\n\n- **Static run** (`\u002Fvisual-audit`, no URL) = parse the declared token sources into an\n  allowed-set + run the **source-coherence** lint (unreferenced \u002F undefined \u002F duplicate tokens).\n  It emits **no paint findings** and says so (a banner). This is honest, not a bug.\n- **`--verify \u003Curl>`** = where the four tiers actually run. All token\u002Ftheme\u002Flayout\u002Fsignifier\n  findings are live evidence.\n\n## A VLM can point, but computed evidence must convict\n\nThe assertion engine is pure math over `getComputedStyle` + `getBoundingClientRect` + CDP\nmatched\u002Fforced-pseudo-state. `--explain` (opt-in) may ask a VLM to *narrate* an already-found\nfinding; it creates zero findings and never touches the gate. Sending pixels requires the\nsecond flag `--allow-external-screenshot`.\n\n## The four tiers\n\n1. **Declared-token reconciliation** (spine). A rendered value on a contracted surface must be\n   on the declared scale OR set by a token-referencing declaration → else `token_violation`.\n   Token-less apps get an inferred-cluster fallback: **report-only, never gating**.\n2. **Theme parity** (light\u002Fdark). MUST-MATCH in-flow geometry (only for nodes rendered in\n   *both* themes — a `display:none`-in-one-theme element is intentional). MAY-DIFFER colors are\n   allowed when tokened; an untokened literal identical across themes → `theme_unmapped_token`.\n   Contrast is a byproduct over the resolved opaque backdrop → `contrast_failure`.\n3. **Layout physics**. `layout_overflow` \u002F `content_clipping` \u002F `unexpected_overlap` (excludes\n   ancestor-descendant containment) \u002F `image_distortion`.\n4. **Signifier matrix** (affordances via math). `missing_visible_focus` (any visible focus\n   indicator — outline OR ring OR border OR bg, ≥3:1) \u002F `state_has_no_visual_delta` (no hover\n   paint change) \u002F `disabled_not_signified`. Pseudo-states read via CDP `forcePseudoState`\n   (effective styles, no flaky mouse actuation), after freezing transitions\u002Fanimations.\n\n## Flow\n\n- **Phase 0 — Bootstrap** (first run): `visual-audit --bootstrap` writes a review-queue\n  `visual-contract.json`. Fill `surfaces[].sourceGlobs`, `tokenSources`, `themes`, then remove\n  the `_note`. See `references\u002Fcontract-and-bootstrap.md`.\n- **Phase 1 — Static**: `visual-audit [--scope diff|full]` extracts the allowed-set + emits the\n  observed envelope + source-coherence diagnostics. No browser.\n- **Phase 2 — Verify**: `visual-audit --verify \u003Curl> --device desktop,mobile --theme light,dark`\n  drives Chromium, runs the four tiers, writes the gitignored verify-result, renders the\n  scorecard + findings.\n- **Phase 3 — Gate** (CI): add `--gate`. Exits 1 only on a gate-eligible finding that survives\n  the canonical `ChangedScopeResolver` on the changed surface. See `references\u002Fci-gate-and-verify.md`.\n\n## CLI\n\n| Flag | Purpose |\n|---|---|\n| `--bootstrap [--from-url \u003Curl>] [--force]` | emit a review-queue `visual-contract.json` |\n| `--scope diff\\|full` | gate scope (default `diff` = changed contracted surface; `full` = whole contracted surface). Under `--gate`: `diff` blocks on findings whose surface's files changed; `full` blocks on every gate-eligible finding on a declared surface (both then filtered by the baseline) |\n| `--verify \u003Curl>` | live computed-style reconcile + the four tiers |\n| `--device \u003Ccsv>` | device presets, default `desktop,mobile` (`desktop\\|desktop-large\\|tablet\\|mobile\\|mobile-small`) |\n| `--theme \u003Ccsv>` | subset of contract themes to capture (default all; unknown name → exit 2, never a silent drop) |\n| `--full-dom [--full-dom-node-budget \u003Cn>]` | theme-safety v2: opt-in full-DOM contrast parity-delta sweep (verify-only — without `--verify` → exit 2; advisory, never gates; budget default 4000 emitted text candidates) |\n| `--storage-state \u003Cfile>` | Playwright storageState for auth |\n| `--gate` | drift-only CI exit (non-zero on a changed-surface gate-blocker NOT in the baseline) |\n| `--update-baseline` | snapshot today's gate-eligible findings into `visual-audit-baseline.json` (committed) so `--gate` then blocks only on NEW findings |\n| `--explain [--allow-external-screenshot]` | opt-in VLM narration (advisory; egress-guarded) |\n| `--out \u003Cfile>` \u002F `--format human\\|json` \u002F `--root \u003Cdir>` | output plumbing |\n\nExit codes: `0` clean\u002Fadvisory · `1` gate-blocking divergence (`--gate`) · `2` tool error ·\n`3` needs-bootstrap (no contract).\n\n## Distinct from the other lenses (don't absorb their scope)\n\n- touch-target **size** → click-test (it owns interaction mechanics; visual-audit owns paint).\n- semantic-HTML \u002F ARIA correctness → click-test \u002F nav-audit.\n- narrative affordance + CTA persuasiveness → persona-test.\n- nav reachability → nav-audit. plan\u002Fdesign intent → plan \u002F audit-code.\n- image attribute-presence lint → click-test; visual-audit owns only the *rendered* distortion.\n\n## Finding taxonomy (gate-eligible vs report-only)\n\n`token_violation`, `theme_geometry_drift`, `theme_unmapped_token`, `contrast_failure`,\n`layout_overflow`, `content_clipping`, `unexpected_overlap`, `image_distortion`,\n`missing_visible_focus`, `disabled_not_signified` are **gate-eligible**.\n`state_has_no_visual_delta`, `component_inconsistency`, `contrast_parity_delta`,\ninferred-cluster outliers, and the `token_unreferenced` \u002F `token_undefined_reference` \u002F\n`token_duplicate_definition` coherence diagnostics are **report-only**. Full rules:\n`references\u002Ffinding-taxonomy.md`.\n\n**Theme-safety (v1 + v2, advisory) — \"color that didn't adapt to dark mode\".** Three\n**report-only** classes. `interactive_color_unset` = the **static** lint (no browser): a\nform-control selector (`button`\u002F`select`\u002F`input`\u002F`textarea`\u002F`.btn*`) sets `background`\u002F`border`\nbut not `color`; runs in every static run (the `--gate` refusal is UNCHANGED — these are\nadvisory, not paint). `unadapted_text_color` = the **`--verify` single-render** check: the\nwinning `color` declaration's CDP origin is `user-agent` while an author sets a visible box\ncolor (background\u002Fborder). Origin-based (survives the `background` shorthand +\ninherited\u002Fcompanion author color); scope = native form controls only. `contrast_parity_delta`\n= the **v2 `--verify --full-dom`** check: a text node whose contrast **passes in one theme and\nfails in the other** (the XOR fingerprint of a non-adapting color — decorative low-contrast\nfails in *both* themes, so no delta). **Scope-disjoint by construction**: the gate-eligible\nabsolute `contrast_failure` sees contracted-surface nodes ONLY; the parity-delta sees the\nfull-DOM sweep's `scope:'fullDom'` nodes ONLY — never consolidate them, the split IS the\ndesign (the delta is what keeps a full-page sweep low-noise where absolute contrast would\ndrown). Full-DOM joins across themes use the un-truncated `livePath` (the depth-8 `nodeKey`\ncollides on repeated deep structures); capture honesty degrades to `unverified` on empty\nsweep \u002F all-ambiguous joins \u002F zero cross-theme joins \u002F partial device×theme matrix — never a\nsilent clean. Known capture limits: `TreeWalker` does not pierce shadow roots; the budget\nbounds *emitted text candidates* (default 4000, `truncated` stat on clip). NOTHING here gates —\ngate-promotion of all three classes and modal `activate`-reach remain v1.1\n(`docs\u002Fplans\u002Fvisual-audit-theme-safety-v1.md`; v2: `visual-audit-theme-safety-v2.md`).\n\n## Reference files\n\n| File | Summary | Read when |\n|---|---|---|\n| `references\u002Ftoken-extraction-and-adapters.md` | Token-source adapters (Tailwind\u002FCSS-vars\u002FJSON), allowed-set normalization, inferred-cluster fallback. | Adding\u002F​debugging a token source, or a value reconciles wrong. |\n| `references\u002Ffinding-taxonomy.md` | The 18 finding classes — severity, gate-eligibility, guards that prevent false positives. | Triaging a finding, or deciding if a check is in-scope. |\n| `references\u002Fcontract-and-bootstrap.md` | `visual-contract.json` schema + `--bootstrap` recipe, `data-visual-id` opt-in, theme-apply protocol. | Authoring\u002F​editing the contract, or theme capture misbehaves. |\n| `references\u002Fci-gate-and-verify.md` | Drift-only changed-surface gate, the `ChangedScopeResolver` rules, capture-honesty, exit codes. | Wiring CI, or a finding gates\u002F​doesn't-gate unexpectedly. |\n| `examples\u002Fexample-report.md` | A sample human + JSON visual-audit report for reference. | Want to see the output shape before running. |\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","# \u002Fvisual-audit — the visual\u002Fpaint inspection lens\n\nWhere **click-test** asserts semantic-HTML\u002FDOM contracts and **persona-test** does narrative\nQA, **visual-audit** asserts what the page *paints*: token conformance, theme parity, layout\nphysics, and affordance signifiers — deterministically, over computed-style evidence.\n\n> **The one rule that defines scope** (write it into every judgement):\n> **\"Include a check only if you can assert it on a computed style without knowing what the\n> page is FOR.\"** A focus ring's presence, a hover paint-delta, a disabled control's opacity —\n> all assertable blind. \"Is this the primary CTA?\" \u002F \"would a user know to click?\" require\n> intent → that's **persona-test**, not here.\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## Static-primary? No — verify-primary (read this first)\n\nPaint cannot be asserted without rendering. So unlike nav-audit (static-primary), visual-audit\nis **verify-primary**:\n\n- **Static run** (`\u002Fvisual-audit`, no URL) = parse the declared token sources into an\n  allowed-set + run the **source-coherence** lint (unreferenced \u002F undefined \u002F duplicate tokens).\n  It emits **no paint findings** and says so (a banner). This is honest, not a bug.\n- **`--verify \u003Curl>`** = where the four tiers actually run. All token\u002Ftheme\u002Flayout\u002Fsignifier\n  findings are live evidence.\n\n## A VLM can point, but computed evidence must convict\n\nThe assertion engine is pure math over `getComputedStyle` + `getBoundingClientRect` + CDP\nmatched\u002Fforced-pseudo-state. `--explain` (opt-in) may ask a VLM to *narrate* an already-found\nfinding; it creates zero findings and never touches the gate. Sending pixels requires the\nsecond flag `--allow-external-screenshot`.\n\n## The four tiers\n\n1. **Declared-token reconciliation** (spine). A rendered value on a contracted surface must be\n   on the declared scale OR set by a token-referencing declaration → else `token_violation`.\n   Token-less apps get an inferred-cluster fallback: **report-only, never gating**.\n2. **Theme parity** (light\u002Fdark). MUST-MATCH in-flow geometry (only for nodes rendered in\n   *both* themes — a `display:none`-in-one-theme element is intentional). MAY-DIFFER colors are\n   allowed when tokened; an untokened literal identical across themes → `theme_unmapped_token`.\n   Contrast is a byproduct over the resolved opaque backdrop → `contrast_failure`.\n3. **Layout physics**. `layout_overflow` \u002F `content_clipping` \u002F `unexpected_overlap` (excludes\n   ancestor-descendant containment) \u002F `image_distortion`.\n4. **Signifier matrix** (affordances via math). `missing_visible_focus` (any visible focus\n   indicator — outline OR ring OR border OR bg, ≥3:1) \u002F `state_has_no_visual_delta` (no hover\n   paint change) \u002F `disabled_not_signified`. Pseudo-states read via CDP `forcePseudoState`\n   (effective styles, no flaky mouse actuation), after freezing transitions\u002Fanimations.\n\n## Flow\n\n- **Phase 0 — Bootstrap** (first run): `visual-audit --bootstrap` writes a review-queue\n  `visual-contract.json`. Fill `surfaces[].sourceGlobs`, `tokenSources`, `themes`, then remove\n  the `_note`. See `references\u002Fcontract-and-bootstrap.md`.\n- **Phase 1 — Static**: `visual-audit [--scope diff|full]` extracts the allowed-set + emits the\n  observed envelope + source-coherence diagnostics. No browser.\n- **Phase 2 — Verify**: `visual-audit --verify \u003Curl> --device desktop,mobile --theme light,dark`\n  drives Chromium, runs the four tiers, writes the gitignored verify-result, renders the\n  scorecard + findings.\n- **Phase 3 — Gate** (CI): add `--gate`. Exits 1 only on a gate-eligible finding that survives\n  the canonical `ChangedScopeResolver` on the changed surface. See `references\u002Fci-gate-and-verify.md`.\n\n## CLI\n\n| Flag | Purpose |\n|---|---|\n| `--bootstrap [--from-url \u003Curl>] [--force]` | emit a review-queue `visual-contract.json` |\n| `--scope diff\\|full` | gate scope (default `diff` = changed contracted surface; `full` = whole contracted surface). Under `--gate`: `diff` blocks on findings whose surface's files changed; `full` blocks on every gate-eligible finding on a declared surface (both then filtered by the baseline) |\n| `--verify \u003Curl>` | live computed-style reconcile + the four tiers |\n| `--device \u003Ccsv>` | device presets, default `desktop,mobile` (`desktop\\|desktop-large\\|tablet\\|mobile\\|mobile-small`) |\n| `--theme \u003Ccsv>` | subset of contract themes to capture (default all; unknown name → exit 2, never a silent drop) |\n| `--full-dom [--full-dom-node-budget \u003Cn>]` | theme-safety v2: opt-in full-DOM contrast parity-delta sweep (verify-only — without `--verify` → exit 2; advisory, never gates; budget default 4000 emitted text candidates) |\n| `--storage-state \u003Cfile>` | Playwright storageState for auth |\n| `--gate` | drift-only CI exit (non-zero on a changed-surface gate-blocker NOT in the baseline) |\n| `--update-baseline` | snapshot today's gate-eligible findings into `visual-audit-baseline.json` (committed) so `--gate` then blocks only on NEW findings |\n| `--explain [--allow-external-screenshot]` | opt-in VLM narration (advisory; egress-guarded) |\n| `--out \u003Cfile>` \u002F `--format human\\|json` \u002F `--root \u003Cdir>` | output plumbing |\n\nExit codes: `0` clean\u002Fadvisory · `1` gate-blocking divergence (`--gate`) · `2` tool error ·\n`3` needs-bootstrap (no contract).\n\n## Distinct from the other lenses (don't absorb their scope)\n\n- touch-target **size** → click-test (it owns interaction mechanics; visual-audit owns paint).\n- semantic-HTML \u002F ARIA correctness → click-test \u002F nav-audit.\n- narrative affordance + CTA persuasiveness → persona-test.\n- nav reachability → nav-audit. plan\u002Fdesign intent → plan \u002F audit-code.\n- image attribute-presence lint → click-test; visual-audit owns only the *rendered* distortion.\n\n## Finding taxonomy (gate-eligible vs report-only)\n\n`token_violation`, `theme_geometry_drift`, `theme_unmapped_token`, `contrast_failure`,\n`layout_overflow`, `content_clipping`, `unexpected_overlap`, `image_distortion`,\n`missing_visible_focus`, `disabled_not_signified` are **gate-eligible**.\n`state_has_no_visual_delta`, `component_inconsistency`, `contrast_parity_delta`,\ninferred-cluster outliers, and the `token_unreferenced` \u002F `token_undefined_reference` \u002F\n`token_duplicate_definition` coherence diagnostics are **report-only**. Full rules:\n`references\u002Ffinding-taxonomy.md`.\n\n**Theme-safety (v1 + v2, advisory) — \"color that didn't adapt to dark mode\".** Three\n**report-only** classes. `interactive_color_unset` = the **static** lint (no browser): a\nform-control selector (`button`\u002F`select`\u002F`input`\u002F`textarea`\u002F`.btn*`) sets `background`\u002F`border`\nbut not `color`; runs in every static run (the `--gate` refusal is UNCHANGED — these are\nadvisory, not paint). `unadapted_text_color` = the **`--verify` single-render** check: the\nwinning `color` declaration's CDP origin is `user-agent` while an author sets a visible box\ncolor (background\u002Fborder). Origin-based (survives the `background` shorthand +\ninherited\u002Fcompanion author color); scope = native form controls only. `contrast_parity_delta`\n= the **v2 `--verify --full-dom`** check: a text node whose contrast **passes in one theme and\nfails in the other** (the XOR fingerprint of a non-adapting color — decorative low-contrast\nfails in *both* themes, so no delta). **Scope-disjoint by construction**: the gate-eligible\nabsolute `contrast_failure` sees contracted-surface nodes ONLY; the parity-delta sees the\nfull-DOM sweep's `scope:'fullDom'` nodes ONLY — never consolidate them, the split IS the\ndesign (the delta is what keeps a full-page sweep low-noise where absolute contrast would\ndrown). Full-DOM joins across themes use the un-truncated `livePath` (the depth-8 `nodeKey`\ncollides on repeated deep structures); capture honesty degrades to `unverified` on empty\nsweep \u002F all-ambiguous joins \u002F zero cross-theme joins \u002F partial device×theme matrix — never a\nsilent clean. Known capture limits: `TreeWalker` does not pierce shadow roots; the budget\nbounds *emitted text candidates* (default 4000, `truncated` stat on clip). NOTHING here gates —\ngate-promotion of all three classes and modal `activate`-reach remain v1.1\n(`docs\u002Fplans\u002Fvisual-audit-theme-safety-v1.md`; v2: `visual-audit-theme-safety-v2.md`).\n\n## Reference files\n\n| File | Summary | Read when |\n|---|---|---|\n| `references\u002Ftoken-extraction-and-adapters.md` | Token-source adapters (Tailwind\u002FCSS-vars\u002FJSON), allowed-set normalization, inferred-cluster fallback. | Adding\u002F​debugging a token source, or a value reconciles wrong. |\n| `references\u002Ffinding-taxonomy.md` | The 18 finding classes — severity, gate-eligibility, guards that prevent false positives. | Triaging a finding, or deciding if a check is in-scope. |\n| `references\u002Fcontract-and-bootstrap.md` | `visual-contract.json` schema + `--bootstrap` recipe, `data-visual-id` opt-in, theme-apply protocol. | Authoring\u002F​editing the contract, or theme capture misbehaves. |\n| `references\u002Fci-gate-and-verify.md` | Drift-only changed-surface gate, the `ChangedScopeResolver` rules, capture-honesty, exit codes. | Wiring CI, or a finding gates\u002F​doesn't-gate unexpectedly. |\n| `examples\u002Fexample-report.md` | A sample human + JSON visual-audit report for reference. | Want to see the output shape before running. |\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",{"name":5,"description":7},"main","938efbef34b7c76f0d112f336d1ac4018224d186",".claude\u002Fskills\u002Fvisual-audit","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":66,"prompt":76,"zipAvailable":77},[67,70,73],{"tool":68,"command":69},"npx","npx skills add Lbstrydom\u002Fclaude-engineering-skills --skill visual-audit",{"tool":71,"command":72},"bunx","bunx skills add Lbstrydom\u002Fclaude-engineering-skills --skill visual-audit",{"tool":74,"command":75},"pnpm","pnpm dlx skills add Lbstrydom\u002Fclaude-engineering-skills --skill visual-audit","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvisual-audit\u002FSKILL.md",true,[79,85,89,93,97,101],{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"examples\u002Fexample-report.md","REFERENCE","参考文档",2368,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvisual-audit\u002Fexamples\u002Fexample-report.md",{"path":86,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fci-gate-and-verify.md",8673,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvisual-audit\u002Freferences\u002Fci-gate-and-verify.md",{"path":90,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fcontract-and-bootstrap.md",3792,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvisual-audit\u002Freferences\u002Fcontract-and-bootstrap.md",{"path":94,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Ffinding-taxonomy.md",4434,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvisual-audit\u002Freferences\u002Ffinding-taxonomy.md",{"path":98,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Ftoken-extraction-and-adapters.md",3449,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvisual-audit\u002Freferences\u002Ftoken-extraction-and-adapters.md",{"path":102,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Fworktree-preflight.md",3413,"https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvisual-audit\u002Freferences\u002Fworktree-preflight.md",[106,121,132,149,163,171],{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":115,"publishedAt":53},"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",[112],{"categoryNo":113,"categoryName":114,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000037","律师与法务",[116,117,118,119,49,120],"stated absent","STRING","contract","fixture","file",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":128,"publishedAt":53},"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",[127],{"categoryNo":113,"categoryName":114,"taxonomyType":29,"taxonomyTypeDesc":30},[129,130,131,118,119,120],"implementation","nonexistent implementation","references",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":141,"publishedAt":53},"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",[138],{"categoryNo":139,"categoryName":140,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",[48,142,143,144,145,146,147,148,119],"document","with","document only with params","check","schema","gate","pattern",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":158,"publishedAt":53},"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",[155],{"categoryNo":156,"categoryName":157,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[159,145,147,160,161,119,162],"lying skill","fixture skill","self","for",{"skillNo":164,"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":165,"categories":166,"keywords":170,"publishedAt":53},"01M6J45CW0DNN7K2W39E3PQHEY","https:\u002F\u002Fgithub.com\u002FLbstrydom\u002Fclaude-engineering-skills\u002Fblob\u002Fmain\u002Fskills\u002Fvisual-audit\u002FSKILL.md",[167,168,169],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[33,34,32,38,37,41,35,39,36,52,51,50,49,48,47,46,45,44,43,42,40],{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":183,"publishedAt":53},"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",[177,178,181,182],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":179,"categoryName":180,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},{"categoryNo":113,"categoryName":114,"taxonomyType":29,"taxonomyTypeDesc":30},[184,185,186,38,187,188,189,32,190,191,192,193,194,195,196,197,198,199,200,201,202],"ux lock","lock","ux","commit","generate","acceptance","plan","regression","syntax","command","write","fix","e2e test","default","app","judge","URL","verify plan","frontend"]