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.
- package/README.md +147 -20
- package/SPEC.md +21 -6
- package/action.yml +30 -9
- package/bot/bot.mjs +361 -165
- package/bot/lib/git.mjs +49 -0
- package/bot/lib/github.mjs +4 -0
- package/bot.yml.example +20 -11
- package/check.mjs +55 -4
- package/examples/model-eol-eval.mjs +84 -0
- package/examples/workflows/model-eol.yml +52 -0
- package/feeds/amazon.json +5 -1
- package/feeds/anthropic.json +4 -1
- package/lib/apply.mjs +393 -231
- package/lib/config.mjs +16 -1
- package/lib/feeds.mjs +22 -3
- package/lib/json-schema.mjs +291 -0
- package/lib/reports.mjs +95 -22
- package/lib/scanner.mjs +159 -25
- package/lib/validate-document.mjs +320 -0
- package/lib/validate-feed.mjs +7 -1
- package/package.json +4 -3
- package/schema/model-eol.alert.schema.json +46 -10
- package/schema/model-eol.bot-config.schema.json +8 -4
- package/schema/model-eol.check.schema.json +56 -0
- package/schema/model-eol.inventory.schema.json +82 -81
- package/schema/model-eol.plan.schema.json +5 -5
- package/schema/model-eol.schedule.schema.json +10 -10
- package/schema/model-eol.schema.json +24 -8
|
@@ -1,28 +1,64 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://
|
|
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`.
|
|
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": "
|
|
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": "
|
|
22
|
-
{ "$ref": "
|
|
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://
|
|
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
|
|
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": {
|
|
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
|
|
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://
|
|
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`.
|
|
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": "
|
|
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
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
"
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
"
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
"
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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://
|
|
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`.
|
|
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": "
|
|
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://
|
|
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`.
|
|
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": "
|
|
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", "
|
|
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://
|
|
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
|
|
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", "
|
|
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": {
|
|
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
|
}
|