@acrasie/dev-flow 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.codex-plugin/plugin.json +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +181 -2
  4. package/dist/codex-dev-flow.mjs +3 -0
  5. package/dist/dev-flow.mjs +241 -0
  6. package/docs/adr/0001-hybrid-portable-workflow.md +23 -0
  7. package/docs/adr/0002-share-an-invalidable-context-capsule.md +55 -0
  8. package/docs/adr/0004-scale-assurance-lanes-by-applicable-risk.md +36 -0
  9. package/docs/adr/0006-make-intake-adaptive-user-authoritative-and-token-efficient.md +76 -0
  10. package/docs/adr/0007-collect-opt-in-local-benchmark-feedback.md +82 -0
  11. package/docs/adr/0008-automate-maintainer-releases-with-an-interactive-bun-workflow.md +121 -0
  12. package/docs/adr/0009-separate-intake-decisions-from-shape-discovery.md +200 -0
  13. package/docs/adr/0010-choose-quick-or-plan-after-discovery.md +161 -0
  14. package/docs/adr/0011-separate-fast-local-and-authoritative-ci-quality-gates.md +49 -0
  15. package/docs/adr/0012-use-bun-test-and-require-node-24.md +41 -0
  16. package/docs/adr/0013-layer-source-distribution-and-runtime-tests.md +42 -0
  17. package/docs/adr/0014-ratchet-source-coverage-with-bun.md +51 -0
  18. package/docs/adr/0015-split-fast-and-type-aware-linting.md +41 -0
  19. package/docs/adr/0016-use-husky-with-a-tested-bun-staged-file-adapter.md +45 -0
  20. package/docs/adr/0017-format-conservatively-with-oxfmt.md +45 -0
  21. package/docs/adr/0018-use-a-high-signal-oxlint-policy.md +53 -0
  22. package/docs/adr/0019-gate-deterministic-size-and-observe-timing.md +44 -0
  23. package/docs/adr/0020-support-linux-and-macos-with-targeted-ci.md +41 -0
  24. package/docs/adr/0021-randomize-tests-without-retries.md +35 -0
  25. package/docs/adr/0022-use-one-root-bun-workspace.md +41 -0
  26. package/docs/adr/0024-make-gate-a-minimal-plan-approval.md +74 -0
  27. package/docs/adr/0025-end-the-lifecycle-after-assure.md +55 -0
  28. package/docs/adr/0026-keep-intake-product-stable-and-interview-shape-by-dependency.md +151 -0
  29. package/docs/adr/0027-add-agentic-project-init-and-versioned-engineering-profiles.md +147 -0
  30. package/docs/adr/0028-make-public-documentation-user-first-and-current.md +65 -0
  31. package/docs/adr/0029-make-build-a-native-execution-boundary.md +51 -0
  32. package/docs/adr/0030-unify-product-domain-and-technical-design-interviews.md +240 -0
  33. package/docs/adr/0031-make-assure-the-success-boundary.md +205 -0
  34. package/docs/artifacts.md +47 -0
  35. package/docs/baselines/2026-07-18-p0-lifecycle.json +142 -0
  36. package/docs/design.md +101 -0
  37. package/docs/getting-started.md +204 -0
  38. package/docs/glossary/dev-flow.md +527 -0
  39. package/docs/lifecycle-contract.md +189 -0
  40. package/docs/lifecycle-contract.projection.json +931 -0
  41. package/docs/metrics-protocol.md +113 -0
  42. package/docs/project-profile-contract.md +157 -0
  43. package/docs/runbooks/maintainer-release.md +291 -0
  44. package/docs/target-intake-shape-contract.md +416 -0
  45. package/package.json +68 -4
  46. package/schemas/config.schema.json +104 -0
  47. package/schemas/policy.schema.json +17 -0
  48. package/schemas/project-init-state.schema.json +159 -0
  49. package/schemas/project-profile-local.schema.json +53 -0
  50. package/schemas/project-profile.schema.json +285 -0
  51. package/schemas/state.schema.json +826 -0
  52. package/skills/debug-root-cause/SKILL.md +16 -0
  53. package/skills/design-decisions/SKILL.md +24 -0
  54. package/skills/dev-flow/SKILL.md +306 -0
  55. package/skills/dev-flow/agents/openai.yaml +6 -0
  56. package/skills/discover-change/SKILL.md +31 -0
  57. package/skills/plan-change/SKILL.md +29 -0
  58. package/skills/review-change/SKILL.md +21 -0
@@ -0,0 +1,826 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "Dev Flow task state V6",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": [
7
+ "schemaVersion",
8
+ "taskId",
9
+ "status",
10
+ "revision",
11
+ "risk",
12
+ "design",
13
+ "configSnapshot",
14
+ "policySnapshot",
15
+ "issues",
16
+ "history"
17
+ ],
18
+ "properties": {
19
+ "schemaVersion": {
20
+ "const": 6
21
+ },
22
+ "taskId": {
23
+ "$ref": "#/$defs/text"
24
+ },
25
+ "status": {
26
+ "$ref": "#/$defs/status"
27
+ },
28
+ "revision": {
29
+ "type": "integer",
30
+ "minimum": 0
31
+ },
32
+ "risk": {
33
+ "enum": ["low", "medium", "high", "critical"]
34
+ },
35
+ "shape": {
36
+ "$ref": "#/$defs/shapeState"
37
+ },
38
+ "contractDigest": {
39
+ "$ref": "#/$defs/text"
40
+ },
41
+ "assurance": {
42
+ "type": "object"
43
+ },
44
+ "design": {
45
+ "type": "object"
46
+ },
47
+ "resumeTo": {
48
+ "$ref": "#/$defs/resumeTarget"
49
+ },
50
+ "configSnapshot": {
51
+ "type": "object"
52
+ },
53
+ "policySnapshot": {
54
+ "type": "object"
55
+ },
56
+ "issues": {
57
+ "type": "array"
58
+ },
59
+ "history": {
60
+ "type": "array",
61
+ "minItems": 1,
62
+ "items": {
63
+ "oneOf": [
64
+ {
65
+ "$ref": "#/$defs/transitionEvent"
66
+ },
67
+ {
68
+ "$ref": "#/$defs/workflowEvent"
69
+ }
70
+ ]
71
+ }
72
+ },
73
+ "historySummary": {
74
+ "$ref": "#/$defs/historySummary"
75
+ },
76
+ "activeArtifact": {
77
+ "$ref": "#/$defs/activeArtifact"
78
+ },
79
+ "activeWorktree": {
80
+ "$ref": "#/$defs/activeWorktree"
81
+ },
82
+ "contextCapsule": {
83
+ "type": "object"
84
+ },
85
+ "routingSnapshot": {
86
+ "type": "object"
87
+ },
88
+ "routingPolicyVersion": {
89
+ "$ref": "#/$defs/text"
90
+ },
91
+ "routingDecisions": {
92
+ "type": "array",
93
+ "items": {
94
+ "type": "object"
95
+ }
96
+ },
97
+ "intake": {
98
+ "$ref": "#/$defs/intakeState"
99
+ },
100
+ "benchmarkEnabled": {
101
+ "type": "boolean"
102
+ },
103
+ "resumeReason": {
104
+ "$ref": "#/$defs/text"
105
+ },
106
+ "planApproval": {
107
+ "$ref": "#/$defs/planApprovalReceipt"
108
+ }
109
+ },
110
+ "allOf": [
111
+ {
112
+ "if": {
113
+ "properties": {
114
+ "status": {
115
+ "const": "blocked"
116
+ }
117
+ },
118
+ "required": ["status"]
119
+ },
120
+ "then": {
121
+ "required": ["resumeTo", "resumeReason"],
122
+ "properties": {
123
+ "resumeTo": {
124
+ "$ref": "#/$defs/resumeTarget"
125
+ },
126
+ "resumeReason": {
127
+ "$ref": "#/$defs/text"
128
+ }
129
+ }
130
+ }
131
+ },
132
+ {
133
+ "if": {
134
+ "properties": {
135
+ "status": {
136
+ "not": {
137
+ "const": "blocked"
138
+ }
139
+ }
140
+ },
141
+ "required": ["status"]
142
+ },
143
+ "then": {
144
+ "not": {
145
+ "anyOf": [
146
+ {
147
+ "required": ["resumeTo"]
148
+ },
149
+ {
150
+ "required": ["resumeReason"]
151
+ }
152
+ ]
153
+ }
154
+ }
155
+ },
156
+ {
157
+ "if": {
158
+ "properties": {
159
+ "status": {
160
+ "const": "awaiting_approval"
161
+ }
162
+ },
163
+ "required": ["status"]
164
+ },
165
+ "then": {
166
+ "required": ["contractDigest"],
167
+ "properties": {
168
+ "contractDigest": {
169
+ "$ref": "#/$defs/text"
170
+ }
171
+ }
172
+ }
173
+ },
174
+ {
175
+ "if": {
176
+ "properties": {
177
+ "status": {
178
+ "enum": [
179
+ "discovering",
180
+ "awaiting_shape_decision",
181
+ "awaiting_profile_choice",
182
+ "planning",
183
+ "awaiting_intake_decision",
184
+ "awaiting_approval",
185
+ "executing",
186
+ "assuring"
187
+ ]
188
+ }
189
+ },
190
+ "required": ["status"]
191
+ },
192
+ "then": {
193
+ "required": ["shape"],
194
+ "properties": {
195
+ "shape": {
196
+ "$ref": "#/$defs/shapeState"
197
+ }
198
+ }
199
+ }
200
+ }
201
+ ],
202
+ "$defs": {
203
+ "text": {
204
+ "type": "string",
205
+ "minLength": 1,
206
+ "maxLength": 4096
207
+ },
208
+ "ref": {
209
+ "type": "string",
210
+ "minLength": 1,
211
+ "maxLength": 512,
212
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/#@+~=-]*$"
213
+ },
214
+ "status": {
215
+ "enum": [
216
+ "new",
217
+ "intaking",
218
+ "discovering",
219
+ "awaiting_shape_decision",
220
+ "awaiting_profile_choice",
221
+ "planning",
222
+ "awaiting_intake_decision",
223
+ "awaiting_approval",
224
+ "executing",
225
+ "assuring",
226
+ "blocked",
227
+ "cancelled",
228
+ "failed"
229
+ ]
230
+ },
231
+ "resumeTarget": {
232
+ "enum": [
233
+ "intaking",
234
+ "discovering",
235
+ "awaiting_shape_decision",
236
+ "awaiting_profile_choice",
237
+ "planning",
238
+ "awaiting_intake_decision",
239
+ "awaiting_approval",
240
+ "executing",
241
+ "assuring"
242
+ ]
243
+ },
244
+ "historyReference": {
245
+ "type": "object",
246
+ "additionalProperties": false,
247
+ "required": ["kind", "ref"],
248
+ "properties": {
249
+ "kind": {
250
+ "enum": [
251
+ "task",
252
+ "shape",
253
+ "artifact",
254
+ "worktree",
255
+ "context-capsule",
256
+ "context",
257
+ "issue",
258
+ "correction",
259
+ "gate",
260
+ "scope",
261
+ "evidence",
262
+ "receipt",
263
+ "command",
264
+ "criterion",
265
+ "decision",
266
+ "policy",
267
+ "config",
268
+ "git",
269
+ "symbol"
270
+ ]
271
+ },
272
+ "ref": {
273
+ "$ref": "#/$defs/ref"
274
+ },
275
+ "fingerprint": {
276
+ "$ref": "#/$defs/ref"
277
+ }
278
+ }
279
+ },
280
+ "workflowEvent": {
281
+ "type": "object",
282
+ "additionalProperties": false,
283
+ "required": ["sequence", "at", "type", "refs"],
284
+ "properties": {
285
+ "sequence": {
286
+ "type": "integer",
287
+ "minimum": 1
288
+ },
289
+ "at": {
290
+ "type": "string"
291
+ },
292
+ "type": {
293
+ "enum": [
294
+ "task.created",
295
+ "task.blocked",
296
+ "task.resumed",
297
+ "gate.recorded",
298
+ "scope.approved",
299
+ "artifact.recorded",
300
+ "issue.recorded",
301
+ "correction.recorded",
302
+ "context.updated",
303
+ "intake.checkpoint",
304
+ "advance.rejected",
305
+ "intake.reopened",
306
+ "discovery.target_recorded",
307
+ "discovery.evidence_recorded",
308
+ "discovery.completed",
309
+ "profile.choice_requested",
310
+ "profile.choice_recorded",
311
+ "design.question_recorded",
312
+ "design.answer_recorded",
313
+ "design.invalidated",
314
+ "contract.projected",
315
+ "projection.reconciliation_requested",
316
+ "evidence.invalidated",
317
+ "shape.checkpoint",
318
+ "assurance.evidence_recorded",
319
+ "assurance.evidence_invalidated",
320
+ "assurance.issue_resolved",
321
+ "assurance.human_observation_requested",
322
+ "assure.completed"
323
+ ]
324
+ },
325
+ "refs": {
326
+ "type": "array",
327
+ "minItems": 1,
328
+ "maxItems": 16,
329
+ "items": {
330
+ "$ref": "#/$defs/historyReference"
331
+ }
332
+ }
333
+ }
334
+ },
335
+ "transitionEvent": {
336
+ "type": "object",
337
+ "additionalProperties": false,
338
+ "required": ["sequence", "at", "type", "from", "to", "revision", "sourceFingerprint"],
339
+ "properties": {
340
+ "sequence": {
341
+ "type": "integer",
342
+ "minimum": 1
343
+ },
344
+ "at": {
345
+ "type": "string"
346
+ },
347
+ "type": {
348
+ "const": "state.transition"
349
+ },
350
+ "from": {
351
+ "$ref": "#/$defs/status"
352
+ },
353
+ "to": {
354
+ "$ref": "#/$defs/status"
355
+ },
356
+ "revision": {
357
+ "type": "integer",
358
+ "minimum": 1
359
+ },
360
+ "sourceFingerprint": {
361
+ "$ref": "#/$defs/text"
362
+ },
363
+ "terminalSource": {
364
+ "$ref": "#/$defs/status"
365
+ },
366
+ "terminalResumeTo": {
367
+ "$ref": "#/$defs/resumeTarget"
368
+ },
369
+ "contractDigest": {
370
+ "$ref": "#/$defs/text"
371
+ },
372
+ "guardEvidence": {
373
+ "type": "array",
374
+ "minItems": 1,
375
+ "items": {
376
+ "type": "object"
377
+ }
378
+ },
379
+ "gateDecision": {
380
+ "$ref": "#/$defs/gateDecision"
381
+ }
382
+ }
383
+ },
384
+ "historySummary": {
385
+ "type": "object",
386
+ "additionalProperties": false,
387
+ "required": [
388
+ "removedCount",
389
+ "firstSequence",
390
+ "lastSequence",
391
+ "firstAt",
392
+ "lastAt",
393
+ "typeCounts"
394
+ ],
395
+ "properties": {
396
+ "removedCount": {
397
+ "type": "integer",
398
+ "minimum": 1
399
+ },
400
+ "firstSequence": {
401
+ "type": "integer",
402
+ "minimum": 1
403
+ },
404
+ "lastSequence": {
405
+ "type": "integer",
406
+ "minimum": 1
407
+ },
408
+ "firstAt": {
409
+ "type": "string"
410
+ },
411
+ "lastAt": {
412
+ "type": "string"
413
+ },
414
+ "typeCounts": {
415
+ "type": "object",
416
+ "additionalProperties": {
417
+ "type": "integer",
418
+ "minimum": 1
419
+ }
420
+ },
421
+ "lastTransition": {
422
+ "type": "object"
423
+ }
424
+ }
425
+ },
426
+ "activeArtifact": {
427
+ "type": "object",
428
+ "additionalProperties": false,
429
+ "required": ["artifactId", "ownerRef", "fingerprint"],
430
+ "properties": {
431
+ "artifactId": {
432
+ "$ref": "#/$defs/text"
433
+ },
434
+ "ownerRef": {
435
+ "$ref": "#/$defs/text"
436
+ },
437
+ "fingerprint": {
438
+ "$ref": "#/$defs/text"
439
+ }
440
+ }
441
+ },
442
+ "activeWorktree": {
443
+ "type": "object",
444
+ "additionalProperties": false,
445
+ "required": ["worktreeRef", "gitFingerprint"],
446
+ "properties": {
447
+ "worktreeRef": {
448
+ "$ref": "#/$defs/text"
449
+ },
450
+ "gitFingerprint": {
451
+ "$ref": "#/$defs/text"
452
+ }
453
+ }
454
+ },
455
+ "intakeState": {
456
+ "type": "object",
457
+ "additionalProperties": false,
458
+ "required": [
459
+ "schemaVersion",
460
+ "risk",
461
+ "provenance",
462
+ "technicalUnknowns",
463
+ "decisions",
464
+ "answeredDecisionKeys",
465
+ "invalidations",
466
+ "contradictions",
467
+ "semanticComplete",
468
+ "deterministicComplete",
469
+ "checkpointDue",
470
+ "semanticRetryCount",
471
+ "metrics"
472
+ ],
473
+ "properties": {
474
+ "schemaVersion": {
475
+ "const": 1
476
+ },
477
+ "decisions": {
478
+ "type": "array"
479
+ },
480
+ "answeredDecisionKeys": {
481
+ "type": "array",
482
+ "items": {
483
+ "type": "string"
484
+ }
485
+ },
486
+ "invalidations": {
487
+ "type": "array"
488
+ },
489
+ "contradictions": {
490
+ "type": "array",
491
+ "items": {
492
+ "type": "string"
493
+ }
494
+ },
495
+ "semanticComplete": {
496
+ "type": "boolean"
497
+ },
498
+ "deterministicComplete": {
499
+ "type": "boolean"
500
+ },
501
+ "checkpointDue": {
502
+ "type": "boolean"
503
+ },
504
+ "semanticRetryCount": {
505
+ "type": "integer",
506
+ "minimum": 0
507
+ },
508
+ "blockedReason": {
509
+ "enum": ["semantic_output_invalid", "answer_required"]
510
+ },
511
+ "metrics": {
512
+ "$ref": "#/$defs/intakeMetrics"
513
+ },
514
+ "risk": {
515
+ "enum": ["low", "medium", "high", "critical"]
516
+ },
517
+ "provenance": {
518
+ "type": "object",
519
+ "additionalProperties": false,
520
+ "required": ["sourceRefs", "capturedAt", "freshnessRefs"],
521
+ "properties": {
522
+ "sourceRefs": {
523
+ "type": "array",
524
+ "maxItems": 32,
525
+ "items": {
526
+ "type": "string"
527
+ }
528
+ },
529
+ "capturedAt": {
530
+ "type": "string",
531
+ "minLength": 1,
532
+ "maxLength": 128
533
+ },
534
+ "freshnessRefs": {
535
+ "type": "array",
536
+ "maxItems": 32,
537
+ "items": {
538
+ "type": "string"
539
+ }
540
+ }
541
+ }
542
+ },
543
+ "technicalUnknowns": {
544
+ "type": "array",
545
+ "maxItems": 32,
546
+ "items": {
547
+ "type": "object",
548
+ "additionalProperties": false,
549
+ "required": ["key", "kind", "description", "owner"],
550
+ "properties": {
551
+ "key": {
552
+ "type": "string"
553
+ },
554
+ "kind": {
555
+ "enum": ["code", "dependency", "architecture", "validation", "operations"]
556
+ },
557
+ "description": {
558
+ "type": "string"
559
+ },
560
+ "owner": {
561
+ "const": "shape"
562
+ }
563
+ }
564
+ }
565
+ },
566
+ "activeQuestionId": {
567
+ "type": "string",
568
+ "minLength": 1,
569
+ "maxLength": 256
570
+ }
571
+ }
572
+ },
573
+ "shapeState": {
574
+ "type": "object",
575
+ "additionalProperties": false,
576
+ "required": [
577
+ "schemaVersion",
578
+ "risk",
579
+ "productBaselineRef",
580
+ "discoveryTargets",
581
+ "evidence",
582
+ "sourceFingerprints",
583
+ "technicalDecisions",
584
+ "dependencyGraph",
585
+ "invalidations",
586
+ "budget",
587
+ "semanticRetryCounts",
588
+ "evaluatorReceipts"
589
+ ],
590
+ "properties": {
591
+ "schemaVersion": {
592
+ "const": 1
593
+ },
594
+ "risk": {
595
+ "enum": ["low", "medium", "high", "critical"]
596
+ },
597
+ "productBaselineRef": {
598
+ "$ref": "#/$defs/text"
599
+ },
600
+ "discoveryTargets": {
601
+ "type": "array",
602
+ "maxItems": 4096,
603
+ "items": {
604
+ "type": "object"
605
+ }
606
+ },
607
+ "evidence": {
608
+ "type": "array",
609
+ "maxItems": 4096,
610
+ "items": {
611
+ "type": "object"
612
+ }
613
+ },
614
+ "sourceFingerprints": {
615
+ "type": "array",
616
+ "maxItems": 4096,
617
+ "items": {
618
+ "type": "object"
619
+ }
620
+ },
621
+ "technicalDecisions": {
622
+ "type": "array",
623
+ "maxItems": 4096,
624
+ "items": {
625
+ "type": "object"
626
+ }
627
+ },
628
+ "activeTechnicalDecisionId": {
629
+ "$ref": "#/$defs/text"
630
+ },
631
+ "preparationProfileChoice": {
632
+ "type": "object"
633
+ },
634
+ "contract": {
635
+ "type": "object"
636
+ },
637
+ "projection": {
638
+ "type": "object"
639
+ },
640
+ "dependencyGraph": {
641
+ "type": "object"
642
+ },
643
+ "invalidations": {
644
+ "type": "array",
645
+ "maxItems": 4096,
646
+ "items": {
647
+ "type": "object"
648
+ }
649
+ },
650
+ "budget": {
651
+ "type": "object"
652
+ },
653
+ "semanticRetryCounts": {
654
+ "type": "object"
655
+ },
656
+ "evaluatorReceipts": {
657
+ "type": "array",
658
+ "maxItems": 4096,
659
+ "items": {
660
+ "type": "object"
661
+ }
662
+ }
663
+ }
664
+ },
665
+ "intakeMetrics": {
666
+ "type": "object",
667
+ "additionalProperties": false,
668
+ "required": [
669
+ "modelCalls",
670
+ "questionsAsked",
671
+ "questionsAvoided",
672
+ "distinctQuestions",
673
+ "recommendationsAccepted",
674
+ "recommendationsModified",
675
+ "zeroQuestionPath",
676
+ "lateReopenings"
677
+ ],
678
+ "properties": {
679
+ "modelCalls": {
680
+ "type": "integer",
681
+ "minimum": 0
682
+ },
683
+ "questionsAsked": {
684
+ "type": "integer",
685
+ "minimum": 0
686
+ },
687
+ "questionsAvoided": {
688
+ "type": "integer",
689
+ "minimum": 0
690
+ },
691
+ "distinctQuestions": {
692
+ "type": "integer",
693
+ "minimum": 0
694
+ },
695
+ "recommendationsAccepted": {
696
+ "type": "integer",
697
+ "minimum": 0
698
+ },
699
+ "recommendationsModified": {
700
+ "type": "integer",
701
+ "minimum": 0
702
+ },
703
+ "lateReopenings": {
704
+ "type": "integer",
705
+ "minimum": 0
706
+ },
707
+ "inputTokens": {
708
+ "type": "integer",
709
+ "minimum": 0
710
+ },
711
+ "outputTokens": {
712
+ "type": "integer",
713
+ "minimum": 0
714
+ },
715
+ "latencyMs": {
716
+ "type": "integer",
717
+ "minimum": 0
718
+ },
719
+ "zeroQuestionPath": {
720
+ "type": "boolean"
721
+ }
722
+ }
723
+ },
724
+ "gateDecision": {
725
+ "type": "object",
726
+ "additionalProperties": false,
727
+ "required": [
728
+ "schemaVersion",
729
+ "decision",
730
+ "actor",
731
+ "decidedAt",
732
+ "taskId",
733
+ "artifactId",
734
+ "stateRevision",
735
+ "stateFingerprint",
736
+ "contractDigest",
737
+ "receiptDigest"
738
+ ],
739
+ "properties": {
740
+ "schemaVersion": {
741
+ "const": 1
742
+ },
743
+ "decision": {
744
+ "enum": ["approved", "change_requested", "rejected"]
745
+ },
746
+ "actor": {
747
+ "const": "user"
748
+ },
749
+ "decidedAt": {
750
+ "type": "string"
751
+ },
752
+ "taskId": {
753
+ "$ref": "#/$defs/text"
754
+ },
755
+ "artifactId": {
756
+ "$ref": "#/$defs/text"
757
+ },
758
+ "stateRevision": {
759
+ "type": "integer",
760
+ "minimum": 0
761
+ },
762
+ "stateFingerprint": {
763
+ "$ref": "#/$defs/text"
764
+ },
765
+ "contractDigest": {
766
+ "$ref": "#/$defs/text"
767
+ },
768
+ "instructionRef": {
769
+ "$ref": "#/$defs/ref"
770
+ },
771
+ "receiptDigest": {
772
+ "$ref": "#/$defs/text"
773
+ }
774
+ }
775
+ },
776
+ "planApprovalReceipt": {
777
+ "type": "object",
778
+ "additionalProperties": false,
779
+ "required": [
780
+ "schemaVersion",
781
+ "decision",
782
+ "actor",
783
+ "decidedAt",
784
+ "taskId",
785
+ "artifactId",
786
+ "stateRevision",
787
+ "stateFingerprint",
788
+ "contractDigest",
789
+ "receiptDigest"
790
+ ],
791
+ "properties": {
792
+ "schemaVersion": {
793
+ "const": 1
794
+ },
795
+ "decision": {
796
+ "const": "approved"
797
+ },
798
+ "actor": {
799
+ "const": "user"
800
+ },
801
+ "decidedAt": {
802
+ "type": "string"
803
+ },
804
+ "taskId": {
805
+ "$ref": "#/$defs/text"
806
+ },
807
+ "artifactId": {
808
+ "$ref": "#/$defs/text"
809
+ },
810
+ "stateRevision": {
811
+ "type": "integer",
812
+ "minimum": 0
813
+ },
814
+ "stateFingerprint": {
815
+ "$ref": "#/$defs/text"
816
+ },
817
+ "contractDigest": {
818
+ "$ref": "#/$defs/text"
819
+ },
820
+ "receiptDigest": {
821
+ "$ref": "#/$defs/text"
822
+ }
823
+ }
824
+ }
825
+ }
826
+ }