@tacuchi/agent-workflow-cli 20.26.0 → 21.0.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 (110) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/node-file-system.js +3 -0
  3. package/dist/adapters/node-file-system.js.map +1 -1
  4. package/dist/application/design/design-gate-service.js +246 -0
  5. package/dist/application/design/design-gate-service.js.map +1 -0
  6. package/dist/application/design/design-graph-service.js +85 -0
  7. package/dist/application/design/design-graph-service.js.map +1 -0
  8. package/dist/application/design/design-index-service.js +132 -0
  9. package/dist/application/design/design-index-service.js.map +1 -0
  10. package/dist/application/design/design-publish-service.js +488 -0
  11. package/dist/application/design/design-publish-service.js.map +1 -0
  12. package/dist/application/design/design-resolver-service.js +165 -0
  13. package/dist/application/design/design-resolver-service.js.map +1 -0
  14. package/dist/application/resume-service.js +23 -4
  15. package/dist/application/resume-service.js.map +1 -1
  16. package/dist/application/semantic-operation/protocol.js +18 -12
  17. package/dist/application/semantic-operation/protocol.js.map +1 -1
  18. package/dist/application/semantic-operation/publish.js +56 -9
  19. package/dist/application/semantic-operation/publish.js.map +1 -1
  20. package/dist/application/skills-resolver-service.js +19 -4
  21. package/dist/application/skills-resolver-service.js.map +1 -1
  22. package/dist/application/status-service.js +1 -0
  23. package/dist/application/status-service.js.map +1 -1
  24. package/dist/application/workline-index-service.js +6 -0
  25. package/dist/application/workline-index-service.js.map +1 -1
  26. package/dist/application/workspace-init-service.js +9 -1
  27. package/dist/application/workspace-init-service.js.map +1 -1
  28. package/dist/cli/commands/designs.js +110 -0
  29. package/dist/cli/commands/designs.js.map +1 -0
  30. package/dist/cli/commands/index.js +2 -0
  31. package/dist/cli/commands/index.js.map +1 -1
  32. package/dist/cli/commands/resume.js +8 -0
  33. package/dist/cli/commands/resume.js.map +1 -1
  34. package/dist/cli/commands/status.js +45 -0
  35. package/dist/cli/commands/status.js.map +1 -1
  36. package/dist/cli/help-groups.js +3 -0
  37. package/dist/cli/help-groups.js.map +1 -1
  38. package/dist/cli/parser.js +1 -0
  39. package/dist/cli/parser.js.map +1 -1
  40. package/dist/domain/design/artifact-body.js +223 -0
  41. package/dist/domain/design/artifact-body.js.map +1 -0
  42. package/dist/domain/design/artifact.js +606 -0
  43. package/dist/domain/design/artifact.js.map +1 -0
  44. package/dist/domain/design/baseline.js +359 -0
  45. package/dist/domain/design/baseline.js.map +1 -0
  46. package/dist/domain/design/capability.js +51 -0
  47. package/dist/domain/design/capability.js.map +1 -0
  48. package/dist/domain/design/closure.js +161 -0
  49. package/dist/domain/design/closure.js.map +1 -0
  50. package/dist/domain/design/governance.js +298 -0
  51. package/dist/domain/design/governance.js.map +1 -0
  52. package/dist/domain/design/identity.js +145 -0
  53. package/dist/domain/design/identity.js.map +1 -0
  54. package/dist/domain/design/manifest.js +552 -0
  55. package/dist/domain/design/manifest.js.map +1 -0
  56. package/dist/domain/design/maturity.js +234 -0
  57. package/dist/domain/design/maturity.js.map +1 -0
  58. package/dist/domain/design/naming.js +117 -0
  59. package/dist/domain/design/naming.js.map +1 -0
  60. package/dist/domain/design/projections.js +165 -0
  61. package/dist/domain/design/projections.js.map +1 -0
  62. package/dist/domain/design/reference.js +234 -0
  63. package/dist/domain/design/reference.js.map +1 -0
  64. package/dist/domain/design/retired.js +61 -0
  65. package/dist/domain/design/retired.js.map +1 -0
  66. package/dist/domain/design/revision.js +219 -0
  67. package/dist/domain/design/revision.js.map +1 -0
  68. package/dist/domain/design/secrets.js +86 -0
  69. package/dist/domain/design/secrets.js.map +1 -0
  70. package/dist/domain/design/validation.js +75 -0
  71. package/dist/domain/design/validation.js.map +1 -0
  72. package/dist/domain/design/yaml-subset.js +390 -0
  73. package/dist/domain/design/yaml-subset.js.map +1 -0
  74. package/dist/domain/safe-path.js +23 -0
  75. package/dist/domain/safe-path.js.map +1 -0
  76. package/dist/domain/skills.js +27 -3
  77. package/dist/domain/skills.js.map +1 -1
  78. package/package.json +1 -1
  79. package/skills/w/SKILL.md +10 -8
  80. package/skills/w/artifacts/README.md +3 -4
  81. package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +2 -2
  82. package/skills/w/commands/plan-exec.md +11 -5
  83. package/skills/w/commands/plan-new.md +6 -2
  84. package/skills/w/commands/plan-refine.md +6 -3
  85. package/skills/w/commands/quick.md +2 -2
  86. package/skills/w/commands/spec-new.md +2 -2
  87. package/skills/w/commands/spec-refine.md +1 -0
  88. package/skills/w/context/MANIFEST.json +19 -8
  89. package/skills/w/loops/CHASSIS.md +2 -2
  90. package/skills/w/loops/CODE-POLICIES.md +22 -7
  91. package/skills/w/loops/README.md +1 -1
  92. package/skills/w/loops/plan-exec-loop/LOOP.md +127 -61
  93. package/skills/w/loops/plan-new-loop/LOOP.md +66 -70
  94. package/skills/w/loops/plan-refine-loop/LOOP.md +15 -7
  95. package/skills/w/loops/spec-refine-loop/LOOP.md +14 -12
  96. package/skills/w/modules/DESIGN-REFERENCES.md +109 -0
  97. package/skills/w/modules/PERSIST-ROUTING.md +1 -0
  98. package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +84 -0
  99. package/skills/w/roles/README.md +7 -5
  100. package/skills/w/roles/design/ROLE.md +217 -0
  101. package/skills/w/schemas/design/design-baseline.v1.schema.json +71 -0
  102. package/skills/w/schemas/design/design-manifest.v1.schema.json +322 -0
  103. package/skills/w/schemas/design/design-review.v1.schema.json +72 -0
  104. package/skills/w/schemas/design/design-revocation.v1.schema.json +54 -0
  105. package/skills/w/schemas/design/ui-flow.v1.schema.json +211 -0
  106. package/skills/w/schemas/design/ui-screen.v1.schema.json +214 -0
  107. package/skills/w/artifacts/artifacts-design/SPEC.md +0 -42
  108. package/skills/w/modules/PLAN-DESIGN-SPECS.md +0 -12
  109. package/skills/w/modules/PLAN-REFINE-DESIGN-SPECS.md +0 -7
  110. package/skills/w/roles/ui-spec/ROLE.md +0 -147
@@ -0,0 +1,71 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://workline.dev/schemas/design/design-baseline.v1.schema.json",
4
+ "title": "Workline UI Design Package v1 — baseline",
5
+ "description": "Immutable authority of one published revision: the closed selection of normative files with their revision and the SHA-256 of their bytes, sealed by a digest over canonical JSON WITHOUT the digest field. The mutable manifest, the governance records and the regenerable projections are excluded by construction, so re-indexing or re-rendering can never alter a revision published months ago.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "package",
11
+ "revision",
12
+ "parent_baseline",
13
+ "published",
14
+ "digest",
15
+ "selection"
16
+ ],
17
+ "properties": {
18
+ "schema": {
19
+ "const": "workline.design-baseline/v1"
20
+ },
21
+ "package": {
22
+ "type": "string",
23
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})$"
24
+ },
25
+ "revision": {
26
+ "type": "integer",
27
+ "minimum": 1
28
+ },
29
+ "parent_baseline": {
30
+ "description": "The previous revision of THIS package, or null for the first. A line never forks: an intentional divergence creates another package with `derived_from`.",
31
+ "type": ["string", "null"],
32
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
33
+ },
34
+ "published": {
35
+ "type": "string",
36
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
37
+ },
38
+ "digest": {
39
+ "description": "SHA-256 over canonical JSON of this document WITHOUT this field. No self-reference, so anyone can recompute and compare.",
40
+ "type": "string",
41
+ "pattern": "^sha256:[0-9a-f]{64}$"
42
+ },
43
+ "selection": {
44
+ "description": "The closed set of normative files this revision publishes together. Never empty: a published revision publishes something.",
45
+ "type": "array",
46
+ "items": {
47
+ "type": "object",
48
+ "additionalProperties": false,
49
+ "required": ["path", "revision", "sha256"],
50
+ "properties": {
51
+ "path": {
52
+ "description": "Package-relative path under flows/, screens/, design-system/rules/, tokens/, renditions/ or assets/.",
53
+ "type": "string",
54
+ "minLength": 1
55
+ },
56
+ "revision": {
57
+ "description": "The revision the file's own name carries; null for a content-addressed asset.",
58
+ "type": ["integer", "null"],
59
+ "minimum": 1
60
+ },
61
+ "sha256": {
62
+ "description": "Digest of the file's BYTES, not of a projection of them.",
63
+ "type": "string",
64
+ "pattern": "^sha256:[0-9a-f]{64}$"
65
+ }
66
+ }
67
+ },
68
+ "minItems": 1
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,322 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://workline.dev/schemas/design/design-manifest.v1.schema.json",
4
+ "title": "Workline UI Design Package v1 — design manifest",
5
+ "description": "Mutable discovery index of a UI Design Package. Owns nothing normative: it declares identity, where the artifacts live, which baseline is current and who consumes the package. A baseline digest excludes this file, so re-indexing never rewrites a published revision.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "id",
11
+ "title",
12
+ "created",
13
+ "derived_from",
14
+ "current_baseline",
15
+ "baselines",
16
+ "catalog",
17
+ "currentness",
18
+ "governance",
19
+ "relations"
20
+ ],
21
+ "properties": {
22
+ "schema": {
23
+ "description": "Format version. An unknown value stops validation before any field is read.",
24
+ "const": "workline.design-manifest/v1"
25
+ },
26
+ "id": {
27
+ "description": "Package identity. Derives from nothing — not a spec, plan, session, slug, path or provider — and survives every rename or move.",
28
+ "type": "string",
29
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})$"
30
+ },
31
+ "title": {
32
+ "description": "Human name of the package.",
33
+ "type": "string",
34
+ "minLength": 1
35
+ },
36
+ "created": {
37
+ "type": "string",
38
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
39
+ },
40
+ "derived_from": {
41
+ "description": "Baseline of the package this one forked from. An intentional divergence creates another package instead of a second live baseline line.",
42
+ "type": ["string", "null"],
43
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
44
+ },
45
+ "current_baseline": {
46
+ "description": "The published baseline in force. Null until the first publication. Must match its entry in `baselines`.",
47
+ "type": ["object", "null"],
48
+ "additionalProperties": false,
49
+ "required": ["revision", "path", "digest"],
50
+ "properties": {
51
+ "revision": {
52
+ "type": "integer",
53
+ "minimum": 1
54
+ },
55
+ "path": {
56
+ "$ref": "#/$defs/packagePath"
57
+ },
58
+ "digest": {
59
+ "$ref": "#/$defs/digest"
60
+ }
61
+ }
62
+ },
63
+ "baselines": {
64
+ "description": "The package's baseline line, chained by `parent_baseline`.",
65
+ "type": "array",
66
+ "items": {
67
+ "type": "object",
68
+ "additionalProperties": false,
69
+ "required": ["revision", "path", "digest", "parent_baseline", "published"],
70
+ "properties": {
71
+ "revision": {
72
+ "type": "integer",
73
+ "minimum": 1
74
+ },
75
+ "path": {
76
+ "$ref": "#/$defs/packagePath"
77
+ },
78
+ "digest": {
79
+ "$ref": "#/$defs/digest"
80
+ },
81
+ "parent_baseline": {
82
+ "type": ["string", "null"],
83
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
84
+ },
85
+ "published": {
86
+ "type": "string",
87
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
88
+ }
89
+ }
90
+ }
91
+ },
92
+ "catalog": {
93
+ "description": "Every revision the package holds. Flows and screens carry maturity; rules, tokens and renditions do not; assets are content-addressed and have no ID.",
94
+ "type": "object",
95
+ "additionalProperties": false,
96
+ "required": ["flows", "screens", "rules", "tokens", "renditions", "assets"],
97
+ "properties": {
98
+ "flows": {
99
+ "type": "array",
100
+ "items": {
101
+ "$ref": "#/$defs/maturedArtifact"
102
+ }
103
+ },
104
+ "screens": {
105
+ "type": "array",
106
+ "items": {
107
+ "$ref": "#/$defs/screenArtifact"
108
+ }
109
+ },
110
+ "rules": {
111
+ "type": "array",
112
+ "items": {
113
+ "$ref": "#/$defs/revisionedArtifact"
114
+ }
115
+ },
116
+ "tokens": {
117
+ "type": "array",
118
+ "items": {
119
+ "$ref": "#/$defs/revisionedArtifact"
120
+ }
121
+ },
122
+ "renditions": {
123
+ "type": "array",
124
+ "items": {
125
+ "$ref": "#/$defs/revisionedArtifact"
126
+ }
127
+ },
128
+ "assets": {
129
+ "type": "array",
130
+ "items": {
131
+ "type": "object",
132
+ "additionalProperties": false,
133
+ "required": ["digest", "path"],
134
+ "properties": {
135
+ "digest": {
136
+ "$ref": "#/$defs/digest"
137
+ },
138
+ "path": {
139
+ "description": "`assets/<sha256>-<safe-name>.<ext>` — the digest is in the file name, so different bytes can never occupy the same path.",
140
+ "$ref": "#/$defs/packagePath"
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
146
+ },
147
+ "currentness": {
148
+ "description": "Derived from `supersedes`, cached here for discovery. Superseded warns; it never blocks — only an explicit revocation does.",
149
+ "type": "array",
150
+ "items": {
151
+ "type": "object",
152
+ "additionalProperties": false,
153
+ "required": ["ref", "state"],
154
+ "properties": {
155
+ "ref": {
156
+ "$ref": "#/$defs/artifactRef"
157
+ },
158
+ "state": {
159
+ "enum": ["current", "superseded"]
160
+ }
161
+ }
162
+ }
163
+ },
164
+ "governance": {
165
+ "description": "Index of review and revocation records. The records themselves live outside the baseline they decide on, so no digest is self-referential.",
166
+ "type": "object",
167
+ "additionalProperties": false,
168
+ "required": ["reviews", "revocations"],
169
+ "properties": {
170
+ "reviews": {
171
+ "type": "array",
172
+ "items": {
173
+ "$ref": "#/$defs/governanceEntry"
174
+ }
175
+ },
176
+ "revocations": {
177
+ "type": "array",
178
+ "items": {
179
+ "$ref": "#/$defs/governanceEntry"
180
+ }
181
+ }
182
+ }
183
+ },
184
+ "relations": {
185
+ "description": "Many-to-many links to the documents that consume this package — the backreference direction, so a consumer is found without scanning docs/.",
186
+ "type": "object",
187
+ "additionalProperties": false,
188
+ "required": ["specs", "plans"],
189
+ "properties": {
190
+ "specs": {
191
+ "type": "array",
192
+ "items": {
193
+ "type": "string"
194
+ }
195
+ },
196
+ "plans": {
197
+ "type": "array",
198
+ "items": {
199
+ "type": "string"
200
+ }
201
+ }
202
+ }
203
+ }
204
+ },
205
+ "$defs": {
206
+ "digest": {
207
+ "type": "string",
208
+ "pattern": "^sha256:[0-9a-f]{64}$"
209
+ },
210
+ "packagePath": {
211
+ "description": "Package-relative path. Never absolute, never Windows-separated, never carrying `.` or `..`.",
212
+ "type": "string",
213
+ "pattern": "^[^/\\\\][^\\\\]*$"
214
+ },
215
+ "artifactRef": {
216
+ "type": "string",
217
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS|REV|RVK)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}(#[A-Za-z0-9][A-Za-z0-9_-]*)?$"
218
+ },
219
+ "revisionedArtifact": {
220
+ "type": "object",
221
+ "additionalProperties": false,
222
+ "required": ["id", "revision", "path", "supersedes"],
223
+ "properties": {
224
+ "id": {
225
+ "type": "string",
226
+ "pattern": "^(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})$"
227
+ },
228
+ "revision": {
229
+ "type": "integer",
230
+ "minimum": 1
231
+ },
232
+ "path": {
233
+ "$ref": "#/$defs/packagePath"
234
+ },
235
+ "supersedes": {
236
+ "type": ["string", "null"],
237
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
238
+ }
239
+ }
240
+ },
241
+ "maturedArtifact": {
242
+ "type": "object",
243
+ "additionalProperties": false,
244
+ "required": ["id", "revision", "path", "supersedes", "maturity"],
245
+ "properties": {
246
+ "id": {
247
+ "type": "string",
248
+ "pattern": "^(?:FLW|SCR)-(?:[0-9]{3}|[1-9][0-9]{3,})$"
249
+ },
250
+ "revision": {
251
+ "type": "integer",
252
+ "minimum": 1
253
+ },
254
+ "path": {
255
+ "$ref": "#/$defs/packagePath"
256
+ },
257
+ "supersedes": {
258
+ "type": ["string", "null"],
259
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
260
+ },
261
+ "maturity": {
262
+ "enum": ["outline", "handoff"]
263
+ }
264
+ }
265
+ },
266
+ "governanceEntry": {
267
+ "type": "object",
268
+ "additionalProperties": false,
269
+ "required": ["id", "path", "digest", "target"],
270
+ "properties": {
271
+ "id": {
272
+ "type": "string",
273
+ "pattern": "^(?:REV|RVK)-(?:[0-9]{3}|[1-9][0-9]{3,})$"
274
+ },
275
+ "path": {
276
+ "$ref": "#/$defs/packagePath"
277
+ },
278
+ "digest": {
279
+ "$ref": "#/$defs/digest"
280
+ },
281
+ "target": {
282
+ "type": "string",
283
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
284
+ }
285
+ }
286
+ },
287
+ "screenArtifact": {
288
+ "type": "object",
289
+ "additionalProperties": false,
290
+ "required": ["id", "revision", "path", "supersedes", "maturity", "states"],
291
+ "properties": {
292
+ "id": {
293
+ "type": "string",
294
+ "pattern": "^(?:FLW|SCR)-(?:[0-9]{3}|[1-9][0-9]{3,})$"
295
+ },
296
+ "revision": {
297
+ "type": "integer",
298
+ "minimum": 1
299
+ },
300
+ "path": {
301
+ "$ref": "#/$defs/packagePath"
302
+ },
303
+ "supersedes": {
304
+ "type": ["string", "null"],
305
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
306
+ },
307
+ "maturity": {
308
+ "enum": ["outline", "handoff"]
309
+ },
310
+ "states": {
311
+ "type": "array",
312
+ "minItems": 1,
313
+ "uniqueItems": true,
314
+ "items": {
315
+ "type": "string",
316
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
317
+ }
318
+ }
319
+ }
320
+ }
321
+ }
322
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://workline.dev/schemas/design-review.v1.schema.json",
4
+ "title": "Workline design review record v1",
5
+ "description": "An external review of one exact baseline revision. It lives OUTSIDE the baseline it reviews, so no digest is self-referential, and it never grants anything to a later revision.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "id",
11
+ "target",
12
+ "target_digest",
13
+ "author",
14
+ "date",
15
+ "decision",
16
+ "evidence",
17
+ "digest"
18
+ ],
19
+ "properties": {
20
+ "schema": {
21
+ "const": "workline.design-review/v1"
22
+ },
23
+ "id": {
24
+ "type": "string",
25
+ "pattern": "^REV-(?:[0-9]{3}|[1-9][0-9]{3,})$"
26
+ },
27
+ "target": {
28
+ "description": "The exact baseline this record decides on.",
29
+ "$ref": "#/$defs/baselineRef"
30
+ },
31
+ "target_digest": {
32
+ "description": "The digest that baseline had. A record decides on BYTES, not on a name.",
33
+ "$ref": "#/$defs/digest"
34
+ },
35
+ "author": {
36
+ "description": "Who decided, or the role that did.",
37
+ "type": "string",
38
+ "minLength": 1
39
+ },
40
+ "date": {
41
+ "type": "string",
42
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
43
+ },
44
+ "decision": {
45
+ "description": "`proposed` is the state a baseline is born in; only `approved` grants anything.",
46
+ "enum": ["proposed", "approved", "rejected"]
47
+ },
48
+ "evidence": {
49
+ "description": "Optional: where the decision was taken. Never a substitute for the decision.",
50
+ "type": "array",
51
+ "uniqueItems": true,
52
+ "items": {
53
+ "type": "string",
54
+ "minLength": 1
55
+ }
56
+ },
57
+ "digest": {
58
+ "description": "SHA-256 of this record's canonical JSON WITHOUT this field.",
59
+ "$ref": "#/$defs/digest"
60
+ }
61
+ },
62
+ "$defs": {
63
+ "baselineRef": {
64
+ "type": "string",
65
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
66
+ },
67
+ "digest": {
68
+ "type": "string",
69
+ "pattern": "^sha256:[0-9a-f]{64}$"
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://workline.dev/schemas/design-revocation.v1.schema.json",
4
+ "title": "Workline design revocation record v1",
5
+ "description": "An explicit, audited block on one exact baseline revision. The ONLY thing that forbids executing against a published revision.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema", "id", "target", "target_digest", "author", "date", "reason", "digest"],
9
+ "properties": {
10
+ "schema": {
11
+ "const": "workline.design-revocation/v1"
12
+ },
13
+ "id": {
14
+ "type": "string",
15
+ "pattern": "^RVK-(?:[0-9]{3}|[1-9][0-9]{3,})$"
16
+ },
17
+ "target": {
18
+ "description": "The exact baseline this record decides on.",
19
+ "$ref": "#/$defs/baselineRef"
20
+ },
21
+ "target_digest": {
22
+ "description": "The digest that baseline had. A record decides on BYTES, not on a name.",
23
+ "$ref": "#/$defs/digest"
24
+ },
25
+ "author": {
26
+ "description": "Who decided, or the role that did.",
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "date": {
31
+ "type": "string",
32
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
33
+ },
34
+ "reason": {
35
+ "description": "Why this revision must not be executed. Not optional: a block without a reason is not auditable.",
36
+ "type": "string",
37
+ "minLength": 1
38
+ },
39
+ "digest": {
40
+ "description": "SHA-256 of this record's canonical JSON WITHOUT this field.",
41
+ "$ref": "#/$defs/digest"
42
+ }
43
+ },
44
+ "$defs": {
45
+ "baselineRef": {
46
+ "type": "string",
47
+ "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
48
+ },
49
+ "digest": {
50
+ "type": "string",
51
+ "pattern": "^sha256:[0-9a-f]{64}$"
52
+ }
53
+ }
54
+ }