failproofai 0.0.11-beta.2 → 0.0.11-beta.3
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/app-path-routes-manifest.json +8 -1
- package/.next/standalone/.next/build-manifest.json +10 -10
- package/.next/standalone/.next/prerender-manifest.json +3 -32
- package/.next/standalone/.next/required-server-files.json +2 -1
- package/.next/standalone/.next/routes-manifest.json +45 -3
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +7 -7
- 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 +6 -6
- 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 +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +2 -6
- 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 +12 -13
- 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 +16 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/run/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/run/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js +8 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/run/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js +6 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +3 -3
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/audit/page/build-manifest.json +18 -0
- package/.next/standalone/.next/server/app/audit/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/audit/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +29 -0
- package/.next/standalone/.next/server/app/audit/page.js +17 -0
- package/.next/standalone/.next/server/app/audit/page.js.map +5 -0
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -17
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -17
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -3
- package/.next/standalone/.next/server/app/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +14 -15
- 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/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/policies/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js +16 -16
- 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/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/project/[name]/page/next-font-manifest.json +2 -6
- 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 +16 -17
- 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/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/next-font-manifest.json +2 -6
- 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 +19 -20
- 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/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/projects/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +15 -16
- 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-paths-manifest.json +8 -1
- package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[externals]__0z0j--b._.js → [externals]__1nl3dvw._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__0-p9.k~._.js → [externals]__1s61mel._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]_node_os_06ur78j._.js → [externals]_node_os_0by37l-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07tgnzi._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0kjo7d_._.js → [root-of-the-server]__0_0xu5z._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z-180.._.js → [root-of-the-server]__0cycwg6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__08px0ym._.js → [root-of-the-server]__0f7mikp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oeun7z._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0g48iv.._.js → [root-of-the-server]__0sb_5m8._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js → [root-of-the-server]__0xuaoik._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12pit4m._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13ra2jq._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0d_ob4n._.js → [root-of-the-server]__1_mqemn._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1b9z5-i._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vlhtkc._.js → [root-of-the-server]__1hgv_75._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ixjiy8._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wu7fr7._.js → [root-of-the-server]__1jm9fw6._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0fwb7ao._.js → [root-of-the-server]__1m2_4t0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0yfq1yr._.js → [root-of-the-server]__1mhmdzs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0zso~62._.js → [root-of-the-server]__1ou2ehh._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0.~nmr9._.js → [root-of-the-server]__1w9zl9-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0ebx_lc._.js → _0p53ge1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_1-1804f._.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_run_route_actions_1qgp9io.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_status_route_actions_1f7pjof.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-request_route_actions_1c49co0.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-verify_route_actions_1r3slzk.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0regwyr.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_status_route_actions_1aho9zu.js +3 -0
- package/.next/standalone/.next/server/chunks/{_next-internal_server_app_api_download_[project]_[session]_route_actions_0wb00i-.js → _next-internal_server_app_api_download_[project]_[session]_route_actions_1is7vs7.js} +1 -1
- package/.next/standalone/.next/server/chunks/{lib_logger_ts_047tt9f._.js → lib_logger_ts_07e65t5._.js} +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +23 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +3 -0
- package/.next/standalone/.next/server/chunks/{package_json_[json]_cjs_0z7w.hh._.js → package_json_[json]_cjs_1nxcc4v._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[externals]__12dv.x0._.js → [externals]__1_g_b3t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[externals]_node_async_hooks_0v0ln8c._.js → [externals]_node_async_hooks_1gjz99j._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00jkjmt._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013du6r._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0989_dx._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e85wxv._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gfxvb1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l13qf2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ts150~._.js → [root-of-the-server]__0ywoypf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-scthx._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__100hdar._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1cd25c7._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t5l7a5._.js → [root-of-the-server]__1d8omgc._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0tcyn68._.js → [root-of-the-server]__1dky4g0._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__1fax1sl._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1hlrq6y._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ihxdo5._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +221 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0-wn51s._.js → [root-of-the-server]__1pcxxwg._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1usf8v2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1vvfde2._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_03d7qyt._.js → _05whahf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0xb8ngh._.js → _1kje4fm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0zx~s__._.js → _1p0-leb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_04qfs8z._.js → app_087bt9w._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_0uosk1e._.js → app_1fvisnp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_13f0ohr._.js → app_209u41o._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +43 -0
- package/.next/standalone/.next/server/chunks/ssr/app_audit_loading_tsx_1j1kc6j._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_error_tsx_11t4ysq._.js → app_error_tsx_1zds1ns._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_global-error_tsx_0m9qisk._.js → app_global-error_tsx_113y3za._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +8 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_error_tsx_0.9-fod._.js → app_project_[name]_error_tsx_1v02_5n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_loading_tsx_03g9xy0._.js → app_project_[name]_loading_tsx_05-l4uf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_error_tsx_0ler-mr._.js → app_project_[name]_session_[sessionId]_error_tsx_0-lj3nd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_loading_tsx_0c0e3yx._.js → app_project_[name]_session_[sessionId]_loading_tsx_0l4aixs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_20-3u8b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{lib_codex-projects_ts_0eosib~._.js → lib_codex-projects_ts_0pqlw37._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_copilot-projects_ts_0r8xkn8._.js → lib_copilot-projects_ts_19wl7tp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_cursor-projects_ts_0qt1scg._.js → lib_cursor-projects_ts_18-iwyk._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_gemini-projects_ts_0sl~yqr._.js → lib_gemini-projects_ts_1c7bgx-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_opencode-projects_ts_0op9gyp._.js → lib_opencode-projects_ts_15bjxkm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_pi-projects_ts_103tsh1._.js → lib_pi-projects_ts_1wikofb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_utils_ts_068jk73._.js → lib_utils_ts_0az0sfq._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1ynf7el._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_05gja40.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_1n-0xws.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_0rd0oc-._.js → node_modules_next_1a1kch7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_0h9llsw._.js → node_modules_next_dist_0uboya6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_11dij6w._.js → node_modules_next_dist_1d_onnt._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_0inhx6q._.js → node_modules_next_dist_client_components_0wpq8j3._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js → node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js → node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js → node_modules_next_dist_esm_build_templates_app-page_0xrgzyz.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1806lsc.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +5 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +3 -0
- package/.next/standalone/.next/server/instrumentation.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +10 -10
- package/.next/standalone/.next/server/middleware.js +2 -2
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +2 -21
- 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 +27 -9
- package/.next/standalone/.next/static/chunks/{07uz2g0_38qia.js → 03fmihek9n986.js} +1 -1
- package/.next/standalone/.next/static/chunks/09ueq8s1as8xs.css +2 -0
- package/.next/standalone/.next/static/chunks/0ehe4dh0grngk.js +41 -0
- package/.next/standalone/.next/static/chunks/{0bke.~atnsbeb.js → 0gdm-xaez4l7t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{11w14gnqzprir.js → 0kdglk0vtzymo.js} +1 -1
- package/.next/standalone/.next/static/chunks/0qassxjx1ef04.js +1 -0
- package/.next/standalone/.next/static/chunks/0zbxssxh53n-3.js +1 -0
- package/.next/standalone/.next/static/chunks/13f1kmjea-0md.js +2 -0
- package/.next/standalone/.next/static/chunks/1btx2c49fk9xt.css +1 -0
- package/.next/standalone/.next/static/chunks/1fmco3pvq_twz.js +1 -0
- package/.next/standalone/.next/static/chunks/2b1fzuhuk-42n.js +1 -0
- package/.next/standalone/.next/static/chunks/{0bv1oyxspkpkb.js → 2dtip-mvmihiu.js} +1 -1
- package/.next/standalone/.next/static/chunks/2srzafd1_ha5y.js +1 -0
- package/.next/standalone/.next/static/chunks/{0d3shmwh5_nmn.js → 33u59vf_8xpd-.js} +1 -1
- package/.next/standalone/.next/static/chunks/3gti1qdk5epqn.js +1 -0
- package/.next/standalone/.next/static/chunks/{0dvhi-prcsh3~.js → 3krzy-lhwfrmz.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17mubwtqwijpu.js → 3w8d8k_dca5rp.js} +1 -1
- package/.next/standalone/.next/static/chunks/43lnq0c1rnflb.js +6 -0
- package/.next/standalone/.next/static/chunks/{turbopack-0nh.aopesgj~5.js → turbopack-00qy7zfa7m--m.js} +1 -1
- package/.next/standalone/SECURITY.md +73 -0
- package/.next/standalone/app/actions/get-audit-result.ts +24 -0
- package/.next/standalone/app/api/audit/_state.ts +72 -0
- package/.next/standalone/app/api/audit/run/route.ts +89 -0
- package/.next/standalone/app/api/audit/status/route.ts +23 -0
- package/.next/standalone/app/api/auth/login-request/route.ts +91 -0
- package/.next/standalone/app/api/auth/login-verify/route.ts +98 -0
- package/.next/standalone/app/api/auth/logout/route.ts +48 -0
- package/.next/standalone/app/api/auth/reminder/route.ts +213 -0
- package/.next/standalone/app/api/auth/status/route.ts +42 -0
- package/.next/standalone/app/audit/_components/audit-dashboard.tsx +364 -0
- package/.next/standalone/app/audit/_components/auth-dialog.tsx +401 -0
- package/.next/standalone/app/audit/_components/empty-state.tsx +146 -0
- package/.next/standalone/app/audit/_components/findings-section.tsx +135 -0
- package/.next/standalone/app/audit/_components/identity-section.tsx +126 -0
- package/.next/standalone/app/audit/_components/policies-section.tsx +194 -0
- package/.next/standalone/app/audit/_components/report-footer.tsx +35 -0
- package/.next/standalone/app/audit/_components/rerun-button.tsx +81 -0
- package/.next/standalone/app/audit/_components/return-section.tsx +428 -0
- package/.next/standalone/app/audit/_components/run-progress.tsx +120 -0
- package/.next/standalone/app/audit/_components/score-section.tsx +179 -0
- package/.next/standalone/app/audit/_components/share-dock.tsx +265 -0
- package/.next/standalone/app/audit/_components/share-templates.ts +67 -0
- package/.next/standalone/app/audit/_components/show-off-cta.tsx +135 -0
- package/.next/standalone/app/audit/_components/sigil.tsx +93 -0
- package/.next/standalone/app/audit/_components/strengths-section.tsx +57 -0
- package/.next/standalone/app/audit/audit-styles.css +2066 -0
- package/.next/standalone/app/audit/loading.tsx +24 -0
- package/.next/standalone/app/audit/page.tsx +53 -0
- package/.next/standalone/app/globals.css +570 -137
- package/.next/standalone/app/layout.tsx +16 -9
- package/.next/standalone/app/policies/hooks-client.tsx +223 -129
- package/.next/standalone/app/project/[name]/page.tsx +89 -39
- package/.next/standalone/app/projects/loading.tsx +30 -8
- package/.next/standalone/app/projects/page.tsx +76 -18
- package/.next/standalone/assets/audit/Audit Report.html +22 -0
- package/.next/standalone/assets/audit/Show Off Your Agent.html +22 -0
- package/.next/standalone/assets/audit/archetypes.jsx +277 -0
- package/.next/standalone/assets/audit/assets/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/assets/audit/audit.jsx +825 -0
- package/.next/standalone/assets/audit/poster-styles.css +424 -0
- package/.next/standalone/assets/audit/poster.jsx +247 -0
- package/.next/standalone/assets/audit/screenshots/poster-optimist.png +0 -0
- package/.next/standalone/assets/audit/screenshots/poster-scrolled.png +0 -0
- package/.next/standalone/assets/audit/styles.css +1225 -0
- package/.next/standalone/assets/audit/tweaks-panel.jsx +425 -0
- package/.next/standalone/assets/logos/company/icon.svg +1 -0
- package/.next/standalone/assets/logos/company/logo.svg +1 -0
- package/.next/standalone/components/navbar.tsx +154 -65
- package/.next/standalone/components/reach-developers.tsx +37 -9
- package/.next/standalone/lib/atomic-write.ts +67 -0
- package/.next/standalone/lib/auth/api-server-client.ts +281 -0
- package/.next/standalone/lib/auth/auth-store.ts +250 -0
- package/.next/standalone/lib/client-telemetry.ts +2 -0
- package/.next/standalone/lib/fetch-with-timeout.ts +42 -0
- package/.next/standalone/lib/share-card.ts +120 -0
- package/.next/standalone/lib/telemetry.ts +12 -7
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +102 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +11 -11
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +13 -13
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +18 -8
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +1 -0
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
- package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +6 -3
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +5 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +4 -3
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +6 -2
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +15 -15
- package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
- package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
- package/.next/standalone/node_modules/react/package.json +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/package.json +2 -2
- package/.next/standalone/osv-scanner.toml +17 -0
- package/.next/standalone/package.json +8 -3
- package/.next/standalone/public/audit/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/public/icon.svg +1 -0
- package/.next/standalone/public/logo.svg +1 -0
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/templates/bitcount-font/README.md +42 -0
- package/.next/standalone/templates/bitcount-font/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/templates/bitcount-font/bitcount.css +49 -0
- package/.next/standalone/templates/bitcount-font/fonts.ts.example +23 -0
- package/README.md +2 -1
- package/bin/failproofai.mjs +165 -144
- package/dist/cli.mjs +607 -1858
- package/lib/atomic-write.ts +67 -0
- package/lib/auth/api-server-client.ts +281 -0
- package/lib/auth/auth-store.ts +250 -0
- package/lib/client-telemetry.ts +2 -0
- package/lib/fetch-with-timeout.ts +42 -0
- package/lib/share-card.ts +120 -0
- package/lib/telemetry.ts +12 -7
- package/package.json +8 -3
- package/scripts/install-telemetry.mjs +4 -0
- package/src/audit/archetypes.ts +924 -0
- package/src/audit/cache.ts +21 -2
- package/src/audit/dashboard-cache.ts +111 -0
- package/src/audit/features.ts +268 -0
- package/src/audit/findings.ts +298 -0
- package/src/audit/index.ts +39 -21
- package/src/audit/replay.ts +29 -3
- package/src/audit/scoring.ts +174 -0
- package/src/audit/strengths.ts +138 -0
- package/src/audit/types.ts +24 -1
- package/src/auth/cli.ts +359 -0
- package/src/hooks/builtin-policies.ts +2 -1
- package/src/hooks/hook-telemetry.ts +2 -2
- package/src/hooks/policy-registry.ts +20 -0
- package/src/posthog-key.ts +9 -0
- package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +0 -3
- package/.next/standalone/.next/server/app/icon.png/route.js +0 -7
- package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/icon.png.body +0 -0
- package/.next/standalone/.next/server/app/icon.png.meta +0 -1
- package/.next/standalone/.next/server/chunks/[externals]_next_dist_0sqmaqd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +0 -3
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_12.gv.r.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0bdfoky.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01as125._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0370~qj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09v.ljl._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0agrcb8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b7hkr~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehh6vp._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g8l0tu._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j4l6hl._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0k5n2kz._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0lp08ll._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0yaqw._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0o21f.o._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t8juvy._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uylufv._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +0 -223
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~03grs._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +0 -8
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_13veom4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0ttbz1~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_06u0kr8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +0 -3
- package/.next/standalone/.next/static/chunks/07kpqoo7kuckx.js +0 -6
- package/.next/standalone/.next/static/chunks/0azb~vy9ds_uy.js +0 -1
- package/.next/standalone/.next/static/chunks/0f5p9plm.aqlp.css +0 -2
- package/.next/standalone/.next/static/chunks/0ffvlbgzgnlw7.js +0 -2
- package/.next/standalone/.next/static/chunks/0spktq7xqab9h.js +0 -1
- package/.next/standalone/.next/static/chunks/118q3uljozd5z.js +0 -4
- package/.next/standalone/.next/static/chunks/12pt~2f.c1sha.js +0 -1
- package/.next/standalone/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
- package/.next/standalone/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
- package/.next/standalone/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
- package/.next/standalone/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
- package/.next/standalone/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
- package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
- package/.next/standalone/.next/static/media/icon.0a.gigb3_x5pd.png +0 -0
- package/.next/standalone/app/icon.png +0 -0
- package/src/audit/telemetry.ts +0 -113
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route/build-manifest.json +0 -0
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route.js.map +0 -0
- /package/.next/standalone/.next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0a40sy4tk8ioe.js → 0wwt5o04i4zwh.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0n1n67imq.udf.js → 1__i9af9g78vd.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0w6fzf.07a24u.js → 2so39wg7mjbi7.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0xbo5nl6w4lka.js → 2wbuxnsvux4di.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0_s0luks5tay-.js → 35fgpd_feci6x.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{15fklyav5py5m.js → 3xpjn3cdgm-7m.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{17.b3suj8zjjj.js → 4448_qq7bd963.js} +0 -0
- /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,825 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// failproof_ai — audit report
|
|
3
|
+
// Personality profile for your agent. Six sections.
|
|
4
|
+
// ============================================================
|
|
5
|
+
|
|
6
|
+
const { useState, useEffect, useMemo } = React;
|
|
7
|
+
|
|
8
|
+
// ---------- url param helper ----------
|
|
9
|
+
function getParam(name, fallback) {
|
|
10
|
+
try {
|
|
11
|
+
const v = new URLSearchParams(window.location.search).get(name);
|
|
12
|
+
return v == null || v === "" ? fallback : v;
|
|
13
|
+
} catch (e) { return fallback; }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// ---------- defaults (tweakable via URL params or the Tweaks panel) ----------
|
|
17
|
+
// URL params: ?a=archetype &s=score &r=rank &c=cohort &p=project
|
|
18
|
+
const REPORT_DEFAULTS = /*EDITMODE-BEGIN*/{
|
|
19
|
+
"archetype": getParam("a", "optimist"),
|
|
20
|
+
"score": parseInt(getParam("s", "58"), 10),
|
|
21
|
+
"rank": parseInt(getParam("r", "1847"), 10),
|
|
22
|
+
"cohort": parseInt(getParam("c", "2316"), 10),
|
|
23
|
+
"tweetVariant": "show-off",
|
|
24
|
+
"showSecondary": true,
|
|
25
|
+
"project": getParam("p", "blrnow / api-coder")
|
|
26
|
+
}/*EDITMODE-END*/;
|
|
27
|
+
|
|
28
|
+
// ---------- helpers ----------
|
|
29
|
+
function gradeFor(score) {
|
|
30
|
+
if (score >= 90) return "S";
|
|
31
|
+
if (score >= 80) return "A";
|
|
32
|
+
if (score >= 71) return "B";
|
|
33
|
+
if (score >= 55) return "C";
|
|
34
|
+
if (score >= 40) return "D";
|
|
35
|
+
return "F";
|
|
36
|
+
}
|
|
37
|
+
function projectedScore(base) {
|
|
38
|
+
// every policy ~= +3.5 pts, capped at 92
|
|
39
|
+
return Math.min(92, base + 21);
|
|
40
|
+
}
|
|
41
|
+
function tierName(g) {
|
|
42
|
+
return { S: "s tier", A: "a tier", B: "b tier", C: "c tier", D: "d tier", F: "f tier" }[g];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---------- data ----------
|
|
46
|
+
const STRENGTHS = [
|
|
47
|
+
{
|
|
48
|
+
metric: "99%",
|
|
49
|
+
unit: "clean tool calls",
|
|
50
|
+
headline: "ran 847 tool calls. 8 detectors triggered.",
|
|
51
|
+
detail: "99% of tool calls came back clean before today's audit.",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
metric: "0",
|
|
55
|
+
unit: "credential leaks",
|
|
56
|
+
headline: "zero credential exposure to stdout.",
|
|
57
|
+
detail: "the explorer instinct never made it to output. secrets stayed secret.",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
metric: "11",
|
|
61
|
+
unit: "avg turns / task",
|
|
62
|
+
headline: "tasks complete in 11 turns on average.",
|
|
63
|
+
detail: "faster than 63% of audited agents in this cohort.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
metric: "0",
|
|
67
|
+
unit: "double-writes",
|
|
68
|
+
headline: "no double-writes across production projects.",
|
|
69
|
+
detail: "the agent never overwrote a file it was mid-edit on.",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
metric: "94%",
|
|
73
|
+
unit: "intent retention",
|
|
74
|
+
headline: "stayed on the stated task in 94% of sessions.",
|
|
75
|
+
detail: "rarely went off-scope on its own. focus is real.",
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
const FINDINGS = [
|
|
80
|
+
{
|
|
81
|
+
num: "01",
|
|
82
|
+
title: "prepended cd before commands",
|
|
83
|
+
count: 20,
|
|
84
|
+
policy: "redundant-cd",
|
|
85
|
+
projects: 2,
|
|
86
|
+
lastSeen: "4h ago",
|
|
87
|
+
body: <>
|
|
88
|
+
the agent runs <code>cd <cwd></code> before commands it would have run from the
|
|
89
|
+
same directory anyway. mostly harmless. occasionally it gets the path wrong and
|
|
90
|
+
manufactures a new bug.
|
|
91
|
+
</>,
|
|
92
|
+
cost: { tokens: "~3.2k", risk: "low", radius: "high noise" },
|
|
93
|
+
costLine: <>~3.2k <span className="g">tokens/day</span> burned on redundant navigation. low security risk. <span className="pk">high noise.</span></>,
|
|
94
|
+
evidence: [
|
|
95
|
+
{ kind: "cmd", text: 'cd /Users/n/blrnow/api && pnpm test' },
|
|
96
|
+
{ kind: "comment", text: '# already in /Users/n/blrnow/api' },
|
|
97
|
+
{ kind: "cmd", text: 'cd /Users/n/blrnow/api && git status' },
|
|
98
|
+
{ kind: "comment", text: '# still already there.' },
|
|
99
|
+
],
|
|
100
|
+
fix: {
|
|
101
|
+
slug: "no-redundant-cd",
|
|
102
|
+
desc: "rejects cd prefixes when the agent's cwd already matches the target.",
|
|
103
|
+
install: "failproof policy add no-redundant-cd",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
num: "02",
|
|
108
|
+
title: "pushed to main without a branch",
|
|
109
|
+
count: 7,
|
|
110
|
+
policy: "block-push-master",
|
|
111
|
+
projects: 1,
|
|
112
|
+
lastSeen: "1d ago",
|
|
113
|
+
body: <>
|
|
114
|
+
seven attempts to push directly to <code>main</code>. branch protection caught four of
|
|
115
|
+
them. the other three landed. the agent did not author a rollback.
|
|
116
|
+
</>,
|
|
117
|
+
cost: { tokens: "—", risk: "high", radius: "production" },
|
|
118
|
+
costLine: <>7 attempts. <span className="g">branch protection saved you 4 times.</span> the other <span className="pk">3 merged.</span></>,
|
|
119
|
+
evidence: [
|
|
120
|
+
{ kind: "cmd", text: 'git push origin main' },
|
|
121
|
+
{ kind: "err", text: '! remote: protected branch' },
|
|
122
|
+
{ kind: "cmd", text: 'git push origin main --force' },
|
|
123
|
+
{ kind: "err", text: '! remote: protected branch' },
|
|
124
|
+
{ kind: "cmd", text: 'git push origin HEAD:main' },
|
|
125
|
+
{ kind: "comment", text: '# fast-forward. merged.' },
|
|
126
|
+
],
|
|
127
|
+
fix: {
|
|
128
|
+
slug: "block-push-master",
|
|
129
|
+
desc: "intercepts push-to-main attempts; requires a branch + PR.",
|
|
130
|
+
install: "failproof policy add block-push-master",
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
num: "03",
|
|
135
|
+
title: "read outside the project root",
|
|
136
|
+
count: 4,
|
|
137
|
+
policy: "block-read-outside-cwd",
|
|
138
|
+
projects: 2,
|
|
139
|
+
lastSeen: "2d ago",
|
|
140
|
+
body: <>
|
|
141
|
+
four reads outside the project root. three of them hit credential files
|
|
142
|
+
(<code>~/.aws/credentials</code>, <code>~/.config/openai/key</code>, an out-of-tree{" "}
|
|
143
|
+
<code>.env</code>). none made it back to stdout — but they made it into context.
|
|
144
|
+
</>,
|
|
145
|
+
cost: { tokens: "n/a", risk: "high", radius: "credentials" },
|
|
146
|
+
costLine: <>4 reads outside project root. <span className="pk">3 hit credential files.</span> high exposure risk.</>,
|
|
147
|
+
evidence: [
|
|
148
|
+
{ kind: "cmd", text: 'cat /Users/n/.aws/credentials' },
|
|
149
|
+
{ kind: "cmd", text: 'cat ../other-repo/.env' },
|
|
150
|
+
{ kind: "cmd", text: 'cat ~/.config/openai/key' },
|
|
151
|
+
],
|
|
152
|
+
fix: {
|
|
153
|
+
slug: "block-read-outside-cwd",
|
|
154
|
+
desc: "denies any read whose absolute path falls outside the project root.",
|
|
155
|
+
install: "failproof policy add block-read-outside-cwd",
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
num: "04",
|
|
160
|
+
title: "retried the same call six times in a row",
|
|
161
|
+
count: 6,
|
|
162
|
+
policy: "retry-storm",
|
|
163
|
+
projects: 1,
|
|
164
|
+
lastSeen: "5h ago",
|
|
165
|
+
body: <>
|
|
166
|
+
same call, same args, six times under 90 seconds. no diagnosis between attempts.
|
|
167
|
+
the file existed — at a different path the agent never tried.
|
|
168
|
+
</>,
|
|
169
|
+
cost: { tokens: "~1.8k", risk: "med", radius: "stall" },
|
|
170
|
+
costLine: <>~1.8k <span className="g">tokens/day</span> in retry overhead. <span className="pk">3 sessions stalled</span> before manual correction.</>,
|
|
171
|
+
evidence: [
|
|
172
|
+
{ kind: "cmd", text: 'read_file("src/api/router.ts")', err: " → ENOENT" },
|
|
173
|
+
{ kind: "cmd", text: 'read_file("src/api/router.ts")', err: " → ENOENT" },
|
|
174
|
+
{ kind: "cmd", text: 'read_file("src/api/router.ts")', err: " → ENOENT" },
|
|
175
|
+
{ kind: "comment", text: '# 6× total. correct path: src/router.ts.' },
|
|
176
|
+
],
|
|
177
|
+
fix: {
|
|
178
|
+
slug: "retry-budget",
|
|
179
|
+
desc: "caps identical-arg retries at 2. forces a diagnostic step on the third.",
|
|
180
|
+
install: "failproof policy add retry-budget",
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
num: "05",
|
|
185
|
+
title: "context carried beyond its sell-by date",
|
|
186
|
+
count: 3,
|
|
187
|
+
policy: "context-bleed",
|
|
188
|
+
projects: 1,
|
|
189
|
+
lastSeen: "3d ago",
|
|
190
|
+
body: <>
|
|
191
|
+
three sessions referenced files past 82% context fill that were never opened in
|
|
192
|
+
the current session. the agent didn't lie. it filled gaps with confidence.
|
|
193
|
+
</>,
|
|
194
|
+
cost: { tokens: "varies", risk: "med", radius: "compounding" },
|
|
195
|
+
costLine: <>3 sessions over 80% context. <span className="a">2 cited files never opened.</span> compounding errors downstream.</>,
|
|
196
|
+
evidence: [
|
|
197
|
+
{ kind: "comment", text: '# turn 47/52 — ctx 82% full' },
|
|
198
|
+
{ kind: "comment", text: '# agent: "as we saw earlier in auth.ts…"' },
|
|
199
|
+
{ kind: "comment", text: '# auth.ts was never opened this session.' },
|
|
200
|
+
],
|
|
201
|
+
fix: {
|
|
202
|
+
slug: "context-window-guard",
|
|
203
|
+
desc: "warns at 75%, forces summary-and-reset at 90%.",
|
|
204
|
+
install: "failproof policy add context-window-guard",
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
num: "06",
|
|
209
|
+
title: "wrote without verifying",
|
|
210
|
+
count: 11,
|
|
211
|
+
policy: "verify-after-write",
|
|
212
|
+
projects: 2,
|
|
213
|
+
lastSeen: "12h ago",
|
|
214
|
+
body: <>
|
|
215
|
+
eleven writes shipped with no read-back, no test run, no type-check. the build
|
|
216
|
+
went green nine times. twice it didn't, and the agent moved on.
|
|
217
|
+
</>,
|
|
218
|
+
cost: { tokens: "low", risk: "med", radius: "silent-fail" },
|
|
219
|
+
costLine: <>11 unverified writes. <span className="pk">2 broke the build silently.</span> the agent didn't notice.</>,
|
|
220
|
+
evidence: [
|
|
221
|
+
{ kind: "cmd", text: 'write_file("src/api/router.ts")', comment: " # done" },
|
|
222
|
+
{ kind: "comment", text: '# no read_file to verify' },
|
|
223
|
+
{ kind: "comment", text: '# no `pnpm typecheck` after write' },
|
|
224
|
+
],
|
|
225
|
+
fix: {
|
|
226
|
+
slug: "verify-after-write",
|
|
227
|
+
desc: "requires a read-back or test run before the agent claims a task complete.",
|
|
228
|
+
install: "failproof policy add verify-after-write",
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
|
|
233
|
+
// ---------- top-level shell ----------
|
|
234
|
+
function App() {
|
|
235
|
+
const [t, setTweak] = useTweaks ? useTweaks(REPORT_DEFAULTS) : [REPORT_DEFAULTS, () => {}];
|
|
236
|
+
const archetype = ARCHETYPES[t.archetype] || ARCHETYPES.optimist;
|
|
237
|
+
const grade = gradeFor(t.score);
|
|
238
|
+
const projected = projectedScore(t.score);
|
|
239
|
+
const projectedGrade = gradeFor(projected);
|
|
240
|
+
|
|
241
|
+
return (
|
|
242
|
+
<div className="app">
|
|
243
|
+
<div className="scanline-overlay" />
|
|
244
|
+
<div className="app-shell">
|
|
245
|
+
<AppHeader />
|
|
246
|
+
<div className="report">
|
|
247
|
+
<IdentitySection archetype={archetype} showSecondary={t.showSecondary} />
|
|
248
|
+
<ShowOffCTA archetype={archetype} score={t.score} grade={grade} rank={t.rank} cohort={t.cohort} project={t.project} />
|
|
249
|
+
<StrengthsSection />
|
|
250
|
+
<ScoreSection score={t.score} grade={grade} rank={t.rank} cohort={t.cohort} archetype={archetype} project={t.project} />
|
|
251
|
+
<FindingsSection />
|
|
252
|
+
<PoliciesSection projected={projected} projectedGrade={projectedGrade} />
|
|
253
|
+
<ReturnSection />
|
|
254
|
+
</div>
|
|
255
|
+
<ReportFooter />
|
|
256
|
+
{window.TweaksPanel ? (
|
|
257
|
+
<ReportTweaks t={t} setTweak={setTweak} projected={projected} projectedGrade={projectedGrade} />
|
|
258
|
+
) : null}
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ============================================================
|
|
265
|
+
// SHELL — minimal header with failproof_ai wordmark only
|
|
266
|
+
// ============================================================
|
|
267
|
+
function AppHeader() {
|
|
268
|
+
return (
|
|
269
|
+
<header className="app-header">
|
|
270
|
+
<a className="h-brand" href="#" aria-label="failproof_ai">
|
|
271
|
+
<span className="h-brand-mark">▮▮</span>
|
|
272
|
+
<span className="h-brand-name">failproof_ai</span>
|
|
273
|
+
<span className="h-brand-sep">/</span>
|
|
274
|
+
<span className="h-brand-section">audit</span>
|
|
275
|
+
</a>
|
|
276
|
+
<div className="h-actions">
|
|
277
|
+
<button className="btn btn-primary btn-press">[ share → ]</button>
|
|
278
|
+
</div>
|
|
279
|
+
</header>
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// ============================================================
|
|
284
|
+
// 01 — IDENTITY
|
|
285
|
+
// ============================================================
|
|
286
|
+
function IdentitySection({ archetype, showSecondary }) {
|
|
287
|
+
const secondary = ARCHETYPES[archetype.secondary];
|
|
288
|
+
return (
|
|
289
|
+
<section className="identity" data-screen-label="01 Identity">
|
|
290
|
+
<div className="archetype-frame">
|
|
291
|
+
<span className="corner tl">┌ identity</span>
|
|
292
|
+
<span className="corner tr">v1.0 ┐</span>
|
|
293
|
+
<span className="corner bl">└ № {archetype.index} / 08</span>
|
|
294
|
+
<span className="corner br">archetype ┘</span>
|
|
295
|
+
|
|
296
|
+
<div className="arch-mast">
|
|
297
|
+
<div className="arch-mast-left">
|
|
298
|
+
<div className="arch-eyebrow">
|
|
299
|
+
━━ identity <span className="ix">·</span> your agent's archetype
|
|
300
|
+
</div>
|
|
301
|
+
<div className="arch-target">
|
|
302
|
+
detected from <span style={{ color: "var(--ink)" }}>847</span> tool calls
|
|
303
|
+
<span className="slash">/</span>
|
|
304
|
+
<span style={{ color: "var(--ink)" }}>52</span> sessions
|
|
305
|
+
<span className="slash">/</span>
|
|
306
|
+
<span style={{ color: "var(--ink)" }}>30d</span>
|
|
307
|
+
<span className="live"><span className="dot-live"></span>live</span>
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
<div className="arch-counter">
|
|
311
|
+
<div>№ {archetype.index}<span className="of"> of 08</span></div>
|
|
312
|
+
<div style={{ color: "var(--ink-2)", marginTop: 4 }}>archetype</div>
|
|
313
|
+
</div>
|
|
314
|
+
</div>
|
|
315
|
+
|
|
316
|
+
<div className="arch-body">
|
|
317
|
+
<div>
|
|
318
|
+
<h1 className="arch-name">{archetype.name}</h1>
|
|
319
|
+
<p className="arch-tagline">{archetype.tagline}</p>
|
|
320
|
+
{showSecondary && secondary && (
|
|
321
|
+
<div className="arch-secondary">
|
|
322
|
+
<span className="with">with</span>
|
|
323
|
+
<span className="name">{secondary.name.replace("the ", "")}</span>
|
|
324
|
+
<span className="with">tendencies</span>
|
|
325
|
+
</div>
|
|
326
|
+
)}
|
|
327
|
+
|
|
328
|
+
<div className="arch-keywords">
|
|
329
|
+
{archetype.keywords.map((k, i) => (
|
|
330
|
+
<React.Fragment key={k}>
|
|
331
|
+
<span className="kw">{k}</span>
|
|
332
|
+
{i < archetype.keywords.length - 1 && <span className="kw-sep">·</span>}
|
|
333
|
+
</React.Fragment>
|
|
334
|
+
))}
|
|
335
|
+
</div>
|
|
336
|
+
|
|
337
|
+
<div className="arch-meta-grid">
|
|
338
|
+
<div className="arch-meta-item">
|
|
339
|
+
<span className="label">common in</span>
|
|
340
|
+
<span className="body">{archetype.common}</span>
|
|
341
|
+
</div>
|
|
342
|
+
<div className="arch-meta-item">
|
|
343
|
+
<span className="label p">primary risk</span>
|
|
344
|
+
<span className="body">{archetype.risk}</span>
|
|
345
|
+
</div>
|
|
346
|
+
</div>
|
|
347
|
+
|
|
348
|
+
<div className="arch-closing">— {archetype.closing}</div>
|
|
349
|
+
</div>
|
|
350
|
+
|
|
351
|
+
<Sigil archetypeKey={archetype.key} />
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
</section>
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// ============================================================
|
|
359
|
+
// SHOW OFF — big CTA strip right after IDENTITY
|
|
360
|
+
// Links to the standalone poster page with archetype + score baked into the URL.
|
|
361
|
+
// ============================================================
|
|
362
|
+
function ShowOffCTA({ archetype, score, grade, rank, cohort, project }) {
|
|
363
|
+
const params = new URLSearchParams({
|
|
364
|
+
a: archetype.key,
|
|
365
|
+
s: String(score),
|
|
366
|
+
g: grade,
|
|
367
|
+
r: String(rank),
|
|
368
|
+
c: String(cohort),
|
|
369
|
+
p: project,
|
|
370
|
+
});
|
|
371
|
+
const href = "Show%20Off%20Your%20Agent.html?" + params.toString();
|
|
372
|
+
|
|
373
|
+
return (
|
|
374
|
+
<section className="showoff" data-screen-label="01b Show off">
|
|
375
|
+
<a className="showoff-cta" href={href}>
|
|
376
|
+
<span className="showoff-glyph" aria-hidden="true">
|
|
377
|
+
<Sigil archetypeKey={archetype.key} />
|
|
378
|
+
</span>
|
|
379
|
+
<span className="showoff-copy">
|
|
380
|
+
<span className="showoff-label">━━ shareable poster</span>
|
|
381
|
+
<span className="showoff-headline">show off your agent.</span>
|
|
382
|
+
<span className="showoff-sub">
|
|
383
|
+
generate a one-page poster of your {archetype.name}.
|
|
384
|
+
score, percentile, sigil. ready to post.
|
|
385
|
+
</span>
|
|
386
|
+
</span>
|
|
387
|
+
<span className="showoff-action">
|
|
388
|
+
<span className="showoff-arrow">→</span>
|
|
389
|
+
<span className="showoff-action-label">make poster</span>
|
|
390
|
+
</span>
|
|
391
|
+
</a>
|
|
392
|
+
</section>
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// ============================================================
|
|
397
|
+
// 02 — STRENGTHS
|
|
398
|
+
// ============================================================
|
|
399
|
+
function StrengthsSection() {
|
|
400
|
+
return (
|
|
401
|
+
<section className="section" data-screen-label="02 Strengths">
|
|
402
|
+
<div className="section-mast">
|
|
403
|
+
<div className="section-label">
|
|
404
|
+
<span className="glyph">━━</span> strengths <span style={{ color: "var(--dim)" }}>·</span> what your agent has figured out
|
|
405
|
+
</div>
|
|
406
|
+
<div className="section-meta"><span className="g">●</span> 5 of 12 measured</div>
|
|
407
|
+
</div>
|
|
408
|
+
<h2 className="section-h">your agent does this right.</h2>
|
|
409
|
+
|
|
410
|
+
<div className="strengths-grid">
|
|
411
|
+
{STRENGTHS.map((s, i) => (
|
|
412
|
+
<div key={i} className="strength-row">
|
|
413
|
+
<div className="strength-check">✓</div>
|
|
414
|
+
<div className="strength-body">
|
|
415
|
+
<div className="strength-headline">{s.headline}</div>
|
|
416
|
+
<div className="strength-detail">{s.detail}</div>
|
|
417
|
+
</div>
|
|
418
|
+
<div className="strength-metric">
|
|
419
|
+
{s.metric}
|
|
420
|
+
<span className="unit">{s.unit}</span>
|
|
421
|
+
</div>
|
|
422
|
+
</div>
|
|
423
|
+
))}
|
|
424
|
+
</div>
|
|
425
|
+
<div className="strengths-footer">— these are your agent's defaults. keep them.</div>
|
|
426
|
+
</section>
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// ============================================================
|
|
431
|
+
// 03 — SCORE + LEADERBOARD
|
|
432
|
+
// ============================================================
|
|
433
|
+
function ScoreSection({ score, grade, rank, cohort, archetype, project }) {
|
|
434
|
+
const pointsToB = Math.max(0, 71 - score);
|
|
435
|
+
const distBars = useMemo(() => buildDistribution(score), [score]);
|
|
436
|
+
const leaderboardRows = useMemo(() => buildLeaderboard(rank, cohort, score, project, archetype), [rank, cohort, score, project, archetype.key]);
|
|
437
|
+
|
|
438
|
+
return (
|
|
439
|
+
<section className="section" data-screen-label="03 Score">
|
|
440
|
+
<div className="section-mast">
|
|
441
|
+
<div className="section-label">
|
|
442
|
+
<span className="glyph">━━</span> leaderboard <span style={{ color: "var(--dim)" }}>·</span> cohort
|
|
443
|
+
</div>
|
|
444
|
+
<div className="section-meta">
|
|
445
|
+
<span style={{ color: "var(--ink)" }}>{cohort.toLocaleString()}</span> agents
|
|
446
|
+
<span style={{ color: "var(--dim)" }}> · </span>
|
|
447
|
+
last 30 days
|
|
448
|
+
</div>
|
|
449
|
+
</div>
|
|
450
|
+
<h2 className="section-h">you rank #{rank.toLocaleString()}.</h2>
|
|
451
|
+
|
|
452
|
+
<div className="score-grid">
|
|
453
|
+
<div className="score-card">
|
|
454
|
+
<div className="score-grade-row">
|
|
455
|
+
<div className={"score-grade g-" + grade}>{grade}</div>
|
|
456
|
+
<div className="score-num">
|
|
457
|
+
<div className="tier">{tierName(grade)}</div>
|
|
458
|
+
<div className="n">{score}</div>
|
|
459
|
+
<div className="of">of 100</div>
|
|
460
|
+
</div>
|
|
461
|
+
</div>
|
|
462
|
+
|
|
463
|
+
{pointsToB > 0 ? (
|
|
464
|
+
<p className="score-prose">
|
|
465
|
+
<span className="hl">a B starts at 71.</span> you're <span className="pk">{pointsToB} points</span> away.<br />
|
|
466
|
+
enable the prescribed policies and you'll get there this week.
|
|
467
|
+
</p>
|
|
468
|
+
) : grade === "S" ? (
|
|
469
|
+
<p className="score-prose">
|
|
470
|
+
<span className="hl">s tier.</span> few make it here. fewer stay.<br />
|
|
471
|
+
keep the policies live. revisit in 30 days.
|
|
472
|
+
</p>
|
|
473
|
+
) : (
|
|
474
|
+
<p className="score-prose">
|
|
475
|
+
<span className="hl">{tierName(grade)}.</span> better than {Math.round((1 - rank / cohort) * 100)}% of audited agents.<br />
|
|
476
|
+
clean up the findings below to climb.
|
|
477
|
+
</p>
|
|
478
|
+
)}
|
|
479
|
+
|
|
480
|
+
<div className="dist">
|
|
481
|
+
<div className="dist-label">
|
|
482
|
+
<span>distribution · last 30d</span>
|
|
483
|
+
<span className="right">▮ = your position</span>
|
|
484
|
+
</div>
|
|
485
|
+
<div className="dist-chart">
|
|
486
|
+
{distBars.map((b, i) => (
|
|
487
|
+
<div
|
|
488
|
+
key={i}
|
|
489
|
+
className={"dist-bar" + (b.you ? " you" : "")}
|
|
490
|
+
style={{ height: b.h + "%" }}
|
|
491
|
+
title={b.label}
|
|
492
|
+
/>
|
|
493
|
+
))}
|
|
494
|
+
</div>
|
|
495
|
+
<div className="dist-axis">
|
|
496
|
+
<span className={grade === "F" ? "now" : ""}>F</span>
|
|
497
|
+
<span className={grade === "D" ? "now" : ""}>D</span>
|
|
498
|
+
<span className={grade === "C" ? "now" : ""}>C</span>
|
|
499
|
+
<span className={grade === "B" ? "now" : ""}>B</span>
|
|
500
|
+
<span className={grade === "A" ? "now" : ""}>A</span>
|
|
501
|
+
<span className={grade === "S" ? "now" : ""}>S</span>
|
|
502
|
+
</div>
|
|
503
|
+
</div>
|
|
504
|
+
</div>
|
|
505
|
+
|
|
506
|
+
<div className="lb">
|
|
507
|
+
<div className="lb-head">
|
|
508
|
+
<div>rank</div>
|
|
509
|
+
<div>agent</div>
|
|
510
|
+
<div style={{ textAlign: "center" }}>grade</div>
|
|
511
|
+
<div style={{ textAlign: "right" }}>score</div>
|
|
512
|
+
</div>
|
|
513
|
+
{leaderboardRows.map((r, i) =>
|
|
514
|
+
r.divider ? (
|
|
515
|
+
<div key={i} className="lb-row divider"><span>· · ·</span></div>
|
|
516
|
+
) : (
|
|
517
|
+
<div key={i} className={"lb-row" + (r.you ? " you" : "")}>
|
|
518
|
+
<div className="lb-rank">#{r.rank.toLocaleString()}</div>
|
|
519
|
+
<div className="lb-agent">
|
|
520
|
+
<div className="name">{r.name}{r.you && <span className="you-mark">(you)</span>}</div>
|
|
521
|
+
<div className="arch">{r.arch}</div>
|
|
522
|
+
</div>
|
|
523
|
+
<div className={"lb-grade g-" + r.grade}>{r.grade}</div>
|
|
524
|
+
<div className="lb-score">{r.score}</div>
|
|
525
|
+
</div>
|
|
526
|
+
)
|
|
527
|
+
)}
|
|
528
|
+
</div>
|
|
529
|
+
</div>
|
|
530
|
+
</section>
|
|
531
|
+
);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
function buildDistribution(yourScore) {
|
|
535
|
+
// 20 buckets, 5pts each, 0-100
|
|
536
|
+
// bell-curve-ish centered around 60
|
|
537
|
+
const buckets = [];
|
|
538
|
+
for (let i = 0; i < 20; i++) {
|
|
539
|
+
const center = i * 5 + 2.5;
|
|
540
|
+
const dist = Math.abs(center - 60);
|
|
541
|
+
const h = Math.max(8, 100 - dist * 2.2 + (Math.sin(i * 1.3) * 6));
|
|
542
|
+
const you = yourScore >= i * 5 && yourScore < (i + 1) * 5;
|
|
543
|
+
buckets.push({ h, you, label: `${i * 5}-${(i + 1) * 5}` });
|
|
544
|
+
}
|
|
545
|
+
return buckets;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
const LB_NAMES = [
|
|
549
|
+
{ name: "anthropic / claude-code-internal", arch: "the precision builder" },
|
|
550
|
+
{ name: "openai / gpt-engineer-pro", arch: "the precision builder" },
|
|
551
|
+
{ name: "vercel / v0-coder-v3", arch: "the ghost" },
|
|
552
|
+
{ name: "supabase / db-migrator", arch: "the paranoid architect" },
|
|
553
|
+
{ name: "stripe / payments-bot", arch: "the paranoid architect" },
|
|
554
|
+
{ name: "linear / triage-agent", arch: "the ghost" },
|
|
555
|
+
{ name: "cursor / refactor-bot", arch: "the precision builder" },
|
|
556
|
+
{ name: "replit / repl-coder", arch: "the optimist" },
|
|
557
|
+
{ name: "exosphere / orchestrator", arch: "the precision builder" },
|
|
558
|
+
{ name: "humanloop / eval-runner", arch: "the paranoid architect" },
|
|
559
|
+
];
|
|
560
|
+
|
|
561
|
+
function buildLeaderboard(yourRank, cohort, yourScore, yourProject, yourArchetype) {
|
|
562
|
+
const yourGrade = gradeFor(yourScore);
|
|
563
|
+
// top 5
|
|
564
|
+
const rows = [];
|
|
565
|
+
rows.push({ rank: 1, ...LB_NAMES[0], grade: "S", score: 97 });
|
|
566
|
+
rows.push({ rank: 2, ...LB_NAMES[1], grade: "S", score: 93 });
|
|
567
|
+
rows.push({ rank: 3, ...LB_NAMES[2], grade: "A", score: 89 });
|
|
568
|
+
rows.push({ rank: 4, ...LB_NAMES[3], grade: "A", score: 86 });
|
|
569
|
+
rows.push({ rank: 5, ...LB_NAMES[4], grade: "A", score: 82 });
|
|
570
|
+
rows.push({ divider: true });
|
|
571
|
+
// 2 above you
|
|
572
|
+
rows.push({ rank: yourRank - 2, name: "indie / weekend-coder-42", arch: "the cowboy", grade: gradeFor(yourScore + 2), score: yourScore + 2 });
|
|
573
|
+
rows.push({ rank: yourRank - 1, name: "n8n / workflow-agent", arch: "the optimist", grade: gradeFor(yourScore + 1), score: yourScore + 1 });
|
|
574
|
+
rows.push({ rank: yourRank, name: yourProject, arch: yourArchetype.name, grade: yourGrade, score: yourScore, you: true });
|
|
575
|
+
rows.push({ rank: yourRank + 1, name: "acme / scratch-pad", arch: "the hammer", grade: gradeFor(yourScore - 1), score: yourScore - 1 });
|
|
576
|
+
rows.push({ rank: yourRank + 2, name: "side-quest / cli-tool", arch: "the goldfish", grade: gradeFor(yourScore - 2), score: yourScore - 2 });
|
|
577
|
+
return rows;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// ============================================================
|
|
581
|
+
// 04 — FINDINGS
|
|
582
|
+
// ============================================================
|
|
583
|
+
function FindingsSection() {
|
|
584
|
+
return (
|
|
585
|
+
<section className="section" data-screen-label="04 Findings">
|
|
586
|
+
<div className="section-mast">
|
|
587
|
+
<div className="section-label">
|
|
588
|
+
<span className="glyph">━━</span> findings <span style={{ color: "var(--dim)" }}>·</span> ranked by impact
|
|
589
|
+
</div>
|
|
590
|
+
<div className="section-meta">
|
|
591
|
+
<span className="p">●</span> {FINDINGS.length} detectors triggered
|
|
592
|
+
</div>
|
|
593
|
+
</div>
|
|
594
|
+
<h2 className="section-h">your agent has some quirks.</h2>
|
|
595
|
+
|
|
596
|
+
<div className="findings-list">
|
|
597
|
+
{FINDINGS.map((f) => <Finding key={f.num} f={f} />)}
|
|
598
|
+
</div>
|
|
599
|
+
</section>
|
|
600
|
+
);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
function Finding({ f }) {
|
|
604
|
+
return (
|
|
605
|
+
<article className="finding">
|
|
606
|
+
<header className="finding-head">
|
|
607
|
+
<div className="finding-num">№{f.num}</div>
|
|
608
|
+
<div className="finding-title">{f.title}</div>
|
|
609
|
+
<div className="finding-count">
|
|
610
|
+
{f.count}×
|
|
611
|
+
<span className="label">occurrences</span>
|
|
612
|
+
</div>
|
|
613
|
+
</header>
|
|
614
|
+
<div className="finding-meta">
|
|
615
|
+
<span><span style={{ color: "var(--dim)" }}>policy</span> <span className="policy">{f.policy}</span></span>
|
|
616
|
+
<span className="sep">·</span>
|
|
617
|
+
<span>{f.projects} {f.projects === 1 ? "project" : "projects"}</span>
|
|
618
|
+
<span className="sep">·</span>
|
|
619
|
+
<span>last seen {f.lastSeen}</span>
|
|
620
|
+
</div>
|
|
621
|
+
<div className="finding-body">
|
|
622
|
+
<div className="finding-block">
|
|
623
|
+
<div className="fb-label">what happened</div>
|
|
624
|
+
<div className="fb-body">{f.body}</div>
|
|
625
|
+
</div>
|
|
626
|
+
<div className="finding-block">
|
|
627
|
+
<div className="fb-label cost">what this costs</div>
|
|
628
|
+
<div className="fb-body">{f.costLine}</div>
|
|
629
|
+
</div>
|
|
630
|
+
<div className="finding-block">
|
|
631
|
+
<div className="fb-label">evidence · sample</div>
|
|
632
|
+
<div className="fb-evidence">
|
|
633
|
+
{f.evidence.map((e, i) => {
|
|
634
|
+
if (e.kind === "comment") return <div key={i} className="comment">{e.text}</div>;
|
|
635
|
+
if (e.kind === "err") return <div key={i} className="err">{e.text}</div>;
|
|
636
|
+
return (
|
|
637
|
+
<div key={i}>
|
|
638
|
+
<span className="arrow">→ </span>
|
|
639
|
+
<span>{e.text}</span>
|
|
640
|
+
{e.err && <span className="err">{e.err}</span>}
|
|
641
|
+
{e.comment && <span className="comment">{e.comment}</span>}
|
|
642
|
+
</div>
|
|
643
|
+
);
|
|
644
|
+
})}
|
|
645
|
+
</div>
|
|
646
|
+
</div>
|
|
647
|
+
<div className="finding-block">
|
|
648
|
+
<div className="fb-label fix">the fix</div>
|
|
649
|
+
<div className="fb-fix">
|
|
650
|
+
<span className="slug">{f.fix.slug}</span>
|
|
651
|
+
<div style={{ color: "var(--ink-2)" }}>{f.fix.desc}</div>
|
|
652
|
+
<code className="cmd">
|
|
653
|
+
<span className="prompt">$</span>{f.fix.install}
|
|
654
|
+
</code>
|
|
655
|
+
</div>
|
|
656
|
+
</div>
|
|
657
|
+
</div>
|
|
658
|
+
</article>
|
|
659
|
+
);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
// ============================================================
|
|
663
|
+
// 05 — PRESCRIBED POLICIES
|
|
664
|
+
// ============================================================
|
|
665
|
+
const POLICIES = [
|
|
666
|
+
{ name: "no-redundant-cd", slug: "policies/no-redundant-cd", desc: "blocks cd prefixes when the agent's cwd already matches the target path.", catches: "would have caught 20 occurrences. saves ~3.2k tokens/day." },
|
|
667
|
+
{ name: "block-push-master", slug: "policies/block-push-master", desc: "intercepts pushes to main / master. requires a feature branch + PR.", catches: "would have caught 7 occurrences. 3 of them landed in production." },
|
|
668
|
+
{ name: "block-read-outside-cwd", slug: "policies/block-read-outside-cwd", desc: "denies reads of files outside the project root, including symlinks.", catches: "would have caught 4 occurrences. 3 hit credential files." },
|
|
669
|
+
{ name: "retry-budget", slug: "policies/retry-budget", desc: "caps identical-arg retries at 2. forces a diagnostic step on the third.", catches: "would have caught 6 occurrences. ~1.8k tokens/day saved." },
|
|
670
|
+
{ name: "context-window-guard", slug: "policies/context-window-guard", desc: "warns at 75% context fill. forces summary-and-reset at 90%.", catches: "would have caught 3 occurrences of context bleed." },
|
|
671
|
+
{ name: "verify-after-write", slug: "policies/verify-after-write", desc: "requires a read-back or test run before the agent claims completion.", catches: "would have caught 11 occurrences. 2 silent build breaks." },
|
|
672
|
+
];
|
|
673
|
+
|
|
674
|
+
function PoliciesSection({ projected, projectedGrade }) {
|
|
675
|
+
return (
|
|
676
|
+
<section className="section" data-screen-label="05 Policies">
|
|
677
|
+
<div className="section-mast">
|
|
678
|
+
<div className="section-label">
|
|
679
|
+
<span className="glyph">━━</span> policies <span style={{ color: "var(--dim)" }}>·</span> prescribed
|
|
680
|
+
</div>
|
|
681
|
+
<div className="section-meta">
|
|
682
|
+
{POLICIES.length} policies <span style={{ color: "var(--dim)" }}>·</span> <span className="g">covers 100% of findings</span>
|
|
683
|
+
</div>
|
|
684
|
+
</div>
|
|
685
|
+
<h2 className="section-h">enable these. close the gap.</h2>
|
|
686
|
+
|
|
687
|
+
<div className="policy-callout">
|
|
688
|
+
<span>enable all six</span>
|
|
689
|
+
<span className="arrow">→</span>
|
|
690
|
+
<span>projected score</span>
|
|
691
|
+
<span className="new-score">{projected}</span>
|
|
692
|
+
<span style={{ color: "var(--dim)" }}>·</span>
|
|
693
|
+
<span className="new-tier">{tierName(projectedGrade)}</span>
|
|
694
|
+
</div>
|
|
695
|
+
|
|
696
|
+
<div className="policies-grid">
|
|
697
|
+
{POLICIES.map((p, i) => (
|
|
698
|
+
<article key={p.name} className="policy-card">
|
|
699
|
+
<div className="head">
|
|
700
|
+
<div className="policy-name">{p.name}</div>
|
|
701
|
+
<div className="policy-slug">№{String(i + 1).padStart(2, "0")}</div>
|
|
702
|
+
</div>
|
|
703
|
+
<div className="policy-desc">{p.desc}</div>
|
|
704
|
+
<div className="policy-impact"><span className="check">✓</span>{p.catches}</div>
|
|
705
|
+
<div className="policy-install">
|
|
706
|
+
<span className="prompt">$</span>
|
|
707
|
+
<span>failproof policy add {p.name}</span>
|
|
708
|
+
<span className="copy">copy</span>
|
|
709
|
+
</div>
|
|
710
|
+
</article>
|
|
711
|
+
))}
|
|
712
|
+
</div>
|
|
713
|
+
</section>
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
// ============================================================
|
|
718
|
+
// 06 — NEXT AUDIT / RETURN HOOK
|
|
719
|
+
// ============================================================
|
|
720
|
+
function ReturnSection() {
|
|
721
|
+
return (
|
|
722
|
+
<section className="section" data-screen-label="06 Next audit">
|
|
723
|
+
<div className="section-mast">
|
|
724
|
+
<div className="section-label">
|
|
725
|
+
<span className="glyph">━━</span> next audit <span style={{ color: "var(--dim)" }}>·</span> improvement
|
|
726
|
+
</div>
|
|
727
|
+
<div className="section-meta"><span className="g">●</span> recommended in 7d</div>
|
|
728
|
+
</div>
|
|
729
|
+
<h2 className="section-h">come back better.</h2>
|
|
730
|
+
<div className="return-hook">
|
|
731
|
+
<div className="label">━━ the loop</div>
|
|
732
|
+
<h3>re-audit in 7 days.</h3>
|
|
733
|
+
<p>after the prescribed policies have been live for a week, we'll show your before/after score and which detectors went quiet.</p>
|
|
734
|
+
<p style={{ marginTop: 16, color: "var(--dim)" }}>most agents move from C to B in one session. some make it in a day.</p>
|
|
735
|
+
<div className="return-actions">
|
|
736
|
+
<button className="share-btn">[ set a reminder ]</button>
|
|
737
|
+
<button className="share-btn alt">[ install all 6 policies ]</button>
|
|
738
|
+
</div>
|
|
739
|
+
</div>
|
|
740
|
+
</section>
|
|
741
|
+
);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// ============================================================
|
|
745
|
+
// FOOTER
|
|
746
|
+
// ============================================================
|
|
747
|
+
function ReportFooter() {
|
|
748
|
+
return (
|
|
749
|
+
<footer className="report-footer">
|
|
750
|
+
<span className="brand-mark">▮▮</span> failproof_ai
|
|
751
|
+
<span style={{ margin: "0 12px", color: "var(--line-2)" }}>·</span>
|
|
752
|
+
audit v1.0
|
|
753
|
+
<span style={{ margin: "0 12px", color: "var(--line-2)" }}>·</span>
|
|
754
|
+
generated 26 may 2026, 14:32 utc
|
|
755
|
+
<span style={{ margin: "0 12px", color: "var(--line-2)" }}>·</span>
|
|
756
|
+
<span style={{ color: "var(--ink-2)" }}>auto-healing for your agents.</span>
|
|
757
|
+
</footer>
|
|
758
|
+
);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
// ============================================================
|
|
762
|
+
// TWEAKS
|
|
763
|
+
// ============================================================
|
|
764
|
+
function ReportTweaks({ t, setTweak, projected, projectedGrade }) {
|
|
765
|
+
const { TweaksPanel, TweakSection, TweakRadio, TweakSelect, TweakSlider, TweakToggle, TweakText, TweakButton } = window;
|
|
766
|
+
if (!TweaksPanel) return null;
|
|
767
|
+
return (
|
|
768
|
+
<TweaksPanel title="tweaks">
|
|
769
|
+
<TweakSection label="archetype" />
|
|
770
|
+
<TweakSelect
|
|
771
|
+
label="archetype"
|
|
772
|
+
value={t.archetype}
|
|
773
|
+
onChange={(v) => setTweak("archetype", v)}
|
|
774
|
+
options={ARCHETYPE_ORDER.map((k) => ({ value: k, label: ARCHETYPES[k].name }))}
|
|
775
|
+
/>
|
|
776
|
+
<TweakToggle
|
|
777
|
+
label="secondary trait"
|
|
778
|
+
value={t.showSecondary}
|
|
779
|
+
onChange={(v) => setTweak("showSecondary", v)}
|
|
780
|
+
/>
|
|
781
|
+
|
|
782
|
+
<TweakSection label="score & cohort" />
|
|
783
|
+
<TweakSlider
|
|
784
|
+
label={"score (" + gradeFor(t.score) + " tier)"}
|
|
785
|
+
value={t.score}
|
|
786
|
+
min={0}
|
|
787
|
+
max={100}
|
|
788
|
+
step={1}
|
|
789
|
+
onChange={(v) => setTweak("score", v)}
|
|
790
|
+
/>
|
|
791
|
+
<TweakSlider
|
|
792
|
+
label="your rank"
|
|
793
|
+
value={t.rank}
|
|
794
|
+
min={1}
|
|
795
|
+
max={t.cohort}
|
|
796
|
+
step={1}
|
|
797
|
+
onChange={(v) => setTweak("rank", v)}
|
|
798
|
+
/>
|
|
799
|
+
<TweakSlider
|
|
800
|
+
label="cohort size"
|
|
801
|
+
value={t.cohort}
|
|
802
|
+
min={500}
|
|
803
|
+
max={20000}
|
|
804
|
+
step={100}
|
|
805
|
+
onChange={(v) => setTweak("cohort", v)}
|
|
806
|
+
/>
|
|
807
|
+
|
|
808
|
+
<TweakSection label="share" />
|
|
809
|
+
<TweakText
|
|
810
|
+
label="project / agent"
|
|
811
|
+
value={t.project}
|
|
812
|
+
onChange={(v) => setTweak("project", v)}
|
|
813
|
+
/>
|
|
814
|
+
|
|
815
|
+
<TweakSection label="projected" />
|
|
816
|
+
<div style={{ fontFamily: "var(--font-mono)", fontSize: 11, color: "rgba(41,38,27,.7)", lineHeight: 1.6, padding: "4px 0" }}>
|
|
817
|
+
enable all 6 → <strong style={{ color: "rgba(41,38,27,.95)" }}>{projected}</strong> · {tierName(projectedGrade)}
|
|
818
|
+
</div>
|
|
819
|
+
</TweaksPanel>
|
|
820
|
+
);
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
// ---------- mount ----------
|
|
824
|
+
const root = ReactDOM.createRoot(document.getElementById("root"));
|
|
825
|
+
root.render(<App />);
|