@cygnuxlabs/tracekit 0.0.0-stage → 1.2.2

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 (40) hide show
  1. package/README.md +294 -2
  2. package/bin/tracekit.mjs +30 -0
  3. package/dist/v1.d.ts +97 -0
  4. package/dist/v1.js +535 -0
  5. package/dist/v2/adapters/claude-agent-sdk.d.ts +45 -0
  6. package/dist/v2/adapters/claude-agent-sdk.js +142 -0
  7. package/dist/v2/adapters/gate.d.ts +62 -0
  8. package/dist/v2/adapters/gate.js +195 -0
  9. package/dist/v2/adapters/openai-agents.d.ts +85 -0
  10. package/dist/v2/adapters/openai-agents.js +114 -0
  11. package/dist/v2/adapters/vercel-ai.d.ts +51 -0
  12. package/dist/v2/adapters/vercel-ai.js +132 -0
  13. package/dist/v2/client.d.ts +159 -0
  14. package/dist/v2/client.js +749 -0
  15. package/dist/v2/executor.d.ts +49 -0
  16. package/dist/v2/executor.js +57 -0
  17. package/dist/v2/jcs.d.ts +5 -0
  18. package/dist/v2/jcs.js +12 -0
  19. package/dist/v2/launcher.d.ts +10 -0
  20. package/dist/v2/launcher.js +50 -0
  21. package/dist/v2/rpc_schema.d.ts +3 -0
  22. package/dist/v2/rpc_schema.js +43 -0
  23. package/dist/v2/validate.d.ts +6 -0
  24. package/dist/v2/validate.js +70 -0
  25. package/dist/verify/cli.d.ts +1 -0
  26. package/dist/verify/cli.js +46 -0
  27. package/dist/verify/detect.d.ts +41 -0
  28. package/dist/verify/detect.js +289 -0
  29. package/dist/verify/index.d.ts +34 -0
  30. package/dist/verify/index.js +930 -0
  31. package/dist/verify/jcs.d.ts +19 -0
  32. package/dist/verify/jcs.js +154 -0
  33. package/dist/verify/primitives.d.ts +62 -0
  34. package/dist/verify/primitives.js +298 -0
  35. package/dist/verify/schema.d.ts +11 -0
  36. package/dist/verify/schema.js +98 -0
  37. package/dist/verify/tracekit.event.v2.json +4588 -0
  38. package/dist/verify/zip.d.ts +17 -0
  39. package/dist/verify/zip.js +145 -0
  40. package/package.json +42 -4
@@ -0,0 +1,4588 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/Cygnux-Labs/Tracekit/schema/tracekit.event.v2.json",
4
+ "title": "Tracekit event v2",
5
+ "description": "One event in a format v2 record log. Additive over tracekit.event.v1: new optional fields and types, and bounds on every string and array. Validated with full-match ASCII patterns.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "id",
11
+ "seq",
12
+ "prev_hash",
13
+ "ts",
14
+ "run_id",
15
+ "agent_id",
16
+ "parent_id",
17
+ "source",
18
+ "type",
19
+ "data",
20
+ "log_id",
21
+ "tenant",
22
+ "run_seq",
23
+ "run_prev_hash"
24
+ ],
25
+ "properties": {
26
+ "schema_version": {
27
+ "const": "tracekit.event.v2"
28
+ },
29
+ "id": {
30
+ "type": "string",
31
+ "pattern": "^[0-9a-f]{32}$",
32
+ "description": "Random 128-bit id, hex.",
33
+ "maxLength": 4096
34
+ },
35
+ "seq": {
36
+ "type": "integer",
37
+ "minimum": 0,
38
+ "maximum": 9007199254740991,
39
+ "description": "Signer's monotonic counter. Assigned by tracekitd, never by the client."
40
+ },
41
+ "prev_hash": {
42
+ "$ref": "#/$defs/hash",
43
+ "description": "Hash of the previous record in this log; sha256: and 64 zeros for seq 0."
44
+ },
45
+ "ts": {
46
+ "type": "string",
47
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
48
+ "description": "Client-reported time, UTC, microseconds.",
49
+ "maxLength": 4096
50
+ },
51
+ "ts_signed": {
52
+ "type": "string",
53
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
54
+ "description": "Time the signer accepted the event.",
55
+ "maxLength": 4096
56
+ },
57
+ "run_id": {
58
+ "type": "string",
59
+ "minLength": 1,
60
+ "maxLength": 200
61
+ },
62
+ "agent_id": {
63
+ "type": "string",
64
+ "minLength": 1,
65
+ "maxLength": 200,
66
+ "description": "\"main\" for the top-level agent, otherwise the harness's sub-agent id."
67
+ },
68
+ "parent_id": {
69
+ "type": [
70
+ "string",
71
+ "null"
72
+ ],
73
+ "maxLength": 200,
74
+ "description": "agent_id of the spawning agent, or null."
75
+ },
76
+ "source": {
77
+ "enum": [
78
+ "hook",
79
+ "proxy",
80
+ "transcript",
81
+ "signer",
82
+ "sdk",
83
+ "migrated",
84
+ "import",
85
+ "gateway"
86
+ ],
87
+ "description": "Capture path. transcript = harness-reported, lower trust; import = received over OTLP, or another system's decision (decision_import) (tier T3): receipt only; gateway = model.exchange recorded by the LLM gateway, or a tool call (policy.decision, approval.request, tool.result) or an input (input.observed) the MCP gateway or a tool executor decided, ran or received for its client (tier T2)."
88
+ },
89
+ "type": {
90
+ "enum": [
91
+ "run.start",
92
+ "run.end",
93
+ "tool.call",
94
+ "policy.decision",
95
+ "approval",
96
+ "tool.result",
97
+ "error",
98
+ "review",
99
+ "trace.tamper",
100
+ "capture.gap",
101
+ "checkpoint",
102
+ "user.prompt",
103
+ "model.message",
104
+ "model.exchange",
105
+ "run.registered",
106
+ "run.closing",
107
+ "run.final",
108
+ "approval.request",
109
+ "approval.consumed",
110
+ "approval.expired",
111
+ "approval.refused",
112
+ "approval.binding_mismatch",
113
+ "approval.abandoned",
114
+ "approval.escalated",
115
+ "approval.revoked",
116
+ "approval.suggested",
117
+ "approval.agents",
118
+ "input.observed",
119
+ "state.write",
120
+ "signer.epoch",
121
+ "key.retire",
122
+ "log.closed",
123
+ "reconcile.hook_missing",
124
+ "reconcile.fabricated",
125
+ "reconcile.args_mismatch",
126
+ "reconcile.result_without_call",
127
+ "reconcile.unexplained_effect",
128
+ "reconcile.args_unparseable",
129
+ "refusal.summary",
130
+ "policy.external",
131
+ "content.accessed",
132
+ "content.erased",
133
+ "why.finding",
134
+ "run.child",
135
+ "incident.opened",
136
+ "incident.updated",
137
+ "incident.capped",
138
+ "run.held",
139
+ "run.resumed",
140
+ "run.quarantined",
141
+ "incident.resolved",
142
+ "incident.response",
143
+ "identity.suspension",
144
+ "effect.observed"
145
+ ]
146
+ },
147
+ "data": {
148
+ "type": "object"
149
+ },
150
+ "transcript": {
151
+ "type": "object",
152
+ "additionalProperties": false,
153
+ "required": [
154
+ "path",
155
+ "length",
156
+ "hash"
157
+ ],
158
+ "description": "C2: what the hook read of the harness transcript at this point (prefix hash). Lets the signer detect later edits, truncation or deletion.",
159
+ "properties": {
160
+ "path": {
161
+ "type": "string",
162
+ "maxLength": 4096
163
+ },
164
+ "length": {
165
+ "type": "integer",
166
+ "minimum": 0
167
+ },
168
+ "hash": {
169
+ "$ref": "#/$defs/commitment"
170
+ },
171
+ "prefix_length": {
172
+ "type": [
173
+ "integer",
174
+ "null"
175
+ ],
176
+ "minimum": 0,
177
+ "description": "Length the signer last acknowledged for this path."
178
+ },
179
+ "prefix_hash": {
180
+ "oneOf": [
181
+ {
182
+ "$ref": "#/$defs/commitment"
183
+ },
184
+ {
185
+ "type": "null"
186
+ }
187
+ ],
188
+ "description": "Hash of the first prefix_length bytes as read now."
189
+ },
190
+ "missing": {
191
+ "type": "boolean"
192
+ }
193
+ }
194
+ },
195
+ "log_id": {
196
+ "type": "string",
197
+ "pattern": "^[0-9a-f]{32}$",
198
+ "description": "The record log this event belongs to.",
199
+ "maxLength": 4096
200
+ },
201
+ "tenant": {
202
+ "$ref": "#/$defs/id"
203
+ },
204
+ "tenant_attested": {
205
+ "type": "boolean"
206
+ },
207
+ "principal": {
208
+ "type": "string",
209
+ "maxLength": 256
210
+ },
211
+ "principal_attested": {
212
+ "type": "boolean"
213
+ },
214
+ "request_id": {
215
+ "$ref": "#/$defs/id"
216
+ },
217
+ "stream": {
218
+ "$ref": "#/$defs/id"
219
+ },
220
+ "client_seq": {
221
+ "type": "integer",
222
+ "minimum": 0,
223
+ "maximum": 9007199254740991
224
+ },
225
+ "tool_call_id": {
226
+ "$ref": "#/$defs/id"
227
+ },
228
+ "attempt": {
229
+ "type": "integer",
230
+ "minimum": 0,
231
+ "maximum": 9007199254740991
232
+ },
233
+ "step": {
234
+ "type": "integer",
235
+ "minimum": 0,
236
+ "maximum": 9007199254740991
237
+ },
238
+ "run_seq": {
239
+ "type": "integer",
240
+ "minimum": 0,
241
+ "maximum": 9007199254740991
242
+ },
243
+ "run_prev_hash": {
244
+ "$ref": "#/$defs/hash"
245
+ },
246
+ "capture_layer": {
247
+ "enum": [
248
+ "L1",
249
+ "L2",
250
+ "L3",
251
+ "L4",
252
+ "L5",
253
+ "L6"
254
+ ]
255
+ },
256
+ "tier": {
257
+ "enum": [
258
+ "T1",
259
+ "T2",
260
+ "T3"
261
+ ]
262
+ },
263
+ "span_id": {
264
+ "type": "string",
265
+ "pattern": "^[0-9a-f]{16}$",
266
+ "maxLength": 16,
267
+ "description": "source import: the OpenTelemetry span the record was imported from"
268
+ },
269
+ "args_commitment": {
270
+ "type": "string",
271
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
272
+ "maxLength": 4096
273
+ },
274
+ "args_source": {
275
+ "enum": [
276
+ "raw",
277
+ "parsed",
278
+ "coerced"
279
+ ]
280
+ },
281
+ "engine": {
282
+ "type": "string",
283
+ "maxLength": 128,
284
+ "pattern": "^[A-Za-z0-9._-]+@[A-Za-z0-9._+-]+$",
285
+ "description": "Policy engine id@version."
286
+ }
287
+ },
288
+ "allOf": [
289
+ {
290
+ "if": {
291
+ "properties": {
292
+ "type": {
293
+ "const": "run.start"
294
+ }
295
+ }
296
+ },
297
+ "then": {
298
+ "properties": {
299
+ "data": {
300
+ "$ref": "#/$defs/run_start"
301
+ }
302
+ }
303
+ }
304
+ },
305
+ {
306
+ "if": {
307
+ "properties": {
308
+ "type": {
309
+ "const": "run.end"
310
+ }
311
+ }
312
+ },
313
+ "then": {
314
+ "properties": {
315
+ "data": {
316
+ "$ref": "#/$defs/run_end"
317
+ }
318
+ }
319
+ }
320
+ },
321
+ {
322
+ "if": {
323
+ "properties": {
324
+ "type": {
325
+ "const": "tool.call"
326
+ }
327
+ }
328
+ },
329
+ "then": {
330
+ "properties": {
331
+ "data": {
332
+ "$ref": "#/$defs/tool_call"
333
+ }
334
+ }
335
+ }
336
+ },
337
+ {
338
+ "if": {
339
+ "properties": {
340
+ "type": {
341
+ "const": "policy.decision"
342
+ }
343
+ }
344
+ },
345
+ "then": {
346
+ "properties": {
347
+ "data": {
348
+ "$ref": "#/$defs/policy_decision"
349
+ }
350
+ }
351
+ }
352
+ },
353
+ {
354
+ "if": {
355
+ "properties": {
356
+ "type": {
357
+ "const": "approval"
358
+ }
359
+ }
360
+ },
361
+ "then": {
362
+ "properties": {
363
+ "data": {
364
+ "$ref": "#/$defs/approval"
365
+ }
366
+ }
367
+ }
368
+ },
369
+ {
370
+ "if": {
371
+ "properties": {
372
+ "type": {
373
+ "const": "tool.result"
374
+ }
375
+ }
376
+ },
377
+ "then": {
378
+ "properties": {
379
+ "data": {
380
+ "$ref": "#/$defs/tool_result"
381
+ }
382
+ }
383
+ }
384
+ },
385
+ {
386
+ "if": {
387
+ "properties": {
388
+ "type": {
389
+ "const": "error"
390
+ }
391
+ }
392
+ },
393
+ "then": {
394
+ "properties": {
395
+ "data": {
396
+ "$ref": "#/$defs/error"
397
+ }
398
+ }
399
+ }
400
+ },
401
+ {
402
+ "if": {
403
+ "properties": {
404
+ "type": {
405
+ "const": "review"
406
+ }
407
+ }
408
+ },
409
+ "then": {
410
+ "properties": {
411
+ "data": {
412
+ "$ref": "#/$defs/review"
413
+ }
414
+ }
415
+ }
416
+ },
417
+ {
418
+ "if": {
419
+ "properties": {
420
+ "type": {
421
+ "const": "trace.tamper"
422
+ }
423
+ }
424
+ },
425
+ "then": {
426
+ "properties": {
427
+ "data": {
428
+ "$ref": "#/$defs/trace_tamper"
429
+ }
430
+ }
431
+ }
432
+ },
433
+ {
434
+ "if": {
435
+ "properties": {
436
+ "type": {
437
+ "const": "capture.gap"
438
+ }
439
+ }
440
+ },
441
+ "then": {
442
+ "properties": {
443
+ "data": {
444
+ "$ref": "#/$defs/capture_gap"
445
+ }
446
+ }
447
+ }
448
+ },
449
+ {
450
+ "if": {
451
+ "properties": {
452
+ "type": {
453
+ "const": "checkpoint"
454
+ }
455
+ }
456
+ },
457
+ "then": {
458
+ "properties": {
459
+ "data": {
460
+ "$ref": "#/$defs/checkpoint"
461
+ }
462
+ }
463
+ }
464
+ },
465
+ {
466
+ "if": {
467
+ "properties": {
468
+ "type": {
469
+ "const": "user.prompt"
470
+ }
471
+ }
472
+ },
473
+ "then": {
474
+ "properties": {
475
+ "data": {
476
+ "$ref": "#/$defs/user_prompt"
477
+ }
478
+ }
479
+ }
480
+ },
481
+ {
482
+ "if": {
483
+ "properties": {
484
+ "type": {
485
+ "const": "model.message"
486
+ }
487
+ }
488
+ },
489
+ "then": {
490
+ "properties": {
491
+ "data": {
492
+ "$ref": "#/$defs/model_message"
493
+ }
494
+ }
495
+ }
496
+ },
497
+ {
498
+ "if": {
499
+ "properties": {
500
+ "type": {
501
+ "const": "model.exchange"
502
+ }
503
+ }
504
+ },
505
+ "then": {
506
+ "properties": {
507
+ "data": {
508
+ "$ref": "#/$defs/model_exchange"
509
+ }
510
+ }
511
+ }
512
+ },
513
+ {
514
+ "if": {
515
+ "properties": {
516
+ "type": {
517
+ "const": "run.registered"
518
+ }
519
+ }
520
+ },
521
+ "then": {
522
+ "properties": {
523
+ "data": {
524
+ "$ref": "#/$defs/run_registered"
525
+ }
526
+ }
527
+ }
528
+ },
529
+ {
530
+ "if": {
531
+ "properties": {
532
+ "type": {
533
+ "const": "run.closing"
534
+ }
535
+ }
536
+ },
537
+ "then": {
538
+ "properties": {
539
+ "data": {
540
+ "$ref": "#/$defs/run_closing"
541
+ }
542
+ }
543
+ }
544
+ },
545
+ {
546
+ "if": {
547
+ "properties": {
548
+ "type": {
549
+ "const": "run.final"
550
+ }
551
+ }
552
+ },
553
+ "then": {
554
+ "properties": {
555
+ "data": {
556
+ "$ref": "#/$defs/run_final"
557
+ }
558
+ }
559
+ }
560
+ },
561
+ {
562
+ "if": {
563
+ "properties": {
564
+ "type": {
565
+ "const": "approval.request"
566
+ }
567
+ }
568
+ },
569
+ "then": {
570
+ "properties": {
571
+ "data": {
572
+ "$ref": "#/$defs/approval_request"
573
+ }
574
+ }
575
+ }
576
+ },
577
+ {
578
+ "if": {
579
+ "properties": {
580
+ "type": {
581
+ "const": "approval.consumed"
582
+ }
583
+ }
584
+ },
585
+ "then": {
586
+ "properties": {
587
+ "data": {
588
+ "$ref": "#/$defs/approval_consumed"
589
+ }
590
+ }
591
+ }
592
+ },
593
+ {
594
+ "if": {
595
+ "properties": {
596
+ "type": {
597
+ "const": "approval.expired"
598
+ }
599
+ }
600
+ },
601
+ "then": {
602
+ "properties": {
603
+ "data": {
604
+ "$ref": "#/$defs/approval_expired"
605
+ }
606
+ }
607
+ }
608
+ },
609
+ {
610
+ "if": {
611
+ "properties": {
612
+ "type": {
613
+ "const": "approval.refused"
614
+ }
615
+ }
616
+ },
617
+ "then": {
618
+ "properties": {
619
+ "data": {
620
+ "$ref": "#/$defs/approval_refused"
621
+ }
622
+ }
623
+ }
624
+ },
625
+ {
626
+ "if": {
627
+ "properties": {
628
+ "type": {
629
+ "const": "approval.binding_mismatch"
630
+ }
631
+ }
632
+ },
633
+ "then": {
634
+ "properties": {
635
+ "data": {
636
+ "$ref": "#/$defs/approval_binding_mismatch"
637
+ }
638
+ }
639
+ }
640
+ },
641
+ {
642
+ "if": {
643
+ "properties": {
644
+ "type": {
645
+ "const": "approval.abandoned"
646
+ }
647
+ }
648
+ },
649
+ "then": {
650
+ "properties": {
651
+ "data": {
652
+ "$ref": "#/$defs/approval_abandoned"
653
+ }
654
+ }
655
+ }
656
+ },
657
+ {
658
+ "if": {
659
+ "properties": {
660
+ "type": {
661
+ "const": "approval.escalated"
662
+ }
663
+ }
664
+ },
665
+ "then": {
666
+ "properties": {
667
+ "data": {
668
+ "$ref": "#/$defs/approval_escalated"
669
+ }
670
+ }
671
+ }
672
+ },
673
+ {
674
+ "if": {
675
+ "properties": {
676
+ "type": {
677
+ "const": "approval.revoked"
678
+ }
679
+ }
680
+ },
681
+ "then": {
682
+ "properties": {
683
+ "data": {
684
+ "$ref": "#/$defs/approval_revoked"
685
+ }
686
+ }
687
+ }
688
+ },
689
+ {
690
+ "if": {
691
+ "properties": {
692
+ "type": {
693
+ "const": "approval.suggested"
694
+ }
695
+ }
696
+ },
697
+ "then": {
698
+ "properties": {
699
+ "data": {
700
+ "$ref": "#/$defs/approval_suggested"
701
+ }
702
+ }
703
+ }
704
+ },
705
+ {
706
+ "if": {
707
+ "properties": {
708
+ "type": {
709
+ "const": "approval.agents"
710
+ }
711
+ }
712
+ },
713
+ "then": {
714
+ "properties": {
715
+ "data": {
716
+ "$ref": "#/$defs/approval_agents"
717
+ }
718
+ }
719
+ }
720
+ },
721
+ {
722
+ "if": {
723
+ "properties": {
724
+ "type": {
725
+ "const": "input.observed"
726
+ }
727
+ }
728
+ },
729
+ "then": {
730
+ "properties": {
731
+ "data": {
732
+ "$ref": "#/$defs/input_observed"
733
+ }
734
+ }
735
+ }
736
+ },
737
+ {
738
+ "if": {
739
+ "properties": {
740
+ "type": {
741
+ "const": "state.write"
742
+ }
743
+ }
744
+ },
745
+ "then": {
746
+ "properties": {
747
+ "data": {
748
+ "$ref": "#/$defs/state_write"
749
+ }
750
+ }
751
+ }
752
+ },
753
+ {
754
+ "if": {
755
+ "properties": {
756
+ "type": {
757
+ "const": "signer.epoch"
758
+ }
759
+ }
760
+ },
761
+ "then": {
762
+ "properties": {
763
+ "data": {
764
+ "$ref": "#/$defs/signer_epoch"
765
+ }
766
+ }
767
+ }
768
+ },
769
+ {
770
+ "if": {
771
+ "properties": {
772
+ "type": {
773
+ "const": "key.retire"
774
+ }
775
+ }
776
+ },
777
+ "then": {
778
+ "properties": {
779
+ "data": {
780
+ "$ref": "#/$defs/key_retire"
781
+ }
782
+ }
783
+ }
784
+ },
785
+ {
786
+ "if": {
787
+ "properties": {
788
+ "type": {
789
+ "const": "log.closed"
790
+ }
791
+ }
792
+ },
793
+ "then": {
794
+ "properties": {
795
+ "data": {
796
+ "$ref": "#/$defs/log_closed"
797
+ }
798
+ }
799
+ }
800
+ },
801
+ {
802
+ "if": {
803
+ "properties": {
804
+ "type": {
805
+ "const": "reconcile.hook_missing"
806
+ }
807
+ }
808
+ },
809
+ "then": {
810
+ "properties": {
811
+ "data": {
812
+ "$ref": "#/$defs/reconcile"
813
+ }
814
+ }
815
+ }
816
+ },
817
+ {
818
+ "if": {
819
+ "properties": {
820
+ "type": {
821
+ "const": "reconcile.fabricated"
822
+ }
823
+ }
824
+ },
825
+ "then": {
826
+ "properties": {
827
+ "data": {
828
+ "$ref": "#/$defs/reconcile"
829
+ }
830
+ }
831
+ }
832
+ },
833
+ {
834
+ "if": {
835
+ "properties": {
836
+ "type": {
837
+ "const": "reconcile.args_mismatch"
838
+ }
839
+ }
840
+ },
841
+ "then": {
842
+ "properties": {
843
+ "data": {
844
+ "$ref": "#/$defs/reconcile"
845
+ }
846
+ }
847
+ }
848
+ },
849
+ {
850
+ "if": {
851
+ "properties": {
852
+ "type": {
853
+ "const": "reconcile.result_without_call"
854
+ }
855
+ }
856
+ },
857
+ "then": {
858
+ "properties": {
859
+ "data": {
860
+ "$ref": "#/$defs/reconcile"
861
+ }
862
+ }
863
+ }
864
+ },
865
+ {
866
+ "if": {
867
+ "properties": {
868
+ "type": {
869
+ "const": "reconcile.unexplained_effect"
870
+ }
871
+ }
872
+ },
873
+ "then": {
874
+ "properties": {
875
+ "data": {
876
+ "$ref": "#/$defs/reconcile_effect"
877
+ }
878
+ }
879
+ }
880
+ },
881
+ {
882
+ "if": {
883
+ "properties": {
884
+ "type": {
885
+ "const": "reconcile.args_unparseable"
886
+ }
887
+ }
888
+ },
889
+ "then": {
890
+ "properties": {
891
+ "data": {
892
+ "$ref": "#/$defs/reconcile"
893
+ }
894
+ }
895
+ }
896
+ },
897
+ {
898
+ "if": {
899
+ "properties": {
900
+ "type": {
901
+ "const": "refusal.summary"
902
+ }
903
+ }
904
+ },
905
+ "then": {
906
+ "properties": {
907
+ "data": {
908
+ "$ref": "#/$defs/refusal_summary"
909
+ }
910
+ }
911
+ }
912
+ },
913
+ {
914
+ "if": {
915
+ "properties": {
916
+ "type": {
917
+ "const": "policy.external"
918
+ }
919
+ }
920
+ },
921
+ "then": {
922
+ "properties": {
923
+ "data": {
924
+ "$ref": "#/$defs/policy_external"
925
+ }
926
+ }
927
+ }
928
+ },
929
+ {
930
+ "if": {
931
+ "properties": {
932
+ "type": {
933
+ "const": "content.accessed"
934
+ }
935
+ }
936
+ },
937
+ "then": {
938
+ "properties": {
939
+ "data": {
940
+ "$ref": "#/$defs/content_accessed"
941
+ }
942
+ }
943
+ }
944
+ },
945
+ {
946
+ "if": {
947
+ "properties": {
948
+ "type": {
949
+ "const": "content.erased"
950
+ }
951
+ }
952
+ },
953
+ "then": {
954
+ "properties": {
955
+ "data": {
956
+ "$ref": "#/$defs/content_erased"
957
+ }
958
+ }
959
+ }
960
+ },
961
+ {
962
+ "if": {
963
+ "properties": {
964
+ "type": {
965
+ "const": "why.finding"
966
+ }
967
+ }
968
+ },
969
+ "then": {
970
+ "properties": {
971
+ "data": {
972
+ "$ref": "#/$defs/why_finding"
973
+ }
974
+ }
975
+ }
976
+ },
977
+ {
978
+ "if": {
979
+ "properties": {
980
+ "type": {
981
+ "const": "run.child"
982
+ }
983
+ }
984
+ },
985
+ "then": {
986
+ "properties": {
987
+ "data": {
988
+ "$ref": "#/$defs/run_child"
989
+ }
990
+ }
991
+ }
992
+ },
993
+ {
994
+ "if": {
995
+ "properties": {
996
+ "type": {
997
+ "const": "incident.opened"
998
+ }
999
+ }
1000
+ },
1001
+ "then": {
1002
+ "properties": {
1003
+ "data": {
1004
+ "$ref": "#/$defs/incident_opened"
1005
+ }
1006
+ }
1007
+ }
1008
+ },
1009
+ {
1010
+ "if": {
1011
+ "properties": {
1012
+ "type": {
1013
+ "const": "incident.updated"
1014
+ }
1015
+ }
1016
+ },
1017
+ "then": {
1018
+ "properties": {
1019
+ "data": {
1020
+ "$ref": "#/$defs/incident_updated"
1021
+ }
1022
+ }
1023
+ }
1024
+ },
1025
+ {
1026
+ "if": {
1027
+ "properties": {
1028
+ "type": {
1029
+ "const": "incident.capped"
1030
+ }
1031
+ }
1032
+ },
1033
+ "then": {
1034
+ "properties": {
1035
+ "data": {
1036
+ "$ref": "#/$defs/incident_capped"
1037
+ }
1038
+ }
1039
+ }
1040
+ },
1041
+ {
1042
+ "if": {
1043
+ "properties": {
1044
+ "type": {
1045
+ "const": "run.held"
1046
+ }
1047
+ }
1048
+ },
1049
+ "then": {
1050
+ "properties": {
1051
+ "data": {
1052
+ "$ref": "#/$defs/run_held"
1053
+ }
1054
+ }
1055
+ }
1056
+ },
1057
+ {
1058
+ "if": {
1059
+ "properties": {
1060
+ "type": {
1061
+ "const": "run.resumed"
1062
+ }
1063
+ }
1064
+ },
1065
+ "then": {
1066
+ "properties": {
1067
+ "data": {
1068
+ "$ref": "#/$defs/run_resumed"
1069
+ }
1070
+ }
1071
+ }
1072
+ },
1073
+ {
1074
+ "if": {
1075
+ "properties": {
1076
+ "type": {
1077
+ "const": "run.quarantined"
1078
+ }
1079
+ }
1080
+ },
1081
+ "then": {
1082
+ "properties": {
1083
+ "data": {
1084
+ "$ref": "#/$defs/run_quarantined"
1085
+ }
1086
+ }
1087
+ }
1088
+ },
1089
+ {
1090
+ "if": {
1091
+ "properties": {
1092
+ "type": {
1093
+ "const": "incident.resolved"
1094
+ }
1095
+ }
1096
+ },
1097
+ "then": {
1098
+ "properties": {
1099
+ "data": {
1100
+ "$ref": "#/$defs/incident_resolved"
1101
+ }
1102
+ }
1103
+ }
1104
+ },
1105
+ {
1106
+ "if": {
1107
+ "properties": {
1108
+ "type": {
1109
+ "const": "incident.response"
1110
+ }
1111
+ }
1112
+ },
1113
+ "then": {
1114
+ "properties": {
1115
+ "data": {
1116
+ "$ref": "#/$defs/incident_response"
1117
+ }
1118
+ }
1119
+ }
1120
+ },
1121
+ {
1122
+ "if": {
1123
+ "properties": {
1124
+ "type": {
1125
+ "const": "identity.suspension"
1126
+ }
1127
+ }
1128
+ },
1129
+ "then": {
1130
+ "properties": {
1131
+ "data": {
1132
+ "$ref": "#/$defs/identity_suspension"
1133
+ }
1134
+ }
1135
+ }
1136
+ },
1137
+ {
1138
+ "if": {
1139
+ "properties": {
1140
+ "type": {
1141
+ "const": "effect.observed"
1142
+ }
1143
+ }
1144
+ },
1145
+ "then": {
1146
+ "properties": {
1147
+ "data": {
1148
+ "$ref": "#/$defs/effect_observed"
1149
+ }
1150
+ }
1151
+ }
1152
+ }
1153
+ ],
1154
+ "$defs": {
1155
+ "hash": {
1156
+ "type": "string",
1157
+ "pattern": "^sha256:[0-9a-f]{64}$",
1158
+ "maxLength": 71
1159
+ },
1160
+ "commitment": {
1161
+ "type": "string",
1162
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
1163
+ "maxLength": 76,
1164
+ "description": "HMAC-SHA256 of a sha256: digest of agent content under a per-record salt the signer keeps and can reveal for that one record (tracekit signer reveal)"
1165
+ },
1166
+ "redaction": {
1167
+ "type": "object",
1168
+ "additionalProperties": false,
1169
+ "required": [
1170
+ "rules",
1171
+ "count",
1172
+ "client_claimed"
1173
+ ],
1174
+ "description": "what the signer redacted from this record's content before committing to it; never the values",
1175
+ "properties": {
1176
+ "rules": {
1177
+ "type": "array",
1178
+ "maxItems": 64,
1179
+ "items": {
1180
+ "type": "string",
1181
+ "maxLength": 64
1182
+ },
1183
+ "description": "the redaction rules that fired"
1184
+ },
1185
+ "count": {
1186
+ "type": "integer",
1187
+ "minimum": 0
1188
+ },
1189
+ "client_claimed": {
1190
+ "type": "boolean",
1191
+ "description": "the client said it redacted the content already"
1192
+ },
1193
+ "client": {
1194
+ "type": "object",
1195
+ "additionalProperties": false,
1196
+ "description": "the client's own manifest, as it claimed it",
1197
+ "properties": {
1198
+ "rules": {
1199
+ "type": "array",
1200
+ "maxItems": 32,
1201
+ "items": {
1202
+ "type": "string",
1203
+ "maxLength": 64
1204
+ }
1205
+ },
1206
+ "count": {
1207
+ "type": "integer",
1208
+ "minimum": 0
1209
+ }
1210
+ }
1211
+ },
1212
+ "client_redaction_incomplete": {
1213
+ "const": true,
1214
+ "description": "the client claimed redaction and the signer still found a secret"
1215
+ }
1216
+ }
1217
+ },
1218
+ "content": {
1219
+ "description": "Either the (redacted) value or a reference to it. Which one is decided by docs/privacy.md, never by the caller.",
1220
+ "oneOf": [
1221
+ {
1222
+ "type": "object",
1223
+ "additionalProperties": false,
1224
+ "required": [
1225
+ "value",
1226
+ "redacted"
1227
+ ],
1228
+ "properties": {
1229
+ "value": {},
1230
+ "redacted": {
1231
+ "type": "boolean"
1232
+ }
1233
+ }
1234
+ },
1235
+ {
1236
+ "type": "object",
1237
+ "additionalProperties": false,
1238
+ "required": [
1239
+ "hash",
1240
+ "size",
1241
+ "redacted"
1242
+ ],
1243
+ "properties": {
1244
+ "hash": {
1245
+ "$ref": "#/$defs/commitment"
1246
+ },
1247
+ "size": {
1248
+ "type": "integer",
1249
+ "minimum": 0
1250
+ },
1251
+ "redacted": {
1252
+ "type": "boolean"
1253
+ }
1254
+ }
1255
+ }
1256
+ ]
1257
+ },
1258
+ "run_start": {
1259
+ "type": "object",
1260
+ "additionalProperties": false,
1261
+ "required": [
1262
+ "agent",
1263
+ "host",
1264
+ "os_user",
1265
+ "fail_mode",
1266
+ "policy",
1267
+ "capture_sources",
1268
+ "sandbox",
1269
+ "content_capture",
1270
+ "signer_isolation"
1271
+ ],
1272
+ "properties": {
1273
+ "agent": {
1274
+ "type": "object",
1275
+ "required": [
1276
+ "name"
1277
+ ],
1278
+ "properties": {
1279
+ "name": {
1280
+ "type": "string",
1281
+ "maxLength": 4096
1282
+ },
1283
+ "version": {
1284
+ "type": [
1285
+ "string",
1286
+ "null"
1287
+ ],
1288
+ "maxLength": 4096
1289
+ }
1290
+ }
1291
+ },
1292
+ "model": {
1293
+ "type": [
1294
+ "string",
1295
+ "null"
1296
+ ],
1297
+ "maxLength": 4096
1298
+ },
1299
+ "repo": {
1300
+ "type": [
1301
+ "string",
1302
+ "null"
1303
+ ],
1304
+ "maxLength": 4096
1305
+ },
1306
+ "commit": {
1307
+ "type": [
1308
+ "string",
1309
+ "null"
1310
+ ],
1311
+ "maxLength": 4096
1312
+ },
1313
+ "cwd": {
1314
+ "type": [
1315
+ "string",
1316
+ "null"
1317
+ ],
1318
+ "maxLength": 4096
1319
+ },
1320
+ "host": {
1321
+ "type": "string",
1322
+ "maxLength": 4096
1323
+ },
1324
+ "os_user": {
1325
+ "type": "string",
1326
+ "maxLength": 4096
1327
+ },
1328
+ "fail_mode": {
1329
+ "enum": [
1330
+ "open",
1331
+ "closed"
1332
+ ]
1333
+ },
1334
+ "policy": {
1335
+ "type": "object",
1336
+ "additionalProperties": false,
1337
+ "required": [
1338
+ "version",
1339
+ "hash"
1340
+ ],
1341
+ "properties": {
1342
+ "version": {
1343
+ "type": "string",
1344
+ "maxLength": 4096
1345
+ },
1346
+ "hash": {
1347
+ "$ref": "#/$defs/hash"
1348
+ }
1349
+ }
1350
+ },
1351
+ "capture_sources": {
1352
+ "type": "array",
1353
+ "items": {
1354
+ "enum": [
1355
+ "hook",
1356
+ "proxy",
1357
+ "transcript",
1358
+ "sdk"
1359
+ ]
1360
+ },
1361
+ "maxItems": 1024
1362
+ },
1363
+ "sandbox": {
1364
+ "enum": [
1365
+ "none",
1366
+ "unknown",
1367
+ "self-reported-active"
1368
+ ]
1369
+ },
1370
+ "content_capture": {
1371
+ "enum": [
1372
+ "hashed",
1373
+ "full"
1374
+ ]
1375
+ },
1376
+ "reasoning_capture": {
1377
+ "type": "boolean"
1378
+ },
1379
+ "signer_isolation": {
1380
+ "enum": [
1381
+ "separate-user",
1382
+ "same-user"
1383
+ ]
1384
+ },
1385
+ "os_user_attested": {
1386
+ "type": "boolean",
1387
+ "description": "true when tracekitd set os_user from the socket peer's credentials rather than trusting the client."
1388
+ },
1389
+ "harness": {
1390
+ "type": "object",
1391
+ "additionalProperties": false,
1392
+ "description": "0.3: set only by the signer. The registered harness instance the run.start came from (pid + kernel start time), found from the kernel's view of the sender's process tree.",
1393
+ "required": [
1394
+ "name",
1395
+ "exe",
1396
+ "pid",
1397
+ "attested"
1398
+ ],
1399
+ "properties": {
1400
+ "name": {
1401
+ "type": "string",
1402
+ "maxLength": 4096
1403
+ },
1404
+ "exe": {
1405
+ "type": "string",
1406
+ "maxLength": 4096
1407
+ },
1408
+ "pid": {
1409
+ "type": "integer"
1410
+ },
1411
+ "start_time": {
1412
+ "type": [
1413
+ "integer",
1414
+ "null"
1415
+ ]
1416
+ },
1417
+ "attested": {
1418
+ "type": "boolean"
1419
+ }
1420
+ }
1421
+ }
1422
+ }
1423
+ },
1424
+ "run_end": {
1425
+ "type": "object",
1426
+ "additionalProperties": false,
1427
+ "required": [
1428
+ "reason"
1429
+ ],
1430
+ "properties": {
1431
+ "reason": {
1432
+ "type": "string",
1433
+ "maxLength": 4096
1434
+ }
1435
+ }
1436
+ },
1437
+ "tool_call": {
1438
+ "type": "object",
1439
+ "additionalProperties": false,
1440
+ "required": [
1441
+ "tool_use_id",
1442
+ "name",
1443
+ "input"
1444
+ ],
1445
+ "properties": {
1446
+ "tool_use_id": {
1447
+ "type": "string",
1448
+ "maxLength": 4096
1449
+ },
1450
+ "name": {
1451
+ "type": "string",
1452
+ "maxLength": 4096
1453
+ },
1454
+ "input": {
1455
+ "type": "object",
1456
+ "additionalProperties": {
1457
+ "$ref": "#/$defs/content"
1458
+ }
1459
+ },
1460
+ "salt_id": {
1461
+ "$ref": "#/$defs/id",
1462
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>)"
1463
+ }
1464
+ }
1465
+ },
1466
+ "policy_decision": {
1467
+ "type": "object",
1468
+ "additionalProperties": false,
1469
+ "required": [
1470
+ "tool_use_id",
1471
+ "decision",
1472
+ "rule_ids"
1473
+ ],
1474
+ "properties": {
1475
+ "tool_use_id": {
1476
+ "type": "string",
1477
+ "maxLength": 4096
1478
+ },
1479
+ "decision": {
1480
+ "enum": [
1481
+ "allow",
1482
+ "deny",
1483
+ "flag",
1484
+ "ask"
1485
+ ]
1486
+ },
1487
+ "rule_ids": {
1488
+ "type": "array",
1489
+ "items": {
1490
+ "type": "string",
1491
+ "maxLength": 4096
1492
+ },
1493
+ "maxItems": 1024
1494
+ },
1495
+ "reasons": {
1496
+ "type": "array",
1497
+ "items": {
1498
+ "type": "string",
1499
+ "maxLength": 4096
1500
+ },
1501
+ "maxItems": 1024
1502
+ },
1503
+ "policy_hash": {
1504
+ "$ref": "#/$defs/hash",
1505
+ "description": "hash of the policy that produced this decision"
1506
+ },
1507
+ "policy_version": {
1508
+ "type": "string",
1509
+ "maxLength": 4096
1510
+ },
1511
+ "tool": {
1512
+ "type": "string",
1513
+ "maxLength": 256,
1514
+ "description": "tool name the decision is for"
1515
+ },
1516
+ "decision_id": {
1517
+ "$ref": "#/$defs/id",
1518
+ "description": "signer-assigned; `complete` consumes it once"
1519
+ },
1520
+ "args_commitment": {
1521
+ "type": "string",
1522
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
1523
+ "maxLength": 76,
1524
+ "description": "HMAC of the signer's args digest under a per-decision salt the signer can reveal to an auditor; absent when the args failed strict parsing"
1525
+ },
1526
+ "engine": {
1527
+ "type": "string",
1528
+ "maxLength": 64,
1529
+ "description": "matching engine id@version"
1530
+ },
1531
+ "nonce": {
1532
+ "type": "string",
1533
+ "pattern": "^[0-9a-f]{32}$",
1534
+ "maxLength": 32
1535
+ },
1536
+ "expires_at": {
1537
+ "type": "string",
1538
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
1539
+ "maxLength": 27
1540
+ },
1541
+ "nondeterministic": {
1542
+ "type": "boolean",
1543
+ "description": "a fallback-engine match ran out of time and denied"
1544
+ },
1545
+ "provenance": {
1546
+ "type": "array",
1547
+ "maxItems": 16,
1548
+ "description": "argument values that only untrusted content brought into the run: the top-level argument, the kind of value and the record that brought it; never the value",
1549
+ "items": {
1550
+ "type": "object",
1551
+ "additionalProperties": false,
1552
+ "required": [
1553
+ "field",
1554
+ "kind",
1555
+ "source"
1556
+ ],
1557
+ "properties": {
1558
+ "field": {
1559
+ "type": "string",
1560
+ "maxLength": 256
1561
+ },
1562
+ "kind": {
1563
+ "enum": [
1564
+ "email",
1565
+ "url",
1566
+ "host",
1567
+ "path",
1568
+ "digits",
1569
+ "string"
1570
+ ]
1571
+ },
1572
+ "source": {
1573
+ "type": "object",
1574
+ "additionalProperties": false,
1575
+ "required": [
1576
+ "run_seq"
1577
+ ],
1578
+ "properties": {
1579
+ "run_seq": {
1580
+ "type": "integer",
1581
+ "minimum": 0
1582
+ },
1583
+ "tool": {
1584
+ "type": "string",
1585
+ "maxLength": 256
1586
+ },
1587
+ "tool_call_id": {
1588
+ "$ref": "#/$defs/id"
1589
+ }
1590
+ }
1591
+ }
1592
+ }
1593
+ }
1594
+ },
1595
+ "provenance_state": {
1596
+ "enum": [
1597
+ "complete",
1598
+ "partial",
1599
+ "truncated",
1600
+ "unavailable",
1601
+ "timeout"
1602
+ ],
1603
+ "description": "the run's provenance index: complete, partial (an untrusted tool's result came as a digest), truncated (more values than it reads), unavailable (lost in a signer restart) or timeout (this call's values took past the decision's deadline); when not complete, from: untrusted rules match whenever their pattern does"
1604
+ },
1605
+ "provenance_reason": {
1606
+ "type": "string",
1607
+ "maxLength": 256,
1608
+ "description": "why provenance_state is not complete"
1609
+ },
1610
+ "detect": {
1611
+ "type": "object",
1612
+ "additionalProperties": false,
1613
+ "required": [
1614
+ "sequences",
1615
+ "limits",
1616
+ "state"
1617
+ ],
1618
+ "description": "format 1.2: what the policy's sequences and limits saw of this call (signer/detect.py): the step each sequence it advanced reached, the count (a sum limit: the total of the call's currency) and window start of each limit it counted, and whether the detector's state is complete or was lost in a restart (unavailable)",
1619
+ "properties": {
1620
+ "rule_ids": {
1621
+ "type": "array",
1622
+ "maxItems": 1024,
1623
+ "items": {
1624
+ "type": "string",
1625
+ "maxLength": 256
1626
+ },
1627
+ "description": "the rule ids of both class readings, when the client's class hint disagreed and they differ from rule_ids"
1628
+ },
1629
+ "sums": {
1630
+ "type": "object",
1631
+ "description": "per sum limit: [amount in minor units, currency] of this call",
1632
+ "additionalProperties": {
1633
+ "type": "array",
1634
+ "minItems": 2,
1635
+ "maxItems": 2,
1636
+ "items": {
1637
+ "type": [
1638
+ "integer",
1639
+ "string"
1640
+ ],
1641
+ "maxLength": 16
1642
+ }
1643
+ }
1644
+ },
1645
+ "sequences": {
1646
+ "type": "array",
1647
+ "maxItems": 1024,
1648
+ "items": {
1649
+ "type": "object",
1650
+ "additionalProperties": false,
1651
+ "required": [
1652
+ "id",
1653
+ "step"
1654
+ ],
1655
+ "properties": {
1656
+ "id": {
1657
+ "type": "string",
1658
+ "maxLength": 256
1659
+ },
1660
+ "step": {
1661
+ "type": "integer",
1662
+ "minimum": 1
1663
+ }
1664
+ }
1665
+ }
1666
+ },
1667
+ "limits": {
1668
+ "type": "array",
1669
+ "maxItems": 1024,
1670
+ "items": {
1671
+ "type": "object",
1672
+ "additionalProperties": false,
1673
+ "required": [
1674
+ "id",
1675
+ "count",
1676
+ "window_start"
1677
+ ],
1678
+ "properties": {
1679
+ "id": {
1680
+ "type": "string",
1681
+ "maxLength": 256
1682
+ },
1683
+ "count": {
1684
+ "type": "integer"
1685
+ },
1686
+ "window_start": {
1687
+ "type": "string",
1688
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
1689
+ "maxLength": 27
1690
+ }
1691
+ }
1692
+ }
1693
+ },
1694
+ "state": {
1695
+ "enum": [
1696
+ "complete",
1697
+ "unavailable"
1698
+ ]
1699
+ }
1700
+ }
1701
+ },
1702
+ "via": {
1703
+ "type": "string",
1704
+ "maxLength": 256,
1705
+ "description": "format 1.2: the gateway or tool executor (its identity, scheme:subject) that wrote this record for the run's client (source gateway, tier T2); the signer takes the call's later steps from it only"
1706
+ },
1707
+ "caller": {
1708
+ "type": "string",
1709
+ "maxLength": 256,
1710
+ "description": "format 1.2, with via: the client (scheme:subject) the gateway or tool executor decided the call for"
1711
+ },
1712
+ "incident_id": {
1713
+ "$ref": "#/$defs/id",
1714
+ "description": "format 1.2: the incident whose hold (ask, TK-HOLD) or quarantine (deny, TK-QUARANTINE) decided the call"
1715
+ }
1716
+ }
1717
+ },
1718
+ "approval": {
1719
+ "type": "object",
1720
+ "additionalProperties": false,
1721
+ "required": [
1722
+ "tool_use_id",
1723
+ "decision",
1724
+ "approver",
1725
+ "channel"
1726
+ ],
1727
+ "properties": {
1728
+ "tool_use_id": {
1729
+ "type": "string",
1730
+ "maxLength": 4096
1731
+ },
1732
+ "decision": {
1733
+ "enum": [
1734
+ "approve",
1735
+ "reject",
1736
+ "timeout",
1737
+ "self_approval_refused"
1738
+ ]
1739
+ },
1740
+ "approver": {
1741
+ "type": "string",
1742
+ "maxLength": 4096
1743
+ },
1744
+ "channel": {
1745
+ "type": "string",
1746
+ "maxLength": 4096
1747
+ },
1748
+ "approver_uid": {
1749
+ "type": [
1750
+ "integer",
1751
+ "null"
1752
+ ]
1753
+ },
1754
+ "wait_ms": {
1755
+ "type": [
1756
+ "integer",
1757
+ "null"
1758
+ ]
1759
+ },
1760
+ "same_user": {
1761
+ "type": [
1762
+ "boolean",
1763
+ "null"
1764
+ ],
1765
+ "description": "true when the approver is the agent's own OS user (dev mode only; not trustworthy)"
1766
+ },
1767
+ "approval_id": {
1768
+ "$ref": "#/$defs/id"
1769
+ },
1770
+ "self_approved": {
1771
+ "type": "boolean",
1772
+ "description": "the approver is the requester (dev mode only); caps assurance at dev"
1773
+ },
1774
+ "reason": {
1775
+ "type": "string",
1776
+ "maxLength": 1024
1777
+ },
1778
+ "approver_identity": {
1779
+ "type": "object",
1780
+ "additionalProperties": false,
1781
+ "required": [
1782
+ "scheme",
1783
+ "subject",
1784
+ "attested"
1785
+ ],
1786
+ "properties": {
1787
+ "scheme": {
1788
+ "type": "string",
1789
+ "maxLength": 32
1790
+ },
1791
+ "subject": {
1792
+ "type": "string",
1793
+ "maxLength": 256
1794
+ },
1795
+ "attested": {
1796
+ "type": "boolean"
1797
+ },
1798
+ "person": {
1799
+ "type": "string",
1800
+ "maxLength": 256,
1801
+ "description": "an OIDC identity's stable person id"
1802
+ }
1803
+ },
1804
+ "description": "the approver as the signer's transport established it"
1805
+ },
1806
+ "break_glass": {
1807
+ "type": "boolean",
1808
+ "description": "answered under the break-glass role, which may answer any approval"
1809
+ },
1810
+ "via": {
1811
+ "type": "object",
1812
+ "additionalProperties": false,
1813
+ "required": [
1814
+ "scheme",
1815
+ "subject",
1816
+ "attested"
1817
+ ],
1818
+ "properties": {
1819
+ "scheme": {
1820
+ "type": "string",
1821
+ "maxLength": 32
1822
+ },
1823
+ "subject": {
1824
+ "type": "string",
1825
+ "maxLength": 256
1826
+ },
1827
+ "attested": {
1828
+ "type": "boolean"
1829
+ },
1830
+ "person": {
1831
+ "type": "string",
1832
+ "maxLength": 256,
1833
+ "description": "an OIDC identity's stable person id"
1834
+ }
1835
+ },
1836
+ "description": "the bridge (Slack, or the viewer's approval pages) that answered for the approver, as the signer's transport established it"
1837
+ },
1838
+ "groups": {
1839
+ "type": "array",
1840
+ "maxItems": 32,
1841
+ "items": {
1842
+ "type": "string",
1843
+ "maxLength": 64
1844
+ },
1845
+ "description": "user groups the bridge found the approver in"
1846
+ },
1847
+ "person": {
1848
+ "type": "string",
1849
+ "maxLength": 4096,
1850
+ "description": "the person id the signer's config maps the approver to"
1851
+ },
1852
+ "passkey": {
1853
+ "type": "object",
1854
+ "additionalProperties": false,
1855
+ "required": [
1856
+ "credential_id",
1857
+ "user_verified"
1858
+ ],
1859
+ "properties": {
1860
+ "credential_id": {
1861
+ "type": "string",
1862
+ "maxLength": 4096
1863
+ },
1864
+ "user_verified": {
1865
+ "const": true
1866
+ }
1867
+ },
1868
+ "description": "the WebAuthn credential whose assertion over the approval's binding digest the signer verified"
1869
+ },
1870
+ "approver_kind": {
1871
+ "const": "agent",
1872
+ "description": "format 1.2: an agent approver (approvals.agents) answered; absent for people"
1873
+ },
1874
+ "asserted": {
1875
+ "type": "object",
1876
+ "additionalProperties": false,
1877
+ "required": [
1878
+ "attested"
1879
+ ],
1880
+ "properties": {
1881
+ "model": {
1882
+ "type": "string",
1883
+ "maxLength": 128
1884
+ },
1885
+ "version": {
1886
+ "type": "string",
1887
+ "maxLength": 64
1888
+ },
1889
+ "prompt_hash": {
1890
+ "$ref": "#/$defs/hash"
1891
+ },
1892
+ "attested": {
1893
+ "const": false
1894
+ }
1895
+ },
1896
+ "description": "format 1.2: what the agent approver says it runs; its own word, never checked"
1897
+ },
1898
+ "spent": {
1899
+ "type": "object",
1900
+ "additionalProperties": {
1901
+ "type": "integer",
1902
+ "minimum": -9007199254740991,
1903
+ "maximum": 9007199254740991
1904
+ },
1905
+ "description": "format 1.2: rule id -> the argument value this agent approval takes from the rule's sum budget"
1906
+ },
1907
+ "not_before": {
1908
+ "type": "string",
1909
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
1910
+ "maxLength": 4096,
1911
+ "description": "format 1.2: an agent's approval is consumed from then on (after the rule's veto_s), so people may revoke it first"
1912
+ },
1913
+ "consume_by": {
1914
+ "type": "string",
1915
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
1916
+ "maxLength": 4096,
1917
+ "description": "format 1.2: an agent's approval is consumed before then (approvals.agent_consume_s), or never"
1918
+ },
1919
+ "incident_id": {
1920
+ "$ref": "#/$defs/id",
1921
+ "description": "format 1.2: the answer to a call held by this incident, by the person `person`"
1922
+ }
1923
+ }
1924
+ },
1925
+ "tool_result": {
1926
+ "type": "object",
1927
+ "additionalProperties": false,
1928
+ "required": [
1929
+ "tool_use_id",
1930
+ "ok",
1931
+ "output"
1932
+ ],
1933
+ "properties": {
1934
+ "tool_use_id": {
1935
+ "type": "string",
1936
+ "maxLength": 4096
1937
+ },
1938
+ "ok": {
1939
+ "type": "boolean"
1940
+ },
1941
+ "output": {
1942
+ "$ref": "#/$defs/content"
1943
+ },
1944
+ "duration_ms": {
1945
+ "type": [
1946
+ "integer",
1947
+ "null"
1948
+ ]
1949
+ },
1950
+ "decision_id": {
1951
+ "$ref": "#/$defs/id",
1952
+ "description": "the policy.decision this result consumes"
1953
+ },
1954
+ "redaction": {
1955
+ "$ref": "#/$defs/redaction"
1956
+ },
1957
+ "salt_id": {
1958
+ "$ref": "#/$defs/id",
1959
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>)"
1960
+ },
1961
+ "via": {
1962
+ "type": "string",
1963
+ "maxLength": 256,
1964
+ "description": "format 1.2: the gateway or tool executor (its identity, scheme:subject) that wrote this record for the run's client (source gateway, tier T2); the signer takes the call's later steps from it only"
1965
+ }
1966
+ }
1967
+ },
1968
+ "error": {
1969
+ "type": "object",
1970
+ "required": [
1971
+ "message"
1972
+ ],
1973
+ "properties": {
1974
+ "message": {
1975
+ "type": "string",
1976
+ "maxLength": 4096
1977
+ }
1978
+ }
1979
+ },
1980
+ "review": {
1981
+ "type": "object",
1982
+ "required": [
1983
+ "reviewer",
1984
+ "verdict"
1985
+ ],
1986
+ "properties": {
1987
+ "reviewer": {
1988
+ "type": "string",
1989
+ "maxLength": 4096
1990
+ },
1991
+ "verdict": {
1992
+ "type": "object"
1993
+ }
1994
+ }
1995
+ },
1996
+ "trace_tamper": {
1997
+ "type": "object",
1998
+ "additionalProperties": false,
1999
+ "required": [
2000
+ "path",
2001
+ "before",
2002
+ "after"
2003
+ ],
2004
+ "properties": {
2005
+ "tenant_level": {
2006
+ "type": "boolean"
2007
+ },
2008
+ "path": {
2009
+ "type": "string",
2010
+ "maxLength": 4096
2011
+ },
2012
+ "before": {
2013
+ "type": "object",
2014
+ "properties": {
2015
+ "hash": {
2016
+ "$ref": "#/$defs/hash"
2017
+ },
2018
+ "length": {
2019
+ "type": "integer"
2020
+ }
2021
+ }
2022
+ },
2023
+ "after": {
2024
+ "type": "object",
2025
+ "properties": {
2026
+ "hash": {
2027
+ "type": [
2028
+ "string",
2029
+ "null"
2030
+ ],
2031
+ "maxLength": 4096
2032
+ },
2033
+ "length": {
2034
+ "type": [
2035
+ "integer",
2036
+ "null"
2037
+ ]
2038
+ }
2039
+ }
2040
+ },
2041
+ "kind": {
2042
+ "enum": [
2043
+ "deleted",
2044
+ "truncated",
2045
+ "edited",
2046
+ "prefix_unverifiable",
2047
+ "rollback"
2048
+ ]
2049
+ }
2050
+ }
2051
+ },
2052
+ "capture_gap": {
2053
+ "type": "object",
2054
+ "additionalProperties": false,
2055
+ "required": [
2056
+ "reason"
2057
+ ],
2058
+ "properties": {
2059
+ "tenant_level": {
2060
+ "type": "boolean"
2061
+ },
2062
+ "reason": {
2063
+ "type": "string",
2064
+ "maxLength": 4096
2065
+ },
2066
+ "from_ts": {
2067
+ "type": [
2068
+ "string",
2069
+ "null"
2070
+ ],
2071
+ "maxLength": 4096
2072
+ },
2073
+ "to_ts": {
2074
+ "type": [
2075
+ "string",
2076
+ "null"
2077
+ ],
2078
+ "maxLength": 4096
2079
+ },
2080
+ "missed_events": {
2081
+ "type": [
2082
+ "integer",
2083
+ "null"
2084
+ ]
2085
+ },
2086
+ "kind": {
2087
+ "enum": [
2088
+ "signer_unavailable",
2089
+ "client_counter_gap",
2090
+ "retry_conflict",
2091
+ "run_abandoned",
2092
+ "witness_late",
2093
+ "witness_failed",
2094
+ "degraded_unanchored",
2095
+ "format_upgrade",
2096
+ "policy_timeout",
2097
+ "decision_flip",
2098
+ "class_mismatch",
2099
+ "args_coerced",
2100
+ "reconcile.hook_missing",
2101
+ "reconcile.fabricated",
2102
+ "reconcile.args_mismatch",
2103
+ "reconcile.result_without_call",
2104
+ "reconcile.unexplained_effect",
2105
+ "state_tamper",
2106
+ "tailer_lost",
2107
+ "rollback",
2108
+ "clock_skew",
2109
+ "key_retired",
2110
+ "key_revoked",
2111
+ "log_closed",
2112
+ "quota_refused",
2113
+ "identity_refused",
2114
+ "approval_expired",
2115
+ "executed_against_policy",
2116
+ "decision_mismatch",
2117
+ "decided_not_completed",
2118
+ "late_activity",
2119
+ "concurrent_run",
2120
+ "tailer_redelegated",
2121
+ "reask_after_reject",
2122
+ "held_call_unresolved",
2123
+ "observer_lost",
2124
+ "effect_outside_run"
2125
+ ],
2126
+ "description": "Gap and tamper kinds (signer-written only)."
2127
+ },
2128
+ "run_id": {
2129
+ "$ref": "#/$defs/id",
2130
+ "description": "format 1.2: the other run the gap is about (late_activity: the final run that was written to; concurrent_run: the open run this one overlaps; client_counter_gap in a tenant's signer run: the final run whose stream it is; effect_outside_run: the run the client named, its token valid or not, or the effect was attributed to)"
2131
+ },
2132
+ "tool_use_id": {
2133
+ "type": [
2134
+ "string",
2135
+ "null"
2136
+ ],
2137
+ "maxLength": 4096
2138
+ }
2139
+ }
2140
+ },
2141
+ "checkpoint": {
2142
+ "type": "object",
2143
+ "additionalProperties": false,
2144
+ "required": [
2145
+ "head_seq",
2146
+ "head_hash",
2147
+ "kid",
2148
+ "witnesses"
2149
+ ],
2150
+ "properties": {
2151
+ "head_seq": {
2152
+ "type": "integer"
2153
+ },
2154
+ "head_hash": {
2155
+ "type": "string",
2156
+ "pattern": "^[0-9a-f]{64}$",
2157
+ "maxLength": 4096
2158
+ },
2159
+ "kid": {
2160
+ "type": "string",
2161
+ "maxLength": 4096
2162
+ },
2163
+ "witnesses": {
2164
+ "type": "array",
2165
+ "items": {
2166
+ "type": "string",
2167
+ "maxLength": 4096
2168
+ },
2169
+ "maxItems": 1024
2170
+ }
2171
+ }
2172
+ },
2173
+ "user_prompt": {
2174
+ "type": "object",
2175
+ "additionalProperties": false,
2176
+ "required": [
2177
+ "content"
2178
+ ],
2179
+ "properties": {
2180
+ "content": {
2181
+ "$ref": "#/$defs/content"
2182
+ }
2183
+ }
2184
+ },
2185
+ "model_message": {
2186
+ "type": "object",
2187
+ "additionalProperties": false,
2188
+ "required": [
2189
+ "kind",
2190
+ "content"
2191
+ ],
2192
+ "description": "Self-reported model output read from the harness transcript. Opt-in, off by default, lower trust.",
2193
+ "properties": {
2194
+ "kind": {
2195
+ "enum": [
2196
+ "text",
2197
+ "thinking",
2198
+ "thinking_withheld"
2199
+ ]
2200
+ },
2201
+ "message_id": {
2202
+ "type": [
2203
+ "string",
2204
+ "null"
2205
+ ],
2206
+ "maxLength": 4096
2207
+ },
2208
+ "content": {
2209
+ "$ref": "#/$defs/content"
2210
+ }
2211
+ }
2212
+ },
2213
+ "model_exchange": {
2214
+ "type": "object",
2215
+ "additionalProperties": false,
2216
+ "required": [
2217
+ "exchange_id",
2218
+ "phase",
2219
+ "streamed"
2220
+ ],
2221
+ "description": "C3: one model API request/response recorded by the proxy (source=proxy) before the request was forwarded and when the response completed.",
2222
+ "properties": {
2223
+ "salt_id": {
2224
+ "$ref": "#/$defs/id",
2225
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>); absent on records written before salt_id existed"
2226
+ },
2227
+ "exchange_id": {
2228
+ "type": "string",
2229
+ "maxLength": 4096
2230
+ },
2231
+ "phase": {
2232
+ "enum": [
2233
+ "request",
2234
+ "response"
2235
+ ]
2236
+ },
2237
+ "model": {
2238
+ "type": [
2239
+ "string",
2240
+ "null"
2241
+ ],
2242
+ "maxLength": 4096
2243
+ },
2244
+ "request": {
2245
+ "$ref": "#/$defs/content"
2246
+ },
2247
+ "response": {
2248
+ "$ref": "#/$defs/content"
2249
+ },
2250
+ "status": {
2251
+ "type": [
2252
+ "integer",
2253
+ "null"
2254
+ ]
2255
+ },
2256
+ "streamed": {
2257
+ "type": "boolean"
2258
+ },
2259
+ "duration_ms": {
2260
+ "type": [
2261
+ "integer",
2262
+ "null"
2263
+ ]
2264
+ },
2265
+ "first_byte_ms": {
2266
+ "type": [
2267
+ "integer",
2268
+ "null"
2269
+ ]
2270
+ },
2271
+ "added_latency_ms": {
2272
+ "type": [
2273
+ "number",
2274
+ "null"
2275
+ ]
2276
+ },
2277
+ "tool_uses": {
2278
+ "type": "array",
2279
+ "items": {
2280
+ "type": "object",
2281
+ "additionalProperties": false,
2282
+ "required": [
2283
+ "id",
2284
+ "name"
2285
+ ],
2286
+ "properties": {
2287
+ "id": {
2288
+ "type": "string",
2289
+ "maxLength": 4096
2290
+ },
2291
+ "name": {
2292
+ "type": "string",
2293
+ "maxLength": 4096
2294
+ },
2295
+ "executed_by": {
2296
+ "enum": [
2297
+ "client",
2298
+ "provider"
2299
+ ]
2300
+ },
2301
+ "args_source": {
2302
+ "enum": [
2303
+ "raw",
2304
+ "parsed",
2305
+ "coerced"
2306
+ ]
2307
+ },
2308
+ "args_commitment": {
2309
+ "type": "string",
2310
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
2311
+ "maxLength": 76
2312
+ },
2313
+ "args_unparseable": {
2314
+ "const": true,
2315
+ "description": "the raw arguments string failed strict parsing"
2316
+ },
2317
+ "id_synthetic": {
2318
+ "const": true,
2319
+ "description": "the provider gave no id; the reporting client made this one"
2320
+ }
2321
+ }
2322
+ },
2323
+ "maxItems": 1024
2324
+ },
2325
+ "tool_results_sent": {
2326
+ "type": "array",
2327
+ "items": {
2328
+ "type": "string",
2329
+ "maxLength": 4096
2330
+ },
2331
+ "description": "tool_use ids whose results the harness sent back in this request",
2332
+ "maxItems": 1024
2333
+ },
2334
+ "stop_reason": {
2335
+ "type": [
2336
+ "string",
2337
+ "null"
2338
+ ],
2339
+ "maxLength": 4096
2340
+ },
2341
+ "upstream": {
2342
+ "type": "string",
2343
+ "maxLength": 4096
2344
+ },
2345
+ "error": {
2346
+ "type": [
2347
+ "string",
2348
+ "null"
2349
+ ],
2350
+ "maxLength": 4096
2351
+ },
2352
+ "attribution": {
2353
+ "enum": [
2354
+ "metadata",
2355
+ "tool_use_id",
2356
+ "none"
2357
+ ]
2358
+ },
2359
+ "usage": {
2360
+ "type": "object",
2361
+ "additionalProperties": false,
2362
+ "required": [
2363
+ "input_tokens",
2364
+ "output_tokens"
2365
+ ],
2366
+ "description": "Token usage on the response (optional). input_tokens excludes cache reads; reasoning_tokens is part of output_tokens.",
2367
+ "properties": {
2368
+ "input_tokens": {
2369
+ "type": "integer",
2370
+ "minimum": 0
2371
+ },
2372
+ "output_tokens": {
2373
+ "type": "integer",
2374
+ "minimum": 0
2375
+ },
2376
+ "cache_read_tokens": {
2377
+ "type": [
2378
+ "integer",
2379
+ "null"
2380
+ ],
2381
+ "minimum": 0
2382
+ },
2383
+ "cache_write_tokens": {
2384
+ "type": [
2385
+ "integer",
2386
+ "null"
2387
+ ],
2388
+ "minimum": 0
2389
+ },
2390
+ "reasoning_tokens": {
2391
+ "type": [
2392
+ "integer",
2393
+ "null"
2394
+ ],
2395
+ "minimum": 0
2396
+ }
2397
+ }
2398
+ },
2399
+ "content_digest": {
2400
+ "$ref": "#/$defs/commitment"
2401
+ }
2402
+ }
2403
+ },
2404
+ "id": {
2405
+ "type": "string",
2406
+ "minLength": 1,
2407
+ "maxLength": 128,
2408
+ "pattern": "^[A-Za-z0-9._:-]+$"
2409
+ },
2410
+ "run_registered": {
2411
+ "type": "object",
2412
+ "additionalProperties": false,
2413
+ "required": [
2414
+ "agent",
2415
+ "identity"
2416
+ ],
2417
+ "properties": {
2418
+ "agent": {
2419
+ "type": "object",
2420
+ "additionalProperties": false,
2421
+ "required": [
2422
+ "name"
2423
+ ],
2424
+ "properties": {
2425
+ "name": {
2426
+ "type": "string",
2427
+ "minLength": 1,
2428
+ "maxLength": 128
2429
+ },
2430
+ "version": {
2431
+ "type": "string",
2432
+ "maxLength": 64
2433
+ }
2434
+ }
2435
+ },
2436
+ "identity": {
2437
+ "type": "object",
2438
+ "additionalProperties": false,
2439
+ "required": [
2440
+ "scheme",
2441
+ "subject",
2442
+ "attested"
2443
+ ],
2444
+ "properties": {
2445
+ "scheme": {
2446
+ "enum": [
2447
+ "uid",
2448
+ "harness",
2449
+ "token",
2450
+ "k8s_sa",
2451
+ "mtls",
2452
+ "oidc"
2453
+ ]
2454
+ },
2455
+ "subject": {
2456
+ "type": "string",
2457
+ "maxLength": 256
2458
+ },
2459
+ "attested": {
2460
+ "type": "boolean"
2461
+ },
2462
+ "person": {
2463
+ "type": "string",
2464
+ "maxLength": 256,
2465
+ "description": "an OIDC identity's stable person id"
2466
+ }
2467
+ }
2468
+ },
2469
+ "signer_isolation": {
2470
+ "enum": [
2471
+ "same-user",
2472
+ "separate-user",
2473
+ "remote",
2474
+ "unknown"
2475
+ ],
2476
+ "description": "measured by the signer from the caller's identity, never taken from the client"
2477
+ },
2478
+ "harness": {
2479
+ "type": "object",
2480
+ "additionalProperties": false,
2481
+ "required": [
2482
+ "name",
2483
+ "exe",
2484
+ "pid",
2485
+ "start_time",
2486
+ "attested"
2487
+ ],
2488
+ "properties": {
2489
+ "name": {
2490
+ "type": "string",
2491
+ "maxLength": 64
2492
+ },
2493
+ "exe": {
2494
+ "type": "string",
2495
+ "maxLength": 4096
2496
+ },
2497
+ "pid": {
2498
+ "type": "integer",
2499
+ "minimum": 1
2500
+ },
2501
+ "start_time": {
2502
+ "type": [
2503
+ "integer",
2504
+ "null"
2505
+ ]
2506
+ },
2507
+ "attested": {
2508
+ "const": true
2509
+ }
2510
+ },
2511
+ "description": "the registered harness process the caller descends from, found by the signer through the harness helper"
2512
+ },
2513
+ "fail_modes": {
2514
+ "type": "object",
2515
+ "additionalProperties": {
2516
+ "enum": [
2517
+ "open",
2518
+ "closed"
2519
+ ]
2520
+ },
2521
+ "description": "tool class -> fail mode, from the signer's config, never from the client"
2522
+ },
2523
+ "analyzes": {
2524
+ "$ref": "#/$defs/id",
2525
+ "description": "a findings run: the run_id of the run of the same tenant it analyses"
2526
+ },
2527
+ "replay_of": {
2528
+ "$ref": "#/$defs/id",
2529
+ "description": "a tracekit why replay run: the run_id of the run of the same tenant it replays"
2530
+ },
2531
+ "investigation": {
2532
+ "$ref": "#/$defs/id",
2533
+ "description": "with replay_of: the investigation the replay run is an arm of"
2534
+ },
2535
+ "parent_run": {
2536
+ "$ref": "#/$defs/id",
2537
+ "description": "format 1.2: the run of the same tenant that started this one, whose run token the caller presented"
2538
+ },
2539
+ "session": {
2540
+ "$ref": "#/$defs/id",
2541
+ "description": "with parent_run: the root run of the chain of parents (a run without parent_run is its own session)"
2542
+ },
2543
+ "fidelity": {
2544
+ "enum": [
2545
+ "none"
2546
+ ],
2547
+ "description": "an imported run (source import): what its records say about the calls beyond their receipt"
2548
+ },
2549
+ "posture": {
2550
+ "type": "object",
2551
+ "additionalProperties": false,
2552
+ "required": [
2553
+ "network",
2554
+ "tool_calls",
2555
+ "gateway_mandatory",
2556
+ "attested"
2557
+ ],
2558
+ "description": "format 1.2: the deployment's posture as the operator asserts it in signer.yaml: whether the agent's network is enforced through the egress proxy, whether it acts only through the executor and the MCP gateway, and whether the LLM gateway is its only way to its model (gateway_mandatory); never attested",
2559
+ "properties": {
2560
+ "network": {
2561
+ "enum": [
2562
+ "enforced",
2563
+ "open"
2564
+ ]
2565
+ },
2566
+ "tool_calls": {
2567
+ "enum": [
2568
+ "enforced",
2569
+ "open"
2570
+ ]
2571
+ },
2572
+ "gateway_mandatory": {
2573
+ "type": "boolean"
2574
+ },
2575
+ "attested": {
2576
+ "const": false
2577
+ }
2578
+ }
2579
+ }
2580
+ }
2581
+ },
2582
+ "run_closing": {
2583
+ "type": "object",
2584
+ "additionalProperties": false,
2585
+ "required": [
2586
+ "reason"
2587
+ ],
2588
+ "properties": {
2589
+ "reason": {
2590
+ "enum": [
2591
+ "close_run",
2592
+ "idle_timeout",
2593
+ "quarantine"
2594
+ ]
2595
+ }
2596
+ }
2597
+ },
2598
+ "run_child": {
2599
+ "type": "object",
2600
+ "additionalProperties": false,
2601
+ "required": [
2602
+ "run_id"
2603
+ ],
2604
+ "description": "format 1.2: a run bound to the same harness process registered with this run as its parent_run (signer-written)",
2605
+ "properties": {
2606
+ "run_id": {
2607
+ "$ref": "#/$defs/id"
2608
+ }
2609
+ }
2610
+ },
2611
+ "run_final": {
2612
+ "type": "object",
2613
+ "additionalProperties": false,
2614
+ "required": [
2615
+ "head_run_seq",
2616
+ "head_hash"
2617
+ ],
2618
+ "properties": {
2619
+ "head_run_seq": {
2620
+ "type": "integer",
2621
+ "minimum": 0,
2622
+ "maximum": 9007199254740991
2623
+ },
2624
+ "head_hash": {
2625
+ "$ref": "#/$defs/hash"
2626
+ },
2627
+ "provider_executed": {
2628
+ "type": "integer",
2629
+ "minimum": 1,
2630
+ "maximum": 9007199254740991,
2631
+ "description": "format 1.2: tool uses the model's provider ran itself (executed_by provider), which no decide covers"
2632
+ },
2633
+ "coverage": {
2634
+ "type": "object",
2635
+ "additionalProperties": false,
2636
+ "required": [
2637
+ "layers",
2638
+ "reconciled",
2639
+ "unreconciled"
2640
+ ],
2641
+ "description": "the capture layers that reported for the run and the tool calls the signer reconciled",
2642
+ "properties": {
2643
+ "layers": {
2644
+ "type": "array",
2645
+ "maxItems": 6,
2646
+ "items": {
2647
+ "enum": [
2648
+ "L1",
2649
+ "L2",
2650
+ "L3",
2651
+ "L4",
2652
+ "L5",
2653
+ "L6"
2654
+ ]
2655
+ }
2656
+ },
2657
+ "reconciled": {
2658
+ "type": "integer",
2659
+ "minimum": 0,
2660
+ "maximum": 9007199254740991
2661
+ },
2662
+ "unreconciled": {
2663
+ "type": "object",
2664
+ "additionalProperties": false,
2665
+ "description": "reconcile.* records of the run, by kind",
2666
+ "properties": {
2667
+ "hook_missing": {
2668
+ "type": "integer",
2669
+ "minimum": 1,
2670
+ "maximum": 9007199254740991
2671
+ },
2672
+ "fabricated": {
2673
+ "type": "integer",
2674
+ "minimum": 1,
2675
+ "maximum": 9007199254740991
2676
+ },
2677
+ "args_mismatch": {
2678
+ "type": "integer",
2679
+ "minimum": 1,
2680
+ "maximum": 9007199254740991
2681
+ },
2682
+ "args_unparseable": {
2683
+ "type": "integer",
2684
+ "minimum": 1,
2685
+ "maximum": 9007199254740991
2686
+ },
2687
+ "result_without_call": {
2688
+ "type": "integer",
2689
+ "minimum": 1,
2690
+ "maximum": 9007199254740991
2691
+ },
2692
+ "unexplained_effect": {
2693
+ "type": "integer",
2694
+ "minimum": 1,
2695
+ "maximum": 9007199254740991
2696
+ }
2697
+ }
2698
+ }
2699
+ }
2700
+ },
2701
+ "paired_by_args": {
2702
+ "type": "integer",
2703
+ "minimum": 1,
2704
+ "maximum": 9007199254740991,
2705
+ "description": "format 1.2: calls reconciled by pairing a decide with the model's tool use of the same turn by their arguments, the adapter having had no tool-call id"
2706
+ },
2707
+ "matrix": {
2708
+ "type": "object",
2709
+ "additionalProperties": false,
2710
+ "required": [
2711
+ "model_calls",
2712
+ "tool_calls",
2713
+ "network",
2714
+ "processes",
2715
+ "services"
2716
+ ],
2717
+ "description": "format 1.2: per action class, how the run was covered: enforced (custody: the only way to act records it), observed (an observer outside the agent saw it and it was reconciled), reported (only the agent's own process reported it) or none; and the layers behind it",
2718
+ "properties": {
2719
+ "model_calls": {
2720
+ "$ref": "#/$defs/coverage_class"
2721
+ },
2722
+ "tool_calls": {
2723
+ "$ref": "#/$defs/coverage_class"
2724
+ },
2725
+ "network": {
2726
+ "$ref": "#/$defs/coverage_class"
2727
+ },
2728
+ "processes": {
2729
+ "$ref": "#/$defs/coverage_class"
2730
+ },
2731
+ "services": {
2732
+ "$ref": "#/$defs/coverage_class"
2733
+ }
2734
+ }
2735
+ }
2736
+ }
2737
+ },
2738
+ "approval_request": {
2739
+ "type": "object",
2740
+ "additionalProperties": false,
2741
+ "required": [
2742
+ "approval_id",
2743
+ "policy_hash",
2744
+ "rule_ids",
2745
+ "expires_at",
2746
+ "requester",
2747
+ "decision_id",
2748
+ "binding",
2749
+ "binding_digest"
2750
+ ],
2751
+ "properties": {
2752
+ "salt_id": {
2753
+ "$ref": "#/$defs/id",
2754
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>); absent on records written before salt_id existed"
2755
+ },
2756
+ "approval_id": {
2757
+ "$ref": "#/$defs/id"
2758
+ },
2759
+ "policy_hash": {
2760
+ "$ref": "#/$defs/hash"
2761
+ },
2762
+ "rule_ids": {
2763
+ "type": "array",
2764
+ "maxItems": 32,
2765
+ "items": {
2766
+ "type": "string",
2767
+ "maxLength": 64
2768
+ }
2769
+ },
2770
+ "expires_at": {
2771
+ "type": "string",
2772
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
2773
+ "maxLength": 4096
2774
+ },
2775
+ "requester": {
2776
+ "type": "string",
2777
+ "maxLength": 256
2778
+ },
2779
+ "requester_person": {
2780
+ "type": "string",
2781
+ "maxLength": 256,
2782
+ "description": "the requester's stable person id, when an OIDC identity"
2783
+ },
2784
+ "decision_id": {
2785
+ "$ref": "#/$defs/id"
2786
+ },
2787
+ "binding": {
2788
+ "type": "object",
2789
+ "additionalProperties": false,
2790
+ "required": [
2791
+ "v",
2792
+ "approval_id",
2793
+ "tenant",
2794
+ "run_id",
2795
+ "tool_call_id",
2796
+ "attempt",
2797
+ "tool",
2798
+ "args_commitment",
2799
+ "args_source",
2800
+ "policy_hash",
2801
+ "nonce",
2802
+ "expires_at"
2803
+ ],
2804
+ "description": "what the approval is bound to; binding_digest is sha256(JCS(binding)), the args bound through args_commitment",
2805
+ "properties": {
2806
+ "v": {
2807
+ "const": 1
2808
+ },
2809
+ "approval_id": {
2810
+ "$ref": "#/$defs/id"
2811
+ },
2812
+ "tenant": {
2813
+ "$ref": "#/$defs/id"
2814
+ },
2815
+ "run_id": {
2816
+ "$ref": "#/$defs/id"
2817
+ },
2818
+ "tool_call_id": {
2819
+ "$ref": "#/$defs/id"
2820
+ },
2821
+ "attempt": {
2822
+ "type": "integer",
2823
+ "minimum": 0,
2824
+ "maximum": 9007199254740991
2825
+ },
2826
+ "tool": {
2827
+ "type": "string",
2828
+ "maxLength": 256
2829
+ },
2830
+ "args_commitment": {
2831
+ "type": "string",
2832
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
2833
+ "maxLength": 76
2834
+ },
2835
+ "args_source": {
2836
+ "enum": [
2837
+ "raw",
2838
+ "parsed",
2839
+ "coerced"
2840
+ ]
2841
+ },
2842
+ "policy_hash": {
2843
+ "$ref": "#/$defs/hash"
2844
+ },
2845
+ "nonce": {
2846
+ "type": "string",
2847
+ "pattern": "^[0-9a-f]{32}$",
2848
+ "maxLength": 32
2849
+ },
2850
+ "expires_at": {
2851
+ "type": "string",
2852
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
2853
+ "maxLength": 4096
2854
+ }
2855
+ }
2856
+ },
2857
+ "binding_digest": {
2858
+ "$ref": "#/$defs/hash"
2859
+ },
2860
+ "executor": {
2861
+ "enum": [
2862
+ "t1",
2863
+ "t2"
2864
+ ],
2865
+ "description": "t2: approval_consume returns the approved arguments and its caller runs exactly those"
2866
+ },
2867
+ "agent": {
2868
+ "type": "object",
2869
+ "additionalProperties": false,
2870
+ "required": [
2871
+ "eligible",
2872
+ "reason",
2873
+ "rules",
2874
+ "conditions_hash",
2875
+ "args_key"
2876
+ ],
2877
+ "description": "format 1.2: whether an agent approver may answer this approval, computed by the signer from the call's arguments and the run",
2878
+ "properties": {
2879
+ "eligible": {
2880
+ "type": "boolean"
2881
+ },
2882
+ "reason": {
2883
+ "type": "string",
2884
+ "maxLength": 1024
2885
+ },
2886
+ "rules": {
2887
+ "type": "array",
2888
+ "maxItems": 32,
2889
+ "items": {
2890
+ "type": "string",
2891
+ "maxLength": 64
2892
+ },
2893
+ "description": "the rules it asked by with approval.agent"
2894
+ },
2895
+ "conditions_hash": {
2896
+ "$ref": "#/$defs/hash",
2897
+ "description": "sha256 of JCS of those rules' approval.agent sections"
2898
+ },
2899
+ "args_key": {
2900
+ "type": "string",
2901
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
2902
+ "maxLength": 76,
2903
+ "description": "an HMAC of the call's arguments under a key of this run: the same in this run for the same arguments, so a call an agent said no to is a person's to answer when asked again"
2904
+ }
2905
+ }
2906
+ },
2907
+ "via": {
2908
+ "type": "string",
2909
+ "maxLength": 256,
2910
+ "description": "format 1.2: the gateway or tool executor (its identity, scheme:subject) that wrote this record for the run's client (source gateway, tier T2); the signer takes the call's later steps from it only"
2911
+ },
2912
+ "incident_id": {
2913
+ "$ref": "#/$defs/id",
2914
+ "description": "format 1.2: the call is held by this incident: only a person who is not the run's owner, principal or requester answers it"
2915
+ },
2916
+ "passkey": {
2917
+ "const": true,
2918
+ "description": "the approval needs a passkey (approval: {passkey: required})"
2919
+ }
2920
+ }
2921
+ },
2922
+ "approval_consumed": {
2923
+ "type": "object",
2924
+ "additionalProperties": false,
2925
+ "required": [
2926
+ "approval_id"
2927
+ ],
2928
+ "properties": {
2929
+ "approval_id": {
2930
+ "$ref": "#/$defs/id"
2931
+ }
2932
+ }
2933
+ },
2934
+ "approval_expired": {
2935
+ "type": "object",
2936
+ "additionalProperties": false,
2937
+ "required": [
2938
+ "approval_id"
2939
+ ],
2940
+ "properties": {
2941
+ "approval_id": {
2942
+ "$ref": "#/$defs/id"
2943
+ },
2944
+ "reason": {
2945
+ "enum": [
2946
+ "ttl",
2947
+ "run_final",
2948
+ "consume_window",
2949
+ "hold",
2950
+ "quarantine"
2951
+ ],
2952
+ "description": "format 1.2, on approvals an agent may answer: approvals.ttl_s passed, the run ended, or an agent's approval was not consumed within approvals.agent_consume_s; on any approval: its run was held or quarantined (hold, quarantine)"
2953
+ }
2954
+ }
2955
+ },
2956
+ "approval_refused": {
2957
+ "type": "object",
2958
+ "additionalProperties": false,
2959
+ "required": [
2960
+ "tool_use_id",
2961
+ "rule_ids",
2962
+ "reason"
2963
+ ],
2964
+ "properties": {
2965
+ "tool_use_id": {
2966
+ "$ref": "#/$defs/id"
2967
+ },
2968
+ "approval_id": {
2969
+ "$ref": "#/$defs/id"
2970
+ },
2971
+ "rule_ids": {
2972
+ "type": "array",
2973
+ "maxItems": 32,
2974
+ "items": {
2975
+ "type": "string",
2976
+ "maxLength": 64
2977
+ }
2978
+ },
2979
+ "reason": {
2980
+ "type": "string",
2981
+ "maxLength": 1024
2982
+ }
2983
+ }
2984
+ },
2985
+ "approval_binding_mismatch": {
2986
+ "type": "object",
2987
+ "additionalProperties": false,
2988
+ "required": [
2989
+ "approval_id",
2990
+ "tool_use_id",
2991
+ "approved_commitment",
2992
+ "args_commitment"
2993
+ ],
2994
+ "properties": {
2995
+ "salt_id": {
2996
+ "$ref": "#/$defs/id",
2997
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>); absent on records written before salt_id existed"
2998
+ },
2999
+ "approval_id": {
3000
+ "$ref": "#/$defs/id"
3001
+ },
3002
+ "tool_use_id": {
3003
+ "$ref": "#/$defs/id"
3004
+ },
3005
+ "approved_commitment": {
3006
+ "type": "string",
3007
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
3008
+ "maxLength": 76
3009
+ },
3010
+ "args_commitment": {
3011
+ "type": "string",
3012
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
3013
+ "maxLength": 76
3014
+ },
3015
+ "decision_id": {
3016
+ "$ref": "#/$defs/id",
3017
+ "description": "the decision the approval was for (without salt_id: the decision whose salt both commitments are under)"
3018
+ }
3019
+ }
3020
+ },
3021
+ "approval_abandoned": {
3022
+ "type": "object",
3023
+ "additionalProperties": false,
3024
+ "required": [
3025
+ "approval_id"
3026
+ ],
3027
+ "properties": {
3028
+ "approval_id": {
3029
+ "$ref": "#/$defs/id"
3030
+ },
3031
+ "reason": {
3032
+ "type": "string",
3033
+ "maxLength": 1024
3034
+ }
3035
+ },
3036
+ "description": "the adapter will never resume the paused call; the approval ends at once"
3037
+ },
3038
+ "approval_escalated": {
3039
+ "type": "object",
3040
+ "additionalProperties": false,
3041
+ "required": [
3042
+ "approval_id",
3043
+ "by"
3044
+ ],
3045
+ "properties": {
3046
+ "approval_id": {
3047
+ "$ref": "#/$defs/id"
3048
+ },
3049
+ "by": {
3050
+ "enum": [
3051
+ "agent",
3052
+ "signer"
3053
+ ]
3054
+ },
3055
+ "reason": {
3056
+ "type": "string",
3057
+ "maxLength": 1024
3058
+ },
3059
+ "approver_identity": {
3060
+ "type": "object",
3061
+ "additionalProperties": false,
3062
+ "required": [
3063
+ "scheme",
3064
+ "subject",
3065
+ "attested"
3066
+ ],
3067
+ "properties": {
3068
+ "scheme": {
3069
+ "type": "string",
3070
+ "maxLength": 32
3071
+ },
3072
+ "subject": {
3073
+ "type": "string",
3074
+ "maxLength": 256
3075
+ },
3076
+ "attested": {
3077
+ "type": "boolean"
3078
+ },
3079
+ "person": {
3080
+ "type": "string",
3081
+ "maxLength": 256,
3082
+ "description": "an OIDC identity's stable person id"
3083
+ }
3084
+ },
3085
+ "description": "the approver as the signer's transport established it"
3086
+ }
3087
+ },
3088
+ "description": "format 1.2: only people answer this approval from now on: an agent approver handed it over, or the signer did (no agent answered within agent_timeout_s, a budget ran out)"
3089
+ },
3090
+ "approval_revoked": {
3091
+ "type": "object",
3092
+ "additionalProperties": false,
3093
+ "required": [
3094
+ "approval_id",
3095
+ "by"
3096
+ ],
3097
+ "properties": {
3098
+ "approval_id": {
3099
+ "$ref": "#/$defs/id"
3100
+ },
3101
+ "by": {
3102
+ "type": "string",
3103
+ "maxLength": 256
3104
+ },
3105
+ "reason": {
3106
+ "type": "string",
3107
+ "maxLength": 1024
3108
+ }
3109
+ },
3110
+ "description": "format 1.2: a person (or the kill switch, by signer) vetoed an agent's approval before it was consumed"
3111
+ },
3112
+ "approval_suggested": {
3113
+ "type": "object",
3114
+ "additionalProperties": false,
3115
+ "required": [
3116
+ "tool_use_id",
3117
+ "approval_id",
3118
+ "decision",
3119
+ "approver",
3120
+ "approver_identity",
3121
+ "channel",
3122
+ "approver_kind"
3123
+ ],
3124
+ "properties": {
3125
+ "tool_use_id": {
3126
+ "$ref": "#/$defs/id"
3127
+ },
3128
+ "approval_id": {
3129
+ "$ref": "#/$defs/id"
3130
+ },
3131
+ "decision": {
3132
+ "enum": [
3133
+ "approve",
3134
+ "reject",
3135
+ "escalate"
3136
+ ]
3137
+ },
3138
+ "approver": {
3139
+ "type": "string",
3140
+ "maxLength": 256
3141
+ },
3142
+ "approver_identity": {
3143
+ "type": "object",
3144
+ "additionalProperties": false,
3145
+ "required": [
3146
+ "scheme",
3147
+ "subject",
3148
+ "attested"
3149
+ ],
3150
+ "properties": {
3151
+ "scheme": {
3152
+ "type": "string",
3153
+ "maxLength": 32
3154
+ },
3155
+ "subject": {
3156
+ "type": "string",
3157
+ "maxLength": 256
3158
+ },
3159
+ "attested": {
3160
+ "type": "boolean"
3161
+ },
3162
+ "person": {
3163
+ "type": "string",
3164
+ "maxLength": 256,
3165
+ "description": "an OIDC identity's stable person id"
3166
+ }
3167
+ },
3168
+ "description": "the approver as the signer's transport established it"
3169
+ },
3170
+ "channel": {
3171
+ "type": "string",
3172
+ "maxLength": 64
3173
+ },
3174
+ "approver_kind": {
3175
+ "const": "agent"
3176
+ },
3177
+ "asserted": {
3178
+ "type": "object",
3179
+ "additionalProperties": false,
3180
+ "required": [
3181
+ "attested"
3182
+ ],
3183
+ "properties": {
3184
+ "model": {
3185
+ "type": "string",
3186
+ "maxLength": 128
3187
+ },
3188
+ "version": {
3189
+ "type": "string",
3190
+ "maxLength": 64
3191
+ },
3192
+ "prompt_hash": {
3193
+ "$ref": "#/$defs/hash"
3194
+ },
3195
+ "attested": {
3196
+ "const": false
3197
+ }
3198
+ },
3199
+ "description": "format 1.2: what the agent approver says it runs; its own word, never checked"
3200
+ },
3201
+ "reason": {
3202
+ "type": "string",
3203
+ "maxLength": 1024
3204
+ }
3205
+ },
3206
+ "description": "format 1.2: a shadow-mode agent approver's answer, recorded only: it changes nothing"
3207
+ },
3208
+ "approval_agents": {
3209
+ "type": "object",
3210
+ "additionalProperties": false,
3211
+ "required": [
3212
+ "enabled",
3213
+ "by"
3214
+ ],
3215
+ "properties": {
3216
+ "enabled": {
3217
+ "type": "boolean"
3218
+ },
3219
+ "by": {
3220
+ "type": "string",
3221
+ "maxLength": 256
3222
+ },
3223
+ "reason": {
3224
+ "type": "string",
3225
+ "maxLength": 1024
3226
+ }
3227
+ },
3228
+ "description": "format 1.2: the operator's kill switch for agent approvals (in the signer run); switching off revokes every agent approval not consumed yet"
3229
+ },
3230
+ "input_observed": {
3231
+ "type": "object",
3232
+ "additionalProperties": false,
3233
+ "description": "content that entered the run other than as a tool result (observe RPC), indexed for provenance; the value itself is only committed to",
3234
+ "required": [
3235
+ "source",
3236
+ "trust",
3237
+ "output",
3238
+ "redaction",
3239
+ "salt_id"
3240
+ ],
3241
+ "properties": {
3242
+ "source": {
3243
+ "type": "string",
3244
+ "maxLength": 256,
3245
+ "description": "the caller's name for where the content came from"
3246
+ },
3247
+ "trust": {
3248
+ "enum": [
3249
+ "trusted",
3250
+ "untrusted"
3251
+ ],
3252
+ "description": "the caller's claim; it only decides how this content's own values count"
3253
+ },
3254
+ "output": {
3255
+ "$ref": "#/$defs/content"
3256
+ },
3257
+ "redaction": {
3258
+ "$ref": "#/$defs/redaction"
3259
+ },
3260
+ "salt_id": {
3261
+ "$ref": "#/$defs/id",
3262
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>)"
3263
+ },
3264
+ "via": {
3265
+ "type": "string",
3266
+ "maxLength": 256,
3267
+ "description": "format 1.2: the gateway or tool executor (its identity, scheme:subject) that wrote this record for the run's client (source gateway, tier T2); the signer takes the call's later steps from it only"
3268
+ }
3269
+ }
3270
+ },
3271
+ "state_write": {
3272
+ "type": "object",
3273
+ "additionalProperties": false,
3274
+ "required": [
3275
+ "store",
3276
+ "key",
3277
+ "digest"
3278
+ ],
3279
+ "properties": {
3280
+ "salt_id": {
3281
+ "$ref": "#/$defs/id",
3282
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>); absent on records written before salt_id existed"
3283
+ },
3284
+ "store": {
3285
+ "type": "string",
3286
+ "maxLength": 256
3287
+ },
3288
+ "key": {
3289
+ "type": "string",
3290
+ "maxLength": 256
3291
+ },
3292
+ "prev_digest": {
3293
+ "oneOf": [
3294
+ {
3295
+ "$ref": "#/$defs/commitment"
3296
+ },
3297
+ {
3298
+ "type": "null"
3299
+ }
3300
+ ]
3301
+ },
3302
+ "digest": {
3303
+ "$ref": "#/$defs/commitment"
3304
+ }
3305
+ }
3306
+ },
3307
+ "signer_epoch": {
3308
+ "type": "object",
3309
+ "additionalProperties": false,
3310
+ "required": [
3311
+ "keys"
3312
+ ],
3313
+ "properties": {
3314
+ "keys": {
3315
+ "type": "array",
3316
+ "maxItems": 16,
3317
+ "items": {
3318
+ "type": "object",
3319
+ "additionalProperties": false,
3320
+ "required": [
3321
+ "kid",
3322
+ "alg",
3323
+ "spki"
3324
+ ],
3325
+ "properties": {
3326
+ "kid": {
3327
+ "$ref": "#/$defs/hash"
3328
+ },
3329
+ "alg": {
3330
+ "type": "string",
3331
+ "maxLength": 32,
3332
+ "pattern": "^[a-z0-9-]+$"
3333
+ },
3334
+ "spki": {
3335
+ "type": "string",
3336
+ "maxLength": 4096,
3337
+ "pattern": "^[A-Za-z0-9+/]+={0,2}$",
3338
+ "description": "base64 DER SubjectPublicKeyInfo"
3339
+ },
3340
+ "cert": {
3341
+ "type": "object",
3342
+ "additionalProperties": false,
3343
+ "required": [
3344
+ "certificate",
3345
+ "index",
3346
+ "inclusion",
3347
+ "checkpoint"
3348
+ ],
3349
+ "description": "the key's issuance entry from a record-key issuer (tracekit.format.cert, docs/issuer.md)",
3350
+ "properties": {
3351
+ "certificate": {
3352
+ "type": "object",
3353
+ "additionalProperties": false,
3354
+ "required": [
3355
+ "cert",
3356
+ "sig"
3357
+ ],
3358
+ "properties": {
3359
+ "cert": {
3360
+ "type": "object",
3361
+ "additionalProperties": false,
3362
+ "required": [
3363
+ "kid",
3364
+ "spki",
3365
+ "log_id",
3366
+ "tenants",
3367
+ "not_before",
3368
+ "not_after",
3369
+ "serial"
3370
+ ],
3371
+ "properties": {
3372
+ "kid": {
3373
+ "$ref": "#/$defs/hash"
3374
+ },
3375
+ "spki": {
3376
+ "type": "string",
3377
+ "maxLength": 4096,
3378
+ "pattern": "^[A-Za-z0-9+/]+={0,2}$"
3379
+ },
3380
+ "log_id": {
3381
+ "type": "string",
3382
+ "maxLength": 64
3383
+ },
3384
+ "tenants": {
3385
+ "type": "array",
3386
+ "maxItems": 256,
3387
+ "items": {
3388
+ "type": "string",
3389
+ "maxLength": 256
3390
+ }
3391
+ },
3392
+ "not_before": {
3393
+ "type": "integer",
3394
+ "minimum": 0,
3395
+ "maximum": 9007199254740991
3396
+ },
3397
+ "not_after": {
3398
+ "type": "integer",
3399
+ "minimum": 0,
3400
+ "maximum": 9007199254740991
3401
+ },
3402
+ "serial": {
3403
+ "type": "string",
3404
+ "maxLength": 64,
3405
+ "pattern": "^[0-9a-f]+$"
3406
+ }
3407
+ }
3408
+ },
3409
+ "sig": {
3410
+ "type": "string",
3411
+ "maxLength": 128,
3412
+ "pattern": "^[A-Za-z0-9+/]+={0,2}$"
3413
+ }
3414
+ }
3415
+ },
3416
+ "index": {
3417
+ "type": "integer",
3418
+ "minimum": 0,
3419
+ "maximum": 9007199254740991
3420
+ },
3421
+ "inclusion": {
3422
+ "type": "array",
3423
+ "maxItems": 64,
3424
+ "items": {
3425
+ "type": "string",
3426
+ "maxLength": 64,
3427
+ "pattern": "^[A-Za-z0-9+/]+={0,2}$"
3428
+ }
3429
+ },
3430
+ "checkpoint": {
3431
+ "type": "string",
3432
+ "maxLength": 16384
3433
+ }
3434
+ }
3435
+ }
3436
+ }
3437
+ }
3438
+ },
3439
+ "bridge": {
3440
+ "type": "object",
3441
+ "additionalProperties": false,
3442
+ "required": [
3443
+ "v1_kid",
3444
+ "v1_last_seq",
3445
+ "v1_head"
3446
+ ],
3447
+ "description": "the v1 ledger this log continues: its key, the seq and hash of its last (key retirement) record",
3448
+ "properties": {
3449
+ "v1_kid": {
3450
+ "type": "string",
3451
+ "maxLength": 24,
3452
+ "pattern": "^ed25519:[0-9a-f]{16}$"
3453
+ },
3454
+ "v1_last_seq": {
3455
+ "type": "integer",
3456
+ "minimum": 0,
3457
+ "maximum": 9007199254740991
3458
+ },
3459
+ "v1_head": {
3460
+ "type": "string",
3461
+ "maxLength": 64,
3462
+ "pattern": "^[0-9a-f]{64}$"
3463
+ }
3464
+ }
3465
+ }
3466
+ }
3467
+ },
3468
+ "key_retire": {
3469
+ "type": "object",
3470
+ "additionalProperties": false,
3471
+ "required": [
3472
+ "kid",
3473
+ "last_seq"
3474
+ ],
3475
+ "properties": {
3476
+ "kid": {
3477
+ "$ref": "#/$defs/hash"
3478
+ },
3479
+ "last_seq": {
3480
+ "type": "integer",
3481
+ "minimum": 0,
3482
+ "maximum": 9007199254740991
3483
+ }
3484
+ }
3485
+ },
3486
+ "log_closed": {
3487
+ "type": "object",
3488
+ "additionalProperties": false,
3489
+ "required": [
3490
+ "final_seq"
3491
+ ],
3492
+ "properties": {
3493
+ "final_seq": {
3494
+ "type": "integer",
3495
+ "minimum": 0,
3496
+ "maximum": 9007199254740991
3497
+ }
3498
+ }
3499
+ },
3500
+ "reconcile": {
3501
+ "type": "object",
3502
+ "additionalProperties": false,
3503
+ "required": [
3504
+ "layers"
3505
+ ],
3506
+ "properties": {
3507
+ "layers": {
3508
+ "type": "array",
3509
+ "maxItems": 6,
3510
+ "items": {
3511
+ "enum": [
3512
+ "L1",
3513
+ "L2",
3514
+ "L3",
3515
+ "L4",
3516
+ "L5",
3517
+ "L6"
3518
+ ]
3519
+ }
3520
+ },
3521
+ "detail": {
3522
+ "type": "string",
3523
+ "maxLength": 1024
3524
+ }
3525
+ }
3526
+ },
3527
+ "refusal_summary": {
3528
+ "type": "object",
3529
+ "additionalProperties": false,
3530
+ "required": [
3531
+ "code",
3532
+ "count",
3533
+ "from_ts",
3534
+ "to_ts"
3535
+ ],
3536
+ "properties": {
3537
+ "code": {
3538
+ "type": "string",
3539
+ "maxLength": 64
3540
+ },
3541
+ "count": {
3542
+ "type": "integer",
3543
+ "minimum": 1,
3544
+ "maximum": 9007199254740991
3545
+ },
3546
+ "from_ts": {
3547
+ "type": "string",
3548
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
3549
+ "maxLength": 4096
3550
+ },
3551
+ "to_ts": {
3552
+ "type": "string",
3553
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
3554
+ "maxLength": 4096
3555
+ },
3556
+ "identity": {
3557
+ "type": "string",
3558
+ "maxLength": 256
3559
+ }
3560
+ }
3561
+ },
3562
+ "policy_external": {
3563
+ "type": "object",
3564
+ "additionalProperties": false,
3565
+ "required": [
3566
+ "system",
3567
+ "decision",
3568
+ "tool_use_id",
3569
+ "tool",
3570
+ "rule_ids",
3571
+ "signature",
3572
+ "record",
3573
+ "identity",
3574
+ "salt_id"
3575
+ ],
3576
+ "description": "Another system's decision about a tool call, imported by an identity authorized for decision_import (tier T3). The signer's own policy.decision stays authoritative.",
3577
+ "properties": {
3578
+ "system": {
3579
+ "type": "string",
3580
+ "minLength": 1,
3581
+ "maxLength": 64
3582
+ },
3583
+ "decision": {
3584
+ "enum": [
3585
+ "allow",
3586
+ "deny",
3587
+ "ask"
3588
+ ]
3589
+ },
3590
+ "tool_use_id": {
3591
+ "$ref": "#/$defs/id"
3592
+ },
3593
+ "tool": {
3594
+ "type": "string",
3595
+ "minLength": 1,
3596
+ "maxLength": 256
3597
+ },
3598
+ "rule_ids": {
3599
+ "type": "array",
3600
+ "items": {
3601
+ "type": "string",
3602
+ "maxLength": 64
3603
+ },
3604
+ "maxItems": 32
3605
+ },
3606
+ "reason": {
3607
+ "type": "string",
3608
+ "maxLength": 4096,
3609
+ "description": "the system's reason, redacted"
3610
+ },
3611
+ "signature": {
3612
+ "enum": [
3613
+ "verified",
3614
+ "unverified"
3615
+ ],
3616
+ "description": "verified: the system's Ed25519 signature over its record holds under the key the signer's config pins for it"
3617
+ },
3618
+ "record": {
3619
+ "type": "object",
3620
+ "additionalProperties": false,
3621
+ "required": [
3622
+ "hash",
3623
+ "size"
3624
+ ],
3625
+ "description": "the system's own record: an HMAC of its sha256 under this record's salt (salt_id), and its size in bytes",
3626
+ "properties": {
3627
+ "hash": {
3628
+ "type": "string",
3629
+ "pattern": "^hmac-sha256:[0-9a-f]{64}$",
3630
+ "maxLength": 76
3631
+ },
3632
+ "size": {
3633
+ "type": "integer",
3634
+ "minimum": 0,
3635
+ "maximum": 9007199254740991
3636
+ }
3637
+ }
3638
+ },
3639
+ "identity": {
3640
+ "type": "object",
3641
+ "additionalProperties": false,
3642
+ "required": [
3643
+ "scheme",
3644
+ "subject",
3645
+ "attested"
3646
+ ],
3647
+ "properties": {
3648
+ "scheme": {
3649
+ "enum": [
3650
+ "uid",
3651
+ "harness",
3652
+ "token",
3653
+ "k8s_sa",
3654
+ "mtls",
3655
+ "oidc"
3656
+ ]
3657
+ },
3658
+ "subject": {
3659
+ "type": "string",
3660
+ "maxLength": 256
3661
+ },
3662
+ "attested": {
3663
+ "type": "boolean"
3664
+ }
3665
+ }
3666
+ },
3667
+ "salt_id": {
3668
+ "$ref": "#/$defs/id",
3669
+ "description": "the signer's salt id for this record's commitments (salt label <type>:<salt_id>)"
3670
+ }
3671
+ }
3672
+ },
3673
+ "content_accessed": {
3674
+ "type": "object",
3675
+ "additionalProperties": false,
3676
+ "required": [
3677
+ "principal",
3678
+ "run_id",
3679
+ "seqs",
3680
+ "purpose"
3681
+ ],
3682
+ "description": "The signer returned retained content of records of a run of this tenant (format 1.1; content_get): who asked, the run, its run_seqs and why. Never the content.",
3683
+ "properties": {
3684
+ "principal": {
3685
+ "type": "string",
3686
+ "maxLength": 256
3687
+ },
3688
+ "run_id": {
3689
+ "type": "string",
3690
+ "maxLength": 128
3691
+ },
3692
+ "seqs": {
3693
+ "type": "array",
3694
+ "maxItems": 1000,
3695
+ "items": {
3696
+ "type": "integer",
3697
+ "minimum": 0,
3698
+ "maximum": 9007199254740991
3699
+ }
3700
+ },
3701
+ "purpose": {
3702
+ "type": "string",
3703
+ "maxLength": 512
3704
+ }
3705
+ }
3706
+ },
3707
+ "content_erased": {
3708
+ "type": "object",
3709
+ "additionalProperties": false,
3710
+ "required": [
3711
+ "run_id",
3712
+ "reason",
3713
+ "by"
3714
+ ],
3715
+ "description": "The signer deleted the retained content of a run of this tenant (format 1.1; content_erase or retention); the run's records are unchanged.",
3716
+ "properties": {
3717
+ "run_id": {
3718
+ "type": "string",
3719
+ "maxLength": 128
3720
+ },
3721
+ "reason": {
3722
+ "type": "string",
3723
+ "maxLength": 1024
3724
+ },
3725
+ "by": {
3726
+ "type": "string",
3727
+ "maxLength": 256
3728
+ }
3729
+ }
3730
+ },
3731
+ "why_finding": {
3732
+ "type": "object",
3733
+ "additionalProperties": false,
3734
+ "required": [
3735
+ "target",
3736
+ "intervention",
3737
+ "n",
3738
+ "p_with",
3739
+ "p_without",
3740
+ "effect",
3741
+ "interval",
3742
+ "verdict",
3743
+ "replay_runs",
3744
+ "models",
3745
+ "rung",
3746
+ "off_tape",
3747
+ "investigation",
3748
+ "looks",
3749
+ "family",
3750
+ "min_effect",
3751
+ "applied",
3752
+ "stopped"
3753
+ ],
3754
+ "description": "A finished tracekit why test (format 1.1; why_finding), written in a findings run about the run it analyses: how often the target happened in the control arm (p_with) and with the intervention (p_without) over n paired replays, the interval and verdict with what they were decided on (looks: the sequential test's planned looks, family: the tests corrected for together, min_effect, applied: whether the intervention matched anything, stopped: why the test ended), every replay run with its arm and outcome, and the replay runs of the investigation it does not count (uncounted: the surrogate's ranking calls, arms a budget stop abandoned). rung 1: one recorded model call re-sent; rung 2: the agent loop re-simulated from the recorded run.",
3755
+ "properties": {
3756
+ "target": {
3757
+ "type": "string",
3758
+ "maxLength": 1024
3759
+ },
3760
+ "intervention": {
3761
+ "type": "string",
3762
+ "maxLength": 1024
3763
+ },
3764
+ "n": {
3765
+ "type": "integer",
3766
+ "minimum": 0,
3767
+ "maximum": 9007199254740991
3768
+ },
3769
+ "p_with": {
3770
+ "type": "number",
3771
+ "minimum": 0,
3772
+ "maximum": 1
3773
+ },
3774
+ "p_without": {
3775
+ "type": "number",
3776
+ "minimum": 0,
3777
+ "maximum": 1
3778
+ },
3779
+ "effect": {
3780
+ "type": "number",
3781
+ "minimum": -1,
3782
+ "maximum": 1
3783
+ },
3784
+ "interval": {
3785
+ "type": "array",
3786
+ "minItems": 2,
3787
+ "maxItems": 2,
3788
+ "items": {
3789
+ "type": "number",
3790
+ "minimum": -1,
3791
+ "maximum": 1
3792
+ }
3793
+ },
3794
+ "verdict": {
3795
+ "enum": [
3796
+ "causal",
3797
+ "suppressive",
3798
+ "ruled-out",
3799
+ "inconclusive",
3800
+ "not-applied"
3801
+ ]
3802
+ },
3803
+ "replay_runs": {
3804
+ "type": "array",
3805
+ "maxItems": 4096,
3806
+ "items": {
3807
+ "type": "object",
3808
+ "additionalProperties": false,
3809
+ "required": [
3810
+ "run_id",
3811
+ "arm",
3812
+ "hit"
3813
+ ],
3814
+ "properties": {
3815
+ "run_id": {
3816
+ "$ref": "#/$defs/id"
3817
+ },
3818
+ "arm": {
3819
+ "enum": [
3820
+ "control",
3821
+ "ablated"
3822
+ ]
3823
+ },
3824
+ "hit": {
3825
+ "type": "boolean"
3826
+ }
3827
+ }
3828
+ }
3829
+ },
3830
+ "models": {
3831
+ "type": "array",
3832
+ "maxItems": 32,
3833
+ "items": {
3834
+ "type": "string",
3835
+ "maxLength": 128
3836
+ }
3837
+ },
3838
+ "rung": {
3839
+ "enum": [
3840
+ 1,
3841
+ 2
3842
+ ]
3843
+ },
3844
+ "off_tape": {
3845
+ "type": "integer",
3846
+ "minimum": 0,
3847
+ "maximum": 9007199254740991
3848
+ },
3849
+ "investigation": {
3850
+ "$ref": "#/$defs/id"
3851
+ },
3852
+ "looks": {
3853
+ "type": "integer",
3854
+ "minimum": 1,
3855
+ "maximum": 4096
3856
+ },
3857
+ "family": {
3858
+ "type": "integer",
3859
+ "minimum": 1,
3860
+ "maximum": 4096
3861
+ },
3862
+ "min_effect": {
3863
+ "type": "number",
3864
+ "minimum": 0,
3865
+ "maximum": 1
3866
+ },
3867
+ "applied": {
3868
+ "type": "boolean"
3869
+ },
3870
+ "stopped": {
3871
+ "enum": [
3872
+ "decisive",
3873
+ "futility",
3874
+ "n_max",
3875
+ "budget"
3876
+ ]
3877
+ },
3878
+ "uncounted": {
3879
+ "type": "array",
3880
+ "maxItems": 4096,
3881
+ "items": {
3882
+ "type": "object",
3883
+ "additionalProperties": false,
3884
+ "required": [
3885
+ "run_id",
3886
+ "reason"
3887
+ ],
3888
+ "properties": {
3889
+ "run_id": {
3890
+ "$ref": "#/$defs/id"
3891
+ },
3892
+ "reason": {
3893
+ "enum": [
3894
+ "ranking",
3895
+ "budget"
3896
+ ]
3897
+ }
3898
+ }
3899
+ }
3900
+ }
3901
+ }
3902
+ },
3903
+ "incident_opened": {
3904
+ "type": "object",
3905
+ "additionalProperties": false,
3906
+ "required": [
3907
+ "incident_id",
3908
+ "trigger",
3909
+ "rule_ids",
3910
+ "scope",
3911
+ "cites",
3912
+ "mode",
3913
+ "actions",
3914
+ "would"
3915
+ ],
3916
+ "description": "format 1.2: a trigger of the policy's detection fired (a sequence completed, a limit was exceeded, or a respond trigger), an operator held or quarantined a run (trigger operator), or the detector could not vouch for a decision under an enforced response (detector_unavailable); one open incident per scope, trigger and rule, later matches are incident.updated. mode shadow: no action taken, `would` the configured one; mode enforce: `actions` the ones taken (none while the response engine is paused: then `would` and `reason` say so)",
3917
+ "properties": {
3918
+ "incident_id": {
3919
+ "$ref": "#/$defs/id"
3920
+ },
3921
+ "trigger": {
3922
+ "enum": [
3923
+ "sequence",
3924
+ "limit",
3925
+ "executed_against_policy",
3926
+ "denied_calls",
3927
+ "provenance",
3928
+ "class_mismatch",
3929
+ "refusal_burst",
3930
+ "tamper",
3931
+ "operator",
3932
+ "detector_unavailable",
3933
+ "unexplained_effect"
3934
+ ]
3935
+ },
3936
+ "rule_ids": {
3937
+ "type": "array",
3938
+ "maxItems": 1024,
3939
+ "items": {
3940
+ "type": "string",
3941
+ "maxLength": 256
3942
+ }
3943
+ },
3944
+ "scope": {
3945
+ "type": "object",
3946
+ "additionalProperties": false,
3947
+ "required": [
3948
+ "kind",
3949
+ "id"
3950
+ ],
3951
+ "properties": {
3952
+ "kind": {
3953
+ "enum": [
3954
+ "run",
3955
+ "session",
3956
+ "owner",
3957
+ "principal"
3958
+ ]
3959
+ },
3960
+ "id": {
3961
+ "type": "string",
3962
+ "maxLength": 256
3963
+ }
3964
+ }
3965
+ },
3966
+ "cites": {
3967
+ "type": "array",
3968
+ "maxItems": 64,
3969
+ "items": {
3970
+ "type": "object",
3971
+ "additionalProperties": false,
3972
+ "required": [
3973
+ "run_id",
3974
+ "run_seq"
3975
+ ],
3976
+ "properties": {
3977
+ "run_id": {
3978
+ "type": "string",
3979
+ "minLength": 1,
3980
+ "maxLength": 200
3981
+ },
3982
+ "run_seq": {
3983
+ "type": "integer",
3984
+ "minimum": 0
3985
+ }
3986
+ }
3987
+ },
3988
+ "description": "the records that make up the match"
3989
+ },
3990
+ "mode": {
3991
+ "enum": [
3992
+ "shadow",
3993
+ "enforce"
3994
+ ]
3995
+ },
3996
+ "actions": {
3997
+ "type": "array",
3998
+ "maxItems": 3,
3999
+ "items": {
4000
+ "enum": [
4001
+ "notify",
4002
+ "hold",
4003
+ "quarantine"
4004
+ ]
4005
+ }
4006
+ },
4007
+ "would": {
4008
+ "type": "array",
4009
+ "maxItems": 4,
4010
+ "items": {
4011
+ "enum": [
4012
+ "notify",
4013
+ "hold",
4014
+ "quarantine",
4015
+ "suspend"
4016
+ ]
4017
+ }
4018
+ },
4019
+ "reason": {
4020
+ "type": "string",
4021
+ "maxLength": 1024,
4022
+ "description": "why the actions differ from the configured one (paused, no person approvers), or an operator's reason"
4023
+ },
4024
+ "in_flight": {
4025
+ "type": "array",
4026
+ "maxItems": 1024,
4027
+ "description": "format 1.2: calls allowed (or approved and consumed) and not completed when the response took effect: they may complete after it",
4028
+ "items": {
4029
+ "type": "object",
4030
+ "additionalProperties": false,
4031
+ "required": [
4032
+ "run_id",
4033
+ "tool_call_id",
4034
+ "decision_id"
4035
+ ],
4036
+ "properties": {
4037
+ "run_id": {
4038
+ "type": "string",
4039
+ "minLength": 1,
4040
+ "maxLength": 200
4041
+ },
4042
+ "tool_call_id": {
4043
+ "$ref": "#/$defs/id"
4044
+ },
4045
+ "decision_id": {
4046
+ "$ref": "#/$defs/id"
4047
+ }
4048
+ }
4049
+ }
4050
+ }
4051
+ }
4052
+ },
4053
+ "incident_updated": {
4054
+ "type": "object",
4055
+ "additionalProperties": false,
4056
+ "required": [
4057
+ "incident_id",
4058
+ "cites"
4059
+ ],
4060
+ "description": "format 1.2: another match of an open incident (at most one per window of its trigger), written in the run whose record matched",
4061
+ "properties": {
4062
+ "incident_id": {
4063
+ "$ref": "#/$defs/id"
4064
+ },
4065
+ "cites": {
4066
+ "type": "array",
4067
+ "maxItems": 64,
4068
+ "items": {
4069
+ "type": "object",
4070
+ "additionalProperties": false,
4071
+ "required": [
4072
+ "run_id",
4073
+ "run_seq"
4074
+ ],
4075
+ "properties": {
4076
+ "run_id": {
4077
+ "type": "string",
4078
+ "minLength": 1,
4079
+ "maxLength": 200
4080
+ },
4081
+ "run_seq": {
4082
+ "type": "integer",
4083
+ "minimum": 0
4084
+ }
4085
+ }
4086
+ }
4087
+ }
4088
+ }
4089
+ },
4090
+ "incident_capped": {
4091
+ "type": "object",
4092
+ "additionalProperties": false,
4093
+ "required": [
4094
+ "cap",
4095
+ "max",
4096
+ "trigger",
4097
+ "reason"
4098
+ ],
4099
+ "description": "format 1.2: a cap on opened incidents was reached: the run's per trigger (cap run), or per minute the tenant's or one run's share of it (cap tenant); the incidents after it are not written",
4100
+ "properties": {
4101
+ "cap": {
4102
+ "enum": [
4103
+ "run",
4104
+ "tenant"
4105
+ ]
4106
+ },
4107
+ "trigger": {
4108
+ "enum": [
4109
+ "sequence",
4110
+ "limit",
4111
+ "executed_against_policy",
4112
+ "denied_calls",
4113
+ "provenance",
4114
+ "class_mismatch",
4115
+ "refusal_burst",
4116
+ "tamper",
4117
+ "operator",
4118
+ "detector_unavailable",
4119
+ "unexplained_effect"
4120
+ ],
4121
+ "description": "the trigger of the first incident not written"
4122
+ },
4123
+ "max": {
4124
+ "type": "integer",
4125
+ "minimum": 1
4126
+ },
4127
+ "reason": {
4128
+ "type": "string",
4129
+ "maxLength": 512
4130
+ }
4131
+ }
4132
+ },
4133
+ "run_held": {
4134
+ "type": "object",
4135
+ "additionalProperties": false,
4136
+ "required": [
4137
+ "incident_id",
4138
+ "scope",
4139
+ "by",
4140
+ "reason"
4141
+ ],
4142
+ "description": "format 1.2: the run is held: every further call is asked of a person (TK-HOLD) and its live approvals expired; written in each run the incident's scope reaches",
4143
+ "properties": {
4144
+ "incident_id": {
4145
+ "$ref": "#/$defs/id"
4146
+ },
4147
+ "scope": {
4148
+ "type": "object",
4149
+ "additionalProperties": false,
4150
+ "required": [
4151
+ "kind",
4152
+ "id"
4153
+ ],
4154
+ "properties": {
4155
+ "kind": {
4156
+ "enum": [
4157
+ "run",
4158
+ "session",
4159
+ "owner",
4160
+ "principal"
4161
+ ]
4162
+ },
4163
+ "id": {
4164
+ "type": "string",
4165
+ "maxLength": 256
4166
+ }
4167
+ }
4168
+ },
4169
+ "by": {
4170
+ "type": "string",
4171
+ "maxLength": 256,
4172
+ "description": "signer, or the operator's identity"
4173
+ },
4174
+ "reason": {
4175
+ "type": "string",
4176
+ "maxLength": 1024
4177
+ },
4178
+ "in_flight": {
4179
+ "type": "array",
4180
+ "maxItems": 1024,
4181
+ "description": "format 1.2: calls allowed (or approved and consumed) and not completed when the response took effect: they may complete after it",
4182
+ "items": {
4183
+ "type": "object",
4184
+ "additionalProperties": false,
4185
+ "required": [
4186
+ "run_id",
4187
+ "tool_call_id",
4188
+ "decision_id"
4189
+ ],
4190
+ "properties": {
4191
+ "run_id": {
4192
+ "type": "string",
4193
+ "minLength": 1,
4194
+ "maxLength": 200
4195
+ },
4196
+ "tool_call_id": {
4197
+ "$ref": "#/$defs/id"
4198
+ },
4199
+ "decision_id": {
4200
+ "$ref": "#/$defs/id"
4201
+ }
4202
+ }
4203
+ }
4204
+ },
4205
+ "inherited": {
4206
+ "const": true,
4207
+ "description": "a new run of a held owner and principal (or of a held parent run) took the hold over"
4208
+ },
4209
+ "inherit_until": {
4210
+ "type": "string",
4211
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
4212
+ "maxLength": 27,
4213
+ "description": "until when new runs of this run's owner and attested principal inherit the hold"
4214
+ }
4215
+ }
4216
+ },
4217
+ "run_resumed": {
4218
+ "type": "object",
4219
+ "additionalProperties": false,
4220
+ "required": [
4221
+ "incident_id",
4222
+ "by",
4223
+ "person",
4224
+ "held_by"
4225
+ ],
4226
+ "description": "format 1.2: a person ended the hold of one incident on the run (run_resume, which ends each, or incident_resolve of that incident); held_by: the incidents that still hold it",
4227
+ "properties": {
4228
+ "incident_id": {
4229
+ "$ref": "#/$defs/id"
4230
+ },
4231
+ "by": {
4232
+ "type": "string",
4233
+ "maxLength": 256
4234
+ },
4235
+ "person": {
4236
+ "type": "string",
4237
+ "maxLength": 256
4238
+ },
4239
+ "reason": {
4240
+ "type": "string",
4241
+ "maxLength": 1024
4242
+ },
4243
+ "break_glass": {
4244
+ "const": true
4245
+ },
4246
+ "held_by": {
4247
+ "type": "array",
4248
+ "maxItems": 1024,
4249
+ "items": {
4250
+ "$ref": "#/$defs/id"
4251
+ }
4252
+ }
4253
+ }
4254
+ },
4255
+ "run_quarantined": {
4256
+ "type": "object",
4257
+ "additionalProperties": false,
4258
+ "required": [
4259
+ "incident_id",
4260
+ "scope",
4261
+ "by",
4262
+ "reason"
4263
+ ],
4264
+ "description": "format 1.2: the run is quarantined for good: decisions are deny (TK-QUARANTINE), approvals are refused, a gateway forwards no more model requests",
4265
+ "properties": {
4266
+ "incident_id": {
4267
+ "$ref": "#/$defs/id"
4268
+ },
4269
+ "scope": {
4270
+ "type": "object",
4271
+ "additionalProperties": false,
4272
+ "required": [
4273
+ "kind",
4274
+ "id"
4275
+ ],
4276
+ "properties": {
4277
+ "kind": {
4278
+ "enum": [
4279
+ "run",
4280
+ "session",
4281
+ "owner",
4282
+ "principal"
4283
+ ]
4284
+ },
4285
+ "id": {
4286
+ "type": "string",
4287
+ "maxLength": 256
4288
+ }
4289
+ }
4290
+ },
4291
+ "by": {
4292
+ "type": "string",
4293
+ "maxLength": 256
4294
+ },
4295
+ "reason": {
4296
+ "type": "string",
4297
+ "maxLength": 1024
4298
+ },
4299
+ "in_flight": {
4300
+ "type": "array",
4301
+ "maxItems": 1024,
4302
+ "description": "format 1.2: calls allowed (or approved and consumed) and not completed when the response took effect: they may complete after it",
4303
+ "items": {
4304
+ "type": "object",
4305
+ "additionalProperties": false,
4306
+ "required": [
4307
+ "run_id",
4308
+ "tool_call_id",
4309
+ "decision_id"
4310
+ ],
4311
+ "properties": {
4312
+ "run_id": {
4313
+ "type": "string",
4314
+ "minLength": 1,
4315
+ "maxLength": 200
4316
+ },
4317
+ "tool_call_id": {
4318
+ "$ref": "#/$defs/id"
4319
+ },
4320
+ "decision_id": {
4321
+ "$ref": "#/$defs/id"
4322
+ }
4323
+ }
4324
+ }
4325
+ },
4326
+ "inherited": {
4327
+ "const": true
4328
+ },
4329
+ "inherit_until": {
4330
+ "type": "string",
4331
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
4332
+ "maxLength": 27,
4333
+ "description": "until when new runs of this run's owner and attested principal inherit the hold"
4334
+ }
4335
+ }
4336
+ },
4337
+ "incident_resolved": {
4338
+ "type": "object",
4339
+ "additionalProperties": false,
4340
+ "required": [
4341
+ "incident_id",
4342
+ "by",
4343
+ "person"
4344
+ ],
4345
+ "description": "format 1.2: a person resolved the incident (in the tenant's signer run): its held runs resume, quarantines stay",
4346
+ "properties": {
4347
+ "incident_id": {
4348
+ "$ref": "#/$defs/id"
4349
+ },
4350
+ "by": {
4351
+ "type": "string",
4352
+ "maxLength": 256
4353
+ },
4354
+ "person": {
4355
+ "type": "string",
4356
+ "maxLength": 256
4357
+ },
4358
+ "reason": {
4359
+ "type": "string",
4360
+ "maxLength": 1024
4361
+ },
4362
+ "break_glass": {
4363
+ "const": true
4364
+ },
4365
+ "resumed": {
4366
+ "type": "array",
4367
+ "maxItems": 4096,
4368
+ "items": {
4369
+ "type": "string",
4370
+ "maxLength": 200
4371
+ }
4372
+ }
4373
+ }
4374
+ },
4375
+ "incident_response": {
4376
+ "type": "object",
4377
+ "additionalProperties": false,
4378
+ "required": [
4379
+ "enabled",
4380
+ "by"
4381
+ ],
4382
+ "description": "format 1.2: an operator paused (enabled false) or resumed the tenant's response engine; detection keeps recording",
4383
+ "properties": {
4384
+ "enabled": {
4385
+ "type": "boolean"
4386
+ },
4387
+ "by": {
4388
+ "type": "string",
4389
+ "maxLength": 256
4390
+ },
4391
+ "reason": {
4392
+ "type": "string",
4393
+ "maxLength": 1024
4394
+ }
4395
+ }
4396
+ },
4397
+ "identity_suspension": {
4398
+ "type": "object",
4399
+ "additionalProperties": false,
4400
+ "required": [
4401
+ "identity",
4402
+ "state",
4403
+ "by"
4404
+ ],
4405
+ "description": "format 1.2: an identity of the tenant is suspended by an operator (written by the signer that changed the shared list), enforced (each signer that starts enforcing an entry) or lifted",
4406
+ "properties": {
4407
+ "identity": {
4408
+ "type": "string",
4409
+ "maxLength": 256
4410
+ },
4411
+ "state": {
4412
+ "enum": [
4413
+ "suspended",
4414
+ "enforced",
4415
+ "lifted"
4416
+ ]
4417
+ },
4418
+ "by": {
4419
+ "type": "string",
4420
+ "maxLength": 256
4421
+ },
4422
+ "reason": {
4423
+ "type": "string",
4424
+ "maxLength": 1024
4425
+ }
4426
+ }
4427
+ },
4428
+ "effect_observed": {
4429
+ "type": "object",
4430
+ "additionalProperties": false,
4431
+ "required": [
4432
+ "observer",
4433
+ "kind",
4434
+ "host",
4435
+ "port",
4436
+ "bytes_out",
4437
+ "bytes_in",
4438
+ "connections",
4439
+ "first_ts",
4440
+ "last_ts",
4441
+ "attribution"
4442
+ ],
4443
+ "description": "format 1.2: network traffic an egress observer outside the agent saw for the run (tracekit.egress), aggregated per host, port and minute; signer-written",
4444
+ "properties": {
4445
+ "observer": {
4446
+ "type": "string",
4447
+ "maxLength": 256,
4448
+ "description": "the egress observer's signer identity (scheme:subject)"
4449
+ },
4450
+ "kind": {
4451
+ "enum": [
4452
+ "net"
4453
+ ]
4454
+ },
4455
+ "host": {
4456
+ "type": "string",
4457
+ "minLength": 1,
4458
+ "maxLength": 253
4459
+ },
4460
+ "port": {
4461
+ "type": "integer",
4462
+ "minimum": 1,
4463
+ "maximum": 65535
4464
+ },
4465
+ "bytes_out": {
4466
+ "type": "integer",
4467
+ "minimum": 0,
4468
+ "maximum": 9007199254740991
4469
+ },
4470
+ "bytes_in": {
4471
+ "type": "integer",
4472
+ "minimum": 0,
4473
+ "maximum": 9007199254740991
4474
+ },
4475
+ "connections": {
4476
+ "type": "integer",
4477
+ "minimum": 0,
4478
+ "maximum": 9007199254740991
4479
+ },
4480
+ "first_ts": {
4481
+ "type": "string",
4482
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
4483
+ "maxLength": 27
4484
+ },
4485
+ "last_ts": {
4486
+ "type": "string",
4487
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z$",
4488
+ "maxLength": 27
4489
+ },
4490
+ "attribution": {
4491
+ "enum": [
4492
+ "token",
4493
+ "identity"
4494
+ ],
4495
+ "description": "token: the client presented the run's token; identity: the observer authenticated the run's owner and the signer picked that owner's latest open run"
4496
+ },
4497
+ "explained_by": {
4498
+ "enum": [
4499
+ "call",
4500
+ "explains"
4501
+ ],
4502
+ "description": "what explains the host: a recorded http or model call to it, or the policy's explains; absent: unexplained (a reconcile.unexplained_effect follows)"
4503
+ }
4504
+ }
4505
+ },
4506
+ "reconcile_effect": {
4507
+ "type": "object",
4508
+ "additionalProperties": false,
4509
+ "required": [
4510
+ "layers",
4511
+ "observer",
4512
+ "kind",
4513
+ "host"
4514
+ ],
4515
+ "description": "format 1.2: a host an observer saw the run reach that no record of the run explains",
4516
+ "properties": {
4517
+ "layers": {
4518
+ "type": "array",
4519
+ "maxItems": 6,
4520
+ "items": {
4521
+ "enum": [
4522
+ "L1",
4523
+ "L2",
4524
+ "L3",
4525
+ "L4",
4526
+ "L5",
4527
+ "L6"
4528
+ ]
4529
+ }
4530
+ },
4531
+ "detail": {
4532
+ "type": "string",
4533
+ "maxLength": 1024
4534
+ },
4535
+ "observer": {
4536
+ "type": "string",
4537
+ "maxLength": 256,
4538
+ "description": "the egress observer's signer identity (scheme:subject)"
4539
+ },
4540
+ "kind": {
4541
+ "enum": [
4542
+ "net"
4543
+ ]
4544
+ },
4545
+ "host": {
4546
+ "type": "string",
4547
+ "minLength": 1,
4548
+ "maxLength": 253
4549
+ },
4550
+ "port": {
4551
+ "type": "integer",
4552
+ "minimum": 1,
4553
+ "maximum": 65535
4554
+ }
4555
+ }
4556
+ },
4557
+ "coverage_class": {
4558
+ "type": "object",
4559
+ "additionalProperties": false,
4560
+ "required": [
4561
+ "status",
4562
+ "layers"
4563
+ ],
4564
+ "properties": {
4565
+ "status": {
4566
+ "enum": [
4567
+ "enforced",
4568
+ "observed",
4569
+ "reported",
4570
+ "none"
4571
+ ]
4572
+ },
4573
+ "layers": {
4574
+ "type": "array",
4575
+ "maxItems": 8,
4576
+ "items": {
4577
+ "type": "string",
4578
+ "maxLength": 32
4579
+ }
4580
+ },
4581
+ "asserted": {
4582
+ "const": true,
4583
+ "description": "the status rests on the operator's posture (signer.yaml), not on anything the signer measured"
4584
+ }
4585
+ }
4586
+ }
4587
+ }
4588
+ }