release-skill 0.9.16 → 0.9.17

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 (164) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/.kimi-plugin/plugin.json +1 -1
  5. package/.qoder-plugin/plugin.json +10 -0
  6. package/CHANGELOG.md +30 -0
  7. package/INSTALL.md +57 -9
  8. package/INSTALL.zh-CN.md +44 -7
  9. package/README.md +75 -31
  10. package/README.zh-CN.md +60 -29
  11. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  12. package/adapters/claude/bin/release-skill.bundle.mjs +1443 -672
  13. package/adapters/claude/schemas/release-plan.schema.json +1 -1
  14. package/adapters/claude/schemas/release-project.schema.json +1 -1
  15. package/adapters/claude/skills/release-finish/SKILL.md +14 -13
  16. package/adapters/claude/skills/release-help/SKILL.md +3 -3
  17. package/adapters/claude/skills/release-verify/SKILL.md +2 -2
  18. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  19. package/adapters/codex/bin/release-skill.bundle.mjs +1443 -672
  20. package/adapters/codex/schemas/release-plan.schema.json +1 -1
  21. package/adapters/codex/schemas/release-project.schema.json +1 -1
  22. package/adapters/codex/skills/release-finish/SKILL.md +14 -13
  23. package/adapters/codex/skills/release-help/SKILL.md +3 -3
  24. package/adapters/codex/skills/release-verify/SKILL.md +2 -2
  25. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  26. package/adapters/kimi/bin/release-skill.bundle.mjs +1443 -672
  27. package/adapters/kimi/schemas/release-plan.schema.json +1 -1
  28. package/adapters/kimi/schemas/release-project.schema.json +1 -1
  29. package/adapters/kimi/skills/release-finish/SKILL.md +14 -13
  30. package/adapters/kimi/skills/release-help/SKILL.md +3 -3
  31. package/adapters/kimi/skills/release-verify/SKILL.md +2 -2
  32. package/adapters/qoder/.qoder-plugin/plugin.json +10 -0
  33. package/adapters/qoder/bin/consumer-contract-vectors.json +110 -0
  34. package/adapters/qoder/bin/error-codes.json +161 -0
  35. package/adapters/qoder/bin/foundation-legal/skill-family-contracts/LICENSE +202 -0
  36. package/adapters/qoder/bin/foundation-legal/skill-family-contracts/NOTICE +10 -0
  37. package/adapters/qoder/bin/foundation-legal/skill-family-engineering-kit/LICENSE +202 -0
  38. package/adapters/qoder/bin/foundation-legal/skill-family-engineering-kit/NOTICE +10 -0
  39. package/adapters/qoder/bin/foundation-legal/skill-family-engineering-kit/THIRD_PARTY_NOTICES +142 -0
  40. package/adapters/qoder/bin/foundation-legal/skill-family-harness-node/LICENSE +202 -0
  41. package/adapters/qoder/bin/foundation-legal/skill-family-harness-node/NOTICE +10 -0
  42. package/adapters/qoder/bin/foundation-legal/skill-family-harness-node/native-NOTICE +2 -0
  43. package/adapters/qoder/bin/foundation-resource-binding.json +1 -0
  44. package/adapters/qoder/bin/kernel-protocol.json +60 -0
  45. package/adapters/qoder/bin/license-texts/Apache-2.0.txt +201 -0
  46. package/adapters/qoder/bin/license-texts/MIT.txt +21 -0
  47. package/adapters/qoder/bin/prebuild-manifest.json +79 -0
  48. package/adapters/qoder/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  49. package/adapters/qoder/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  50. package/adapters/qoder/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  51. package/adapters/qoder/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  52. package/adapters/qoder/bin/registry.json +347 -0
  53. package/adapters/qoder/bin/release-skill-local-finish.mjs +4 -0
  54. package/adapters/qoder/bin/release-skill.bundle.mjs +149446 -0
  55. package/adapters/qoder/bin/release-skill.mjs +54 -0
  56. package/adapters/qoder/bin/rules.json +104 -0
  57. package/adapters/qoder/bin/schemas/consumer-contract-vector.schema.json +149 -0
  58. package/adapters/qoder/data/hosts/claude/host-descriptor.json +45 -0
  59. package/adapters/qoder/data/hosts/codebuddy/host-descriptor.json +26 -0
  60. package/adapters/qoder/data/hosts/codex/host-descriptor.json +45 -0
  61. package/adapters/qoder/data/hosts/deepseek-harness/host-descriptor.json +23 -0
  62. package/adapters/qoder/data/hosts/kimi-code/host-descriptor.json +36 -0
  63. package/adapters/qoder/data/hosts/qoder/host-descriptor.json +26 -0
  64. package/adapters/qoder/data/hosts/registry.json +13 -0
  65. package/adapters/qoder/data/hosts/workbuddy/host-descriptor.json +34 -0
  66. package/adapters/qoder/data/licensing/registry.json +211 -0
  67. package/adapters/qoder/data/licensing/schema.json +207 -0
  68. package/adapters/qoder/native/safe-write/binding.gyp +41 -0
  69. package/adapters/qoder/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  70. package/adapters/qoder/native/safe-write/prebuilds.json +24 -0
  71. package/adapters/qoder/native/safe-write/src/safe_write.cc +2032 -0
  72. package/adapters/qoder/schemas/.render-manifest.json +41 -0
  73. package/adapters/qoder/schemas/approval-record.schema.json +115 -0
  74. package/adapters/qoder/schemas/artifact-lock.schema.json +111 -0
  75. package/adapters/qoder/schemas/artifact-plan.schema.json +52 -0
  76. package/adapters/qoder/schemas/artifact-policy.schema.json +76 -0
  77. package/adapters/qoder/schemas/evidence-event-v2.schema.json +164 -0
  78. package/adapters/qoder/schemas/evidence-event.schema.json +89 -0
  79. package/adapters/qoder/schemas/postpublish-approval-record.schema.json +47 -0
  80. package/adapters/qoder/schemas/release-plan.schema.json +1996 -0
  81. package/adapters/qoder/schemas/release-project.schema.json +1613 -0
  82. package/adapters/qoder/schemas/release-run.schema.json +777 -0
  83. package/adapters/qoder/skills/release-assess/SKILL.md +60 -0
  84. package/adapters/qoder/skills/release-config/SKILL.md +150 -0
  85. package/adapters/qoder/skills/release-docs/SKILL.md +119 -0
  86. package/adapters/qoder/skills/release-finish/SKILL.md +141 -0
  87. package/adapters/qoder/skills/release-help/SKILL.md +153 -0
  88. package/adapters/qoder/skills/release-marketplace/SKILL.md +156 -0
  89. package/adapters/qoder/skills/release-prepare/SKILL.md +135 -0
  90. package/adapters/qoder/skills/release-publish/SKILL.md +91 -0
  91. package/adapters/qoder/skills/release-reconcile/SKILL.md +80 -0
  92. package/adapters/qoder/skills/release-setup/SKILL.md +131 -0
  93. package/adapters/qoder/skills/release-verify/SKILL.md +109 -0
  94. package/adapters/qoder/src/schemas/adapter-build-manifest.schema.json +41 -0
  95. package/adapters/qoder/src/schemas/adapter-peer-verification-request.schema.json +54 -0
  96. package/adapters/qoder/src/schemas/adapter-peer-verification-result.schema.json +54 -0
  97. package/adapters/qoder/src/schemas/adapter-source.schema.json +47 -0
  98. package/adapters/qoder/src/schemas/audit-baseline-pin.schema.json +163 -0
  99. package/adapters/qoder/src/schemas/declared-read-surface-result.schema.json +61 -0
  100. package/adapters/qoder/src/schemas/engineering-baseline.schema.json +77 -0
  101. package/adapters/qoder/src/schemas/executable-identity-observation.schema.json +162 -0
  102. package/adapters/qoder/src/schemas/filesystem-root-binding.schema.json +14 -0
  103. package/adapters/qoder/src/schemas/filesystem-tree-observation.schema.json +71 -0
  104. package/adapters/qoder/src/schemas/fixed-set-publication-manifest.schema.json +108 -0
  105. package/adapters/qoder/src/schemas/fixed-set-publication-receipt.schema.json +148 -0
  106. package/adapters/qoder/src/schemas/host-capability-fact.schema.json +31 -0
  107. package/adapters/qoder/src/schemas/host-descriptor.schema.json +137 -0
  108. package/adapters/qoder/src/schemas/host-operation-plan.schema.json +57 -0
  109. package/adapters/qoder/src/schemas/host-operation-receipt.schema.json +81 -0
  110. package/adapters/qoder/src/schemas/host-probe-result.schema.json +30 -0
  111. package/adapters/qoder/src/schemas/host-registry.schema.json +18 -0
  112. package/adapters/qoder/src/schemas/host-verification-request.schema.json +67 -0
  113. package/adapters/qoder/src/schemas/host-verification-result.schema.json +149 -0
  114. package/adapters/qoder/src/schemas/managed-file-lock.schema.json +77 -0
  115. package/adapters/qoder/src/schemas/migration-manifest.schema.json +412 -0
  116. package/adapters/qoder/src/schemas/observation-scope.schema.json +91 -0
  117. package/adapters/qoder/src/schemas/operation-request.schema.json +58 -0
  118. package/adapters/qoder/src/schemas/operation-result.schema.json +130 -0
  119. package/adapters/qoder/src/schemas/platform-difference-registry.schema.json +110 -0
  120. package/adapters/qoder/src/schemas/plugin-verification-request.schema.json +499 -0
  121. package/adapters/qoder/src/schemas/plugin-verification-result.schema.json +1217 -0
  122. package/adapters/qoder/src/schemas/profile-adoption-declaration.schema.json +111 -0
  123. package/adapters/qoder/src/schemas/profile-descriptor.schema.json +99 -0
  124. package/adapters/qoder/src/schemas/project-manifest.schema.json +67 -0
  125. package/adapters/qoder/src/schemas/project-profile.schema.json +25 -0
  126. package/adapters/qoder/src/schemas/public-boundary-declaration.schema.json +73 -0
  127. package/adapters/qoder/src/schemas/report-binding.schema.json +42 -0
  128. package/adapters/qoder/src/schemas/report-model.schema.json +308 -0
  129. package/adapters/qoder/src/schemas/skill-family-directory-verification-request.schema.json +100 -0
  130. package/adapters/qoder/src/schemas/skill-family-directory-verification-result.schema.json +193 -0
  131. package/adapters/qoder/src/schemas/source-authority-receipt.schema.json +31 -0
  132. package/adapters/qoder/src/schemas/state-event-envelope.schema.json +38 -0
  133. package/adapters/qoder/src/schemas/state-snapshot-metadata.schema.json +25 -0
  134. package/adapters/qoder/src/schemas/structured-scan-policy.schema.json +97 -0
  135. package/adapters/qoder/src/schemas/surface-scan-policy.schema.json +42 -0
  136. package/adapters/qoder/src/schemas/timeout-policy.schema.json +24 -0
  137. package/adapters/qoder/src/schemas/token-estimate-record.schema.json +75 -0
  138. package/adapters/qoder/src/schemas/token-estimate-result.schema.json +43 -0
  139. package/adapters/qoder/src/schemas/watchdog-termination-envelope.schema.json +156 -0
  140. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  141. package/adapters/workbuddy/bin/release-skill.bundle.mjs +1443 -672
  142. package/adapters/workbuddy/schemas/release-plan.schema.json +1 -1
  143. package/adapters/workbuddy/schemas/release-project.schema.json +1 -1
  144. package/adapters/workbuddy/skills/release-finish/SKILL.md +14 -13
  145. package/adapters/workbuddy/skills/release-help/SKILL.md +3 -3
  146. package/adapters/workbuddy/skills/release-verify/SKILL.md +2 -2
  147. package/bin/release-skill-cli.mjs +124 -6
  148. package/bin/release-skill.bundle.mjs +1443 -672
  149. package/package.json +4 -2
  150. package/platform-manifest.json +70 -4
  151. package/references/02-project-config.md +9 -2
  152. package/schemas/release-plan.schema.json +1 -1
  153. package/schemas/release-project.schema.json +1 -1
  154. package/skills/release-finish/SKILL.md +14 -13
  155. package/skills/release-help/SKILL.md +3 -3
  156. package/skills/release-verify/SKILL.md +2 -2
  157. package/skills-src/release-finish/SKILL.md +14 -13
  158. package/skills-src/release-help/SKILL.md +3 -3
  159. package/skills-src/release-verify/SKILL.md +2 -2
  160. package/src/commands/post-release-local.mjs +360 -51
  161. package/src/commands/verify-records.mjs +467 -0
  162. package/src/core/postpublish.mjs +1 -1
  163. package/src/core/run.mjs +1 -1
  164. package/src/producers/build-adapters.mjs +36 -13
@@ -0,0 +1,1996 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://release-skill.dev/schemas/release-plan/v1",
4
+ "title": "Release Plan",
5
+ "description": "Schema for frozen release plan produced by the prepare phase",
6
+ "type": "object",
7
+ "required": [
8
+ "planVersion",
9
+ "status",
10
+ "baseline",
11
+ "units",
12
+ "externalActions"
13
+ ],
14
+ "additionalProperties": false,
15
+ "properties": {
16
+ "planVersion": {
17
+ "type": "integer",
18
+ "enum": [
19
+ 1,
20
+ 2,
21
+ 3
22
+ ],
23
+ "description": "Plan format and digest-scoping version. 1: legacy (every field except the top-level digest binds; commitTimestamp must equal createdAt). 2: T1.2 digest layering (record-layer fields status/createdAt/baseline/per-action status are excluded from the plan digest; commitTimestamp is derived from the HEAD commit committer date). 3: multi-release-unit postPublish v3 (postPublish is a declaration ARRAY, one entry per declaring unit in plan.units order, possibly empty; v3 inherits the v2 record-layer semantics and only changes the postPublish shape)."
24
+ },
25
+ "status": {
26
+ "type": "string",
27
+ "enum": [
28
+ "DISCOVERED",
29
+ "ASSESSED",
30
+ "PREPARED",
31
+ "APPROVED",
32
+ "PUBLISHING",
33
+ "PUBLISHED",
34
+ "VERIFIED",
35
+ "NEEDS_INPUT",
36
+ "BLOCKED",
37
+ "PARTIAL"
38
+ ]
39
+ },
40
+ "production": {
41
+ "type": "object",
42
+ "required": [
43
+ "mode",
44
+ "assetRoot"
45
+ ],
46
+ "additionalProperties": false,
47
+ "properties": {
48
+ "mode": {
49
+ "const": "github-npm-v1"
50
+ },
51
+ "assetRoot": {
52
+ "type": "string",
53
+ "minLength": 1
54
+ }
55
+ }
56
+ },
57
+ "publicSourceAuthorityReceipt": {
58
+ "type": "object",
59
+ "required": [
60
+ "coordinatorUnitId",
61
+ "subjectUnitIds",
62
+ "asset"
63
+ ],
64
+ "additionalProperties": false,
65
+ "properties": {
66
+ "coordinatorUnitId": {
67
+ "type": "string",
68
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$"
69
+ },
70
+ "subjectUnitIds": {
71
+ "type": "array",
72
+ "minItems": 1,
73
+ "uniqueItems": true,
74
+ "items": {
75
+ "type": "string",
76
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$"
77
+ }
78
+ },
79
+ "asset": {
80
+ "type": "object",
81
+ "required": [
82
+ "name",
83
+ "path",
84
+ "sha256"
85
+ ],
86
+ "additionalProperties": false,
87
+ "properties": {
88
+ "name": {
89
+ "const": "source-authority-receipt.json"
90
+ },
91
+ "path": {
92
+ "type": "string",
93
+ "minLength": 1,
94
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$"
95
+ },
96
+ "sha256": {
97
+ "type": "string",
98
+ "pattern": "^[a-f0-9]{64}$"
99
+ }
100
+ }
101
+ }
102
+ }
103
+ },
104
+ "baseline": {
105
+ "type": "object",
106
+ "required": [
107
+ "gitTreeHash"
108
+ ],
109
+ "additionalProperties": false,
110
+ "properties": {
111
+ "gitTreeHash": {
112
+ "type": "string",
113
+ "minLength": 1
114
+ },
115
+ "workspaceDigest": {
116
+ "type": "string",
117
+ "minLength": 1,
118
+ "description": "Deterministic digest of workspace file state at plan freeze time"
119
+ },
120
+ "workspaceDigestAlgorithm": {
121
+ "type": "string",
122
+ "const": "git-workspace-v2",
123
+ "description": "Versioned algorithm authority for workspaceDigest"
124
+ },
125
+ "headCommit": {
126
+ "type": "string"
127
+ },
128
+ "dirtyFiles": {
129
+ "type": "array",
130
+ "items": {
131
+ "type": "string"
132
+ }
133
+ },
134
+ "capturedAt": {
135
+ "type": "string",
136
+ "format": "date-time"
137
+ }
138
+ }
139
+ },
140
+ "units": {
141
+ "type": "array",
142
+ "minItems": 1,
143
+ "items": {
144
+ "type": "object",
145
+ "required": [
146
+ "id",
147
+ "targetVersion",
148
+ "previousPublicBaseline"
149
+ ],
150
+ "additionalProperties": false,
151
+ "properties": {
152
+ "id": {
153
+ "type": "string",
154
+ "minLength": 1,
155
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$"
156
+ },
157
+ "targetVersion": {
158
+ "type": "string",
159
+ "minLength": 1
160
+ },
161
+ "source": {
162
+ "type": "string"
163
+ },
164
+ "publicRepo": {
165
+ "type": "string"
166
+ },
167
+ "tagTemplate": {
168
+ "type": "string"
169
+ },
170
+ "snapshotDigest": {
171
+ "type": "string",
172
+ "description": "SHA-256 digest of the snapshot content"
173
+ },
174
+ "productionConfig": {
175
+ "type": "object",
176
+ "required": [
177
+ "githubHost",
178
+ "branchTemplate",
179
+ "branchStrategy"
180
+ ],
181
+ "additionalProperties": false,
182
+ "properties": {
183
+ "githubHost": {
184
+ "type": "string"
185
+ },
186
+ "branchTemplate": {
187
+ "type": "string"
188
+ },
189
+ "releaseTitleTemplate": {
190
+ "type": "string"
191
+ },
192
+ "releaseNotes": {
193
+ "type": "string"
194
+ },
195
+ "branchStrategy": {
196
+ "type": "string",
197
+ "enum": [
198
+ "create-release-branch",
199
+ "advance-existing-branch",
200
+ "initialize-default-branch"
201
+ ]
202
+ },
203
+ "setAsDefaultBranch": {
204
+ "type": "boolean"
205
+ },
206
+ "expectedCurrentDefaultBranch": {
207
+ "type": "string",
208
+ "minLength": 1
209
+ }
210
+ },
211
+ "allOf": [
212
+ {
213
+ "if": {
214
+ "properties": {
215
+ "branchStrategy": {
216
+ "const": "initialize-default-branch"
217
+ }
218
+ },
219
+ "required": [
220
+ "branchStrategy"
221
+ ]
222
+ },
223
+ "then": {
224
+ "required": [
225
+ "setAsDefaultBranch",
226
+ "expectedCurrentDefaultBranch"
227
+ ],
228
+ "properties": {
229
+ "setAsDefaultBranch": {
230
+ "const": true
231
+ }
232
+ }
233
+ }
234
+ },
235
+ {
236
+ "if": {
237
+ "properties": {
238
+ "setAsDefaultBranch": {
239
+ "const": true
240
+ }
241
+ },
242
+ "required": [
243
+ "setAsDefaultBranch"
244
+ ]
245
+ },
246
+ "then": {
247
+ "properties": {
248
+ "branchStrategy": {
249
+ "const": "initialize-default-branch"
250
+ }
251
+ }
252
+ }
253
+ }
254
+ ]
255
+ },
256
+ "frozenSnapshot": {
257
+ "type": "object",
258
+ "required": [
259
+ "path",
260
+ "manifestDigest",
261
+ "gitObjectDir",
262
+ "branch",
263
+ "branchStrategy",
264
+ "commit",
265
+ "tree",
266
+ "commitTimestamp"
267
+ ],
268
+ "additionalProperties": false,
269
+ "properties": {
270
+ "path": {
271
+ "type": "string",
272
+ "minLength": 1
273
+ },
274
+ "manifestDigest": {
275
+ "type": "string",
276
+ "pattern": "^[a-f0-9]{64}$"
277
+ },
278
+ "gitObjectDir": {
279
+ "type": "string",
280
+ "minLength": 1
281
+ },
282
+ "branch": {
283
+ "type": "string",
284
+ "minLength": 1
285
+ },
286
+ "commit": {
287
+ "type": "string",
288
+ "pattern": "^[a-f0-9]{40,64}$"
289
+ },
290
+ "tree": {
291
+ "type": "string",
292
+ "pattern": "^[a-f0-9]{40,64}$"
293
+ },
294
+ "commitTimestamp": {
295
+ "type": "string",
296
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+00:00$",
297
+ "description": "Frozen release commit timestamp in canonical UTC second precision. Written verbatim to GIT_AUTHOR_DATE and GIT_COMMITTER_DATE of the frozen release commit, so it always equals the commit's %aI and %cI byte-for-byte. v1 plans: the freeze timestamp sampled exactly once during production prepare, equal to the plan's createdAt. planVersion 2 plans: derived deterministically from the baseline headCommit's committer date, so identical sources freeze identical commits (not equal to createdAt, which remains the record-layer real clock)."
298
+ },
299
+ "parentCommit": {
300
+ "type": "string",
301
+ "pattern": "^[a-f0-9]{40,64}$"
302
+ },
303
+ "branchStrategy": {
304
+ "type": "string",
305
+ "enum": [
306
+ "create-release-branch",
307
+ "advance-existing-branch",
308
+ "initialize-default-branch"
309
+ ]
310
+ },
311
+ "npm": {
312
+ "anyOf": [
313
+ {
314
+ "type": "null"
315
+ },
316
+ {
317
+ "type": "object",
318
+ "required": [
319
+ "tarballPath",
320
+ "tarballSha256",
321
+ "integrity",
322
+ "size"
323
+ ],
324
+ "additionalProperties": false,
325
+ "properties": {
326
+ "tarballPath": {
327
+ "type": "string",
328
+ "minLength": 1
329
+ },
330
+ "tarballSha256": {
331
+ "type": "string",
332
+ "pattern": "^[a-f0-9]{64}$"
333
+ },
334
+ "integrity": {
335
+ "type": "string",
336
+ "minLength": 1
337
+ },
338
+ "size": {
339
+ "type": "integer",
340
+ "minimum": 1
341
+ }
342
+ }
343
+ }
344
+ ]
345
+ }
346
+ },
347
+ "allOf": [
348
+ {
349
+ "if": {
350
+ "properties": {
351
+ "branchStrategy": {
352
+ "enum": [
353
+ "advance-existing-branch",
354
+ "initialize-default-branch"
355
+ ]
356
+ }
357
+ },
358
+ "required": [
359
+ "branchStrategy"
360
+ ]
361
+ },
362
+ "then": {
363
+ "required": [
364
+ "parentCommit"
365
+ ]
366
+ }
367
+ },
368
+ {
369
+ "if": {
370
+ "properties": {
371
+ "branchStrategy": {
372
+ "const": "create-release-branch"
373
+ }
374
+ },
375
+ "required": [
376
+ "branchStrategy"
377
+ ]
378
+ },
379
+ "then": {
380
+ "not": {
381
+ "required": [
382
+ "parentCommit"
383
+ ]
384
+ }
385
+ }
386
+ }
387
+ ]
388
+ },
389
+ "distributions": {
390
+ "type": "array",
391
+ "items": {
392
+ "type": "object",
393
+ "required": [
394
+ "type"
395
+ ],
396
+ "additionalProperties": false,
397
+ "properties": {
398
+ "type": {
399
+ "type": "string",
400
+ "enum": [
401
+ "npm",
402
+ "claude-plugin",
403
+ "codex-plugin",
404
+ "kimi-plugin",
405
+ "codebuddy-plugin"
406
+ ]
407
+ },
408
+ "package": {
409
+ "type": "string",
410
+ "maxLength": 214,
411
+ "pattern": "^(?:@[a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)$"
412
+ },
413
+ "access": {
414
+ "type": "string",
415
+ "enum": [
416
+ "public",
417
+ "restricted"
418
+ ]
419
+ },
420
+ "provenance": {
421
+ "type": "boolean"
422
+ },
423
+ "tag": {
424
+ "type": "string",
425
+ "minLength": 1
426
+ },
427
+ "registry": {
428
+ "type": "string",
429
+ "minLength": 1,
430
+ "pattern": "^https://[^\\s]+$",
431
+ "description": "Normalized HTTPS URL of the npm registry"
432
+ },
433
+ "publisher": {
434
+ "type": "string",
435
+ "minLength": 1,
436
+ "pattern": "^[a-z0-9][a-z0-9._-]*$",
437
+ "description": "Expected npm whoami username for this registry"
438
+ },
439
+ "plugin": {
440
+ "type": "string",
441
+ "minLength": 1,
442
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
443
+ },
444
+ "marketplace": {
445
+ "type": "string",
446
+ "minLength": 1,
447
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
448
+ },
449
+ "marketplaceSource": {
450
+ "type": "string",
451
+ "minLength": 1,
452
+ "description": "消费者添加统一市场所用的来源 URL(如 codebuddy plugin marketplace add);可选,仅在可知时声明"
453
+ },
454
+ "marketplaceRepo": {
455
+ "type": "string",
456
+ "pattern": "^[a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._-]*$",
457
+ "description": "外部独立市场仓库 owner/name;存在即启用外部市场形态"
458
+ },
459
+ "entrySkill": {
460
+ "type": "string",
461
+ "minLength": 1,
462
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
463
+ },
464
+ "smokeBin": {
465
+ "type": "string",
466
+ "minLength": 1
467
+ },
468
+ "smokeArgs": {
469
+ "type": "array",
470
+ "items": {
471
+ "type": "string"
472
+ }
473
+ },
474
+ "smokeExpectedJson": {
475
+ "type": "object"
476
+ },
477
+ "installationContract": {
478
+ "type": "object",
479
+ "description": "可审计的安装契约规范对象",
480
+ "additionalProperties": false,
481
+ "properties": {
482
+ "algorithmVersion": {
483
+ "type": "integer",
484
+ "minimum": 1
485
+ },
486
+ "distributionType": {
487
+ "type": "string",
488
+ "minLength": 1
489
+ },
490
+ "manifestRelativePath": {
491
+ "type": "string",
492
+ "minLength": 1
493
+ },
494
+ "normalizedManifest": {
495
+ "type": "object"
496
+ },
497
+ "marketplaceSourceType": {
498
+ "type": "string",
499
+ "enum": [
500
+ "bundled-family",
501
+ "standalone-index"
502
+ ]
503
+ },
504
+ "includeMarketplaceEntry": {
505
+ "type": "boolean"
506
+ },
507
+ "marketplaceIndexRelativePath": {
508
+ "type": "string",
509
+ "minLength": 1
510
+ },
511
+ "normalizedSelectedEntry": {
512
+ "type": "object"
513
+ },
514
+ "verificationRecipeVersion": {
515
+ "type": "string",
516
+ "minLength": 1
517
+ }
518
+ },
519
+ "required": [
520
+ "algorithmVersion",
521
+ "distributionType",
522
+ "manifestRelativePath",
523
+ "normalizedManifest",
524
+ "marketplaceSourceType",
525
+ "includeMarketplaceEntry",
526
+ "verificationRecipeVersion"
527
+ ]
528
+ },
529
+ "installationContractDigest": {
530
+ "type": "string",
531
+ "pattern": "^[a-f0-9]{64}$",
532
+ "description": "安装契约摘要,用于在远端状态未变化时跳过重复验证"
533
+ },
534
+ "marketplaceSourceType": {
535
+ "type": "string",
536
+ "enum": [
537
+ "bundled-family",
538
+ "standalone-index"
539
+ ],
540
+ "description": "市场来源类型:bundled-family(技能族自带市场文件)或 standalone-index(独立市场仓库);每个平台每次发布只冻结一种来源"
541
+ },
542
+ "firstReleaseBootstrap": {
543
+ "type": "string",
544
+ "enum": [
545
+ "manual-index-checkpoint"
546
+ ],
547
+ "description": "首次 standalone-index 发布的人工索引停点;仅显式 opt-in 时启用"
548
+ },
549
+ "marketplaceIndexSha": {
550
+ "type": ["string", "null"],
551
+ "pattern": "^[0-9a-f]{40}$",
552
+ "description": "最终市场索引提交 SHA;首次 bootstrap prepare 阶段必须保持 null,verify 仅记录实际观察值"
553
+ },
554
+ "marketplaceCommitSha": {
555
+ "type": "string",
556
+ "pattern": "^[0-9a-f]{40}$",
557
+ "description": "独立市场仓库冻结提交 SHA(standalone-index 专用)"
558
+ },
559
+ "marketplaceRef": {
560
+ "type": "string",
561
+ "minLength": 1,
562
+ "description": "独立市场仓库冻结引用(standalone-index 专用)"
563
+ },
564
+ "marketplaceIndexPath": {
565
+ "type": "string",
566
+ "minLength": 1,
567
+ "description": "独立市场索引相对路径(standalone-index 专用)"
568
+ },
569
+ "marketplaceName": {
570
+ "type": "string",
571
+ "minLength": 1,
572
+ "description": "独立市场名称(standalone-index 专用)"
573
+ },
574
+ "selectedEntry": {
575
+ "type": "object",
576
+ "description": "冻结的唯一选中市场条目(standalone-index 专用)"
577
+ }
578
+ },
579
+ "allOf": [
580
+ {
581
+ "if": {
582
+ "properties": {
583
+ "type": {
584
+ "const": "npm"
585
+ }
586
+ }
587
+ },
588
+ "then": {
589
+ "required": [
590
+ "package",
591
+ "registry",
592
+ "publisher"
593
+ ]
594
+ }
595
+ },
596
+ {
597
+ "if": {
598
+ "properties": {
599
+ "type": {
600
+ "enum": [
601
+ "claude-plugin",
602
+ "codex-plugin"
603
+ ]
604
+ }
605
+ }
606
+ },
607
+ "then": {
608
+ "required": [
609
+ "plugin",
610
+ "marketplace",
611
+ "entrySkill"
612
+ ]
613
+ }
614
+ },
615
+ {
616
+ "if": {
617
+ "properties": {
618
+ "type": {
619
+ "const": "kimi-plugin"
620
+ }
621
+ }
622
+ },
623
+ "then": {
624
+ "required": [
625
+ "plugin",
626
+ "entrySkill"
627
+ ]
628
+ }
629
+ },
630
+ {
631
+ "if": {
632
+ "properties": {
633
+ "type": {
634
+ "const": "codebuddy-plugin"
635
+ }
636
+ }
637
+ },
638
+ "then": {
639
+ "required": [
640
+ "plugin",
641
+ "entrySkill"
642
+ ]
643
+ }
644
+ },
645
+ {
646
+ "if": {
647
+ "properties": {
648
+ "type": {
649
+ "enum": [
650
+ "claude-plugin",
651
+ "codex-plugin",
652
+ "kimi-plugin",
653
+ "codebuddy-plugin"
654
+ ]
655
+ }
656
+ }
657
+ },
658
+ "then": {}
659
+ },
660
+ {
661
+ "if": {
662
+ "properties": {
663
+ "type": {
664
+ "enum": [
665
+ "claude-plugin",
666
+ "codex-plugin",
667
+ "kimi-plugin",
668
+ "codebuddy-plugin"
669
+ ]
670
+ },
671
+ "marketplaceSourceType": {
672
+ "const": "bundled-family"
673
+ }
674
+ },
675
+ "required": [
676
+ "marketplaceSourceType"
677
+ ]
678
+ },
679
+ "then": {
680
+ "not": {
681
+ "required": [
682
+ "marketplaceRepo"
683
+ ]
684
+ }
685
+ }
686
+ },
687
+ {
688
+ "if": {
689
+ "properties": {
690
+ "type": {
691
+ "enum": [
692
+ "claude-plugin",
693
+ "codex-plugin",
694
+ "kimi-plugin",
695
+ "codebuddy-plugin"
696
+ ]
697
+ },
698
+ "marketplaceSourceType": {
699
+ "const": "standalone-index"
700
+ }
701
+ },
702
+ "required": [
703
+ "marketplaceSourceType"
704
+ ]
705
+ },
706
+ "then": {
707
+ "required": [
708
+ "marketplaceRepo"
709
+ ]
710
+ }
711
+ },
712
+ {
713
+ "if": {
714
+ "required": [
715
+ "firstReleaseBootstrap"
716
+ ]
717
+ },
718
+ "then": {
719
+ "required": [
720
+ "marketplaceSourceType",
721
+ "marketplaceRepo"
722
+ ],
723
+ "properties": {
724
+ "type": {
725
+ "enum": [
726
+ "claude-plugin",
727
+ "codex-plugin"
728
+ ]
729
+ },
730
+ "marketplaceSourceType": {
731
+ "const": "standalone-index"
732
+ }
733
+ }
734
+ }
735
+ },
736
+ {
737
+ "if": {
738
+ "required": [
739
+ "smokeExpectedJson"
740
+ ],
741
+ "properties": {
742
+ "smokeBin": {
743
+ "minLength": 1
744
+ }
745
+ }
746
+ },
747
+ "then": {
748
+ "required": [
749
+ "smokeBin"
750
+ ]
751
+ }
752
+ },
753
+ {
754
+ "if": {
755
+ "required": [
756
+ "smokeArgs"
757
+ ],
758
+ "properties": {
759
+ "smokeBin": {
760
+ "minLength": 1
761
+ }
762
+ }
763
+ },
764
+ "then": {
765
+ "required": [
766
+ "smokeBin"
767
+ ]
768
+ }
769
+ }
770
+ ]
771
+ }
772
+ },
773
+ "previousPublicBaseline": {
774
+ "type": "object",
775
+ "required": [
776
+ "mode",
777
+ "status"
778
+ ],
779
+ "additionalProperties": false,
780
+ "properties": {
781
+ "mode": {
782
+ "type": "string",
783
+ "enum": [
784
+ "none",
785
+ "bound"
786
+ ]
787
+ },
788
+ "githubHost": {
789
+ "type": "string"
790
+ },
791
+ "repo": {
792
+ "type": "string"
793
+ },
794
+ "ref": {
795
+ "type": "string"
796
+ },
797
+ "commit": {
798
+ "type": "string"
799
+ },
800
+ "tree": {
801
+ "type": "string"
802
+ },
803
+ "manifestDigest": {
804
+ "type": "string"
805
+ },
806
+ "observedCommit": {
807
+ "type": "string"
808
+ },
809
+ "observedAt": {
810
+ "type": "string",
811
+ "format": "date-time"
812
+ },
813
+ "status": {
814
+ "type": "string",
815
+ "enum": [
816
+ "consistent",
817
+ "drifted",
818
+ "unknown",
819
+ "unobserved-offline",
820
+ "blocking"
821
+ ]
822
+ }
823
+ },
824
+ "if": {
825
+ "properties": {
826
+ "mode": {
827
+ "const": "bound"
828
+ }
829
+ }
830
+ },
831
+ "then": {
832
+ "required": [
833
+ "repo",
834
+ "ref",
835
+ "commit"
836
+ ]
837
+ },
838
+ "else": {
839
+ "allOf": [
840
+ {
841
+ "not": {
842
+ "required": [
843
+ "repo"
844
+ ]
845
+ }
846
+ },
847
+ {
848
+ "not": {
849
+ "required": [
850
+ "githubHost"
851
+ ]
852
+ }
853
+ },
854
+ {
855
+ "not": {
856
+ "required": [
857
+ "ref"
858
+ ]
859
+ }
860
+ },
861
+ {
862
+ "not": {
863
+ "required": [
864
+ "commit"
865
+ ]
866
+ }
867
+ },
868
+ {
869
+ "not": {
870
+ "required": [
871
+ "tree"
872
+ ]
873
+ }
874
+ },
875
+ {
876
+ "not": {
877
+ "required": [
878
+ "manifestDigest"
879
+ ]
880
+ }
881
+ },
882
+ {
883
+ "not": {
884
+ "required": [
885
+ "observedCommit"
886
+ ]
887
+ }
888
+ },
889
+ {
890
+ "not": {
891
+ "required": [
892
+ "observedAt"
893
+ ]
894
+ }
895
+ }
896
+ ]
897
+ }
898
+ }
899
+ }
900
+ }
901
+ },
902
+ "configDigest": {
903
+ "type": "string",
904
+ "minLength": 1,
905
+ "description": "Digest of the project configuration at plan freeze time"
906
+ },
907
+ "skillResourceClosure": {
908
+ "type": "object",
909
+ "description": "Skill resource closure gate receipts from prepare phase (per-unit bound)",
910
+ "additionalProperties": false,
911
+ "properties": {
912
+ "unitReceipts": {
913
+ "type": "array",
914
+ "minItems": 1,
915
+ "items": {
916
+ "type": "object",
917
+ "additionalProperties": false,
918
+ "properties": {
919
+ "unitId": {
920
+ "type": "string",
921
+ "minLength": 1
922
+ },
923
+ "checkerVersion": {
924
+ "type": "string",
925
+ "minLength": 1
926
+ },
927
+ "inputDigest": {
928
+ "type": "string",
929
+ "pattern": "^[a-f0-9]{64}$"
930
+ },
931
+ "surfaceCount": {
932
+ "type": "integer",
933
+ "minimum": 0
934
+ },
935
+ "skillCount": {
936
+ "type": "integer",
937
+ "minimum": 0
938
+ },
939
+ "referenceCount": {
940
+ "type": "integer",
941
+ "minimum": 0
942
+ },
943
+ "sourceOnlyCount": {
944
+ "type": "integer",
945
+ "minimum": 0
946
+ },
947
+ "findingCount": {
948
+ "const": 0
949
+ },
950
+ "preparedAt": {
951
+ "type": ["string", "null"],
952
+ "description": "Deterministic freeze timestamp of the prepare run that produced this receipt (production: the baseline HEAD commit committer date in canonical UTC form; non-production: null). Never a wall-clock sample, so identical sources freeze byte-identical receipts."
953
+ },
954
+ "exitCode": {
955
+ "const": 0
956
+ },
957
+ "receiptDigest": {
958
+ "type": "string",
959
+ "pattern": "^[a-f0-9]{64}$"
960
+ }
961
+ },
962
+ "required": [
963
+ "unitId",
964
+ "checkerVersion",
965
+ "inputDigest",
966
+ "surfaceCount",
967
+ "skillCount",
968
+ "referenceCount",
969
+ "sourceOnlyCount",
970
+ "findingCount",
971
+ "preparedAt",
972
+ "exitCode",
973
+ "receiptDigest"
974
+ ]
975
+ }
976
+ },
977
+ "checkerVersion": {
978
+ "type": "string",
979
+ "minLength": 1
980
+ },
981
+ "totalSkillCount": {
982
+ "type": "integer",
983
+ "minimum": 0
984
+ },
985
+ "totalReferenceCount": {
986
+ "type": "integer",
987
+ "minimum": 0
988
+ },
989
+ "totalSourceOnlyCount": {
990
+ "type": "integer",
991
+ "minimum": 0
992
+ },
993
+ "totalFindingCount": {
994
+ "type": "integer",
995
+ "minimum": 0
996
+ }
997
+ },
998
+ "required": [
999
+ "unitReceipts",
1000
+ "checkerVersion",
1001
+ "totalSkillCount",
1002
+ "totalReferenceCount",
1003
+ "totalSourceOnlyCount",
1004
+ "totalFindingCount"
1005
+ ]
1006
+ },
1007
+ "verificationGates": {
1008
+ "type": "array",
1009
+ "items": {
1010
+ "$ref": "#/definitions/verificationGate"
1011
+ }
1012
+ },
1013
+ "externalActions": {
1014
+ "type": "array",
1015
+ "items": {
1016
+ "type": "object",
1017
+ "required": [
1018
+ "id",
1019
+ "type",
1020
+ "adapter"
1021
+ ],
1022
+ "additionalProperties": false,
1023
+ "properties": {
1024
+ "id": {
1025
+ "type": "string",
1026
+ "minLength": 1
1027
+ },
1028
+ "type": {
1029
+ "type": "string",
1030
+ "enum": [
1031
+ "push-commit",
1032
+ "push-snapshot",
1033
+ "create-tag",
1034
+ "npm-publish",
1035
+ "github-release",
1036
+ "claude-marketplace-install",
1037
+ "codex-marketplace-install",
1038
+ "kimi-marketplace-install",
1039
+ "codebuddy-marketplace-install",
1040
+ "set-default-branch"
1041
+ ]
1042
+ },
1043
+ "adapter": {
1044
+ "type": "string",
1045
+ "minLength": 1
1046
+ },
1047
+ "unitId": {
1048
+ "type": "string"
1049
+ },
1050
+ "parameters": {
1051
+ "type": "object"
1052
+ },
1053
+ "expected": {
1054
+ "type": "object",
1055
+ "description": "Expected observation state for verification"
1056
+ },
1057
+ "status": {
1058
+ "type": "string",
1059
+ "enum": [
1060
+ "PENDING",
1061
+ "SUCCEEDED",
1062
+ "FAILED",
1063
+ "SKIPPED"
1064
+ ],
1065
+ "description": "Action execution status"
1066
+ }
1067
+ }
1068
+ }
1069
+ },
1070
+ "createdAt": {
1071
+ "type": "string",
1072
+ "format": "date-time"
1073
+ },
1074
+ "publishedAt": {
1075
+ "type": "string",
1076
+ "format": "date-time",
1077
+ "description": "ISO 8601 timestamp when the plan was published"
1078
+ },
1079
+ "reconciledAt": {
1080
+ "type": "string",
1081
+ "format": "date-time",
1082
+ "description": "ISO 8601 timestamp when the plan was last reconciled"
1083
+ },
1084
+ "snapshotDigest": {
1085
+ "type": "string",
1086
+ "description": "Overall snapshot digest across all units"
1087
+ },
1088
+ "humanConsumersStrategy": {
1089
+ "type": "string",
1090
+ "enum": [
1091
+ "manualFollowUps",
1092
+ "foundationPayloadThenManualFollowUps"
1093
+ ],
1094
+ "description": "Human consumer strategy marker. 'foundationPayloadThenManualFollowUps': verify first observes the complete frozen plugin through Foundation, then preserves non-blocking Kimi/CodeBuddy marketplace/invocation follow-ups. 'manualFollowUps': legacy 0.8 behavior without the Foundation payload observation. Absent: legacy attestation closed loop."
1095
+ },
1096
+ "workflowKind": {
1097
+ "type": "string",
1098
+ "enum": [
1099
+ "full",
1100
+ "docs",
1101
+ "config",
1102
+ "marketplace"
1103
+ ],
1104
+ "description": "Workflow profile (H5). 'full' runs the complete gate set; 'docs'/'config'/'marketplace' deterministically trim code-class gates (declared hooks, snapshot-verify gates, source-authority closure, skill-resource-closure) and record the trim in workflowDecision. Binding-layer field: included in the plan digest."
1105
+ },
1106
+ "workflowDecision": {
1107
+ "type": "object",
1108
+ "description": "Workflow trim decision bound into the plan digest. Present when workflowKind != 'full'. For config workflows it also reports whether the public bytes are unchanged (no publish path) or changed/indeterminable (publish needed, fail-safe).",
1109
+ "required": [
1110
+ "workflowKind",
1111
+ "decision",
1112
+ "publishPath",
1113
+ "trimmedGates"
1114
+ ],
1115
+ "additionalProperties": false,
1116
+ "properties": {
1117
+ "workflowKind": {
1118
+ "type": "string",
1119
+ "enum": [
1120
+ "docs",
1121
+ "config",
1122
+ "marketplace"
1123
+ ]
1124
+ },
1125
+ "decision": {
1126
+ "type": "string",
1127
+ "enum": [
1128
+ "code-gates-trimmed",
1129
+ "public-bytes-unchanged",
1130
+ "public-bytes-changed",
1131
+ "indeterminable"
1132
+ ]
1133
+ },
1134
+ "publishPath": {
1135
+ "type": "string",
1136
+ "enum": [
1137
+ "publish-needed",
1138
+ "no-publish-needed"
1139
+ ]
1140
+ },
1141
+ "trimmedGates": {
1142
+ "type": "array",
1143
+ "items": {
1144
+ "type": "string",
1145
+ "enum": [
1146
+ "declared-hooks",
1147
+ "snapshot-verify-gates",
1148
+ "source-authority-closure",
1149
+ "skill-resource-closure"
1150
+ ]
1151
+ }
1152
+ },
1153
+ "comparedPlan": {
1154
+ "type": "string",
1155
+ "minLength": 1,
1156
+ "description": "Digest-addressed immutable plan file compared for the config publish-path decision"
1157
+ }
1158
+ }
1159
+ },
1160
+ "postPublish": {
1161
+ "type": [
1162
+ "object",
1163
+ "array"
1164
+ ],
1165
+ "description": "Frozen post-release distribution block. planVersion 1/2: a single declaration object, or absent (normalized to the empty array view at runtime). planVersion 3: a declaration ARRAY, one entry per declaring unit in plan.units order, possibly empty — never a single object, never absent. The exact allowed shape is enforced conditionally on planVersion (root allOf); readers must never guess the shape from the field value."
1166
+ },
1167
+ "digest": {
1168
+ "type": "string",
1169
+ "minLength": 1
1170
+ },
1171
+ "sourceAuthority": {
1172
+ "type": "object",
1173
+ "description": "Source authority content closure gate binding: proves frozen source inputs exist in the workspace remote default branch",
1174
+ "required": [
1175
+ "sourceRepository",
1176
+ "defaultBranch",
1177
+ "entries",
1178
+ "inputDigest",
1179
+ "algorithmVersion"
1180
+ ],
1181
+ "additionalProperties": false,
1182
+ "properties": {
1183
+ "sourceRepository": {
1184
+ "type": "string",
1185
+ "minLength": 1,
1186
+ "pattern": "^[a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+$",
1187
+ "description": "GitHub owner/repo of the workspace source repository"
1188
+ },
1189
+ "defaultBranch": {
1190
+ "type": "string",
1191
+ "minLength": 1,
1192
+ "description": "Workspace remote default branch name"
1193
+ },
1194
+ "entries": {
1195
+ "type": "array",
1196
+ "minItems": 1,
1197
+ "description": "Frozen workspace-relative source inputs compared with the remote default branch",
1198
+ "items": {
1199
+ "type": "object",
1200
+ "required": [
1201
+ "path",
1202
+ "digest",
1203
+ "mode"
1204
+ ],
1205
+ "additionalProperties": false,
1206
+ "properties": {
1207
+ "path": {
1208
+ "type": "string",
1209
+ "minLength": 1,
1210
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$"
1211
+ },
1212
+ "digest": {
1213
+ "type": "string",
1214
+ "pattern": "^[a-f0-9]{64}$"
1215
+ },
1216
+ "mode": {
1217
+ "type": "string",
1218
+ "enum": [
1219
+ "100644",
1220
+ "100755"
1221
+ ]
1222
+ }
1223
+ }
1224
+ }
1225
+ },
1226
+ "inputDigest": {
1227
+ "type": "string",
1228
+ "pattern": "^[a-f0-9]{64}$",
1229
+ "description": "SHA-256 digest of the deterministic source-input closure"
1230
+ },
1231
+ "algorithmVersion": {
1232
+ "type": "integer",
1233
+ "minimum": 1,
1234
+ "description": "Source-input closure algorithm version"
1235
+ }
1236
+ }
1237
+ },
1238
+ "waivers": {
1239
+ "type": "array",
1240
+ "items": {
1241
+ "type": "object",
1242
+ "required": [
1243
+ "rule",
1244
+ "reason",
1245
+ "responsible",
1246
+ "expiresAt"
1247
+ ],
1248
+ "additionalProperties": false,
1249
+ "properties": {
1250
+ "rule": {
1251
+ "type": "string",
1252
+ "minLength": 1
1253
+ },
1254
+ "reason": {
1255
+ "type": "string",
1256
+ "minLength": 1
1257
+ },
1258
+ "responsible": {
1259
+ "type": "string",
1260
+ "minLength": 1
1261
+ },
1262
+ "expiresAt": {
1263
+ "type": "string",
1264
+ "format": "date-time"
1265
+ }
1266
+ }
1267
+ }
1268
+ }
1269
+ },
1270
+ "definitions": {
1271
+ "verificationGate": {
1272
+ "type": "object",
1273
+ "required": [
1274
+ "id",
1275
+ "phase",
1276
+ "scope",
1277
+ "command",
1278
+ "cwd",
1279
+ "timeoutMs",
1280
+ "envAllowlist"
1281
+ ],
1282
+ "additionalProperties": false,
1283
+ "properties": {
1284
+ "id": {
1285
+ "type": "string",
1286
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1287
+ },
1288
+ "phase": {
1289
+ "type": "string",
1290
+ "enum": [
1291
+ "snapshot-verify",
1292
+ "consumer-verify"
1293
+ ]
1294
+ },
1295
+ "scope": {
1296
+ "type": "object",
1297
+ "required": [
1298
+ "unit"
1299
+ ],
1300
+ "additionalProperties": false,
1301
+ "properties": {
1302
+ "unit": {
1303
+ "type": "string",
1304
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$"
1305
+ },
1306
+ "distribution": {
1307
+ "type": "string",
1308
+ "enum": [
1309
+ "npm",
1310
+ "claude-plugin",
1311
+ "codex-plugin",
1312
+ "kimi-plugin",
1313
+ "codebuddy-plugin"
1314
+ ]
1315
+ }
1316
+ }
1317
+ },
1318
+ "command": {
1319
+ "type": "array",
1320
+ "minItems": 1,
1321
+ "items": {
1322
+ "type": "string"
1323
+ }
1324
+ },
1325
+ "cwd": {
1326
+ "type": "string",
1327
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
1328
+ },
1329
+ "timeoutMs": {
1330
+ "type": "integer",
1331
+ "minimum": 1000,
1332
+ "maximum": 7200000
1333
+ },
1334
+ "envAllowlist": {
1335
+ "type": "array",
1336
+ "items": {
1337
+ "type": "string",
1338
+ "pattern": "^[A-Z_][A-Z0-9_]*$"
1339
+ },
1340
+ "uniqueItems": true
1341
+ },
1342
+ "expectedJson": {
1343
+ "type": "object"
1344
+ }
1345
+ },
1346
+ "allOf": [
1347
+ {
1348
+ "if": {
1349
+ "properties": {
1350
+ "phase": {
1351
+ "const": "consumer-verify"
1352
+ }
1353
+ },
1354
+ "required": [
1355
+ "phase"
1356
+ ]
1357
+ },
1358
+ "then": {
1359
+ "properties": {
1360
+ "scope": {
1361
+ "required": [
1362
+ "unit",
1363
+ "distribution"
1364
+ ]
1365
+ }
1366
+ }
1367
+ }
1368
+ },
1369
+ {
1370
+ "if": {
1371
+ "properties": {
1372
+ "phase": {
1373
+ "const": "snapshot-verify"
1374
+ }
1375
+ },
1376
+ "required": [
1377
+ "phase"
1378
+ ]
1379
+ },
1380
+ "then": {
1381
+ "properties": {
1382
+ "scope": {
1383
+ "not": {
1384
+ "required": [
1385
+ "distribution"
1386
+ ]
1387
+ }
1388
+ }
1389
+ }
1390
+ }
1391
+ }
1392
+ ]
1393
+ },
1394
+ "planPostPublish": {
1395
+ "type": "object",
1396
+ "description": "冻结的发布后分发块:声明本身 + tag/tagCommit/unitId/payloadSource 绑定。整体参与 plan digest(planVersion 2 记录层剥离不包含该块),任何配置变更都会改变 planDigest。tagCommit 仅在 prepare 能冻结 create-tag 预期 commit 时存在(production 资产);缺省时 distribute fail-closed。materialize 钩子自 T6 起可选:载荷物化要么由消费者 materialize 钩子完成,要么由冻结 executionBundle.publicFiles 经 Foundation Engineering Kit 托管投影完成(两者至少其一,见 anyOf)。",
1397
+ "required": [
1398
+ "commitIdentity",
1399
+ "tag",
1400
+ "unitId",
1401
+ "payloadSource"
1402
+ ],
1403
+ "additionalProperties": false,
1404
+ "properties": {
1405
+ "materialize": {
1406
+ "$ref": "#/definitions/planPostPublishMaterialize"
1407
+ },
1408
+ "targets": {
1409
+ "type": "array",
1410
+ "minItems": 1,
1411
+ "items": {
1412
+ "$ref": "#/definitions/planPostPublishTarget"
1413
+ }
1414
+ },
1415
+ "hooks": {
1416
+ "type": "array",
1417
+ "description": "冻结的发布后钩子声明(v0.6.3 R1);随整块参与 plan digest",
1418
+ "items": {
1419
+ "$ref": "#/definitions/planPostPublishHook"
1420
+ }
1421
+ },
1422
+ "commitIdentity": {
1423
+ "type": "object",
1424
+ "required": [
1425
+ "name",
1426
+ "email"
1427
+ ],
1428
+ "additionalProperties": false,
1429
+ "properties": {
1430
+ "name": {
1431
+ "type": "string",
1432
+ "minLength": 1
1433
+ },
1434
+ "email": {
1435
+ "type": "string",
1436
+ "minLength": 1
1437
+ }
1438
+ }
1439
+ },
1440
+ "steps": {
1441
+ "type": "array",
1442
+ "items": {
1443
+ "$ref": "#/definitions/planPostPublishStep"
1444
+ }
1445
+ },
1446
+ "assertMainVersionAhead": {
1447
+ "type": "boolean"
1448
+ },
1449
+ "tag": {
1450
+ "type": "string",
1451
+ "minLength": 1,
1452
+ "description": "冻结的分发 tag(tagTemplate 以 targetVersion 渲染)"
1453
+ },
1454
+ "tagCommit": {
1455
+ "type": "string",
1456
+ "pattern": "^[a-f0-9]{40}$",
1457
+ "description": "create-tag 预期 commit(production prepare 冻结);distribute 以 git rev-parse --verify <tag>^{commit} 校验相等"
1458
+ },
1459
+ "unitId": {
1460
+ "type": "string",
1461
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$",
1462
+ "description": "声明该 postPublish 的发布单元 id"
1463
+ },
1464
+ "payloadSource": {
1465
+ "const": "tag-worktree",
1466
+ "description": "时序契约:载荷只能来自 tagCommit 处的 detached worktree,绝不读取工作区状态"
1467
+ },
1468
+ "localHostUpdate": {
1469
+ "$ref": "#/definitions/planLocalHostUpdate"
1470
+ },
1471
+ "executionBundle": {
1472
+ "type": "object",
1473
+ "description": "冻结的私有执行包(F-01/T1):closure 直接采用 Foundation computeResourceClosure() 的返回(排序、去重、受收容读取与摘要均由 Foundation 完成),publicFiles 是从发布单元投影的公开映射。计划是该执行包的唯一事实源:随整个 plan digest 绑定,不维护平行 manifest,也不另造 bundle digest。字节写入计划权威 .release-skill 的 postpublish-bundles/<closure.digest>/<resource.path>;distribute/postVerify 在任何 hook/外部写之前经 Foundation 严格复验并重算闭包,任何不一致即失败。",
1474
+ "required": [
1475
+ "foundationMechanism",
1476
+ "closure",
1477
+ "publicFiles"
1478
+ ],
1479
+ "additionalProperties": false,
1480
+ "properties": {
1481
+ "foundationMechanism": {
1482
+ "const": "foundation.harness.resource-closure"
1483
+ },
1484
+ "closure": {
1485
+ "type": "object",
1486
+ "description": "Foundation skill-family.resource-closure(schemaVersion 1)原样冻结",
1487
+ "required": [
1488
+ "schemaVersion",
1489
+ "kind",
1490
+ "digestAlgorithm",
1491
+ "digest",
1492
+ "resources"
1493
+ ],
1494
+ "additionalProperties": false,
1495
+ "properties": {
1496
+ "schemaVersion": {
1497
+ "const": 1
1498
+ },
1499
+ "kind": {
1500
+ "const": "skill-family.resource-closure"
1501
+ },
1502
+ "digestAlgorithm": {
1503
+ "const": "sha256"
1504
+ },
1505
+ "digest": {
1506
+ "type": "string",
1507
+ "pattern": "^[a-f0-9]{64}$"
1508
+ },
1509
+ "resources": {
1510
+ "type": "array",
1511
+ "items": {
1512
+ "type": "object",
1513
+ "required": [
1514
+ "path",
1515
+ "role",
1516
+ "exists",
1517
+ "sha256"
1518
+ ],
1519
+ "additionalProperties": false,
1520
+ "properties": {
1521
+ "path": {
1522
+ "type": "string",
1523
+ "minLength": 1,
1524
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$"
1525
+ },
1526
+ "role": {
1527
+ "const": "input",
1528
+ "description": "私有执行输入只有 input 资源;output 角色不属于执行包"
1529
+ },
1530
+ "exists": {
1531
+ "const": true
1532
+ },
1533
+ "sha256": {
1534
+ "type": "string",
1535
+ "pattern": "^[a-f0-9]{64}$"
1536
+ }
1537
+ }
1538
+ }
1539
+ }
1540
+ }
1541
+ },
1542
+ "publicFiles": {
1543
+ "type": "array",
1544
+ "description": "从已通过 schema 与运行时校验的发布单元投影进冻结计划的公开映射(T6 托管投影输入)",
1545
+ "items": {
1546
+ "type": "object",
1547
+ "required": [
1548
+ "from",
1549
+ "to",
1550
+ "mode"
1551
+ ],
1552
+ "additionalProperties": false,
1553
+ "properties": {
1554
+ "sourceScope": {
1555
+ "type": "string",
1556
+ "enum": [
1557
+ "unit",
1558
+ "workspace"
1559
+ ]
1560
+ },
1561
+ "from": {
1562
+ "type": "string",
1563
+ "minLength": 1,
1564
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
1565
+ },
1566
+ "to": {
1567
+ "type": "string",
1568
+ "minLength": 1,
1569
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
1570
+ },
1571
+ "mode": {
1572
+ "type": "string",
1573
+ "enum": [
1574
+ "preserve"
1575
+ ]
1576
+ }
1577
+ }
1578
+ }
1579
+ }
1580
+ }
1581
+ }
1582
+ },
1583
+ "anyOf": [
1584
+ {
1585
+ "required": [
1586
+ "materialize"
1587
+ ]
1588
+ },
1589
+ {
1590
+ "description": "无 materialize 钩子时,冻结的 executionBundle.publicFiles 必须非空:载荷由 Foundation 托管投影物化(F-06/T6)",
1591
+ "required": [
1592
+ "executionBundle"
1593
+ ],
1594
+ "properties": {
1595
+ "executionBundle": {
1596
+ "properties": {
1597
+ "publicFiles": {
1598
+ "minItems": 1
1599
+ }
1600
+ }
1601
+ }
1602
+ }
1603
+ }
1604
+ ],
1605
+ "allOf": [{
1606
+ "if": { "required": ["localHostUpdate"] },
1607
+ "then": {
1608
+ "required": ["hooks"],
1609
+ "properties": {
1610
+ "hooks": {
1611
+ "contains": { "type": "object", "required": ["phase"], "properties": { "phase": { "const": "postVerify" } } }
1612
+ }
1613
+ }
1614
+ }
1615
+ }]
1616
+ },
1617
+ "planLocalHostUpdate": {
1618
+ "type": "object",
1619
+ "additionalProperties": false,
1620
+ "required": ["plugin", "hosts", "hub"],
1621
+ "properties": {
1622
+ "plugin": { "type": "string", "minLength": 1, "pattern": ".*\\S.*" },
1623
+ "hosts": {
1624
+ "type": "array",
1625
+ "minItems": 1,
1626
+ "uniqueItems": true,
1627
+ "items": { "type": "string", "enum": ["claude", "codex", "kimi", "codebuddy", "workbuddy", "qoder"] }
1628
+ },
1629
+ "hub": { "$ref": "#/definitions/planLocalHostHub" }
1630
+ }
1631
+ },
1632
+ "planLocalHostHub": {
1633
+ "type": "object",
1634
+ "additionalProperties": false,
1635
+ "required": ["name", "repo", "ref"],
1636
+ "properties": {
1637
+ "name": { "type": "string", "minLength": 1, "pattern": ".*\\S.*" },
1638
+ "githubHost": { "type": "string", "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?$" },
1639
+ "repo": { "type": "string", "pattern": "^[A-Za-z0-9._-]+\\/[A-Za-z0-9._-]+$" },
1640
+ "ref": { "type": "string", "pattern": "^refs\\/heads\\/[A-Za-z0-9][A-Za-z0-9._-]*(?:\\/[A-Za-z0-9][A-Za-z0-9._-]*)*$" }
1641
+ }
1642
+ },
1643
+ "planPostPublishHook": {
1644
+ "type": "object",
1645
+ "description": "冻结的发布后钩子声明项(v0.6.3 R1):preset 与 command 运行时互斥;phase 缺省 distribute;blocksVerified 缺省 true 且仅 preset 可声明 false",
1646
+ "required": [
1647
+ "id"
1648
+ ],
1649
+ "additionalProperties": false,
1650
+ "properties": {
1651
+ "id": {
1652
+ "type": "string",
1653
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1654
+ },
1655
+ "preset": {
1656
+ "type": "string",
1657
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1658
+ },
1659
+ "command": {
1660
+ "type": "array",
1661
+ "minItems": 1,
1662
+ "items": {
1663
+ "type": "string"
1664
+ }
1665
+ },
1666
+ "phase": {
1667
+ "type": "string",
1668
+ "enum": [
1669
+ "distribute",
1670
+ "postVerify"
1671
+ ]
1672
+ },
1673
+ "config": {
1674
+ "type": "object"
1675
+ },
1676
+ "cwd": {
1677
+ "type": "string",
1678
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
1679
+ },
1680
+ "timeoutMs": {
1681
+ "type": "integer",
1682
+ "minimum": 1000,
1683
+ "maximum": 7200000
1684
+ },
1685
+ "envAllowlist": {
1686
+ "type": "array",
1687
+ "items": {
1688
+ "type": "string",
1689
+ "pattern": "^(?!.*(?:TOKEN|SECRET|PASSWORD|PASSPHRASE|API_KEY|CREDENTIAL))[A-Z_][A-Z0-9_]*$"
1690
+ },
1691
+ "uniqueItems": true
1692
+ },
1693
+ "requiresApproval": {
1694
+ "type": "boolean"
1695
+ },
1696
+ "blocksVerified": {
1697
+ "type": "boolean"
1698
+ }
1699
+ }
1700
+ },
1701
+ "planPostPublishMaterialize": {
1702
+ "type": "object",
1703
+ "required": [
1704
+ "command",
1705
+ "outputMarker"
1706
+ ],
1707
+ "additionalProperties": false,
1708
+ "properties": {
1709
+ "command": {
1710
+ "type": "array",
1711
+ "minItems": 1,
1712
+ "items": {
1713
+ "type": "string"
1714
+ }
1715
+ },
1716
+ "cwd": {
1717
+ "type": "string",
1718
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
1719
+ },
1720
+ "timeoutMs": {
1721
+ "type": "integer",
1722
+ "minimum": 1000,
1723
+ "maximum": 7200000
1724
+ },
1725
+ "envAllowlist": {
1726
+ "type": "array",
1727
+ "items": {
1728
+ "type": "string",
1729
+ "pattern": "^(?!.*(?:TOKEN|SECRET|PASSWORD|PASSPHRASE|API_KEY|CREDENTIAL))[A-Z_][A-Z0-9_]*$"
1730
+ },
1731
+ "uniqueItems": true
1732
+ },
1733
+ "outputMarker": {
1734
+ "type": "string",
1735
+ "minLength": 1
1736
+ },
1737
+ "requireReport": {
1738
+ "type": "object",
1739
+ "required": [
1740
+ "parse"
1741
+ ],
1742
+ "additionalProperties": false,
1743
+ "properties": {
1744
+ "parse": {
1745
+ "const": "stdout-first-json"
1746
+ },
1747
+ "equals": {
1748
+ "type": "object"
1749
+ }
1750
+ }
1751
+ }
1752
+ }
1753
+ },
1754
+ "planPostPublishStep": {
1755
+ "type": "object",
1756
+ "required": [
1757
+ "name",
1758
+ "command"
1759
+ ],
1760
+ "additionalProperties": false,
1761
+ "properties": {
1762
+ "name": {
1763
+ "type": "string",
1764
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1765
+ },
1766
+ "command": {
1767
+ "type": "array",
1768
+ "minItems": 1,
1769
+ "items": {
1770
+ "type": "string"
1771
+ }
1772
+ },
1773
+ "cwd": {
1774
+ "type": "string",
1775
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
1776
+ },
1777
+ "timeoutMs": {
1778
+ "type": "integer",
1779
+ "minimum": 1000,
1780
+ "maximum": 7200000
1781
+ },
1782
+ "envAllowlist": {
1783
+ "type": "array",
1784
+ "items": {
1785
+ "type": "string",
1786
+ "pattern": "^(?!.*(?:TOKEN|SECRET|PASSWORD|PASSPHRASE|API_KEY|CREDENTIAL))[A-Z_][A-Z0-9_]*$"
1787
+ },
1788
+ "uniqueItems": true
1789
+ }
1790
+ }
1791
+ },
1792
+ "planPostPublishTarget": {
1793
+ "type": "object",
1794
+ "required": [
1795
+ "id",
1796
+ "kind",
1797
+ "remoteUrl",
1798
+ "visibility",
1799
+ "branch"
1800
+ ],
1801
+ "additionalProperties": false,
1802
+ "properties": {
1803
+ "id": {
1804
+ "type": "string",
1805
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1806
+ },
1807
+ "kind": {
1808
+ "type": "string",
1809
+ "enum": [
1810
+ "payload-mirror",
1811
+ "marketplace-index"
1812
+ ]
1813
+ },
1814
+ "remoteUrl": {
1815
+ "type": "string",
1816
+ "pattern": "^(?:https?|file)://[^@]+\\.git$"
1817
+ },
1818
+ "visibility": {
1819
+ "type": "string",
1820
+ "enum": [
1821
+ "internal",
1822
+ "public"
1823
+ ]
1824
+ },
1825
+ "branch": {
1826
+ "type": "string",
1827
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._/-]*$"
1828
+ },
1829
+ "dependsOn": {
1830
+ "type": "string",
1831
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1832
+ },
1833
+ "marketplace": {
1834
+ "type": "object",
1835
+ "required": [
1836
+ "form",
1837
+ "name",
1838
+ "owner"
1839
+ ],
1840
+ "additionalProperties": false,
1841
+ "properties": {
1842
+ "form": {
1843
+ "type": "string",
1844
+ "enum": [
1845
+ "github",
1846
+ "url"
1847
+ ]
1848
+ },
1849
+ "name": {
1850
+ "type": "string",
1851
+ "minLength": 1
1852
+ },
1853
+ "owner": {
1854
+ "type": "string",
1855
+ "minLength": 1
1856
+ },
1857
+ "sourceRepo": {
1858
+ "type": "string",
1859
+ "pattern": "^[a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+$"
1860
+ }
1861
+ }
1862
+ },
1863
+ "staticFiles": {
1864
+ "type": "array",
1865
+ "items": {
1866
+ "type": "object",
1867
+ "required": [
1868
+ "from",
1869
+ "to"
1870
+ ],
1871
+ "additionalProperties": false,
1872
+ "properties": {
1873
+ "from": {
1874
+ "type": "string",
1875
+ "minLength": 1,
1876
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
1877
+ },
1878
+ "to": {
1879
+ "type": "string",
1880
+ "minLength": 1,
1881
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
1882
+ }
1883
+ }
1884
+ }
1885
+ }
1886
+ },
1887
+ "allOf": [
1888
+ {
1889
+ "if": {
1890
+ "properties": {
1891
+ "kind": {
1892
+ "const": "marketplace-index"
1893
+ }
1894
+ },
1895
+ "required": [
1896
+ "kind"
1897
+ ]
1898
+ },
1899
+ "then": {
1900
+ "required": [
1901
+ "marketplace"
1902
+ ]
1903
+ }
1904
+ },
1905
+ {
1906
+ "if": {
1907
+ "properties": {
1908
+ "kind": {
1909
+ "const": "payload-mirror"
1910
+ }
1911
+ },
1912
+ "required": [
1913
+ "kind"
1914
+ ]
1915
+ },
1916
+ "then": {
1917
+ "not": {
1918
+ "required": [
1919
+ "marketplace"
1920
+ ]
1921
+ }
1922
+ }
1923
+ }
1924
+ ]
1925
+ }
1926
+ },
1927
+ "allOf": [
1928
+ {
1929
+ "if": {
1930
+ "properties": {
1931
+ "planVersion": {
1932
+ "const": 3
1933
+ }
1934
+ },
1935
+ "required": [
1936
+ "planVersion"
1937
+ ]
1938
+ },
1939
+ "then": {
1940
+ "properties": {
1941
+ "postPublish": {
1942
+ "type": "array",
1943
+ "items": {
1944
+ "$ref": "#/definitions/planPostPublish"
1945
+ }
1946
+ }
1947
+ },
1948
+ "required": [
1949
+ "postPublish"
1950
+ ]
1951
+ },
1952
+ "else": {
1953
+ "properties": {
1954
+ "postPublish": {
1955
+ "$ref": "#/definitions/planPostPublish"
1956
+ }
1957
+ }
1958
+ }
1959
+ },
1960
+ {
1961
+ "if": {
1962
+ "properties": {
1963
+ "workflowDecision": {
1964
+ "properties": {
1965
+ "decision": {
1966
+ "const": "public-bytes-unchanged"
1967
+ }
1968
+ },
1969
+ "required": [
1970
+ "decision"
1971
+ ]
1972
+ }
1973
+ },
1974
+ "required": [
1975
+ "workflowDecision"
1976
+ ]
1977
+ },
1978
+ "then": {
1979
+ "properties": {
1980
+ "externalActions": {
1981
+ "type": "array",
1982
+ "minItems": 0
1983
+ }
1984
+ }
1985
+ },
1986
+ "else": {
1987
+ "properties": {
1988
+ "externalActions": {
1989
+ "type": "array",
1990
+ "minItems": 1
1991
+ }
1992
+ }
1993
+ }
1994
+ }
1995
+ ]
1996
+ }