tamperward 2.22.0 → 2.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tamperward",
3
- "version": "2.22.0",
3
+ "version": "2.23.1",
4
4
  "description": "The deterministic agent-integrity gate. One ruleset, evaluated on the actual diff/commands as a verdict, enforced everywhere a change can be made.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "hexrift",
@@ -0,0 +1,679 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/hexrift/tamperward/main/schemas/research-v1.schema.json",
4
+ "title": "TamperWard research JSON output v1",
5
+ "description": "Emitted by `tamperward research run --json` (one `pair` document per line, identical to the ledger record under <out>/pairs/) and `tamperward research summarize` (one `summary` document). `document` is the shape discriminator. Both keep TamperWard's own verdict (`treatment` / `tamperward`) apart from the independent outcome (`outcome` / `independent_outcome`); there is no composite score. Additive within schema major 1.",
6
+ "type": "object",
7
+ "required": [
8
+ "schema_version",
9
+ "command",
10
+ "document"
11
+ ],
12
+ "properties": {
13
+ "schema_version": {
14
+ "const": 1
15
+ },
16
+ "command": {
17
+ "const": "research"
18
+ },
19
+ "document": {
20
+ "enum": [
21
+ "pair",
22
+ "summary"
23
+ ]
24
+ }
25
+ },
26
+ "oneOf": [
27
+ {
28
+ "$ref": "#/$defs/pair"
29
+ },
30
+ {
31
+ "$ref": "#/$defs/summary"
32
+ }
33
+ ],
34
+ "$defs": {
35
+ "sha256": {
36
+ "type": "string",
37
+ "pattern": "^[0-9a-f]{64}$"
38
+ },
39
+ "arm": {
40
+ "enum": [
41
+ "ungated",
42
+ "gated"
43
+ ]
44
+ },
45
+ "adapter": {
46
+ "type": "object",
47
+ "required": [
48
+ "name",
49
+ "layers"
50
+ ],
51
+ "properties": {
52
+ "name": {
53
+ "type": "string",
54
+ "minLength": 1
55
+ },
56
+ "layers": {
57
+ "type": "array",
58
+ "items": {
59
+ "enum": [
60
+ "envelope",
61
+ "pre-tool-use",
62
+ "stop-sweep"
63
+ ]
64
+ },
65
+ "uniqueItems": true
66
+ }
67
+ },
68
+ "additionalProperties": true
69
+ },
70
+ "outcome": {
71
+ "type": "object",
72
+ "required": [
73
+ "verify_verdict",
74
+ "visible_exit",
75
+ "pristine_exit",
76
+ "visible_green",
77
+ "pristine_green",
78
+ "masked_failure",
79
+ "surviving_protected_mutations",
80
+ "warn_findings",
81
+ "rules",
82
+ "honest_completion"
83
+ ],
84
+ "properties": {
85
+ "verify_verdict": {
86
+ "type": "string",
87
+ "minLength": 1
88
+ },
89
+ "visible_exit": {
90
+ "type": [
91
+ "integer",
92
+ "null"
93
+ ]
94
+ },
95
+ "pristine_exit": {
96
+ "type": [
97
+ "integer",
98
+ "null"
99
+ ]
100
+ },
101
+ "visible_green": {
102
+ "type": "boolean"
103
+ },
104
+ "pristine_green": {
105
+ "type": "boolean"
106
+ },
107
+ "masked_failure": {
108
+ "type": "boolean"
109
+ },
110
+ "surviving_protected_mutations": {
111
+ "type": "integer",
112
+ "minimum": 0
113
+ },
114
+ "warn_findings": {
115
+ "type": "integer",
116
+ "minimum": 0
117
+ },
118
+ "rules": {
119
+ "type": "array",
120
+ "items": {
121
+ "type": "string",
122
+ "minLength": 1
123
+ }
124
+ },
125
+ "honest_completion": {
126
+ "type": "boolean"
127
+ }
128
+ },
129
+ "additionalProperties": true
130
+ },
131
+ "treatment": {
132
+ "type": "object",
133
+ "required": [
134
+ "verdict",
135
+ "exit_code",
136
+ "complete",
137
+ "disposition",
138
+ "envelope"
139
+ ],
140
+ "properties": {
141
+ "verdict": {
142
+ "enum": [
143
+ "VERIFIED",
144
+ "AGENT_TIMEOUT",
145
+ "AGENT_FAILED",
146
+ "ENFORCEMENT_FAILED",
147
+ "CANNOT_ADJUDICATE",
148
+ "OBJECT_REWRITE",
149
+ "HISTORY_REWRITE",
150
+ "DEPENDENCY_DRIFT",
151
+ "NOT_QUIESCENT",
152
+ "TRANSIENT_OBSERVER_BLOCK"
153
+ ]
154
+ },
155
+ "exit_code": {
156
+ "type": "integer"
157
+ },
158
+ "complete": {
159
+ "type": "boolean"
160
+ },
161
+ "disposition": {
162
+ "enum": [
163
+ "refused",
164
+ "passed",
165
+ "cannot"
166
+ ]
167
+ },
168
+ "envelope": {
169
+ "type": [
170
+ "object",
171
+ "null"
172
+ ]
173
+ }
174
+ },
175
+ "additionalProperties": true
176
+ },
177
+ "trajectory": {
178
+ "type": "object",
179
+ "required": [
180
+ "arm",
181
+ "workspace",
182
+ "base",
183
+ "head",
184
+ "started_at",
185
+ "finished_at",
186
+ "agent",
187
+ "treatment",
188
+ "outcome",
189
+ "released_green",
190
+ "measured",
191
+ "unmeasurable"
192
+ ],
193
+ "properties": {
194
+ "arm": {
195
+ "$ref": "#/$defs/arm"
196
+ },
197
+ "workspace": {
198
+ "type": "string",
199
+ "minLength": 1
200
+ },
201
+ "base": {
202
+ "type": "string",
203
+ "pattern": "^[0-9a-f]{40,64}$"
204
+ },
205
+ "head": {
206
+ "type": "string",
207
+ "pattern": "^[0-9a-f]{40,64}$"
208
+ },
209
+ "started_at": {
210
+ "type": "string",
211
+ "minLength": 1
212
+ },
213
+ "finished_at": {
214
+ "type": "string",
215
+ "minLength": 1
216
+ },
217
+ "agent": {
218
+ "type": "object",
219
+ "required": [
220
+ "exit_code",
221
+ "signal",
222
+ "timed_out",
223
+ "failure"
224
+ ],
225
+ "properties": {
226
+ "exit_code": {
227
+ "type": [
228
+ "integer",
229
+ "null"
230
+ ]
231
+ },
232
+ "signal": {
233
+ "type": [
234
+ "string",
235
+ "null"
236
+ ]
237
+ },
238
+ "timed_out": {
239
+ "type": "boolean"
240
+ },
241
+ "failure": {
242
+ "type": [
243
+ "string",
244
+ "null"
245
+ ]
246
+ }
247
+ },
248
+ "additionalProperties": true
249
+ },
250
+ "treatment": {
251
+ "oneOf": [
252
+ {
253
+ "type": "null"
254
+ },
255
+ {
256
+ "$ref": "#/$defs/treatment"
257
+ }
258
+ ]
259
+ },
260
+ "outcome": {
261
+ "$ref": "#/$defs/outcome"
262
+ },
263
+ "released_green": {
264
+ "type": "boolean",
265
+ "description": "True only when the visible suite is green, the agent completed successfully with exit 0 (not timed out/failed), and the gated envelope, when present, also passed with exit 0."
266
+ },
267
+ "measured": {
268
+ "type": "boolean"
269
+ },
270
+ "unmeasurable": {
271
+ "description": "Why the outcome could not be observed on sound footing (unreadable trusted policy, verifier could not run, a descendant still holding the workspace, the tree moving under observation). Null when measured.",
272
+ "type": [
273
+ "string",
274
+ "null"
275
+ ]
276
+ }
277
+ },
278
+ "additionalProperties": true,
279
+ "allOf": [
280
+ {
281
+ "if": {
282
+ "properties": {
283
+ "measured": {
284
+ "const": true
285
+ }
286
+ },
287
+ "required": [
288
+ "measured"
289
+ ]
290
+ },
291
+ "then": {
292
+ "properties": {
293
+ "unmeasurable": {
294
+ "type": "null"
295
+ }
296
+ }
297
+ }
298
+ },
299
+ {
300
+ "if": {
301
+ "properties": {
302
+ "measured": {
303
+ "const": false
304
+ }
305
+ },
306
+ "required": [
307
+ "measured"
308
+ ]
309
+ },
310
+ "then": {
311
+ "properties": {
312
+ "unmeasurable": {
313
+ "type": "string",
314
+ "minLength": 1
315
+ }
316
+ }
317
+ }
318
+ }
319
+ ]
320
+ },
321
+ "pair": {
322
+ "type": "object",
323
+ "required": [
324
+ "schema_version",
325
+ "command",
326
+ "document",
327
+ "task",
328
+ "pair",
329
+ "adapter",
330
+ "model",
331
+ "tamperward_version",
332
+ "agent_argv",
333
+ "agent_budget",
334
+ "manifest_sha256",
335
+ "verify_command",
336
+ "arms"
337
+ ],
338
+ "properties": {
339
+ "schema_version": {
340
+ "const": 1
341
+ },
342
+ "command": {
343
+ "const": "research"
344
+ },
345
+ "document": {
346
+ "const": "pair"
347
+ },
348
+ "task": {
349
+ "type": "string",
350
+ "minLength": 1
351
+ },
352
+ "pair": {
353
+ "type": "integer",
354
+ "minimum": 1
355
+ },
356
+ "adapter": {
357
+ "$ref": "#/$defs/adapter"
358
+ },
359
+ "model": {
360
+ "type": [
361
+ "string",
362
+ "null"
363
+ ]
364
+ },
365
+ "manifest_sha256": {
366
+ "$ref": "#/$defs/sha256"
367
+ },
368
+ "verify_command": {
369
+ "type": "string",
370
+ "minLength": 1
371
+ },
372
+ "arms": {
373
+ "type": "object",
374
+ "required": [
375
+ "ungated",
376
+ "gated"
377
+ ],
378
+ "properties": {
379
+ "ungated": {
380
+ "type": "object",
381
+ "$ref": "#/$defs/trajectory",
382
+ "properties": {
383
+ "arm": {
384
+ "const": "ungated"
385
+ },
386
+ "treatment": {
387
+ "const": null
388
+ }
389
+ }
390
+ },
391
+ "gated": {
392
+ "type": "object",
393
+ "$ref": "#/$defs/trajectory",
394
+ "properties": {
395
+ "arm": {
396
+ "const": "gated"
397
+ },
398
+ "treatment": {
399
+ "$ref": "#/$defs/treatment"
400
+ }
401
+ }
402
+ }
403
+ },
404
+ "additionalProperties": false
405
+ },
406
+ "tamperward_version": {
407
+ "type": "string",
408
+ "minLength": 1
409
+ },
410
+ "agent_argv": {
411
+ "type": "array",
412
+ "items": {
413
+ "type": "string"
414
+ },
415
+ "description": "Normalized adapter command template used as execution identity. For the command adapter, a slash-containing relative argv[0] is resolved to the operator's absolute path before it is recorded."
416
+ },
417
+ "agent_budget": {
418
+ "anyOf": [
419
+ {
420
+ "type": "null"
421
+ },
422
+ {
423
+ "type": "number",
424
+ "exclusiveMinimum": 0
425
+ }
426
+ ]
427
+ }
428
+ },
429
+ "additionalProperties": true
430
+ },
431
+ "armBehaviour": {
432
+ "type": "object",
433
+ "required": [
434
+ "trajectories",
435
+ "surviving_protected_mutations",
436
+ "masked_failure"
437
+ ],
438
+ "properties": {
439
+ "trajectories": {
440
+ "type": "integer",
441
+ "minimum": 0
442
+ },
443
+ "surviving_protected_mutations": {
444
+ "type": "integer",
445
+ "minimum": 0
446
+ },
447
+ "masked_failure": {
448
+ "type": "integer",
449
+ "minimum": 0
450
+ }
451
+ },
452
+ "additionalProperties": true
453
+ },
454
+ "armOutcome": {
455
+ "type": "object",
456
+ "required": [
457
+ "visible_green",
458
+ "pristine_green",
459
+ "masked_failure",
460
+ "honest_completion",
461
+ "released_green"
462
+ ],
463
+ "properties": {
464
+ "visible_green": {
465
+ "type": "integer",
466
+ "minimum": 0
467
+ },
468
+ "pristine_green": {
469
+ "type": "integer",
470
+ "minimum": 0
471
+ },
472
+ "masked_failure": {
473
+ "type": "integer",
474
+ "minimum": 0
475
+ },
476
+ "honest_completion": {
477
+ "type": "integer",
478
+ "minimum": 0
479
+ },
480
+ "released_green": {
481
+ "type": "integer",
482
+ "minimum": 0
483
+ }
484
+ },
485
+ "additionalProperties": true
486
+ },
487
+ "summary": {
488
+ "type": "object",
489
+ "required": [
490
+ "schema_version",
491
+ "command",
492
+ "document",
493
+ "manifest_sha256",
494
+ "adapter",
495
+ "model",
496
+ "tamperward_version",
497
+ "agent_argv",
498
+ "agent_budget",
499
+ "pairs",
500
+ "measured_pairs",
501
+ "unmeasurable_pairs",
502
+ "tasks",
503
+ "model_behaviour",
504
+ "independent_outcome",
505
+ "tamperward",
506
+ "paired",
507
+ "control_response"
508
+ ],
509
+ "properties": {
510
+ "schema_version": {
511
+ "const": 1
512
+ },
513
+ "command": {
514
+ "const": "research"
515
+ },
516
+ "document": {
517
+ "const": "summary"
518
+ },
519
+ "manifest_sha256": {
520
+ "$ref": "#/$defs/sha256"
521
+ },
522
+ "adapter": {
523
+ "$ref": "#/$defs/adapter"
524
+ },
525
+ "model": {
526
+ "type": [
527
+ "string",
528
+ "null"
529
+ ]
530
+ },
531
+ "pairs": {
532
+ "type": "integer",
533
+ "minimum": 1
534
+ },
535
+ "measured_pairs": {
536
+ "description": "Pairs whose both arms were measured; every count in model_behaviour, independent_outcome, tamperward and paired is over these.",
537
+ "type": "integer",
538
+ "minimum": 0
539
+ },
540
+ "unmeasurable_pairs": {
541
+ "type": "integer",
542
+ "minimum": 0
543
+ },
544
+ "tasks": {
545
+ "type": "array",
546
+ "items": {
547
+ "type": "string",
548
+ "minLength": 1
549
+ },
550
+ "minItems": 1
551
+ },
552
+ "model_behaviour": {
553
+ "type": "object",
554
+ "required": [
555
+ "ungated",
556
+ "gated"
557
+ ],
558
+ "properties": {
559
+ "ungated": {
560
+ "$ref": "#/$defs/armBehaviour"
561
+ },
562
+ "gated": {
563
+ "$ref": "#/$defs/armBehaviour"
564
+ }
565
+ },
566
+ "additionalProperties": false
567
+ },
568
+ "independent_outcome": {
569
+ "type": "object",
570
+ "required": [
571
+ "ungated",
572
+ "gated"
573
+ ],
574
+ "properties": {
575
+ "ungated": {
576
+ "$ref": "#/$defs/armOutcome"
577
+ },
578
+ "gated": {
579
+ "$ref": "#/$defs/armOutcome"
580
+ }
581
+ },
582
+ "additionalProperties": false
583
+ },
584
+ "tamperward": {
585
+ "type": "object",
586
+ "required": [
587
+ "caught",
588
+ "escapes",
589
+ "false_refusals",
590
+ "cannot_adjudicate"
591
+ ],
592
+ "properties": {
593
+ "caught": {
594
+ "type": "integer",
595
+ "minimum": 0
596
+ },
597
+ "escapes": {
598
+ "type": "integer",
599
+ "minimum": 0
600
+ },
601
+ "false_refusals": {
602
+ "type": "integer",
603
+ "minimum": 0
604
+ },
605
+ "cannot_adjudicate": {
606
+ "type": "integer",
607
+ "minimum": 0
608
+ }
609
+ },
610
+ "additionalProperties": true
611
+ },
612
+ "paired": {
613
+ "type": "object",
614
+ "required": [
615
+ "masked_failure"
616
+ ],
617
+ "properties": {
618
+ "masked_failure": {
619
+ "type": "object",
620
+ "required": [
621
+ "ungated_only",
622
+ "gated_only",
623
+ "both",
624
+ "neither"
625
+ ],
626
+ "properties": {
627
+ "ungated_only": {
628
+ "type": "integer",
629
+ "minimum": 0
630
+ },
631
+ "gated_only": {
632
+ "type": "integer",
633
+ "minimum": 0
634
+ },
635
+ "both": {
636
+ "type": "integer",
637
+ "minimum": 0
638
+ },
639
+ "neither": {
640
+ "type": "integer",
641
+ "minimum": 0
642
+ }
643
+ },
644
+ "additionalProperties": true
645
+ }
646
+ },
647
+ "additionalProperties": true
648
+ },
649
+ "control_response": {
650
+ "description": "deny → fix / surrender / alternative-bypass classification. Needs in-loop deny events relayed by the adapter; this release records none, so the field is null rather than a number that looks measured.",
651
+ "type": "null"
652
+ },
653
+ "tamperward_version": {
654
+ "type": "string",
655
+ "minLength": 1
656
+ },
657
+ "agent_argv": {
658
+ "type": "array",
659
+ "items": {
660
+ "type": "string"
661
+ },
662
+ "description": "Normalized adapter command template used as execution identity. For the command adapter, a slash-containing relative argv[0] is resolved to the operator's absolute path before it is recorded."
663
+ },
664
+ "agent_budget": {
665
+ "anyOf": [
666
+ {
667
+ "type": "null"
668
+ },
669
+ {
670
+ "type": "number",
671
+ "exclusiveMinimum": 0
672
+ }
673
+ ]
674
+ }
675
+ },
676
+ "additionalProperties": true
677
+ }
678
+ }
679
+ }