human-product · Stage 3

人間中心設計で静的サイトの利用可能性を監査する

キーボード、200%ズーム、読み上げ順、ユーザビリティを観測し、標準への適合と人が使えることを区別した監査記録を作る。

学習時間
300分
難易度
advanced
更新日
2026-07-30
到達証拠
成果物・説明・判断根拠・転用

到達目標

  1. WCAG 2.2 Level AAを基準に、キーボード、200%ズーム、読み上げ順を再現可能に監査できる

    • キーボード、ズーム、読み上げ、ユーザビリティの監査記録
    • 標準の地位、観測限界、手動確認を含む監査判断
  2. 適合確認とISO 9241-210:2019に基づく利用者タスクの評価を区別できる

    • キーボード、ズーム、読み上げ、ユーザビリティの監査記録
    • 適合、アクセシビリティ、ユーザビリティの境界を説明する5分発表
  3. WCAG 3.0 Working DraftとAPCAをWCAG 2.2適合主張へ混同せず、入力方式を変えて再評価できる

    • 標準の地位、観測限界、手動確認を含む監査判断
    • 入力方式だけを変えた再監査の差分と不変条件

能力の進行

  1. recognize

    WCAG 2.2 Level AA、WCAG-EM、ISO 9241-210:2019の役割を区別できる

    証拠: キーボード、ズーム、読み上げ、ユーザビリティの監査記録

  2. explain

    自動検査合格が読み上げ順や利用者タスクの成功を保証しない理由を説明できる

    証拠: 適合、アクセシビリティ、ユーザビリティの境界を説明する5分発表

  3. apply

    固定fixtureでkeyboard、200% zoom、reading order、usabilityを観測できる

    証拠: キーボード、ズーム、読み上げ、ユーザビリティの監査記録

  4. diagnose

    失敗を知覚、操作、理解、堅牢性、利用者タスクへ切り分け、反証を残せる

    証拠: 標準の地位、観測限界、手動確認を含む監査判断

  5. 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が変わるかを観測する。

生成サイトの監査を適合主張と利用者タスクへ結ぶ証拠flow

注記

図を読む際の補足情報です。

  1. Scope:
  2. Target:
  3. Observe:
  4. Review:
  5. Claim:

限定した監査scopeから、適合結果と利用者taskの結果を混同せずにどう報告するか。

  1. Scope
    ページfixture、利用者、入力方式、環境、除外を固定する。
    • Scope → Target: 対象を固定
  2. Target
    WCAG 2.2 Level AAの規範的targetと版を記録する。
    • Target → Observe: 規範期待値を適用
  3. Observe
    keyboard、200% zoom、reading order、usabilityを期待値と比較する。
    • Observe → Viewport wide checklist: wide viewportを監査
    • Observe → Viewport narrow checklist: narrow viewportを監査
    • Observe → Review: 自動結果と手動観測を渡す
  4. 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を確認
  5. 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を確認
  6. Focus heading checklist
    文書先頭から見出しまでのreading orderと意味順を確認する。
    • Focus heading checklist → Motion standard checklist: standard motionを確認
    • Focus heading checklist → Motion reduced checklist: reduced motionを確認
  7. Focus control checklist
    見出しから操作controlへ文書順で到達し、focusが可視か確認する。
    • Focus control checklist → Motion standard checklist: standard motionを確認
    • Focus control checklist → Motion reduced checklist: reduced motionを確認
  8. Focus reset checklist
    resetへ到達でき、実行後もfocus orderと初期状態が保たれるか確認する。
    • Focus reset checklist → Motion standard checklist: standard motionを確認
    • Focus reset checklist → Motion reduced checklist: reduced motionを確認
  9. Motion standard checklist
    動きだけに依存せずcurrent stepと結果が可視textでも伝わるか確認する。
  10. Motion reduced checklist
    prefers-reduced-motionでautoplayを止め、manual navigationとresetを確認する。
  11. Review
    自動化で判定できない意味、順序、タスク成功を人が確認する。
    • Review → Claim: 証拠の限界を含める
  12. Claim
    合否、未確認、残余リスクを分け、範囲を限定して報告する。

scope、規範target、観測、人手review、限定claimの順序と、WCAG 3.0 Working DraftをWCAG 2.2適合根拠にしない境界を説明できる。

パラメータと選択肢
パラメータ選択肢既定値
viewportwide 1280px、viewport=320pxwide
focus step見出し、操作control、resetheading
motion preferencestandard、prefers-reduced-motion: reducestandard
  1. 監査開始: 監査lensでありviewportや支援技術のエミュレータではありません。実ブラウザと支援技術で確認が必要。; 条件 常時; node scope; edge なし
  2. wide・見出し・standard: wideで見出しのfocus orderとstandard motionの可視textを監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=headingmotion-preference=standardviewport=wide; node viewport-widefocus-headingmotion-standard; edge checklist-observe-widechecklist-wide-headingchecklist-heading-standard
  3. wide・control・standard: wideでcontrolのfocus orderとstandard motionの可視textを監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=controlmotion-preference=standardviewport=wide; node viewport-widefocus-controlmotion-standard; edge checklist-observe-widechecklist-wide-controlchecklist-control-standard
  4. wide・reset・standard: wideでresetのfocus orderとstandard motionの状態復元を監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=resetmotion-preference=standardviewport=wide; node viewport-widefocus-resetmotion-standard; edge checklist-observe-widechecklist-wide-resetchecklist-reset-standard
  5. wide・見出し・reduced: wideで見出しのfocus orderとreduced motionの手動操作を監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=headingmotion-preference=reducedviewport=wide; node viewport-widefocus-headingmotion-reduced; edge checklist-observe-widechecklist-wide-headingchecklist-heading-reduced
  6. wide・control・reduced: wideでcontrolのfocus orderとreduced motionの手動操作を監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=controlmotion-preference=reducedviewport=wide; node viewport-widefocus-controlmotion-reduced; edge checklist-observe-widechecklist-wide-controlchecklist-control-reduced
  7. wide・reset・reduced: wideでresetのfocus orderとreduced motionのmanual navigationを監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=resetmotion-preference=reducedviewport=wide; node viewport-widefocus-resetmotion-reduced; edge checklist-observe-widechecklist-wide-resetchecklist-reset-reduced
  8. narrow・見出し・standard: 320px reflowで見出しのfocus orderとstandard motionを監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=headingmotion-preference=standardviewport=narrow; node viewport-narrowfocus-headingmotion-standard; edge checklist-observe-narrowchecklist-narrow-headingchecklist-heading-standard
  9. narrow・control・standard: 320px reflowでcontrolのkeyboard focusとstandard motionを監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=controlmotion-preference=standardviewport=narrow; node viewport-narrowfocus-controlmotion-standard; edge checklist-observe-narrowchecklist-narrow-controlchecklist-control-standard
  10. narrow・reset・standard: 320px reflowでreset到達とstandard motionの状態復元を監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=resetmotion-preference=standardviewport=narrow; node viewport-narrowfocus-resetmotion-standard; edge checklist-observe-narrowchecklist-narrow-resetchecklist-reset-standard
  11. narrow・見出し・reduced: 320px reflowで見出しとreduced motionのmanual navigationを監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=headingmotion-preference=reducedviewport=narrow; node viewport-narrowfocus-headingmotion-reduced; edge checklist-observe-narrowchecklist-narrow-headingchecklist-heading-reduced
  12. narrow・control・reduced: 320px reflowでcontrol focusとreduced motionの手動操作を監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=controlmotion-preference=reducedviewport=narrow; node viewport-narrowfocus-controlmotion-reduced; edge checklist-observe-narrowchecklist-narrow-controlchecklist-control-reduced
  13. narrow・reset・reduced: 320px reflowでresetとreduced motionのmanual navigationを監査する。実ブラウザと支援技術で確認が必要。; 条件 focus-step=resetmotion-preference=reducedviewport=narrow; node viewport-narrowfocus-resetmotion-reduced; edge checklist-observe-narrowchecklist-narrow-resetchecklist-reset-reduced
完全な遷移
イベント開始終了条件
parameter-changeaudit-startwide-heading-motionfocus-step=headingmotion-preference=standardviewport=wide
parameter-changeaudit-startwide-control-motionfocus-step=controlmotion-preference=standardviewport=wide
parameter-changeaudit-startwide-reset-motionfocus-step=resetmotion-preference=standardviewport=wide
parameter-changeaudit-startwide-heading-reducedfocus-step=headingmotion-preference=reducedviewport=wide
parameter-changeaudit-startwide-control-reducedfocus-step=controlmotion-preference=reducedviewport=wide
parameter-changeaudit-startreduced-motionfocus-step=resetmotion-preference=reducedviewport=wide
parameter-changeaudit-startnarrow-viewportfocus-step=headingmotion-preference=standardviewport=narrow
parameter-changeaudit-startkeyboard-focusfocus-step=controlmotion-preference=standardviewport=narrow
parameter-changeaudit-startnarrow-reset-motionfocus-step=resetmotion-preference=standardviewport=narrow
parameter-changeaudit-startnarrow-heading-reducedfocus-step=headingmotion-preference=reducedviewport=narrow
parameter-changeaudit-startnarrow-control-reducedfocus-step=controlmotion-preference=reducedviewport=narrow
parameter-changeaudit-startnarrow-reset-reducedfocus-step=resetmotion-preference=reducedviewport=narrow
nextaudit-startwide-heading-motionfocus-step=headingmotion-preference=standardviewport=wide
nextaudit-startwide-control-motionfocus-step=controlmotion-preference=standardviewport=wide
nextaudit-startwide-reset-motionfocus-step=resetmotion-preference=standardviewport=wide
nextaudit-startwide-heading-reducedfocus-step=headingmotion-preference=reducedviewport=wide
nextaudit-startwide-control-reducedfocus-step=controlmotion-preference=reducedviewport=wide
nextaudit-startreduced-motionfocus-step=resetmotion-preference=reducedviewport=wide
nextaudit-startnarrow-viewportfocus-step=headingmotion-preference=standardviewport=narrow
nextaudit-startkeyboard-focusfocus-step=controlmotion-preference=standardviewport=narrow
nextaudit-startnarrow-reset-motionfocus-step=resetmotion-preference=standardviewport=narrow
nextaudit-startnarrow-heading-reducedfocus-step=headingmotion-preference=reducedviewport=narrow
nextaudit-startnarrow-control-reducedfocus-step=controlmotion-preference=reducedviewport=narrow
nextaudit-startnarrow-reset-reducedfocus-step=resetmotion-preference=reducedviewport=narrow
previouswide-heading-motionaudit-startfocus-step=headingmotion-preference=standardviewport=wide
previouswide-control-motionaudit-startfocus-step=controlmotion-preference=standardviewport=wide
previouswide-reset-motionaudit-startfocus-step=resetmotion-preference=standardviewport=wide
previouswide-heading-reducedaudit-startfocus-step=headingmotion-preference=reducedviewport=wide
previouswide-control-reducedaudit-startfocus-step=controlmotion-preference=reducedviewport=wide
previousreduced-motionaudit-startfocus-step=resetmotion-preference=reducedviewport=wide
previousnarrow-viewportaudit-startfocus-step=headingmotion-preference=standardviewport=narrow
previouskeyboard-focusaudit-startfocus-step=controlmotion-preference=standardviewport=narrow
previousnarrow-reset-motionaudit-startfocus-step=resetmotion-preference=standardviewport=narrow
previousnarrow-heading-reducedaudit-startfocus-step=headingmotion-preference=reducedviewport=narrow
previousnarrow-control-reducedaudit-startfocus-step=controlmotion-preference=reducedviewport=narrow
previousnarrow-reset-reducedaudit-startfocus-step=resetmotion-preference=reducedviewport=narrow
resetwide-heading-motionaudit-startfocus-step=headingmotion-preference=standardviewport=wide
resetwide-control-motionaudit-startfocus-step=controlmotion-preference=standardviewport=wide
resetwide-reset-motionaudit-startfocus-step=resetmotion-preference=standardviewport=wide
resetwide-heading-reducedaudit-startfocus-step=headingmotion-preference=reducedviewport=wide
resetwide-control-reducedaudit-startfocus-step=controlmotion-preference=reducedviewport=wide
resetreduced-motionaudit-startfocus-step=resetmotion-preference=reducedviewport=wide
resetnarrow-viewportaudit-startfocus-step=headingmotion-preference=standardviewport=narrow
resetkeyboard-focusaudit-startfocus-step=controlmotion-preference=standardviewport=narrow
resetnarrow-reset-motionaudit-startfocus-step=resetmotion-preference=standardviewport=narrow
resetnarrow-heading-reducedaudit-startfocus-step=headingmotion-preference=reducedviewport=narrow
resetnarrow-control-reducedaudit-startfocus-step=controlmotion-preference=reducedviewport=narrow
resetnarrow-reset-reducedaudit-startfocus-step=resetmotion-preference=reducedviewport=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

トレードオフと失敗モード

監査結果から行動を選ぶ decision table
観測 主張 行動 再評価条件
規範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で入れ替えると、見た順と読み上げ順が分岐する。

知識チェック

  1. WCAG 2.2 Level AAのconformanceと特定タスクのusabilityはどう違うか。
  2. 200% zoomで保持すべき内容と操作を二つ挙げよ。
  3. reading orderを視覚順だけで判定できない理由は何か。
  4. 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で監査する

提出成果物: キーボード、ズーム、読み上げ、ユーザビリティの監査記録

  1. generated-static-curriculumのページfixture、利用者タスク、適合範囲、除外事項を固定する
  2. keyboard操作の到達順、フォーカス可視性、操作完了を観測し、期待値と比較する
  3. 200% zoomでreflow、欠落、重なりを確認し、reading orderを文書順と照合する
  4. 代表利用者タスクのusabilityを成功条件と観測証拠で評価し、手動確認と残余リスクを記録する
  5. 同じページ、WCAG target、期待結果のままpointer中心からkeyboard-onlyへinput modeだけを変えて再監査する

説明して理解を確かめる

5分で、WCAG 2.2 Level AAへの適合主張、WCAG-EMの評価手順、ISO 9241-210:2019の人間中心設計、WCAG 3.0とAPCAの非標準扱いを説明する。

アセスメント

  1. 問い: 自動検査が全件合格した生成サイトを、なぜkeyboardとreading orderで手動確認するのか。

    期待する証拠: 自動化の観測範囲、操作順、意味順、タスク成功、支援技術差異、適合主張の限界

  2. 問い: APCAの値を満たしたためWCAG 2.2 Level AA適合と報告してよいか。

    期待する証拠: 規範的target、非標準候補、WCAG 3.0 Working Draft、手動証拠、主張範囲の区別

別問題へ転用する

pointer操作中心からkeyboard-only利用へ入力方式だけを変え、生成サイト監査を再評価する

復習スケジュール

  1. 1日後

    自動検査だけでは証明できないkeyboard観測を一つ挙げる

  2. 7日後

    WCAG 2.2適合とISO 9241-210:2019のusability評価はどう異なるか

  3. 30日後

    WCAG 3.0とAPCAを適合報告でどう位置付けるか

  4. 90日後

    自動検査だけでは証明できないkeyboard観測を一つ挙げる

評価ルーブリック

4段階の評価基準
観点未達発展途上熟達卓越
technical-correctness標準の版、Level、観測対象を示さず適合を断定するWCAG項目を列挙するが期待値と実測値を対応させない規範target、入力、期待、実測、判定、手動確認を一貫して記録する支援技術差異、例外、再現限界まで含めて適合範囲を限定する
judgment自動検査合格を利用可能性の保証とみなす手動確認を行うが利用者タスクと優先度を結ばない適合、タスク影響、修正費用、残余リスクから優先順位を決める影響を受ける利用者と不確実性を含めて再評価条件を合意する
evidence画面の印象だけで判定し操作記録を残さない結果はあるがfixture、入力方式、期待値のいずれかが欠ける固定fixtureと期待値から各判定を再計算できる失敗する観測を保持し、mutationで因果関係を反証できる
communication合否だけを伝え影響と修正方針を示さない問題を説明するが対象利用者と主張範囲が曖昧である利用者影響、証拠、標準、修正案、残余リスクを追跡可能に伝える開発、デザイン、評価者が同じ監査契約を更新できる

出典

以下の外部資料は利用者が選択したときだけ開きます。