{
  "_enforce": true,
  "_enforce の説明": [
    "true のとき、仕様書に載っていない項目があるとテストが **失敗** する。",
    "全章を書き終えたので true にした。以後は、画面・API・状態・文言を",
    "足したら仕様書にも書くまでテストが赤いままになる。",
    "執筆中だけ一時的に止めたいときは SPEC_COVERAGE_REPORT_ONLY=1 を使う",
    "(ファイルは false に戻さない)。"
  ],
  "_説明": [
    "仕様書に **意図的に載せない** ものを、理由付きで除外する。",
    "ここに足すときは必ず reason を書くこと。理由の無い除外は認めない。",
    "key は test_spec_coverage.py が照合する識別子と完全一致させる。"
  ],
  "frontend_routes": [
    {
      "key": "/login",
      "reason": "ロール選択を挟まない旧 URL。/admin/login などへ転送するだけの入り口で、画面としての中身が無い。"
    },
    {
      "key": "/client",
      "reason": "/shift/client/login への転送のみ。画面としての中身が無い。"
    },
    {
      "key": "/client/login",
      "reason": "/shift/client/login への転送のみ。画面としての中身が無い。"
    },
    {
      "key": "/staff",
      "reason": "/shift/staff/login への転送のみ。画面としての中身が無い。"
    },
    {
      "key": "/staff/login",
      "reason": "/shift/staff/login への転送のみ。画面としての中身が無い。"
    }
  ],
  "api_endpoints": [
    {
      "key": "/api/auth/token/refresh/",
      "reason": "ログイン状態を保つための裏側の仕組み。利用者の操作に対応しないため画面仕様には出さず、共通ルールの章でまとめて説明する。"
    }
  ],
  "viewset_actions": [],
  "status_choices": [
    {
      "key": "modules_shift.AttendanceLog.status/break",
      "reason": "「休憩中」は到達できない状態。休憩を開始・終了する操作が画面にも API にも無く、この値になることがない。DB の選択肢は migration を避けて残してあるだけなので、状態遷移の章では「使われていない値」として説明し、遷移表には載せない (09 章の「将来の機能」に記録)。"
    }
  ],
  "ui_messages": []
}
