model-eol 0.4.1 → 0.5.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.
@@ -1,28 +1,64 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://example.invalid/model-eol/0.1/alert.schema.json",
3
+ "$id": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.alert.schema.json",
4
4
  "title": "model-eol alert output",
5
- "description": "Machine-readable alert payload emitted by `model-eol alert --json`. Draft 0.1 - the $id is a placeholder until the repo is public.",
5
+ "description": "Machine-readable alert payload emitted by `model-eol alert --json`.",
6
6
  "type": "object",
7
7
  "required": ["schema", "generated", "threshold_days", "scope", "scan_notes", "errors", "warnings"],
8
8
  "properties": {
9
9
  "schema": { "const": "model-eol/alert@0.1" },
10
10
  "generated": { "type": "string", "format": "date-time" },
11
- "threshold_days": { "type": "number" },
12
- "distributor": { "type": ["string", "null"] },
11
+ "threshold_days": { "type": "integer", "minimum": 0 },
12
+ "distributor": { "type": ["string", "null"], "minLength": 1 },
13
13
  "scope": { "enum": ["all", "direct"] },
14
- "scan_notes": { "type": "array", "items": { "$ref": "model-eol.inventory.schema.json#/definitions/scanNote" } },
15
- "errors": { "type": "array", "items": { "$ref": "model-eol.inventory.schema.json#/definitions/modelReference" } },
14
+ "scan_notes": { "type": "array", "items": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/scanNote" } },
15
+ "errors": { "type": "array", "items": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/modelReference" } },
16
16
  "warnings": {
17
17
  "type": "array",
18
18
  "items": {
19
19
  "oneOf": [
20
- { "$ref": "model-eol.inventory.schema.json#/definitions/modelReference" },
21
- { "$ref": "model-eol.inventory.schema.json#/definitions/candidateReference" },
22
- { "$ref": "model-eol.inventory.schema.json#/definitions/integrationHint" }
20
+ { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/modelReference" },
21
+ { "$ref": "#/definitions/candidateWarning" },
22
+ { "$ref": "#/definitions/integrationWarning" }
23
23
  ]
24
24
  }
25
25
  }
26
26
  },
27
- "additionalProperties": false
27
+ "additionalProperties": false,
28
+ "definitions": {
29
+ "candidateWarning": {
30
+ "type": "object",
31
+ "required": ["file", "line", "kind", "matched", "usage", "resolved_provider", "confidence", "evidence", "reason", "status"],
32
+ "properties": {
33
+ "file": { "type": "string", "minLength": 1 },
34
+ "line": { "type": "integer", "minimum": 1 },
35
+ "kind": { "const": "candidate-model-reference" },
36
+ "matched": { "type": "string", "minLength": 1 },
37
+ "usage": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/usage" },
38
+ "resolved_provider": { "type": "string", "minLength": 1 },
39
+ "confidence": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/confidence" },
40
+ "evidence": { "type": "string", "minLength": 1 },
41
+ "effective_scope": { "enum": ["all", "direct"] },
42
+ "policy_provenance": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/policyProvenance" },
43
+ "reason": { "type": "string", "minLength": 1 },
44
+ "status": { "const": "unknown" }
45
+ },
46
+ "additionalProperties": false
47
+ },
48
+ "integrationWarning": {
49
+ "type": "object",
50
+ "required": ["file", "line", "kind", "usage", "provider", "matched", "evidence", "status"],
51
+ "properties": {
52
+ "file": { "type": "string", "minLength": 1 },
53
+ "line": { "type": "integer", "minimum": 1 },
54
+ "kind": { "const": "integration-hint" },
55
+ "usage": { "enum": ["direct-api", "cloud-provider", "gateway"] },
56
+ "provider": { "type": "string", "minLength": 1 },
57
+ "matched": { "type": "string", "minLength": 1 },
58
+ "evidence": { "type": "string", "minLength": 1 },
59
+ "status": { "const": "unresolved" }
60
+ },
61
+ "additionalProperties": false
62
+ }
63
+ }
28
64
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://example.invalid/model-eol/0.1/bot-config.schema.json",
3
+ "$id": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.bot-config.schema.json",
4
4
  "title": "model-eol repository configuration",
5
5
  "description": "Optional strict .model-eol.json configuration shared by the zero-dependency CLI, Action, and GitHub bot adapter.",
6
6
  "type": "object",
@@ -86,7 +86,7 @@
86
86
  "type": ["string", "null"],
87
87
  "minLength": 1,
88
88
  "default": null,
89
- "description": "Opt-in evaluation command. Direct bot --eval runs it per changed patch in a temporary clone; the split example workflow runs it once as a read-only plan preflight."
89
+ "description": "Opt-in repository-owned command run independently for each patchable migration only in the read-only evaluate phase. Write-capable publication consumes its commit-bound result manifest and never executes this command."
90
90
  },
91
91
  "timeout_ms": {
92
92
  "type": "integer",
@@ -102,9 +102,13 @@
102
102
  },
103
103
  "pass_env": {
104
104
  "type": "array",
105
- "items": { "type": "string", "minLength": 1 },
105
+ "items": {
106
+ "type": "string",
107
+ "minLength": 1,
108
+ "pattern": "^(?!(?:[Gg][Ii][Tt][Hh][Uu][Bb]_|[Gg][Hh]_|[Aa][Cc][Tt][Ii][Oo][Nn][Ss]_|[Ss][Ss][Hh]_|[Aa][Ww][Ss]_[Ss][Ee][Cc][Rr][Ee][Tt]|[\\s\\S]*(?:[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|[Cc][Rr][Ee][Dd][Ee][Nn][Tt][Ii][Aa][Ll])))[\\s\\S]+$"
109
+ },
106
110
  "default": [],
107
- "description": "Environment variable names explicitly passed to the eval command."
111
+ "description": "Environment variable names explicitly forwarded to trusted eval code. GitHub, Actions, SSH, AWS secret, token, secret, password, and credential name patterns are refused. This controls normal subprocess forwarding and is not an OS sandbox or same-user secret-isolation boundary."
108
112
  }
109
113
  },
110
114
  "default": { "command": null, "timeout_ms": 600000, "max_report_bytes": 65536, "pass_env": [] }
@@ -0,0 +1,56 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.check.schema.json",
4
+ "title": "model-eol check output",
5
+ "description": "Machine-readable CI gate output emitted by `model-eol check --json`.",
6
+ "type": "object",
7
+ "required": ["schema", "threshold_days", "distributor", "scope", "scan_notes", "findings"],
8
+ "properties": {
9
+ "schema": { "const": "model-eol/check@0.1" },
10
+ "threshold_days": { "type": "integer", "minimum": 0 },
11
+ "distributor": { "type": ["string", "null"], "minLength": 1 },
12
+ "scope": { "enum": ["all", "direct"] },
13
+ "scan_notes": {
14
+ "type": "array",
15
+ "items": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/scanNote" }
16
+ },
17
+ "findings": { "type": "array", "items": { "$ref": "#/definitions/finding" } }
18
+ },
19
+ "additionalProperties": false,
20
+ "definitions": {
21
+ "finding": {
22
+ "type": "object",
23
+ "required": ["file", "line", "matched", "id", "publisher", "usage", "resolved_provider", "confidence", "status", "shutdown", "date_precision", "distribution_status", "via", "days", "safe_until", "replacement", "replacement_options", "replacement_note", "threshold_days", "effective_scope", "requested_via"],
24
+ "properties": {
25
+ "file": { "type": "string", "minLength": 1 },
26
+ "line": { "type": "integer", "minimum": 1 },
27
+ "matched": { "type": "string", "minLength": 1 },
28
+ "id": { "type": "string", "minLength": 1 },
29
+ "publisher": { "type": "string", "minLength": 1 },
30
+ "usage": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/usage" },
31
+ "resolved_provider": { "type": "string", "minLength": 1 },
32
+ "confidence": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/confidence" },
33
+ "status": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/status" },
34
+ "shutdown": { "type": ["string", "null"], "format": "date" },
35
+ "date_precision": { "enum": ["exact", "earliest", null] },
36
+ "distribution_status": { "enum": ["active", "legacy", "extended-access", "retired", null] },
37
+ "via": { "type": ["string", "null"], "minLength": 1 },
38
+ "days": { "type": ["integer", "null"] },
39
+ "safe_until": { "type": ["string", "null"], "format": "date" },
40
+ "replacement": { "type": ["string", "null"], "minLength": 1 },
41
+ "replacement_options": {
42
+ "type": ["array", "null"],
43
+ "minItems": 1,
44
+ "items": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" }
45
+ },
46
+ "replacement_note": { "type": ["string", "null"], "minLength": 1 },
47
+ "threshold_days": { "type": "integer", "minimum": 0 },
48
+ "effective_scope": { "enum": ["all", "direct"] },
49
+ "requested_via": { "type": ["string", "null"], "minLength": 1 },
50
+ "policy_provenance": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/policyProvenance" },
51
+ "mapped_from": { "type": "string", "minLength": 1 }
52
+ },
53
+ "additionalProperties": false
54
+ }
55
+ }
56
+ }
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://example.invalid/model-eol/0.1/inventory.schema.json",
3
+ "$id": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json",
4
4
  "title": "model-eol inventory output",
5
- "description": "Machine-readable repository inventory emitted by `model-eol inventory --json`. Draft 0.1 - the $id is a placeholder until the repo is public.",
5
+ "description": "Machine-readable repository inventory emitted by `model-eol inventory --json`.",
6
6
  "type": "object",
7
7
  "required": ["schema", "generated", "threshold_days", "scope", "targets", "scanned_files", "scan_notes", "summary", "model_references", "candidate_model_references", "integration_hints"],
8
8
  "properties": {
9
9
  "schema": { "const": "model-eol/inventory@0.1" },
10
10
  "generated": { "type": "string", "format": "date-time" },
11
- "threshold_days": { "type": "number" },
12
- "distributor": { "type": ["string", "null"] },
11
+ "threshold_days": { "type": "integer", "minimum": 0 },
12
+ "distributor": { "type": ["string", "null"], "minLength": 1 },
13
13
  "scope": { "enum": ["all", "direct"] },
14
- "targets": { "type": "array", "items": { "type": "string" } },
14
+ "targets": { "type": "array", "items": { "type": "string", "minLength": 1 } },
15
15
  "scanned_files": { "type": "integer", "minimum": 0 },
16
16
  "scan_notes": { "type": "array", "items": { "$ref": "#/definitions/scanNote" } },
17
17
  "summary": {
@@ -39,96 +39,97 @@
39
39
  "type": "object",
40
40
  "required": ["file", "line"],
41
41
  "properties": {
42
- "file": { "type": "string" },
42
+ "file": { "type": "string", "minLength": 1 },
43
43
  "line": { "type": "integer", "minimum": 1 }
44
- }
44
+ },
45
+ "additionalProperties": false
45
46
  },
46
47
  "modelReference": {
47
- "allOf": [
48
- { "$ref": "#/definitions/location" },
49
- {
50
- "type": "object",
51
- "required": ["kind", "matched", "id", "publisher", "usage", "resolved_provider", "confidence", "evidence", "status", "shutdown", "via", "days", "safe_until", "replacement", "source"],
48
+ "type": "object",
49
+ "required": ["file", "line", "kind", "matched", "id", "publisher", "usage", "resolved_provider", "confidence", "evidence", "status", "shutdown", "via", "days", "safe_until", "replacement", "source"],
50
+ "properties": {
51
+ "file": { "type": "string", "minLength": 1 },
52
+ "line": { "type": "integer", "minimum": 1 },
53
+ "kind": { "const": "model-reference" },
54
+ "matched": { "type": "string", "minLength": 1 },
55
+ "id": { "type": "string", "minLength": 1 },
56
+ "publisher": { "type": "string", "minLength": 1 },
57
+ "usage": { "$ref": "#/definitions/usage" },
58
+ "resolved_provider": { "type": "string", "minLength": 1 },
59
+ "confidence": { "$ref": "#/definitions/confidence" },
60
+ "evidence": { "type": "string", "minLength": 1 },
61
+ "status": { "$ref": "#/definitions/status" },
62
+ "shutdown": { "type": ["string", "null"], "format": "date" },
63
+ "date_precision": { "enum": ["exact", "earliest", null] },
64
+ "distribution_status": { "enum": ["active", "legacy", "extended-access", "retired", null] },
65
+ "via": { "type": ["string", "null"], "minLength": 1 },
66
+ "requested_via": { "type": ["string", "null"], "minLength": 1 },
67
+ "days": { "type": ["integer", "null"] },
68
+ "threshold_days": { "type": "integer", "minimum": 0 },
69
+ "effective_scope": { "enum": ["all", "direct"] },
70
+ "policy_provenance": { "$ref": "#/definitions/policyProvenance" },
71
+ "mapped_from": { "type": "string", "minLength": 1 },
72
+ "safe_until": { "type": ["string", "null"], "format": "date" },
73
+ "replacement": { "type": ["string", "null"], "minLength": 1 },
74
+ "replacement_options": {
75
+ "type": "array",
76
+ "minItems": 1,
77
+ "items": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" }
78
+ },
79
+ "replacement_note": { "type": "string", "minLength": 1 },
80
+ "source": { "type": ["string", "null"], "format": "uri" },
81
+ "policy": {
82
+ "type": ["object", "null"],
83
+ "required": ["min_notice_days", "source"],
52
84
  "properties": {
53
- "kind": { "const": "model-reference" },
54
- "matched": { "type": "string" },
55
- "id": { "type": "string" },
56
- "publisher": { "type": "string" },
57
- "usage": { "$ref": "#/definitions/usage" },
58
- "resolved_provider": { "type": "string" },
59
- "confidence": { "$ref": "#/definitions/confidence" },
60
- "evidence": { "type": "string" },
61
- "status": { "$ref": "#/definitions/status" },
62
- "shutdown": { "type": ["string", "null"] },
63
- "date_precision": { "enum": ["exact", "earliest", null] },
64
- "distribution_status": { "enum": ["active", "legacy", "extended-access", "retired", null] },
65
- "via": { "type": ["string", "null"] },
66
- "requested_via": { "type": ["string", "null"] },
67
- "days": { "type": ["integer", "null"] },
68
- "threshold_days": { "type": "integer", "minimum": 0 },
69
- "effective_scope": { "enum": ["all", "direct"] },
70
- "policy_provenance": { "$ref": "#/definitions/policyProvenance" },
71
- "mapped_from": { "type": "string", "minLength": 1 },
72
- "safe_until": { "type": ["string", "null"], "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
73
- "replacement": { "type": ["string", "null"] },
74
- "source": { "type": ["string", "null"] },
75
- "policy": {
76
- "type": ["object", "null"],
77
- "required": ["min_notice_days", "source"],
78
- "properties": {
79
- "min_notice_days": { "type": "integer", "minimum": 0 },
80
- "source": { "type": "string", "format": "uri" }
81
- },
82
- "additionalProperties": false
83
- },
84
- "feed_generated": { "type": ["string", "null"], "format": "date-time" }
85
- }
86
- }
87
- ]
85
+ "min_notice_days": { "type": "integer", "minimum": 0 },
86
+ "source": { "type": "string", "format": "uri" }
87
+ },
88
+ "additionalProperties": false
89
+ },
90
+ "feed_generated": { "type": ["string", "null"], "format": "date-time" }
91
+ },
92
+ "additionalProperties": false
88
93
  },
89
94
  "candidateReference": {
90
- "allOf": [
91
- { "$ref": "#/definitions/location" },
92
- {
93
- "type": "object",
94
- "required": ["kind", "matched", "usage", "resolved_provider", "confidence", "evidence", "reason"],
95
- "properties": {
96
- "kind": { "const": "candidate-model-reference" },
97
- "matched": { "type": "string" },
98
- "usage": { "$ref": "#/definitions/usage" },
99
- "resolved_provider": { "type": "string" },
100
- "confidence": { "$ref": "#/definitions/confidence" },
101
- "evidence": { "type": "string" },
102
- "effective_scope": { "enum": ["all", "direct"] },
103
- "policy_provenance": { "$ref": "#/definitions/policyProvenance" },
104
- "reason": { "type": "string" }
105
- }
106
- }
107
- ]
95
+ "type": "object",
96
+ "required": ["file", "line", "kind", "matched", "usage", "resolved_provider", "confidence", "evidence", "reason"],
97
+ "properties": {
98
+ "file": { "type": "string", "minLength": 1 },
99
+ "line": { "type": "integer", "minimum": 1 },
100
+ "kind": { "const": "candidate-model-reference" },
101
+ "matched": { "type": "string", "minLength": 1 },
102
+ "usage": { "$ref": "#/definitions/usage" },
103
+ "resolved_provider": { "type": "string", "minLength": 1 },
104
+ "confidence": { "$ref": "#/definitions/confidence" },
105
+ "evidence": { "type": "string", "minLength": 1 },
106
+ "effective_scope": { "enum": ["all", "direct"] },
107
+ "policy_provenance": { "$ref": "#/definitions/policyProvenance" },
108
+ "reason": { "type": "string", "minLength": 1 }
109
+ },
110
+ "additionalProperties": false
108
111
  },
109
112
  "integrationHint": {
110
- "allOf": [
111
- { "$ref": "#/definitions/location" },
112
- {
113
- "type": "object",
114
- "required": ["kind", "usage", "provider", "matched", "evidence"],
115
- "properties": {
116
- "kind": { "const": "integration-hint" },
117
- "usage": { "enum": ["direct-api", "cloud-provider", "gateway"] },
118
- "provider": { "type": "string" },
119
- "matched": { "type": "string" },
120
- "evidence": { "type": "string" }
121
- }
122
- }
123
- ]
113
+ "type": "object",
114
+ "required": ["file", "line", "kind", "usage", "provider", "matched", "evidence"],
115
+ "properties": {
116
+ "file": { "type": "string", "minLength": 1 },
117
+ "line": { "type": "integer", "minimum": 1 },
118
+ "kind": { "const": "integration-hint" },
119
+ "usage": { "enum": ["direct-api", "cloud-provider", "gateway"] },
120
+ "provider": { "type": "string", "minLength": 1 },
121
+ "matched": { "type": "string", "minLength": 1 },
122
+ "evidence": { "type": "string", "minLength": 1 }
123
+ },
124
+ "additionalProperties": false
124
125
  },
125
126
  "scanNote": {
126
127
  "type": "object",
127
128
  "required": ["reason"],
128
129
  "properties": {
129
130
  "reason": { "type": "string", "minLength": 1 },
130
- "file": { "type": "string" },
131
- "message": { "type": "string" },
131
+ "file": { "type": "string", "minLength": 1 },
132
+ "message": { "type": "string", "minLength": 1 },
132
133
  "bytes": { "type": "integer", "minimum": 0 },
133
134
  "limit_bytes": { "type": "integer", "minimum": 0 },
134
135
  "limit_files": { "type": "integer", "minimum": 0 }
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://example.invalid/model-eol/0.1/plan.schema.json",
3
+ "$id": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.plan.schema.json",
4
4
  "title": "model-eol migration plan",
5
- "description": "Deterministic, hash-guarded migration plan emitted by `model-eol plan`. Draft 0.1 - the $id is a placeholder until the repo is public.",
5
+ "description": "Deterministic, hash-guarded migration plan emitted by `model-eol plan`.",
6
6
  "type": "object",
7
7
  "required": ["plan_schema", "generated", "threshold_days", "via", "scan_notes", "items", "issues"],
8
8
  "properties": {
9
9
  "plan_schema": { "const": "model-eol.plan/0.1" },
10
10
  "generated": { "type": "string", "format": "date-time" },
11
- "threshold_days": { "type": "number" },
11
+ "threshold_days": { "type": "integer", "minimum": 0 },
12
12
  "via": { "type": ["string", "null"] },
13
13
  "scan_notes": { "type": "array", "items": { "$ref": "#/definitions/scanNote" } },
14
14
  "items": { "type": "array", "items": { "$ref": "#/definitions/item" } },
@@ -28,7 +28,7 @@
28
28
  "id": { "type": "string", "minLength": 1 },
29
29
  "publisher": { "type": "string", "minLength": 1 },
30
30
  "replacement": { "type": "string", "minLength": 1 },
31
- "shutdown": { "type": "string" },
31
+ "shutdown": { "type": "string", "format": "date" },
32
32
  "days": { "type": "integer" },
33
33
  "status": { "enum": ["retired", "retiring"] },
34
34
  "requested_via": { "type": ["string", "null"] },
@@ -53,7 +53,7 @@
53
53
  "usage": { "enum": ["direct-api", "cloud-provider", "gateway", "model-reference"] },
54
54
  "confidence": { "enum": ["high", "medium", "low"] },
55
55
  "status": { "enum": ["retired", "retiring", "scheduled", "watch", "ok"] },
56
- "shutdown": { "type": ["string", "null"] },
56
+ "shutdown": { "type": ["string", "null"], "format": "date" },
57
57
  "via": { "type": ["string", "null"] },
58
58
  "requested_via": { "type": ["string", "null"] },
59
59
  "days": { "type": ["integer", "null"] },
@@ -1,31 +1,31 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://example.invalid/model-eol/0.1/schedule.schema.json",
3
+ "$id": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.schedule.schema.json",
4
4
  "title": "model-eol schedule output",
5
- "description": "Machine-readable deprecation schedule emitted by `model-eol schedule --json`. Draft 0.1 - the $id is a placeholder until the repo is public.",
5
+ "description": "Machine-readable deprecation schedule emitted by `model-eol schedule --json`.",
6
6
  "type": "object",
7
7
  "required": ["schema", "generated", "threshold_days", "scope", "targets", "scanned_files", "scan_notes", "earliest_risk", "items", "candidate_model_references", "unresolved_integrations"],
8
8
  "properties": {
9
9
  "schema": { "const": "model-eol/schedule@0.1" },
10
10
  "generated": { "type": "string", "format": "date-time" },
11
- "threshold_days": { "type": "number" },
12
- "distributor": { "type": ["string", "null"] },
11
+ "threshold_days": { "type": "integer", "minimum": 0 },
12
+ "distributor": { "type": ["string", "null"], "minLength": 1 },
13
13
  "scope": { "enum": ["all", "direct"] },
14
- "targets": { "type": "array", "items": { "type": "string" } },
14
+ "targets": { "type": "array", "items": { "type": "string", "minLength": 1 } },
15
15
  "scanned_files": { "type": "integer", "minimum": 0 },
16
- "scan_notes": { "type": "array", "items": { "$ref": "model-eol.inventory.schema.json#/definitions/scanNote" } },
16
+ "scan_notes": { "type": "array", "items": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/scanNote" } },
17
17
  "earliest_risk": {
18
18
  "type": ["object", "null"],
19
19
  "required": ["safe_until", "id"],
20
20
  "properties": {
21
- "safe_until": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
21
+ "safe_until": { "type": "string", "format": "date" },
22
22
  "id": { "type": "string", "minLength": 1 }
23
23
  },
24
24
  "additionalProperties": false
25
25
  },
26
- "items": { "type": "array", "items": { "$ref": "model-eol.inventory.schema.json#/definitions/modelReference" } },
27
- "candidate_model_references": { "type": "array", "items": { "$ref": "model-eol.inventory.schema.json#/definitions/candidateReference" } },
28
- "unresolved_integrations": { "type": "array", "items": { "$ref": "model-eol.inventory.schema.json#/definitions/integrationHint" } }
26
+ "items": { "type": "array", "items": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/modelReference" } },
27
+ "candidate_model_references": { "type": "array", "items": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/candidateReference" } },
28
+ "unresolved_integrations": { "type": "array", "items": { "$ref": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.inventory.schema.json#/definitions/integrationHint" } }
29
29
  },
30
30
  "additionalProperties": false
31
31
  }
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://example.invalid/model-eol/0.1/schema.json",
3
+ "$id": "https://thossullivan.github.io/model-eol/schema/0.1/model-eol.schema.json",
4
4
  "title": "model-eol feed",
5
- "description": "A machine-readable deprecation feed for AI models. Draft 0.1 - the $id is a placeholder until the repo is public.",
5
+ "description": "A machine-readable deprecation feed for AI models, version model-eol/0.1.",
6
6
  "type": "object",
7
7
  "required": ["spec", "publisher", "generated", "models"],
8
8
  "properties": {
9
9
  "spec": { "const": "model-eol/0.1" },
10
- "publisher": { "type": "string", "minLength": 1 },
10
+ "publisher": { "type": "string", "minLength": 1, "maxLength": 256 },
11
11
  "generated": { "type": "string", "format": "date-time" },
12
12
  "source": { "type": "string", "format": "uri" },
13
13
  "note": { "type": "string" },
@@ -27,21 +27,25 @@
27
27
  },
28
28
  "additionalProperties": false,
29
29
  "definitions": {
30
- "isoDate": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
30
+ "isoDate": { "type": "string", "format": "date" },
31
31
  "model": {
32
32
  "type": "object",
33
33
  "required": ["id"],
34
34
  "properties": {
35
- "id": { "type": "string", "minLength": 1 },
36
- "aliases": { "type": "array", "items": { "type": "string", "minLength": 1 } },
35
+ "id": { "type": "string", "minLength": 1, "maxLength": 256, "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" },
36
+ "aliases": {
37
+ "type": "array",
38
+ "minItems": 1,
39
+ "items": { "type": "string", "minLength": 1, "maxLength": 256, "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" }
40
+ },
37
41
  "announced": { "$ref": "#/definitions/isoDate" },
38
42
  "shutdown": { "$ref": "#/definitions/isoDate" },
39
43
  "date_precision": { "enum": ["exact", "earliest"] },
40
- "replacement": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" },
44
+ "replacement": { "type": "string", "maxLength": 256, "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" },
41
45
  "replacement_options": {
42
46
  "type": "array",
43
47
  "minItems": 1,
44
- "items": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" }
48
+ "items": { "type": "string", "maxLength": 256, "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" }
45
49
  },
46
50
  "replacement_note": { "type": "string" },
47
51
  "notes": { "type": "string" },
@@ -63,6 +67,18 @@
63
67
  }
64
68
  }
65
69
  },
70
+ "dependencies": {
71
+ "replacement": {
72
+ "properties": {
73
+ "replacement_options": false
74
+ }
75
+ },
76
+ "replacement_options": {
77
+ "properties": {
78
+ "replacement": false
79
+ }
80
+ }
81
+ },
66
82
  "additionalProperties": false
67
83
  }
68
84
  }