@khoavu882/doflow 2.0.0-beta.4 → 2.0.0-beta.5

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 (101) hide show
  1. package/core/.antigravity-plugin/plugin.json +0 -1
  2. package/core/.claude-plugin/plugin.json +1 -1
  3. package/core/.codex-plugin/plugin.json +1 -1
  4. package/core/.plugin/plugin.json +1 -1
  5. package/core/harnesses/claude/hooks/mcp-tool-guard.sh +7 -17
  6. package/core/harnesses/claude/hooks/pre-bash-guard.sh +7 -17
  7. package/core/harnesses/claude/hooks/pre-implement-gate.sh +7 -18
  8. package/core/harnesses/claude/hooks/session-start.sh +5 -3
  9. package/core/harnesses/claude/hooks/stop-check.sh +5 -3
  10. package/core/harnesses/claude/hooks/subagent-audit.sh +5 -5
  11. package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -3
  12. package/core/harnesses/codex/hooks/mcp-tool-guard.sh +7 -15
  13. package/core/harnesses/codex/hooks/pre-bash-guard.sh +7 -15
  14. package/core/harnesses/codex/hooks/pre-implement-gate.sh +7 -16
  15. package/core/harnesses/codex/hooks/session-start.sh +5 -3
  16. package/core/harnesses/codex/hooks/stop-check.sh +6 -5
  17. package/core/harnesses/codex/hooks/subagent-audit.sh +17 -6
  18. package/core/harnesses/codex/hooks/user-prompt-submit.sh +5 -4
  19. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +7 -18
  20. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +7 -18
  21. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +7 -19
  22. package/core/harnesses/gemini/hooks/session-start.sh +5 -3
  23. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +20 -5
  24. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +20 -5
  25. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +20 -5
  26. package/core/harnesses/kiro/hooks/session-start.sh +11 -5
  27. package/core/harnesses/kiro/hooks/stop-check.sh +21 -30
  28. package/core/harnesses/pi/extensions/doflow-guard.js +159 -0
  29. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +27 -11
  30. package/core/harnesses/shared/hooks/adapters/antigravity.js +14 -57
  31. package/core/harnesses/shared/hooks/bridge/bridge.sh +184 -0
  32. package/core/harnesses/shared/hooks/bridge/envelope.jq +60 -0
  33. package/core/harnesses/shared/hooks/bridge/respond.sh +62 -0
  34. package/core/harnesses/shared/hooks/policies/capture-failure.sh +4 -2
  35. package/core/harnesses/shared/hooks/policies/contract.sh +75 -0
  36. package/core/harnesses/shared/hooks/policies/deny-json.sh +39 -4
  37. package/core/harnesses/shared/hooks/policies/lib.sh +4 -2
  38. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +46 -34
  39. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +75 -25
  40. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +67 -73
  41. package/core/harnesses/shared/hooks/policies/session-context.sh +37 -7
  42. package/core/harnesses/shared/hooks/policies/stop-check.sh +42 -15
  43. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +35 -5
  44. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +40 -7
  45. package/core/harnesses/shared/hooks/stream-hook-runner.js +69 -181
  46. package/core/registry/assets.json +19 -0
  47. package/core/registry/contracts.json +2 -2
  48. package/core/registry/harnesses.json +196 -10
  49. package/core/registry/lifecycle.json +2626 -7
  50. package/core/registry/storage.json +24 -1
  51. package/core/shared/scripts/doflow/bin/doflow-run +10 -6
  52. package/core/shared/skills/do-design/SKILL.md +6 -6
  53. package/core/shared/skills/do-execute-plan/SKILL.md +11 -10
  54. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +2 -0
  55. package/core/shared/skills/do-implement/SKILL.md +3 -2
  56. package/core/shared/skills/do-plan/SKILL.md +7 -8
  57. package/package.json +1 -1
  58. package/src/adapters/antigravity/index.js +83 -47
  59. package/src/adapters/claude/index.js +15 -1
  60. package/src/adapters/codex/hooks.js +40 -5
  61. package/src/adapters/codex/index.js +52 -9
  62. package/src/adapters/copy-tree.js +4 -4
  63. package/src/adapters/gemini/hooks.js +57 -16
  64. package/src/adapters/gemini/index.js +57 -18
  65. package/src/adapters/kiro/index.js +15 -1
  66. package/src/adapters/pi/hooks.js +119 -0
  67. package/src/adapters/pi/index.js +34 -9
  68. package/src/cli/commands/install.js +1 -1
  69. package/src/cli/commands/update.js +1 -1
  70. package/src/cli/index.js +17 -5
  71. package/src/cli/runtime-commands.js +51 -12
  72. package/src/lifecycle/coverage.js +57 -0
  73. package/src/lifecycle/hook-step.js +61 -0
  74. package/src/lifecycle/index.js +28 -14
  75. package/src/registry/index.js +136 -7
  76. package/src/runtime/candidate.js +505 -0
  77. package/src/runtime/claims.js +14 -5
  78. package/src/runtime/cli-result.js +11 -4
  79. package/src/runtime/cli.js +35 -268
  80. package/src/runtime/context/budget.js +203 -0
  81. package/src/runtime/context/compose.js +1367 -0
  82. package/src/runtime/context/delivery-store.js +102 -0
  83. package/src/runtime/context/mandatory.js +594 -0
  84. package/src/runtime/context/pointer.js +142 -0
  85. package/src/runtime/context-pack.js +1029 -244
  86. package/src/runtime/evidence-fields.js +39 -0
  87. package/src/runtime/evidence-ledger.js +7 -0
  88. package/src/runtime/freshness.js +44 -7
  89. package/src/runtime/outcome.js +1 -1
  90. package/src/runtime/readiness.js +83 -13
  91. package/src/runtime/retrieval-plan.js +422 -73
  92. package/src/runtime/retrieval-record.js +223 -0
  93. package/src/runtime/scaffold/artifacts.js +3 -0
  94. package/src/runtime/source-version.js +289 -0
  95. package/src/runtime/task-attempts.js +1 -1
  96. package/src/runtime/task-scope.js +28 -3
  97. package/src/runtime/task-state.js +72 -7
  98. package/core/.antigravity-plugin/hooks.json +0 -39
  99. package/core/harnesses/shared/hooks/adapters/arg-fields.js +0 -19
  100. package/core/harnesses/shared/hooks/adapters/gemini.js +0 -114
  101. package/core/harnesses/shared/hooks/hooks.json +0 -47
@@ -29,8 +29,8 @@
29
29
  "fallback": "guidance"
30
30
  },
31
31
  "pi": {
32
- "status": "unavailable",
33
- "fallback": "guidance"
32
+ "event": "tool_call",
33
+ "status": "different"
34
34
  },
35
35
  "copilot": {
36
36
  "status": "unavailable",
@@ -74,8 +74,8 @@
74
74
  "fallback": "guidance"
75
75
  },
76
76
  "pi": {
77
- "status": "unavailable",
78
- "fallback": "guidance"
77
+ "event": "tool_call",
78
+ "status": "different"
79
79
  },
80
80
  "copilot": {
81
81
  "status": "unavailable",
@@ -165,8 +165,8 @@
165
165
  "fallback": "guidance"
166
166
  },
167
167
  "pi": {
168
- "status": "unavailable",
169
- "fallback": "guidance"
168
+ "event": "tool_call",
169
+ "status": "different"
170
170
  },
171
171
  "copilot": {
172
172
  "status": "unavailable",
@@ -227,5 +227,2624 @@
227
227
  }
228
228
  }
229
229
  }
230
- ]
230
+ ],
231
+ "coverage": {
232
+ "schemaVersion": 1,
233
+ "revision": 2,
234
+ "refresh": {
235
+ "trigger": "a harness bridge, template or installed harness version changes",
236
+ "owner": "the feature that changes it"
237
+ },
238
+ "profiles": {
239
+ "any": "Applies across every installed profile; query evaluates all applicable rows.",
240
+ "user-interactive": "User-scope interactive harness session.",
241
+ "user-headless": "User-scope non-interactive harness session.",
242
+ "project-interactive": "Project-scope interactive harness session.",
243
+ "project-headless": "Project-scope non-interactive harness session.",
244
+ "cli-extension": "Harness launched with its CLI extension mechanism.",
245
+ "no-extensions": "Harness profile where extensions are unavailable.",
246
+ "ide": "Harness IDE integration.",
247
+ "cli-v3": "Kiro CLI V3.",
248
+ "cli-v3-agent": "Kiro CLI V3 agent mode.",
249
+ "cli-2x-agent": "Kiro CLI 2.x agent mode."
250
+ },
251
+ "rows": [
252
+ {
253
+ "policy": "pre-implementation-gate",
254
+ "harness": "claude",
255
+ "event": "PreToolUse",
256
+ "timing": "pre-tool",
257
+ "profile": "any",
258
+ "wired": true,
259
+ "configSource": "core/harnesses/claude/settings/settings.json:89",
260
+ "harnessVersion": {
261
+ "tested": "2.1.287 (Claude Code)"
262
+ },
263
+ "class": "blocking",
264
+ "verification": "verified",
265
+ "prerequisites": [],
266
+ "covers": [],
267
+ "doesNotCover": [
268
+ "writes via shell commands"
269
+ ],
270
+ "caveats": [],
271
+ "provenance": [
272
+ {
273
+ "kind": "doc",
274
+ "locator": "https://code.claude.com/docs/en/hooks",
275
+ "date": "2026-10-12"
276
+ },
277
+ {
278
+ "kind": "fixture",
279
+ "locator": "test/fixtures/hooks/claude/pre-implement-gate/deny.json",
280
+ "date": "2026-10-14"
281
+ }
282
+ ]
283
+ },
284
+ {
285
+ "policy": "pre-implementation-gate",
286
+ "harness": "codex",
287
+ "event": "PreToolUse",
288
+ "timing": "pre-tool",
289
+ "profile": "any",
290
+ "wired": true,
291
+ "configSource": "core/harnesses/codex/hooks/hooks.json:45",
292
+ "harnessVersion": {
293
+ "tested": "codex-cli 0.162.1"
294
+ },
295
+ "class": "blocking",
296
+ "verification": "verified",
297
+ "prerequisites": [
298
+ "hook-review"
299
+ ],
300
+ "covers": [],
301
+ "doesNotCover": [
302
+ "writes via shell commands"
303
+ ],
304
+ "caveats": [],
305
+ "provenance": [
306
+ {
307
+ "kind": "doc",
308
+ "locator": "https://learn.chatgpt.com/docs/hooks",
309
+ "date": "2026-10-12"
310
+ },
311
+ {
312
+ "kind": "fixture",
313
+ "locator": "test/fixtures/hooks/codex/pre-implement-gate/deny.json",
314
+ "date": "2026-10-14"
315
+ }
316
+ ]
317
+ },
318
+ {
319
+ "policy": "pre-implementation-gate",
320
+ "harness": "gemini",
321
+ "event": "BeforeTool",
322
+ "timing": "pre-tool",
323
+ "profile": "any",
324
+ "wired": true,
325
+ "configSource": "core/harnesses/gemini/hooks/hooks.json:25",
326
+ "harnessVersion": {
327
+ "tested": "0.55.1"
328
+ },
329
+ "class": "blocking",
330
+ "verification": "verified",
331
+ "prerequisites": [],
332
+ "covers": [],
333
+ "doesNotCover": [
334
+ "writes via shell commands"
335
+ ],
336
+ "caveats": [],
337
+ "provenance": [
338
+ {
339
+ "kind": "doc",
340
+ "locator": "https://geminicli.com/docs/hooks/",
341
+ "date": "2026-10-12"
342
+ },
343
+ {
344
+ "kind": "fixture",
345
+ "locator": "test/fixtures/hooks/gemini/pre-implement-gate/deny.json",
346
+ "date": "2026-10-14"
347
+ }
348
+ ]
349
+ },
350
+ {
351
+ "policy": "pre-implementation-gate",
352
+ "harness": "opencode",
353
+ "event": "*",
354
+ "timing": "pre-tool",
355
+ "profile": "any",
356
+ "wired": false,
357
+ "configSource": null,
358
+ "harnessVersion": {
359
+ "tested": "1.18.30"
360
+ },
361
+ "class": "unsupported",
362
+ "verification": "unverified",
363
+ "prerequisites": [],
364
+ "covers": [],
365
+ "doesNotCover": [
366
+ "writes via shell commands"
367
+ ],
368
+ "caveats": [],
369
+ "provenance": [
370
+ {
371
+ "kind": "doc",
372
+ "locator": "core/registry/harnesses.json: opencode harness; core/registry/contracts.json: unavailable hook mapping",
373
+ "date": "2026-10-12"
374
+ }
375
+ ]
376
+ },
377
+ {
378
+ "policy": "pre-implementation-gate",
379
+ "harness": "pi",
380
+ "event": "tool_call",
381
+ "timing": "pre-tool",
382
+ "profile": "cli-extension",
383
+ "wired": true,
384
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
385
+ "harnessVersion": {
386
+ "tested": "1.1.0"
387
+ },
388
+ "class": "blocking",
389
+ "verification": "verified",
390
+ "prerequisites": [],
391
+ "covers": [],
392
+ "doesNotCover": [
393
+ "writes via shell commands"
394
+ ],
395
+ "caveats": [
396
+ "live-verified only: print mode, `-e` load, project-scope install; interactive mode, project-trust auto-load and user scope not observed",
397
+ "a later tool_call handler may mutate input after DoFlow allows it"
398
+ ],
399
+ "provenance": [
400
+ {
401
+ "kind": "types",
402
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
403
+ "date": "2026-10-14"
404
+ },
405
+ {
406
+ "kind": "doc",
407
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
408
+ "date": "2026-10-14"
409
+ },
410
+ {
411
+ "kind": "fixture",
412
+ "locator": "test/fixtures/hooks/pi/tool_call/edit-deny.json",
413
+ "date": "2026-10-14"
414
+ },
415
+ {
416
+ "kind": "live",
417
+ "locator": "test/fixtures/hooks/pi/live/probe-2026-10-14.jsonl",
418
+ "date": "2026-10-14"
419
+ }
420
+ ]
421
+ },
422
+ {
423
+ "policy": "pre-implementation-gate",
424
+ "harness": "pi",
425
+ "event": "tool_execution_start",
426
+ "timing": "post-tool",
427
+ "profile": "cli-extension",
428
+ "wired": false,
429
+ "configSource": null,
430
+ "harnessVersion": {
431
+ "tested": "1.1.0"
432
+ },
433
+ "class": "observation",
434
+ "verification": "unverified",
435
+ "prerequisites": [],
436
+ "covers": [],
437
+ "doesNotCover": [
438
+ "writes via shell commands"
439
+ ],
440
+ "caveats": [
441
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it"
442
+ ],
443
+ "provenance": [
444
+ {
445
+ "kind": "doc",
446
+ "locator": "https://pi.dev/docs/latest/extensions",
447
+ "date": "2026-10-14"
448
+ }
449
+ ]
450
+ },
451
+ {
452
+ "policy": "pre-implementation-gate",
453
+ "harness": "pi",
454
+ "event": "tool_call",
455
+ "timing": "pre-tool",
456
+ "profile": "user-headless",
457
+ "wired": true,
458
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
459
+ "harnessVersion": {
460
+ "tested": "1.1.0"
461
+ },
462
+ "class": "unknown",
463
+ "verification": "unverified",
464
+ "prerequisites": [],
465
+ "covers": [],
466
+ "doesNotCover": [
467
+ "writes via shell commands"
468
+ ],
469
+ "caveats": [
470
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
471
+ "live probe pending"
472
+ ],
473
+ "provenance": [
474
+ {
475
+ "kind": "types",
476
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
477
+ "date": "2026-10-14"
478
+ },
479
+ {
480
+ "kind": "doc",
481
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
482
+ "date": "2026-10-14"
483
+ },
484
+ {
485
+ "kind": "fixture",
486
+ "locator": "test/fixtures/hooks/pi/tool_call/edit-deny.json",
487
+ "date": "2026-10-14"
488
+ }
489
+ ]
490
+ },
491
+ {
492
+ "policy": "pre-implementation-gate",
493
+ "harness": "pi",
494
+ "event": "tool_call",
495
+ "timing": "pre-tool",
496
+ "profile": "project-headless",
497
+ "wired": true,
498
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
499
+ "harnessVersion": {
500
+ "tested": "1.1.0"
501
+ },
502
+ "class": "unknown",
503
+ "verification": "unverified",
504
+ "prerequisites": [
505
+ "project-trust"
506
+ ],
507
+ "covers": [],
508
+ "doesNotCover": [
509
+ "writes via shell commands"
510
+ ],
511
+ "caveats": [
512
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
513
+ "live probe pending",
514
+ "project-trust is required for the project-scope extension"
515
+ ],
516
+ "provenance": [
517
+ {
518
+ "kind": "types",
519
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
520
+ "date": "2026-10-14"
521
+ },
522
+ {
523
+ "kind": "doc",
524
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
525
+ "date": "2026-10-14"
526
+ },
527
+ {
528
+ "kind": "fixture",
529
+ "locator": "test/fixtures/hooks/pi/tool_call/edit-deny.json",
530
+ "date": "2026-10-14"
531
+ }
532
+ ]
533
+ },
534
+ {
535
+ "policy": "pre-implementation-gate",
536
+ "harness": "pi",
537
+ "event": "*",
538
+ "timing": "pre-tool",
539
+ "profile": "no-extensions",
540
+ "wired": false,
541
+ "configSource": null,
542
+ "harnessVersion": {
543
+ "tested": "1.1.0"
544
+ },
545
+ "class": "unsupported",
546
+ "verification": "unverified",
547
+ "prerequisites": [],
548
+ "covers": [],
549
+ "doesNotCover": [
550
+ "writes via shell commands"
551
+ ],
552
+ "caveats": [
553
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
554
+ "Pi extension unavailable in this profile"
555
+ ],
556
+ "provenance": [
557
+ {
558
+ "kind": "types",
559
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
560
+ "date": "2026-10-14"
561
+ },
562
+ {
563
+ "kind": "doc",
564
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
565
+ "date": "2026-10-14"
566
+ },
567
+ {
568
+ "kind": "fixture",
569
+ "locator": "test/fixtures/hooks/pi/tool_call/edit-deny.json",
570
+ "date": "2026-10-14"
571
+ }
572
+ ]
573
+ },
574
+ {
575
+ "policy": "pre-bash-guard",
576
+ "harness": "pi",
577
+ "event": "tool_call",
578
+ "timing": "pre-tool",
579
+ "profile": "cli-extension",
580
+ "wired": true,
581
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
582
+ "harnessVersion": {
583
+ "tested": "1.1.0"
584
+ },
585
+ "class": "unknown",
586
+ "verification": "unverified",
587
+ "prerequisites": [],
588
+ "covers": [],
589
+ "doesNotCover": [],
590
+ "caveats": [
591
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it"
592
+ ],
593
+ "provenance": [
594
+ {
595
+ "kind": "types",
596
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
597
+ "date": "2026-10-14"
598
+ },
599
+ {
600
+ "kind": "doc",
601
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
602
+ "date": "2026-10-14"
603
+ },
604
+ {
605
+ "kind": "fixture",
606
+ "locator": "test/fixtures/hooks/pi/tool_call/bash-deny.json",
607
+ "date": "2026-10-14"
608
+ }
609
+ ]
610
+ },
611
+ {
612
+ "policy": "pre-bash-guard",
613
+ "harness": "pi",
614
+ "event": "tool_execution_start",
615
+ "timing": "post-tool",
616
+ "profile": "cli-extension",
617
+ "wired": false,
618
+ "configSource": null,
619
+ "harnessVersion": {
620
+ "tested": "1.1.0"
621
+ },
622
+ "class": "observation",
623
+ "verification": "unverified",
624
+ "prerequisites": [],
625
+ "covers": [],
626
+ "doesNotCover": [],
627
+ "caveats": [
628
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it"
629
+ ],
630
+ "provenance": [
631
+ {
632
+ "kind": "doc",
633
+ "locator": "https://pi.dev/docs/latest/extensions",
634
+ "date": "2026-10-14"
635
+ }
636
+ ]
637
+ },
638
+ {
639
+ "policy": "pre-bash-guard",
640
+ "harness": "pi",
641
+ "event": "tool_call",
642
+ "timing": "pre-tool",
643
+ "profile": "user-headless",
644
+ "wired": true,
645
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
646
+ "harnessVersion": {
647
+ "tested": "1.1.0"
648
+ },
649
+ "class": "unknown",
650
+ "verification": "unverified",
651
+ "prerequisites": [],
652
+ "covers": [],
653
+ "doesNotCover": [],
654
+ "caveats": [
655
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
656
+ "live probe pending"
657
+ ],
658
+ "provenance": [
659
+ {
660
+ "kind": "types",
661
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
662
+ "date": "2026-10-14"
663
+ },
664
+ {
665
+ "kind": "doc",
666
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
667
+ "date": "2026-10-14"
668
+ },
669
+ {
670
+ "kind": "fixture",
671
+ "locator": "test/fixtures/hooks/pi/tool_call/bash-deny.json",
672
+ "date": "2026-10-14"
673
+ }
674
+ ]
675
+ },
676
+ {
677
+ "policy": "pre-bash-guard",
678
+ "harness": "pi",
679
+ "event": "tool_call",
680
+ "timing": "pre-tool",
681
+ "profile": "project-headless",
682
+ "wired": true,
683
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
684
+ "harnessVersion": {
685
+ "tested": "1.1.0"
686
+ },
687
+ "class": "unknown",
688
+ "verification": "unverified",
689
+ "prerequisites": [
690
+ "project-trust"
691
+ ],
692
+ "covers": [],
693
+ "doesNotCover": [],
694
+ "caveats": [
695
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
696
+ "live probe pending",
697
+ "project-trust is required for the project-scope extension"
698
+ ],
699
+ "provenance": [
700
+ {
701
+ "kind": "types",
702
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
703
+ "date": "2026-10-14"
704
+ },
705
+ {
706
+ "kind": "doc",
707
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
708
+ "date": "2026-10-14"
709
+ },
710
+ {
711
+ "kind": "fixture",
712
+ "locator": "test/fixtures/hooks/pi/tool_call/bash-deny.json",
713
+ "date": "2026-10-14"
714
+ }
715
+ ]
716
+ },
717
+ {
718
+ "policy": "pre-bash-guard",
719
+ "harness": "pi",
720
+ "event": "*",
721
+ "timing": "pre-tool",
722
+ "profile": "no-extensions",
723
+ "wired": false,
724
+ "configSource": null,
725
+ "harnessVersion": {
726
+ "tested": "1.1.0"
727
+ },
728
+ "class": "unsupported",
729
+ "verification": "unverified",
730
+ "prerequisites": [],
731
+ "covers": [],
732
+ "doesNotCover": [],
733
+ "caveats": [
734
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
735
+ "Pi extension unavailable in this profile"
736
+ ],
737
+ "provenance": [
738
+ {
739
+ "kind": "types",
740
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
741
+ "date": "2026-10-14"
742
+ },
743
+ {
744
+ "kind": "doc",
745
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
746
+ "date": "2026-10-14"
747
+ },
748
+ {
749
+ "kind": "fixture",
750
+ "locator": "test/fixtures/hooks/pi/tool_call/bash-deny.json",
751
+ "date": "2026-10-14"
752
+ }
753
+ ]
754
+ },
755
+ {
756
+ "policy": "session-context",
757
+ "harness": "pi",
758
+ "event": "*",
759
+ "timing": "session",
760
+ "profile": "any",
761
+ "wired": false,
762
+ "configSource": null,
763
+ "harnessVersion": {
764
+ "tested": "1.1.0"
765
+ },
766
+ "class": "unsupported",
767
+ "verification": "unverified",
768
+ "prerequisites": [],
769
+ "covers": [],
770
+ "doesNotCover": [],
771
+ "caveats": [
772
+ "not wired for this harness mapping",
773
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it"
774
+ ],
775
+ "provenance": [
776
+ {
777
+ "kind": "doc",
778
+ "locator": "core/registry/lifecycle.json: policy session-context mapping for pi",
779
+ "date": "2026-10-14"
780
+ }
781
+ ]
782
+ },
783
+ {
784
+ "policy": "mcp-tool-guard",
785
+ "harness": "pi",
786
+ "event": "tool_call",
787
+ "timing": "pre-tool",
788
+ "profile": "cli-extension",
789
+ "wired": true,
790
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
791
+ "harnessVersion": {
792
+ "tested": "1.1.0"
793
+ },
794
+ "class": "unknown",
795
+ "verification": "unverified",
796
+ "prerequisites": [],
797
+ "covers": [],
798
+ "doesNotCover": [],
799
+ "caveats": [
800
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it"
801
+ ],
802
+ "provenance": [
803
+ {
804
+ "kind": "types",
805
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
806
+ "date": "2026-10-14"
807
+ },
808
+ {
809
+ "kind": "doc",
810
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
811
+ "date": "2026-10-14"
812
+ },
813
+ {
814
+ "kind": "fixture",
815
+ "locator": "test/fixtures/hooks/pi/tool_call/nested-mcp-deny.json",
816
+ "date": "2026-10-14"
817
+ }
818
+ ]
819
+ },
820
+ {
821
+ "policy": "mcp-tool-guard",
822
+ "harness": "pi",
823
+ "event": "tool_execution_start",
824
+ "timing": "post-tool",
825
+ "profile": "cli-extension",
826
+ "wired": false,
827
+ "configSource": null,
828
+ "harnessVersion": {
829
+ "tested": "1.1.0"
830
+ },
831
+ "class": "observation",
832
+ "verification": "unverified",
833
+ "prerequisites": [],
834
+ "covers": [],
835
+ "doesNotCover": [],
836
+ "caveats": [
837
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it"
838
+ ],
839
+ "provenance": [
840
+ {
841
+ "kind": "doc",
842
+ "locator": "https://pi.dev/docs/latest/extensions",
843
+ "date": "2026-10-14"
844
+ }
845
+ ]
846
+ },
847
+ {
848
+ "policy": "mcp-tool-guard",
849
+ "harness": "pi",
850
+ "event": "tool_call",
851
+ "timing": "pre-tool",
852
+ "profile": "user-headless",
853
+ "wired": true,
854
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
855
+ "harnessVersion": {
856
+ "tested": "1.1.0"
857
+ },
858
+ "class": "unknown",
859
+ "verification": "unverified",
860
+ "prerequisites": [],
861
+ "covers": [],
862
+ "doesNotCover": [],
863
+ "caveats": [
864
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
865
+ "live probe pending"
866
+ ],
867
+ "provenance": [
868
+ {
869
+ "kind": "types",
870
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
871
+ "date": "2026-10-14"
872
+ },
873
+ {
874
+ "kind": "doc",
875
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
876
+ "date": "2026-10-14"
877
+ },
878
+ {
879
+ "kind": "fixture",
880
+ "locator": "test/fixtures/hooks/pi/tool_call/nested-mcp-deny.json",
881
+ "date": "2026-10-14"
882
+ }
883
+ ]
884
+ },
885
+ {
886
+ "policy": "mcp-tool-guard",
887
+ "harness": "pi",
888
+ "event": "tool_call",
889
+ "timing": "pre-tool",
890
+ "profile": "project-headless",
891
+ "wired": true,
892
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
893
+ "harnessVersion": {
894
+ "tested": "1.1.0"
895
+ },
896
+ "class": "unknown",
897
+ "verification": "unverified",
898
+ "prerequisites": [
899
+ "project-trust"
900
+ ],
901
+ "covers": [],
902
+ "doesNotCover": [],
903
+ "caveats": [
904
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
905
+ "live probe pending",
906
+ "project-trust is required for the project-scope extension"
907
+ ],
908
+ "provenance": [
909
+ {
910
+ "kind": "types",
911
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
912
+ "date": "2026-10-14"
913
+ },
914
+ {
915
+ "kind": "doc",
916
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
917
+ "date": "2026-10-14"
918
+ },
919
+ {
920
+ "kind": "fixture",
921
+ "locator": "test/fixtures/hooks/pi/tool_call/nested-mcp-deny.json",
922
+ "date": "2026-10-14"
923
+ }
924
+ ]
925
+ },
926
+ {
927
+ "policy": "mcp-tool-guard",
928
+ "harness": "pi",
929
+ "event": "*",
930
+ "timing": "pre-tool",
931
+ "profile": "no-extensions",
932
+ "wired": false,
933
+ "configSource": null,
934
+ "harnessVersion": {
935
+ "tested": "1.1.0"
936
+ },
937
+ "class": "unsupported",
938
+ "verification": "unverified",
939
+ "prerequisites": [],
940
+ "covers": [],
941
+ "doesNotCover": [],
942
+ "caveats": [
943
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
944
+ "Pi extension unavailable in this profile"
945
+ ],
946
+ "provenance": [
947
+ {
948
+ "kind": "types",
949
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
950
+ "date": "2026-10-14"
951
+ },
952
+ {
953
+ "kind": "doc",
954
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
955
+ "date": "2026-10-14"
956
+ },
957
+ {
958
+ "kind": "fixture",
959
+ "locator": "test/fixtures/hooks/pi/tool_call/nested-mcp-deny.json",
960
+ "date": "2026-10-14"
961
+ }
962
+ ]
963
+ },
964
+ {
965
+ "policy": "stop-check",
966
+ "harness": "pi",
967
+ "event": "*",
968
+ "timing": "stop",
969
+ "profile": "any",
970
+ "wired": false,
971
+ "configSource": null,
972
+ "harnessVersion": {
973
+ "tested": "1.1.0"
974
+ },
975
+ "class": "unsupported",
976
+ "verification": "unverified",
977
+ "prerequisites": [],
978
+ "covers": [],
979
+ "doesNotCover": [],
980
+ "caveats": [
981
+ "not wired for this harness mapping",
982
+ "Pi user- and project-scope extensions have not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it"
983
+ ],
984
+ "provenance": [
985
+ {
986
+ "kind": "doc",
987
+ "locator": "core/registry/lifecycle.json: policy stop-check mapping for pi",
988
+ "date": "2026-10-14"
989
+ }
990
+ ]
991
+ },
992
+ {
993
+ "policy": "pre-implementation-gate",
994
+ "harness": "copilot",
995
+ "event": "PreToolUse",
996
+ "timing": "pre-tool",
997
+ "profile": "any",
998
+ "wired": false,
999
+ "configSource": null,
1000
+ "harnessVersion": {
1001
+ "tested": "GitHub Copilot CLI 1.0.78"
1002
+ },
1003
+ "class": "unknown",
1004
+ "verification": "unverified",
1005
+ "prerequisites": [],
1006
+ "covers": [],
1007
+ "doesNotCover": [
1008
+ "writes via shell commands"
1009
+ ],
1010
+ "caveats": [
1011
+ "fixture-pending",
1012
+ "version-drift:GitHub Copilot CLI 1.0.78."
1013
+ ],
1014
+ "provenance": [
1015
+ {
1016
+ "kind": "doc",
1017
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
1018
+ "date": "2026-10-14"
1019
+ }
1020
+ ]
1021
+ },
1022
+ {
1023
+ "policy": "pre-implementation-gate",
1024
+ "harness": "copilot",
1025
+ "event": "*",
1026
+ "timing": "pre-tool",
1027
+ "profile": "any",
1028
+ "wired": false,
1029
+ "configSource": null,
1030
+ "harnessVersion": {
1031
+ "tested": "GitHub Copilot CLI 1.0.78"
1032
+ },
1033
+ "class": "unsupported",
1034
+ "verification": "unverified",
1035
+ "prerequisites": [],
1036
+ "covers": [],
1037
+ "doesNotCover": [
1038
+ "writes via shell commands"
1039
+ ],
1040
+ "caveats": [
1041
+ "version-drift:GitHub Copilot CLI 1.0.78."
1042
+ ],
1043
+ "provenance": [
1044
+ {
1045
+ "kind": "doc",
1046
+ "locator": "core/registry/harnesses.json: copilot harness; core/registry/contracts.json: unavailable hook mapping",
1047
+ "date": "2026-10-12"
1048
+ }
1049
+ ]
1050
+ },
1051
+ {
1052
+ "policy": "pre-implementation-gate",
1053
+ "harness": "kiro",
1054
+ "event": "PreToolUse",
1055
+ "timing": "pre-tool",
1056
+ "profile": "ide",
1057
+ "wired": true,
1058
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:15",
1059
+ "harnessVersion": {
1060
+ "tested": "kiro-cli 2.29.1"
1061
+ },
1062
+ "class": "blocking",
1063
+ "verification": "verified",
1064
+ "prerequisites": [],
1065
+ "covers": [],
1066
+ "doesNotCover": [
1067
+ "writes via shell commands"
1068
+ ],
1069
+ "caveats": [],
1070
+ "provenance": [
1071
+ {
1072
+ "kind": "doc",
1073
+ "locator": "https://kiro.dev/docs/hooks/types/",
1074
+ "date": "2026-10-12"
1075
+ },
1076
+ {
1077
+ "kind": "fixture",
1078
+ "locator": "test/fixtures/hooks/kiro/pre-implement-gate/deny.json",
1079
+ "date": "2026-10-14"
1080
+ }
1081
+ ]
1082
+ },
1083
+ {
1084
+ "policy": "pre-implementation-gate",
1085
+ "harness": "kiro",
1086
+ "event": "PreToolUse",
1087
+ "timing": "pre-tool",
1088
+ "profile": "cli-v3",
1089
+ "wired": true,
1090
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:15",
1091
+ "harnessVersion": {
1092
+ "tested": "kiro-cli 2.29.1"
1093
+ },
1094
+ "class": "blocking",
1095
+ "verification": "verified",
1096
+ "prerequisites": [],
1097
+ "covers": [],
1098
+ "doesNotCover": [
1099
+ "writes via shell commands"
1100
+ ],
1101
+ "caveats": [],
1102
+ "provenance": [
1103
+ {
1104
+ "kind": "doc",
1105
+ "locator": "https://kiro.dev/docs/hooks/types/",
1106
+ "date": "2026-10-12"
1107
+ },
1108
+ {
1109
+ "kind": "fixture",
1110
+ "locator": "test/fixtures/hooks/kiro/pre-implement-gate/deny.json",
1111
+ "date": "2026-10-14"
1112
+ }
1113
+ ]
1114
+ },
1115
+ {
1116
+ "policy": "pre-implementation-gate",
1117
+ "harness": "kiro",
1118
+ "event": "PreToolUse",
1119
+ "timing": "pre-tool",
1120
+ "profile": "cli-v3-agent",
1121
+ "wired": true,
1122
+ "configSource": "core/harnesses/kiro/agents/doflow.json:11",
1123
+ "harnessVersion": {
1124
+ "tested": "kiro-cli 2.29.1"
1125
+ },
1126
+ "class": "blocking",
1127
+ "verification": "verified",
1128
+ "prerequisites": [],
1129
+ "covers": [],
1130
+ "doesNotCover": [
1131
+ "writes via shell commands"
1132
+ ],
1133
+ "caveats": [],
1134
+ "provenance": [
1135
+ {
1136
+ "kind": "doc",
1137
+ "locator": "https://kiro.dev/docs/hooks/types/",
1138
+ "date": "2026-10-12"
1139
+ },
1140
+ {
1141
+ "kind": "fixture",
1142
+ "locator": "test/fixtures/hooks/kiro/pre-implement-gate/agent-deny.json",
1143
+ "date": "2026-10-14"
1144
+ }
1145
+ ]
1146
+ },
1147
+ {
1148
+ "policy": "pre-implementation-gate",
1149
+ "harness": "kiro",
1150
+ "event": "PreToolUse",
1151
+ "timing": "pre-tool",
1152
+ "profile": "cli-2x-agent",
1153
+ "wired": true,
1154
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:15",
1155
+ "harnessVersion": {
1156
+ "tested": "kiro-cli 2.29.1"
1157
+ },
1158
+ "class": "blocking",
1159
+ "verification": "verified",
1160
+ "prerequisites": [],
1161
+ "covers": [],
1162
+ "doesNotCover": [
1163
+ "writes via shell commands"
1164
+ ],
1165
+ "caveats": [],
1166
+ "provenance": [
1167
+ {
1168
+ "kind": "doc",
1169
+ "locator": "https://kiro.dev/docs/hooks/types/",
1170
+ "date": "2026-10-12"
1171
+ },
1172
+ {
1173
+ "kind": "fixture",
1174
+ "locator": "test/fixtures/hooks/kiro/pre-implement-gate/agent-deny.json",
1175
+ "date": "2026-10-14"
1176
+ }
1177
+ ]
1178
+ },
1179
+ {
1180
+ "policy": "pre-implementation-gate",
1181
+ "harness": "antigravity",
1182
+ "event": "PreToolUse",
1183
+ "timing": "pre-tool",
1184
+ "profile": "any",
1185
+ "wired": true,
1186
+ "configSource": "src/adapters/antigravity/index.js:60",
1187
+ "harnessVersion": {
1188
+ "tested": "1.3.3"
1189
+ },
1190
+ "class": "blocking",
1191
+ "verification": "verified",
1192
+ "prerequisites": [],
1193
+ "covers": [],
1194
+ "doesNotCover": [
1195
+ "writes via shell commands"
1196
+ ],
1197
+ "caveats": [],
1198
+ "provenance": [
1199
+ {
1200
+ "kind": "doc",
1201
+ "locator": "https://antigravity.google/docs/hooks/",
1202
+ "date": "2026-10-12"
1203
+ },
1204
+ {
1205
+ "kind": "fixture",
1206
+ "locator": "test/fixtures/hooks/antigravity/pre-implement-gate/deny-missing-design.json",
1207
+ "date": "2026-10-14"
1208
+ }
1209
+ ]
1210
+ },
1211
+ {
1212
+ "policy": "pre-bash-guard",
1213
+ "harness": "claude",
1214
+ "event": "PreToolUse",
1215
+ "timing": "pre-tool",
1216
+ "profile": "any",
1217
+ "wired": true,
1218
+ "configSource": "core/harnesses/claude/settings/settings.json:89",
1219
+ "harnessVersion": {
1220
+ "tested": "2.1.287 (Claude Code)"
1221
+ },
1222
+ "class": "blocking",
1223
+ "verification": "verified",
1224
+ "prerequisites": [],
1225
+ "covers": [],
1226
+ "doesNotCover": [],
1227
+ "caveats": [],
1228
+ "provenance": [
1229
+ {
1230
+ "kind": "doc",
1231
+ "locator": "https://code.claude.com/docs/en/hooks",
1232
+ "date": "2026-10-12"
1233
+ },
1234
+ {
1235
+ "kind": "fixture",
1236
+ "locator": "test/fixtures/hooks/claude/pre-bash-guard/deny.json",
1237
+ "date": "2026-10-14"
1238
+ }
1239
+ ]
1240
+ },
1241
+ {
1242
+ "policy": "pre-bash-guard",
1243
+ "harness": "codex",
1244
+ "event": "PreToolUse",
1245
+ "timing": "pre-tool",
1246
+ "profile": "any",
1247
+ "wired": true,
1248
+ "configSource": "core/harnesses/codex/hooks/hooks.json:45",
1249
+ "harnessVersion": {
1250
+ "tested": "codex-cli 0.162.1"
1251
+ },
1252
+ "class": "blocking",
1253
+ "verification": "verified",
1254
+ "prerequisites": [
1255
+ "hook-review"
1256
+ ],
1257
+ "covers": [],
1258
+ "doesNotCover": [],
1259
+ "caveats": [],
1260
+ "provenance": [
1261
+ {
1262
+ "kind": "doc",
1263
+ "locator": "https://learn.chatgpt.com/docs/hooks",
1264
+ "date": "2026-10-12"
1265
+ },
1266
+ {
1267
+ "kind": "fixture",
1268
+ "locator": "test/fixtures/hooks/codex/pre-bash-guard/deny.json",
1269
+ "date": "2026-10-14"
1270
+ }
1271
+ ]
1272
+ },
1273
+ {
1274
+ "policy": "pre-bash-guard",
1275
+ "harness": "gemini",
1276
+ "event": "BeforeTool",
1277
+ "timing": "pre-tool",
1278
+ "profile": "any",
1279
+ "wired": true,
1280
+ "configSource": "core/harnesses/gemini/hooks/hooks.json:25",
1281
+ "harnessVersion": {
1282
+ "tested": "0.55.1"
1283
+ },
1284
+ "class": "blocking",
1285
+ "verification": "verified",
1286
+ "prerequisites": [],
1287
+ "covers": [],
1288
+ "doesNotCover": [],
1289
+ "caveats": [],
1290
+ "provenance": [
1291
+ {
1292
+ "kind": "doc",
1293
+ "locator": "https://geminicli.com/docs/hooks/",
1294
+ "date": "2026-10-12"
1295
+ },
1296
+ {
1297
+ "kind": "fixture",
1298
+ "locator": "test/fixtures/hooks/gemini/pre-bash-guard/deny.json",
1299
+ "date": "2026-10-14"
1300
+ }
1301
+ ]
1302
+ },
1303
+ {
1304
+ "policy": "pre-bash-guard",
1305
+ "harness": "opencode",
1306
+ "event": "*",
1307
+ "timing": "pre-tool",
1308
+ "profile": "any",
1309
+ "wired": false,
1310
+ "configSource": null,
1311
+ "harnessVersion": {
1312
+ "tested": "1.18.30"
1313
+ },
1314
+ "class": "unsupported",
1315
+ "verification": "unverified",
1316
+ "prerequisites": [],
1317
+ "covers": [],
1318
+ "doesNotCover": [],
1319
+ "caveats": [],
1320
+ "provenance": [
1321
+ {
1322
+ "kind": "doc",
1323
+ "locator": "core/registry/harnesses.json: opencode harness; core/registry/contracts.json: unavailable hook mapping",
1324
+ "date": "2026-10-12"
1325
+ }
1326
+ ]
1327
+ },
1328
+ {
1329
+ "policy": "pre-bash-guard",
1330
+ "harness": "copilot",
1331
+ "event": "*",
1332
+ "timing": "pre-tool",
1333
+ "profile": "any",
1334
+ "wired": false,
1335
+ "configSource": null,
1336
+ "harnessVersion": {
1337
+ "tested": "GitHub Copilot CLI 1.0.78"
1338
+ },
1339
+ "class": "unsupported",
1340
+ "verification": "unverified",
1341
+ "prerequisites": [],
1342
+ "covers": [],
1343
+ "doesNotCover": [],
1344
+ "caveats": [
1345
+ "version-drift:GitHub Copilot CLI 1.0.78."
1346
+ ],
1347
+ "provenance": [
1348
+ {
1349
+ "kind": "doc",
1350
+ "locator": "core/registry/harnesses.json: copilot harness; core/registry/contracts.json: unavailable hook mapping",
1351
+ "date": "2026-10-12"
1352
+ }
1353
+ ]
1354
+ },
1355
+ {
1356
+ "policy": "pre-bash-guard",
1357
+ "harness": "kiro",
1358
+ "event": "PreToolUse",
1359
+ "timing": "pre-tool",
1360
+ "profile": "ide",
1361
+ "wired": true,
1362
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:24",
1363
+ "harnessVersion": {
1364
+ "tested": "kiro-cli 2.29.1"
1365
+ },
1366
+ "class": "blocking",
1367
+ "verification": "verified",
1368
+ "prerequisites": [],
1369
+ "covers": [],
1370
+ "doesNotCover": [],
1371
+ "caveats": [],
1372
+ "provenance": [
1373
+ {
1374
+ "kind": "doc",
1375
+ "locator": "https://kiro.dev/docs/hooks/types/",
1376
+ "date": "2026-10-12"
1377
+ },
1378
+ {
1379
+ "kind": "fixture",
1380
+ "locator": "test/fixtures/hooks/kiro/pre-bash-guard/deny.json",
1381
+ "date": "2026-10-14"
1382
+ }
1383
+ ]
1384
+ },
1385
+ {
1386
+ "policy": "pre-bash-guard",
1387
+ "harness": "kiro",
1388
+ "event": "PreToolUse",
1389
+ "timing": "pre-tool",
1390
+ "profile": "cli-v3",
1391
+ "wired": true,
1392
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:24",
1393
+ "harnessVersion": {
1394
+ "tested": "kiro-cli 2.29.1"
1395
+ },
1396
+ "class": "blocking",
1397
+ "verification": "verified",
1398
+ "prerequisites": [],
1399
+ "covers": [],
1400
+ "doesNotCover": [],
1401
+ "caveats": [],
1402
+ "provenance": [
1403
+ {
1404
+ "kind": "doc",
1405
+ "locator": "https://kiro.dev/docs/hooks/types/",
1406
+ "date": "2026-10-12"
1407
+ },
1408
+ {
1409
+ "kind": "fixture",
1410
+ "locator": "test/fixtures/hooks/kiro/pre-bash-guard/deny.json",
1411
+ "date": "2026-10-14"
1412
+ }
1413
+ ]
1414
+ },
1415
+ {
1416
+ "policy": "pre-bash-guard",
1417
+ "harness": "kiro",
1418
+ "event": "PreToolUse",
1419
+ "timing": "pre-tool",
1420
+ "profile": "cli-v3-agent",
1421
+ "wired": true,
1422
+ "configSource": "core/harnesses/kiro/agents/doflow.json:21",
1423
+ "harnessVersion": {
1424
+ "tested": "kiro-cli 2.29.1"
1425
+ },
1426
+ "class": "blocking",
1427
+ "verification": "verified",
1428
+ "prerequisites": [],
1429
+ "covers": [],
1430
+ "doesNotCover": [],
1431
+ "caveats": [],
1432
+ "provenance": [
1433
+ {
1434
+ "kind": "doc",
1435
+ "locator": "https://kiro.dev/docs/hooks/types/",
1436
+ "date": "2026-10-12"
1437
+ },
1438
+ {
1439
+ "kind": "fixture",
1440
+ "locator": "test/fixtures/hooks/kiro/pre-bash-guard/agent-deny.json",
1441
+ "date": "2026-10-14"
1442
+ }
1443
+ ]
1444
+ },
1445
+ {
1446
+ "policy": "pre-bash-guard",
1447
+ "harness": "kiro",
1448
+ "event": "PreToolUse",
1449
+ "timing": "pre-tool",
1450
+ "profile": "cli-2x-agent",
1451
+ "wired": true,
1452
+ "configSource": "core/harnesses/kiro/agents/doflow.json:21",
1453
+ "harnessVersion": {
1454
+ "tested": "kiro-cli 2.29.1"
1455
+ },
1456
+ "class": "blocking",
1457
+ "verification": "verified",
1458
+ "prerequisites": [],
1459
+ "covers": [],
1460
+ "doesNotCover": [],
1461
+ "caveats": [],
1462
+ "provenance": [
1463
+ {
1464
+ "kind": "doc",
1465
+ "locator": "https://kiro.dev/docs/hooks/types/",
1466
+ "date": "2026-10-12"
1467
+ },
1468
+ {
1469
+ "kind": "fixture",
1470
+ "locator": "test/fixtures/hooks/kiro/pre-bash-guard/agent-deny.json",
1471
+ "date": "2026-10-14"
1472
+ }
1473
+ ]
1474
+ },
1475
+ {
1476
+ "policy": "pre-bash-guard",
1477
+ "harness": "antigravity",
1478
+ "event": "*",
1479
+ "timing": "pre-tool",
1480
+ "profile": "any",
1481
+ "wired": false,
1482
+ "configSource": null,
1483
+ "harnessVersion": {
1484
+ "tested": "1.3.3"
1485
+ },
1486
+ "class": "unsupported",
1487
+ "verification": "unverified",
1488
+ "prerequisites": [],
1489
+ "covers": [],
1490
+ "doesNotCover": [],
1491
+ "caveats": [
1492
+ "not wired for this harness mapping"
1493
+ ],
1494
+ "provenance": [
1495
+ {
1496
+ "kind": "doc",
1497
+ "locator": "core/registry/lifecycle.json: policy pre-bash-guard mapping for antigravity",
1498
+ "date": "2026-10-14"
1499
+ }
1500
+ ]
1501
+ },
1502
+ {
1503
+ "policy": "session-context",
1504
+ "harness": "claude",
1505
+ "event": "SessionStart",
1506
+ "timing": "session",
1507
+ "profile": "any",
1508
+ "wired": true,
1509
+ "configSource": "core/harnesses/claude/settings/settings.json:36",
1510
+ "harnessVersion": {
1511
+ "tested": "2.1.287 (Claude Code)"
1512
+ },
1513
+ "class": "unknown",
1514
+ "verification": "unverified",
1515
+ "prerequisites": [],
1516
+ "covers": [],
1517
+ "doesNotCover": [],
1518
+ "caveats": [
1519
+ "native event enforcement is not yet verified"
1520
+ ],
1521
+ "provenance": [
1522
+ {
1523
+ "kind": "doc",
1524
+ "locator": "https://code.claude.com/docs/en/hooks",
1525
+ "date": "2026-10-12"
1526
+ }
1527
+ ]
1528
+ },
1529
+ {
1530
+ "policy": "session-context",
1531
+ "harness": "codex",
1532
+ "event": "SessionStart",
1533
+ "timing": "session",
1534
+ "profile": "any",
1535
+ "wired": true,
1536
+ "configSource": "core/harnesses/codex/hooks/hooks.json:4",
1537
+ "harnessVersion": {
1538
+ "tested": "codex-cli 0.162.1"
1539
+ },
1540
+ "class": "unknown",
1541
+ "verification": "unverified",
1542
+ "prerequisites": [
1543
+ "hook-review"
1544
+ ],
1545
+ "covers": [],
1546
+ "doesNotCover": [],
1547
+ "caveats": [
1548
+ "native event enforcement is not yet verified"
1549
+ ],
1550
+ "provenance": [
1551
+ {
1552
+ "kind": "doc",
1553
+ "locator": "https://learn.chatgpt.com/docs/hooks",
1554
+ "date": "2026-10-12"
1555
+ }
1556
+ ]
1557
+ },
1558
+ {
1559
+ "policy": "session-context",
1560
+ "harness": "gemini",
1561
+ "event": "SessionStart",
1562
+ "timing": "session",
1563
+ "profile": "any",
1564
+ "wired": true,
1565
+ "configSource": "core/harnesses/gemini/hooks/hooks.json:4",
1566
+ "harnessVersion": {
1567
+ "tested": "0.55.1"
1568
+ },
1569
+ "class": "unknown",
1570
+ "verification": "unverified",
1571
+ "prerequisites": [],
1572
+ "covers": [],
1573
+ "doesNotCover": [],
1574
+ "caveats": [
1575
+ "native event enforcement is not yet verified"
1576
+ ],
1577
+ "provenance": [
1578
+ {
1579
+ "kind": "doc",
1580
+ "locator": "https://geminicli.com/docs/hooks/",
1581
+ "date": "2026-10-12"
1582
+ }
1583
+ ]
1584
+ },
1585
+ {
1586
+ "policy": "session-context",
1587
+ "harness": "opencode",
1588
+ "event": "*",
1589
+ "timing": "session",
1590
+ "profile": "any",
1591
+ "wired": false,
1592
+ "configSource": null,
1593
+ "harnessVersion": {
1594
+ "tested": "1.18.30"
1595
+ },
1596
+ "class": "unsupported",
1597
+ "verification": "unverified",
1598
+ "prerequisites": [],
1599
+ "covers": [],
1600
+ "doesNotCover": [],
1601
+ "caveats": [],
1602
+ "provenance": [
1603
+ {
1604
+ "kind": "doc",
1605
+ "locator": "core/registry/harnesses.json: opencode harness; core/registry/contracts.json: unavailable hook mapping",
1606
+ "date": "2026-10-12"
1607
+ }
1608
+ ]
1609
+ },
1610
+ {
1611
+ "policy": "session-context",
1612
+ "harness": "copilot",
1613
+ "event": "PreCompact",
1614
+ "timing": "compact",
1615
+ "profile": "any",
1616
+ "wired": false,
1617
+ "configSource": null,
1618
+ "harnessVersion": {
1619
+ "tested": "GitHub Copilot CLI 1.0.78"
1620
+ },
1621
+ "class": "unknown",
1622
+ "verification": "unverified",
1623
+ "prerequisites": [],
1624
+ "covers": [],
1625
+ "doesNotCover": [],
1626
+ "caveats": [
1627
+ "fixture-pending",
1628
+ "version-drift:GitHub Copilot CLI 1.0.78."
1629
+ ],
1630
+ "provenance": [
1631
+ {
1632
+ "kind": "doc",
1633
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
1634
+ "date": "2026-10-14"
1635
+ }
1636
+ ]
1637
+ },
1638
+ {
1639
+ "policy": "session-context",
1640
+ "harness": "copilot",
1641
+ "event": "SessionEnd",
1642
+ "timing": "session",
1643
+ "profile": "any",
1644
+ "wired": false,
1645
+ "configSource": null,
1646
+ "harnessVersion": {
1647
+ "tested": "GitHub Copilot CLI 1.0.78"
1648
+ },
1649
+ "class": "unknown",
1650
+ "verification": "unverified",
1651
+ "prerequisites": [],
1652
+ "covers": [],
1653
+ "doesNotCover": [],
1654
+ "caveats": [
1655
+ "fixture-pending",
1656
+ "version-drift:GitHub Copilot CLI 1.0.78."
1657
+ ],
1658
+ "provenance": [
1659
+ {
1660
+ "kind": "doc",
1661
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
1662
+ "date": "2026-10-14"
1663
+ }
1664
+ ]
1665
+ },
1666
+ {
1667
+ "policy": "session-context",
1668
+ "harness": "copilot",
1669
+ "event": "SessionStart",
1670
+ "timing": "session",
1671
+ "profile": "any",
1672
+ "wired": false,
1673
+ "configSource": null,
1674
+ "harnessVersion": {
1675
+ "tested": "GitHub Copilot CLI 1.0.78"
1676
+ },
1677
+ "class": "unknown",
1678
+ "verification": "unverified",
1679
+ "prerequisites": [],
1680
+ "covers": [],
1681
+ "doesNotCover": [],
1682
+ "caveats": [
1683
+ "fixture-pending",
1684
+ "version-drift:GitHub Copilot CLI 1.0.78."
1685
+ ],
1686
+ "provenance": [
1687
+ {
1688
+ "kind": "doc",
1689
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
1690
+ "date": "2026-10-14"
1691
+ }
1692
+ ]
1693
+ },
1694
+ {
1695
+ "policy": "session-context",
1696
+ "harness": "copilot",
1697
+ "event": "SubagentStart",
1698
+ "timing": "subagent",
1699
+ "profile": "any",
1700
+ "wired": false,
1701
+ "configSource": null,
1702
+ "harnessVersion": {
1703
+ "tested": "GitHub Copilot CLI 1.0.78"
1704
+ },
1705
+ "class": "unknown",
1706
+ "verification": "unverified",
1707
+ "prerequisites": [],
1708
+ "covers": [],
1709
+ "doesNotCover": [],
1710
+ "caveats": [
1711
+ "fixture-pending",
1712
+ "version-drift:GitHub Copilot CLI 1.0.78."
1713
+ ],
1714
+ "provenance": [
1715
+ {
1716
+ "kind": "doc",
1717
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
1718
+ "date": "2026-10-14"
1719
+ }
1720
+ ]
1721
+ },
1722
+ {
1723
+ "policy": "session-context",
1724
+ "harness": "copilot",
1725
+ "event": "SubagentStop",
1726
+ "timing": "subagent",
1727
+ "profile": "any",
1728
+ "wired": false,
1729
+ "configSource": null,
1730
+ "harnessVersion": {
1731
+ "tested": "GitHub Copilot CLI 1.0.78"
1732
+ },
1733
+ "class": "unknown",
1734
+ "verification": "unverified",
1735
+ "prerequisites": [],
1736
+ "covers": [],
1737
+ "doesNotCover": [],
1738
+ "caveats": [
1739
+ "fixture-pending",
1740
+ "version-drift:GitHub Copilot CLI 1.0.78."
1741
+ ],
1742
+ "provenance": [
1743
+ {
1744
+ "kind": "doc",
1745
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
1746
+ "date": "2026-10-14"
1747
+ }
1748
+ ]
1749
+ },
1750
+ {
1751
+ "policy": "session-context",
1752
+ "harness": "copilot",
1753
+ "event": "*",
1754
+ "timing": "session",
1755
+ "profile": "any",
1756
+ "wired": false,
1757
+ "configSource": null,
1758
+ "harnessVersion": {
1759
+ "tested": "GitHub Copilot CLI 1.0.78"
1760
+ },
1761
+ "class": "unsupported",
1762
+ "verification": "unverified",
1763
+ "prerequisites": [],
1764
+ "covers": [],
1765
+ "doesNotCover": [],
1766
+ "caveats": [
1767
+ "version-drift:GitHub Copilot CLI 1.0.78."
1768
+ ],
1769
+ "provenance": [
1770
+ {
1771
+ "kind": "doc",
1772
+ "locator": "core/registry/harnesses.json: copilot harness; core/registry/contracts.json: unavailable hook mapping",
1773
+ "date": "2026-10-12"
1774
+ }
1775
+ ]
1776
+ },
1777
+ {
1778
+ "policy": "session-context",
1779
+ "harness": "copilot",
1780
+ "event": "UserPromptSubmit",
1781
+ "timing": "prompt",
1782
+ "profile": "any",
1783
+ "wired": false,
1784
+ "configSource": null,
1785
+ "harnessVersion": {
1786
+ "tested": "GitHub Copilot CLI 1.0.78"
1787
+ },
1788
+ "class": "unknown",
1789
+ "verification": "unverified",
1790
+ "prerequisites": [],
1791
+ "covers": [],
1792
+ "doesNotCover": [],
1793
+ "caveats": [
1794
+ "fixture-pending",
1795
+ "version-drift:GitHub Copilot CLI 1.0.78."
1796
+ ],
1797
+ "provenance": [
1798
+ {
1799
+ "kind": "doc",
1800
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
1801
+ "date": "2026-10-14"
1802
+ }
1803
+ ]
1804
+ },
1805
+ {
1806
+ "policy": "session-context",
1807
+ "harness": "kiro",
1808
+ "event": "SessionStart",
1809
+ "timing": "session",
1810
+ "profile": "any",
1811
+ "wired": true,
1812
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:6",
1813
+ "harnessVersion": {
1814
+ "tested": "kiro-cli 2.29.1"
1815
+ },
1816
+ "class": "advisory",
1817
+ "verification": "unverified",
1818
+ "prerequisites": [],
1819
+ "covers": [],
1820
+ "doesNotCover": [],
1821
+ "caveats": [
1822
+ "native event enforcement is not yet verified"
1823
+ ],
1824
+ "provenance": [
1825
+ {
1826
+ "kind": "doc",
1827
+ "locator": "https://kiro.dev/docs/hooks/types/",
1828
+ "date": "2026-10-12"
1829
+ }
1830
+ ]
1831
+ },
1832
+ {
1833
+ "policy": "session-context",
1834
+ "harness": "antigravity",
1835
+ "event": "*",
1836
+ "timing": "session",
1837
+ "profile": "any",
1838
+ "wired": false,
1839
+ "configSource": null,
1840
+ "harnessVersion": {
1841
+ "tested": "1.3.3"
1842
+ },
1843
+ "class": "unsupported",
1844
+ "verification": "unverified",
1845
+ "prerequisites": [],
1846
+ "covers": [],
1847
+ "doesNotCover": [],
1848
+ "caveats": [
1849
+ "not wired for this harness mapping"
1850
+ ],
1851
+ "provenance": [
1852
+ {
1853
+ "kind": "doc",
1854
+ "locator": "core/registry/lifecycle.json: policy session-context mapping for antigravity",
1855
+ "date": "2026-10-14"
1856
+ }
1857
+ ]
1858
+ },
1859
+ {
1860
+ "policy": "mcp-tool-guard",
1861
+ "harness": "claude",
1862
+ "event": "PreToolUse",
1863
+ "timing": "pre-tool",
1864
+ "profile": "any",
1865
+ "wired": true,
1866
+ "configSource": "core/harnesses/claude/settings/settings.json:89",
1867
+ "harnessVersion": {
1868
+ "tested": "2.1.287 (Claude Code)"
1869
+ },
1870
+ "class": "blocking",
1871
+ "verification": "verified",
1872
+ "prerequisites": [],
1873
+ "covers": [],
1874
+ "doesNotCover": [],
1875
+ "caveats": [],
1876
+ "provenance": [
1877
+ {
1878
+ "kind": "doc",
1879
+ "locator": "https://code.claude.com/docs/en/hooks",
1880
+ "date": "2026-10-12"
1881
+ },
1882
+ {
1883
+ "kind": "fixture",
1884
+ "locator": "test/fixtures/hooks/claude/mcp-tool-guard/deny.json",
1885
+ "date": "2026-10-14"
1886
+ }
1887
+ ]
1888
+ },
1889
+ {
1890
+ "policy": "mcp-tool-guard",
1891
+ "harness": "codex",
1892
+ "event": "PreToolUse",
1893
+ "timing": "pre-tool",
1894
+ "profile": "any",
1895
+ "wired": true,
1896
+ "configSource": "core/harnesses/codex/hooks/hooks.json:45",
1897
+ "harnessVersion": {
1898
+ "tested": "codex-cli 0.162.1"
1899
+ },
1900
+ "class": "blocking",
1901
+ "verification": "verified",
1902
+ "prerequisites": [
1903
+ "hook-review"
1904
+ ],
1905
+ "covers": [],
1906
+ "doesNotCover": [],
1907
+ "caveats": [],
1908
+ "provenance": [
1909
+ {
1910
+ "kind": "doc",
1911
+ "locator": "https://learn.chatgpt.com/docs/hooks",
1912
+ "date": "2026-10-12"
1913
+ },
1914
+ {
1915
+ "kind": "fixture",
1916
+ "locator": "test/fixtures/hooks/codex/mcp-tool-guard/deny.json",
1917
+ "date": "2026-10-14"
1918
+ }
1919
+ ]
1920
+ },
1921
+ {
1922
+ "policy": "mcp-tool-guard",
1923
+ "harness": "gemini",
1924
+ "event": "BeforeTool",
1925
+ "timing": "pre-tool",
1926
+ "profile": "any",
1927
+ "wired": true,
1928
+ "configSource": "core/harnesses/gemini/hooks/hooks.json:25",
1929
+ "harnessVersion": {
1930
+ "tested": "0.55.1"
1931
+ },
1932
+ "class": "blocking",
1933
+ "verification": "verified",
1934
+ "prerequisites": [],
1935
+ "covers": [],
1936
+ "doesNotCover": [],
1937
+ "caveats": [],
1938
+ "provenance": [
1939
+ {
1940
+ "kind": "doc",
1941
+ "locator": "https://geminicli.com/docs/hooks/",
1942
+ "date": "2026-10-12"
1943
+ },
1944
+ {
1945
+ "kind": "fixture",
1946
+ "locator": "test/fixtures/hooks/gemini/mcp-tool-guard/deny.json",
1947
+ "date": "2026-10-14"
1948
+ }
1949
+ ]
1950
+ },
1951
+ {
1952
+ "policy": "mcp-tool-guard",
1953
+ "harness": "opencode",
1954
+ "event": "*",
1955
+ "timing": "pre-tool",
1956
+ "profile": "any",
1957
+ "wired": false,
1958
+ "configSource": null,
1959
+ "harnessVersion": {
1960
+ "tested": "1.18.30"
1961
+ },
1962
+ "class": "unsupported",
1963
+ "verification": "unverified",
1964
+ "prerequisites": [],
1965
+ "covers": [],
1966
+ "doesNotCover": [],
1967
+ "caveats": [],
1968
+ "provenance": [
1969
+ {
1970
+ "kind": "doc",
1971
+ "locator": "core/registry/harnesses.json: opencode harness; core/registry/contracts.json: unavailable hook mapping",
1972
+ "date": "2026-10-12"
1973
+ }
1974
+ ]
1975
+ },
1976
+ {
1977
+ "policy": "mcp-tool-guard",
1978
+ "harness": "copilot",
1979
+ "event": "PermissionDenied",
1980
+ "timing": "session",
1981
+ "profile": "any",
1982
+ "wired": false,
1983
+ "configSource": null,
1984
+ "harnessVersion": {
1985
+ "tested": "GitHub Copilot CLI 1.0.78"
1986
+ },
1987
+ "class": "unknown",
1988
+ "verification": "unverified",
1989
+ "prerequisites": [],
1990
+ "covers": [],
1991
+ "doesNotCover": [],
1992
+ "caveats": [
1993
+ "fixture-pending",
1994
+ "version-drift:GitHub Copilot CLI 1.0.78."
1995
+ ],
1996
+ "provenance": [
1997
+ {
1998
+ "kind": "doc",
1999
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
2000
+ "date": "2026-10-14"
2001
+ }
2002
+ ]
2003
+ },
2004
+ {
2005
+ "policy": "mcp-tool-guard",
2006
+ "harness": "copilot",
2007
+ "event": "PostToolUse",
2008
+ "timing": "post-tool",
2009
+ "profile": "any",
2010
+ "wired": false,
2011
+ "configSource": null,
2012
+ "harnessVersion": {
2013
+ "tested": "GitHub Copilot CLI 1.0.78"
2014
+ },
2015
+ "class": "unknown",
2016
+ "verification": "unverified",
2017
+ "prerequisites": [],
2018
+ "covers": [],
2019
+ "doesNotCover": [],
2020
+ "caveats": [
2021
+ "fixture-pending",
2022
+ "version-drift:GitHub Copilot CLI 1.0.78."
2023
+ ],
2024
+ "provenance": [
2025
+ {
2026
+ "kind": "doc",
2027
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
2028
+ "date": "2026-10-14"
2029
+ }
2030
+ ]
2031
+ },
2032
+ {
2033
+ "policy": "mcp-tool-guard",
2034
+ "harness": "copilot",
2035
+ "event": "PostToolUseFailure",
2036
+ "timing": "post-tool",
2037
+ "profile": "any",
2038
+ "wired": false,
2039
+ "configSource": null,
2040
+ "harnessVersion": {
2041
+ "tested": "GitHub Copilot CLI 1.0.78"
2042
+ },
2043
+ "class": "unknown",
2044
+ "verification": "unverified",
2045
+ "prerequisites": [],
2046
+ "covers": [],
2047
+ "doesNotCover": [],
2048
+ "caveats": [
2049
+ "fixture-pending",
2050
+ "version-drift:GitHub Copilot CLI 1.0.78."
2051
+ ],
2052
+ "provenance": [
2053
+ {
2054
+ "kind": "doc",
2055
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
2056
+ "date": "2026-10-14"
2057
+ }
2058
+ ]
2059
+ },
2060
+ {
2061
+ "policy": "mcp-tool-guard",
2062
+ "harness": "copilot",
2063
+ "event": "*",
2064
+ "timing": "pre-tool",
2065
+ "profile": "any",
2066
+ "wired": false,
2067
+ "configSource": null,
2068
+ "harnessVersion": {
2069
+ "tested": "GitHub Copilot CLI 1.0.78"
2070
+ },
2071
+ "class": "unsupported",
2072
+ "verification": "unverified",
2073
+ "prerequisites": [],
2074
+ "covers": [],
2075
+ "doesNotCover": [],
2076
+ "caveats": [
2077
+ "version-drift:GitHub Copilot CLI 1.0.78."
2078
+ ],
2079
+ "provenance": [
2080
+ {
2081
+ "kind": "doc",
2082
+ "locator": "core/registry/harnesses.json: copilot harness; core/registry/contracts.json: unavailable hook mapping",
2083
+ "date": "2026-10-12"
2084
+ }
2085
+ ]
2086
+ },
2087
+ {
2088
+ "policy": "mcp-tool-guard",
2089
+ "harness": "kiro",
2090
+ "event": "PreToolUse",
2091
+ "timing": "pre-tool",
2092
+ "profile": "ide",
2093
+ "wired": true,
2094
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:34",
2095
+ "harnessVersion": {
2096
+ "tested": "kiro-cli 2.29.1"
2097
+ },
2098
+ "class": "blocking",
2099
+ "verification": "verified",
2100
+ "prerequisites": [],
2101
+ "covers": [],
2102
+ "doesNotCover": [],
2103
+ "caveats": [],
2104
+ "provenance": [
2105
+ {
2106
+ "kind": "doc",
2107
+ "locator": "https://kiro.dev/docs/hooks/types/",
2108
+ "date": "2026-10-12"
2109
+ },
2110
+ {
2111
+ "kind": "fixture",
2112
+ "locator": "test/fixtures/hooks/kiro/mcp-tool-guard/deny.json",
2113
+ "date": "2026-10-14"
2114
+ }
2115
+ ]
2116
+ },
2117
+ {
2118
+ "policy": "mcp-tool-guard",
2119
+ "harness": "kiro",
2120
+ "event": "PreToolUse",
2121
+ "timing": "pre-tool",
2122
+ "profile": "cli-v3",
2123
+ "wired": true,
2124
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:34",
2125
+ "harnessVersion": {
2126
+ "tested": "kiro-cli 2.29.1"
2127
+ },
2128
+ "class": "blocking",
2129
+ "verification": "verified",
2130
+ "prerequisites": [],
2131
+ "covers": [],
2132
+ "doesNotCover": [],
2133
+ "caveats": [],
2134
+ "provenance": [
2135
+ {
2136
+ "kind": "doc",
2137
+ "locator": "https://kiro.dev/docs/hooks/types/",
2138
+ "date": "2026-10-12"
2139
+ },
2140
+ {
2141
+ "kind": "fixture",
2142
+ "locator": "test/fixtures/hooks/kiro/mcp-tool-guard/deny.json",
2143
+ "date": "2026-10-14"
2144
+ }
2145
+ ]
2146
+ },
2147
+ {
2148
+ "policy": "mcp-tool-guard",
2149
+ "harness": "kiro",
2150
+ "event": "PreToolUse",
2151
+ "timing": "pre-tool",
2152
+ "profile": "cli-v3-agent",
2153
+ "wired": true,
2154
+ "configSource": "core/harnesses/kiro/agents/doflow.json:31",
2155
+ "harnessVersion": {
2156
+ "tested": "kiro-cli 2.29.1"
2157
+ },
2158
+ "class": "blocking",
2159
+ "verification": "verified",
2160
+ "prerequisites": [],
2161
+ "covers": [],
2162
+ "doesNotCover": [],
2163
+ "caveats": [],
2164
+ "provenance": [
2165
+ {
2166
+ "kind": "doc",
2167
+ "locator": "https://kiro.dev/docs/hooks/types/",
2168
+ "date": "2026-10-12"
2169
+ },
2170
+ {
2171
+ "kind": "fixture",
2172
+ "locator": "test/fixtures/hooks/kiro/mcp-tool-guard/agent-deny.json",
2173
+ "date": "2026-10-14"
2174
+ }
2175
+ ]
2176
+ },
2177
+ {
2178
+ "policy": "mcp-tool-guard",
2179
+ "harness": "kiro",
2180
+ "event": "PreToolUse",
2181
+ "timing": "pre-tool",
2182
+ "profile": "cli-2x-agent",
2183
+ "wired": true,
2184
+ "configSource": "core/harnesses/kiro/agents/doflow.json:31",
2185
+ "harnessVersion": {
2186
+ "tested": "kiro-cli 2.29.1"
2187
+ },
2188
+ "class": "blocking",
2189
+ "verification": "verified",
2190
+ "prerequisites": [],
2191
+ "covers": [],
2192
+ "doesNotCover": [],
2193
+ "caveats": [],
2194
+ "provenance": [
2195
+ {
2196
+ "kind": "doc",
2197
+ "locator": "https://kiro.dev/docs/hooks/types/",
2198
+ "date": "2026-10-12"
2199
+ },
2200
+ {
2201
+ "kind": "fixture",
2202
+ "locator": "test/fixtures/hooks/kiro/mcp-tool-guard/agent-deny.json",
2203
+ "date": "2026-10-14"
2204
+ }
2205
+ ]
2206
+ },
2207
+ {
2208
+ "policy": "mcp-tool-guard",
2209
+ "harness": "antigravity",
2210
+ "event": "*",
2211
+ "timing": "pre-tool",
2212
+ "profile": "any",
2213
+ "wired": false,
2214
+ "configSource": null,
2215
+ "harnessVersion": {
2216
+ "tested": "1.3.3"
2217
+ },
2218
+ "class": "unsupported",
2219
+ "verification": "unverified",
2220
+ "prerequisites": [],
2221
+ "covers": [],
2222
+ "doesNotCover": [],
2223
+ "caveats": [
2224
+ "not wired for this harness mapping"
2225
+ ],
2226
+ "provenance": [
2227
+ {
2228
+ "kind": "doc",
2229
+ "locator": "core/registry/lifecycle.json: policy mcp-tool-guard mapping for antigravity",
2230
+ "date": "2026-10-14"
2231
+ }
2232
+ ]
2233
+ },
2234
+ {
2235
+ "policy": "stop-check",
2236
+ "harness": "claude",
2237
+ "event": "Stop",
2238
+ "timing": "stop",
2239
+ "profile": "any",
2240
+ "wired": true,
2241
+ "configSource": "core/harnesses/claude/settings/settings.json:138",
2242
+ "harnessVersion": {
2243
+ "tested": "2.1.287 (Claude Code)"
2244
+ },
2245
+ "class": "blocking",
2246
+ "verification": "verified",
2247
+ "prerequisites": [],
2248
+ "covers": [],
2249
+ "doesNotCover": [],
2250
+ "caveats": [],
2251
+ "provenance": [
2252
+ {
2253
+ "kind": "doc",
2254
+ "locator": "https://code.claude.com/docs/en/hooks",
2255
+ "date": "2026-10-12"
2256
+ },
2257
+ {
2258
+ "kind": "fixture",
2259
+ "locator": "test/fixtures/hooks/claude/stop-check/deny.json",
2260
+ "date": "2026-10-14"
2261
+ }
2262
+ ]
2263
+ },
2264
+ {
2265
+ "policy": "stop-check",
2266
+ "harness": "codex",
2267
+ "event": "Stop",
2268
+ "timing": "stop",
2269
+ "profile": "any",
2270
+ "wired": true,
2271
+ "configSource": "core/harnesses/codex/hooks/hooks.json:99",
2272
+ "harnessVersion": {
2273
+ "tested": "codex-cli 0.162.1"
2274
+ },
2275
+ "class": "blocking",
2276
+ "verification": "verified",
2277
+ "prerequisites": [
2278
+ "hook-review"
2279
+ ],
2280
+ "covers": [],
2281
+ "doesNotCover": [],
2282
+ "caveats": [],
2283
+ "provenance": [
2284
+ {
2285
+ "kind": "doc",
2286
+ "locator": "https://learn.chatgpt.com/docs/hooks",
2287
+ "date": "2026-10-12"
2288
+ },
2289
+ {
2290
+ "kind": "fixture",
2291
+ "locator": "test/fixtures/hooks/codex/stop-check/deny.json",
2292
+ "date": "2026-10-14"
2293
+ }
2294
+ ]
2295
+ },
2296
+ {
2297
+ "policy": "stop-check",
2298
+ "harness": "gemini",
2299
+ "event": "*",
2300
+ "timing": "stop",
2301
+ "profile": "any",
2302
+ "wired": false,
2303
+ "configSource": null,
2304
+ "harnessVersion": {
2305
+ "tested": "0.55.1"
2306
+ },
2307
+ "class": "unsupported",
2308
+ "verification": "unverified",
2309
+ "prerequisites": [],
2310
+ "covers": [],
2311
+ "doesNotCover": [],
2312
+ "caveats": [
2313
+ "not wired for this harness mapping"
2314
+ ],
2315
+ "provenance": [
2316
+ {
2317
+ "kind": "doc",
2318
+ "locator": "core/registry/lifecycle.json: policy stop-check mapping for gemini",
2319
+ "date": "2026-10-14"
2320
+ }
2321
+ ]
2322
+ },
2323
+ {
2324
+ "policy": "stop-check",
2325
+ "harness": "opencode",
2326
+ "event": "*",
2327
+ "timing": "stop",
2328
+ "profile": "any",
2329
+ "wired": false,
2330
+ "configSource": null,
2331
+ "harnessVersion": {
2332
+ "tested": "1.18.30"
2333
+ },
2334
+ "class": "unsupported",
2335
+ "verification": "unverified",
2336
+ "prerequisites": [],
2337
+ "covers": [],
2338
+ "doesNotCover": [],
2339
+ "caveats": [],
2340
+ "provenance": [
2341
+ {
2342
+ "kind": "doc",
2343
+ "locator": "core/registry/harnesses.json: opencode harness; core/registry/contracts.json: unavailable hook mapping",
2344
+ "date": "2026-10-12"
2345
+ }
2346
+ ]
2347
+ },
2348
+ {
2349
+ "policy": "stop-check",
2350
+ "harness": "copilot",
2351
+ "event": "Stop",
2352
+ "timing": "stop",
2353
+ "profile": "any",
2354
+ "wired": false,
2355
+ "configSource": null,
2356
+ "harnessVersion": {
2357
+ "tested": "GitHub Copilot CLI 1.0.78"
2358
+ },
2359
+ "class": "unknown",
2360
+ "verification": "unverified",
2361
+ "prerequisites": [],
2362
+ "covers": [],
2363
+ "doesNotCover": [],
2364
+ "caveats": [
2365
+ "fixture-pending",
2366
+ "version-drift:GitHub Copilot CLI 1.0.78."
2367
+ ],
2368
+ "provenance": [
2369
+ {
2370
+ "kind": "doc",
2371
+ "locator": "core/registry/contracts.json: Copilot documented event inventory",
2372
+ "date": "2026-10-14"
2373
+ }
2374
+ ]
2375
+ },
2376
+ {
2377
+ "policy": "stop-check",
2378
+ "harness": "copilot",
2379
+ "event": "*",
2380
+ "timing": "stop",
2381
+ "profile": "any",
2382
+ "wired": false,
2383
+ "configSource": null,
2384
+ "harnessVersion": {
2385
+ "tested": "GitHub Copilot CLI 1.0.78"
2386
+ },
2387
+ "class": "unsupported",
2388
+ "verification": "unverified",
2389
+ "prerequisites": [],
2390
+ "covers": [],
2391
+ "doesNotCover": [],
2392
+ "caveats": [
2393
+ "version-drift:GitHub Copilot CLI 1.0.78."
2394
+ ],
2395
+ "provenance": [
2396
+ {
2397
+ "kind": "doc",
2398
+ "locator": "core/registry/harnesses.json: copilot harness; core/registry/contracts.json: unavailable hook mapping",
2399
+ "date": "2026-10-12"
2400
+ }
2401
+ ]
2402
+ },
2403
+ {
2404
+ "policy": "stop-check",
2405
+ "harness": "kiro",
2406
+ "event": "Stop",
2407
+ "timing": "stop",
2408
+ "profile": "ide",
2409
+ "wired": true,
2410
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:44",
2411
+ "harnessVersion": {
2412
+ "tested": "kiro-cli 2.29.1"
2413
+ },
2414
+ "class": "unknown",
2415
+ "verification": "unverified",
2416
+ "prerequisites": [],
2417
+ "covers": [],
2418
+ "doesNotCover": [],
2419
+ "caveats": [
2420
+ "Kiro documents AgentStop, not the configured Stop trigger; native trigger equivalence is unresolved",
2421
+ "V3 payload carries no transcript"
2422
+ ],
2423
+ "provenance": [
2424
+ {
2425
+ "kind": "doc",
2426
+ "locator": "https://kiro.dev/docs/hooks/types/",
2427
+ "date": "2026-10-12"
2428
+ },
2429
+ {
2430
+ "kind": "doc",
2431
+ "locator": "core/registry/harnesses.json: Kiro V3 Stop observation; bench/inventory/coverage.json: AgentStop",
2432
+ "date": "2026-10-14"
2433
+ },
2434
+ {
2435
+ "kind": "fixture",
2436
+ "locator": "test/fixtures/hooks/kiro/stop-check/v3-deny.json",
2437
+ "date": "2026-10-14"
2438
+ }
2439
+ ]
2440
+ },
2441
+ {
2442
+ "policy": "stop-check",
2443
+ "harness": "kiro",
2444
+ "event": "Stop",
2445
+ "timing": "stop",
2446
+ "profile": "cli-v3",
2447
+ "wired": true,
2448
+ "configSource": "core/harnesses/kiro/hooks/doflow.json:44",
2449
+ "harnessVersion": {
2450
+ "tested": "kiro-cli 2.29.1"
2451
+ },
2452
+ "class": "unknown",
2453
+ "verification": "unverified",
2454
+ "prerequisites": [],
2455
+ "covers": [],
2456
+ "doesNotCover": [],
2457
+ "caveats": [
2458
+ "Kiro documents AgentStop, not the configured Stop trigger; native trigger equivalence is unresolved",
2459
+ "V3 payload carries no transcript"
2460
+ ],
2461
+ "provenance": [
2462
+ {
2463
+ "kind": "doc",
2464
+ "locator": "https://kiro.dev/docs/hooks/types/",
2465
+ "date": "2026-10-12"
2466
+ },
2467
+ {
2468
+ "kind": "doc",
2469
+ "locator": "core/registry/harnesses.json: Kiro V3 Stop observation; bench/inventory/coverage.json: AgentStop",
2470
+ "date": "2026-10-14"
2471
+ },
2472
+ {
2473
+ "kind": "fixture",
2474
+ "locator": "test/fixtures/hooks/kiro/stop-check/v3-deny.json",
2475
+ "date": "2026-10-14"
2476
+ }
2477
+ ]
2478
+ },
2479
+ {
2480
+ "policy": "stop-check",
2481
+ "harness": "antigravity",
2482
+ "event": "Stop",
2483
+ "timing": "stop",
2484
+ "profile": "any",
2485
+ "wired": true,
2486
+ "configSource": "src/adapters/antigravity/index.js:60",
2487
+ "harnessVersion": {
2488
+ "tested": "1.3.3"
2489
+ },
2490
+ "class": "blocking",
2491
+ "verification": "verified",
2492
+ "prerequisites": [],
2493
+ "covers": [],
2494
+ "doesNotCover": [],
2495
+ "caveats": [],
2496
+ "provenance": [
2497
+ {
2498
+ "kind": "doc",
2499
+ "locator": "https://antigravity.google/docs/hooks/",
2500
+ "date": "2026-10-12"
2501
+ },
2502
+ {
2503
+ "kind": "fixture",
2504
+ "locator": "test/fixtures/hooks/antigravity/stop-check/continue.json",
2505
+ "date": "2026-10-14"
2506
+ }
2507
+ ]
2508
+ },
2509
+ {
2510
+ "policy": "pre-implementation-gate",
2511
+ "harness": "pi",
2512
+ "event": "tool_call",
2513
+ "timing": "pre-tool",
2514
+ "profile": "project-interactive",
2515
+ "wired": true,
2516
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
2517
+ "harnessVersion": {
2518
+ "tested": "1.1.0"
2519
+ },
2520
+ "class": "unknown",
2521
+ "verification": "unverified",
2522
+ "prerequisites": [
2523
+ "project-trust"
2524
+ ],
2525
+ "covers": [],
2526
+ "doesNotCover": [
2527
+ "writes via shell commands"
2528
+ ],
2529
+ "caveats": [
2530
+ "project-trust is required for the project-scope extension",
2531
+ "loading path not live-observed",
2532
+ "project-trust is required for the project-scope extension"
2533
+ ],
2534
+ "provenance": [
2535
+ {
2536
+ "kind": "types",
2537
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
2538
+ "date": "2026-10-14"
2539
+ },
2540
+ {
2541
+ "kind": "doc",
2542
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
2543
+ "date": "2026-10-14"
2544
+ },
2545
+ {
2546
+ "kind": "fixture",
2547
+ "locator": "test/fixtures/hooks/pi/tool_call/edit-deny.json",
2548
+ "date": "2026-10-14"
2549
+ }
2550
+ ]
2551
+ },
2552
+ {
2553
+ "policy": "pre-bash-guard",
2554
+ "harness": "pi",
2555
+ "event": "tool_call",
2556
+ "timing": "pre-tool",
2557
+ "profile": "project-interactive",
2558
+ "wired": true,
2559
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
2560
+ "harnessVersion": {
2561
+ "tested": "1.1.0"
2562
+ },
2563
+ "class": "unknown",
2564
+ "verification": "unverified",
2565
+ "prerequisites": [
2566
+ "project-trust"
2567
+ ],
2568
+ "covers": [],
2569
+ "doesNotCover": [],
2570
+ "caveats": [
2571
+ "project-trust is required for the project-scope extension",
2572
+ "loading path not live-observed",
2573
+ "project-trust is required for the project-scope extension"
2574
+ ],
2575
+ "provenance": [
2576
+ {
2577
+ "kind": "types",
2578
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
2579
+ "date": "2026-10-14"
2580
+ },
2581
+ {
2582
+ "kind": "doc",
2583
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
2584
+ "date": "2026-10-14"
2585
+ },
2586
+ {
2587
+ "kind": "fixture",
2588
+ "locator": "test/fixtures/hooks/pi/tool_call/bash-deny.json",
2589
+ "date": "2026-10-14"
2590
+ }
2591
+ ]
2592
+ },
2593
+ {
2594
+ "policy": "mcp-tool-guard",
2595
+ "harness": "pi",
2596
+ "event": "tool_call",
2597
+ "timing": "pre-tool",
2598
+ "profile": "project-interactive",
2599
+ "wired": true,
2600
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
2601
+ "harnessVersion": {
2602
+ "tested": "1.1.0"
2603
+ },
2604
+ "class": "unknown",
2605
+ "verification": "unverified",
2606
+ "prerequisites": [
2607
+ "project-trust"
2608
+ ],
2609
+ "covers": [],
2610
+ "doesNotCover": [],
2611
+ "caveats": [
2612
+ "project-trust is required for the project-scope extension",
2613
+ "loading path not live-observed",
2614
+ "project-trust is required for the project-scope extension"
2615
+ ],
2616
+ "provenance": [
2617
+ {
2618
+ "kind": "types",
2619
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
2620
+ "date": "2026-10-14"
2621
+ },
2622
+ {
2623
+ "kind": "doc",
2624
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
2625
+ "date": "2026-10-14"
2626
+ },
2627
+ {
2628
+ "kind": "fixture",
2629
+ "locator": "test/fixtures/hooks/pi/tool_call/nested-mcp-deny.json",
2630
+ "date": "2026-10-14"
2631
+ }
2632
+ ]
2633
+ },
2634
+ {
2635
+ "policy": "stop-check",
2636
+ "harness": "kiro",
2637
+ "event": "stop",
2638
+ "timing": "stop",
2639
+ "profile": "cli-2x-agent",
2640
+ "wired": true,
2641
+ "configSource": "core/harnesses/kiro/agents/doflow.json:50",
2642
+ "harnessVersion": {
2643
+ "tested": "kiro-cli 2.29.1"
2644
+ },
2645
+ "class": "observation",
2646
+ "verification": "verified",
2647
+ "prerequisites": [],
2648
+ "covers": [],
2649
+ "doesNotCover": [],
2650
+ "caveats": [
2651
+ "Kiro CLI 2.x agent stop cannot block session completion"
2652
+ ],
2653
+ "provenance": [
2654
+ {
2655
+ "kind": "doc",
2656
+ "locator": "https://kiro.dev/docs/hooks/types/",
2657
+ "date": "2026-10-14"
2658
+ },
2659
+ {
2660
+ "kind": "fixture",
2661
+ "locator": "test/fixtures/hooks/kiro/stop-check/agent-deny.json",
2662
+ "date": "2026-10-14"
2663
+ }
2664
+ ]
2665
+ },
2666
+ {
2667
+ "policy": "stop-check",
2668
+ "harness": "kiro",
2669
+ "event": "Stop",
2670
+ "timing": "stop",
2671
+ "profile": "cli-v3-agent",
2672
+ "wired": true,
2673
+ "configSource": "core/harnesses/kiro/agents/doflow.json:50",
2674
+ "harnessVersion": {
2675
+ "tested": "kiro-cli 2.29.1"
2676
+ },
2677
+ "class": "unknown",
2678
+ "verification": "unverified",
2679
+ "prerequisites": [],
2680
+ "covers": [],
2681
+ "doesNotCover": [],
2682
+ "caveats": [
2683
+ "Kiro documents AgentStop, not the configured Stop trigger; native trigger equivalence is unresolved",
2684
+ "V3 payload carries no transcript"
2685
+ ],
2686
+ "provenance": [
2687
+ {
2688
+ "kind": "doc",
2689
+ "locator": "https://kiro.dev/docs/hooks/types/",
2690
+ "date": "2026-10-12"
2691
+ },
2692
+ {
2693
+ "kind": "doc",
2694
+ "locator": "core/registry/harnesses.json: Kiro V3 Stop observation; bench/inventory/coverage.json: AgentStop",
2695
+ "date": "2026-10-14"
2696
+ },
2697
+ {
2698
+ "kind": "fixture",
2699
+ "locator": "test/fixtures/hooks/kiro/stop-check/v3-deny.json",
2700
+ "date": "2026-10-14"
2701
+ }
2702
+ ]
2703
+ },
2704
+ {
2705
+ "policy": "pre-implementation-gate",
2706
+ "harness": "pi",
2707
+ "event": "tool_call",
2708
+ "timing": "pre-tool",
2709
+ "profile": "user-interactive",
2710
+ "wired": true,
2711
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
2712
+ "harnessVersion": {
2713
+ "tested": "1.1.0"
2714
+ },
2715
+ "class": "unknown",
2716
+ "verification": "unverified",
2717
+ "prerequisites": [],
2718
+ "covers": [],
2719
+ "doesNotCover": [
2720
+ "writes via shell commands"
2721
+ ],
2722
+ "caveats": [
2723
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
2724
+ "live probe pending"
2725
+ ],
2726
+ "provenance": [
2727
+ {
2728
+ "kind": "types",
2729
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
2730
+ "date": "2026-10-14"
2731
+ },
2732
+ {
2733
+ "kind": "doc",
2734
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
2735
+ "date": "2026-10-14"
2736
+ },
2737
+ {
2738
+ "kind": "fixture",
2739
+ "locator": "test/fixtures/hooks/pi/tool_call/edit-deny.json",
2740
+ "date": "2026-10-14"
2741
+ }
2742
+ ]
2743
+ },
2744
+ {
2745
+ "policy": "pre-bash-guard",
2746
+ "harness": "pi",
2747
+ "event": "tool_call",
2748
+ "timing": "pre-tool",
2749
+ "profile": "user-interactive",
2750
+ "wired": true,
2751
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
2752
+ "harnessVersion": {
2753
+ "tested": "1.1.0"
2754
+ },
2755
+ "class": "unknown",
2756
+ "verification": "unverified",
2757
+ "prerequisites": [],
2758
+ "covers": [],
2759
+ "doesNotCover": [],
2760
+ "caveats": [
2761
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
2762
+ "live probe pending"
2763
+ ],
2764
+ "provenance": [
2765
+ {
2766
+ "kind": "types",
2767
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
2768
+ "date": "2026-10-14"
2769
+ },
2770
+ {
2771
+ "kind": "doc",
2772
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
2773
+ "date": "2026-10-14"
2774
+ },
2775
+ {
2776
+ "kind": "fixture",
2777
+ "locator": "test/fixtures/hooks/pi/tool_call/bash-deny.json",
2778
+ "date": "2026-10-14"
2779
+ }
2780
+ ]
2781
+ },
2782
+ {
2783
+ "policy": "mcp-tool-guard",
2784
+ "harness": "pi",
2785
+ "event": "tool_call",
2786
+ "timing": "pre-tool",
2787
+ "profile": "user-interactive",
2788
+ "wired": true,
2789
+ "configSource": "core/harnesses/pi/extensions/doflow-guard.js:129",
2790
+ "harnessVersion": {
2791
+ "tested": "1.1.0"
2792
+ },
2793
+ "class": "unknown",
2794
+ "verification": "unverified",
2795
+ "prerequisites": [],
2796
+ "covers": [],
2797
+ "doesNotCover": [],
2798
+ "caveats": [
2799
+ "Pi extension has not been exercised in a live session; a later tool_call handler may mutate input after DoFlow allows it",
2800
+ "live probe pending"
2801
+ ],
2802
+ "provenance": [
2803
+ {
2804
+ "kind": "types",
2805
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 dist/core/extensions/types.d.ts:907-958",
2806
+ "date": "2026-10-14"
2807
+ },
2808
+ {
2809
+ "kind": "doc",
2810
+ "locator": "@earendil-works/pi-coding-agent@1.1.0 docs/extensions.md:169",
2811
+ "date": "2026-10-14"
2812
+ },
2813
+ {
2814
+ "kind": "fixture",
2815
+ "locator": "test/fixtures/hooks/pi/tool_call/nested-mcp-deny.json",
2816
+ "date": "2026-10-14"
2817
+ }
2818
+ ]
2819
+ },
2820
+ {
2821
+ "policy": "session-context",
2822
+ "harness": "kiro",
2823
+ "event": "SessionStart",
2824
+ "timing": "session",
2825
+ "profile": "cli-v3-agent",
2826
+ "wired": true,
2827
+ "configSource": "core/harnesses/kiro/agents/doflow.json:42",
2828
+ "harnessVersion": {
2829
+ "tested": "kiro-cli 2.29.1"
2830
+ },
2831
+ "class": "advisory",
2832
+ "verification": "unverified",
2833
+ "prerequisites": [],
2834
+ "covers": [],
2835
+ "doesNotCover": [],
2836
+ "caveats": [
2837
+ "native event enforcement is not yet verified"
2838
+ ],
2839
+ "provenance": [
2840
+ {
2841
+ "kind": "doc",
2842
+ "locator": "https://kiro.dev/docs/hooks/types/",
2843
+ "date": "2026-10-12"
2844
+ }
2845
+ ]
2846
+ }
2847
+ ],
2848
+ "rowsDigest": "sha256:199bb689b2034157ecb3ade2b47b70470a00e567fa27134fc0cf5ef467369768"
2849
+ }
231
2850
  }