@team-attention/hoyeon-cli 0.9.0 → 1.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.
@@ -0,0 +1,772 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "dev-spec/v5",
4
+ "title": "dev-spec v5",
5
+ "description": "JSON Schema for dev spec v5 — unified spec + state document. AC uses scenarios[] + checks[] instead of functional/static/runtime/cleanup categories.",
6
+ "type": "object",
7
+ "required": ["meta", "tasks"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "$schema": { "type": "string" },
11
+ "meta": { "$ref": "#/$defs/meta" },
12
+ "context": { "$ref": "#/$defs/context" },
13
+ "requirements": {
14
+ "type": "array",
15
+ "items": { "$ref": "#/$defs/requirement" }
16
+ },
17
+ "tasks": {
18
+ "type": "array",
19
+ "minItems": 1,
20
+ "items": { "$ref": "#/$defs/task" }
21
+ },
22
+ "constraints": {
23
+ "type": "array",
24
+ "items": { "$ref": "#/$defs/constraint" }
25
+ },
26
+ "history": {
27
+ "type": "array",
28
+ "items": { "$ref": "#/$defs/historyEntry" }
29
+ },
30
+ "verification_summary": {
31
+ "$ref": "#/$defs/verificationSummary",
32
+ "description": "Derived from requirements — A/H/S classification. Do not author independently."
33
+ },
34
+ "external_dependencies": { "$ref": "#/$defs/externalDependencies" }
35
+ },
36
+ "$defs": {
37
+ "sha256Hash": {
38
+ "type": "string",
39
+ "pattern": "^[a-f0-9]{64}$",
40
+ "description": "Raw SHA-256 hex digest (64 lowercase hex characters, no prefix)"
41
+ },
42
+ "reference": {
43
+ "type": "object",
44
+ "required": ["path"],
45
+ "additionalProperties": false,
46
+ "properties": {
47
+ "path": { "type": "string" },
48
+ "start_line": { "type": "integer", "minimum": 1 },
49
+ "end_line": { "type": "integer", "minimum": 1 }
50
+ }
51
+ },
52
+ "taskConstraint": {
53
+ "type": "object",
54
+ "required": ["type", "target"],
55
+ "additionalProperties": false,
56
+ "properties": {
57
+ "type": {
58
+ "type": "string",
59
+ "enum": ["no_modify", "no_delete", "preserve_string", "read_only"]
60
+ },
61
+ "target": { "type": "string" }
62
+ }
63
+ },
64
+ "expect": {
65
+ "type": "object",
66
+ "required": ["exit_code"],
67
+ "additionalProperties": false,
68
+ "properties": {
69
+ "exit_code": { "type": "integer" },
70
+ "stdout_contains": { "type": "string" },
71
+ "stderr_empty": { "type": "boolean" }
72
+ }
73
+ },
74
+ "verifyCommand": {
75
+ "type": "object",
76
+ "required": ["type", "run", "expect"],
77
+ "additionalProperties": false,
78
+ "properties": {
79
+ "type": { "type": "string", "const": "command" },
80
+ "run": { "type": "string" },
81
+ "expect": { "$ref": "#/$defs/expect" }
82
+ }
83
+ },
84
+ "verifyAssertion": {
85
+ "type": "object",
86
+ "required": ["type", "checks"],
87
+ "additionalProperties": false,
88
+ "properties": {
89
+ "type": { "type": "string", "const": "assertion" },
90
+ "checks": {
91
+ "type": "array",
92
+ "minItems": 1,
93
+ "items": { "type": "string" }
94
+ }
95
+ }
96
+ },
97
+ "verifyInstruction": {
98
+ "type": "object",
99
+ "required": ["type", "ask"],
100
+ "additionalProperties": false,
101
+ "properties": {
102
+ "type": { "type": "string", "const": "instruction" },
103
+ "ask": { "type": "string" }
104
+ }
105
+ },
106
+ "verify": {
107
+ "oneOf": [
108
+ { "$ref": "#/$defs/verifyCommand" },
109
+ { "$ref": "#/$defs/verifyAssertion" },
110
+ { "$ref": "#/$defs/verifyInstruction" }
111
+ ]
112
+ },
113
+ "scenario": {
114
+ "type": "object",
115
+ "required": ["id", "given", "when", "then", "verified_by", "verify"],
116
+ "additionalProperties": false,
117
+ "properties": {
118
+ "id": { "type": "string" },
119
+ "given": { "type": "string" },
120
+ "when": { "type": "string" },
121
+ "then": { "type": "string" },
122
+ "verified_by": {
123
+ "type": "string",
124
+ "enum": ["machine", "agent", "human"],
125
+ "description": "WHO verifies: machine=automated command, agent=AI assertion, human=manual inspection"
126
+ },
127
+ "execution_env": {
128
+ "type": "string",
129
+ "enum": ["host", "sandbox", "ci"],
130
+ "description": "WHERE verification runs: host=local, sandbox=docker/container, ci=CI pipeline"
131
+ },
132
+ "verify": { "$ref": "#/$defs/verify" },
133
+ "status": {
134
+ "type": "string",
135
+ "enum": ["pass", "fail", "pending", "skipped"],
136
+ "default": "pending",
137
+ "description": "Verification result for this scenario"
138
+ },
139
+ "verified_by_task": {
140
+ "oneOf": [
141
+ { "type": "string" },
142
+ { "type": "null" }
143
+ ],
144
+ "default": null,
145
+ "description": "The task ID that verified this scenario (e.g. 'T1' or 'T_SV1')"
146
+ }
147
+ },
148
+ "allOf": [
149
+ {
150
+ "if": {
151
+ "properties": { "verified_by": { "const": "machine" } },
152
+ "required": ["verified_by"]
153
+ },
154
+ "then": {
155
+ "properties": {
156
+ "verify": { "$ref": "#/$defs/verifyCommand" }
157
+ }
158
+ }
159
+ },
160
+ {
161
+ "if": {
162
+ "properties": { "verified_by": { "const": "agent" } },
163
+ "required": ["verified_by"]
164
+ },
165
+ "then": {
166
+ "properties": {
167
+ "verify": { "$ref": "#/$defs/verifyAssertion" }
168
+ }
169
+ }
170
+ },
171
+ {
172
+ "if": {
173
+ "properties": { "verified_by": { "const": "human" } },
174
+ "required": ["verified_by"]
175
+ },
176
+ "then": {
177
+ "properties": {
178
+ "verify": { "$ref": "#/$defs/verifyInstruction" }
179
+ }
180
+ }
181
+ }
182
+ ]
183
+ },
184
+ "meta": {
185
+ "type": "object",
186
+ "required": ["name", "goal"],
187
+ "additionalProperties": false,
188
+ "properties": {
189
+ "name": { "type": "string" },
190
+ "goal": { "type": "string" },
191
+ "non_goals": {
192
+ "type": "array",
193
+ "items": { "type": "string" },
194
+ "description": "What this project is explicitly NOT trying to achieve (strategic scope exclusion)"
195
+ },
196
+ "deliverables": {
197
+ "type": "array",
198
+ "items": {
199
+ "type": "object",
200
+ "required": ["path", "description"],
201
+ "additionalProperties": false,
202
+ "properties": {
203
+ "path": { "type": "string" },
204
+ "description": { "type": "string" }
205
+ }
206
+ }
207
+ },
208
+ "mode": {
209
+ "type": "object",
210
+ "additionalProperties": false,
211
+ "properties": {
212
+ "depth": {
213
+ "type": "string",
214
+ "enum": ["quick", "standard"]
215
+ },
216
+ "interaction": {
217
+ "type": "string",
218
+ "enum": ["interactive", "autopilot"]
219
+ }
220
+ }
221
+ },
222
+ "derived_from": { "type": "string" },
223
+ "created_at": { "type": "string" },
224
+ "updated_at": { "type": "string" },
225
+ "approved_by": { "type": "string" },
226
+ "approved_at": { "type": "string" },
227
+ "type": {
228
+ "type": "string",
229
+ "enum": ["dev", "plain"],
230
+ "description": "Spec type: dev = developer task spec (default), plain = lightweight plain task spec"
231
+ },
232
+ "schema_version": {
233
+ "type": "string",
234
+ "enum": ["v4", "v5"],
235
+ "description": "Schema version for validation routing. Defaults to v5 if omitted."
236
+ }
237
+ }
238
+ },
239
+ "context": {
240
+ "type": "object",
241
+ "additionalProperties": false,
242
+ "properties": {
243
+ "request": { "type": "string" },
244
+ "confirmed_goal": {
245
+ "type": "string",
246
+ "description": "The confirmed goal statement from the mirror phase. Set after user confirms the mirrored interpretation."
247
+ },
248
+ "interview": {
249
+ "type": "array",
250
+ "items": {
251
+ "type": "object",
252
+ "required": ["topic", "decision"],
253
+ "additionalProperties": false,
254
+ "properties": {
255
+ "topic": { "type": "string" },
256
+ "decision": { "type": "string" }
257
+ }
258
+ }
259
+ },
260
+ "research": {
261
+ "oneOf": [
262
+ { "type": "string" },
263
+ { "$ref": "#/$defs/researchFindings" }
264
+ ]
265
+ },
266
+ "assumptions": {
267
+ "type": "array",
268
+ "items": {
269
+ "type": "object",
270
+ "required": ["id", "belief", "if_wrong", "impact"],
271
+ "additionalProperties": false,
272
+ "properties": {
273
+ "id": { "type": "string" },
274
+ "belief": { "type": "string" },
275
+ "if_wrong": { "type": "string" },
276
+ "impact": {
277
+ "type": "string",
278
+ "enum": ["minor", "major", "critical"]
279
+ }
280
+ }
281
+ }
282
+ },
283
+ "decisions": {
284
+ "type": "array",
285
+ "items": {
286
+ "type": "object",
287
+ "required": ["id", "decision", "rationale"],
288
+ "additionalProperties": false,
289
+ "properties": {
290
+ "id": { "type": "string" },
291
+ "decision": { "type": "string" },
292
+ "rationale": { "type": "string" },
293
+ "alternatives_rejected": {
294
+ "type": "array",
295
+ "items": {
296
+ "type": "object",
297
+ "required": ["option", "reason"],
298
+ "additionalProperties": false,
299
+ "properties": {
300
+ "option": { "type": "string" },
301
+ "reason": { "type": "string" }
302
+ }
303
+ }
304
+ }
305
+ }
306
+ }
307
+ },
308
+ "known_gaps": {
309
+ "type": "array",
310
+ "items": {
311
+ "type": "object",
312
+ "required": ["gap", "severity", "mitigation"],
313
+ "additionalProperties": false,
314
+ "properties": {
315
+ "gap": { "type": "string" },
316
+ "severity": {
317
+ "type": "string",
318
+ "enum": ["low", "medium", "high", "critical"]
319
+ },
320
+ "mitigation": { "type": "string" },
321
+ "auto_merged": {
322
+ "type": "boolean",
323
+ "description": "True when this gap was auto-merged (medium/low severity) without asking the user"
324
+ }
325
+ }
326
+ }
327
+ }
328
+ }
329
+ },
330
+ "requirement": {
331
+ "type": "object",
332
+ "required": ["id", "behavior", "priority", "scenarios"],
333
+ "additionalProperties": false,
334
+ "properties": {
335
+ "id": { "type": "string" },
336
+ "behavior": { "type": "string" },
337
+ "priority": {
338
+ "type": "integer",
339
+ "minimum": 1,
340
+ "maximum": 5
341
+ },
342
+ "scenarios": {
343
+ "type": "array",
344
+ "items": { "$ref": "#/$defs/scenario" }
345
+ }
346
+ }
347
+ },
348
+ "checkpoint": {
349
+ "type": "object",
350
+ "required": ["enabled"],
351
+ "additionalProperties": false,
352
+ "properties": {
353
+ "enabled": { "type": "boolean" },
354
+ "message": { "type": "string" },
355
+ "condition": {
356
+ "type": "string",
357
+ "enum": ["always", "on_fulfill", "manual"]
358
+ }
359
+ }
360
+ },
361
+ "derivedFrom": {
362
+ "type": "object",
363
+ "required": ["parent", "trigger"],
364
+ "additionalProperties": false,
365
+ "description": "Provenance record linking a derived task back to its planned parent",
366
+ "properties": {
367
+ "parent": {
368
+ "type": "string",
369
+ "description": "ID of the planned parent task (depth-1 only)"
370
+ },
371
+ "source": {
372
+ "type": "string",
373
+ "description": "Source context that triggered the derivation (e.g. file path, agent name)"
374
+ },
375
+ "trigger": {
376
+ "type": "string",
377
+ "enum": ["adapt", "retry", "code_review", "final_verify"],
378
+ "description": "Event that caused this task to be derived"
379
+ },
380
+ "reason": {
381
+ "type": "string",
382
+ "description": "Human-readable explanation for the derivation"
383
+ }
384
+ }
385
+ },
386
+ "taskCheck": {
387
+ "type": "object",
388
+ "required": ["type", "run"],
389
+ "additionalProperties": false,
390
+ "description": "A static/build/lint/format check to run as part of task acceptance",
391
+ "properties": {
392
+ "type": {
393
+ "type": "string",
394
+ "enum": ["static", "build", "lint", "format"],
395
+ "description": "Category of check: static=type check, build=compilation, lint=linting, format=formatting"
396
+ },
397
+ "run": {
398
+ "type": "string",
399
+ "description": "Shell command to execute for this check"
400
+ }
401
+ }
402
+ },
403
+ "taskAcceptanceCriteria": {
404
+ "type": "object",
405
+ "required": ["scenarios", "checks"],
406
+ "additionalProperties": false,
407
+ "description": "v5: AC is expressed as scenario references + automated checks. scenarios[] references requirements[].scenarios[].id. checks[] are runnable static/build/lint/format commands.",
408
+ "properties": {
409
+ "scenarios": {
410
+ "type": "array",
411
+ "description": "List of scenario IDs from requirements[].scenarios[].id that this task fulfills",
412
+ "items": { "type": "string" }
413
+ },
414
+ "checks": {
415
+ "type": "array",
416
+ "description": "Automated checks to verify the task (static, build, lint, format)",
417
+ "items": { "$ref": "#/$defs/taskCheck" }
418
+ }
419
+ }
420
+ },
421
+ "task": {
422
+ "type": "object",
423
+ "required": ["id", "action", "type"],
424
+ "additionalProperties": false,
425
+ "properties": {
426
+ "id": { "type": "string" },
427
+ "action": { "type": "string" },
428
+ "type": {
429
+ "type": "string",
430
+ "enum": ["work", "verification"]
431
+ },
432
+ "origin": {
433
+ "type": "string",
434
+ "enum": ["planned", "derived", "adapted"],
435
+ "default": "planned",
436
+ "description": "How this task was created: planned=authored in spec, derived=created at runtime via spec derive, adapted=manually adjusted from a derived task"
437
+ },
438
+ "derived_from": {
439
+ "$ref": "#/$defs/derivedFrom",
440
+ "description": "Provenance record — required when origin is derived or adapted"
441
+ },
442
+ "risk": {
443
+ "type": "string",
444
+ "enum": ["low", "medium", "high"]
445
+ },
446
+ "file_scope": {
447
+ "type": "array",
448
+ "items": { "type": "string" }
449
+ },
450
+ "fulfills": {
451
+ "type": "array",
452
+ "items": { "type": "string" }
453
+ },
454
+ "depends_on": {
455
+ "type": "array",
456
+ "items": { "type": "string" }
457
+ },
458
+ "steps": {
459
+ "type": "array",
460
+ "description": "Task steps — either plain strings (backward compat) or structured objects with done tracking",
461
+ "items": {
462
+ "oneOf": [
463
+ { "type": "string" },
464
+ {
465
+ "type": "object",
466
+ "required": ["text"],
467
+ "additionalProperties": false,
468
+ "properties": {
469
+ "text": { "type": "string" },
470
+ "done": { "type": "boolean", "default": false }
471
+ }
472
+ }
473
+ ]
474
+ }
475
+ },
476
+ "references": {
477
+ "type": "array",
478
+ "items": { "$ref": "#/$defs/reference" }
479
+ },
480
+ "inputs": {
481
+ "type": "array",
482
+ "items": {
483
+ "type": "object",
484
+ "required": ["from_task", "artifact"],
485
+ "additionalProperties": false,
486
+ "properties": {
487
+ "from_task": { "type": "string" },
488
+ "artifact": { "type": "string" }
489
+ }
490
+ }
491
+ },
492
+ "outputs": {
493
+ "type": "array",
494
+ "items": {
495
+ "type": "object",
496
+ "required": ["id", "path"],
497
+ "additionalProperties": false,
498
+ "properties": {
499
+ "id": { "type": "string" },
500
+ "path": { "type": "string" }
501
+ }
502
+ }
503
+ },
504
+ "task_constraints": {
505
+ "type": "array",
506
+ "items": { "$ref": "#/$defs/taskConstraint" }
507
+ },
508
+ "checkpoint": {
509
+ "oneOf": [
510
+ { "$ref": "#/$defs/checkpoint" },
511
+ { "type": "null" }
512
+ ]
513
+ },
514
+ "status": {
515
+ "type": "string",
516
+ "enum": ["pending", "in_progress", "done"],
517
+ "default": "pending"
518
+ },
519
+ "started_at": { "type": "string" },
520
+ "completed_at": { "type": "string" },
521
+ "summary": { "type": "string" },
522
+ "required_tools": {
523
+ "type": "array",
524
+ "items": { "type": "string" }
525
+ },
526
+ "must_not_do": {
527
+ "type": "array",
528
+ "items": { "type": "string" }
529
+ },
530
+ "acceptance_criteria": { "$ref": "#/$defs/taskAcceptanceCriteria" },
531
+ "tool": { "type": "string" },
532
+ "args": { "type": "string" }
533
+ },
534
+ "allOf": [
535
+ {
536
+ "if": { "properties": { "origin": { "enum": ["derived", "adapted"] } }, "required": ["origin"] },
537
+ "then": { "required": ["derived_from"] }
538
+ }
539
+ ]
540
+ },
541
+ "historyEntry": {
542
+ "type": "object",
543
+ "required": ["ts", "type"],
544
+ "additionalProperties": false,
545
+ "properties": {
546
+ "ts": { "type": "string" },
547
+ "type": {
548
+ "type": "string",
549
+ "enum": ["spec_created", "task_start", "task_done", "tasks_changed", "spec_updated"]
550
+ },
551
+ "task": { "type": "string" },
552
+ "summary": { "type": "string" },
553
+ "detail": { "type": "string" }
554
+ }
555
+ },
556
+ "verificationSummary": {
557
+ "type": "object",
558
+ "additionalProperties": false,
559
+ "properties": {
560
+ "agent_items": {
561
+ "type": "array",
562
+ "items": {
563
+ "type": "object",
564
+ "required": ["id", "criterion", "method"],
565
+ "additionalProperties": false,
566
+ "properties": {
567
+ "id": { "type": "string" },
568
+ "criterion": { "type": "string" },
569
+ "method": { "type": "string" },
570
+ "related_task": { "type": "string" }
571
+ }
572
+ }
573
+ },
574
+ "human_items": {
575
+ "type": "array",
576
+ "items": {
577
+ "type": "object",
578
+ "required": ["id", "criterion", "reason"],
579
+ "additionalProperties": false,
580
+ "properties": {
581
+ "id": { "type": "string" },
582
+ "criterion": { "type": "string" },
583
+ "reason": { "type": "string" },
584
+ "review_material": { "type": "string" }
585
+ }
586
+ }
587
+ },
588
+ "sandbox_items": {
589
+ "type": "array",
590
+ "items": {
591
+ "type": "object",
592
+ "required": ["id", "scenario", "agent", "method"],
593
+ "additionalProperties": false,
594
+ "properties": {
595
+ "id": { "type": "string" },
596
+ "scenario": { "type": "string" },
597
+ "agent": { "type": "string" },
598
+ "method": { "type": "string" }
599
+ }
600
+ }
601
+ },
602
+ "gaps": {
603
+ "type": "array",
604
+ "items": { "type": "string" }
605
+ }
606
+ }
607
+ },
608
+ "externalDependencies": {
609
+ "description": "Human-only tasks that the agent cannot perform (infra setup, API keys, deployment, etc.). If automatable, put it in the Task DAG instead.",
610
+ "type": "object",
611
+ "additionalProperties": false,
612
+ "properties": {
613
+ "pre_work": {
614
+ "description": "Human actions that must be completed BEFORE execution starts.",
615
+ "type": "array",
616
+ "items": {
617
+ "type": "object",
618
+ "required": ["dependency", "action"],
619
+ "additionalProperties": false,
620
+ "properties": {
621
+ "id": { "type": "string", "description": "Optional identifier (e.g., PW-1)" },
622
+ "dependency": { "type": "string" },
623
+ "action": { "type": "string", "description": "What the human must do" },
624
+ "command": { "type": "string", "description": "Hint command for the human (not agent-executed)" },
625
+ "blocking": { "type": "boolean", "description": "If true, execution halts until human confirms completion" }
626
+ }
627
+ }
628
+ },
629
+ "post_work": {
630
+ "description": "Human actions to perform AFTER execution completes.",
631
+ "type": "array",
632
+ "items": {
633
+ "type": "object",
634
+ "required": ["dependency", "action"],
635
+ "additionalProperties": false,
636
+ "properties": {
637
+ "id": { "type": "string", "description": "Optional identifier (e.g., POW-1)" },
638
+ "dependency": { "type": "string" },
639
+ "action": { "type": "string", "description": "What the human must do" },
640
+ "command": { "type": "string", "description": "Hint command for the human (not agent-executed)" }
641
+ }
642
+ }
643
+ }
644
+ }
645
+ },
646
+ "researchFindings": {
647
+ "type": "object",
648
+ "additionalProperties": false,
649
+ "properties": {
650
+ "summary": {
651
+ "type": "string",
652
+ "description": "High-level summary of exploration results"
653
+ },
654
+ "patterns": {
655
+ "type": "array",
656
+ "description": "Existing code patterns discovered (file:line format)",
657
+ "items": {
658
+ "type": "object",
659
+ "required": ["path", "description"],
660
+ "additionalProperties": false,
661
+ "properties": {
662
+ "path": { "type": "string" },
663
+ "start_line": { "type": "integer", "minimum": 1 },
664
+ "end_line": { "type": "integer", "minimum": 1 },
665
+ "description": { "type": "string" }
666
+ }
667
+ }
668
+ },
669
+ "structure": {
670
+ "type": "array",
671
+ "description": "Key directory/file structure paths",
672
+ "items": { "type": "string" }
673
+ },
674
+ "commands": {
675
+ "type": "object",
676
+ "description": "Project commands discovered",
677
+ "additionalProperties": false,
678
+ "properties": {
679
+ "typecheck": { "type": "string" },
680
+ "lint": { "type": "string" },
681
+ "test": { "type": "string" },
682
+ "build": { "type": "string" }
683
+ }
684
+ },
685
+ "documentation": {
686
+ "type": "array",
687
+ "description": "Internal docs findings (ADRs, conventions, constraints)",
688
+ "items": {
689
+ "type": "object",
690
+ "required": ["path", "description"],
691
+ "additionalProperties": false,
692
+ "properties": {
693
+ "path": { "type": "string" },
694
+ "line": { "type": "integer", "minimum": 1 },
695
+ "description": { "type": "string" }
696
+ }
697
+ }
698
+ },
699
+ "ux_review": {
700
+ "type": "object",
701
+ "description": "UX impact assessment from ux-reviewer agent",
702
+ "additionalProperties": false,
703
+ "properties": {
704
+ "current_flow": { "type": "string" },
705
+ "impact": { "type": "string" },
706
+ "recommendations": {
707
+ "type": "array",
708
+ "items": { "type": "string" }
709
+ },
710
+ "must_not_do": {
711
+ "type": "array",
712
+ "items": { "type": "string" }
713
+ }
714
+ }
715
+ }
716
+ }
717
+ },
718
+ "constraint": {
719
+ "type": "object",
720
+ "required": ["id", "type", "rule", "verified_by", "verify"],
721
+ "additionalProperties": false,
722
+ "properties": {
723
+ "id": { "type": "string" },
724
+ "type": {
725
+ "type": "string",
726
+ "enum": ["must_not_do", "preserve"]
727
+ },
728
+ "rule": { "type": "string" },
729
+ "verified_by": {
730
+ "type": "string",
731
+ "enum": ["machine", "agent", "human"]
732
+ },
733
+ "verify": { "$ref": "#/$defs/verify" }
734
+ },
735
+ "allOf": [
736
+ {
737
+ "if": {
738
+ "properties": { "verified_by": { "const": "machine" } },
739
+ "required": ["verified_by"]
740
+ },
741
+ "then": {
742
+ "properties": {
743
+ "verify": { "$ref": "#/$defs/verifyCommand" }
744
+ }
745
+ }
746
+ },
747
+ {
748
+ "if": {
749
+ "properties": { "verified_by": { "const": "agent" } },
750
+ "required": ["verified_by"]
751
+ },
752
+ "then": {
753
+ "properties": {
754
+ "verify": { "$ref": "#/$defs/verifyAssertion" }
755
+ }
756
+ }
757
+ },
758
+ {
759
+ "if": {
760
+ "properties": { "verified_by": { "const": "human" } },
761
+ "required": ["verified_by"]
762
+ },
763
+ "then": {
764
+ "properties": {
765
+ "verify": { "$ref": "#/$defs/verifyInstruction" }
766
+ }
767
+ }
768
+ }
769
+ ]
770
+ }
771
+ }
772
+ }