failproofai 1.0.7-beta.2 → 1.0.7

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 (252) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +4 -4
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js +4 -4
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page.js +4 -4
  16. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  20. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/audit/run/route.js +7 -8
  25. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  33. package/.next/standalone/.next/server/app/audit/page.js +5 -7
  34. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/index.html +1 -1
  37. package/.next/standalone/.next/server/app/index.rsc +15 -15
  38. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  39. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  40. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  42. package/.next/standalone/.next/server/app/page.js +6 -6
  43. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  46. package/.next/standalone/.next/server/app/policies/page.js +11 -13
  47. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  50. package/.next/standalone/.next/server/app/project/[name]/page.js +7 -8
  51. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  54. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  55. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +7 -7
  56. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  59. package/.next/standalone/.next/server/app/projects/page.js +6 -7
  60. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +8 -41
  63. package/.next/standalone/.next/server/app/settings/page.js +9 -12
  64. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/chunks/{[externals]__1j-zsg5._.js → [externals]__1_bftcl._.js} +1 -1
  67. package/.next/standalone/.next/server/chunks/{[externals]__19_pzeq._.js → [externals]__1msfs-h._.js} +1 -1
  68. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l3yhx4._.js +2 -2
  69. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
  70. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1bf34x4._.js → [root-of-the-server]__1_r2rbg._.js} +7 -5
  71. package/.next/standalone/.next/server/chunks/_09dz7xv._.js +21 -21
  72. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
  73. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
  74. package/.next/standalone/.next/server/chunks/{_1q5i8mb._.js → _1c3k-8x._.js} +2 -2
  75. package/.next/standalone/.next/server/chunks/_1ek68ln._.js +16 -16
  76. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  77. package/.next/standalone/.next/server/chunks/src_hooks_0iu54mz._.js +3 -0
  78. package/.next/standalone/.next/server/chunks/src_hooks_custom-hooks-loader_ts_0lnb3n3._.js +2 -4
  79. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-_ki57._.js +4 -0
  80. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +4 -0
  81. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +4 -0
  82. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +4 -0
  83. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l44ual._.js → [root-of-the-server]__0bd3mje._.js} +2 -2
  84. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cg-bgc._.js +5 -0
  85. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cpu_mj._.js +3 -0
  86. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1mf3zp6._.js → [root-of-the-server]__0cxe_2_._.js} +3 -3
  87. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +4 -0
  88. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +4 -0
  89. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +4 -0
  90. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u3w0ll._.js +22 -0
  91. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17d_ffl._.js +3 -0
  92. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19d9tgz._.js +5 -0
  93. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ctpynv._.js +3 -0
  94. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1jiwfsj._.js +3 -0
  95. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +4 -0
  96. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1phc187._.js +3 -0
  97. package/.next/standalone/.next/server/chunks/ssr/_06imw3p._.js +5 -0
  98. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  99. package/.next/standalone/.next/server/chunks/ssr/{_1w_5l7t._.js → _0h_douw._.js} +1 -1
  100. package/.next/standalone/.next/server/chunks/ssr/{_1mel6y1._.js → _1-i_gzc._.js} +2 -2
  101. package/.next/standalone/.next/server/chunks/ssr/{_1v-jvrv._.js → _166t73i._.js} +1 -1
  102. package/.next/standalone/.next/server/chunks/ssr/{_1q46vxx._.js → _1_qswah._.js} +2 -2
  103. package/.next/standalone/.next/server/chunks/ssr/{_1gb0ifp._.js → _1es2j7i._.js} +5 -5
  104. package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +3 -0
  105. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
  106. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
  107. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
  108. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  109. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
  110. package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +3 -0
  111. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_0w6mzq5._.js → node_modules_next_dist_0drixxt._.js} +4 -4
  112. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1cv9_c4._.js +10 -0
  113. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  114. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +1 -1
  115. package/.next/standalone/.next/server/chunks/ssr/src_hooks_pack-cli_ts_0t7me65._.js +1 -1
  116. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  117. package/.next/standalone/.next/server/pages/404.html +1 -1
  118. package/.next/standalone/.next/server/pages/500.html +1 -1
  119. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/server-reference-manifest.json +23 -56
  121. package/.next/standalone/.next/static/chunks/094xgi4owxaqf.js +1 -0
  122. package/.next/standalone/.next/static/chunks/{129ag2bw93bdh.js → 0__8a7m868fvf.js} +1 -1
  123. package/.next/standalone/.next/static/chunks/{3ugmd_7dyn0id.js → 0o6qlkgubtoex.js} +1 -1
  124. package/.next/standalone/.next/static/chunks/{0fqd7m_u81mi5.js → 13i7-9is-vhys.js} +1 -1
  125. package/.next/standalone/.next/static/chunks/1rz20_pz828f3.js +6 -0
  126. package/.next/standalone/.next/static/chunks/2k9f4tyv04809.css +1 -0
  127. package/.next/standalone/.next/static/chunks/{2_pltstd8-xgs.js → 2klitrtzpaoe0.js} +1 -1
  128. package/.next/standalone/.next/static/chunks/{3brze37td_wnc.js → 2mdh397ghgnvv.js} +1 -1
  129. package/.next/standalone/.next/static/chunks/2rshywgeqsyzk.css +2 -0
  130. package/.next/standalone/.next/static/chunks/3pzx4chkhko9k.js +1 -0
  131. package/.next/standalone/.next/static/chunks/3rh5o7e16irrm.js +69 -0
  132. package/.next/standalone/.next/static/chunks/{1qd741hzlmjbo.js → 43ufqrz8qo3h-.js} +1 -1
  133. package/.next/standalone/SECURITY.md +53 -0
  134. package/.next/standalone/app/actions/pack-actions.ts +0 -12
  135. package/.next/standalone/app/policies/hooks-client.tsx +0 -9
  136. package/.next/standalone/app/settings/page.tsx +1 -20
  137. package/.next/standalone/app/settings/settings-client.tsx +1 -27
  138. package/.next/standalone/app/settings/settings.css +0 -79
  139. package/.next/standalone/package.json +10 -10
  140. package/.next/standalone/sdk/typescript/CHANGELOG.md +15 -1
  141. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +10 -30
  142. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +3 -0
  143. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +4 -16
  144. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +3 -0
  145. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +13 -132
  146. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +4 -0
  147. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +4 -142
  148. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +4 -0
  149. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +1396 -1016
  150. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +9 -0
  151. package/.next/standalone/server.js +1 -1
  152. package/README.md +2 -2
  153. package/bin/failproofai.mjs +2 -115
  154. package/dist/cli.mjs +6543 -13872
  155. package/dist/index.js +1 -19
  156. package/dist/worker.mjs +2022 -8055
  157. package/package.json +10 -10
  158. package/pi-extension/index.ts +0 -11
  159. package/scripts/build-policy-pack.mjs +2 -53
  160. package/src/audit/features.ts +2 -3
  161. package/src/hooks/builtin-policies.ts +8 -177
  162. package/src/hooks/cloud-enrollment-cli.ts +1 -1
  163. package/src/hooks/cloud-managed-policies.ts +0 -22
  164. package/src/hooks/custom-hooks-loader.ts +7 -45
  165. package/src/hooks/custom-hooks-registry.ts +1 -45
  166. package/src/hooks/first-run-gate.ts +0 -5
  167. package/src/hooks/fp-home.ts +0 -23
  168. package/src/hooks/handler.ts +6 -265
  169. package/src/hooks/hook-activity-store.ts +1 -105
  170. package/src/hooks/hook-telemetry.ts +0 -41
  171. package/src/hooks/loader-utils.ts +0 -6
  172. package/src/hooks/manager.ts +1 -1
  173. package/src/hooks/pack-cli.ts +19 -412
  174. package/src/hooks/pack-manifest.ts +7 -479
  175. package/src/hooks/pack-store.ts +11 -157
  176. package/src/hooks/policy-catalog.ts +0 -204
  177. package/src/hooks/policy-evaluator.ts +796 -940
  178. package/src/hooks/policy-registry.ts +0 -25
  179. package/src/hooks/policy-types.ts +0 -126
  180. package/src/hooks/types.ts +1 -1
  181. package/src/hooks/worker-server.ts +26 -119
  182. package/src/index.ts +0 -6
  183. package/.next/standalone/.next/server/chunks/src_hooks_01frwmb._.js +0 -5
  184. package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +0 -3
  185. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01bmjsj._.js +0 -3
  186. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +0 -4
  187. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +0 -4
  188. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__059yza8._.js +0 -3
  189. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0eip4_k._.js +0 -22
  190. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +0 -4
  191. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qcb0mg._.js +0 -3
  192. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qxnccm._.js +0 -5
  193. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +0 -4
  194. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +0 -4
  195. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0soxz2z._.js +0 -3
  196. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yrsbd_._.js +0 -3
  197. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +0 -4
  198. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__13d-wb6._.js +0 -3
  199. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1dinjii._.js +0 -3
  200. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +0 -4
  201. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +0 -4
  202. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qiz0e4._.js +0 -3
  203. package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +0 -3
  204. package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +0 -3
  205. package/.next/standalone/.next/server/chunks/ssr/_0uyu3jf._.js +0 -3
  206. package/.next/standalone/.next/server/chunks/ssr/_1feuvhb._.js +0 -5
  207. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.js +0 -3
  208. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h4._.js +0 -3
  209. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_18_d8l1._.js +0 -151
  210. package/.next/standalone/.next/server/chunks/ssr/src_hooks_095a_79._.js +0 -5
  211. package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +0 -3
  212. package/.next/standalone/.next/server/chunks/ssr/src_hooks_18k8rl0._.js +0 -12
  213. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +0 -3
  214. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +0 -3
  215. package/.next/standalone/.next/static/chunks/043j99m8ykg__.css +0 -2
  216. package/.next/standalone/.next/static/chunks/2c8j9l6j_b1ci.js +0 -1
  217. package/.next/standalone/.next/static/chunks/2qv4hshejedtx.css +0 -1
  218. package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +0 -1
  219. package/.next/standalone/.next/static/chunks/3otmypm6j_xfo.js +0 -6
  220. package/.next/standalone/.next/static/chunks/3yxro_r2_o9ad.js +0 -69
  221. package/.next/standalone/PROBE-FOLLOWUP.md +0 -186
  222. package/.next/standalone/app/actions/get-jev-config.ts +0 -424
  223. package/.next/standalone/app/actions/update-jev-config.ts +0 -420
  224. package/.next/standalone/app/components/jev-notices.tsx +0 -96
  225. package/.next/standalone/app/settings/jev-panel.tsx +0 -473
  226. package/src/hooks/effective-reviewers.ts +0 -79
  227. package/src/hooks/jev-activity.ts +0 -385
  228. package/src/hooks/jev-cli.ts +0 -1249
  229. package/src/hooks/policy-authority.ts +0 -333
  230. package/src/hooks/policy-reviewability.ts +0 -229
  231. package/src/hooks/semantic/combine.ts +0 -541
  232. package/src/hooks/semantic/compile.ts +0 -176
  233. package/src/hooks/semantic/decide.ts +0 -392
  234. package/src/hooks/semantic/envelope.ts +0 -1296
  235. package/src/hooks/semantic/evaluator.ts +0 -547
  236. package/src/hooks/semantic/facts.ts +0 -292
  237. package/src/hooks/semantic/intent.ts +0 -1190
  238. package/src/hooks/semantic/jev-client.ts +0 -643
  239. package/src/hooks/semantic/jev-config.ts +0 -594
  240. package/src/hooks/semantic/jev-review.ts +0 -374
  241. package/src/hooks/semantic/jev-stats.ts +0 -289
  242. package/src/hooks/semantic/jev-throttle.ts +0 -421
  243. package/src/hooks/semantic/pack-policies.ts +0 -251
  244. package/src/hooks/semantic/policies.ts +0 -596
  245. package/src/hooks/semantic/precondition-names.ts +0 -60
  246. package/src/hooks/semantic/preconditions.ts +0 -58
  247. package/src/hooks/semantic/redact.ts +0 -2910
  248. package/src/hooks/semantic/types.ts +0 -145
  249. package/src/hooks/semver-precedence.ts +0 -128
  250. /package/.next/standalone/.next/static/{gbEOjBgZAxF2UIUwZVHNu → PgeWCHmyVbjRznv2VO7KF}/_buildManifest.js +0 -0
  251. /package/.next/standalone/.next/static/{gbEOjBgZAxF2UIUwZVHNu → PgeWCHmyVbjRznv2VO7KF}/_clientMiddlewareManifest.js +0 -0
  252. /package/.next/standalone/.next/static/{gbEOjBgZAxF2UIUwZVHNu → PgeWCHmyVbjRznv2VO7KF}/_ssgManifest.js +0 -0
@@ -25,42 +25,12 @@
25
25
  * - **Absent optionals stay absent.** `beta`, `alwaysOn` and `params` are read
26
26
  * with `in` and `undefined` checks; default-filling them changes behaviour and
27
27
  * fails existing tests.
28
- * - **Every entry states its `authority`,** even though absent already means
29
- * `hard`: whether Jev may clear a builtin's verdict is a decision to make per
30
- * policy, not a default to inherit. `reviewable` only where a semantic policy
31
- * genuinely covers the same concern, named in `reviewedBy`. The table and the
32
- * reasoning are in `docs/policies/authority.mdx`; `alwaysOn` is hard whatever
33
- * it says here.
34
28
  *
35
29
  * `params.default` values are handed to policies BY REFERENCE, so this must stay
36
30
  * one module-level const — never a factory minting fresh defaults per call.
37
31
  */
38
32
  import type { PolicyCatalogEntry, PolicyParamsSchema } from "./policy-types";
39
33
 
40
- /**
41
- * ── On `authority` and `reviewedBy` in this file ──
42
- *
43
- * `reviewable` means Jev may CLEAR this policy's verdict, and only through the
44
- * semantic checks named here — every one of which must have been asked.
45
- *
46
- * Both ways of getting a pairing wrong are silent, and the asymmetry between
47
- * them is what decides these rows:
48
- *
49
- * - a check that is never ASKED never clears, so the block becomes permanent
50
- * - a check that is asked and does not FIRE answers "no concern", and no
51
- * concern CLEARS — so naming a check that does not model this policy's
52
- * shapes does not review the policy, it switches it off for exactly the
53
- * inputs that check does not understand
54
- *
55
- * And an `instruct`-mode check can never answer deny. So the test is not "can
56
- * the named reviewer keep this block" but "is there anything left that can
57
- * deny": a deny-mode name in the conjunction, or a deny-mode check covering the
58
- * same concern independently, or a policy that never denied in the first place.
59
- * `block-work-on-main` fails all three and is hard for that reason.
60
- *
61
- * Each row's own comment says which of those applies. The reasoning was worked
62
- * out policy by policy in FailproofAI/jev-policies' DECISIONS.md.
63
- */
64
34
  export const POLICY_CATALOG: PolicyCatalogEntry[] = [
65
35
  {
66
36
  name: "sanitize-jwt",
@@ -68,7 +38,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
68
38
  displayTitle: "Redacted JWT tokens from tool output",
69
39
  impact: "Stops the agent from echoing auth tokens it saw in command output.",
70
40
  match: { events: ["PostToolUse"] },
71
- authority: "hard",
72
41
  defaultEnabled: true,
73
42
  category: "Sanitize",
74
43
  },
@@ -78,7 +47,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
78
47
  displayTitle: "Redacted API keys from tool output",
79
48
  impact: "Catches OpenAI / Anthropic / GitHub / AWS / Stripe / Google keys before the model sees them.",
80
49
  match: { events: ["PostToolUse"] },
81
- authority: "hard",
82
50
  defaultEnabled: true,
83
51
  category: "Sanitize",
84
52
  params: {
@@ -95,7 +63,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
95
63
  displayTitle: "Redacted database connection strings from tool output",
96
64
  impact: "Strips embedded DB credentials before they reach the model context.",
97
65
  match: { events: ["PostToolUse"] },
98
- authority: "hard",
99
66
  defaultEnabled: true,
100
67
  category: "Sanitize",
101
68
  },
@@ -105,7 +72,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
105
72
  displayTitle: "Redacted PEM private keys from tool output",
106
73
  impact: "Prevents private key bodies from being echoed into chat context.",
107
74
  match: { events: ["PostToolUse"] },
108
- authority: "hard",
109
75
  defaultEnabled: true,
110
76
  category: "Sanitize",
111
77
  },
@@ -115,7 +81,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
115
81
  impact: "Strips Authorization: Bearer values before they hit the model.",
116
82
  description: "Stop Claude from reading Authorization Bearer tokens in tool responses",
117
83
  match: { events: ["PostToolUse"] },
118
- authority: "hard",
119
84
  defaultEnabled: true,
120
85
  category: "Sanitize",
121
86
  },
@@ -125,8 +90,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
125
90
  impact: "Env vars often contain secrets; blocking `env` / `printenv` keeps them out of the model context.",
126
91
  description: "Prevent commands that read environment variables",
127
92
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
128
- authority: "reviewable",
129
- reviewedBy: ["env-secrets-dump", "secret-exposure"],
130
93
  defaultEnabled: true,
131
94
  category: "Environment",
132
95
  },
@@ -136,8 +99,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
136
99
  impact: "`.env` files routinely contain API keys and DB credentials.",
137
100
  description: "Block reading/writing .env files",
138
101
  match: { events: ["PreToolUse"] },
139
- authority: "reviewable",
140
- reviewedBy: ["secret-exposure"],
141
102
  defaultEnabled: true,
142
103
  category: "Environment",
143
104
  },
@@ -147,8 +108,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
147
108
  impact: "Stops the agent from peeking at neighboring repos or your home directory.",
148
109
  description: "Block file reads outside the session working directory",
149
110
  match: { events: ["PreToolUse"], toolNames: ["Read", "Glob", "Grep", "Bash"] },
150
- authority: "reviewable",
151
- reviewedBy: ["read-outside-workspace"],
152
111
  defaultEnabled: false,
153
112
  category: "Environment",
154
113
  params: {
@@ -167,18 +126,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
167
126
  // PermissionRequest is Codex's escalation-approval event; fire the same
168
127
  // sudo guard there so Codex sandbox bypasses are blocked too.
169
128
  match: { events: ["PreToolUse", "PermissionRequest"], toolNames: ["Bash"] },
170
- // Hard, although `privilege-escalation` is deny-mode and its probe is a strict superset
171
- // of this matcher — so the pairing would pass the "is there anything left that can
172
- // deny" test. The reason it stays hard is the OTHER clearing path: that check is
173
- // `userCanOverride: true`, so a human naming the operation clears it, and this policy
174
- // is `defaultEnabled: true`. Reviewable would therefore turn "sudo is blocked" into
175
- // "sudo is blocked unless you asked for it" on every machine with Jev configured.
176
- // Measured against what that buys: the false-block reduction on the labelled corpus
177
- // came from `block-read-outside-cwd`, `protect-env-vars` and `block-env-files`, which
178
- // were already reviewable. Sudo contributed nothing to it, so the trade is a headline
179
- // guarantee for no measured gain. The nine opt-in policies that ARE reviewable here
180
- // reach only people who switched them on deliberately.
181
- authority: "hard",
182
129
  defaultEnabled: true,
183
130
  category: "Dangerous Commands",
184
131
  params: {
@@ -195,13 +142,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
195
142
  impact: "`curl ... | sh` runs unverified remote code on your machine.",
196
143
  description: "Block piping downloads to shell",
197
144
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
198
- // Hard, for the same reason as `block-sudo` above: the `remote-code-execution` pairing is
199
- // sound, but the check is overridable by an explicit request and this policy is on by
200
- // default, so reviewable would mean "piping a download to a shell is blocked unless you
201
- // asked for it". The substring false positive it has — `grep -rn "curl x | sh"` is
202
- // denied — is real and is the argument for pairing it; it is also rare enough not to
203
- // pay for weakening the default.
204
- authority: "hard",
205
145
  defaultEnabled: true,
206
146
  category: "Dangerous Commands",
207
147
  },
@@ -211,13 +151,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
211
151
  impact: "Catches catastrophic `rm -rf /` and Windows equivalents.",
212
152
  description: "Prevent catastrophic deletions",
213
153
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
214
- // Reviewable: `destructive-deletion` is deny-mode, and its second probe is this
215
- // policy's path-depth heuristic done properly — `irreplaceable`'s false criteria
216
- // (build output, dist/, caches, node_modules, virtualenvs, coverage, temp files) is
217
- // exactly this heuristic's error term. `rm -rf /` keeps both probes true and stays
218
- // denied; `rm -rf node_modules` is the false block this pairing exists to remove.
219
- authority: "reviewable",
220
- reviewedBy: ["destructive-deletion"],
221
154
  defaultEnabled: false,
222
155
  category: "Dangerous Commands",
223
156
  params: {
@@ -247,7 +180,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
247
180
  },
248
181
  defaultEnabled: true,
249
182
  alwaysOn: true,
250
- authority: "hard",
251
183
  category: "Dangerous Commands",
252
184
  },
253
185
  {
@@ -256,12 +188,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
256
188
  impact: "kubectl can change live cluster state — gated unless allow-listed.",
257
189
  description: "Block kubectl commands (Kubernetes cluster mutations)",
258
190
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
259
- // Reviewable: `production-infra-change` is deny-mode and names kubectl explicitly. This
260
- // policy denies the whole CLI, read-only subcommands included; the probe's false
261
- // criteria is the split a regex cannot make — get, list, describe, logs, status,
262
- // plan, diff, validate, whoami, --dry-run.
263
- authority: "reviewable",
264
- reviewedBy: ["production-infra-change"],
265
191
  defaultEnabled: false,
266
192
  category: "Infra Commands",
267
193
  params: {
@@ -278,10 +204,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
278
204
  impact: "Terraform mutates real infrastructure — gated unless allow-listed.",
279
205
  description: "Block terraform and tofu (OpenTofu) commands",
280
206
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
281
- // Reviewable: same pairing as `block-kubectl`; the probe names terraform and tofu, and
282
- // clears `terraform plan` and `terraform validate`.
283
- authority: "reviewable",
284
- reviewedBy: ["production-infra-change"],
285
207
  defaultEnabled: false,
286
208
  category: "Infra Commands",
287
209
  params: {
@@ -298,10 +220,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
298
220
  impact: "AWS CLI can spend money or break prod — gated.",
299
221
  description: "Block aws CLI commands",
300
222
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
301
- // Reviewable: same pairing; the probe names aws, and clears `aws sts
302
- // get-caller-identity` and `aws s3 ls`.
303
- authority: "reviewable",
304
- reviewedBy: ["production-infra-change"],
305
223
  defaultEnabled: false,
306
224
  category: "Infra Commands",
307
225
  params: {
@@ -318,10 +236,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
318
236
  impact: "gcloud can spend money or break prod — gated.",
319
237
  description: "Block gcloud (Google Cloud) CLI commands",
320
238
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
321
- // Reviewable: same pairing; the probe names gcloud, and clears `gcloud auth list` and
322
- // `gcloud config list`.
323
- authority: "reviewable",
324
- reviewedBy: ["production-infra-change"],
325
239
  defaultEnabled: false,
326
240
  category: "Infra Commands",
327
241
  params: {
@@ -338,9 +252,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
338
252
  impact: "az can spend money or break prod — gated.",
339
253
  description: "Block az (Azure) CLI commands",
340
254
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
341
- // Reviewable: same pairing; the probe names az, and clears `az account show`.
342
- authority: "reviewable",
343
- reviewedBy: ["production-infra-change"],
344
255
  defaultEnabled: false,
345
256
  category: "Infra Commands",
346
257
  params: {
@@ -357,10 +268,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
357
268
  impact: "Helm releases mutate cluster state — gated.",
358
269
  description: "Block helm commands",
359
270
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
360
- // Reviewable: same pairing; the probe names helm, and clears `helm list` and
361
- // `helm status`.
362
- authority: "reviewable",
363
- reviewedBy: ["production-infra-change"],
364
271
  defaultEnabled: false,
365
272
  category: "Infra Commands",
366
273
  params: {
@@ -377,7 +284,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
377
284
  impact: "Catches `gh workflow run`, `gh pr merge`, `gh secret set`, etc.",
378
285
  description: "Block gh CLI pipeline-trigger subcommands (workflow run, run rerun/cancel, pr merge, release create/delete, cache delete, secret set/delete)",
379
286
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
380
- authority: "hard",
381
287
  defaultEnabled: false,
382
288
  category: "Infra Commands",
383
289
  params: {
@@ -394,13 +300,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
394
300
  impact: "Stops the agent from creating `.pem`, `id_rsa`, `credentials.json`, etc.",
395
301
  description: "Block writing secret key files",
396
302
  match: { events: ["PreToolUse"], toolNames: ["Write"] },
397
- // Reviewable: `secret-exposure` is deny-mode and `write` is in its `appliesTo`, so a
398
- // real private key still comes back deny. What clears is this matcher's substring
399
- // problem — `/credentials/` and `id_rsa` unanchored against a whole path, which
400
- // catches `src/auth/credentials.ts`. `credential-exfiltration` would have been a
401
- // dead name here: it applies to shell and network, and a file write is neither.
402
- authority: "reviewable",
403
- reviewedBy: ["secret-exposure"],
404
303
  defaultEnabled: false,
405
304
  category: "Dangerous Commands",
406
305
  params: {
@@ -417,7 +316,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
417
316
  impact: "Direct pushes to a protected branch bypass review.",
418
317
  description: "Block pushing to main/master",
419
318
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
420
- authority: "hard",
421
319
  defaultEnabled: true,
422
320
  category: "Git",
423
321
  params: {
@@ -434,13 +332,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
434
332
  impact: "Force-pushes rewrite history and can clobber teammates' work.",
435
333
  description: "Prevent force-pushing to any branch",
436
334
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
437
- // Reviewable: `git-history-rewrite` is deny-mode and its probe is a superset of this
438
- // matcher — it counts `--force-with-lease` (which `isForcePushFlag` deliberately
439
- // treats as safe), a `+refspec`, and a remote-branch delete, and says `git -C dir`
440
- // and an absolute binary path change nothing. A real force-push stays blocked; what
441
- // clears is the user asking to force-push their own branch.
442
- authority: "reviewable",
443
- reviewedBy: ["git-history-rewrite"],
444
335
  defaultEnabled: false,
445
336
  category: "Git",
446
337
  },
@@ -450,21 +341,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
450
341
  impact: "Work should land via PR — direct commits skip review.",
451
342
  description: "Block git commits and merges on main/master branch",
452
343
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
453
- // Hard, although `commit-on-protected-branch` covers exactly this concern.
454
- // That check is `mode: "instruct"`, and an instruct-mode reviewer can never
455
- // answer deny — so the conjunction had one reachable outcome, cleared, and
456
- // marking this reviewable did not hand the decision to Jev. It switched the
457
- // policy off on every machine that configured Jev, while the mark said
458
- // otherwise.
459
- //
460
- // The test that matters is not "can the reviewer keep this block" but "is
461
- // there anything left that can deny". `block-read-outside-cwd` also has only
462
- // an instruct reviewer and stays reviewable, because when it clears,
463
- // `secret-exposure` and `credential-exfiltration` are still asked about the
464
- // same read and still deny on their own through the most-severe merge. Here
465
- // nothing else covers committing on a protected branch, so a clear leaves
466
- // the concern unenforced by anything.
467
- authority: "hard",
468
344
  defaultEnabled: false,
469
345
  category: "Git",
470
346
  params: {
@@ -481,8 +357,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
481
357
  impact: "Amending after a push rewrites history that others may have pulled.",
482
358
  description: "Warns before amending git commits, which rewrites history",
483
359
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
484
- authority: "reviewable",
485
- reviewedBy: ["git-history-rewrite"],
486
360
  defaultEnabled: false,
487
361
  category: "Git",
488
362
  },
@@ -492,70 +366,8 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
492
366
  impact: "Stash deletions are permanent and silent.",
493
367
  description: "Warns before permanently deleting stashed changes",
494
368
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
495
- authority: "hard",
496
- defaultEnabled: false,
497
- category: "Git",
498
- },
499
- {
500
- name: "warn-git-clean",
501
- displayTitle: "Tried to delete untracked or ignored files with git clean",
502
- impact: "`git clean -fdx` takes `.env`, local config and unstaged work — git never had a copy of any of it.",
503
- description: "Warns before git clean deletes untracked directories (-d) or ignored files (-x / -X)",
504
- match: { events: ["PreToolUse"], toolNames: ["Bash"] },
505
- // Hard, and deliberately NOT `reviewable` through `destructive-deletion`,
506
- // although that check is the one whose whole subject is deleting data that
507
- // cannot be regenerated.
508
- //
509
- // Measured on a real machine, through the real hook, with a Jev config
510
- // present, on `git clean -fdx`:
511
- //
512
- // jev: ok decision=allow applied=two-tier 495ms
513
- // probes: destructive-deletion.destroys=0.94 beyond_task=0.79 task_step=0.78
514
- //
515
- // `destroys` came back 0.94 — the check sees the destruction; its own
516
- // instructions name `git clean -fdx` by example. The policy still did not
517
- // fire, because evidence is the MIN over a policy's probes and the partner
518
- // probe `irreplaceable` came back low (it is absent from the probe line,
519
- // which lists only what answered above the display floor). That is not a
520
- // tuning accident: `git clean` carries NO path operand, so `facts.paths` is
521
- // empty (measured — `extractPaths` skips `clean` as not path-like and
522
- // `-fdx` as a flag), while `irreplaceable` is written to read
523
- // `facts.paths[].relation` and to answer false for "only regenerable data
524
- // inside the project: build output, dist/, caches, node_modules, …". With
525
- // nothing to point at, the false branch is the honest answer to the
526
- // question as written.
527
- //
528
- // A named check that is asked and does not fire answers "no concern", and
529
- // that CLEARS (`combine.ts`, "A warning-level answer clears the deny"). So
530
- // pairing this policy with `destructive-deletion` would not hand the
531
- // decision to Jev — it would switch the policy off on every machine that
532
- // configured Jev, which is exactly the `block-work-on-main` mistake. The
533
- // test is "is there anything left that can DENY", and no other deny-mode
534
- // semantic check covers untracked-file deletion, so a clear would leave the
535
- // concern enforced by nothing. Hard until the probe is recalibrated against
536
- // the corpus; the proposed wording and why it needs a replay are in
537
- // `PROBE-FOLLOWUP.md`.
538
- authority: "hard",
539
- // Off by default, and `instruct` rather than `deny`, because `git clean
540
- // -fdx` is a command developers run on purpose and often — it is the
541
- // standard way to get a genuinely clean tree before a build. A default-on
542
- // deny would fire on ordinary work, and a guard people switch off protects
543
- // nothing; every policy in this category except `block-push-master` is
544
- // default-off for the same reason, and `block-read-outside-cwd` was
545
- // demoted out of the audit's archetype signal for being exactly this kind
546
- // of ambient. What IS worth saying every time it is enabled is that the
547
- // blast radius is wider than the operator usually means, so the policy
548
- // warns and names what goes.
549
369
  defaultEnabled: false,
550
370
  category: "Git",
551
- params: {
552
- destructiveFlags: {
553
- type: "string[]",
554
- description:
555
- "git clean flag letters that make it worth warning about, checked alongside --force. Narrow to ['x','X'] to allow `git clean -fd`, or widen with 'f' to warn on a bare `git clean -f`.",
556
- default: ["d", "x", "X"],
557
- },
558
- } satisfies PolicyParamsSchema,
559
371
  },
560
372
  {
561
373
  name: "warn-all-files-staged",
@@ -563,7 +375,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
563
375
  impact: "Wide stages routinely catch generated files or secrets you didn't intend to commit.",
564
376
  description: "Warns before staging all working tree files with git add -A / . / --all",
565
377
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
566
- authority: "hard",
567
378
  defaultEnabled: false,
568
379
  category: "Git",
569
380
  },
@@ -573,8 +384,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
573
384
  impact: "Easy way to wipe a table by accident.",
574
385
  description: "Warn before executing destructive SQL (DROP/TRUNCATE/DELETE without WHERE) via database clients",
575
386
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
576
- authority: "reviewable",
577
- reviewedBy: ["database-destruction"],
578
387
  defaultEnabled: false,
579
388
  category: "Database",
580
389
  },
@@ -584,7 +393,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
584
393
  impact: "ALTER TABLE operations can lock tables and break readers.",
585
394
  description: "Warns before SQL schema changes (ALTER TABLE with column or rename operations)",
586
395
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
587
- authority: "hard",
588
396
  defaultEnabled: false,
589
397
  category: "Database",
590
398
  },
@@ -594,7 +402,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
594
402
  impact: "Publishes are irreversible — `npm publish` / `cargo publish` shouldn't happen without intent.",
595
403
  description: "Warn before publishing packages to public registries (npm, PyPI, crates.io, RubyGems, etc.)",
596
404
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
597
- authority: "hard",
598
405
  defaultEnabled: false,
599
406
  category: "Packages & System",
600
407
  },
@@ -604,8 +411,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
604
411
  impact: "`npm i -g`, `cargo install`, `pip --user` pollute your machine outside the project.",
605
412
  description: "Warns before installing packages globally (npm -g, cargo install, etc.)",
606
413
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
607
- authority: "reviewable",
608
- reviewedBy: ["system-modification"],
609
414
  defaultEnabled: false,
610
415
  category: "Packages & System",
611
416
  },
@@ -615,7 +420,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
615
420
  impact: "Mixing package managers creates lockfile churn for your team.",
616
421
  description: "Blocks non-preferred package managers and tells Claude to use an allowed one (e.g., uv instead of pip)",
617
422
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
618
- authority: "hard",
619
423
  defaultEnabled: false,
620
424
  category: "Packages & System",
621
425
  params: {
@@ -637,7 +441,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
637
441
  impact: "Catches accidentally large file writes (logs, binaries, model dumps).",
638
442
  description: "Warn before writing files larger than 1MB (configurable via thresholdKb param)",
639
443
  match: { events: ["PreToolUse"], toolNames: ["Write"] },
640
- authority: "hard",
641
444
  defaultEnabled: false,
642
445
  category: "Packages & System",
643
446
  params: {
@@ -654,7 +457,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
654
457
  impact: "Catches `nohup` / `&` / `screen` / `tmux` / `disown` patterns that the agent often forgets to clean up.",
655
458
  description: "Warns before starting detached or background processes",
656
459
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
657
- authority: "hard",
658
460
  defaultEnabled: false,
659
461
  category: "Packages & System",
660
462
  },
@@ -664,7 +466,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
664
466
  impact: "Usually a sign of a stuck loop burning tokens.",
665
467
  description: "Warn when the same tool is called 3+ times with identical parameters",
666
468
  match: { events: ["PreToolUse"] },
667
- authority: "hard",
668
469
  defaultEnabled: false,
669
470
  category: "AI Behavior",
670
471
  },
@@ -674,7 +475,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
674
475
  impact: "Work not in a commit is invisible to teammates and easy to lose.",
675
476
  description: "Require all changes to be committed before Claude stops",
676
477
  match: { events: ["Stop"] },
677
- authority: "hard",
678
478
  defaultEnabled: false,
679
479
  category: "Workflow",
680
480
  },
@@ -684,7 +484,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
684
484
  impact: "Local-only commits won't trigger CI or be reviewable.",
685
485
  description: "Require all commits to be pushed to remote before Claude stops",
686
486
  match: { events: ["Stop"] },
687
- authority: "hard",
688
487
  defaultEnabled: false,
689
488
  category: "Workflow",
690
489
  params: {
@@ -706,7 +505,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
706
505
  impact: "Branches without PRs don't get reviewed.",
707
506
  description: "Require a pull request to exist for the current branch before Claude stops",
708
507
  match: { events: ["Stop"] },
709
- authority: "hard",
710
508
  defaultEnabled: false,
711
509
  category: "Workflow",
712
510
  params: {
@@ -723,7 +521,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
723
521
  impact: "Conflicting branches can't merge — surface them early.",
724
522
  description: "Require the current branch to merge cleanly with the base branch before Claude stops",
725
523
  match: { events: ["Stop"] },
726
- authority: "hard",
727
524
  defaultEnabled: false,
728
525
  category: "Workflow",
729
526
  params: {
@@ -740,7 +537,6 @@ export const POLICY_CATALOG: PolicyCatalogEntry[] = [
740
537
  impact: "Failing CI blocks deploy.",
741
538
  description: "Require CI checks to pass on the current HEAD commit before Claude stops (ignores stale runs on prior commits)",
742
539
  match: { events: ["Stop"] },
743
- authority: "hard",
744
540
  defaultEnabled: false,
745
541
  category: "Workflow",
746
542
  },