{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "frontend-visual-qa",
  "built": "2026-10-26",
  "control_level": 5,
  "control_level_label": "L5 严管",
  "capabilities": [
    "credential",
    "execute_command",
    "network",
    "write_file"
  ],
  "required_controls": {
    "agent": [
      "isolated_environment",
      "per_use_authorization"
    ],
    "admin": [
      "strict_authorization",
      "full_audit",
      "compliance_signoff"
    ]
  },
  "evidence": [
    {
      "file": "本地凭据 / 浏览器配置",
      "summary": "Reads user login cookies/sessions/keychains: --storage <playwright-storage-state.json>: Reads Playwright login state files from disk (including cookies/"
    },
    {
      "file": "scripts/",
      "summary": "Executes local scripts or commands: node scripts/visual_layout_audit.mjs (Main scanner: launches headless Chromium, injects auditPage"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: page.goto(--url) (visual_layout_audit.mjs) and subsequent subresource requests initiated by the page itself—limited strictly to the audited target origin"
    },
    {
      "file": "本地工作目录",
      "summary": "File I/O and artifact outputs: <outDir>/<viewport>.png and <outDir>/frontend-visual-qa-report.json (containing issues,"
    }
  ],
  "verification": {
    "method": "两遍独立侦查，均只读源码，不跑构建/测试/lint。第一遍：读全 SKILL.md（546 行）、scripts/ 三个脚本（2248 + 372 + 72 行，分段读）、tests/ 两个回归、references/ 七个文件的标题与开篇、evals/ 三份 JSON 与全部夹具 HTML，按 8 项框架（元数据 / 功能声明 / 实现原理 / 核心能力 / 特点 / 外部资源 / 内部工具代码 / 安全面）产出。第二遍：换角度重读关键证据找茬——① 用 grep 工具对 scripts/ 全量扫 token（fetch/HTTP 字面量/子进程/eval/凭证/写文件），逐条反查 external_deps 调用点是否真实存在；② 对安全结论找反例（未披露的网络调用、隐藏脚本、脱敏缺口、TLS 降级）；③ 逐个核对 auditPage 内声明的检测项是否真有对应的 push/计算，判断「实现原理」是否夸大；④ 用 find 做文件清单全量核对（含隐藏文件）并与 SKILL.md 的 Bundled Resources 对齐；⑤ 交叉核对仓库级元数据（LICENSE 在仓库根、.claude-plugin/marketplace.json 与 README 引用、daymade-skill/skill-creator 对 evals/ 的打包与回归策略、.github/workflows 是否接入本 skill 的 tests）。每条结论记进 second_pass 的 ok/discrepancy/unlocatable。",
    "second_pass": [
      {
        "item": "external_deps 逐条反查调用点是否真实存在",
        "status": "ok",
        "detail": "grep 工具全量扫 scripts/：Playwright 候选数组（playwright-core / playwright / @playwright/test）、findChrome 的 process.env.CHROME_PATH、page.goto(url, { waitUntil, timeout: 30_000 })、SKILL.md 的 node --test 四处均逐字定位到文件行；网络 token 扫描只命中两处——probe 的 route.fetch({ headers: requestHeaders, maxRedirects: 0 }) 与 visual_layout_audit.mjs 用法字符串里的 http://localhost:port/ 示例，无第三方端点，无 axios / XMLHttpRequest / WebSocket / child_process / new Function。"
      },
      {
        "item": "安全结论反例搜索：是否存在未披露的外发/降级/隐藏脚本",
        "status": "discrepancy",
        "detail": "主体结论（无第三方外发、无遥测、默认只读）成立，但发现两处 SKILL.md 未在安全语境点明的代码级能力：① probe 经 route.fetch 把 --header-env 提供的凭证以请求头形式发到目标 origin（值取自 process.env，不进 argv），文档只强调『argv 只含名字不含值』，未说『值会被转发给目标站』；② probe 有 --ignore-https-errors（ignoreHTTPSErrors: has('ignore-https-errors')），会关闭该上下文的 TLS 校验——SKILL.md 只在 sweep 段落自述『TLS stays enabled except for an explicitly trusted self-signed origin』，未提 probe 侧同一开关。两者都是显式 opt-in、需调用者自己写出 flag；未发现混淆内容、后门或隐藏脚本。"
      },
      {
        "item": "凭证读取与文件写入面逐条复核",
        "status": "ok",
        "detail": "credential_reads 三条、file_writes 三条均落到代码行：process.env[envName]（probe）、storageState: flag('storage') || undefined、findChrome 的 CHROME_PATH/PROGRAMFILES/LOCALAPPDATA；写入侧为 outDir（默认 os.tmpdir()/frontend-visual-qa-<ISO>-<pid>）、frontend-visual-qa-report.json、截图 PNG。脚本不读 cookie 数据库、不读 keychain、不读 .env，也无删除行为。"
      },
      {
        "item": "文件清单 glob 全量核对（含隐藏文件）",
        "status": "ok",
        "detail": "find -type f 得 24 个文件：SKILL.md 1 + scripts 3 + tests 2 + references 7 + evals/evals.json + evals/trigger-evals.json + evals/files 13（12 HTML + static-review.png）；find -name \".*\" 在 skill 目录内为空（无隐藏文件、无 .env、无嵌套仓库）。与 SKILL.md『Bundled Resources』清单一一对应，没有未列出的可执行文件。"
      },
      {
        "item": "『实现原理』是否夸大：功能声明 vs 实际代码能力",
        "status": "ok",
        "detail": "SKILL.md 称自带脚本为 'Playwright-powered mechanical viewport, layout, and media-state sweep with screenshots and JSON evidence'，代码确为 chromium.launch + 三档视口 + 截图 + JSON 报告；report.checked 列的七项（navigation status and final URL、effective viewport and meta viewport、page and section overflow、rendered text wrapping and clipping candidates、custom interactive-role focusability candidates、rendered image request/load state and aspect candidates、page-type contract heuristics）在 auditPage 内逐条可定位到具体计算与 push。反向也不夸大：脚本在 report.notChecked 里主动列出做不到的项（真实浏览器 chrome 与打印预览、下载/剪贴板/弹窗/原生对话框、键盘旅程与焦点外观、完整 WCAG、GIS 交互、主观 parity），自述边界严于对外宣称。"
      },
      {
        "item": "SKILL.md 关于『报告只写进唯一临时运行目录』的措辞与代码是否一致",
        "status": "discrepancy",
        "detail": "默认路径确实唯一（os.tmpdir()/frontend-visual-qa-<ISO 时间戳>-<pid>，且拒绝非空 outDir 以防陈旧证据），但 --out 允许任意路径，脚本层不限制它落在被审计项目内；SKILL.md 的『Do not mutate the audited project merely to run the sweep』只是提示词层约束，代码不强制。属措辞与实现的轻微落差，非缺陷。"
      },
      {
        "item": "注入面复核：被审计页面内容是否会进入可执行路径",
        "status": "ok",
        "detail": "四个注入浏览器的函数体全部来自 skill 自带文件（auditPage / collectAttentionInventory / primeVisibleMedia / collectScreenshotSections），页面内容只作为数据被 Range 测量、正则匹配、结构描述，不参与代码执行；无 eval、无 new Function、无 child_process，也没有把页面文本拼进 argv/shell 的路径（probe 的 --select 只交给 page.locator）。残余风险在模型侧（页面可埋针对审计 agent 的指令文本，本 skill 无过滤）与用户输入侧（--forbid/--require 正则无回溯上限）。"
      },
      {
        "item": "evals/ 的定位：是否确为自带评测夹具，能否在本地复跑出分数",
        "status": "ok",
        "detail": "evals/evals.json 是 21 条 prompt + expectations 的行为回归集（12 条带 fixture 文件），evals/trigger-evals.json 是 24 条 should_trigger 路由集（14 true / 10 false），schema 与仓库内 daymade-skill/skill-creator/references/eval_pipeline_schemas.md 一致，且 skill-creator 的打包逻辑默认排除 root evals/（自述 'excluded by default as a development asset'），与 SKILL.md 的『excluded from packaged runtime content』吻合。但 skill 目录内没有 runner/评分器，仓库 .github/workflows/ci.yml 与 benchmark.yml 也未引用本 skill 的 tests 或 evals（grep 无命中），因此这些用例目前只在手动执行时生效。"
      },
      {
        "item": "相邻 skill 的能力边界（SKILL.md 建议路由到 ui-designer / frontend-design / qa-expert）",
        "status": "unlocatable",
        "detail": "SKILL.md 的 Scope And Routing 要求按阶段改用 ui-designer、frontend-design 或 qa-expert，但这三者的边界定义不在 frontend-visual-qa 目录内；本次侦查限定给自己 skill 目录与必要仓库级取证，未跨目录展开，故不对其能力与重叠度下结论（待补）。"
      }
    ],
    "level": 2,
    "level_label": "V2 已复核",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247",
    "sha256": "48ff3a56b28549a234c64f9c2173df360597b7472e834b48ea053c2292aec44f",
    "reviewed_by": "skills-bayx-audit",
    "reviewed_at": "2026-10-25"
  },
  "assessed_at": "2026-10-25",
  "method_version": "2.0",
  "mirror": {
    "archive": "https://skillpub.pages.dev/r2/v/2026-09-15/frontend-visual-qa.tar.gz",
    "sha256": "48ff3a56b28549a234c64f9c2173df360597b7472e834b48ea053c2292aec44f",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247"
  },
  "original": {
    "github": "https://github.com/daymade/claude-code-skills/tree/main/frontend-visual-qa",
    "path": "frontend-visual-qa",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247"
  }
}