前 6 篇案例文揭露 6 個跨公約結構性發現:政府文件中身障女性受暴 0 段、合理調整 7 段、身障原住民全 0。但本平台若只批評政府不檢視自己,就只是另一份「沒人主張」的論述。所以我們對自己跑同一套量化工具,把連結品質當成第 7 個指標。Wave 162 baseline:88 個 dead_anchor。Wave 165 後:50。
為何要做平台自審?
跨公約共構平台的核心倡議是:政府的沉默可被量化。但這個主張只有在我們自己的工具不沉默時才成立。如果三平台首頁有 88 個失靈的內部連結,我們指責政府文件邏輯斷裂的姿勢就站不住腳。
我們對政府要求 disability-disaggregated 統計、跨公約 List of Issues 互相引用、CRC GC-22 §32-34 條文落實 — 這些都要求政府在論述精度上達標。如果我們自己的論述精度(broken links、dead anchors、stale subdomains)沒有同樣標準,批評就缺乏正當性。
怎麼做的?
Wave 160-166 期間,我們建構了一個 150 行的 Python 腳本(link_audit.py)做整個 _public/ 的全文掃描:
- 解析所有
href屬性,找相對連結與內部連結 - 解析所有
id屬性,建構 file → ids 對照 - 對每個連結:目標檔存在嗎?#anchor 真的存在於目標檔?
- 分四類:broken_target(連結指不存在檔)/ dead_anchor(#xxx 指不存在的 id)/ stale_subdomain(過時域名)/ platform_root_absolute(/foo 絕對路徑只在 canonical 部署可用)
結果輸出 JSON history(每月一筆 snapshot),自動 render 成 QA · Link Audit Dashboard。每月 1 號跑 run_monthly_pipeline.sh 第 [5/5] 步自動更新。
Baseline → 50 的三個關鍵 fix
CRPD 102 頁加 id="main"
102 個 CRPD 子頁面有 href="#main" 無障礙 skip-link,但 <main> 元素未加 id="main"。鍵盤使用者按 Tab 跳到 skip 後焦點落空。
Fix: sed 把 <main> → <main id="main">
移除 CEDAW templates/_layout_pi.html
build template 不該被部署(GH Pages 會 skip _ 前綴檔反正 404)。template 內含 dead anchor 但實際不對外。
Fix: git rm 之
CEDAW index.html 加 4 個 invisible anchor
19 個 PI 詳細頁 footer 連 ../index.html#axis3 與 #axis4,但 index.html 沒有對應 id。
Fix: 加 <a id="axis3" style="position:absolute;left:-9999px;"> 等 4 個 invisible 元素
三個 fix 合計從 88 降到 50。剩下的 50 主要是 CRC 平台 crc-articles.html#PI-XX(crc-articles 用 JS 動態載入 PI 資料,沒有 static id),屬結構性議題,需要 JS 路由器才能修。
從工具到 KPI:第 7 個 indicator 加入月度追蹤
Wave 166 把 dead_anchor 從一個內部 audit 升格為 monthly-tracker 的第 7 個指標:
🩺 平台健康 · dead_anchor:baseline 50 → target 0(2027-Q1)
這個指標 inverted(lower 越好),從 link_audit.json 自動讀。任何新引入 broken anchor 的 commit 會立即在 dashboard 顯示「平台健康下滑」 — 形成自我規範。
三層意義
1. 信譽信號
NGO 監督 NGO,UN reviewer 評估 NGO 的證據可信度。一個量化政府文件失語但自身連結 50% broken 的平台,信譽折半。把自審當第 7 個指標公開上線,等於告訴讀者:「我們的數字也接受同樣標準的檢驗」。
2. 工程紀律
每月一次的 audit 確保未來新加頁面 / 新 wave 不引入 regression。link_audit.py 整合進 run_monthly_pipeline.sh 第 [5/5] 步,跟 6 結構性發現 indicator 一起更新。
3. 範例給其他 NGO
DEVELOPER_GUIDE.md 引導其他想複製本架構的 NGO,也應一併套用 link_audit。從 day 1 就把自審當 first-class citizen,而非事後補。
結語:沉默是雙向的
政府的沉默是 0 段政府文件,我們的沉默是 88 個失靈連結。兩者都可被量化、可被追蹤、可被問責。差別只在誰先承認。
我們先承認 88,然後降到 50,目標 0。政府呢?
broken_target(連到不存在的檔案)。CRC 平台 14 個 timeline 頁面引用 ../../data/sources/*.md 和 ../../data/advocacy_actions/*.md,但這些檔案在母 repo 而非部署的 _public/ sub-repo。broken_target 從 3,624 降到 67(98% 修復)。三步修法:(1) 把 data/sources/*.md + data/advocacy_actions/*.md 鏡像到 _public/(380 KB,42 檔)(2) 修 render_timeline.py 的相對路徑邏輯 (3) 對不存在的 source 改顯示「📄 原始檔(待補)」灰字而非 <a>。三平台總 issues:3,713 → 156(96% 修復)。同樣的標準對自己,先承認再修復。
crc-articles.html 與 chain.html 各加 14 個 PI-XX 隱形錨點 + 一個小型 hash router(JS),把 dead_anchor 也降到 0。第 7 項指標原訂 2027-Q1 達標,實際 2026-05-06 達成 — 提前 9 個月。三平台總 issues 156 → 10(94% 修復,僅剩 broken_target 10 個小範圍佔位)。意義:當量化標準對外公開、被讀者監督,自我約束的速度就會加快。「先承認 88,然後降到 50」是文初的承諾,Wave 171 把它兌現到 0。政府呢?
sources/ 與 advocacy_actions/ 加 index 瀏覽頁、把 4 個 placeholder 連結改成「(待補)」灰字標籤。四個類別三平台合計 0 個 issue — broken_target / dead_anchor / stale_subdomain / platform_root_absolute 全清零。從 Wave 162 baseline 3,751 到 Wave 176 的 0,跨 14 個 wave。雙重承擔:不僅該量化的東西被公開,連自己尚未公開的盲點被讀者發現之後,也要承認、要修。
W177 baseline:921 個 HTML 中只有 20 個全綠(2.2%),共 27,084 個 findings。W178 修 218 C7(
<html> 缺 lang)+ 31 C6(缺 skip-link)→ 兩個結構性類別歸零。W179 兩階段:第一階段重寫 C1 audit 邏輯 — 之前是 element-agnostic 比對(每個 color:#fff 都跟 body 背景配對,白字按鈕被誤判),改為 scope-aware(同一 CSS rule 或 inline-style 內才配對)→ 26,866 → 157(99.4% 是稽核工具的 false positive)。第二階段做真實調色 — 把 8 種低對比 badge 背景色(#C68822 / #E65100 / #2FA598 等)替換為 WCAG-AA-safe 變體(#8E5A0E / #B5371F / #1F6F66 等),覆蓋 217 檔的 inline + <style> blocks → 157 → 55。W180:批次把 body font-size < 16px 全部 bump 到 16px(kids/* 18px),涵蓋 295 檔 → C2 也歸零。三平台 924/924 全綠(100%)。WCAG 2.1 AA 自審 KPI 在 4 個 wave 內從 27,084 收斂到 0。
結算 · 兩條自審 KPI 並列收斂:
- link_audit:W162-W176 / 14 wave / 3,751 → 0
- WCAG 2.1 AA:W177-W180 / 4 wave / 27,084 → 0
本文以 CC BY 4.0 授權釋出,自由轉載 / 改編,需註明出處。引用建議格式:
三公約共構平台。(2026-05-06)。〈監督政府的平台,如何監督自己?〉。網址:cedaw.taiwanmommies.org/blog/2026-05-06-platform-self-audit.html