@rathnasgala2/schemas 3.24.0 → 3.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/THIRD_PARTY_LICENSES.json +1 -1
  2. package/diagnostics/diagnostic-map.json +264 -0
  3. package/docs/catalogs/app-components.json +239 -1
  4. package/docs/catalogs/app-routes.json +69 -1
  5. package/docs/catalogs/schema-inventory.json +7 -7
  6. package/examples/valid/build-input/rules.json +118 -0
  7. package/examples/valid/content-frontmatter/rules.json +11 -0
  8. package/examples/valid/deployment-receipt/rules.json +150 -0
  9. package/examples/valid/problem/rules.json +64 -0
  10. package/examples/valid/publication/rules.json +107 -0
  11. package/fixtures/boundary/build-input/rules.json +127 -0
  12. package/fixtures/boundary/content-frontmatter/rules.json +11 -0
  13. package/fixtures/boundary/deployment-receipt/rules.json +163 -0
  14. package/fixtures/boundary/problem/rules.json +64 -0
  15. package/fixtures/boundary/publication/rules.json +116 -0
  16. package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +38 -0
  17. package/fixtures/invalid/build-input/SCHEMA_ENUM_INVALID/cases.json +18 -0
  18. package/fixtures/invalid/build-input/SCHEMA_NUMBER_TOO_LARGE/cases.json +11 -0
  19. package/fixtures/invalid/build-input/SCHEMA_NUMBER_TOO_SMALL/cases.json +44 -0
  20. package/fixtures/invalid/build-input/SCHEMA_PATTERN_INVALID/cases.json +9 -0
  21. package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +18 -0
  22. package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +89 -0
  23. package/fixtures/invalid/content-frontmatter/SCHEMA_PATTERN_INVALID/cases.json +9 -0
  24. package/fixtures/invalid/content-frontmatter/SCHEMA_TYPE_INVALID/cases.json +9 -0
  25. package/fixtures/invalid/deployment-receipt/REQUEST_FIELD_UNKNOWN/cases.json +51 -0
  26. package/fixtures/invalid/deployment-receipt/SCHEMA_ARRAY_TOO_LONG/cases.json +15 -0
  27. package/fixtures/invalid/deployment-receipt/SCHEMA_ENUM_INVALID/cases.json +11 -0
  28. package/fixtures/invalid/deployment-receipt/SCHEMA_NUMBER_TOO_SMALL/cases.json +66 -0
  29. package/fixtures/invalid/deployment-receipt/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +101 -0
  30. package/fixtures/invalid/deployment-receipt/SCHEMA_TYPE_INVALID/cases.json +108 -0
  31. package/fixtures/invalid/problem/REQUEST_FIELD_UNKNOWN/cases.json +15 -0
  32. package/fixtures/invalid/problem/SCHEMA_NUMBER_TOO_SMALL/cases.json +44 -0
  33. package/fixtures/invalid/problem/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +56 -0
  34. package/fixtures/invalid/problem/SCHEMA_TYPE_INVALID/cases.json +53 -0
  35. package/fixtures/invalid/publication/REQUEST_FIELD_UNKNOWN/cases.json +38 -0
  36. package/fixtures/invalid/publication/SCHEMA_ENUM_INVALID/cases.json +18 -0
  37. package/fixtures/invalid/publication/SCHEMA_NUMBER_TOO_LARGE/cases.json +13 -0
  38. package/fixtures/invalid/publication/SCHEMA_NUMBER_TOO_SMALL/cases.json +46 -0
  39. package/fixtures/invalid/publication/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +18 -0
  40. package/fixtures/invalid/publication/SCHEMA_TYPE_INVALID/cases.json +80 -0
  41. package/fixtures/manifest.json +2034 -10
  42. package/fixtures/unknown-field/build-input/rules.json +63 -0
  43. package/fixtures/unknown-field/content-frontmatter/rules.json +2 -0
  44. package/fixtures/unknown-field/deployment-receipt/rules.json +76 -0
  45. package/fixtures/unknown-field/problem/rules.json +30 -0
  46. package/fixtures/unknown-field/publication/rules.json +61 -0
  47. package/generated/browser/validator-core.mjs +3 -3
  48. package/generated/typescript/contracts/build-input.d.ts +24 -0
  49. package/generated/typescript/contracts/content-frontmatter.d.ts +3 -0
  50. package/generated/typescript/contracts/deployment-receipt.d.ts +18 -0
  51. package/generated/typescript/contracts/problem.d.ts +6 -0
  52. package/generated/typescript/contracts/publication.d.ts +21 -0
  53. package/openapi/http-catalog.json +28 -2
  54. package/openapi/openapi.yaml +487 -6
  55. package/package.json +1 -1
  56. package/sbom.cdx.json +23 -23
  57. package/schemas/build-input.schema.json +47 -0
  58. package/schemas/content-frontmatter.schema.json +6 -0
  59. package/schemas/deployment-receipt.schema.json +35 -0
  60. package/schemas/problem.schema.json +17 -0
  61. package/schemas/publication.schema.json +41 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rathnasgala2/schemas",
3
- "version": "3.24.0",
3
+ "version": "3.25.1",
4
4
  "description": "Executable JSON Schema and OpenAPI contracts for Galascribe",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
package/sbom.cdx.json CHANGED
@@ -97,8 +97,8 @@
97
97
  "type": "library",
98
98
  "name": "schemas",
99
99
  "group": "@rathnasgala2",
100
- "version": "3.24.0",
101
- "bom-ref": "@rathnasgala2/schemas@3.24.0",
100
+ "version": "3.25.1",
101
+ "bom-ref": "@rathnasgala2/schemas@3.25.1",
102
102
  "description": "Executable JSON Schema and OpenAPI contracts for Galascribe",
103
103
  "licenses": [
104
104
  {
@@ -108,7 +108,7 @@
108
108
  }
109
109
  }
110
110
  ],
111
- "purl": "pkg:npm/%40rathnasgala2/schemas@3.24.0?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2Frathnasgala2%2Fschema.git",
111
+ "purl": "pkg:npm/%40rathnasgala2/schemas@3.25.1?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2Frathnasgala2%2Fschema.git",
112
112
  "externalReferences": [
113
113
  {
114
114
  "url": "https://github.com/rathnasgala2/schema/issues",
@@ -153,7 +153,7 @@
153
153
  "type": "library",
154
154
  "name": "ajv-formats",
155
155
  "version": "3.0.1",
156
- "bom-ref": "@rathnasgala2/schemas@3.24.0|ajv-formats@3.0.1",
156
+ "bom-ref": "@rathnasgala2/schemas@3.25.1|ajv-formats@3.0.1",
157
157
  "licenses": [
158
158
  {
159
159
  "license": {
@@ -187,7 +187,7 @@
187
187
  "type": "library",
188
188
  "name": "ajv",
189
189
  "version": "8.20.0",
190
- "bom-ref": "@rathnasgala2/schemas@3.24.0|ajv@8.20.0",
190
+ "bom-ref": "@rathnasgala2/schemas@3.25.1|ajv@8.20.0",
191
191
  "licenses": [
192
192
  {
193
193
  "license": {
@@ -221,7 +221,7 @@
221
221
  "type": "library",
222
222
  "name": "fast-deep-equal",
223
223
  "version": "3.1.3",
224
- "bom-ref": "@rathnasgala2/schemas@3.24.0|fast-deep-equal@3.1.3",
224
+ "bom-ref": "@rathnasgala2/schemas@3.25.1|fast-deep-equal@3.1.3",
225
225
  "licenses": [
226
226
  {
227
227
  "license": {
@@ -255,7 +255,7 @@
255
255
  "type": "library",
256
256
  "name": "fast-uri",
257
257
  "version": "3.1.8",
258
- "bom-ref": "@rathnasgala2/schemas@3.24.0|fast-uri@3.1.8",
258
+ "bom-ref": "@rathnasgala2/schemas@3.25.1|fast-uri@3.1.8",
259
259
  "licenses": [
260
260
  {
261
261
  "license": {
@@ -289,7 +289,7 @@
289
289
  "type": "library",
290
290
  "name": "json-schema-traverse",
291
291
  "version": "1.0.0",
292
- "bom-ref": "@rathnasgala2/schemas@3.24.0|json-schema-traverse@1.0.0",
292
+ "bom-ref": "@rathnasgala2/schemas@3.25.1|json-schema-traverse@1.0.0",
293
293
  "licenses": [
294
294
  {
295
295
  "license": {
@@ -323,7 +323,7 @@
323
323
  "type": "library",
324
324
  "name": "require-from-string",
325
325
  "version": "2.0.2",
326
- "bom-ref": "@rathnasgala2/schemas@3.24.0|require-from-string@2.0.2",
326
+ "bom-ref": "@rathnasgala2/schemas@3.25.1|require-from-string@2.0.2",
327
327
  "licenses": [
328
328
  {
329
329
  "license": {
@@ -1064,10 +1064,10 @@
1064
1064
  ],
1065
1065
  "dependencies": [
1066
1066
  {
1067
- "ref": "@rathnasgala2/schemas@3.24.0",
1067
+ "ref": "@rathnasgala2/schemas@3.25.1",
1068
1068
  "dependsOn": [
1069
- "@rathnasgala2/schemas@3.24.0|ajv-formats@3.0.1",
1070
- "@rathnasgala2/schemas@3.24.0|ajv@8.20.0",
1069
+ "@rathnasgala2/schemas@3.25.1|ajv-formats@3.0.1",
1070
+ "@rathnasgala2/schemas@3.25.1|ajv@8.20.0",
1071
1071
  "pkg:npm/semver@7.8.5",
1072
1072
  "urn:gala:source-data:iana-ipv4-special-registry",
1073
1073
  "urn:gala:source-data:iana-ipv6-special-registry",
@@ -1089,31 +1089,31 @@
1089
1089
  ]
1090
1090
  },
1091
1091
  {
1092
- "ref": "@rathnasgala2/schemas@3.24.0|ajv-formats@3.0.1",
1092
+ "ref": "@rathnasgala2/schemas@3.25.1|ajv-formats@3.0.1",
1093
1093
  "dependsOn": [
1094
- "@rathnasgala2/schemas@3.24.0|ajv@8.20.0"
1094
+ "@rathnasgala2/schemas@3.25.1|ajv@8.20.0"
1095
1095
  ]
1096
1096
  },
1097
1097
  {
1098
- "ref": "@rathnasgala2/schemas@3.24.0|ajv@8.20.0",
1098
+ "ref": "@rathnasgala2/schemas@3.25.1|ajv@8.20.0",
1099
1099
  "dependsOn": [
1100
- "@rathnasgala2/schemas@3.24.0|fast-deep-equal@3.1.3",
1101
- "@rathnasgala2/schemas@3.24.0|fast-uri@3.1.8",
1102
- "@rathnasgala2/schemas@3.24.0|json-schema-traverse@1.0.0",
1103
- "@rathnasgala2/schemas@3.24.0|require-from-string@2.0.2"
1100
+ "@rathnasgala2/schemas@3.25.1|fast-deep-equal@3.1.3",
1101
+ "@rathnasgala2/schemas@3.25.1|fast-uri@3.1.8",
1102
+ "@rathnasgala2/schemas@3.25.1|json-schema-traverse@1.0.0",
1103
+ "@rathnasgala2/schemas@3.25.1|require-from-string@2.0.2"
1104
1104
  ]
1105
1105
  },
1106
1106
  {
1107
- "ref": "@rathnasgala2/schemas@3.24.0|fast-deep-equal@3.1.3"
1107
+ "ref": "@rathnasgala2/schemas@3.25.1|fast-deep-equal@3.1.3"
1108
1108
  },
1109
1109
  {
1110
- "ref": "@rathnasgala2/schemas@3.24.0|fast-uri@3.1.8"
1110
+ "ref": "@rathnasgala2/schemas@3.25.1|fast-uri@3.1.8"
1111
1111
  },
1112
1112
  {
1113
- "ref": "@rathnasgala2/schemas@3.24.0|json-schema-traverse@1.0.0"
1113
+ "ref": "@rathnasgala2/schemas@3.25.1|json-schema-traverse@1.0.0"
1114
1114
  },
1115
1115
  {
1116
- "ref": "@rathnasgala2/schemas@3.24.0|require-from-string@2.0.2"
1116
+ "ref": "@rathnasgala2/schemas@3.25.1|require-from-string@2.0.2"
1117
1117
  },
1118
1118
  {
1119
1119
  "ref": "pkg:npm/semver@7.8.5"
@@ -514,6 +514,9 @@
514
514
  "properties": { "ai": { "enum": ["allow", "block"] } },
515
515
  "additionalProperties": false
516
516
  },
517
+ "listing": { "$ref": "#/$defs/listing" },
518
+ "aiRights": { "$ref": "#/$defs/aiRights" },
519
+ "performance": { "$ref": "#/$defs/performance" },
517
520
  "newsletter": { "$ref": "#/$defs/newsletter" },
518
521
  "sharing": { "$ref": "#/$defs/sharing" },
519
522
  "contactForm": { "$ref": "#/$defs/contactFormNormalized" },
@@ -593,6 +596,49 @@
593
596
  "additionalProperties": false,
594
597
  "description": "SCHEMA-3.22.0: the share buttons shown on each article. `targets` is the display order: 0 to 11 unique members of the closed target set. An absent `sharing` member means `[\"copy-link\"]` (the Copy link button only); an empty `targets` array means no share buttons. `native` is shown only where the browser offers the system share sheet; every other target is a plain link to that service's documented share URL. Bookmark is not a share target and is unaffected."
595
598
  },
599
+ "listing": {
600
+ "type": "object",
601
+ "required": [],
602
+ "properties": {
603
+ "pageSize": { "type": "integer", "minimum": 1, "maximum": 50 }
604
+ },
605
+ "additionalProperties": false,
606
+ "description": "SCHEMA-3.25.0: listing settings. `pageSize` is the number of posts on each listing page (1 to 50); an absent member means 10."
607
+ },
608
+ "aiRights": {
609
+ "type": "object",
610
+ "required": ["search", "training"],
611
+ "properties": {
612
+ "search": { "enum": ["allow", "block"] },
613
+ "training": { "enum": ["allow", "block"] },
614
+ "licenseUrl": { "$ref": "#/$defs/urlHttps" }
615
+ },
616
+ "additionalProperties": false,
617
+ "description": "SCHEMA-3.25.0: how AI systems may use the writing. `search` covers search and answer bots, `training` covers training crawlers. When present it wins over `crawlers.ai`; when absent, `crawlers.ai` allow means both allow and block means both block. `licenseUrl` is the optional https URL of the license terms."
618
+ },
619
+ "performance": {
620
+ "type": "object",
621
+ "required": [],
622
+ "properties": {
623
+ "budgets": {
624
+ "type": "object",
625
+ "required": [],
626
+ "properties": {
627
+ "htmlBytes": { "type": "integer", "minimum": 1024 },
628
+ "cssBytes": { "type": "integer", "minimum": 1024 },
629
+ "jsBytes": { "type": "integer", "minimum": 1024 }
630
+ },
631
+ "additionalProperties": false
632
+ }
633
+ },
634
+ "additionalProperties": false,
635
+ "description": "SCHEMA-3.25.0: size budgets in bytes, each at least 1024 and optional. `htmlBytes` bounds a page's HTML, `cssBytes` and `jsBytes` bound the sum of the same-origin stylesheets and scripts a page links. A page over budget is reported; a budget never fails a build."
636
+ },
637
+ "deleteDate": {
638
+ "type": "string",
639
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
640
+ "description": "SCHEMA-3.25.0: the calendar date (`YYYY-MM-DD`, day precision, read in the publication's staggered-release timezone) on or after which Galascribe removes this article from the published site: it leaves every listing, feed, sitemap and search index and its route renders a removed-post notice. Same format as `publishAfter`; it must be later than `publishAfter` and `date` when both exist. The API enforces that rule; the schema only fixes the shape."
641
+ },
596
642
  "contactFormNormalized": {
597
643
  "type": "object",
598
644
  "required": ["enabled", "fields"],
@@ -971,6 +1017,7 @@
971
1017
  },
972
1018
  "edition": { "$ref": "#/$defs/contentEdition" },
973
1019
  "seo": { "$ref": "#/$defs/contentSeo" },
1020
+ "deleteDate": { "$ref": "#/$defs/deleteDate" },
974
1021
  "translationOf": {
975
1022
  "$ref": "#/$defs/slug",
976
1023
  "description": "SCHEMA-3.21.0: the slug of the article this document translates. The group is that article (the primary, in the publication's default language) plus every document naming it. The target must exist in the same content root, be `kind: article`, carry a different `language`, and must not itself carry `translationOf`; at most one document per language per group. A translation's default route is `/<language lowercased>/<primary slug>/` unless `route` is set. The API enforces the cross-document rules; the schema only fixes the shape: `translationOf` is allowed only when `kind` is `article` and never together with `edition`."
@@ -66,6 +66,7 @@
66
66
  "edition": { "$ref": "#/$defs/contentEdition" },
67
67
  "seo": { "$ref": "#/$defs/contentSeo" },
68
68
  "publishAfter": { "$ref": "#/$defs/publishAfterDate" },
69
+ "deleteDate": { "$ref": "#/$defs/deleteDate" },
69
70
  "translationOf": {
70
71
  "$ref": "#/$defs/slug",
71
72
  "description": "SCHEMA-3.21.0: the slug of the article this document translates. The group is that article (the primary, in the publication's default language) plus every document naming it. The target must exist in the same content root, be `kind: article`, carry a different `language`, and must not itself carry `translationOf`; at most one document per language per group. A translation's default route is `/<language lowercased>/<primary slug>/` unless `route` is set. The API enforces the cross-document rules; the schema only fixes the shape: `translationOf` is allowed only when `kind` is `article` and never together with `edition`."
@@ -222,6 +223,11 @@
222
223
  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
223
224
  "description": "SCHEMA-3.19.0: the calendar date (`YYYY-MM-DD`, day precision, read in the publication's staggered-release timezone) on or after which Galascribe publishes this draft. Meaningful only while `status` is `draft`; Galascribe removes it when the post is published. The API enforces both rules; the schema only fixes the shape."
224
225
  },
226
+ "deleteDate": {
227
+ "type": "string",
228
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
229
+ "description": "SCHEMA-3.25.0: the calendar date (`YYYY-MM-DD`, day precision, read in the publication's staggered-release timezone) on or after which Galascribe removes this article from the published site: it leaves every listing, feed, sitemap and search index and its route renders a removed-post notice. Same format as `publishAfter`; it must be later than `publishAfter` and `date` when both exist. The API enforces that rule; the schema only fixes the shape."
230
+ },
225
231
  "contentEdition": {
226
232
  "type": "object",
227
233
  "required": ["of", "kind", "sourceDigest", "generation", "approvedAt"],
@@ -140,6 +140,7 @@
140
140
  "maxItems": 2,
141
141
  "uniqueItems": true
142
142
  },
143
+ "performance": { "$ref": "#/$defs/deploymentPerformance" },
143
144
  "failure": { "$ref": "#/$defs/deploymentFailure" },
144
145
  "rollbackOfOperationId": { "$ref": "#/$defs/stableId" },
145
146
  "rollbackOfGenerationId": { "$ref": "#/$defs/stableId" },
@@ -4724,6 +4725,40 @@
4724
4725
  }
4725
4726
  ]
4726
4727
  },
4728
+ "deploymentPerformance": {
4729
+ "type": "object",
4730
+ "description": "SCHEMA-3.25.0: the publish kernel's size-budget summary of the final artifact. `budgets` are the effective byte budgets; `overBudgetCount` counts every page asset over budget; `overBudget` lists at most 20, largest first. Informational: it never fails a publish.",
4731
+ "required": ["budgets", "overBudgetCount", "overBudget"],
4732
+ "properties": {
4733
+ "budgets": {
4734
+ "type": "object",
4735
+ "required": [],
4736
+ "properties": {
4737
+ "htmlBytes": { "type": "integer", "minimum": 1024 },
4738
+ "cssBytes": { "type": "integer", "minimum": 1024 },
4739
+ "jsBytes": { "type": "integer", "minimum": 1024 }
4740
+ },
4741
+ "additionalProperties": false
4742
+ },
4743
+ "overBudgetCount": { "type": "integer", "minimum": 0 },
4744
+ "overBudget": {
4745
+ "type": "array",
4746
+ "maxItems": 20,
4747
+ "items": {
4748
+ "type": "object",
4749
+ "required": ["path", "kind", "bytes", "budget"],
4750
+ "properties": {
4751
+ "path": { "$ref": "#/$defs/repoRelativePath" },
4752
+ "kind": { "enum": ["html", "css", "js"] },
4753
+ "bytes": { "type": "integer", "minimum": 0 },
4754
+ "budget": { "type": "integer", "minimum": 1024 }
4755
+ },
4756
+ "additionalProperties": false
4757
+ }
4758
+ }
4759
+ },
4760
+ "additionalProperties": false
4761
+ },
4727
4762
  "githubWorkflowRef": {
4728
4763
  "type": "string",
4729
4764
  "minLength": 1,
@@ -55,6 +55,23 @@
55
55
  "maxLength": 80,
56
56
  "description": "SCHEMA-3.17.0, optional, carried by a CANONICAL_BASE_MISMATCH problem and absent from every other: the state of the site's custom-domain binding that decided `expectedBase` (a `DomainBindingState` value such as `CERTIFICATE_PENDING` or `ACTIVE`), absent when the site has no custom domain. A client shows a value it does not know as is."
57
57
  },
58
+ "details": {
59
+ "type": "object",
60
+ "description": "SCHEMA-3.25.1, optional, carried by a PAGE_LOSS_GUARD problem and absent from every other: the counts behind the refusal, the same members as the `PageLossGuardDetails` operation `reasonDetails`. The candidate build has fewer pages than the last successful deployment; `lostPageCount` is `previousPageCount - candidatePageCount` and `permittedLoss` is the loss the platform settings allow.",
61
+ "required": [
62
+ "previousPageCount",
63
+ "candidatePageCount",
64
+ "lostPageCount",
65
+ "permittedLoss"
66
+ ],
67
+ "properties": {
68
+ "previousPageCount": { "type": "integer", "minimum": 0 },
69
+ "candidatePageCount": { "type": "integer", "minimum": 0 },
70
+ "lostPageCount": { "type": "integer", "minimum": 0 },
71
+ "permittedLoss": { "type": "integer", "minimum": 0 }
72
+ },
73
+ "additionalProperties": false
74
+ },
58
75
  "remedy": {
59
76
  "$ref": "#/$defs/plainText",
60
77
  "description": "SCHEMA-3.17.0, optional, carried by a CANONICAL_BASE_MISMATCH problem and absent from every other: one sentence, written for the author, saying what resolves the mismatch. A client may render it verbatim.",
@@ -52,6 +52,9 @@
52
52
  "sharing": { "$ref": "#/$defs/sharing" },
53
53
  "contactForm": { "$ref": "#/$defs/contactForm" },
54
54
  "crawlers": { "$ref": "#/$defs/crawlers" },
55
+ "listing": { "$ref": "#/$defs/listing" },
56
+ "aiRights": { "$ref": "#/$defs/aiRights" },
57
+ "performance": { "$ref": "#/$defs/performance" },
55
58
  "extensions": { "$ref": "#/$defs/extensionMap" }
56
59
  },
57
60
  "additionalProperties": false,
@@ -358,6 +361,44 @@
358
361
  "properties": { "ai": { "enum": ["allow", "block"] } },
359
362
  "additionalProperties": false
360
363
  },
364
+ "listing": {
365
+ "type": "object",
366
+ "required": [],
367
+ "properties": {
368
+ "pageSize": { "type": "integer", "minimum": 1, "maximum": 50 }
369
+ },
370
+ "additionalProperties": false,
371
+ "description": "SCHEMA-3.25.0: listing settings. `pageSize` is the number of posts on each listing page (1 to 50); an absent member means 10."
372
+ },
373
+ "aiRights": {
374
+ "type": "object",
375
+ "required": ["search", "training"],
376
+ "properties": {
377
+ "search": { "enum": ["allow", "block"] },
378
+ "training": { "enum": ["allow", "block"] },
379
+ "licenseUrl": { "$ref": "#/$defs/urlHttps" }
380
+ },
381
+ "additionalProperties": false,
382
+ "description": "SCHEMA-3.25.0: how AI systems may use the writing. `search` covers search and answer bots, `training` covers training crawlers. When present it wins over `crawlers.ai`; when absent, `crawlers.ai` allow means both allow and block means both block. `licenseUrl` is the optional https URL of the license terms."
383
+ },
384
+ "performance": {
385
+ "type": "object",
386
+ "required": [],
387
+ "properties": {
388
+ "budgets": {
389
+ "type": "object",
390
+ "required": [],
391
+ "properties": {
392
+ "htmlBytes": { "type": "integer", "minimum": 1024 },
393
+ "cssBytes": { "type": "integer", "minimum": 1024 },
394
+ "jsBytes": { "type": "integer", "minimum": 1024 }
395
+ },
396
+ "additionalProperties": false
397
+ }
398
+ },
399
+ "additionalProperties": false,
400
+ "description": "SCHEMA-3.25.0: size budgets in bytes, each at least 1024 and optional. `htmlBytes` bounds a page's HTML, `cssBytes` and `jsBytes` bound the sum of the same-origin stylesheets and scripts a page links. A page over budget is reported; a budget never fails a build."
401
+ },
361
402
  "extensionMap": {
362
403
  "type": "object",
363
404
  "maxProperties": 32,