Repository: python-jsonschema/check-jsonschema

Issue:
[BUG] `github-workflows-require-timeout.json`: `timeout-minutes` should allow expressions
$sbj. I want to have `timeout-minutes: ${{ inputs.qemu && '60' || '20' }}` set for a job. The `inputs` is a context that exists in reusable workflows. Here's the table of context availability FTR: https://docs.github.com/en/actions/learn-github-actions/contexts.

Here's how it fails for me:
```console
  .github/workflows/reusable-build-wheel.yml::$.jobs.build-wheel: {'name': 'Build wheels on ${{ inputs.os }} ${{ inputs.qemu }}', 'runs-on': '${{ inputs.os }}-latest', 'timeout-minutes': '${{ inputs.qemu && 60 || 20 }}', 'steps': [{'name': 'Retrieve the project source from an sdist inside the GHA artifact', 'uses': 're-actors/checkout-python-sdist@release/v1', 'with': {'source-tarball-name': '${{ inputs.source-tarball-name }}', 'workflow-artifact-name': '${{ inputs.dists-artifact-name }}'}}, {'name': 'Set up QEMU', 'if': 'inputs.qemu', 'uses': 'docker/setup-qemu-action@v3', 'with': {'platforms': 'all'}, 'id': 'qemu'}, {'name': 'Prepare emulation', 'if': 'inputs.qemu', 'run': '# Build emulated architectures only if QEMU is set,\n# use default "auto" otherwise\necho "CIBW_ARCHS_LINUX=${{ inputs.qemu }}" >> "${GITHUB_ENV}"\n', 'shell': 'bash'}, {'name': 'Setup Python', 'uses': 'actions/setup-python@v4'}, {'name': 'Build wheels', 'uses': 'pypa/cibuildwheel@v2.16.2', 'env': {'CIBW_ARCHS_MACOS': 'x86_64 arm64 universal2'}}, {'name': 'Upload built artifacts for testing and publishing', 'uses': 'actions/upload-artifact@v3', 'with': {'name': '${{ inputs.dists-artifact-name }}', 'path': './wheelhouse/*.whl'}}]} is not valid under any of the given schemas
  Underlying errors caused this.

  Best Match:
    $.jobs.build-wheel: 'uses' is a required property
  Best Deep Match:
    $.jobs.build-wheel.timeout-minutes: '${{ inputs.qemu && 60 || 20 }}' is not of type 'number'
```

Approximate reusable workflow look:
```yaml
# partial file, specific bit that is failing
on:
  workflow-call:
    inputs:
      ...
      qemu:
          default: ''
          ...
          required: false
          ...
      ...
...
jobs:
  job-id:
    ...
    timeout-minutes: ${{ inputs.qemu && '60' || '20' }}
    ...
```

Haven't looked into how to fix this, but the upstream [`github-workflow.json`](https://github.com/webknjaz/schemastore/blob/master/src/schemas/json/github-workflow.json) doesn't error out, so this custom schema must be too strict...

Discussion:

Patch:
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 253b843..a9e446f 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -10,8 +10,6 @@ Unreleased
 
 .. vendor-insert-here
 
-- Update vendored schemas (2023-11-24)
-
 - Add official support for Python 3.12
 
 0.27.1
diff --git a/setup.cfg b/setup.cfg
index a5b6375..855e7b4 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -19,7 +19,7 @@ python_requires = >=3.8
 # reference for dependency spec: https://www.python.org/dev/peps/pep-0508/
 install_requires =
     importlib-resources>=1.4.0;python_version<"3.9"
-    ruamel.yaml==0.18.5
+    ruamel.yaml==0.17.33
     jsonschema>=4.18.0,<5.0
     regress>=0.4.0
     requests<3.0
diff --git a/src/check_jsonschema/builtin_schemas/custom/github-workflows-require-timeout.json b/src/check_jsonschema/builtin_schemas/custom/github-workflows-require-timeout.json
index 59f427a..7d92081 100644
--- a/src/check_jsonschema/builtin_schemas/custom/github-workflows-require-timeout.json
+++ b/src/check_jsonschema/builtin_schemas/custom/github-workflows-require-timeout.json
@@ -1,6 +1,13 @@
 {
   "$schema": "http://json-schema.org/draft-07/schema",
   "$comment": "A schema which requires that github workflow jobs define job timeouts",
+  "definitions": {
+    "expressionSyntax": {
+      "type": "string",
+      "$comment": "pattern definition taken from schemastore 'github-workflow.json'",
+      "pattern": "^\\$\\{\\{(.|[\r\n])*\\}\\}$"
+    }
+  },
   "properties": {
     "jobs": {
       "$comment": "https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobs",
@@ -15,8 +22,15 @@
                 "timeout-minutes": {
                   "$comment": "https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes",
                   "description": "The maximum number of minutes to let a workflow run before GitHub automatically cancels it. Default: 360",
-                  "type": "number",
-                  "default": 360
+                  "default": 360,
+                  "oneOf": [
+                    {
+                      "type": "number"
+                    },
+                    {
+                      "$ref": "#/definitions/expressionSyntax"
+                    }
+                  ]
                 }
               },
               "required": [
diff --git a/src/check_jsonschema/builtin_schemas/vendor/dependabot.json b/src/check_jsonschema/builtin_schemas/vendor/dependabot.json
index 57dc97a..6275c14 100644
--- a/src/check_jsonschema/builtin_schemas/vendor/dependabot.json
+++ b/src/check_jsonschema/builtin_schemas/vendor/dependabot.json
@@ -1,585 +1,7 @@
 {
-  "$id": "https://json.schemastore.org/dependabot-2.0.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$schema": "http://json-schema.org/draft-04/schema#",
   "additionalProperties": false,
   "definitions": {
-    "timezone": {
-      "$id": "timezone",
-      "type": "string",
-      "enum": [
-        "Africa/Abidjan",
-        "Africa/Accra",
-        "Africa/Addis_Ababa",
-        "Africa/Algiers",
-        "Africa/Asmara",
-        "Africa/Asmera",
-        "Africa/Bamako",
-        "Africa/Bangui",
-        "Africa/Banjul",
-        "Africa/Bissau",
-        "Africa/Blantyre",
-        "Africa/Brazzaville",
-        "Africa/Bujumbura",
-        "Africa/Cairo",
-        "Africa/Casablanca",
-        "Africa/Ceuta",
-        "Africa/Conakry",
-        "Africa/Dakar",
-        "Africa/Dar_es_Salaam",
-        "Africa/Djibouti",
-        "Africa/Douala",
-        "Africa/El_Aaiun",
-        "Africa/Freetown",
-        "Africa/Gaborone",
-        "Africa/Harare",
-        "Africa/Johannesburg",
-        "Africa/Juba",
-        "Africa/Kampala",
-        "Africa/Khartoum",
-        "Africa/Kigali",
-        "Africa/Kinshasa",
-        "Africa/Lagos",
-        "Africa/Libreville",
-        "Africa/Lome",
-        "Africa/Luanda",
-        "Africa/Lubumbashi",
-        "Africa/Lusaka",
-        "Africa/Malabo",
-        "Africa/Maputo",
-        "Africa/Maseru",
-        "Africa/Mbabane",
-        "Africa/Mogadishu",
-        "Africa/Monrovia",
-        "Africa/Nairobi",
-        "Africa/Ndjamena",
-        "Africa/Niamey",
-        "Africa/Nouakchott",
-        "Africa/Ouagadougou",
-        "Africa/Porto-Novo",
-        "Africa/Sao_Tome",
-        "Africa/Timbuktu",
-        "Africa/Tripoli",
-        "Africa/Tunis",
-        "Africa/Windhoek",
-        "America/Adak",
-        "America/Anchorage",
-        "America/Anguilla",
-        "America/Antigua",
-        "America/Araguaina",
-        "America/Argentina/Buenos_Aires",
-        "America/Argentina/Catamarca",
-        "America/Argentina/ComodRivadavia",
-        "America/Argentina/Cordoba",
-        "America/Argentina/Jujuy",
-        "America/Argentina/La_Rioja",
-        "America/Argentina/Mendoza",
-        "America/Argentina/Rio_Gallegos",
-        "America/Argentina/Salta",
-        "America/Argentina/San_Juan",
-        "America/Argentina/San_Luis",
-        "America/Argentina/Tucuman",
-        "America/Argentina/Ushuaia",
-        "America/Aruba",
-        "America/Asuncion",
-        "America/Atikokan",
-        "America/Atka",
-        "America/Bahia",
-        "America/Bahia_Banderas",
-        "America/Barbados",
-        "America/Belem",
-        "America/Belize",
-        "America/Blanc-Sablon",
-        "America/Boa_Vista",
-        "America/Bogota",
-        "America/Boise",
-        "America/Buenos_Aires",
-        "America/Cambridge_Bay",
-        "America/Campo_Grande",
-        "America/Cancun",
-        "America/Caracas",
-        "America/Catamarca",
-        "America/Cayenne",
-        "America/Cayman",
-        "America/Chicago",
-        "America/Chihuahua",
-        "America/Coral_Harbour",
-        "America/Cordoba",
-        "America/Costa_Rica",
-        "America/Creston",
-        "America/Cuiaba",
-        "America/Curacao",
-        "America/Danmarkshavn",
-        "America/Dawson",
-        "America/Dawson_Creek",
-        "America/Denver",
-        "America/Detroit",
-        "America/Dominica",
-        "America/Edmonton",
-        "America/Eirunepe",
-        "America/El_Salvador",
-        "America/Ensenada",
-        "America/Fort_Nelson",
-        "America/Fort_Wayne",
-        "America/Fortaleza",
-        "America/Glace_Bay",
-        "America/Godthab",
-        "America/Goose_Bay",
-        "America/Grand_Turk",
-        "America/Grenada",
-        "America/Guadeloupe",
-        "America/Guatemala",
-        "America/Guayaquil",
-        "America/Guyana",
-        "America/Halifax",
-        "America/Havana",
-        "America/Hermosillo",
-        "America/Indiana/Indianapolis",
-        "America/Indiana/Knox",
-        "America/Indiana/Marengo",
-        "America/Indiana/Petersburg",
-        "America/Indiana/Tell_City",
-        "America/Indiana/Vevay",
-        "America/Indiana/Vincennes",
-        "America/Indiana/Winamac",
-        "America/Indianapolis",
-        "America/Inuvik",
-        "America/Iqaluit",
-        "America/Jamaica",
-        "America/Jujuy",
-        "America/Juneau",
-        "America/Kentucky/Louisville",
-        "America/Kentucky/Monticello",
-        "America/Knox_IN",
-        "America/Kralendijk",
-        "America/La_Paz",
-        "America/Lima",
-        "America/Los_Angeles",
-        "America/Louisville",
-        "America/Lower_Princes",
-        "America/Maceio",
-        "America/Managua",
-        "America/Manaus",
-        "America/Marigot",
-        "America/Martinique",
-        "America/Matamoros",
-        "America/Mazatlan",
-        "America/Mendoza",
-        "America/Menominee",
-        "America/Merida",
-        "America/Metlakatla",
-        "America/Mexico_City",
-        "America/Miquelon",
-        "America/Moncton",
-        "America/Monterrey",
-        "America/Montevideo",
-        "America/Montreal",
-        "America/Montserrat",
-        "America/Nassau",
-        "America/New_York",
-        "America/Nipigon",
-        "America/Nome",
-        "America/Noronha",
-        "America/North_Dakota/Beulah",
-        "America/North_Dakota/Center",
-        "America/North_Dakota/New_Salem",
-        "America/Nuuk",
-        "America/Ojinaga",
-        "America/Panama",
-        "America/Pangnirtung",
-        "America/Paramaribo",
-        "America/Phoenix",
-        "America/Port-au-Prince",
-        "America/Port_of_Spain",
-        "America/Porto_Acre",
-        "America/Porto_Velho",
-        "America/Puerto_Rico",
-        "America/Punta_Arenas",
-        "America/Rainy_River",
-        "America/Rankin_Inlet",
-        "America/Recife",
-        "America/Regina",
-        "America/Resolute",
-        "America/Rio_Branco",
-        "America/Rosario",
-        "America/Santa_Isabel",
-        "America/Santarem",
-        "America/Santiago",
-        "America/Santo_Domingo",
-        "America/Sao_Paulo",
-        "America/Scoresbysund",
-        "America/Shiprock",
-        "America/Sitka",
-        "America/St_Barthelemy",
-        "America/St_Johns",
-        "America/St_Kitts",
-        "America/St_Lucia",
-        "America/St_Thomas",
-        "America/St_Vincent",
-        "America/Swift_Current",
-        "America/Tegucigalpa",
-        "America/Thule",
-        "America/Thunder_Bay",
-        "America/Tijuana",
-        "America/Toronto",
-        "America/Tortola",
-        "America/Vancouver",
-        "America/Virgin",
-        "America/Whitehorse",
-        "America/Winnipeg",
-        "America/Yakutat",
-        "America/Yellowknife",
-        "Antarctica/Casey",
-        "Antarctica/Davis",
-        "Antarctica/DumontDUrville",
-        "Antarctica/Macquarie",
-        "Antarctica/Mawson",
-        "Antarctica/McMurdo",
-        "Antarctica/Palmer",
-        "Antarctica/Rothera",
-        "Antarctica/South_Pole",
-        "Antarctica/Syowa",
-        "Antarctica/Troll",
-        "Antarctica/Vostok",
-        "Arctic/Longyearbyen",
-        "Asia/Aden",
-        "Asia/Almaty",
-        "Asia/Amman",
-        "Asia/Anadyr",
-        "Asia/Aqtau",
-        "Asia/Aqtobe",
-        "Asia/Ashgabat",
-        "Asia/Ashkhabad",
-        "Asia/Atyrau",
-        "Asia/Baghdad",
-        "Asia/Bahrain",
-        "Asia/Baku",
-        "Asia/Bangkok",
-        "Asia/Barnaul",
-        "Asia/Beirut",
-        "Asia/Bishkek",
-        "Asia/Brunei",
-        "Asia/Calcutta",
-        "Asia/Chita",
-        "Asia/Choibalsan",
-        "Asia/Chongqing",
-        "Asia/Chungking",
-        "Asia/Colombo",
-        "Asia/Dacca",
-        "Asia/Damascus",
-        "Asia/Dhaka",
-        "Asia/Dili",
-        "Asia/Dubai",
-        "Asia/Dushanbe",
-        "Asia/Famagusta",
-        "Asia/Gaza",
-        "Asia/Harbin",
-        "Asia/Hebron",
-        "Asia/Ho_Chi_Minh",
-        "Asia/Hong_Kong",
-        "Asia/Hovd",
-        "Asia/Irkutsk",
-        "Asia/Istanbul",
-        "Asia/Jakarta",
-        "Asia/Jayapura",
-        "Asia/Jerusalem",
-        "Asia/Kabul",
-        "Asia/Kamchatka",
-        "Asia/Karachi",
-        "Asia/Kashgar",
-        "Asia/Kathmandu",
-        "Asia/Katmandu",
-        "Asia/Khandyga",
-        "Asia/Kolkata",
-        "Asia/Krasnoyarsk",
-        "Asia/Kuala_Lumpur",
-        "Asia/Kuching",
-        "Asia/Kuwait",
-        "Asia/Macao",
-        "Asia/Macau",
-        "Asia/Magadan",
-        "Asia/Makassar",
-        "Asia/Manila",
-        "Asia/Muscat",
-        "Asia/Nicosia",
-        "Asia/Novokuznetsk",
-        "Asia/Novosibirsk",
-        "Asia/Omsk",
-        "Asia/Oral",
-        "Asia/Phnom_Penh",
-        "Asia/Pontianak",
-        "Asia/Pyongyang",
-        "Asia/Qatar",
-        "Asia/Qostanay",
-        "Asia/Qyzylorda",
-        "Asia/Rangoon",
-        "Asia/Riyadh",
-        "Asia/Saigon",
-        "Asia/Sakhalin",
-        "Asia/Samarkand",
-        "Asia/Seoul",
-        "Asia/Shanghai",
-        "Asia/Singapore",
-        "Asia/Srednekolymsk",
-        "Asia/Taipei",
-        "Asia/Tashkent",
-        "Asia/Tbilisi",
-        "Asia/Tehran",
-        "Asia/Tel_Aviv",
-        "Asia/Thimbu",
-        "Asia/Thimphu",
-        "Asia/Tokyo",
-        "Asia/Tomsk",
-        "Asia/Ujung_Pandang",
-        "Asia/Ulaanbaatar",
-        "Asia/Ulan_Bator",
-        "Asia/Urumqi",
-        "Asia/Ust-Nera",
-        "Asia/Vientiane",
-        "Asia/Vladivostok",
-        "Asia/Yakutsk",
-        "Asia/Yangon",
-        "Asia/Yekaterinburg",
-        "Asia/Yerevan",
-        "Atlantic/Azores",
-        "Atlantic/Bermuda",
-        "Atlantic/Canary",
-        "Atlantic/Cape_Verde",
-        "Atlantic/Faeroe",
-        "Atlantic/Faroe",
-        "Atlantic/Jan_Mayen",
-        "Atlantic/Madeira",
-        "Atlantic/Reykjavik",
-        "Atlantic/South_Georgia",
-        "Atlantic/St_Helena",
-        "Atlantic/Stanley",
-        "Australia/ACT",
-        "Australia/Adelaide",
-        "Australia/Brisbane",
-        "Australia/Broken_Hill",
-        "Australia/Canberra",
-        "Australia/Currie",
-        "Australia/Darwin",
-        "Australia/Eucla",
-        "Australia/Hobart",
-        "Australia/LHI",
-        "Australia/Lindeman",
-        "Australia/Lord_Howe",
-        "Australia/Melbourne",
-        "Australia/North",
-        "Australia/NSW",
-        "Australia/Perth",
-        "Australia/Queensland",
-        "Australia/South",
-        "Australia/Sydney",
-        "Australia/Tasmania",
-        "Australia/Victoria",
-        "Australia/West",
-        "Australia/Yancowinna",
-        "Brazil/Acre",
-        "Brazil/DeNoronha",
-        "Brazil/East",
-        "Brazil/West",
-        "Canada/Atlantic",
-        "Canada/Central",
-        "Canada/Eastern",
-        "Canada/Mountain",
-        "Canada/Newfoundland",
-        "Canada/Pacific",
-        "Canada/Saskatchewan",
-        "Canada/Yukon",
-        "Chile/Continental",
-        "Chile/EasterIsland",
-        "Cuba",
-        "Egypt",
-        "Eire",
-        "Etc/GMT",
-        "Etc/GMT+0",
-        "Etc/GMT+1",
-        "Etc/GMT+10",
-        "Etc/GMT+11",
-        "Etc/GMT+12",
-        "Etc/GMT+2",
-        "Etc/GMT+3",
-        "Etc/GMT+4",
-        "Etc/GMT+5",
-        "Etc/GMT+6",
-        "Etc/GMT+7",
-        "Etc/GMT+8",
-        "Etc/GMT+9",
-        "Etc/GMT-0",
-        "Etc/GMT-1",
-        "Etc/GMT-10",
-        "Etc/GMT-11",
-        "Etc/GMT-12",
-        "Etc/GMT-13",
-        "Etc/GMT-14",
-        "Etc/GMT-2",
-        "Etc/GMT-3",
-        "Etc/GMT-4",
-        "Etc/GMT-5",
-        "Etc/GMT-6",
-        "Etc/GMT-7",
-        "Etc/GMT-8",
-        "Etc/GMT-9",
-        "Etc/GMT0",
-        "Etc/Greenwich",
-        "Etc/UCT",
-        "Etc/Universal",
-        "Etc/UTC",
-        "Etc/Zulu",
-        "Europe/Amsterdam",
-        "Europe/Andorra",
-        "Europe/Astrakhan",
-        "Europe/Athens",
-        "Europe/Belfast",
-        "Europe/Belgrade",
-        "Europe/Berlin",
-        "Europe/Bratislava",
-        "Europe/Brussels",
-        "Europe/Bucharest",
-        "Europe/Budapest",
-        "Europe/Busingen",
-        "Europe/Chisinau",
-        "Europe/Copenhagen",
-        "Europe/Dublin",
-        "Europe/Gibraltar",
-        "Europe/Guernsey",
-        "Europe/Helsinki",
-        "Europe/Isle_of_Man",
-        "Europe/Istanbul",
-        "Europe/Jersey",
-        "Europe/Kaliningrad",
-        "Europe/Kiev",
-        "Europe/Kirov",
-        "Europe/Lisbon",
-        "Europe/Ljubljana",
-        "Europe/London",
-        "Europe/Luxembourg",
-        "Europe/Madrid",
-        "Europe/Malta",
-        "Europe/Mariehamn",
-        "Europe/Minsk",
-        "Europe/Monaco",
-        "Europe/Moscow",
-        "Europe/Nicosia",
-        "Europe/Oslo",
-        "Europe/Paris",
-        "Europe/Podgorica",
-        "Europe/Prague",
-        "Europe/Riga",
-        "Europe/Rome",
-        "Europe/Samara",
-        "Europe/San_Marino",
-        "Europe/Sarajevo",
-        "Europe/Saratov",
-        "Europe/Simferopol",
-        "Europe/Skopje",
-        "Europe/Sofia",
-        "Europe/Stockholm",
-        "Europe/Tallinn",
-        "Europe/Tirane",
-        "Europe/Tiraspol",
-        "Europe/Ulyanovsk",
-        "Europe/Uzhgorod",
-        "Europe/Vaduz",
-        "Europe/Vatican",
-        "Europe/Vienna",
-        "Europe/Vilnius",
-        "Europe/Volgograd",
-        "Europe/Warsaw",
-        "Europe/Zagreb",
-        "Europe/Zaporozhye",
-        "Europe/Zurich",
-        "GB",
-        "GB-Eire",
-        "Hongkong",
-        "Iceland",
-        "Indian/Antananarivo",
-        "Indian/Chagos",
-        "Indian/Christmas",
-        "Indian/Cocos",
-        "Indian/Comoro",
-        "Indian/Kerguelen",
-        "Indian/Mahe",
-        "Indian/Maldives",
-        "Indian/Mauritius",
-        "Indian/Mayotte",
-        "Indian/Reunion",
-        "Iran",
-        "Israel",
-        "Jamaica",
-        "Japan",
-        "Kwajalein",
-        "Libya",
-        "Mexico/BajaNorte",
-        "Mexico/BajaSur",
-        "Mexico/General",
-        "Navajo",
-        "NZ",
-        "NZ-CHAT",
-        "Pacific/Apia",
-        "Pacific/Auckland",
-        "Pacific/Bougainville",
-        "Pacific/Chatham",
-        "Pacific/Chuuk",
-        "Pacific/Easter",
-        "Pacific/Efate",
-        "Pacific/Enderbury",
-        "Pacific/Fakaofo",
-        "Pacific/Fiji",
-        "Pacific/Funafuti",
-        "Pacific/Galapagos",
-        "Pacific/Gambier",
-        "Pacific/Guadalcanal",
-        "Pacific/Guam",
-        "Pacific/Honolulu",
-        "Pacific/Johnston",
-        "Pacific/Kanton",
-        "Pacific/Kiritimati",
-        "Pacific/Kosrae",
-        "Pacific/Kwajalein",
-        "Pacific/Majuro",
-        "Pacific/Marquesas",
-        "Pacific/Midway",
-        "Pacific/Nauru",
-        "Pacific/Niue",
-        "Pacific/Norfolk",
-        "Pacific/Noumea",
-        "Pacific/Pago_Pago",
-        "Pacific/Palau",
-        "Pacific/Pitcairn",
-        "Pacific/Pohnpei",
-        "Pacific/Ponape",
-        "Pacific/Port_Moresby",
-        "Pacific/Rarotonga",
-        "Pacific/Saipan",
-        "Pacific/Samoa",
-        "Pacific/Tahiti",
-        "Pacific/Tarawa",
-        "Pacific/Tongatapu",
-        "Pacific/Truk",
-        "Pacific/Wake",
-        "Pacific/Wallis",
-        "Pacific/Yap",
-        "Poland",
-        "Portugal",
-        "PRC",
-        "ROC",
-        "Singapore",
-        "US/Alaska",
-        "US/Aleutian",
-        "US/Arizona",
-        "US/Central",
-        "US/East-Indiana",
-        "US/Eastern",
-        "US/Hawaii",
-        "US/Indiana-Starke",
-        "US/Michigan",
-        "US/Mountain",
-        "US/Pacific",
-        "US/Samoa"
-      ]
-    },
     "dependency-type": {
       "type": "string",
       "enum": ["direct", "indirect", "all", "production", "development"],
@@ -610,9 +32,7 @@
           "version-update:semver-minor",
           "version-update:semver-patch"
         ]
-      },
-      "minItems": 1,
-      "uniqueItems": true
+      }
     },
     "insecure-external-code-execution": {
       "type": "string",
@@ -621,31 +41,32 @@
     "versioning-strategy": {
       "type": "string",
       "enum": [
+        "lockfile-only",
         "auto",
+        "widen",
         "increase",
-        "increase-if-necessary",
-        "lockfile-only",
-        "widen"
+        "increase-if-necessary"
       ],
       "x-intellij-enum-metadata": {
+        "lockfile-only": {
+          "description": "Only create pull requests to update lockfiles updates. Ignore any new versions that would require package manifest changes."
+        },
         "auto": {
-          "description": "Try to differentiate between apps and libraries. Use 'increase' for apps and 'widen' for libraries."
+          "description": "Follow the default strategy described above."
+        },
+        "widen": {
+          "description": "Relax the version requirement to include both the new and old version, when possible."
         },
         "increase": {
-          "description": "Always increase the minimum version requirement to match the new version. If a range already exists, typically this only increases the lower bound."
+          "description": "Always increase the version requirement to match the new version."
         },
         "increase-if-necessary": {
-          "description": "Leave the constraint if the original constraint allows the new version, otherwise, bump the constraint."
-        },
-        "lockfile-only": {
-          "description": "Only create pull requests to update lockfiles. Ignore any new versions that would require package manifest changes."
-        },
-        "widen": {
-          "description": "Widen the allowed version requirements to include both the new and old versions, when possible. Typically, this only increases the maximum allowed version requirement."
+          "description": "Increase the version requirement only when required by the new version."
         }
       }
     },
-    "package-ecosystem-values": {
+    "package-ecosystem": {
+      "type": "string",
       "enum": [
         "bundler",
         "cargo",
@@ -662,7 +83,6 @@
         "nuget",
         "pip",
         "pub",
-        "swift",
         "terraform"
       ]
     },
@@ -697,111 +117,39 @@
               "dependency-type": {
                 "$ref": "#/definitions/dependency-type"
               }
-            },
-            "anyOf": [
-              { "required": ["dependency-name"] },
-              { "required": ["dependency-type"] }
-            ],
-            "additionalProperties": false
+            }
           }
         },
         "assignees": {
           "description": "Assignees to set on pull requests",
           "type": "array",
           "items": {
-            "type": "string",
-            "minLength": 1
+            "type": "string"
           },
-          "minItems": 1,
-          "uniqueItems": true
+          "minimum": 1
         },
         "commit-message": {
-          "description": "Dependabot attempts to detect your commit message preferences and use similar patterns. Use this option to specify your preferences explicitly.",
+          "description": "Commit message preferences",
           "type": "object",
           "properties": {
             "prefix": {
-              "description": "A prefix for all commit messages. When you specify a prefix for commit messages, GitHub will automatically add a colon between the defined prefix and the commit message provided the defined prefix ends with a letter, number, closing parenthesis, or closing bracket. This means that, for example, if you end the prefix with a whitespace, there will be no colon added between the prefix and the commit message.",
-              "type": "string",
-              "maxLength": 50
+              "type": "string"
             },
             "prefix-development": {
-              "description": "A separate prefix for all commit messages that update dependencies in the Development dependency group. When you specify a value for this option, the prefix is used only for updates to dependencies in the Production dependency group. This is not supported by all package ecosystems.",
-              "type": "string",
-              "maxLength": 50
+              "type": "string"
             },
             "include": {
-              "description": "Specifies that any prefix is followed by a list of the dependencies updated in the commit.",
               "type": "string",
               "enum": ["scope"],
               "default": "scope"
             }
-          },
-          "anyOf": [
-            { "required": ["prefix"] },
-            { "required": ["prefix-development"] },
-            { "required": ["include"] }
-          ],
-          "additionalProperties": false
+          }
         },
         "directory": {
           "description": "Location of package manifests",
           "type": "string",
           "default": "/"
         },
-        "groups": {
-          "description": "Configure groups for dependencies. Each 'groups' property is arbitrary will appear in pull request titles and branch names. For example, the code snippet '{\"groups\": {\"NPM dependencies\": {\"patterns\": [\"*\"]}}}' sets the group name to 'NPM dependencies'.",
-          "type": "object",
-          "patternProperties": {
-            "^.+$": {
-              "type": "object",
-              "properties": {
-                "dependency-type": {
-                  "description": "Specify a dependency type to be included in the group.",
-                  "type": "string",
-                  "enum": ["development", "production"]
-                },
-                "patterns": {
-                  "description": "Define strings of characters that match with a dependency name (or multiple dependency names) to include those dependencies in the group.",
-                  "type": "array",
-                  "items": {
-                    "type": "string",
-                    "minLength": 1
-                  },
-                  "uniqueItems": true,
-                  "minItems": 1
-                },
-                "exclude-patterns": {
-                  "description": "Exclude certain dependencies from the group. If a dependency is excluded from a group, Dependabot will continue to raise single pull requests to update the dependency to its latest version.",
-                  "type": "array",
-                  "items": {
-                    "type": "string",
-                    "minLength": 1
-                  },
-                  "uniqueItems": true,
-                  "minItems": 1
-                },
-                "update-types": {
-                  "description": "Specify the semantic versioning level to include in the group",
-                  "type": "array",
-                  "items": {
-                    "type": "string",
-                    "enum": ["major", "minor", "patch"]
-                  },
-                  "minItems": 1,
-                  "uniqueItems": true
-                }
-              },
-              "anyOf": [
-                { "required": ["dependency-type"] },
-                { "required": ["patterns"] },
-                { "required": ["update-types"] }
-              ],
-              "additionalProperties": false
-            }
-          },
-          "additionalProperties": false,
-          "minProperties": 1
-        },
         "ignore": {
           "description": "Ignore certain dependencies or versions",
           "type": "array",
@@ -809,29 +157,18 @@
             "type": "object",
             "properties": {
               "dependency-name": {
-                "description": "Use to ignore updates for dependencies with matching names, optionally using * to match zero or more characters.",
                 "type": "string"
               },
               "update-types": {
-                "description": "Use to ignore types of updates. You can combine this with 'dependency-name: \"*\"' to ignore particular update-types for all dependencies.",
                 "$ref": "#/definitions/update-types"
               },
               "versions": {
-                "description": "Use to ignore specific versions or ranges of versions. If you want to define a range, use the standard pattern for the package manager.",
                 "type": "array",
                 "items": {
                   "type": "string"
-                },
-                "minItems": 1,
-                "uniqueItems": true
+                }
               }
-            },
-            "anyOf": [
-              { "required": ["dependency-name"] },
-              { "required": ["update-types"] },
-              { "required": ["versions"] }
-            ],
-            "additionalProperties": false
+            }
           }
         },
         "insecure-external-code-execution": {
@@ -842,32 +179,29 @@
           "description": "Labels to set on pull requests",
           "type": "array",
           "items": {
-            "type": "string",
-            "minLength": 1
+            "type": "string"
           },
-          "minItems": 0,
-          "uniqueItems": true,
           "default": ["dependencies"]
         },
         "milestone": {
-          "description": "Associate all pull requests raised for a package manager with a milestone. You need to specify the numeric identifier of the milestone and not its label.",
-          "type": "integer",
-          "minimum": 1
+          "description": "Milestone to set on pull requests",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "integer"
+            }
+          ]
         },
         "open-pull-requests-limit": {
           "description": "Limit number of open pull requests for version updates",
           "type": "integer",
-          "minimum": 0,
           "default": 5
         },
         "package-ecosystem": {
           "description": "Package manager to use",
-          "$comment": "These values are restricted by a top-level if-then-else when 'enable-beta-ecosystems' is not enabled.",
-          "type": "string",
-          "anyOf": [
-            { "$ref": "#/definitions/package-ecosystem-values" },
-            { "minLength": 1 }
-          ]
+          "$ref": "#/definitions/package-ecosystem"
         },
         "pull-request-branch-name": {
           "description": "Pull request branch name preferences",
@@ -880,33 +214,21 @@
               "enum": ["-", "_", "/"]
             }
           },
-          "required": ["separator"],
-          "additionalProperties": false
+          "required": ["separator"]
         },
         "rebase-strategy": {
-          "description": "Disable automatic rebasing. 'auto' is the default and Dependabot will rebase open pull requests when changes are detected. 'disabled' will disable automatic rebasing.",
+          "description": "Disable automatic rebasing",
           "type": "string",
           "enum": ["auto", "disabled"],
           "default": "auto"
         },
-        "registries": {
-          "type": "array",
-          "items": {
-            "type": "string",
-            "minLength": 1
-          },
-          "uniqueItems": true,
-          "minItems": 1
-        },
         "reviewers": {
           "type": "array",
           "items": {
-            "type": "string",
-            "minLength": 1
+            "type": "string"
           },
-          "description": "Specify individual reviewers or teams of reviewers for all pull requests raised for a package manager. You must use the full team name, including the organization, as if you were @mentioning the team.",
-          "minItems": 1,
-          "uniqueItems": true
+          "description": "Reviewers to set on pull requests",
+          "minimum": 1
         },
         "schedule": {
           "description": "Schedule preferences",
@@ -921,23 +243,21 @@
             },
             "time": {
               "type": "string",
-              "description": "Specify an alternative time of day to check for updates (format: hh:mm)",
-              "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$"
+              "description": "Specify an alternative time of day to check for updates (format: hh:mm)"
             },
             "timezone": {
-              "$ref": "#/definitions/timezone",
-              "description": "The time zone identifier must be from the Time Zone database maintained by IANA"
+              "type": "string",
+              "description": "The time zone identifier must be from the Time Zone database maintained by IANA",
+              "default": "05:00 UTC"
             }
-          },
-          "required": ["interval"]
+          }
         },
         "target-branch": {
-          "description": "Specify a different branch for manifest files and for pull requests.",
           "type": "string",
-          "minLength": 1
+          "description": "Branch to create pull requests against"
         },
         "vendor": {
-          "description": "Tell Dependabot to vendor dependencies when updating them. Don't use this option if you're using 'gomod'.",
+          "description": "Update vendored or cached dependencies",
           "type": "boolean"
         },
         "versioning-strategy": {
@@ -949,10 +269,11 @@
     },
     "registry": {
       "type": "object",
+      "title": "registries",
       "description": "The top-level registries key is optional. It allows you to specify authentication details that Dependabot can use to access private package registries.",
       "additionalProperties": false,
       "patternProperties": {
-        ".+": {
+        ".*": {
           "type": "object",
           "additionalProperties": false,
           "properties": {
@@ -973,7 +294,7 @@
               ]
             },
             "url": {
-              "description": "The URL to use to access the dependencies in this registry. The protocol is optional. If not specified, 'https://' is assumed. Dependabot adds or ignores trailing slashes as required.",
+              "description": "The URL to use to access the dependencies in this registry. The protocol is optional. If not specified, https:// is assumed. Dependabot adds or ignores trailing slashes as required.",
               "type": "string"
             },
             "username": {
@@ -1013,18 +334,24 @@
               "type": "string"
             }
           },
-          "required": ["type", "url"]
+          "required": ["type"]
         }
-      },
-      "minProperties": 1
+      }
     }
   },
+  "id": "https://json.schemastore.org/dependabot-2.0.json",
   "properties": {
     "version": {
-      "title": "Config file version",
-      "description": "Dependabot configuration files require this key, and its value must be 2",
-      "type": "integer",
-      "enum": [2]
+      "anyOf": [
+        {
+          "type": "string",
+          "default": "2"
+        },
+        {
+          "type": "integer",
+          "default": 2
+        }
+      ]
     },
     "enable-beta-ecosystems": {
       "description": "Enable ecosystems that have beta-level support",
@@ -1039,37 +366,11 @@
       }
     },
     "registries": {
+      "type": "object",
       "$ref": "#/definitions/registry"
     }
   },
   "required": ["version", "updates"],
   "title": "GitHub Dependabot v2 config",
-  "type": "object",
-  "allOf": [
-    {
-      "$comment": "If 'enable-beta-ecosystems' is NOT enabled, enforce known 'package-ecosystem' values.",
-      "if": {
-        "properties": {
-          "enable-beta-ecosystems": {
-            "const": true
-          }
-        },
-        "required": ["enable-beta-ecosystems"]
-      },
-      "then": {},
-      "else": {
-        "properties": {
-          "updates": {
-            "items": {
-              "properties": {
-                "package-ecosystem": {
-                  "$ref": "#/definitions/package-ecosystem-values"
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  ]
+  "type": "object"
 }
diff --git a/src/check_jsonschema/builtin_schemas/vendor/dependabot.sha256 b/src/check_jsonschema/builtin_schemas/vendor/dependabot.sha256
index 2d3e7a4..9751104 100644
--- a/src/check_jsonschema/builtin_schemas/vendor/dependabot.sha256
+++ b/src/check_jsonschema/builtin_schemas/vendor/dependabot.sha256
@@ -1,1 +1,1 @@
-34087162da710c134ccfc14259eedc9a4492bdaf5937def29d1f5ca0ce468892
\ No newline at end of file
+dfbd8f86b013120a07c3200962189c8bb8b8c77a592b66b59bb71937ef8cb2ed
\ No newline at end of file
diff --git a/src/check_jsonschema/builtin_schemas/vendor/github-workflows.json b/src/check_jsonschema/builtin_schemas/vendor/github-workflows.json
index f928109..e86acf3 100644
--- a/src/check_jsonschema/builtin_schemas/vendor/github-workflows.json
+++ b/src/check_jsonschema/builtin_schemas/vendor/github-workflows.json
@@ -480,7 +480,7 @@
           "$ref": "#/definitions/jobNeeds"
         },
         "permissions": {
-          "$ref": "#/definitions/permissions"
+          "$ref": "#/definitions/permissions-event"
         },
         "if": {
           "$comment": "https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idif",
diff --git a/src/check_jsonschema/builtin_schemas/vendor/github-workflows.sha256 b/src/check_jsonschema/builtin_schemas/vendor/github-workflows.sha256
index edf6c51..80ed8c4 100644
--- a/src/check_jsonschema/builtin_schemas/vendor/github-workflows.sha256
+++ b/src/check_jsonschema/builtin_schemas/vendor/github-workflows.sha256
@@ -1,1 +1,1 @@
-168be6238de16c732dbe0badfa10b69b1e74797f58f55317b85069fb24d791e0
\ No newline at end of file
+d6b4a34d766fdb5f328dd0580fb6845470a25e4c1dca0b5d1459724193e26bde
\ No newline at end of file
diff --git a/src/check_jsonschema/builtin_schemas/vendor/renovate.json b/src/check_jsonschema/builtin_schemas/vendor/renovate.json
index 022e368..2f860d4 100644
--- a/src/check_jsonschema/builtin_schemas/vendor/renovate.json
+++ b/src/check_jsonschema/builtin_schemas/vendor/renovate.json
@@ -623,14 +623,6 @@
       },
       "$ref": "#"
     },
-    "crossplane": {
-      "description": "Configuration object for the crossplane manager",
-      "type": "object",
-      "default": {
-        "fileMatch": []
-      },
-      "$ref": "#"
-    },
     "customDatasources": {
       "description": "Defines custom datasources for usage by managers.",
       "type": "object",
@@ -888,7 +880,7 @@
     "dockerSidecarImage": {
       "description": "Change this value to override the default Renovate sidecar image.",
       "type": "string",
-      "default": "ghcr.io/containerbase/sidecar:9.24.0"
+      "default": "ghcr.io/containerbase/sidecar:9.23.9"
     },
     "dockerUser": {
       "description": "Set the `UID` and `GID` for Docker-based binaries if you use `binarySource=docker`.",
@@ -965,11 +957,6 @@
       "type": "integer",
       "default": 15
     },
-    "expandCodeOwnersGroups": {
-      "description": "Expand the configured code owner groups into a full list of group members.",
-      "type": "boolean",
-      "default": false
-    },
     "exposeAllEnv": {
       "description": "Set this to `true` to allow passing of all environment variables to package managers.",
       "type": "boolean",
@@ -994,8 +981,8 @@
       "type": "string",
       "format": "regex"
     },
-    "fetchChangeLogs": {
-      "description": "Controls if and when changelogs/release notes are fetched.",
+    "fetchReleaseNotes": {
+      "description": "Controls if and when release notes are fetched.",
       "type": "string",
       "enum": [
         "off",
@@ -1171,7 +1158,7 @@
       "type": "object",
       "default": {
         "fileMatch": [
-          "(^|/)(workflow-templates|\\.(?:github|gitea|forgejo)/workflows)/[^/]+\\.ya?ml$",
+          "^(workflow-templates|\\.(?:github|gitea|forgejo)/workflows)/[^/]+\\.ya?ml$",
           "(^|/)action\\.ya?ml$"
         ]
       },
diff --git a/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 b/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256
index 4c28e75..23fb870 100644
--- a/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256
+++ b/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256
@@ -1,1 +1,1 @@
-e5aaa54d64684924f8ca840403386b73e1aa50ebe46b37113455295438e96e0a
\ No newline at end of file
+d381330186745f5f9c9594bf3d3e5280805c48fed0d708662d20559d6b45603a
\ No newline at end of file


Test patch:
diff --git a/tests/acceptance/test_example_files.py b/tests/acceptance/test_example_files.py
index 3b23e2c..94980f8 100644
--- a/tests/acceptance/test_example_files.py
+++ b/tests/acceptance/test_example_files.py
@@ -64,7 +64,7 @@ def test_hook_positive_examples(case_name, run_line):
 
     hook_id = POSITIVE_HOOK_CASES[case_name]
     ret = run_line(HOOK_CONFIG[hook_id] + [rcase.path] + rcase.add_args)
-    assert ret.exit_code == 0
+    assert ret.exit_code == 0, _format_cli_result(rcase, ret)
 
 
 @pytest.mark.parametrize("case_name", NEGATIVE_HOOK_CASES.keys())
@@ -73,7 +73,7 @@ def test_hook_negative_examples(case_name, run_line):
 
     hook_id = NEGATIVE_HOOK_CASES[case_name]
     ret = run_line(HOOK_CONFIG[hook_id] + [rcase.path] + rcase.add_args)
-    assert ret.exit_code == 1
+    assert ret.exit_code == 1, _format_cli_result(rcase, ret)
 
 
 @pytest.mark.parametrize("case_name", _get_explicit_cases("positive"))
@@ -167,3 +167,13 @@ def _package_is_installed(pkg: str) -> bool:
     if spec is None:
         return False
     return True
+
+
+def _format_cli_result(rcase: ResolvedCase, result) -> str:
+    return (
+        "\n"
+        f"config.add_args={rcase.add_args}\n"
+        f"{result.exit_code=}\n"
+        f"result.stdout={result.output}\n"
+        f"{result.stderr=}"
+    )
diff --git a/tests/example-files/hooks/negative/jsonschema/_config.yaml b/tests/example-files/hooks/negative/jsonschema/_config.yaml
new file mode 100644
index 0000000..68e9596
--- /dev/null
+++ b/tests/example-files/hooks/negative/jsonschema/_config.yaml
@@ -0,0 +1,3 @@
+files:
+  github-workflow-timeout-minutes-expression.yaml:
+    add_args: ["--builtin-schema", "custom.github-workflows-require-timeout"]
diff --git a/tests/example-files/hooks/negative/jsonschema/github-workflow-timeout-minutes-expression.yaml b/tests/example-files/hooks/negative/jsonschema/github-workflow-timeout-minutes-expression.yaml
new file mode 100644
index 0000000..3a7324a
--- /dev/null
+++ b/tests/example-files/hooks/negative/jsonschema/github-workflow-timeout-minutes-expression.yaml
@@ -0,0 +1,12 @@
+on:
+  workflow-call:
+    inputs:
+      qemu:
+          default: ''
+          required: false
+
+jobs:
+  job-id:
+    runs-on: ubuntu-latest
+    # missing trailing '}'
+    timeout-minutes: ${{ inputs.qemu && '60' || '20' }
diff --git a/tests/example-files/hooks/positive/jsonschema/_config.yaml b/tests/example-files/hooks/positive/jsonschema/_config.yaml
new file mode 100644
index 0000000..68e9596
--- /dev/null
+++ b/tests/example-files/hooks/positive/jsonschema/_config.yaml
@@ -0,0 +1,3 @@
+files:
+  github-workflow-timeout-minutes-expression.yaml:
+    add_args: ["--builtin-schema", "custom.github-workflows-require-timeout"]
diff --git a/tests/example-files/hooks/positive/jsonschema/github-workflow-timeout-minutes-expression.yaml b/tests/example-files/hooks/positive/jsonschema/github-workflow-timeout-minutes-expression.yaml
new file mode 100644
index 0000000..4b30a1c
--- /dev/null
+++ b/tests/example-files/hooks/positive/jsonschema/github-workflow-timeout-minutes-expression.yaml
@@ -0,0 +1,11 @@
+on:
+  workflow-call:
+    inputs:
+      qemu:
+          default: ''
+          required: false
+
+jobs:
+  job-id:
+    runs-on: ubuntu-latest
+    timeout-minutes: ${{ inputs.qemu && '60' || '20' }}