failproofai 1.0.4-beta.8 → 1.0.5-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +5 -5
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  6. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js +2 -2
  8. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  12. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  13. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  14. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  18. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.rsc +14 -14
  22. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
  23. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +13 -13
  24. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/audit/run/route.js +4 -4
  27. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -1
  34. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +2 -2
  36. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +4 -37
  37. package/.next/standalone/.next/server/app/audit/page.js +2 -2
  38. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/index.html +1 -1
  41. package/.next/standalone/.next/server/app/index.rsc +14 -14
  42. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +13 -13
  43. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +14 -14
  44. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  46. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  47. package/.next/standalone/.next/server/app/page.js +2 -2
  48. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
  51. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  52. package/.next/standalone/.next/server/app/policies/page.js +4 -4
  53. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
  56. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  57. package/.next/standalone/.next/server/app/project/[name]/page.js +4 -4
  58. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
  61. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  62. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  63. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +5 -5
  64. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
  67. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  68. package/.next/standalone/.next/server/app/projects/page.js +3 -3
  69. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +2 -2
  72. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -15
  73. package/.next/standalone/.next/server/app/settings/page.js +4 -4
  74. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/chunks/{[externals]__0hmcwgg._.js → [externals]__0-9ti7z._.js} +1 -1
  77. package/.next/standalone/.next/server/chunks/{[externals]__14b7cc6._.js → [externals]__0u3wrvq._.js} +1 -1
  78. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-219ec._.js +3 -0
  79. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04_h-a5._.js +3 -0
  80. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08dchfu._.js +1 -1
  81. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
  82. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +1 -1
  83. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +1 -1
  84. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1le9jqc._.js +3 -0
  85. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1p-qi2t._.js +5 -0
  87. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
  88. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
  89. package/.next/standalone/.next/server/chunks/{_1_eakl4._.js → _1-akg6w._.js} +2 -2
  90. package/.next/standalone/.next/server/chunks/_1ek68ln._.js +10 -10
  91. package/.next/standalone/.next/server/chunks/_1vslkoe._.js +1 -1
  92. package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +1 -1
  93. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  94. package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +1 -1
  95. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__187jks6._.js → [root-of-the-server]__00-s7h8._.js} +1 -1
  96. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__04px77e._.js → [root-of-the-server]__013jr2b._.js} +3 -3
  97. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0i0l1di._.js → [root-of-the-server]__01wy8d-._.js} +3 -3
  98. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0r3c1_0._.js → [root-of-the-server]__02npjtd._.js} +3 -3
  99. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1ckpmkk._.js → [root-of-the-server]__0da85px._.js} +3 -3
  100. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__17xnxlx._.js → [root-of-the-server]__0ftmoxc._.js} +3 -3
  101. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0kokc8z._.js → [root-of-the-server]__0n_lxhg._.js} +1 -1
  102. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +1 -1
  103. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0-4ja6q._.js → [root-of-the-server]__0p-5p8u._.js} +3 -3
  104. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0egr5s1._.js → [root-of-the-server]__0s740oi._.js} +3 -3
  105. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1fa1jd9._.js → [root-of-the-server]__0x1aj1_._.js} +2 -2
  106. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1kpd1za._.js → [root-of-the-server]__190won8._.js} +1 -1
  107. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ctpynv._.js +3 -0
  108. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1nq7ivq._.js +3 -0
  109. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__00cr3xu._.js → [root-of-the-server]__1p2otjt._.js} +3 -3
  110. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__00y9ww2._.js → [root-of-the-server]__1sc84bb._.js} +2 -21
  111. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  112. package/.next/standalone/.next/server/chunks/ssr/{_0s-77v5._.js → _0h_douw._.js} +1 -1
  113. package/.next/standalone/.next/server/chunks/ssr/{_00bqkhj._.js → _0u3xxgc._.js} +2 -2
  114. package/.next/standalone/.next/server/chunks/ssr/_0zs_4uu._.js +3 -0
  115. package/.next/standalone/.next/server/chunks/ssr/_1_ozgif._.js +1 -1
  116. package/.next/standalone/.next/server/chunks/ssr/_1ddpc5g._.js +1 -1
  117. package/.next/standalone/.next/server/chunks/ssr/_1es2j7i._.js +14 -51
  118. package/.next/standalone/.next/server/chunks/ssr/{_14c6q09._.js → _1if9ixi._.js} +2 -21
  119. package/.next/standalone/.next/server/chunks/ssr/{_07t3jol._.js → _1u8-lu2._.js} +2 -2
  120. package/.next/standalone/.next/server/chunks/ssr/_1ylae7o._.js +3 -0
  121. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +3 -0
  122. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
  123. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +69 -1
  124. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  125. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  126. package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
  127. package/.next/standalone/.next/server/chunks/ssr/lib_openclaw-projects_ts_0qxq3bp._.js +1 -1
  128. package/.next/standalone/.next/server/chunks/ssr/node_modules_13n822a._.js +1 -1
  129. package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_1ao30b1.js +3 -0
  130. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  131. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +1 -1
  132. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +1 -1
  133. package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
  134. package/.next/standalone/.next/server/pages/404.html +1 -1
  135. package/.next/standalone/.next/server/pages/500.html +1 -1
  136. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/server-reference-manifest.json +21 -65
  138. package/.next/standalone/.next/static/chunks/0hw6-c206lsma.js +1 -0
  139. package/.next/standalone/.next/static/chunks/{2mizt96igig1y.js → 0m9sx3khjrl1q.js} +1 -1
  140. package/.next/standalone/.next/static/chunks/{1302duobnz07l.js → 0oos8qpc1ugos.js} +1 -1
  141. package/.next/standalone/.next/static/chunks/0u64yey446k4f.css +1 -0
  142. package/.next/standalone/.next/static/chunks/{2ukucf6g-kbs5.js → 0unrx9g_x0u7j.js} +1 -1
  143. package/.next/standalone/.next/static/chunks/{0jpd8dv2vk930.css → 29-iqnp9v_axt.css} +1 -1
  144. package/.next/standalone/.next/static/chunks/{3uyhmm01g64k4.css → 2k9f4tyv04809.css} +0 -1
  145. package/.next/standalone/.next/static/chunks/{0vm4wdx3w-2_w.js → 2qjn-leir0x_s.js} +1 -1
  146. package/.next/standalone/.next/static/chunks/{1chm9piluggc-.js → 2xbxkaszi1xnw.js} +1 -1
  147. package/.next/standalone/.next/static/chunks/{2n85g-crgcx5j.js → 33umhy-x204qj.js} +2 -2
  148. package/.next/standalone/.next/static/chunks/3nux7kkrc3eps.js +69 -0
  149. package/.next/standalone/.next/static/chunks/3qfoeqhy5l10x.js +1 -0
  150. package/.next/standalone/.next/static/chunks/3zkg2s2vzxc3d.js +1 -0
  151. package/.next/standalone/.next/static/chunks/{3a4gth64hwtwf.js → 40tpgs4fjct5p.js} +1 -1
  152. package/.next/standalone/.next/static/chunks/{1_x7pqemw5n_w.js → 40uih96wnkowy.js} +1 -1
  153. package/.next/standalone/.next/static/chunks/{turbopack-3s3c-u_u_l0u9.js → turbopack-3p73obe0xmrxm.js} +1 -1
  154. package/.next/standalone/.opencode/plugins/failproofai.mjs +27 -51
  155. package/.next/standalone/app/actions/get-scheduled-audit.ts +0 -5
  156. package/.next/standalone/app/actions/update-scheduled-audit.ts +57 -18
  157. package/.next/standalone/app/api/auth/status/route.ts +2 -3
  158. package/.next/standalone/app/audit/_components/audit-dashboard.tsx +34 -140
  159. package/.next/standalone/app/audit/_components/audit-poster.tsx +10 -29
  160. package/.next/standalone/app/audit/_components/come-back-better-section.tsx +1 -6
  161. package/.next/standalone/app/audit/_components/empty-state.tsx +1 -4
  162. package/.next/standalone/app/audit/_components/how-to-improve-section.tsx +5 -19
  163. package/.next/standalone/app/audit/_components/share-templates.ts +44 -110
  164. package/.next/standalone/app/audit/audit-styles.css +1 -132
  165. package/.next/standalone/app/settings/page.tsx +1 -1
  166. package/.next/standalone/app/settings/settings-client.tsx +45 -50
  167. package/.next/standalone/lib/auth/api-server-client.ts +5 -33
  168. package/.next/standalone/lib/claude-sessions.ts +27 -101
  169. package/.next/standalone/lib/codex-sessions.ts +4 -20
  170. package/.next/standalone/lib/copilot-sessions.ts +1 -32
  171. package/.next/standalone/lib/cursor-sessions.ts +5 -62
  172. package/.next/standalone/lib/download-session.ts +13 -58
  173. package/.next/standalone/lib/openclaw-projects.ts +18 -54
  174. package/.next/standalone/lib/openclaw-sessions.ts +17 -75
  175. package/.next/standalone/lib/sqlite-reader.ts +1 -78
  176. package/.next/standalone/package.json +9 -9
  177. package/.next/standalone/sdk/python/CHANGELOG.md +32 -9
  178. package/.next/standalone/sdk/python/failproofai_sdk/_events.py +20 -0
  179. package/.next/standalone/sdk/python/failproofai_sdk/_redact.py +233 -0
  180. package/.next/standalone/sdk/python/failproofai_sdk/_writer.py +4 -1
  181. package/.next/standalone/sdk/python/failproofai_sdk/integrations/llama_index.py +5 -5
  182. package/.next/standalone/sdk/python/tests/integrations/test_llama_index.py +2 -2
  183. package/.next/standalone/sdk/python/tests/test_redaction.py +140 -0
  184. package/.next/standalone/sdk/python/tests/test_sdk.py +87 -0
  185. package/.next/standalone/sdk/python/tests/test_server_contract.py +60 -0
  186. package/.next/standalone/sdk/python/tests/test_site_docs.py +2 -2
  187. package/.next/standalone/server.js +1 -1
  188. package/bin/failproofai.mjs +1 -1
  189. package/dist/cli.mjs +664 -2121
  190. package/dist/worker.mjs +105 -422
  191. package/lib/auth/api-server-client.ts +5 -33
  192. package/lib/claude-sessions.ts +27 -101
  193. package/lib/codex-sessions.ts +4 -20
  194. package/lib/copilot-sessions.ts +1 -32
  195. package/lib/cursor-sessions.ts +5 -62
  196. package/lib/download-session.ts +13 -58
  197. package/lib/openclaw-projects.ts +18 -54
  198. package/lib/openclaw-sessions.ts +17 -75
  199. package/lib/sqlite-reader.ts +1 -78
  200. package/package.json +9 -9
  201. package/pi-extension/index.ts +5 -50
  202. package/src/audit/cache.ts +0 -6
  203. package/src/audit/cli-adapters/claude.ts +0 -13
  204. package/src/audit/cli-login.ts +1 -4
  205. package/src/audit/cli.ts +7 -157
  206. package/src/audit/harm-report.ts +4 -111
  207. package/src/audit/index.ts +15 -286
  208. package/src/audit/machine-store.ts +9 -8
  209. package/src/audit/redact-example.ts +15 -324
  210. package/src/audit/report-harm.ts +37 -33
  211. package/src/audit/report.ts +3 -6
  212. package/src/audit/schedule-cli.ts +33 -54
  213. package/src/audit/scoring.ts +0 -49
  214. package/src/audit/types.ts +0 -52
  215. package/src/hooks/builtin-policies.ts +2 -67
  216. package/src/hooks/configure-wizard.ts +0 -55
  217. package/src/hooks/fp-config.ts +48 -83
  218. package/src/hooks/fp-home.ts +0 -27
  219. package/src/hooks/integrations.ts +14 -51
  220. package/src/hooks/uninstall-cli.ts +2 -17
  221. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0faqz9x._.js +0 -22
  222. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zyc_nm._.js +0 -3
  223. package/.next/standalone/.next/server/chunks/[root-of-the-server]__112b4go._.js +0 -24
  224. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1l71g3y._.js +0 -22
  225. package/.next/standalone/.next/server/chunks/lib_openclaw-projects_ts_0gc-p24._.js +0 -3
  226. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n2txhk._.js +0 -3
  227. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1kaotix._.js +0 -22
  228. package/.next/standalone/.next/server/chunks/ssr/_04ng_6x._.js +0 -3
  229. package/.next/standalone/.next/server/chunks/ssr/_0l2hi_d._.js +0 -3
  230. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_rerun-button_tsx_0blihgw._.js +0 -3
  231. package/.next/standalone/.next/static/chunks/0igq884ziuv-8.js +0 -1
  232. package/.next/standalone/.next/static/chunks/349jkb79v5g6z.js +0 -1
  233. package/.next/standalone/app/actions/get-leaks.ts +0 -104
  234. package/.next/standalone/app/audit/_components/leak-section.tsx +0 -192
  235. package/.next/standalone/lib/openclaw-db.ts +0 -271
  236. package/lib/openclaw-db.ts +0 -271
  237. package/src/audit/desktop-notify.ts +0 -420
  238. package/src/audit/leak-fingerprint.ts +0 -198
  239. package/src/audit/leak-record.ts +0 -248
  240. package/src/audit/leak-scan.ts +0 -268
  241. package/src/audit/leak-store.ts +0 -220
  242. package/src/audit/macos-notifier.ts +0 -298
  243. package/src/hooks/notice.ts +0 -24
  244. /package/.next/standalone/.next/static/{DNhaAH8iPGH0tIuxee5_2 → 4_QeL7mSPYsuiSVJmBOTj}/_buildManifest.js +0 -0
  245. /package/.next/standalone/.next/static/{DNhaAH8iPGH0tIuxee5_2 → 4_QeL7mSPYsuiSVJmBOTj}/_clientMiddlewareManifest.js +0 -0
  246. /package/.next/standalone/.next/static/{DNhaAH8iPGH0tIuxee5_2 → 4_QeL7mSPYsuiSVJmBOTj}/_ssgManifest.js +0 -0
@@ -24,12 +24,7 @@
24
24
  import React, { forwardRef, useMemo, useState } from "react";
25
25
  import { pickArchetypeVariant, type ArchetypeKey } from "@/src/audit/archetypes";
26
26
  import { type Grade } from "@/src/audit/scoring";
27
- // Archetype rarity switched off — the percentages are eight hardcoded integers
28
- // ("Seeded with snapshot values; swap for live aggregates once that pipeline
29
- // lands"), and this is the ONLY surface that rendered them: baked by
30
- // html-to-image into the PNG people post publicly. A fabricated population
31
- // statistic on a shared card is a claim we cannot support.
32
- // import { getArchetypeRarityPct } from "@/src/audit/social-proof";
27
+ import { getArchetypeRarityPct } from "@/src/audit/social-proof";
33
28
  import { copyOrDownloadCard, downloadCard, shareCardNative, shareCardToastMessage } from "@/lib/share-card";
34
29
  import { toast } from "@/app/components/toast";
35
30
  import { usePostHog } from "@/contexts/PostHogContext";
@@ -50,11 +45,8 @@ interface Props {
50
45
  archetypeKey: ArchetypeKey;
51
46
  /** Stable seed for variant selection (project name is the natural fit). */
52
47
  seed: string;
53
- /** The score is switched off (see `src/audit/scoring.ts`). Kept as optional
54
- * props rather than removed, so restoring is un-commenting rather than
55
- * re-threading: the dashboard simply stops passing them. */
56
- score?: number;
57
- grade?: Grade;
48
+ score: number;
49
+ grade: Grade;
58
50
  /** Count of unenabled prescribed policies — passed to the share-text
59
51
  * templates, not rendered on the poster itself. */
60
52
  missing: number;
@@ -71,7 +63,7 @@ export const AuditPoster = forwardRef<HTMLDivElement, Props>(function AuditPoste
71
63
  () => pickArchetypeVariant(archetypeKey, seed),
72
64
  [archetypeKey, seed],
73
65
  );
74
- // const rarityPct = getArchetypeRarityPct(archetypeKey);
66
+ const rarityPct = getArchetypeRarityPct(archetypeKey);
75
67
  const indexLabel = String(archetype.index).padStart(2, "0");
76
68
  const auditedDate = useMemo(() => formatAuditedDate(auditedAt), [auditedAt]);
77
69
 
@@ -142,11 +134,8 @@ export const AuditPoster = forwardRef<HTMLDivElement, Props>(function AuditPoste
142
134
  }
143
135
  };
144
136
 
145
- // Score switched off — the filename is keyed on the archetype instead, which
146
- // is what the card now actually shows. Original:
147
- // `failproofai-${channel}-${grade.toLowerCase()}-${score}.png`
148
137
  const filenameFor = (channel: "x" | "linkedin" | "download") =>
149
- `failproofai-${channel}-${archetypeKey}.png`;
138
+ `failproofai-${channel}-${grade.toLowerCase()}-${score}.png`;
150
139
 
151
140
  const handleShare = async (channel: "x" | "linkedin" | "download") => {
152
141
  if (busy) return;
@@ -154,11 +143,8 @@ export const AuditPoster = forwardRef<HTMLDivElement, Props>(function AuditPoste
154
143
  capture("audit_card_share_clicked", {
155
144
  channel,
156
145
  source: "poster",
157
- // Score switched off — see `src/audit/scoring.ts`. Note for whoever reads
158
- // the funnel: these two properties stop appearing from this release, so a
159
- // dashboard keyed on them breaks rather than reading zero.
160
- // score,
161
- // grade,
146
+ score,
147
+ grade,
162
148
  missing_policies: missing,
163
149
  });
164
150
  try {
@@ -188,10 +174,10 @@ export const AuditPoster = forwardRef<HTMLDivElement, Props>(function AuditPoste
188
174
  }
189
175
 
190
176
  const shareCtx: ShareCtx = {
177
+ score,
191
178
  arch: archetype.name.toLowerCase(),
179
+ grade,
192
180
  missing,
193
- // score,
194
- // grade,
195
181
  };
196
182
  const shareText = channel === "x"
197
183
  ? pickTemplate(X_TEMPLATES, seed, shareCtx)
@@ -262,7 +248,6 @@ export const AuditPoster = forwardRef<HTMLDivElement, Props>(function AuditPoste
262
248
  </React.Fragment>
263
249
  ))}
264
250
  </div>
265
- {/* Rarity switched off — see the import above.
266
251
  {typeof rarityPct === "number" && (
267
252
  <div className="persona-rarity">
268
253
  <span className="lbl">{"// only"}</span>{" "}
@@ -270,17 +255,13 @@ export const AuditPoster = forwardRef<HTMLDivElement, Props>(function AuditPoste
270
255
  <span className="lbl">of agents are this archetype</span>
271
256
  </div>
272
257
  )}
273
- */}
274
258
  </div>
275
259
 
276
- {/* Score block — heroic number, centered in the card. Switched off;
277
- see `src/audit/scoring.ts` for why. The archetype is the card's
278
- headline now.
260
+ {/* Score block — heroic number, centered in the card */}
279
261
  <div className="poster-score">
280
262
  <span className="score-n">{score}</span>
281
263
  <span className="score-of">/100</span>
282
264
  </div>
283
- */}
284
265
  </div>
285
266
 
286
267
  <footer className="poster-foot">
@@ -21,12 +21,7 @@ import { AuthDialog, type AuthedUser } from "./auth-dialog";
21
21
  import { InviteDialog } from "./invite-dialog";
22
22
 
23
23
  interface Props {
24
- /** Current audit score (0–100), forwarded into the invite email body.
25
- *
26
- * Always undefined while the score is switched off (see
27
- * `src/audit/scoring.ts`) — the dashboard no longer passes it. Nothing
28
- * breaks: `/api/audit/invite` already treats it as optional and simply
29
- * leaves it out of the email body when it is not a finite number. */
24
+ /** Current audit score (0–100), forwarded into the invite email body. */
30
25
  score?: number;
31
26
  }
32
27
 
@@ -74,10 +74,7 @@ export function EmptyState({ mode, running, onStarted, onCompleted }: Props) {
74
74
  <p className="empty-sub">
75
75
  we&apos;ll walk every transcript across your installed CLIs — Claude Code,
76
76
  Codex, Copilot, Cursor, OpenCode, Pi — and count every wasteful
77
- {/* Was "a tier, a score, and a punch-list" — the tier was never
78
- rendered and the score is switched off, so this promised two
79
- things the page did not show. */}
80
- or risky action. you&apos;ll get a leak report and a scan summary.
77
+ or risky action. you&apos;ll get a tier, a score, and a punch-list.
81
78
  </p>
82
79
 
83
80
  <div className="empty-actions">
@@ -12,18 +12,13 @@
12
12
  */
13
13
  import { useMemo, useState } from "react";
14
14
  import type { AuditResult } from "@/src/audit/types";
15
- // Score switched off — see `src/audit/scoring.ts`.
16
- // import { type Grade, tierName } from "@/src/audit/scoring";
17
- import type { Grade } from "@/src/audit/scoring";
15
+ import { type Grade, tierName } from "@/src/audit/scoring";
18
16
  import { usePostHog } from "@/contexts/PostHogContext";
19
17
 
20
18
  interface Props {
21
19
  result: AuditResult;
22
- /** The projection is switched off — see `src/audit/scoring.ts`. Optional
23
- * rather than removed so restoring it is un-commenting the two lines in
24
- * `audit-dashboard.tsx` and the sub-heading below. */
25
- projected?: number;
26
- projectedGrade?: Grade;
20
+ projected: number;
21
+ projectedGrade: Grade;
27
22
  }
28
23
 
29
24
  const DETECTOR_TO_PRIMARY_POLICY: Record<string, string> = {
@@ -104,7 +99,7 @@ function bulkInstall(fixes: FixRow[]): string {
104
99
  return `failproofai policies --install ${fixes.map((f) => f.name).join(" ")}`;
105
100
  }
106
101
 
107
- export function HowToImproveSection({ result }: Props) {
102
+ export function HowToImproveSection({ result, projected, projectedGrade }: Props) {
108
103
  const { capture } = usePostHog();
109
104
  const fixes = useMemo(() => buildFixes(result), [result]);
110
105
  const installAllCmd = useMemo(() => bulkInstall(fixes), [fixes]);
@@ -141,18 +136,9 @@ export function HowToImproveSection({ result }: Props) {
141
136
  </button>
142
137
  </div>
143
138
  <h2 className="audit-sec-title">install or configure</h2>
144
- {/* The projected-score clause is switched off. It was also the one place
145
- the product promised a number it could not deliver: `deriveScore`
146
- never read `enabledInConfig`, so taking this prescription and
147
- re-running returned the SAME score with the projection gone. What
148
- replaces it is the thing that was always true — one command, enforced
149
- on every tool call. Original:
139
+ <div className="audit-sec-sub">
150
140
  enable all {fixes.length === 1 ? "one" : fixes.length} → projected{" "}
151
141
  <strong>{projected}</strong> · {tierName(projectedGrade).toLowerCase()}
152
- */}
153
- <div className="audit-sec-sub">
154
- enable all {fixes.length === 1 ? "one" : fixes.length} → one command,
155
- enforced on every tool call
156
142
  </div>
157
143
 
158
144
  <div className="fix-list">
@@ -7,31 +7,20 @@
7
7
  * appends a clipboard paste hint. Pure — no React, no DOM — so it's
8
8
  * unit-testable and shared by the client poster component.
9
9
  *
10
- * ## The score is switched off (2026-09-07)
11
- *
12
- * Every template but one used to interpolate `${score}/100`. The score is
13
- * commented out across the audit — see the header of `src/audit/scoring.ts` for
14
- * why — so the copy is archetype-only. Eighteen templates lost a subordinate
15
- * clause; two whose entire premise WAS the number ("my agent scored X/100,
16
- * think yours can beat it?") are commented out in place rather than reworded,
17
- * because there is nothing left of them once the number goes.
18
- *
19
- * `ShareCtx.score` is kept and still populated so restoring is re-adding the
20
- * clause, not re-plumbing the type. The originals are preserved verbatim in the
21
- * block at the bottom of this file.
10
+ * Each template references the score and/or archetype and ends on the
11
+ * install-free CTA + handle. We intentionally never include a URL: a bare link
12
+ * would make X/LinkedIn render a link-preview card and swallow the copied
13
+ * image. The npx command is the call to action instead.
22
14
  */
23
15
  import type { Grade } from "@/src/audit/scoring";
24
16
 
25
17
  export interface ShareCtx {
18
+ score: number;
26
19
  /** Lowercased archetype name, e.g. "the cowboy". */
27
20
  arch: string;
21
+ grade: Grade;
28
22
  /** Count of unenabled prescribed policies. */
29
23
  missing: number;
30
- /** Optional ONLY because the score is switched off and nothing upstream
31
- * computes them any more. Restoring the score means making these required
32
- * again — which the compiler will then walk you through. */
33
- score?: number;
34
- grade?: Grade;
35
24
  }
36
25
 
37
26
  /** Call-to-action + handle per channel. No URL by design (see file header). */
@@ -44,107 +33,52 @@ const PASTE_LINE = "[ audit card copied to your clipboard — paste it into the
44
33
 
45
34
  /** Short, curiosity-forward — for X / Twitter. Ends on the npx CTA + @failproofai. */
46
35
  export const X_TEMPLATES: ((c: ShareCtx) => string)[] = [
47
- ({ arch }) =>
48
- `my agent has a personality and it's ${arch}. did not see that coming.\n\nran a failproof audit, all local. find out what yours is → ${X_CTA}`,
49
- ({ arch }) =>
50
- `spent 30 seconds auditing my agent. learned more about it than i did all month.\n\nit's ${arch}. → ${X_CTA}`,
51
- // Score-spined — nothing survives removing the number:
52
- // ({ score }) =>
53
- // `my agent scored ${score}/100. think yours can beat it?\n\n30 sec audit, runs locally, gives you a personality too → ${X_CTA}`,
36
+ ({ score, arch }) =>
37
+ `my agent has a personality and it's ${arch}. did not see that coming.\n\nran a failproof audit, scored ${score}/100, all local. find out what yours is → ${X_CTA}`,
38
+ ({ score, arch }) =>
39
+ `spent 30 seconds auditing my agent. learned more about it than i did all month.\n\nit's ${arch}. scored ${score}/100. → ${X_CTA}`,
40
+ ({ score }) =>
41
+ `my agent scored ${score}/100. think yours can beat it?\n\n30 sec audit, runs locally, gives you a personality too → ${X_CTA}`,
54
42
  ({ arch }) =>
55
43
  `turns out my agent is ${arch} and honestly it explains everything.\n\n→ ${X_CTA}`,
56
- ({ arch }) =>
57
- `ran a failproof audit on my agent. it reads how it actually behaves when things break, not just the happy path.\n\npersonality: ${arch}. all local → ${X_CTA}`,
58
- ({ arch }) =>
59
- `got to know my agent today. it's ${arch}. wow.\n\naudit yours in 30s, nothing leaves your machine → ${X_CTA}`,
60
- ({ arch }) =>
61
- `your agent has a personality. you just haven't met it.\n\ni met mine today: ${arch}. → ${X_CTA}`,
62
- ({ arch }) =>
63
- `everyone talks about what their agent can build. nobody talks about how it acts when it breaks.\n\nmine's ${arch}, all local → ${X_CTA}`,
64
- ({ arch }) =>
65
- `every agent builder should run this once.\n\n30 sec, local, gives your agent a personality. mine: ${arch}.\n\n${X_CTA}`,
66
- ({ arch }) =>
67
- `i'll go first: ${arch}.\n\nwhat's your agent? 30 sec audit, no signup → ${X_CTA}`,
44
+ ({ score, arch }) =>
45
+ `ran a failproof audit on my agent. it reads how it actually behaves when things break, not just the happy path.\n\npersonality: ${arch}. score: ${score}/100. all local → ${X_CTA}`,
46
+ ({ score, arch }) =>
47
+ `got to know my agent today. it's ${arch} and scored ${score}/100. wow.\n\naudit yours in 30s, nothing leaves your machine → ${X_CTA}`,
48
+ ({ score, arch }) =>
49
+ `your agent has a personality. you just haven't met it.\n\ni met mine today: ${arch}, ${score}/100. → ${X_CTA}`,
50
+ ({ score, arch }) =>
51
+ `everyone talks about what their agent can build. nobody talks about how it acts when it breaks.\n\nmine's ${arch}, scored ${score}/100, all local → ${X_CTA}`,
52
+ ({ score, arch }) =>
53
+ `every agent builder should run this once.\n\n30 sec, local, gives your agent a personality and a quality score. mine: ${arch}, ${score}/100.\n\n${X_CTA}`,
54
+ ({ score, arch }) =>
55
+ `i'll go first: ${arch}, ${score}/100.\n\nwhat's your agent? 30 sec audit, no signup → ${X_CTA}`,
68
56
  ];
69
57
 
70
58
  /** Longer, reflective — for LinkedIn. Ends on the npx CTA + @Failproof AI. */
71
59
  export const LI_TEMPLATES: ((c: ShareCtx) => string)[] = [
72
- ({ arch }) =>
73
- `I've spent more hours with my agent this month than with most people I know. Today I realized I couldn't tell you a single thing about how it actually behaves.\n\nSo I audited it. Turns out it's ${arch}.\n\nThe audit reads its real history, including how it handles failures, not just the clean runs. 30 seconds, runs entirely locally.\n\nMeet yours: ${LI_CTA}`,
74
- ({ arch }) =>
75
- `Took a personality test today. It wasn't for me — it was for my AI agent.\n\nThe result: ${arch}.\n\nIt works by reading the agent's actual run history, so the personality comes from how it really behaves, not a vibe. Took 30 seconds and stayed local.\n\nTry it on yours: ${LI_CTA}`,
76
- ({ arch }) =>
77
- `Everyone asks what their AI agent can build. I just found out mine has a temper.\n\nAfter watching how it reacts to a failed command, the audit called it ${arch}.\n\nOddly useful to see it written down. 30 seconds, all local: ${LI_CTA}`,
78
- ({ arch }) =>
79
- `My agent does this very specific thing every time a command fails. Today I learned there's basically a name for it.\n\nRan a quick audit and it came back ${arch}. The whole read is based on how the agent handles things going wrong, which is where its real character shows.\n\n30 seconds, nothing leaves your machine: ${LI_CTA}`,
80
- // Score-spined — the opening line is the number:
81
- // ({ score, arch }) =>
82
- // `My AI agent scored ${score}/100 today. I didn't know you could even measure that.\n\nThe same audit also handed it a personality: ${arch}.\n\nIt reads the agent's real history and tells you where it's solid and where it slips. Took 30 seconds and ran fully locally: ${LI_CTA}`,
83
- ({ arch }) =>
84
- `I'm usually the first to scroll past "audit your X" tools. This one took 30 seconds and actually told me something.\n\nMy agent is ${arch}.\n\nIt reads the agent's real run history rather than asking me anything, and none of it leaves the machine: ${LI_CTA}`,
85
- ({ arch }) =>
86
- `What is your agent's personality? I realized today that I had no answer.\n\nSo I checked. Mine is ${arch}, with a clear read on where it shines and where it slips.\n\nIf you work with agents, run it and drop yours in the comments. 30 seconds, fully local: ${LI_CTA}`,
87
- ({ arch }) =>
88
- `I trusted my agent a little less after this morning, and quite a bit more by the afternoon.\n\nI ran an audit on it. It showed me exactly where it's reliable and where it isn't, and gave it a personality: ${arch}.\n\nKnowing the gaps is what made me trust it more. 30 seconds, all local: ${LI_CTA}`,
89
- ({ arch }) =>
90
- `I almost skipped this because I assumed it would quietly ship my code off somewhere. It doesn't. Everything runs locally.\n\n30 seconds later I had my agent's personality: ${arch}.\n\nIf privacy is usually what stops you from trying these, this one is different: ${LI_CTA}`,
91
- ({ arch }) =>
92
- `Found out my AI agent has a personality type. Found out it's ${arch}. Found out that explains a lot.\n\nThe audit reads how the agent handles failures, not just the runs where everything goes fine.\n\n30 seconds, runs locally: ${LI_CTA}`,
60
+ ({ score, arch }) =>
61
+ `I've spent more hours with my agent this month than with most people I know. Today I realized I couldn't tell you a single thing about how it actually behaves.\n\nSo I audited it. Turns out it's ${arch}, and it scored ${score}/100.\n\nThe audit reads its real history, including how it handles failures, not just the clean runs. 30 seconds, runs entirely locally.\n\nMeet yours: ${LI_CTA}`,
62
+ ({ score, arch }) =>
63
+ `Took a personality test today. It wasn't for me — it was for my AI agent.\n\nThe result: ${arch}, with a quality score of ${score}/100.\n\nIt works by reading the agent's actual run history, so the personality comes from how it really behaves, not a vibe. Took 30 seconds and stayed local.\n\nTry it on yours: ${LI_CTA}`,
64
+ ({ score, arch }) =>
65
+ `Everyone asks what their AI agent can build. I just found out mine has a temper.\n\nAfter watching how it reacts to a failed command, the audit called it ${arch}. It also scored its quality at ${score}/100.\n\nOddly useful to see it written down. 30 seconds, all local: ${LI_CTA}`,
66
+ ({ score, arch }) =>
67
+ `My agent does this very specific thing every time a command fails. Today I learned there's basically a name for it.\n\nRan a quick audit and it came back ${arch}, scored ${score}/100. The whole read is based on how the agent handles things going wrong, which is where its real character shows.\n\n30 seconds, nothing leaves your machine: ${LI_CTA}`,
68
+ ({ score, arch }) =>
69
+ `My AI agent scored ${score}/100 today. I didn't know you could even measure that.\n\nThe same audit also handed it a personality: ${arch}.\n\nIt reads the agent's real history and tells you where it's solid and where it slips. Took 30 seconds and ran fully locally: ${LI_CTA}`,
70
+ ({ score, arch }) =>
71
+ `I'm usually the first to scroll past "audit your X" tools. This one took 30 seconds and actually told me something.\n\nMy agent is ${arch}, and it scored ${score}/100.\n\nIt reads the agent's real run history rather than asking me anything, and none of it leaves the machine: ${LI_CTA}`,
72
+ ({ score, arch }) =>
73
+ `What is your agent's personality? I realized today that I had no answer.\n\nSo I checked. Mine is ${arch}, scored ${score}/100, with a clear read on where it shines and where it slips.\n\nIf you work with agents, run it and drop yours in the comments. 30 seconds, fully local: ${LI_CTA}`,
74
+ ({ score, arch }) =>
75
+ `I trusted my agent a little less after this morning, and quite a bit more by the afternoon.\n\nI ran an audit on it. It showed me exactly where it's reliable and where it isn't, gave it a personality (${arch}), and scored it ${score}/100.\n\nKnowing the gaps is what made me trust it more. 30 seconds, all local: ${LI_CTA}`,
76
+ ({ score, arch }) =>
77
+ `I almost skipped this because I assumed it would quietly ship my code off somewhere. It doesn't. Everything runs locally.\n\n30 seconds later I had my agent's personality (${arch}) and a quality score (${score}/100).\n\nIf privacy is usually what stops you from trying these, this one is different: ${LI_CTA}`,
78
+ ({ score, arch }) =>
79
+ `Found out my AI agent has a personality type. Found out it's ${arch}. Found out that explains a lot.\n\nIt scored ${score}/100 too. The audit reads how the agent handles failures, not just the runs where everything goes fine.\n\n30 seconds, runs locally: ${LI_CTA}`,
93
80
  ];
94
81
 
95
- /* ---------------------------------------------------------------------------
96
- * THE ORIGINAL SCORE-BEARING COPY, verbatim. To restore: put these two arrays
97
- * back in place of the two above, and re-enable the score at its source (see
98
- * `src/audit/scoring.ts`). Nothing else has to change — `ShareCtx` is unchanged
99
- * and `score` is still populated by `audit-poster.tsx`.
100
- *
101
- * export const X_TEMPLATES: ((c: ShareCtx) => string)[] = [
102
- * ({ score, arch }) =>
103
- * `my agent has a personality and it's ${arch}. did not see that coming.\n\nran a failproof audit, scored ${score}/100, all local. find out what yours is → ${X_CTA}`,
104
- * ({ score, arch }) =>
105
- * `spent 30 seconds auditing my agent. learned more about it than i did all month.\n\nit's ${arch}. scored ${score}/100. → ${X_CTA}`,
106
- * ({ score }) =>
107
- * `my agent scored ${score}/100. think yours can beat it?\n\n30 sec audit, runs locally, gives you a personality too → ${X_CTA}`,
108
- * ({ arch }) =>
109
- * `turns out my agent is ${arch} and honestly it explains everything.\n\n→ ${X_CTA}`,
110
- * ({ score, arch }) =>
111
- * `ran a failproof audit on my agent. it reads how it actually behaves when things break, not just the happy path.\n\npersonality: ${arch}. score: ${score}/100. all local → ${X_CTA}`,
112
- * ({ score, arch }) =>
113
- * `got to know my agent today. it's ${arch} and scored ${score}/100. wow.\n\naudit yours in 30s, nothing leaves your machine → ${X_CTA}`,
114
- * ({ score, arch }) =>
115
- * `your agent has a personality. you just haven't met it.\n\ni met mine today: ${arch}, ${score}/100. → ${X_CTA}`,
116
- * ({ score, arch }) =>
117
- * `everyone talks about what their agent can build. nobody talks about how it acts when it breaks.\n\nmine's ${arch}, scored ${score}/100, all local → ${X_CTA}`,
118
- * ({ score, arch }) =>
119
- * `every agent builder should run this once.\n\n30 sec, local, gives your agent a personality and a quality score. mine: ${arch}, ${score}/100.\n\n${X_CTA}`,
120
- * ({ score, arch }) =>
121
- * `i'll go first: ${arch}, ${score}/100.\n\nwhat's your agent? 30 sec audit, no signup → ${X_CTA}`,
122
- * ];
123
- *
124
- * export const LI_TEMPLATES: ((c: ShareCtx) => string)[] = [
125
- * ({ score, arch }) =>
126
- * `I've spent more hours with my agent this month than with most people I know. Today I realized I couldn't tell you a single thing about how it actually behaves.\n\nSo I audited it. Turns out it's ${arch}, and it scored ${score}/100.\n\nThe audit reads its real history, including how it handles failures, not just the clean runs. 30 seconds, runs entirely locally.\n\nMeet yours: ${LI_CTA}`,
127
- * ({ score, arch }) =>
128
- * `Took a personality test today. It wasn't for me — it was for my AI agent.\n\nThe result: ${arch}, with a quality score of ${score}/100.\n\nIt works by reading the agent's actual run history, so the personality comes from how it really behaves, not a vibe. Took 30 seconds and stayed local.\n\nTry it on yours: ${LI_CTA}`,
129
- * ({ score, arch }) =>
130
- * `Everyone asks what their AI agent can build. I just found out mine has a temper.\n\nAfter watching how it reacts to a failed command, the audit called it ${arch}. It also scored its quality at ${score}/100.\n\nOddly useful to see it written down. 30 seconds, all local: ${LI_CTA}`,
131
- * ({ score, arch }) =>
132
- * `My agent does this very specific thing every time a command fails. Today I learned there's basically a name for it.\n\nRan a quick audit and it came back ${arch}, scored ${score}/100. The whole read is based on how the agent handles things going wrong, which is where its real character shows.\n\n30 seconds, nothing leaves your machine: ${LI_CTA}`,
133
- * ({ score, arch }) =>
134
- * `My AI agent scored ${score}/100 today. I didn't know you could even measure that.\n\nThe same audit also handed it a personality: ${arch}.\n\nIt reads the agent's real history and tells you where it's solid and where it slips. Took 30 seconds and ran fully locally: ${LI_CTA}`,
135
- * ({ score, arch }) =>
136
- * `I'm usually the first to scroll past "audit your X" tools. This one took 30 seconds and actually told me something.\n\nMy agent is ${arch}, and it scored ${score}/100.\n\nIt reads the agent's real run history rather than asking me anything, and none of it leaves the machine: ${LI_CTA}`,
137
- * ({ score, arch }) =>
138
- * `What is your agent's personality? I realized today that I had no answer.\n\nSo I checked. Mine is ${arch}, scored ${score}/100, with a clear read on where it shines and where it slips.\n\nIf you work with agents, run it and drop yours in the comments. 30 seconds, fully local: ${LI_CTA}`,
139
- * ({ score, arch }) =>
140
- * `I trusted my agent a little less after this morning, and quite a bit more by the afternoon.\n\nI ran an audit on it. It showed me exactly where it's reliable and where it isn't, gave it a personality (${arch}), and scored it ${score}/100.\n\nKnowing the gaps is what made me trust it more. 30 seconds, all local: ${LI_CTA}`,
141
- * ({ score, arch }) =>
142
- * `I almost skipped this because I assumed it would quietly ship my code off somewhere. It doesn't. Everything runs locally.\n\n30 seconds later I had my agent's personality (${arch}) and a quality score (${score}/100).\n\nIf privacy is usually what stops you from trying these, this one is different: ${LI_CTA}`,
143
- * ({ score, arch }) =>
144
- * `Found out my AI agent has a personality type. Found out it's ${arch}. Found out that explains a lot.\n\nIt scored ${score}/100 too. The audit reads how the agent handles failures, not just the runs where everything goes fine.\n\n30 seconds, runs locally: ${LI_CTA}`,
145
- * ];
146
- * ------------------------------------------------------------------------- */
147
-
148
82
  /** djb2 hash — stable per seed so the template choice is deterministic. */
149
83
  function hashStr(s: string): number {
150
84
  let h = 5381;
@@ -496,13 +496,7 @@
496
496
  .poster-meta .of { color: var(--dim); }
497
497
  .poster-meta .poster-sep { color: var(--dim); }
498
498
 
499
- /* body — vertical centered stack: sigil → persona → score ───
500
- The score block is switched off (see `src/audit/scoring.ts`), so this stack
501
- currently renders two children, not three. It is a centered flex column with
502
- a gap and no fixed track count, so it re-centers on its own. The
503
- `.poster-score` rules below are kept, dormant, against the score coming
504
- back — do not tidy them away, or restoring it means rewriting the styles
505
- too. */
499
+ /* body — vertical centered stack: sigil → persona → score ─── */
506
500
  .poster-body {
507
501
  display: flex;
508
502
  flex-direction: column;
@@ -561,7 +555,6 @@
561
555
  .poster-persona .persona-rarity .pct { color: var(--accent-pink); font-weight: 600; }
562
556
 
563
557
  /* score — score-n + /100, baseline-aligned and centered in the card. */
564
- /* Dormant while the score is switched off — see `src/audit/scoring.ts`. */
565
558
  .poster-score {
566
559
  display: flex;
567
560
  align-items: baseline;
@@ -1164,127 +1157,3 @@
1164
1157
  .share-card {
1165
1158
  max-width: 420px;
1166
1159
  }
1167
-
1168
- /* ── Leak report ─────────────────────────────────────────────────────────────
1169
- One block per distinct credential. Deliberately NOT a table: a table implies
1170
- columns worth scanning down, and the interesting comparison between two
1171
- leaked keys is never "which is longer" — it is what each one is and where it
1172
- went, which reads as a sentence. */
1173
-
1174
- .leak-notify { margin-left: auto; }
1175
-
1176
- .leak-list {
1177
- list-style: none;
1178
- margin: 20px 0 0;
1179
- padding: 0;
1180
- display: flex;
1181
- flex-direction: column;
1182
- gap: 10px;
1183
- }
1184
-
1185
- .leak-row {
1186
- border: 1px solid var(--line-2);
1187
- /* Hard-offset pixel shadow, never a blur — the house rule. Pink is the
1188
- accent that means "this one is yours to act on". */
1189
- box-shadow: 4px 4px 0 0 var(--line-2);
1190
- padding: 14px 16px;
1191
- display: flex;
1192
- flex-direction: column;
1193
- gap: 8px;
1194
- background: var(--bg);
1195
- }
1196
- /* A recognised prefix means a console exists and this is revocable in a
1197
- minute. That is a real difference in what the reader has to do, so it is the
1198
- one thing the row's own frame encodes. */
1199
- .leak-row[data-attributed="true"] { box-shadow: 4px 4px 0 0 var(--accent-pink); }
1200
-
1201
- .leak-row-top {
1202
- display: flex;
1203
- align-items: baseline;
1204
- gap: 10px;
1205
- flex-wrap: wrap;
1206
- }
1207
-
1208
- .leak-key {
1209
- font-family: var(--font-mono);
1210
- font-size: 14px;
1211
- color: var(--ink);
1212
- letter-spacing: 0.02em;
1213
- /* The masked value can be long; it must wrap rather than push the row wide. */
1214
- word-break: break-all;
1215
- }
1216
-
1217
- .leak-label {
1218
- font-family: var(--font-mono);
1219
- font-size: 11px;
1220
- color: var(--accent-pink);
1221
- text-transform: lowercase;
1222
- }
1223
-
1224
- .leak-name {
1225
- font-family: var(--font-mono);
1226
- font-size: 11px;
1227
- color: var(--ink-2);
1228
- border: 1px solid var(--line-2);
1229
- padding: 1px 5px;
1230
- }
1231
-
1232
- .leak-dismiss {
1233
- margin-left: auto;
1234
- font-family: var(--font-mono);
1235
- font-size: 10px;
1236
- color: var(--dim);
1237
- background: none;
1238
- border: 1px solid var(--line-2);
1239
- padding: 3px 8px;
1240
- cursor: pointer;
1241
- text-transform: lowercase;
1242
- }
1243
- .leak-dismiss:hover:not(:disabled) { color: var(--ink); border-color: var(--ink-2); }
1244
- .leak-dismiss:disabled { opacity: 0.4; cursor: not-allowed; }
1245
- .leak-dismiss:focus-visible { outline: 2px solid var(--accent-pink); outline-offset: 2px; }
1246
-
1247
- .leak-how {
1248
- font-family: var(--font-mono);
1249
- font-size: 12px;
1250
- color: var(--ink-2);
1251
- line-height: 1.6;
1252
- }
1253
- .leak-verb { color: var(--ink); }
1254
- .leak-where { color: var(--accent-green); }
1255
- .leak-who { color: var(--ink); }
1256
- .leak-when { color: var(--dim); }
1257
-
1258
- .leak-foot {
1259
- display: flex;
1260
- gap: 14px;
1261
- flex-wrap: wrap;
1262
- font-family: var(--font-mono);
1263
- font-size: 10px;
1264
- color: var(--dim);
1265
- }
1266
- .leak-fix { color: var(--accent-green); }
1267
- .leak-dir { color: var(--ink-2); }
1268
-
1269
- @media (max-width: 640px) {
1270
- .leak-dismiss { margin-left: 0; }
1271
- .leak-foot { gap: 6px; flex-direction: column; }
1272
- }
1273
-
1274
- /* The re-scan control in the scan header. Sits at the end of the eyebrow row so
1275
- it reads as an action on that section rather than a page-level nav item. */
1276
- .scan-rerun {
1277
- margin-left: auto;
1278
- font-family: var(--font-mono);
1279
- font-size: 10.5px;
1280
- letter-spacing: 0.1em;
1281
- text-transform: lowercase;
1282
- color: var(--ink-2);
1283
- background: none;
1284
- border: 1px solid var(--line-2);
1285
- padding: 4px 10px;
1286
- cursor: pointer;
1287
- }
1288
- .scan-rerun:hover:not(:disabled) { color: var(--ink); border-color: var(--accent-pink); }
1289
- .scan-rerun:disabled { opacity: 0.5; cursor: not-allowed; }
1290
- .scan-rerun:focus-visible { outline: 2px solid var(--accent-pink); outline-offset: 2px; }
@@ -30,7 +30,7 @@ export const dynamic = "force-dynamic";
30
30
  export default async function SettingsPage() {
31
31
  // Same gate the audit, policies and projects pages carry. It was dropped in
32
32
  // the rewrite, and this is the page that least deserves to lose it: it shows
33
- // the address credential alerts go to and can sign the machine out, on a dashboard an
33
+ // the address digests go to and can sign the machine out, on a dashboard an
34
34
  // operator may deliberately be exposing beyond localhost.
35
35
  const disabled = (process.env.FAILPROOFAI_DISABLE_PAGES ?? "")
36
36
  .split(",").map((s) => s.trim()).filter(Boolean);