human-product · Stage 3
人間中心設計で静的サイトの利用可能性を監査する
キーボード、200%ズーム、読み上げ順、ユーザビリティを観測し、標準への適合と人が使えることを区別した監査記録を作る。
到達目標
WCAG 2.2 Level AAを基準に、キーボード、200%ズーム、読み上げ順を再現可能に監査できる
- キーボード、ズーム、読み上げ、ユーザビリティの監査記録
- 標準の地位、観測限界、手動確認を含む監査判断
適合確認とISO 9241-210:2019に基づく利用者タスクの評価を区別できる
- キーボード、ズーム、読み上げ、ユーザビリティの監査記録
- 適合、アクセシビリティ、ユーザビリティの境界を説明する5分発表
WCAG 3.0 Working DraftとAPCAをWCAG 2.2適合主張へ混同せず、入力方式を変えて再評価できる
- 標準の地位、観測限界、手動確認を含む監査判断
- 入力方式だけを変えた再監査の差分と不変条件
能力の進行
recognize
WCAG 2.2 Level AA、WCAG-EM、ISO 9241-210:2019の役割を区別できる
証拠: キーボード、ズーム、読み上げ、ユーザビリティの監査記録
explain
自動検査合格が読み上げ順や利用者タスクの成功を保証しない理由を説明できる
証拠: 適合、アクセシビリティ、ユーザビリティの境界を説明する5分発表
apply
固定fixtureでkeyboard、200% zoom、reading order、usabilityを観測できる
証拠: キーボード、ズーム、読み上げ、ユーザビリティの監査記録
diagnose
失敗を知覚、操作、理解、堅牢性、利用者タスクへ切り分け、反証を残せる
証拠: 標準の地位、観測限界、手動確認を含む監査判断
lead
適合範囲、手動確認、残余リスク、再評価条件を関係者と合意できる
証拠: 入力方式だけを変えた再監査の差分と不変条件
なぜ重要か
生成サイトが表示できても、keyboardだけでは到達できない、200% zoomで内容が欠ける、reading orderが意味順と一致しない、目的のタスクを完了できないことがある。品質を「自分の環境で見えた」から利用者が検証できる契約へ変えるには、入力、期待、実測、判定、限界を監査記録へ残す必要がある。
このレッスンの規範的targetはWCAG 2.2 Level AAである。WCAG-EM 1.0を評価手順、ISO 9241-210:2019を人間中心設計とusabilityの枠組みに使う。WCAG 3.0はWorking Draftであり、APCAとともにWCAG 2.2適合の規範ではない。
メンタルモデル
監査を「基準を選ぶ、範囲を固定する、期待を操作可能なcheckへ落とす、実測する、差分を修正へ結ぶ」の循環として扱う。規範へのconformanceと、特定の人が目的を達成できるusabilityは重なるが同義ではない。
一つのcheckは、対象、操作、期待、actual、passed、証拠を持つ。failedを消すのではなく、利用者影響、修正、再試験へ追跡する。入力方式だけを変えるtransferでは、ページと期待結果を固定し、どのcheckが変わるかを観測する。
注記
図を読む際の補足情報です。
- Scope:
- Target:
- Observe:
- Review:
- Claim:
限定した監査scopeから、適合結果と利用者taskの結果を混同せずにどう報告するか。
- Scope
- ページfixture、利用者、入力方式、環境、除外を固定する。
- Scope → Target: 対象を固定
- Target
- WCAG 2.2 Level AAの規範的targetと版を記録する。
- Target → Observe: 規範期待値を適用
- Observe
- keyboard、200% zoom、reading order、usabilityを期待値と比較する。
- Observe → Viewport wide checklist: wide viewportを監査
- Observe → Viewport narrow checklist: narrow viewportを監査
- Observe → Review: 自動結果と手動観測を渡す
- Viewport wide checklist
- 1280pxで内容、操作、focus indicatorの欠落と重なりがないか確認する。
- Viewport wide checklist → Focus heading checklist: 見出しfocusを確認
- Viewport wide checklist → Focus control checklist: control focusを確認
- Viewport wide checklist → Focus reset checklist: reset focusを確認
- Viewport narrow checklist
- 320pxと400% zoomで一方向reflow、折返し、操作到達性を確認する。
- Viewport narrow checklist → Focus heading checklist: 見出しfocusを確認
- Viewport narrow checklist → Focus control checklist: control focusを確認
- Viewport narrow checklist → Focus reset checklist: reset focusを確認
- Focus heading checklist
- 文書先頭から見出しまでのreading orderと意味順を確認する。
- Focus heading checklist → Motion standard checklist: standard motionを確認
- Focus heading checklist → Motion reduced checklist: reduced motionを確認
- Focus control checklist
- 見出しから操作controlへ文書順で到達し、focusが可視か確認する。
- Focus control checklist → Motion standard checklist: standard motionを確認
- Focus control checklist → Motion reduced checklist: reduced motionを確認
- Focus reset checklist
- resetへ到達でき、実行後もfocus orderと初期状態が保たれるか確認する。
- Focus reset checklist → Motion standard checklist: standard motionを確認
- Focus reset checklist → Motion reduced checklist: reduced motionを確認
- Motion standard checklist
- 動きだけに依存せずcurrent stepと結果が可視textでも伝わるか確認する。
- Motion reduced checklist
- prefers-reduced-motionでautoplayを止め、manual navigationとresetを確認する。
- Review
- 自動化で判定できない意味、順序、タスク成功を人が確認する。
- Review → Claim: 証拠の限界を含める
- Claim
- 合否、未確認、残余リスクを分け、範囲を限定して報告する。
scope、規範target、観測、人手review、限定claimの順序と、WCAG 3.0 Working DraftをWCAG 2.2適合根拠にしない境界を説明できる。
| パラメータ | 選択肢 | 既定値 |
|---|---|---|
| viewport | wide 1280px、viewport=320px | wide |
| focus step | 見出し、操作control、reset | heading |
| motion preference | standard、prefers-reduced-motion: reduce | standard |
- 監査開始: 監査lensでありviewportや支援技術のエミュレータではありません。実ブラウザと支援技術で確認が必要。; 条件 常時; node
scope; edge なし - wide・見出し・standard: wideで見出しのfocus orderとstandard motionの可視textを監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=heading、motion-preference=standard、viewport=wide; nodeviewport-wide、focus-heading、motion-standard; edgechecklist-observe-wide、checklist-wide-heading、checklist-heading-standard - wide・control・standard: wideでcontrolのfocus orderとstandard motionの可視textを監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=control、motion-preference=standard、viewport=wide; nodeviewport-wide、focus-control、motion-standard; edgechecklist-observe-wide、checklist-wide-control、checklist-control-standard - wide・reset・standard: wideでresetのfocus orderとstandard motionの状態復元を監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=reset、motion-preference=standard、viewport=wide; nodeviewport-wide、focus-reset、motion-standard; edgechecklist-observe-wide、checklist-wide-reset、checklist-reset-standard - wide・見出し・reduced: wideで見出しのfocus orderとreduced motionの手動操作を監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=heading、motion-preference=reduced、viewport=wide; nodeviewport-wide、focus-heading、motion-reduced; edgechecklist-observe-wide、checklist-wide-heading、checklist-heading-reduced - wide・control・reduced: wideでcontrolのfocus orderとreduced motionの手動操作を監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=control、motion-preference=reduced、viewport=wide; nodeviewport-wide、focus-control、motion-reduced; edgechecklist-observe-wide、checklist-wide-control、checklist-control-reduced - wide・reset・reduced: wideでresetのfocus orderとreduced motionのmanual navigationを監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=reset、motion-preference=reduced、viewport=wide; nodeviewport-wide、focus-reset、motion-reduced; edgechecklist-observe-wide、checklist-wide-reset、checklist-reset-reduced - narrow・見出し・standard: 320px reflowで見出しのfocus orderとstandard motionを監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=heading、motion-preference=standard、viewport=narrow; nodeviewport-narrow、focus-heading、motion-standard; edgechecklist-observe-narrow、checklist-narrow-heading、checklist-heading-standard - narrow・control・standard: 320px reflowでcontrolのkeyboard focusとstandard motionを監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=control、motion-preference=standard、viewport=narrow; nodeviewport-narrow、focus-control、motion-standard; edgechecklist-observe-narrow、checklist-narrow-control、checklist-control-standard - narrow・reset・standard: 320px reflowでreset到達とstandard motionの状態復元を監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=reset、motion-preference=standard、viewport=narrow; nodeviewport-narrow、focus-reset、motion-standard; edgechecklist-observe-narrow、checklist-narrow-reset、checklist-reset-standard - narrow・見出し・reduced: 320px reflowで見出しとreduced motionのmanual navigationを監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=heading、motion-preference=reduced、viewport=narrow; nodeviewport-narrow、focus-heading、motion-reduced; edgechecklist-observe-narrow、checklist-narrow-heading、checklist-heading-reduced - narrow・control・reduced: 320px reflowでcontrol focusとreduced motionの手動操作を監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=control、motion-preference=reduced、viewport=narrow; nodeviewport-narrow、focus-control、motion-reduced; edgechecklist-observe-narrow、checklist-narrow-control、checklist-control-reduced - narrow・reset・reduced: 320px reflowでresetとreduced motionのmanual navigationを監査する。実ブラウザと支援技術で確認が必要。; 条件
focus-step=reset、motion-preference=reduced、viewport=narrow; nodeviewport-narrow、focus-reset、motion-reduced; edgechecklist-observe-narrow、checklist-narrow-reset、checklist-reset-reduced
| イベント | 開始 | 終了 | 条件 |
|---|---|---|---|
| parameter-change | audit-start | wide-heading-motion | focus-step=heading、motion-preference=standard、viewport=wide |
| parameter-change | audit-start | wide-control-motion | focus-step=control、motion-preference=standard、viewport=wide |
| parameter-change | audit-start | wide-reset-motion | focus-step=reset、motion-preference=standard、viewport=wide |
| parameter-change | audit-start | wide-heading-reduced | focus-step=heading、motion-preference=reduced、viewport=wide |
| parameter-change | audit-start | wide-control-reduced | focus-step=control、motion-preference=reduced、viewport=wide |
| parameter-change | audit-start | reduced-motion | focus-step=reset、motion-preference=reduced、viewport=wide |
| parameter-change | audit-start | narrow-viewport | focus-step=heading、motion-preference=standard、viewport=narrow |
| parameter-change | audit-start | keyboard-focus | focus-step=control、motion-preference=standard、viewport=narrow |
| parameter-change | audit-start | narrow-reset-motion | focus-step=reset、motion-preference=standard、viewport=narrow |
| parameter-change | audit-start | narrow-heading-reduced | focus-step=heading、motion-preference=reduced、viewport=narrow |
| parameter-change | audit-start | narrow-control-reduced | focus-step=control、motion-preference=reduced、viewport=narrow |
| parameter-change | audit-start | narrow-reset-reduced | focus-step=reset、motion-preference=reduced、viewport=narrow |
| next | audit-start | wide-heading-motion | focus-step=heading、motion-preference=standard、viewport=wide |
| next | audit-start | wide-control-motion | focus-step=control、motion-preference=standard、viewport=wide |
| next | audit-start | wide-reset-motion | focus-step=reset、motion-preference=standard、viewport=wide |
| next | audit-start | wide-heading-reduced | focus-step=heading、motion-preference=reduced、viewport=wide |
| next | audit-start | wide-control-reduced | focus-step=control、motion-preference=reduced、viewport=wide |
| next | audit-start | reduced-motion | focus-step=reset、motion-preference=reduced、viewport=wide |
| next | audit-start | narrow-viewport | focus-step=heading、motion-preference=standard、viewport=narrow |
| next | audit-start | keyboard-focus | focus-step=control、motion-preference=standard、viewport=narrow |
| next | audit-start | narrow-reset-motion | focus-step=reset、motion-preference=standard、viewport=narrow |
| next | audit-start | narrow-heading-reduced | focus-step=heading、motion-preference=reduced、viewport=narrow |
| next | audit-start | narrow-control-reduced | focus-step=control、motion-preference=reduced、viewport=narrow |
| next | audit-start | narrow-reset-reduced | focus-step=reset、motion-preference=reduced、viewport=narrow |
| previous | wide-heading-motion | audit-start | focus-step=heading、motion-preference=standard、viewport=wide |
| previous | wide-control-motion | audit-start | focus-step=control、motion-preference=standard、viewport=wide |
| previous | wide-reset-motion | audit-start | focus-step=reset、motion-preference=standard、viewport=wide |
| previous | wide-heading-reduced | audit-start | focus-step=heading、motion-preference=reduced、viewport=wide |
| previous | wide-control-reduced | audit-start | focus-step=control、motion-preference=reduced、viewport=wide |
| previous | reduced-motion | audit-start | focus-step=reset、motion-preference=reduced、viewport=wide |
| previous | narrow-viewport | audit-start | focus-step=heading、motion-preference=standard、viewport=narrow |
| previous | keyboard-focus | audit-start | focus-step=control、motion-preference=standard、viewport=narrow |
| previous | narrow-reset-motion | audit-start | focus-step=reset、motion-preference=standard、viewport=narrow |
| previous | narrow-heading-reduced | audit-start | focus-step=heading、motion-preference=reduced、viewport=narrow |
| previous | narrow-control-reduced | audit-start | focus-step=control、motion-preference=reduced、viewport=narrow |
| previous | narrow-reset-reduced | audit-start | focus-step=reset、motion-preference=reduced、viewport=narrow |
| reset | wide-heading-motion | audit-start | focus-step=heading、motion-preference=standard、viewport=wide |
| reset | wide-control-motion | audit-start | focus-step=control、motion-preference=standard、viewport=wide |
| reset | wide-reset-motion | audit-start | focus-step=reset、motion-preference=standard、viewport=wide |
| reset | wide-heading-reduced | audit-start | focus-step=heading、motion-preference=reduced、viewport=wide |
| reset | wide-control-reduced | audit-start | focus-step=control、motion-preference=reduced、viewport=wide |
| reset | reduced-motion | audit-start | focus-step=reset、motion-preference=reduced、viewport=wide |
| reset | narrow-viewport | audit-start | focus-step=heading、motion-preference=standard、viewport=narrow |
| reset | keyboard-focus | audit-start | focus-step=control、motion-preference=standard、viewport=narrow |
| reset | narrow-reset-motion | audit-start | focus-step=reset、motion-preference=standard、viewport=narrow |
| reset | narrow-heading-reduced | audit-start | focus-step=heading、motion-preference=reduced、viewport=narrow |
| reset | narrow-control-reduced | audit-start | focus-step=control、motion-preference=reduced、viewport=narrow |
| reset | narrow-reset-reduced | audit-start | focus-step=reset、motion-preference=reduced、viewport=narrow |
| 結果 | 状態 |
|---|---|
| wideで見出しfocus orderを確認 | wide-heading-motion |
| wideでcontrol到達を確認 | wide-control-motion |
| wideでreset順序を確認 | wide-reset-motion |
| wide reducedで見出しを確認 | wide-heading-reduced |
| wide reducedで手動controlを確認 | wide-control-reduced |
| prefers-reduced-motionでmanual resetを確認 | reduced-motion |
| 320pxのreflow checklistを確認 | narrow-viewport |
| 320pxのkeyboard focusを確認 | keyboard-focus |
| 320pxのreset到達を確認 | narrow-reset-motion |
| 320px reducedで見出しを確認 | narrow-heading-reduced |
| 320px reducedでcontrolを確認 | narrow-control-reduced |
| 320px reducedでmanual resetを確認 | narrow-reset-reduced |
現在の状態: 監査開始 — 監査lensでありviewportや支援技術のエミュレータではありません。実ブラウザと支援技術で確認が必要。
このモデルは例示的かつ決定的であり、実システムの完全な再現ではありません。
動く例で考える
固定fixtureから生成サイト監査を導出する
- 前提
- generated-static-curriculumを対象とするlesson-defined synthetic fixtureであり、productionの適合認証ではない。WCAG 2.2 RecommendationのLevel AAをtargetにする。
- 入力
- keyboard、zoom-200、reading-order、usabilityの4観測を使う。各観測は期待値とactualを持ち、usabilityに意図的な差分を1件残す。
- 操作
- actualとexpectedの等価性からpassedを導出し、合格数と失敗数を計算する。pointer中心からkeyboard-onlyへinput modeを変更し、mode別operationとactualを同じ4 dimensionで比較する。
- 観測
- pointer-primaryは3/4、keyboard-onlyは2/4がpassする。transfer後もページ、WCAG target、期待結果は不変だが、keyboard dimensionのoperationとactualが変わり、入力方式に結び付くcheck IDとsummaryも変わる。
- 結論
- 監査記録は「問題なし」という印象ではなく、差分を保持する因果証拠である。このfixtureだけからサイト全体のconformance claimは行わない。
python3.13 - <<'PY'
import json
HARNESS = "hci_accessibility_audit_lab_v1"
SITE = "generated-static-curriculum"
OBSERVATION_FIXTURE = [
{
"dimension": "keyboard",
"expected": "all-controls-reachable-and-focus-visible",
"actual_by_input_mode": {
"pointer-primary": "all-controls-reachable-and-focus-visible",
"keyboard-only": "focus-visible-but-navigation-traps",
},
"operation_by_input_mode": {
"pointer-primary": "click-each-control-in-visual-order",
"keyboard-only": "tab-and-activate-each-control",
},
},
{
"dimension": "zoom-200",
"expected": "no-content-loss-or-two-dimensional-scroll",
"actual_by_input_mode": {
"pointer-primary": (
"no-content-loss-or-two-dimensional-scroll"
),
"keyboard-only": (
"no-content-loss-or-two-dimensional-scroll"
),
},
"operation_by_input_mode": {
"pointer-primary": "zoom-with-pointer-menu-to-200-percent",
"keyboard-only": "zoom-with-keyboard-shortcut-to-200-percent",
},
},
{
"dimension": "reading-order",
"expected": "dom-order-matches-meaning-order",
"actual_by_input_mode": {
"pointer-primary": "dom-order-matches-meaning-order",
"keyboard-only": "dom-order-matches-meaning-order",
},
"operation_by_input_mode": {
"pointer-primary": "inspect-visual-reading-sequence",
"keyboard-only": "traverse-focus-and-reading-sequence",
},
},
{
"dimension": "usability",
"expected": "five-of-five-tasks-completed",
"actual_by_input_mode": {
"pointer-primary": "four-of-five-tasks-completed",
"keyboard-only": "four-of-five-tasks-completed",
},
"operation_by_input_mode": {
"pointer-primary": "complete-five-tasks-with-pointer",
"keyboard-only": "complete-five-tasks-with-keyboard-only",
},
},
]
def derive_observations(fixture, input_mode):
observations = []
for index, source in enumerate(fixture, start=1):
observation = dict(source)
observation["check_id"] = (
f"{input_mode}-{index}-{source['dimension']}"
)
observation["input_mode"] = input_mode
actual = source["actual_by_input_mode"][input_mode]
observation["actual"] = actual
operation = source["operation_by_input_mode"][input_mode]
observation["operation"] = operation
observation.pop("actual_by_input_mode")
observation.pop("operation_by_input_mode")
passed = observation["actual"] == observation["expected"]
observation["passed"] = passed
observations.append(observation)
return observations
def summarize(observations):
passed = sum(item["passed"] for item in observations)
return {
"total": len(observations),
"passed": passed,
"failed": len(observations) - passed,
}
def mastery_evidence():
return {
"lab_steps": [
{"step": 1, "evidence": "site、task、target、scopeを固定"},
{"step": 2, "evidence": "keyboardのexpectedとactual"},
{"step": 3, "evidence": "zoom-200とreading-orderの観測"},
{"step": 4, "evidence": "usability差分とmanual review"},
{"step": 5, "evidence": "input-modeだけを変えたcheck差分"},
],
"assessments": [
{"assessment": 1, "evidence": "自動化範囲と手動観測の区別"},
{"assessment": 2, "evidence": "規範targetと非標準候補の分離"},
],
"rubric_dimensions": [
"technical-correctness",
"judgment",
"evidence",
"communication",
],
"transfer": {
"task": (
"pointer操作中心からkeyboard-only利用へ入力方式だけを変え、"
"生成サイト監査を再評価する"
),
"changed_assumption": "input-mode",
"evidence": "同じpage、target、expectedでcheckを再導出",
},
}
def main():
baseline = derive_observations(OBSERVATION_FIXTURE, "pointer-primary")
transferred = derive_observations(
OBSERVATION_FIXTURE,
"keyboard-only",
)
expected_passes = [
item["actual_by_input_mode"]["pointer-primary"]
== item["expected"]
for item in OBSERVATION_FIXTURE
]
assert (
[item["passed"] for item in baseline] == expected_passes
), "hci-causal-invariant"
assert summarize(baseline)["failed"] == 1, "hci-causal-invariant"
baseline_actual = {
item["dimension"]: item["actual"]
for item in baseline
}
transferred_actual = {
item["dimension"]: item["actual"]
for item in transferred
}
changed_dimensions = [
dimension
for dimension in baseline_actual
if baseline_actual[dimension] != transferred_actual[dimension]
]
assert "keyboard" in changed_dimensions, "hci-input-mode-invariant"
baseline_summary = summarize(baseline)
transferred_summary = summarize(transferred)
assert (
baseline_summary != transferred_summary
), "hci-input-mode-invariant"
report = {
"harness": HARNESS,
"site_under_audit": SITE,
"standards": {
"normative_target": {
"name": "WCAG",
"version": "2.2",
"level": "AA",
"status": "W3C Recommendation",
"date": "2024-12-12",
},
"human_centred_design": "ISO 9241-210:2019",
"non_normative_candidates": {
"WCAG 3.0": "W3C Working Draft 2026-03-03",
"APCA": "not-a-WCAG-2.2-conformance-standard",
},
},
"audit": {
"observations": baseline,
"summary": summarize(baseline),
"manual_review_required": True,
"conformance_claim": False,
},
"input_mode_transfer": {
"changed_assumption": "input-mode",
"changed_fields": ["input_mode"],
"unchanged": {
"page_fixture": True,
"wcag_target": True,
"expected_outcomes": True,
},
"baseline_check_ids": [
item["check_id"] for item in baseline
],
"transferred_check_ids": [
item["check_id"] for item in transferred
],
"baseline_observations": baseline,
"transferred_observations": transferred,
"changed_dimensions": changed_dimensions,
"baseline_summary": baseline_summary,
"transferred_summary": transferred_summary,
},
"fixture_metadata": {
"kind": "synthetic",
"provenance": (
"lesson-defined generated static curriculum observations"
),
"limitations": (
"not a production audit or a complete conformance claim"
),
},
"runtime_bound": {
"records": len(baseline) + len(transferred),
"subprocesses": 0,
},
"mastery_evidence": mastery_evidence(),
"external_network_used": False,
}
return report
print(json.dumps(main(), ensure_ascii=False, indent=2))
PY
トレードオフと失敗モード
| 観測 | 主張 | 行動 | 再評価条件 |
|---|---|---|---|
| 規範checkが失敗 | Level AA未確認 | 影響と修正を追跡して同条件で再試験 | 実装またはfixtureが変わった時 |
| 自動checkは合格、意味順は未確認 | 自動検査範囲だけ合格 | keyboardとreading orderを手動確認 | 支援技術または文書構造が変わった時 |
| WCAG 3.0またはAPCAだけで評価 | WCAG 2.2適合を主張しない | 非標準の補助観測として分離 | 規範targetの版を更新した時 |
- 誤診: automated checkerが0件を報告したのでサイトはWCAG 2.2 Level AAに完全適合する。反証: keyboardの操作順、reading orderの意味、usabilityのタスク成功は自動結果だけで証明できず、WCAG-EMのscopeと手動証拠が必要である。
- 誤診: APCAは新しいcontrast計算なのでWCAG 2.2の比率に置き換えてよい。反証: この監査の規範targetはWCAG 2.2であり、APCAは非標準の候補として分離する。Working DraftのWCAG 3.0も同じ適合根拠にはできない。
- 失敗モード: 200% zoomで見た目を戻すため文字を小さくすると、reflow問題を隠して利用者の可読性を悪化させる。
- 失敗モード: DOM順を変えず視覚位置だけをCSSで入れ替えると、見た順と読み上げ順が分岐する。
知識チェック
- WCAG 2.2 Level AAのconformanceと特定タスクのusabilityはどう違うか。
- 200% zoomで保持すべき内容と操作を二つ挙げよ。
- reading orderを視覚順だけで判定できない理由は何か。
- input modeだけを変えるtransferで固定すべき条件は何か。
出典と次の学習
適合targetはWeb Content Accessibility Guidelines 2.2のRecommendation、評価手順はWCAG-EM 1.0、人間中心設計はISO 9241-210:2019へ版を固定する。W3C Accessibility Guidelines 3.0は03 March 2026のWorking Draftとして地位を明示し、APCAとともに非標準候補へ分離する。
次は、roadmapとquantitative chartをsemantic HTMLとCSSで表し、視覚表現と同じ関係と値を同等のテキスト構造へ残す。
実践ラボ
生成済み静的カリキュラムをWCAG 2.2 Level AAで監査する
提出成果物: キーボード、ズーム、読み上げ、ユーザビリティの監査記録
- generated-static-curriculumのページfixture、利用者タスク、適合範囲、除外事項を固定する
- keyboard操作の到達順、フォーカス可視性、操作完了を観測し、期待値と比較する
- 200% zoomでreflow、欠落、重なりを確認し、reading orderを文書順と照合する
- 代表利用者タスクのusabilityを成功条件と観測証拠で評価し、手動確認と残余リスクを記録する
- 同じページ、WCAG target、期待結果のままpointer中心からkeyboard-onlyへinput modeだけを変えて再監査する
説明して理解を確かめる
5分で、WCAG 2.2 Level AAへの適合主張、WCAG-EMの評価手順、ISO 9241-210:2019の人間中心設計、WCAG 3.0とAPCAの非標準扱いを説明する。
アセスメント
問い: 自動検査が全件合格した生成サイトを、なぜkeyboardとreading orderで手動確認するのか。
期待する証拠: 自動化の観測範囲、操作順、意味順、タスク成功、支援技術差異、適合主張の限界
問い: APCAの値を満たしたためWCAG 2.2 Level AA適合と報告してよいか。
期待する証拠: 規範的target、非標準候補、WCAG 3.0 Working Draft、手動証拠、主張範囲の区別
別問題へ転用する
pointer操作中心からkeyboard-only利用へ入力方式だけを変え、生成サイト監査を再評価する
復習スケジュール
- 1日後
自動検査だけでは証明できないkeyboard観測を一つ挙げる
- 7日後
WCAG 2.2適合とISO 9241-210:2019のusability評価はどう異なるか
- 30日後
WCAG 3.0とAPCAを適合報告でどう位置付けるか
- 90日後
自動検査だけでは証明できないkeyboard観測を一つ挙げる
評価ルーブリック
| 観点 | 未達 | 発展途上 | 熟達 | 卓越 |
|---|---|---|---|---|
| technical-correctness | 標準の版、Level、観測対象を示さず適合を断定する | WCAG項目を列挙するが期待値と実測値を対応させない | 規範target、入力、期待、実測、判定、手動確認を一貫して記録する | 支援技術差異、例外、再現限界まで含めて適合範囲を限定する |
| judgment | 自動検査合格を利用可能性の保証とみなす | 手動確認を行うが利用者タスクと優先度を結ばない | 適合、タスク影響、修正費用、残余リスクから優先順位を決める | 影響を受ける利用者と不確実性を含めて再評価条件を合意する |
| evidence | 画面の印象だけで判定し操作記録を残さない | 結果はあるがfixture、入力方式、期待値のいずれかが欠ける | 固定fixtureと期待値から各判定を再計算できる | 失敗する観測を保持し、mutationで因果関係を反証できる |
| communication | 合否だけを伝え影響と修正方針を示さない | 問題を説明するが対象利用者と主張範囲が曖昧である | 利用者影響、証拠、標準、修正案、残余リスクを追跡可能に伝える | 開発、デザイン、評価者が同じ監査契約を更新できる |
出典
以下の外部資料は利用者が選択したときだけ開きます。
- Web Content Accessibility Guidelines (WCAG) 2.2 (standard)
- Website Accessibility Conformance Evaluation Methodology (WCAG-EM) 1.0 (standard)
- ISO 9241-210:2019 - Ergonomics of human-system interaction — Part 210: Human-centred design for interactive systems (standard)
- W3C Accessibility Guidelines (WCAG) 3.0 Working Draft 03 March 2026 (primary)