Design System Guard / guard (push) Failing after 1h2m42s
问题
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)。