# 解答表 — v3-01m381xcb1azr8f868bpmgka52

## cohort メタ

| 項目 | 値 |
| --- | --- |
| seed | 612277875 |
| catalogRevision | sha256:4d1aa65f906c528909f746d7086e3f9d6512acde60b106e5eb72cec4bc71bdc9 |
| sourceRevision | npm:@masup9/a11y-training@0.1.1 |
| generatorVersion | 0.1.1 |
| referenceEnvironment.os | Linux 6.18.36-cloudflare-firecracker-2026.6.17 (linux) |
| referenceEnvironment.chrome | 151.0.7922.34 |
| referenceEnvironment.playwright | 1.62.1 |
| referenceEnvironment.locale | ja-JP |
| referenceEnvironment.zoom | 100 |
| validationMode | automated-only |

## 裁定の4分類

本教材の裁定は内部的には3軸(validity / provenance / disposition)で行われますが、参加者向けには次の4分類に畳んで表示します。各 fault 節・追加発見節の「裁定」欄はこの4分類のいずれかで記入します。

- **意図した障壁(Intended)**: 教材が意図して仕込んだ障壁、またはその観測箇所に対する指摘。本課題の主たる採点対象です。
- **既知の制約(Known limitation)**: 教材の既知の制約(NVDA 実機検証省略などの provenance: environment、または provenance: specification で spec 更新が必要と判断された事項)に起因する事実として妥当な指摘です。減点対象にはしませんが、意図した障壁(Intended)としては扱いません。
- **追加発見（有効）(Accepted additional finding)**: 教材が意図していなかったものの、有効性(validity: valid)が確認された追加発見です(provenance: new が昇格 gate を通過したもの等)。加点方向にのみ働きます(見つけられなかった参加者の coverage 分母には加えません)。
- **無効(Invalid)**: 有効性が確認できない指摘(validity: invalid、または誤検出)です。

## fault



### fault `amount-label-not-associated` — 金額欄の可視ラベルがプログラム的に関連付けられていない

**対象(targets)**

- `request.amount`(経費申請の作成)

**WCAG 達成基準(規範的注記)**

- 1.3.1: 可視ラベルとフィールドの関係がプログラム的に決定できない失敗。
結果として金額欄に名前がない状態にもなるため 4.1.2 でも指摘できるが、
原因は「関係」の欠落なので 1.3.1 を主とする。axe(label)で検出可能。


**影響**: 可視ラベル(label 要素)はあるが for/id の紐付けがなく、支援技術からは
フィールド名として関連付けられない(catalog/faults.yaml notes)。


**修正方針**: 申請フォームの金額欄で label 要素の for と input の id を一致させる
(または label で input を包含する)。NumberInput コンポーネントが id を
受け取る設計なら、呼び出し側で渡すのが正しい修正箇所。


**severity**: medium

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-amount-label`(active)

- 対象 slot: `request.amount`(経費申請の作成)
- discoveryClass: automated-static
- criteria: 1.3.1
- testMethods: automated-static(discovery・必須) / screen-reader(discovery)
- 自動・手動の別: 自動 + 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 申請作成画面を表示する |
| action(再現手順) | 金額欄を axe で検査する / スクリーンリーダーでフォーカスする |
| expected(期待される挙動) | 「金額」というラベルが関連付けられている |
| actual(実際の挙動) | ラベルは視覚表示のみで、関連付けがない(axe label 違反) |

### fault `combobox-no-keyboard` — 候補リストを矢印キーで操作できない

**対象(targets)**

- `approvalList.categoryFilter`(承認待ち一覧)
- `request.category`(経費申請の作成)
- `request.payee`(経費申請の作成)

**WCAG 達成基準(規範的注記)**

- 2.1.1: 候補の選択がポインタ操作でしか行えないため「キーボード」の失敗。
2.1.1 は機能単位で見るので、テキスト入力自体が可能でも候補選択が
できなければ失敗と判定する。


**影響**: 全 Combobox インスタンス(3画面)に影響し、マウス操作では問題が表面化しないため
自動チェックでも見逃されやすい(catalog/faults.yaml notes)。


**修正方針**: Combobox コンポーネント側で ↑↓ による候補移動、Enter で確定、Esc で
リストを閉じるキー操作を実装する(APG Combobox パターン)。修正は
コンポーネント 1 箇所で行い、全インスタンスに反映させる。個々の画面で
イベントハンドラを補うのは原因への修正ではない。


**severity**: high

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-cbx-kbd-category`(active)

- 対象 slot: `request.category`(経費申請の作成)
- discoveryClass: keyboard
- criteria: 2.1.1
- testMethods: keyboard(discovery・必須) / source(diagnosis)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 申請作成画面を開き、費目コンボボックスにフォーカスする |
| action(再現手順) | ArrowDown を押す |
| expected(期待される挙動) | 候補リストが開き、最初の候補がアクティブになる |
| actual(実際の挙動) | 何も起こらない(マウスでは選択できる) |
#### observation `obs-cbx-kbd-filter`(active)

- 対象 slot: `approvalList.categoryFilter`(承認待ち一覧)
- discoveryClass: keyboard
- criteria: 2.1.1
- testMethods: keyboard(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 承認待ち一覧の費目フィルタにフォーカスする |
| action(再現手順) | ArrowDown を押す |
| expected(期待される挙動) | 候補リストが開き、最初の候補がアクティブになる |
| actual(実際の挙動) | 何も起こらない |
#### observation `obs-cbx-kbd-payee`(active)

- 対象 slot: `request.payee`(経費申請の作成)
- discoveryClass: keyboard
- criteria: 2.1.1
- testMethods: keyboard(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 支払先に文字を入力し、候補が表示された状態にする |
| action(再現手順) | ArrowDown を押す |
| expected(期待される挙動) | 候補リストの最初の候補がアクティブになる |
| actual(実際の挙動) | 候補に移動できない |

### fault `datatable-sort-state-missing` — ソート状態(aria-sort)が列ヘッダーに公開されない

**対象(targets)**

- `approvalList.table`(承認待ち一覧)

**WCAG 達成基準(規範的注記)**

- 4.1.2: ソート列と方向は列ヘッダーの「状態」であり aria-sort で公開されるべき。
型単位の欠陥だが、ソート可能モードは承認一覧のテーブルだけなので
観測できるのはその 1 画面。


**影響**: ソート状態を示す矢印は視覚的に更新されるが、支援技術には現在の
ソート列・方向が伝わらない(catalog/faults.yaml notes)。


**修正方針**: DataTable のソート可能な列ヘッダー(th)に aria-sort を付与し、現在の
ソート列は "ascending"/"descending"、それ以外の列は属性なし(または
"none")にする。ヘッダー内のソートボタンにも「金額で並べ替え」のような
アクセシブルネームを持たせる。


**severity**: medium

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-sort-state`(active)

- 対象 slot: `approvalList.table`(承認待ち一覧)
- discoveryClass: screen-reader
- criteria: 4.1.2
- testMethods: screen-reader(discovery・必須) / accessibility-tree(discovery)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 承認待ち一覧を表示する |
| action(再現手順) | 「金額」列ヘッダーでソートを切り替える |
| expected(期待される挙動) | ソート状態(昇順/降順)が支援技術に公開される |
| actual(実際の挙動) | 視覚的な矢印のみ変化し、状態が公開されない |

### fault `dialog-no-focus-return` — キャンセルで閉じたときフォーカスがトリガーに戻らない

**対象(targets)**

- `approvalDetail.returnDialog`(申請詳細)
- `requestList.withdrawDialog`(自分の申請一覧)

**WCAG 達成基準(規範的注記)**

- 2.4.3: 閉じた後のフォーカス先がトリガーへ戻らず文書先頭などに落ちるため
フォーカス順序が意味・操作性を損なう。確定で閉じる経路は spec 未定義
のため対象外で、キャンセル経路のみを失敗とする。


**影響**: キャンセルでダイアログを閉じた際にフォーカスがトリガーへ戻らず、
キーボード利用者が操作の起点を見失う(catalog/faults.yaml notes)。


**修正方針**: Dialog コンポーネントが開く時点でトリガー要素(document.activeElement)を
保持し、キャンセルで閉じるときにそこへフォーカスを戻す。閉じる契機
(Esc・キャンセルボタン・背景クリック)のすべてで同じ復帰処理を通す。
トリガーが DOM から消える場合の代替先も決めておく。


**severity**: high

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-dlg-return-reason`(active)

- 対象 slot: `approvalDetail.returnDialog`(申請詳細)
- discoveryClass: keyboard
- criteria: 2.4.3
- testMethods: keyboard(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 申請詳細で差し戻しダイアログを開く |
| action(再現手順) | キャンセルで閉じる |
| expected(期待される挙動) | フォーカスが差し戻しボタンに戻る |
| actual(実際の挙動) | フォーカスが body に落ちる |
#### observation `obs-dlg-return-withdraw`(active)

- 対象 slot: `requestList.withdrawDialog`(自分の申請一覧)
- discoveryClass: keyboard
- criteria: 2.4.3
- testMethods: keyboard(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 自分の申請一覧で、承認待ちの行のメニューから「取り下げ」を開く |
| action(再現手順) | Esc(またはキャンセル)で閉じる |
| expected(期待される挙動) | フォーカスがメニューのトリガーに戻る(spec 5.5) |
| actual(実際の挙動) | フォーカスが body に落ちる |

### fault `error-summary-not-focused` — バリデーションエラー時にフォーカスがエラー要約へ移動しない

**対象(targets)**

- `request.errorSummary`(経費申請の作成)

**WCAG 達成基準(規範的注記)**

(該当する WCAG 達成基準なし。spec 違反として指摘する)

**影響**: バリデーションエラー時にフォーカスがエラー要約へ移動しないため
エラー発生に気づけない可能性がある。spec 6章(focusTarget: error-summary)
への明確な違反だが、WCAG の特定達成基準の失敗とは言い切れないため
wcag は空とし spec 違反として指摘する(catalog/faults.yaml notes)。


**修正方針**: 送信時のバリデーション失敗後、エラー要約コンテナ(tabindex="-1")へ
プログラム的にフォーカスを移動する。要約には見出しと各エラーへの
リンクを置き、リンクから該当フィールドへ移動できるようにする。
spec 6 章の期待挙動に合わせる修正であり、WCAG 番号を根拠にしない。


**severity**: medium

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-error-summary-focus`(active)

- 対象 slot: `request.errorSummary`(経費申請の作成)
- discoveryClass: keyboard
- criteria: (なし)
- testMethods: keyboard(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 必須項目を空のまま申請フォームを送信する |
| action(再現手順) | エラー要約の表示直後のフォーカス位置を確認する |
| expected(期待される挙動) | フォーカスがエラー要約に移動する(spec 6章) |
| actual(実際の挙動) | フォーカスが送信ボタンに残る |

### fault `notification-no-live-region` — 操作結果の通知が支援技術に読み上げられない

**対象(targets)**

- `global.notification`(全画面共通)

**WCAG 達成基準(規範的注記)**

- 4.1.3: 申請受付・承認完了・エラーなどの操作結果通知はフォーカスを移さずに
伝えるべきステータスメッセージの典型。notification-auto-dismiss
とは同じ領域に対する別の欠陥(こちらは通知されない、あちらは消える)。


**影響**: 操作結果の通知は視覚的には表示されるが読み上げられず、申請受付・承認完了・
エラー通知のすべてに影響する(blast-radius 最大級。catalog/faults.yaml notes)。


**修正方針**: NotificationRegion のコンテナを初期表示時から DOM に置き、成功系は
role="status"(polite)、エラー系は role="alert"(assertive)で公開する。
通知の表示は既存コンテナ内の内容更新で行う。通知ごとにコンテナを
生成・破棄する実装では読み上げが安定しない。


**severity**: high

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-notify-approve`(active)

- 対象 slot: `global.notification`(全画面共通)
- discoveryClass: screen-reader
- criteria: 4.1.3
- testMethods: screen-reader(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 承認待ち一覧で任意の申請の承認を確定する |
| action(再現手順) | 処理完了を待つ |
| expected(期待される挙動) | 承認完了の通知が読み上げられる |
| actual(実際の挙動) | 読み上げられない |
#### observation `obs-notify-submit`(active)

- 対象 slot: `global.notification`(全画面共通)
- discoveryClass: screen-reader
- criteria: 4.1.3
- testMethods: screen-reader(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 申請作成画面で有効な内容を入力する |
| action(再現手順) | 送信し、申請一覧へ遷移する |
| expected(期待される挙動) | 「申請を受け付けました」が読み上げられる |
| actual(実際の挙動) | 視覚的には表示されるが、読み上げられない |

### fault `outline-none-global` — リセットCSSにより全要素のフォーカスインジケーターが消えている

**対象(targets)**

- `global.nav`(全画面共通)
- `request.form`(経費申請の作成)

**WCAG 達成基準(規範的注記)**

- 2.4.7: 全要素で outline: none が指定されフォーカス表示が一切ないため、
「フォーカスの可視化」の失敗。リセット CSS 起因で個別コンポーネントの
問題ではない。composed gate はプログラム的にフォーカスを検証するため
この欠陥を検出しない。


**影響**: 全要素のフォーカスインジケーターが消えており、キーボード操作時に
どこにフォーカスがあるか視覚的に分からない(blast-radius 最大級。
catalog/faults.yaml notes)。


**修正方針**: リセット CSS の `*:focus { outline: none }` を削除する。マウス操作時の
表示を抑えたいなら :focus-visible でスタイルを定義し、ブラウザ既定と
同等以上に視認できるインジケーターを用意する。コンポーネントごとに
outline を戻す修正は取り残しを生む。


**severity**: high

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-focus-visible-form`(active)

- 対象 slot: `request.form`(経費申請の作成)
- discoveryClass: keyboard
- criteria: 2.4.7
- testMethods: keyboard(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 申請作成画面を表示する |
| action(再現手順) | Tab でフォーム項目を移動する |
| expected(期待される挙動) | フォーカス位置が視覚的に分かる |
| actual(実際の挙動) | インジケーターが表示されない |
#### observation `obs-focus-visible-nav`(active)

- 対象 slot: `global.nav`(全画面共通)
- discoveryClass: keyboard
- criteria: 2.4.7
- testMethods: keyboard(discovery・必須) / visual(discovery)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 任意の画面を表示する |
| action(再現手順) | Tab でグローバルナビゲーションを移動する |
| expected(期待される挙動) | フォーカス位置が視覚的に分かる |
| actual(実際の挙動) | フォーカスインジケーターが表示されない |

### fault `status-color-only` — 申請ステータスが色のみで区別されている

**対象(targets)**

- `requestList.table`(自分の申請一覧)

**WCAG 達成基準(規範的注記)**

- 1.4.1: ステータスの区別が色ドットだけで、テキストや形状の手がかりがない失敗。
ドットに aria-label が付いていても、色覚特性のある晴眼者には
伝わらないため 1.4.1 の失敗は残る。


**影響**: 申請一覧にステータス列がなく、申請ID セル冒頭の色ドットのみで区別されて
おり、色を識別できない利用者はステータスを判別できない
(catalog/faults.yaml notes)。


**修正方針**: 申請一覧にステータス列を設け、「承認待ち」「承認済み」等のテキストを
表示する(色ドットは補助として残してよい)。デザインカンプ段階の判断の
修正であり、ドットに aria-label を足すだけの対応では 1.4.1 の失敗が残る。


**severity**: medium

**裁定**: Intended

**追加発見(講評時に記入)**

(なし)

#### observation `obs-status-color`(active)

- 対象 slot: `requestList.table`(自分の申請一覧)
- discoveryClass: visual
- criteria: 1.4.1
- testMethods: visual(discovery・必須)
- 自動・手動の別: 手動

| 項目 | 内容 |
| --- | --- |
| precondition | 各ステータスの申請が混在する自分の申請一覧を表示する |
| action(再現手順) | 申請一覧でステータスの表示を確認する |
| expected(期待される挙動) | 色以外(テキスト等)でもステータスを区別できる |
| actual(実際の挙動) | ステータス列がなく、申請ID セル冒頭の色ドットのみで区別されている |

## specification-question

### specification-question `case-sort-announce`

- discoveryClass: spec-review

**出題文**: ソート変更を支援技術に通知すべきか

**論点・期待解答**: 仕様未定義の特定と確認事項としての指摘

**裁定**: Intended

## unobservable

全 unobservable observation を guard 実行結果 + evidence(生値)つきで記載します(この節は catalog 上の全 observation ではなく、本 cohort で unobservable と確定したものだけを対象とします)。

(本 cohort に該当なし)

## Known limitation

### screen-reader-manual

参照環境(Windows + NVDA + Chrome)での**スクリーンリーダー実機による手動検証は実施していません**(本教材の検証範囲外として意図的に省略しています)。自動検証(aria snapshot / live region 発火 / accessibility tree)でカバーできる範囲は本 lock の各 observation の検証に含まれていますが、実際の読み上げ結果そのものは未検証です。この観点に関する参加者の指摘は、参加者向け4分類では **Known limitation** として扱います。

## 追加発見(講評時に記入)

cohort 全体を通じた、fault に紐付かない追加発見をここに記入します(裁定4分類のいずれかを付す)。

(なし)
