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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +4 -4
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js +4 -4
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +4 -4
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +7 -8
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js +5 -7
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +6 -6
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
- package/.next/standalone/.next/server/app/policies/page.js +11 -13
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +7 -8
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +7 -7
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +6 -7
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +8 -41
- package/.next/standalone/.next/server/app/settings/page.js +9 -12
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__1j-zsg5._.js → [externals]__1_bftcl._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__19_pzeq._.js → [externals]__1msfs-h._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l3yhx4._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1bf34x4._.js → [root-of-the-server]__1_r2rbg._.js} +7 -5
- package/.next/standalone/.next/server/chunks/_09dz7xv._.js +21 -21
- package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
- package/.next/standalone/.next/server/chunks/{_1q5i8mb._.js → _1c3k-8x._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_1ek68ln._.js +16 -16
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_0iu54mz._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_hooks_custom-hooks-loader_ts_0lnb3n3._.js +2 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-_ki57._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l44ual._.js → [root-of-the-server]__0bd3mje._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cg-bgc._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cpu_mj._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1mf3zp6._.js → [root-of-the-server]__0cxe_2_._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u3w0ll._.js +22 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17d_ffl._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19d9tgz._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ctpynv._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1jiwfsj._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1phc187._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_06imw3p._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1w_5l7t._.js → _0h_douw._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1mel6y1._.js → _1-i_gzc._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_1v-jvrv._.js → _166t73i._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1q46vxx._.js → _1_qswah._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_1gb0ifp._.js → _1es2j7i._.js} +5 -5
- package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_0w6mzq5._.js → node_modules_next_dist_0drixxt._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1cv9_c4._.js +10 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_pack-cli_ts_0t7me65._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +23 -56
- package/.next/standalone/.next/static/chunks/094xgi4owxaqf.js +1 -0
- package/.next/standalone/.next/static/chunks/{129ag2bw93bdh.js → 0__8a7m868fvf.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3ugmd_7dyn0id.js → 0o6qlkgubtoex.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0fqd7m_u81mi5.js → 13i7-9is-vhys.js} +1 -1
- package/.next/standalone/.next/static/chunks/1rz20_pz828f3.js +6 -0
- package/.next/standalone/.next/static/chunks/2k9f4tyv04809.css +1 -0
- package/.next/standalone/.next/static/chunks/{2_pltstd8-xgs.js → 2klitrtzpaoe0.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3brze37td_wnc.js → 2mdh397ghgnvv.js} +1 -1
- package/.next/standalone/.next/static/chunks/2rshywgeqsyzk.css +2 -0
- package/.next/standalone/.next/static/chunks/3pzx4chkhko9k.js +1 -0
- package/.next/standalone/.next/static/chunks/3rh5o7e16irrm.js +69 -0
- package/.next/standalone/.next/static/chunks/{1qd741hzlmjbo.js → 43ufqrz8qo3h-.js} +1 -1
- package/.next/standalone/SECURITY.md +53 -0
- package/.next/standalone/app/actions/pack-actions.ts +0 -12
- package/.next/standalone/app/policies/hooks-client.tsx +0 -9
- package/.next/standalone/app/settings/page.tsx +1 -20
- package/.next/standalone/app/settings/settings-client.tsx +1 -27
- package/.next/standalone/app/settings/settings.css +0 -79
- package/.next/standalone/package.json +10 -10
- package/.next/standalone/sdk/typescript/CHANGELOG.md +15 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +10 -30
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +3 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +4 -16
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +3 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +13 -132
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +4 -142
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +1396 -1016
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +9 -0
- package/.next/standalone/server.js +1 -1
- package/README.md +2 -2
- package/bin/failproofai.mjs +2 -115
- package/dist/cli.mjs +6543 -13872
- package/dist/index.js +1 -19
- package/dist/worker.mjs +2022 -8055
- package/package.json +10 -10
- package/pi-extension/index.ts +0 -11
- package/scripts/build-policy-pack.mjs +2 -53
- package/src/audit/features.ts +2 -3
- package/src/hooks/builtin-policies.ts +8 -177
- package/src/hooks/cloud-enrollment-cli.ts +1 -1
- package/src/hooks/cloud-managed-policies.ts +0 -22
- package/src/hooks/custom-hooks-loader.ts +7 -45
- package/src/hooks/custom-hooks-registry.ts +1 -45
- package/src/hooks/first-run-gate.ts +0 -5
- package/src/hooks/fp-home.ts +0 -23
- package/src/hooks/handler.ts +6 -265
- package/src/hooks/hook-activity-store.ts +1 -105
- package/src/hooks/hook-telemetry.ts +0 -41
- package/src/hooks/loader-utils.ts +0 -6
- package/src/hooks/manager.ts +1 -1
- package/src/hooks/pack-cli.ts +19 -412
- package/src/hooks/pack-manifest.ts +7 -479
- package/src/hooks/pack-store.ts +11 -157
- package/src/hooks/policy-catalog.ts +0 -204
- package/src/hooks/policy-evaluator.ts +796 -940
- package/src/hooks/policy-registry.ts +0 -25
- package/src/hooks/policy-types.ts +0 -126
- package/src/hooks/types.ts +1 -1
- package/src/hooks/worker-server.ts +26 -119
- package/src/index.ts +0 -6
- package/.next/standalone/.next/server/chunks/src_hooks_01frwmb._.js +0 -5
- package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01bmjsj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__059yza8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0eip4_k._.js +0 -22
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qcb0mg._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qxnccm._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0soxz2z._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yrsbd_._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__13d-wb6._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1dinjii._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qiz0e4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0uyu3jf._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1feuvhb._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_18_d8l1._.js +0 -151
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_095a_79._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_18k8rl0._.js +0 -12
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +0 -3
- package/.next/standalone/.next/static/chunks/043j99m8ykg__.css +0 -2
- package/.next/standalone/.next/static/chunks/2c8j9l6j_b1ci.js +0 -1
- package/.next/standalone/.next/static/chunks/2qv4hshejedtx.css +0 -1
- package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +0 -1
- package/.next/standalone/.next/static/chunks/3otmypm6j_xfo.js +0 -6
- package/.next/standalone/.next/static/chunks/3yxro_r2_o9ad.js +0 -69
- package/.next/standalone/PROBE-FOLLOWUP.md +0 -186
- package/.next/standalone/app/actions/get-jev-config.ts +0 -424
- package/.next/standalone/app/actions/update-jev-config.ts +0 -420
- package/.next/standalone/app/components/jev-notices.tsx +0 -96
- package/.next/standalone/app/settings/jev-panel.tsx +0 -473
- package/src/hooks/effective-reviewers.ts +0 -79
- package/src/hooks/jev-activity.ts +0 -385
- package/src/hooks/jev-cli.ts +0 -1249
- package/src/hooks/policy-authority.ts +0 -333
- package/src/hooks/policy-reviewability.ts +0 -229
- package/src/hooks/semantic/combine.ts +0 -541
- package/src/hooks/semantic/compile.ts +0 -176
- package/src/hooks/semantic/decide.ts +0 -392
- package/src/hooks/semantic/envelope.ts +0 -1296
- package/src/hooks/semantic/evaluator.ts +0 -547
- package/src/hooks/semantic/facts.ts +0 -292
- package/src/hooks/semantic/intent.ts +0 -1190
- package/src/hooks/semantic/jev-client.ts +0 -643
- package/src/hooks/semantic/jev-config.ts +0 -594
- package/src/hooks/semantic/jev-review.ts +0 -374
- package/src/hooks/semantic/jev-stats.ts +0 -289
- package/src/hooks/semantic/jev-throttle.ts +0 -421
- package/src/hooks/semantic/pack-policies.ts +0 -251
- package/src/hooks/semantic/policies.ts +0 -596
- package/src/hooks/semantic/precondition-names.ts +0 -60
- package/src/hooks/semantic/preconditions.ts +0 -58
- package/src/hooks/semantic/redact.ts +0 -2910
- package/src/hooks/semantic/types.ts +0 -145
- package/src/hooks/semver-precedence.ts +0 -128
- /package/.next/standalone/.next/static/{gbEOjBgZAxF2UIUwZVHNu → PgeWCHmyVbjRznv2VO7KF}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{gbEOjBgZAxF2UIUwZVHNu → PgeWCHmyVbjRznv2VO7KF}/_clientMiddlewareManifest.js +0 -0
- /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
|
},
|