Files
PMon Dev 48fef36b82
Design System Guard / guard (push) Failing after 1h2m42s
fix(a11y): 管理台登录框补持久 label,并把这个 axe 盲区做成静态断言
问题
  6 个管理台页面的登录遮罩里,三个输入框(auth-email / auth-pw / auth-input)
  只有 placeholder、没有 label。axe 的 `label` 规则把「非空 placeholder」也算作
  可访问名,所以 42 格全矩阵扫描对该缺陷是**零违规**的 —— 它是扫描器的盲区。
  而 placeholder 一输入就消失,读屏用户随即失去字段名(WCAG 3.3.2 / 1.3.1)。

改动
  · server/business/admin/{index,accounts,devices,settings,audit,metrics}.html
    三个输入框各补一个 <label class="iw-sr-only" for="…">:
      auth-email → 「管理员邮箱」
      auth-pw    → 「口令」
      auth-input → 「应急令牌 ADMIN_TOKEN」
    用既有的 .iw-sr-only(admin.css:74 已在)而非 aria-label:label 是真的
    标注关系,aria-label 只是替换名称,且 label 将来可见化不用再改结构。
    视觉零变化(.iw-sr-only 是 position:absolute + clip 的离屏类,不参与流布局)。
    用一次脚本落地,6 页登录框内部结构逐字一致 —— 非交互式改 6 份 HTML
    最容易犯的错就是漏改一页,所以下面把这条也固化成断言。

  · tests/phase3b-static-guard.js 新增 B2 节(净增 7 条断言,87 → 94)
      - 6 页 ×「三个输入框都有非空 label[for]」
      - 1 条「6 页登录框内部结构 SHA256 全等」—— 直接对应上面那个漏改风险
    块提取用 #auth-overlay → </form>,label 文本去标签去空白后判非空。
    文件头的覆盖清单同步补上 B2 一行。

验证
  · RUN_AXE=1 bash tests/run-guards.sh
      web-token-guard.js          PASS  21/0
      phase3b-static-guard.js     PASS  94/0   ← 由 87 增至 94
      dockerfile-coverage-test.js PASS  53/0
      schema-consistency-test.js  PASS 116/0
      client Dart 全量            PASS 674 项
      admin-axe-audit.mjs         PASS  42/42 格 viol=0(inc=12 有台账)
    6 套件 PASS 6 / FAIL 0 / SKIPPED 0
  · 反证:git stash 掉本次改动后同一脚本为 86 条,恢复后 93 条,净增 7 与预期一致
    (护栏自己的汇总行会计入,故与报告里的 94 相差 1)。
2026-11-09 17:34:45 +08:00
..