@acidicsoil/portable-capabilities 0.1.7 → 0.1.8

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 (50) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +31 -62
  3. package/dist-release/catalog/schemas/acceptance-criteria-synthesis.output.schema.json +63 -0
  4. package/dist-release/catalog/schemas/anti-pattern-inversion.output.schema.json +63 -0
  5. package/dist-release/catalog/schemas/behavior-preserving-refactor.output.schema.json +63 -0
  6. package/dist-release/catalog/schemas/canonical-exemplar-generalization.output.schema.json +63 -0
  7. package/dist-release/catalog/schemas/constrained-exemplar-adaptation.output.schema.json +63 -0
  8. package/dist-release/catalog/schemas/convention-mining.output.schema.json +63 -0
  9. package/dist-release/catalog/schemas/conversation-to-specification.output.schema.json +63 -0
  10. package/dist-release/catalog/schemas/delta-analysis.output.schema.json +63 -0
  11. package/dist-release/catalog/schemas/domain-context-boundary.output.schema.json +63 -0
  12. package/dist-release/catalog/schemas/evaluation-harness-design.output.schema.json +73 -0
  13. package/dist-release/catalog/schemas/failure-to-guardrail.output.schema.json +63 -0
  14. package/dist-release/catalog/schemas/multi-exemplar-consensus.output.schema.json +63 -0
  15. package/dist-release/catalog/schemas/reference-trace-mapping.output.schema.json +63 -0
  16. package/dist-release/catalog/schemas/reusable-workflow-abstraction.output.schema.json +73 -0
  17. package/dist-release/catalog/schemas/structural-pattern-extraction.output.schema.json +63 -0
  18. package/dist-release/catalog/schemas/template-family-generation.output.schema.json +63 -0
  19. package/dist-release/cli.js +5282 -3080
  20. package/dist-release/cli.js.map +4 -4
  21. package/dist-release/index.js +6008 -3519
  22. package/dist-release/index.js.map +4 -4
  23. package/package.json +37 -42
  24. package/schemas/canonical-artifact.schema.json +220 -0
  25. package/schemas/runtime-descriptor.schema.json +338 -0
  26. package/schemas/runtime-evidence-claim.schema.json +87 -0
  27. package/canonical/exceptions/antigravity-unsupported-primitives.yaml +0 -16
  28. package/canonical/exceptions/claude-code-unsupported-primitives.yaml +0 -16
  29. package/canonical/exceptions/codex-unsupported-primitives.yaml +0 -16
  30. package/canonical/exceptions/dcode-unsupported-primitives.yaml +0 -16
  31. package/canonical/exceptions/oh-my-pi-unsupported-primitives.yaml +0 -16
  32. package/canonical/exceptions/opencode-unsupported-primitives.yaml +0 -16
  33. package/canonical/exceptions/pi-unsupported-primitives.yaml +0 -16
  34. package/canonical/fixtures/runtime-primitive-matrix-112.json +0 -1956
  35. package/canonical/runtime-primitive-policy.yaml +0 -100
  36. package/canonical/runtime-profiles/antigravity.yaml +0 -60
  37. package/canonical/runtime-profiles/claude-code.yaml +0 -65
  38. package/canonical/runtime-profiles/codex.yaml +0 -71
  39. package/canonical/runtime-profiles/dcode.yaml +0 -67
  40. package/canonical/runtime-profiles/oh-my-pi.yaml +0 -62
  41. package/canonical/runtime-profiles/opencode.yaml +0 -65
  42. package/canonical/runtime-profiles/pi.yaml +0 -66
  43. package/dist-release/catalog/runtime-profiles/antigravity.yaml +0 -60
  44. package/dist-release/catalog/runtime-profiles/claude-code.yaml +0 -65
  45. package/dist-release/catalog/runtime-profiles/codex.yaml +0 -71
  46. package/dist-release/catalog/runtime-profiles/dcode.yaml +0 -67
  47. package/dist-release/catalog/runtime-profiles/oh-my-pi.yaml +0 -62
  48. package/dist-release/catalog/runtime-profiles/opencode.yaml +0 -65
  49. package/dist-release/catalog/runtime-profiles/pi.yaml +0 -66
  50. package/schemas/runtime-profile.schema.json +0 -305
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "@acidicsoil/portable-capabilities",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Portable analytical capability compiler, runtime package generator, and CLI",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/AcidicSoil/portable-capabilities.git"
9
+ },
6
10
  "type": "module",
7
11
  "bin": {
8
12
  "portable-capabilities": "./dist-release/cli.js"
@@ -15,14 +19,32 @@
15
19
  "node": ">=24.14.0",
16
20
  "pnpm": ">=11.1.0"
17
21
  },
22
+ "dependencies": {
23
+ "ajv": "8.20.0",
24
+ "yaml": "2.9.0"
25
+ },
26
+ "devDependencies": {
27
+ "@biomejs/biome": "2.5.5",
28
+ "@changesets/changelog-github": "1.0.0",
29
+ "@changesets/cli": "2.29.7",
30
+ "@types/node": "24.1.0",
31
+ "@vitest/coverage-v8": "4.1.10",
32
+ "esbuild": "0.25.12",
33
+ "execa": "10.0.0",
34
+ "fast-check": "4.9.0",
35
+ "lefthook": "1.11.13",
36
+ "prettier": "3.6.2",
37
+ "tsx": "4.20.3",
38
+ "typescript": "5.8.3",
39
+ "vitest": "4.1.10"
40
+ },
18
41
  "scripts": {
19
- "prepack": "node scripts/release/build-public-package.mjs",
20
- "typecheck": "turbo run typecheck",
21
- "test:run": "turbo run test",
42
+ "typecheck": "pnpm -r --if-present run typecheck",
43
+ "test:run": "pnpm typecheck && pnpm -r --if-present run test",
22
44
  "test:coverage": "vitest run --coverage",
23
- "ci": "pnpm verify:tool-boundary && pnpm format:yaml:check && pnpm format:docs:check && pnpm turbo lint format-check typecheck test verify:reproducible && pnpm audit --prod --audit-level moderate",
24
- "build": "turbo run build",
25
- "lint": "turbo run lint",
45
+ "ci": "pnpm verify:rfc-governance && pnpm verify:tool-boundary && pnpm verify:ci-matrix && pnpm format:yaml:check && pnpm format:docs:check && pnpm lint && pnpm format-check && pnpm typecheck && pnpm test && pnpm verify:reproducible && pnpm audit --prod --audit-level moderate",
46
+ "build": "pnpm -r --if-present run build",
47
+ "lint": "pnpm -r --if-present run lint",
26
48
  "lint:fix": "biome lint --write .",
27
49
  "format": "biome format --write .",
28
50
  "format:check": "biome format .",
@@ -30,49 +52,22 @@
30
52
  "check:fix": "biome check --write .",
31
53
  "biome:ci": "biome ci .",
32
54
  "cli": "tsx packages/cli/src/entry.ts",
33
- "verify:reproducible": "turbo run verify:reproducible",
34
- "test": "turbo run test",
35
- "format-check": "turbo run format-check",
55
+ "verify:reproducible": "pnpm typecheck && pnpm -r --if-present run test",
56
+ "test": "pnpm typecheck && pnpm -r --if-present run test",
57
+ "format-check": "pnpm -r --if-present run format-check",
36
58
  "format:yaml": "prettier --write \"pnpm-workspace.yaml\" \"pnpm-lock.yaml\" \"lefthook.yml\" \"packages/fixtures/data/**/*.{yaml,yml}\" \".github/workflows/*.{yaml,yml}\"",
37
59
  "format:yaml:check": "prettier --check \"pnpm-workspace.yaml\" \"pnpm-lock.yaml\" \"lefthook.yml\" \"packages/fixtures/data/**/*.{yaml,yml}\" \".github/workflows/*.{yaml,yml}\"",
38
60
  "verify:tool-boundary": "node scripts/verify-tool-boundary.mjs",
39
- "verify:generated-drift": "node scripts/verify-generated-drift.mjs",
40
61
  "verify:ci-matrix": "node scripts/verify-ci-matrix.mjs",
41
- "release:pack:verify": "node scripts/release/verify-pack.mjs && node scripts/release/verify-public-package.mjs",
42
- "release:internal-cli-pack:verify": "node scripts/release/verify-pack.mjs",
62
+ "release:pack:verify": "pnpm changeset:status && node scripts/release/verify-public-package.mjs",
43
63
  "release:public-package:build": "node scripts/release/build-public-package.mjs",
44
64
  "changeset": "changeset",
45
65
  "changeset:status": "changeset status",
46
- "release:cli:build": "node scripts/release/build-cli.mjs",
47
- "release:bundles": "tsx scripts/release/generate-bundles.ts",
48
- "release:bundles:verify": "node scripts/release/verify-bundles.mjs",
49
66
  "docs:verify": "node scripts/release/verify-docs.mjs",
50
67
  "release:verify": "node scripts/release/verify-clean-checkout.mjs",
51
- "release:prepare": "bash scripts/release/publish.sh",
52
- "release:publish": "bash scripts/release/publish.sh --publish --push",
68
+ "release:published:verify": "node scripts/release/verify-published-package.mjs",
53
69
  "format:docs": "prettier --write \"README.md\" \"CHANGELOG.md\" \"phase-6.1-milestone.md\" \"docs/**/*.md\" \"packages/**/*.md\" \".planning/**/*.md\" \".changeset/**/*.md\"",
54
70
  "format:docs:check": "prettier --check \"README.md\" \"CHANGELOG.md\" \"phase-6.1-milestone.md\" \"docs/**/*.md\" \"packages/**/*.md\" \".planning/**/*.md\" \".changeset/**/*.md\"",
55
- "verify:runtime": "node scripts/verify-native-runtime.mjs",
56
- "demo": "node scripts/demo.mjs"
57
- },
58
- "dependencies": {
59
- "ajv": "8.20.0",
60
- "yaml": "2.9.0"
61
- },
62
- "devDependencies": {
63
- "@biomejs/biome": "2.5.5",
64
- "@changesets/cli": "2.29.7",
65
- "@types/node": "24.1.0",
66
- "@vitest/coverage-v8": "4.1.10",
67
- "esbuild": "0.25.12",
68
- "execa": "10.0.0",
69
- "fast-check": "4.9.0",
70
- "lefthook": "1.11.13",
71
- "prettier": "3.6.2",
72
- "tsx": "4.20.3",
73
- "turbo": "2.5.6",
74
- "typescript": "5.8.3",
75
- "vitest": "4.1.10"
76
- },
77
- "packageManager": "pnpm@11.1.3"
78
- }
71
+ "verify:rfc-governance": "tsx scripts/verify-rfc-architecture-governance.ts"
72
+ }
73
+ }
@@ -0,0 +1,220 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://portable-capabilities.dev/schemas/canonical-artifact/1.0",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": [
7
+ "schemaVersion",
8
+ "id",
9
+ "kind",
10
+ "title",
11
+ "inputs",
12
+ "outputs",
13
+ "requiredOutcomes",
14
+ "forbiddenOutcomes",
15
+ "effects",
16
+ "resources",
17
+ "invocationIntents",
18
+ "topologyRequirements",
19
+ "evidenceRequirements",
20
+ "allowedDegradation",
21
+ "directBaseline"
22
+ ],
23
+ "properties": {
24
+ "schemaVersion": {
25
+ "const": "1.0"
26
+ },
27
+ "id": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "kind": {
32
+ "enum": ["skill", "agent", "command", "workflow", "rule", "hook", "tool", "resource"]
33
+ },
34
+ "title": {
35
+ "type": "string"
36
+ },
37
+ "inputs": {
38
+ "type": "array",
39
+ "items": {
40
+ "type": "string"
41
+ }
42
+ },
43
+ "outputs": {
44
+ "type": "array",
45
+ "items": {
46
+ "type": "string"
47
+ }
48
+ },
49
+ "requiredOutcomes": {
50
+ "type": "array",
51
+ "items": {
52
+ "$ref": "#/$defs/outcome"
53
+ }
54
+ },
55
+ "forbiddenOutcomes": {
56
+ "type": "array",
57
+ "items": {
58
+ "$ref": "#/$defs/outcome"
59
+ }
60
+ },
61
+ "effects": {
62
+ "type": "array",
63
+ "items": {
64
+ "type": "string"
65
+ }
66
+ },
67
+ "resources": {
68
+ "type": "array",
69
+ "items": {
70
+ "type": "string"
71
+ }
72
+ },
73
+ "invocationIntents": {
74
+ "type": "array",
75
+ "minItems": 1,
76
+ "items": {
77
+ "type": "string"
78
+ }
79
+ },
80
+ "topologyRequirements": {
81
+ "type": "array",
82
+ "items": {
83
+ "type": "string"
84
+ }
85
+ },
86
+ "evidenceRequirements": {
87
+ "type": "array",
88
+ "items": {
89
+ "type": "string"
90
+ }
91
+ },
92
+ "allowedDegradation": {
93
+ "type": "array",
94
+ "items": {
95
+ "type": "string"
96
+ }
97
+ },
98
+ "directBaseline": {
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": [
102
+ "invocationIntent",
103
+ "steps",
104
+ "requiredOutcomes",
105
+ "forbiddenOutcomes",
106
+ "requiredResources",
107
+ "optionalSurfaceIndependent"
108
+ ],
109
+ "properties": {
110
+ "invocationIntent": {
111
+ "type": "string"
112
+ },
113
+ "steps": {
114
+ "type": "array",
115
+ "minItems": 1,
116
+ "items": {
117
+ "type": "string"
118
+ }
119
+ },
120
+ "requiredOutcomes": {
121
+ "type": "array",
122
+ "items": {
123
+ "type": "string"
124
+ }
125
+ },
126
+ "forbiddenOutcomes": {
127
+ "type": "array",
128
+ "items": {
129
+ "type": "string"
130
+ }
131
+ },
132
+ "requiredResources": {
133
+ "type": "array",
134
+ "items": {
135
+ "type": "string"
136
+ }
137
+ },
138
+ "optionalSurfaceIndependent": {
139
+ "const": true
140
+ }
141
+ }
142
+ },
143
+ "optionalSurfaceIds": {
144
+ "type": "array",
145
+ "items": {
146
+ "type": "string"
147
+ }
148
+ },
149
+ "operationalContract": {
150
+ "type": "object",
151
+ "additionalProperties": false,
152
+ "required": [
153
+ "activation",
154
+ "inputs",
155
+ "procedure",
156
+ "decisions",
157
+ "resources",
158
+ "ambiguityAndAbstention",
159
+ "stopConditions",
160
+ "outputConstruction",
161
+ "validation",
162
+ "examples"
163
+ ],
164
+ "properties": {
165
+ "activation": { "$ref": "#/$defs/nonEmptyStringList" },
166
+ "inputs": { "$ref": "#/$defs/nonEmptyStringList" },
167
+ "procedure": { "$ref": "#/$defs/nonEmptyStringList" },
168
+ "decisions": { "$ref": "#/$defs/nonEmptyStringList" },
169
+ "resources": { "$ref": "#/$defs/nonEmptyStringList" },
170
+ "ambiguityAndAbstention": { "$ref": "#/$defs/nonEmptyStringList" },
171
+ "stopConditions": { "$ref": "#/$defs/nonEmptyStringList" },
172
+ "outputConstruction": { "$ref": "#/$defs/nonEmptyStringList" },
173
+ "validation": { "$ref": "#/$defs/nonEmptyStringList" },
174
+ "examples": { "$ref": "#/$defs/nonEmptyStringList" }
175
+ }
176
+ },
177
+ "resourceFiles": {
178
+ "type": "array",
179
+ "items": {
180
+ "$ref": "#/$defs/resourceFile"
181
+ }
182
+ }
183
+ },
184
+ "$defs": {
185
+ "outcome": {
186
+ "type": "object",
187
+ "additionalProperties": false,
188
+ "required": ["id", "description"],
189
+ "properties": {
190
+ "id": {
191
+ "type": "string"
192
+ },
193
+ "description": {
194
+ "type": "string"
195
+ }
196
+ }
197
+ },
198
+ "nonEmptyStringList": {
199
+ "type": "array",
200
+ "minItems": 1,
201
+ "items": {
202
+ "type": "string",
203
+ "minLength": 1
204
+ }
205
+ },
206
+ "resourceFile": {
207
+ "type": "object",
208
+ "additionalProperties": false,
209
+ "required": ["sourceFile", "canonicalPath", "packagePath", "mediaType", "content", "digest"],
210
+ "properties": {
211
+ "sourceFile": { "type": "string", "minLength": 1 },
212
+ "canonicalPath": { "type": "string", "minLength": 1 },
213
+ "packagePath": { "type": "string", "minLength": 1 },
214
+ "mediaType": { "type": "string", "minLength": 1 },
215
+ "content": { "type": "string" },
216
+ "digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
217
+ }
218
+ }
219
+ }
220
+ }
@@ -0,0 +1,338 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://portable-capabilities.dev/schemas/runtime-descriptor/1.0",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": [
7
+ "schemaVersion",
8
+ "id",
9
+ "aliases",
10
+ "supportedVersions",
11
+ "locations",
12
+ "surfaces",
13
+ "configuration",
14
+ "managedHooks",
15
+ "extensionEvents",
16
+ "ownership",
17
+ "degradation"
18
+ ],
19
+ "properties": {
20
+ "schemaVersion": {
21
+ "const": "1.0"
22
+ },
23
+ "id": {
24
+ "type": "string"
25
+ },
26
+ "aliases": {
27
+ "type": "array",
28
+ "items": {
29
+ "type": "string"
30
+ }
31
+ },
32
+ "supportedVersions": {
33
+ "type": "array",
34
+ "items": {
35
+ "type": "string"
36
+ }
37
+ },
38
+ "locations": {
39
+ "type": "array",
40
+ "minItems": 1,
41
+ "items": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": [
45
+ "id",
46
+ "artifactKind",
47
+ "scope",
48
+ "evidenceClaimIds",
49
+ "installation",
50
+ "registration",
51
+ "uninstall"
52
+ ],
53
+ "properties": {
54
+ "id": {
55
+ "type": "string"
56
+ },
57
+ "artifactKind": {
58
+ "type": "string"
59
+ },
60
+ "scope": {
61
+ "enum": ["user", "project"]
62
+ },
63
+ "pathTemplate": {
64
+ "type": "string"
65
+ },
66
+ "environmentOverride": {
67
+ "type": "string"
68
+ },
69
+ "evidenceClaimIds": {
70
+ "type": "array",
71
+ "items": {
72
+ "type": "string"
73
+ }
74
+ },
75
+ "installation": {
76
+ "enum": ["automatic", "approval-required", "manual", "unsupported"]
77
+ },
78
+ "registration": {
79
+ "enum": ["discovery", "structured-config", "plugin-manager", "manual"]
80
+ },
81
+ "uninstall": {
82
+ "enum": ["automatic", "manual", "unsupported"]
83
+ }
84
+ }
85
+ }
86
+ },
87
+ "surfaces": {
88
+ "type": "array",
89
+ "items": {
90
+ "type": "object",
91
+ "additionalProperties": false,
92
+ "required": [
93
+ "id",
94
+ "semanticKind",
95
+ "integrationMode",
96
+ "adapterId",
97
+ "discovery",
98
+ "invocation",
99
+ "precedence",
100
+ "evidenceClaimIds",
101
+ "stability",
102
+ "evidenceState"
103
+ ],
104
+ "properties": {
105
+ "id": {
106
+ "type": "string"
107
+ },
108
+ "semanticKind": {
109
+ "type": "string"
110
+ },
111
+ "integrationMode": {
112
+ "enum": ["declarative", "imperative", "hybrid", "manual-only"]
113
+ },
114
+ "adapterId": {
115
+ "type": "string"
116
+ },
117
+ "discovery": {
118
+ "type": "string"
119
+ },
120
+ "invocation": {
121
+ "type": "string"
122
+ },
123
+ "precedence": {
124
+ "type": "array",
125
+ "items": {
126
+ "type": "string"
127
+ }
128
+ },
129
+ "evidenceClaimIds": {
130
+ "type": "array",
131
+ "items": {
132
+ "type": "string"
133
+ }
134
+ },
135
+ "stability": {
136
+ "enum": ["stable", "experimental", "version-gated", "deprecated"]
137
+ },
138
+ "evidenceState": {
139
+ "enum": ["documented", "source-observed", "runtime-observed", "inferred", "unknown"]
140
+ }
141
+ }
142
+ }
143
+ },
144
+ "configuration": {
145
+ "type": "array",
146
+ "items": {
147
+ "type": "object",
148
+ "required": [
149
+ "id",
150
+ "format",
151
+ "locationId",
152
+ "mutation",
153
+ "ownership",
154
+ "uninstall",
155
+ "evidenceClaimIds"
156
+ ],
157
+ "properties": {
158
+ "id": {
159
+ "type": "string"
160
+ },
161
+ "format": {
162
+ "enum": ["json", "yaml", "toml", "text"]
163
+ },
164
+ "evidenceClaimIds": {
165
+ "type": "array",
166
+ "items": {
167
+ "type": "string"
168
+ }
169
+ },
170
+ "locationId": {
171
+ "type": "string"
172
+ },
173
+ "mutation": {
174
+ "enum": ["replace-owned", "merge-object", "append-section", "manual"]
175
+ },
176
+ "registrationKey": {
177
+ "type": "string"
178
+ },
179
+ "ownership": {
180
+ "enum": ["entry", "section", "whole-file"]
181
+ },
182
+ "uninstall": {
183
+ "enum": ["remove-owned-entry", "remove-owned-section", "manual"]
184
+ }
185
+ },
186
+ "additionalProperties": false
187
+ }
188
+ },
189
+ "managedHooks": {
190
+ "type": "array",
191
+ "items": {
192
+ "type": "object",
193
+ "additionalProperties": false,
194
+ "required": [
195
+ "id",
196
+ "event",
197
+ "payloadShape",
198
+ "ordering",
199
+ "blocking",
200
+ "failureMode",
201
+ "mutationAllowed",
202
+ "registration",
203
+ "uninstall",
204
+ "evidenceClaimIds"
205
+ ],
206
+ "properties": {
207
+ "id": {
208
+ "type": "string"
209
+ },
210
+ "event": {
211
+ "type": "string"
212
+ },
213
+ "payloadShape": {
214
+ "type": "string"
215
+ },
216
+ "ordering": {
217
+ "enum": ["before", "after", "priority", "unspecified"]
218
+ },
219
+ "timeoutMs": {
220
+ "type": "integer",
221
+ "minimum": 1
222
+ },
223
+ "blocking": {
224
+ "type": "boolean"
225
+ },
226
+ "failureMode": {
227
+ "enum": ["fail-open", "fail-closed", "report-only"]
228
+ },
229
+ "mutationAllowed": {
230
+ "type": "boolean"
231
+ },
232
+ "registration": {
233
+ "enum": ["config", "command", "plugin", "manual"]
234
+ },
235
+ "uninstall": {
236
+ "enum": ["automatic", "manual"]
237
+ },
238
+ "evidenceClaimIds": {
239
+ "type": "array",
240
+ "items": {
241
+ "type": "string"
242
+ }
243
+ }
244
+ }
245
+ }
246
+ },
247
+ "extensionEvents": {
248
+ "type": "array",
249
+ "items": {
250
+ "type": "object",
251
+ "additionalProperties": false,
252
+ "required": [
253
+ "id",
254
+ "event",
255
+ "payloadShape",
256
+ "ordering",
257
+ "blocking",
258
+ "failureMode",
259
+ "mutationAllowed",
260
+ "registration",
261
+ "uninstall",
262
+ "evidenceClaimIds"
263
+ ],
264
+ "properties": {
265
+ "id": {
266
+ "type": "string"
267
+ },
268
+ "event": {
269
+ "type": "string"
270
+ },
271
+ "payloadShape": {
272
+ "type": "string"
273
+ },
274
+ "ordering": {
275
+ "enum": ["before", "after", "priority", "unspecified"]
276
+ },
277
+ "timeoutMs": {
278
+ "type": "integer",
279
+ "minimum": 1
280
+ },
281
+ "blocking": {
282
+ "type": "boolean"
283
+ },
284
+ "failureMode": {
285
+ "enum": ["fail-open", "fail-closed", "report-only"]
286
+ },
287
+ "mutationAllowed": {
288
+ "type": "boolean"
289
+ },
290
+ "registration": {
291
+ "enum": ["extension-api", "plugin-api", "manual"]
292
+ },
293
+ "uninstall": {
294
+ "enum": ["automatic", "manual"]
295
+ },
296
+ "evidenceClaimIds": {
297
+ "type": "array",
298
+ "items": {
299
+ "type": "string"
300
+ }
301
+ }
302
+ }
303
+ }
304
+ },
305
+ "ownership": {
306
+ "type": "object",
307
+ "required": ["uninstallSupported"],
308
+ "properties": {
309
+ "uninstallSupported": {
310
+ "type": "boolean"
311
+ }
312
+ },
313
+ "additionalProperties": false
314
+ },
315
+ "degradation": {
316
+ "type": "array",
317
+ "items": {
318
+ "type": "object",
319
+ "required": ["from", "to", "lostSemantics"],
320
+ "properties": {
321
+ "from": {
322
+ "type": "string"
323
+ },
324
+ "to": {
325
+ "type": "string"
326
+ },
327
+ "lostSemantics": {
328
+ "type": "array",
329
+ "items": {
330
+ "type": "string"
331
+ }
332
+ }
333
+ },
334
+ "additionalProperties": false
335
+ }
336
+ }
337
+ }
338
+ }