@kungfu-tech/buildchain 3.0.6 → 3.0.7-alpha.0

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 (64) hide show
  1. package/README.md +4 -2
  2. package/actions/release-tail/README.md +17 -0
  3. package/bin/buildchain.mjs +11 -0
  4. package/bin/internal/command-registry.mjs +2 -0
  5. package/contracts/fixtures/release-tail-capabilities-v1/kungfu-alpha.json +273 -0
  6. package/contracts/publication-rehearsal-capsule-v1.schema.json +173 -0
  7. package/contracts/release-tail-capabilities-v1.schema.json +199 -0
  8. package/contracts/release-tail-provider-bindings-v1.schema.json +56 -0
  9. package/dist/site/agent-index.json +3 -0
  10. package/dist/site/artifact-schemas.json +6 -0
  11. package/dist/site/buildchain-contract.json +35 -20
  12. package/dist/site/buildchain-site.json +307 -17
  13. package/dist/site/capability-registry.json +12 -9
  14. package/dist/site/cli-registry.json +102 -0
  15. package/dist/site/controller-registry.json +14 -2
  16. package/dist/site/kfd-claims.json +247 -16
  17. package/dist/site/kfd-upstream-aggregate.json +1 -1
  18. package/dist/site/manual-registry.json +48 -3
  19. package/dist/site/node-api-registry.json +3108 -1409
  20. package/dist/site/page-registry.json +275 -9
  21. package/dist/site/public-surface-audit.json +304 -15
  22. package/dist/site/publication-authority-registry.json +26 -1
  23. package/dist/site/publication-registry.json +4 -4
  24. package/dist/site/release-provenance.json +5 -0
  25. package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +269 -0
  26. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +353 -0
  27. package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +94 -0
  28. package/dist/site/site-manifest.json +31 -7
  29. package/dist/site/workflow-registry.json +86 -9
  30. package/docs/MAP.md +5 -2
  31. package/docs/cli-reference.md +136 -0
  32. package/docs/node-api-reference.md +233 -84
  33. package/docs/publication-rehearsal.md +94 -0
  34. package/docs/release-tail-contract.md +160 -0
  35. package/docs/release-tail-provider-plane.md +120 -0
  36. package/package.json +8 -3
  37. package/packages/core/buildchain-agent-manuals.js +3 -0
  38. package/packages/core/buildchain-kfd-claims.js +1 -1
  39. package/packages/core/buildchain-publication-authority.js +1 -0
  40. package/packages/core/index.js +39 -0
  41. package/packages/core/paper-agent-entry.js +11 -5
  42. package/packages/core/paper-repository.js +1 -0
  43. package/packages/core/paper-scaffold-content.js +21 -0
  44. package/packages/core/paper.js +28 -2
  45. package/packages/core/publication-rehearsal-projection.js +173 -0
  46. package/packages/core/publication-rehearsal-runtime.js +909 -0
  47. package/packages/core/release-tail-compatibility.js +60 -0
  48. package/packages/core/release-tail-provider-adapters.js +461 -0
  49. package/packages/core/release-tail-provider-plane.js +1228 -0
  50. package/scripts/assemble-publication-artifact-admission.mjs +1 -1
  51. package/scripts/assemble-self-publication-admission.mjs +1 -1
  52. package/scripts/buildchain-cli-help.mjs +13 -0
  53. package/scripts/check-core-mechanism-inventory.mjs +347 -0
  54. package/scripts/check-inventory.mjs +8 -8
  55. package/scripts/check-maintainability.mjs +9 -2
  56. package/scripts/check-release-tail-contract.mjs +435 -0
  57. package/scripts/generate-channel-promotion-workflow.mjs +10 -8
  58. package/scripts/generate-site-bundle.mjs +24 -0
  59. package/scripts/init-repo.mjs +26 -2
  60. package/scripts/materialize-self-release-candidate-version.mjs +131 -0
  61. package/scripts/release-tail.mjs +159 -0
  62. package/scripts/site-capability-metadata.mjs +11 -0
  63. package/scripts/v4-architecture.mjs +600 -0
  64. package/scripts/workflow-call-contract.mjs +184 -5
package/README.md CHANGED
@@ -278,13 +278,14 @@ plus fail-closed product-evidence gates for KFD-4, KFD-5, and KFD-7. These
278
278
  gates preserve product-owned qualification and support decisions; they do not
279
279
  turn a schema-valid record into certification or shipped support.
280
280
 
281
- Buildchain's action registry currently contains six active entries. Four are
281
+ Buildchain's action registry currently contains seven active entries. Five are
282
282
  direct consumer integration actions:
283
283
 
284
284
  - `actions/validate-config`
285
285
  - `actions/run-lifecycle`
286
286
  - `actions/promote-buildchain-ref`
287
287
  - `actions/report-buildchain-issue`
288
+ - `actions/release-tail`
288
289
 
289
290
  Two additional release-authority components are also registered and versioned:
290
291
 
@@ -292,7 +293,7 @@ Two additional release-authority components are also registered and versioned:
292
293
  - `actions/macos-credential-island`
293
294
 
294
295
  `dist/site/workflow-registry.json#actions` is the machine-readable inventory;
295
- this split keeps the older four-action consumer list from being mistaken for
296
+ this split keeps the older four-action consumer snapshot from being mistaken for
296
297
  the complete current registry.
297
298
 
298
299
  The active reusable workflow surfaces are:
@@ -457,4 +458,5 @@ npm pack --dry-run --json --registry=https://registry.npmjs.org/
457
458
  - [Release candidate passport](docs/release-candidate.md)
458
459
  - [Consumer issue reporting](docs/consumer-issue-reporting.md)
459
460
  - [Publish transaction](docs/publish-transaction.md)
461
+ - [Declarative release-tail contract](docs/release-tail-contract.md)
460
462
  - [Release governance](docs/release-governance.md)
@@ -0,0 +1,17 @@
1
+ # Declarative Release Tail
2
+
3
+ This Action restores one content-addressed
4
+ `kungfu.buildchain.publication-rehearsal-capsule/v1` and invokes the same public
5
+ rehearsal runtime used by the local CLI. The capsule binds the versioned
6
+ `buildchain.release-tail/v1` declaration, candidate files, policies, Passport,
7
+ transaction, data-only provider bindings and observations. It does not accept
8
+ a command, script, executable path, plugin, repository callback, implicit
9
+ workspace or GitHub runner semantic input.
10
+
11
+ Every mutation is preceded and followed by provider readback. Buildchain core,
12
+ not the adapter, compares the observed subject and target roots, owns retry and
13
+ terminal classification, checkpoints state and emits the standardized receipt.
14
+ Tokens remain Action inputs and are never written to the transaction or
15
+ receipt. The wrapper contributes only credentials, GitHub/HTTPS transport and
16
+ real provider observations. The rooted provider transcript and rehearsal
17
+ evidence are retained with the transaction state.
@@ -9,6 +9,7 @@ import { npmPublishDryRun } from "../scripts/npm-publish-dry-run.mjs";
9
9
  import { runLifecycle } from "../scripts/run-lifecycle-core.mjs";
10
10
  import { runReleasePropagationCli } from "../scripts/release-propagation.mjs";
11
11
  import { runReleaseGovernanceCli } from "../scripts/reconcile-release-governance.mjs";
12
+ import { runReleaseTailCli } from "../scripts/release-tail.mjs";
12
13
  import { runPublicationArtifactCli } from "../scripts/publication-artifact.mjs";
13
14
  import { runPublicationPackageCli } from "../scripts/publication-package.mjs";
14
15
  import { runPublicationReproducibilityCli } from "../scripts/publication-reproducibility.mjs";
@@ -1646,6 +1647,10 @@ async function handleReleaseGovernanceCommand(args) {
1646
1647
 
1647
1648
  }
1648
1649
 
1650
+ async function handleReleaseTailCommand(args) {
1651
+ await runReleaseTailCli(args);
1652
+ }
1653
+
1649
1654
  async function handleGitHubGovernanceCommand(args) {
1650
1655
  runScript("reconcile-github-governance.mjs", args);
1651
1656
  return;
@@ -1706,6 +1711,10 @@ async function handlePublishSourceCommand(args) {
1706
1711
 
1707
1712
  }
1708
1713
 
1714
+ async function handleArchitectureCommand(args) {
1715
+ runScript("v4-architecture.mjs", args);
1716
+ }
1717
+
1709
1718
  const BUILDCHAIN_COMMAND_HANDLERS = Object.freeze({
1710
1719
  "help": handleHelpCommand,
1711
1720
  "version": handleVersionCommand,
@@ -1737,11 +1746,13 @@ const BUILDCHAIN_COMMAND_HANDLERS = Object.freeze({
1737
1746
  "paper": handlePaperCommand,
1738
1747
  "release-propagation": handleReleasePropagationCommand,
1739
1748
  "release-governance": handleReleaseGovernanceCommand,
1749
+ "release-tail": handleReleaseTailCommand,
1740
1750
  "github-governance": handleGitHubGovernanceCommand,
1741
1751
  "badges": handleBadgesCommand,
1742
1752
  "homebrew": handleHomebrewCommand,
1743
1753
  "build-contract": handleBuildContractCommand,
1744
1754
  "publish-source": handlePublishSourceCommand,
1755
+ "architecture": handleArchitectureCommand,
1745
1756
  });
1746
1757
 
1747
1758
  async function main(argv = process.argv.slice(2)) {
@@ -32,11 +32,13 @@ const BUILDCHAIN_COMMAND_REGISTRY = Object.freeze([
32
32
  { id: "paper", aliases: [] },
33
33
  { id: "release-propagation", aliases: [] },
34
34
  { id: "release-governance", aliases: [] },
35
+ { id: "release-tail", aliases: [] },
35
36
  { id: "github-governance", aliases: [] },
36
37
  { id: "badges", aliases: [] },
37
38
  { id: "homebrew", aliases: [] },
38
39
  { id: "build-contract", aliases: [] },
39
40
  { id: "publish-source", aliases: [] },
41
+ { id: "architecture", aliases: [] },
40
42
  ]);
41
43
 
42
44
  function buildCommandLookup(registry = BUILDCHAIN_COMMAND_REGISTRY) {
@@ -0,0 +1,273 @@
1
+ {
2
+ "contract": "kungfu-buildchain-release-tail-capabilities",
3
+ "schemaVersion": 1,
4
+ "transactionPolicy": "buildchain.release-tail/v1",
5
+ "subject": {
6
+ "repository": "kungfu-systems/kungfu",
7
+ "sourceSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8
+ "version": "4.0.0-alpha.1",
9
+ "tag": "v4.0.0-alpha.1",
10
+ "channel": "alpha"
11
+ },
12
+ "capabilities": [
13
+ {
14
+ "id": "artifact.publish",
15
+ "executor": "provider-adapter",
16
+ "adapter": "github-release-assets",
17
+ "artifactRoles": [
18
+ {
19
+ "role": "installable-product",
20
+ "root": "sha256:1111111111111111111111111111111111111111111111111111111111111111"
21
+ },
22
+ {
23
+ "role": "release-passport",
24
+ "root": "sha256:2222222222222222222222222222222222222222222222222222222222222222"
25
+ }
26
+ ],
27
+ "destination": {
28
+ "kind": "github-release",
29
+ "locator": "github-release:kungfu-systems/kungfu@v4.0.0-alpha.1"
30
+ },
31
+ "channelPolicy": {
32
+ "channel": "alpha",
33
+ "tagPattern": "^v4\\.0\\.0-alpha\\.[0-9]+$",
34
+ "authorityMove": "verified-ref"
35
+ },
36
+ "activationPolicy": { "mode": "none", "environment": "none" },
37
+ "readbackPredicates": [
38
+ {
39
+ "id": "release-assets-match-roots",
40
+ "kind": "provider-assets",
41
+ "expected": "all declared artifact roots are publicly readable"
42
+ }
43
+ ],
44
+ "effect": {
45
+ "kind": "artifact-publication",
46
+ "schema": "kungfu.buildchain.release-tail.effect/v1"
47
+ },
48
+ "observation": {
49
+ "kind": "artifact-publication-readback",
50
+ "schema": "kungfu.buildchain.release-tail.observation/v1"
51
+ },
52
+ "receipt": {
53
+ "kind": "artifact-publication",
54
+ "schema": "kungfu.buildchain.release-tail.receipt/v1"
55
+ },
56
+ "operationIdentity": {
57
+ "transactionRoot": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
58
+ "capabilityId": "artifact.publish",
59
+ "subjectRoot": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
60
+ "targetRoot": "sha256:4444444444444444444444444444444444444444444444444444444444444444",
61
+ "attemptKey": "artifact.publish/1"
62
+ },
63
+ "idempotency": {
64
+ "scope": "subject-target",
65
+ "duplicate": "readback-before-retry"
66
+ },
67
+ "retry": {
68
+ "class": "provider-transient",
69
+ "localAttempts": 2,
70
+ "exhausted": "repair-required"
71
+ },
72
+ "evidenceRequirements": [
73
+ "kungfu-buildchain-publish-evidence",
74
+ "kungfu-buildchain-release-passport"
75
+ ]
76
+ },
77
+ {
78
+ "id": "signed-channel.commit",
79
+ "executor": "provider-adapter",
80
+ "adapter": "signed-static-channel",
81
+ "artifactRoles": [
82
+ {
83
+ "role": "signed-channel-index",
84
+ "root": "sha256:5555555555555555555555555555555555555555555555555555555555555555"
85
+ },
86
+ {
87
+ "role": "installer-publication-bundle",
88
+ "root": "sha256:6666666666666666666666666666666666666666666666666666666666666666"
89
+ }
90
+ ],
91
+ "destination": {
92
+ "kind": "well-known-signed-channel",
93
+ "locator": "https://kungfu.tech/.well-known/kungfu/alpha.json"
94
+ },
95
+ "channelPolicy": {
96
+ "channel": "alpha",
97
+ "tagPattern": "^v4\\.0\\.0-alpha\\.[0-9]+$",
98
+ "authorityMove": "signed-cas"
99
+ },
100
+ "activationPolicy": { "mode": "none", "environment": "none" },
101
+ "readbackPredicates": [
102
+ {
103
+ "id": "signed-channel-root",
104
+ "kind": "public-signed-document",
105
+ "expected": "signature, payload root, source SHA, tag, and previous authority match"
106
+ }
107
+ ],
108
+ "effect": {
109
+ "kind": "signed-channel-commit",
110
+ "schema": "kungfu.buildchain.release-tail.effect/v1"
111
+ },
112
+ "observation": {
113
+ "kind": "signed-channel-readback",
114
+ "schema": "kungfu.buildchain.release-tail.observation/v1"
115
+ },
116
+ "receipt": {
117
+ "kind": "publication-commit",
118
+ "schema": "kungfu.buildchain.release-tail.receipt/v1"
119
+ },
120
+ "operationIdentity": {
121
+ "transactionRoot": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
122
+ "capabilityId": "signed-channel.commit",
123
+ "subjectRoot": "sha256:7777777777777777777777777777777777777777777777777777777777777777",
124
+ "targetRoot": "sha256:8888888888888888888888888888888888888888888888888888888888888888",
125
+ "attemptKey": "signed-channel.commit/1"
126
+ },
127
+ "idempotency": {
128
+ "scope": "subject-target",
129
+ "duplicate": "return-observed-receipt"
130
+ },
131
+ "retry": {
132
+ "class": "readback",
133
+ "localAttempts": 2,
134
+ "exhausted": "repair-required"
135
+ },
136
+ "evidenceRequirements": [
137
+ "kungfu-buildchain-publication-commit-evidence/v1"
138
+ ]
139
+ },
140
+ {
141
+ "id": "release.activate",
142
+ "executor": "provider-adapter",
143
+ "adapter": "site-release-activation",
144
+ "artifactRoles": [
145
+ {
146
+ "role": "activation-receipt-set",
147
+ "root": "sha256:9999999999999999999999999999999999999999999999999999999999999999"
148
+ }
149
+ ],
150
+ "destination": {
151
+ "kind": "production-site",
152
+ "locator": "https://kungfu.tech/.well-known/kungfu-release-status.json"
153
+ },
154
+ "channelPolicy": {
155
+ "channel": "alpha",
156
+ "tagPattern": "^v4\\.0\\.0-alpha\\.[0-9]+$",
157
+ "authorityMove": "verified-ref"
158
+ },
159
+ "activationPolicy": {
160
+ "mode": "receipt-set",
161
+ "environment": "production"
162
+ },
163
+ "readbackPredicates": [
164
+ {
165
+ "id": "release-status-current",
166
+ "kind": "public-json",
167
+ "expected": "source, site source, version, tag, channel, and Passport roots match"
168
+ },
169
+ {
170
+ "id": "installable-product-qualified",
171
+ "kind": "public-product-qualification",
172
+ "expected": "a public qualification asset matches an admitted artifact root"
173
+ }
174
+ ],
175
+ "effect": {
176
+ "kind": "release-activation",
177
+ "schema": "kungfu.buildchain.release-tail.effect/v1"
178
+ },
179
+ "observation": {
180
+ "kind": "production-readback",
181
+ "schema": "kungfu.buildchain.release-tail.observation/v1"
182
+ },
183
+ "receipt": {
184
+ "kind": "activation-receipt-set",
185
+ "schema": "kungfu.buildchain.release-tail.receipt/v1"
186
+ },
187
+ "operationIdentity": {
188
+ "transactionRoot": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
189
+ "capabilityId": "release.activate",
190
+ "subjectRoot": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
191
+ "targetRoot": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
192
+ "attemptKey": "release.activate/1"
193
+ },
194
+ "idempotency": {
195
+ "scope": "operation",
196
+ "duplicate": "readback-before-retry"
197
+ },
198
+ "retry": {
199
+ "class": "provider-transient",
200
+ "localAttempts": 2,
201
+ "exhausted": "blocked"
202
+ },
203
+ "evidenceRequirements": [
204
+ "kungfu-buildchain-release-activation-receipt-set/v1",
205
+ "kungfu.release-public-readback/v1",
206
+ "kungfu.cli-installed-product-qualification/v1"
207
+ ]
208
+ },
209
+ {
210
+ "id": "released-evidence.synthesize",
211
+ "executor": "buildchain-core",
212
+ "adapter": "activation-receipt-projector",
213
+ "artifactRoles": [
214
+ {
215
+ "role": "activation-receipt-set",
216
+ "root": "sha256:9999999999999999999999999999999999999999999999999999999999999999"
217
+ }
218
+ ],
219
+ "destination": {
220
+ "kind": "release-passport-attachment",
221
+ "locator": ".buildchain/release-evidence/ungfu-public-use.json"
222
+ },
223
+ "channelPolicy": {
224
+ "channel": "alpha",
225
+ "tagPattern": "^v4\\.0\\.0-alpha\\.[0-9]+$",
226
+ "authorityMove": "none"
227
+ },
228
+ "activationPolicy": {
229
+ "mode": "receipt-only",
230
+ "environment": "production"
231
+ },
232
+ "readbackPredicates": [
233
+ {
234
+ "id": "five-canonical-receipts",
235
+ "kind": "rooted-receipt-set",
236
+ "expected": "artifact, Passport, site, public readback, and product qualification receipts share one binding root"
237
+ }
238
+ ],
239
+ "effect": {
240
+ "kind": "released-evidence-projection",
241
+ "schema": "kungfu.buildchain.release-tail.effect/v1"
242
+ },
243
+ "observation": {
244
+ "kind": "released-evidence-validation",
245
+ "schema": "kungfu.buildchain.release-tail.observation/v1"
246
+ },
247
+ "receipt": {
248
+ "kind": "released-evidence",
249
+ "schema": "kungfu.buildchain.release-tail.receipt/v1"
250
+ },
251
+ "operationIdentity": {
252
+ "transactionRoot": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
253
+ "capabilityId": "released-evidence.synthesize",
254
+ "subjectRoot": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
255
+ "targetRoot": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
256
+ "attemptKey": "released-evidence.synthesize/1"
257
+ },
258
+ "idempotency": {
259
+ "scope": "operation",
260
+ "duplicate": "return-observed-receipt"
261
+ },
262
+ "retry": {
263
+ "class": "never",
264
+ "localAttempts": 0,
265
+ "exhausted": "terminal-failure"
266
+ },
267
+ "evidenceRequirements": [
268
+ "kungfu-buildchain-release-activation-receipt-set/v1",
269
+ "kungfu-ungfu-release-evidence-index"
270
+ ]
271
+ }
272
+ ]
273
+ }
@@ -0,0 +1,173 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://buildchain.kungfu.ai/contracts/publication-rehearsal-capsule-v1.schema.json",
4
+ "title": "Buildchain publication rehearsal capsule",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "contract",
9
+ "schemaVersion",
10
+ "root",
11
+ "declaration",
12
+ "policyRoots",
13
+ "passport",
14
+ "transaction",
15
+ "files",
16
+ "providerBindings",
17
+ "providerObservations",
18
+ "runtime"
19
+ ],
20
+ "properties": {
21
+ "contract": {
22
+ "const": "kungfu.buildchain.publication-rehearsal-capsule/v1"
23
+ },
24
+ "schemaVersion": { "const": 1 },
25
+ "root": { "$ref": "#/$defs/root" },
26
+ "declaration": {
27
+ "$ref": "release-tail-capabilities-v1.schema.json"
28
+ },
29
+ "policyRoots": {
30
+ "type": "array",
31
+ "minItems": 1,
32
+ "uniqueItems": true,
33
+ "items": { "$ref": "#/$defs/root" }
34
+ },
35
+ "passport": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": ["path", "root"],
39
+ "properties": {
40
+ "path": { "$ref": "#/$defs/path" },
41
+ "root": { "$ref": "#/$defs/root" }
42
+ }
43
+ },
44
+ "transaction": {
45
+ "type": "object",
46
+ "required": [
47
+ "schema",
48
+ "transactionPolicy",
49
+ "transactionRoot",
50
+ "declarationRoot",
51
+ "planRoot",
52
+ "subject",
53
+ "state",
54
+ "operationOrder",
55
+ "operations",
56
+ "observations",
57
+ "receipts",
58
+ "failure",
59
+ "stateRoot"
60
+ ]
61
+ },
62
+ "files": {
63
+ "type": "array",
64
+ "minItems": 1,
65
+ "items": {
66
+ "type": "object",
67
+ "additionalProperties": false,
68
+ "required": ["role", "path", "size", "root"],
69
+ "properties": {
70
+ "role": { "type": "string", "minLength": 1 },
71
+ "path": { "$ref": "#/$defs/path" },
72
+ "size": { "type": "integer", "minimum": 0 },
73
+ "root": { "$ref": "#/$defs/root" }
74
+ }
75
+ }
76
+ },
77
+ "providerBindings": {
78
+ "$ref": "release-tail-provider-bindings-v1.schema.json"
79
+ },
80
+ "providerObservations": {
81
+ "type": "array",
82
+ "items": {
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "required": ["operationId", "readbacks", "apply"],
86
+ "properties": {
87
+ "operationId": { "$ref": "#/$defs/root" },
88
+ "readbacks": {
89
+ "type": "array",
90
+ "minItems": 1,
91
+ "items": { "$ref": "#/$defs/observation" }
92
+ },
93
+ "apply": {
94
+ "type": "object",
95
+ "additionalProperties": false,
96
+ "required": ["outcome", "code", "classification"],
97
+ "properties": {
98
+ "outcome": {
99
+ "enum": ["applied", "transient", "conflict"]
100
+ },
101
+ "code": { "type": "string", "minLength": 1 },
102
+ "classification": { "type": "string", "minLength": 1 }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ },
108
+ "runtime": {
109
+ "type": "object",
110
+ "additionalProperties": false,
111
+ "required": ["platform", "declaredEnvironment", "externalEffects"],
112
+ "properties": {
113
+ "platform": { "const": "portable" },
114
+ "declaredEnvironment": {
115
+ "type": "array",
116
+ "uniqueItems": true,
117
+ "items": { "type": "string", "pattern": "^[A-Z][A-Z0-9_]*$" }
118
+ },
119
+ "externalEffects": {
120
+ "type": "array",
121
+ "items": {
122
+ "type": "object",
123
+ "additionalProperties": false,
124
+ "required": ["capabilityId", "adapter", "kind"],
125
+ "properties": {
126
+ "capabilityId": { "type": "string", "minLength": 1 },
127
+ "adapter": { "type": "string", "minLength": 1 },
128
+ "kind": { "type": "string", "minLength": 1 }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ },
135
+ "$defs": {
136
+ "root": {
137
+ "type": "string",
138
+ "pattern": "^sha256:[0-9a-f]{64}$"
139
+ },
140
+ "path": {
141
+ "type": "string",
142
+ "minLength": 1,
143
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*\\\\).+$"
144
+ },
145
+ "observation": {
146
+ "type": "object",
147
+ "additionalProperties": false,
148
+ "required": [
149
+ "outcome",
150
+ "subjectRoot",
151
+ "targetRoot",
152
+ "evidenceRoots",
153
+ "providerCode"
154
+ ],
155
+ "properties": {
156
+ "outcome": {
157
+ "enum": ["observed", "absent", "transient", "conflict"]
158
+ },
159
+ "subjectRoot": {
160
+ "anyOf": [{ "$ref": "#/$defs/root" }, { "const": "" }]
161
+ },
162
+ "targetRoot": {
163
+ "anyOf": [{ "$ref": "#/$defs/root" }, { "const": "" }]
164
+ },
165
+ "evidenceRoots": {
166
+ "type": "array",
167
+ "items": { "$ref": "#/$defs/root" }
168
+ },
169
+ "providerCode": { "type": "string", "minLength": 1 }
170
+ }
171
+ }
172
+ }
173
+ }