hex-audit 0.7.0 → 0.8.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 (584) hide show
  1. package/CLAUDE.md +137 -77
  2. package/DEMO.md +40 -117
  3. package/README.md +200 -402
  4. package/dashboard/.next/BUILD_ID +1 -1
  5. package/dashboard/.next/app-build-manifest.json +56 -101
  6. package/dashboard/.next/app-path-routes-manifest.json +1 -1
  7. package/dashboard/.next/build-manifest.json +9 -9
  8. package/dashboard/.next/next-server.js.nft.json +1 -1
  9. package/dashboard/.next/prerender-manifest.json +1 -1
  10. package/dashboard/.next/react-loadable-manifest.json +436 -15
  11. package/dashboard/.next/routes-manifest.json +1 -1
  12. package/dashboard/.next/server/app/_not-found/page.js +1 -1
  13. package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/dashboard/.next/server/app/api/code/route.js +1 -1
  16. package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -1
  17. package/dashboard/.next/server/app/api/comments/route.js +1 -0
  18. package/dashboard/.next/server/app/api/comments/route.js.nft.json +1 -0
  19. package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js +1 -0
  20. package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js.nft.json +1 -0
  21. package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js +1 -0
  22. package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js.nft.json +1 -0
  23. package/dashboard/.next/server/app/api/diagrams/[name]/route.js +1 -0
  24. package/dashboard/.next/server/app/api/diagrams/[name]/route.js.nft.json +1 -0
  25. package/dashboard/.next/server/app/api/figures/[name]/route.js +1 -0
  26. package/dashboard/.next/server/app/api/figures/[name]/route.js.nft.json +1 -0
  27. package/dashboard/.next/server/app/api/focus/route.js +1 -0
  28. package/dashboard/.next/server/app/api/focus/route.js.nft.json +1 -0
  29. package/dashboard/.next/server/app/api/github-status/route.js +1 -1
  30. package/dashboard/.next/server/app/api/invariants/[id]/route.js +1 -0
  31. package/dashboard/.next/server/app/api/invariants/[id]/route.js.nft.json +1 -0
  32. package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js +1 -0
  33. package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js.nft.json +1 -0
  34. package/dashboard/.next/server/app/api/nav/route.js +1 -0
  35. package/dashboard/.next/server/app/api/nav/route.js.nft.json +1 -0
  36. package/dashboard/.next/server/app/api/notes/done/route.js +1 -1
  37. package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -1
  38. package/dashboard/.next/server/app/api/notes/lead/route.js +1 -1
  39. package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -1
  40. package/dashboard/.next/server/app/api/notes/question/route.js +1 -1
  41. package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -1
  42. package/dashboard/.next/server/app/api/notes/record/route.js +3 -3
  43. package/dashboard/.next/server/app/api/notes/route.js +2 -2
  44. package/dashboard/.next/server/app/api/palette/route.js +1 -0
  45. package/dashboard/.next/server/app/api/palette/route.js.nft.json +1 -0
  46. package/dashboard/.next/server/app/api/progress/route.js +1 -1
  47. package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -1
  48. package/dashboard/.next/server/app/api/watch/route.js +2 -2
  49. package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -1
  50. package/dashboard/.next/server/app/api/xref/route.js +1 -0
  51. package/dashboard/.next/server/app/changes/page.js +1 -20
  52. package/dashboard/.next/server/app/changes/page.js.nft.json +1 -1
  53. package/dashboard/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  54. package/dashboard/.next/server/app/excalidraw-assets/[...path]/route.js +1 -0
  55. package/dashboard/.next/server/app/issues/page.js +5 -28
  56. package/dashboard/.next/server/app/issues/page.js.nft.json +1 -1
  57. package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
  58. package/dashboard/.next/server/app/model/page.js +1 -0
  59. package/dashboard/.next/server/app/{calls → model}/page.js.nft.json +1 -1
  60. package/dashboard/.next/server/app/model/page_client-reference-manifest.js +1 -0
  61. package/dashboard/.next/server/app/page.js +1 -20
  62. package/dashboard/.next/server/app/page.js.nft.json +1 -1
  63. package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  64. package/dashboard/.next/server/app/report/page.js +1 -1
  65. package/dashboard/.next/server/app/report/page.js.nft.json +1 -1
  66. package/dashboard/.next/server/app/report/page_client-reference-manifest.js +1 -1
  67. package/dashboard/.next/server/app/review/page.js +1 -0
  68. package/dashboard/.next/server/app/{access → review}/page.js.nft.json +1 -1
  69. package/dashboard/.next/server/app/review/page_client-reference-manifest.js +1 -0
  70. package/dashboard/.next/server/app-paths-manifest.json +19 -16
  71. package/dashboard/.next/server/chunks/310.js +4 -0
  72. package/dashboard/.next/server/chunks/370.js +1 -0
  73. package/dashboard/.next/server/chunks/42.js +1 -1
  74. package/dashboard/.next/server/chunks/624.js +14 -0
  75. package/dashboard/.next/server/chunks/645.js +1 -1
  76. package/dashboard/.next/server/chunks/649.js +1 -1
  77. package/dashboard/.next/server/chunks/653.js +1 -0
  78. package/dashboard/.next/server/functions-config-manifest.json +1 -1
  79. package/dashboard/.next/server/middleware-build-manifest.js +1 -1
  80. package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -1
  81. package/dashboard/.next/server/pages/500.html +1 -1
  82. package/dashboard/.next/server/pages/_error.js +1 -1
  83. package/dashboard/.next/server/server-reference-manifest.js +1 -1
  84. package/dashboard/.next/server/server-reference-manifest.json +1 -1
  85. package/dashboard/.next/static/chunks/0bbe10ee.8e7ffa06d2170dfe.js +84 -0
  86. package/dashboard/.next/static/chunks/1026.0ef689a305302427.js +1 -0
  87. package/dashboard/.next/static/chunks/1164.34eb76767ebea46f.js +8 -0
  88. package/dashboard/.next/static/chunks/119.a9a79633900a235f.js +5 -0
  89. package/dashboard/.next/static/chunks/1291.6c486c9b1d4b1b3a.js +1 -0
  90. package/dashboard/.next/static/chunks/139.4691848fc5a46253.js +10 -0
  91. package/dashboard/.next/static/chunks/145.1bf74fecdb4022e3.js +11 -0
  92. package/dashboard/.next/static/chunks/1517.8e7075f78e22b3a0.js +8 -0
  93. package/dashboard/.next/static/chunks/165.6f174060a0ce2db4.js +6 -0
  94. package/dashboard/.next/static/chunks/1741.5c370b7702d2eb40.js +8 -0
  95. package/dashboard/.next/static/chunks/1e36816c.5748c83adc8a6bd6.js +108 -0
  96. package/dashboard/.next/static/chunks/2061.eab75b3c1dfa068a.js +1 -0
  97. package/dashboard/.next/static/chunks/2148.3ce718f62d1b2f7c.js +10 -0
  98. package/dashboard/.next/static/chunks/217-1d5b680ffd10e3f9.js +1 -0
  99. package/dashboard/.next/static/chunks/2208.fb884379aa3ae968.js +1 -0
  100. package/dashboard/.next/static/chunks/2276.112c7855333fca5f.js +6 -0
  101. package/dashboard/.next/static/chunks/2374-8c6f137938f8518a.js +1 -0
  102. package/dashboard/.next/static/chunks/2445.18a86507d2996b95.js +1 -0
  103. package/dashboard/.next/static/chunks/2712.15dd8577973baf22.js +10 -0
  104. package/dashboard/.next/static/chunks/2759.533dec5317e0a1d1.js +1 -0
  105. package/dashboard/.next/static/chunks/2812.62b213bef580b69a.js +1 -0
  106. package/dashboard/.next/static/chunks/2895.bb57cacb7aaf42a1.js +9 -0
  107. package/dashboard/.next/static/chunks/2972.e5a9251b538dcf19.js +9 -0
  108. package/dashboard/.next/static/chunks/3206.8d9a10db2b04b93f.js +1 -0
  109. package/dashboard/.next/static/chunks/3485.36766504793b7237.js +9 -0
  110. package/dashboard/.next/static/chunks/3725.de9376dc994735d4.js +9 -0
  111. package/dashboard/.next/static/chunks/3774.1df377928e8387f7.js +9 -0
  112. package/dashboard/.next/static/chunks/3963.39d72b3875dfe2e9.js +13 -0
  113. package/dashboard/.next/static/chunks/4013.73884b23bfaebdde.js +11 -0
  114. package/dashboard/.next/static/chunks/4117.278aff1fa23fd36e.js +6 -0
  115. package/dashboard/.next/static/chunks/4210.cc8594110017c579.js +11 -0
  116. package/dashboard/.next/static/chunks/4282.28485875540886cc.js +7 -0
  117. package/dashboard/.next/static/chunks/4318.a2f469a88d88f6d0.js +8 -0
  118. package/dashboard/.next/static/chunks/4363.8999a6e727c48003.js +1 -0
  119. package/dashboard/.next/static/chunks/4641.e03d118fffebd580.js +5 -0
  120. package/dashboard/.next/static/chunks/483.a910dab7734a1074.js +8 -0
  121. package/dashboard/.next/static/chunks/4926.76693f542e9cc062.js +6 -0
  122. package/dashboard/.next/static/chunks/4938.03f6d04dabf38745.js +10 -0
  123. package/dashboard/.next/static/chunks/5112.0757c2b0c285e62e.js +1 -0
  124. package/dashboard/.next/static/chunks/5199.c83ea7efb0eec705.js +11 -0
  125. package/dashboard/.next/static/chunks/530.849957a8907eb288.js +1 -0
  126. package/dashboard/.next/static/chunks/5424.4e8ca0711a32bccf.js +7 -0
  127. package/dashboard/.next/static/chunks/55.a593a78be9714679.js +1 -0
  128. package/dashboard/.next/static/chunks/5535.6cd0bd8d368d8902.js +4 -0
  129. package/dashboard/.next/static/chunks/5626.7d4e93d7acbeffc9.js +10 -0
  130. package/dashboard/.next/static/chunks/5775.a0d7c1b1e89b9a93.js +9 -0
  131. package/dashboard/.next/static/chunks/6118.266956b3333b1d7a.js +9 -0
  132. package/dashboard/.next/static/chunks/6121.a2e6d93720b1205e.js +77 -0
  133. package/dashboard/.next/static/chunks/6853.d3ad43614e8ca0ab.js +1 -0
  134. package/dashboard/.next/static/chunks/6951.02a3a158d02158c9.js +5 -0
  135. package/dashboard/.next/static/chunks/6970.013f24568c87d918.js +11 -0
  136. package/dashboard/.next/static/chunks/7013.39d41e82b37be63b.js +9 -0
  137. package/dashboard/.next/static/chunks/7107.1c5412197912b8ed.js +8 -0
  138. package/dashboard/.next/static/chunks/7508.dd60e2d06d149f5f.js +9 -0
  139. package/dashboard/.next/static/chunks/7524.0fde4c61553d1491.js +3 -0
  140. package/dashboard/.next/static/chunks/7834-47f318a04a05688f.js +1 -0
  141. package/dashboard/.next/static/chunks/8317.d0b3eddef4cae0d5.js +1 -0
  142. package/dashboard/.next/static/chunks/838.2b2aa006519ba44c.js +10 -0
  143. package/dashboard/.next/static/chunks/8398.924fd8f4c83417c0.js +7 -0
  144. package/dashboard/.next/static/chunks/8428b36f.8ac4e67061c01307.js +34 -0
  145. package/dashboard/.next/static/chunks/8514.85ccbbea8ab21d04.js +5 -0
  146. package/dashboard/.next/static/chunks/8538.5f7ebe76c4b63162.js +1 -0
  147. package/dashboard/.next/static/chunks/8687.9406baa8b5601fd0.js +1 -0
  148. package/dashboard/.next/static/chunks/8721.47346e2cb6412376.js +10 -0
  149. package/dashboard/.next/static/chunks/8770.4f544bd1a6f03a62.js +8 -0
  150. package/dashboard/.next/static/chunks/8812.3d96fd54dba566f8.js +9 -0
  151. package/dashboard/.next/static/chunks/8962.d22aa67a97970dd8.js +1 -0
  152. package/dashboard/.next/static/chunks/8986.b327224b83f4399a.js +5 -0
  153. package/dashboard/.next/static/chunks/9271.5f66c19a8ee1ff36.js +10 -0
  154. package/dashboard/.next/static/chunks/9282.f8d01442bab4c0da.js +2 -0
  155. package/dashboard/.next/static/chunks/9366.0ec24a0791b9b00f.js +1 -0
  156. package/dashboard/.next/static/chunks/9707.5cd7d2ee933a4af5.js +6 -0
  157. package/dashboard/.next/static/chunks/9716.15fffc0b0038601d.js +4 -0
  158. package/dashboard/.next/static/chunks/9791.e3b3f5a367f63c8a.js +1 -0
  159. package/dashboard/.next/static/chunks/9820.8c1efad5260e8137.js +1 -0
  160. package/dashboard/.next/static/chunks/985.50150e9eaa4bde33.js +39 -0
  161. package/dashboard/.next/static/chunks/997.56901b86e1b8a87b.js +8 -0
  162. package/dashboard/.next/static/chunks/app/changes/page-f8a860034221cad4.js +1 -0
  163. package/dashboard/.next/static/chunks/app/issues/page-da4da93188c414a6.js +1 -0
  164. package/dashboard/.next/static/chunks/app/layout-27a9da4610423c1e.js +1 -0
  165. package/dashboard/.next/static/chunks/app/model/page-9680e22fdd6ddb81.js +1 -0
  166. package/dashboard/.next/static/chunks/app/page-0e67750d99fb2836.js +1 -0
  167. package/dashboard/.next/static/chunks/app/report/page-b56b1db9b9dcf2b6.js +1 -0
  168. package/dashboard/.next/static/chunks/app/review/page-3ef69f0e0badd333.js +1 -0
  169. package/dashboard/.next/static/chunks/c75e29e3.d91220f782934d80.js +1 -0
  170. package/dashboard/.next/static/chunks/{main-cc3a889b25e9aa68.js → main-9c95a7ffedc7afb4.js} +1 -1
  171. package/dashboard/.next/static/chunks/webpack-6da70e4f9fcf1799.js +1 -0
  172. package/dashboard/.next/static/css/ceafd91ca8dd753d.css +3 -0
  173. package/dashboard/.next/static/css/e4aad1f9c715b79a.css +1 -0
  174. package/dashboard/.next/static/media/Assistant-Bold.c8f39f24.woff2 +0 -0
  175. package/dashboard/.next/static/media/Assistant-Medium.1e75d8e6.woff2 +0 -0
  176. package/dashboard/.next/static/media/Assistant-Regular.7acbabb8.woff2 +0 -0
  177. package/dashboard/.next/static/media/Assistant-SemiBold.167acbf8.woff2 +0 -0
  178. package/dashboard/app/api/code/route.ts +26 -20
  179. package/dashboard/app/api/comments/route.ts +158 -0
  180. package/dashboard/app/api/diagrams/[name]/export/route.ts +26 -0
  181. package/dashboard/app/api/diagrams/[name]/resolve/route.ts +25 -0
  182. package/dashboard/app/api/diagrams/[name]/route.ts +37 -0
  183. package/dashboard/app/api/figures/[name]/route.ts +15 -0
  184. package/dashboard/app/api/focus/route.ts +35 -0
  185. package/dashboard/app/api/invariants/[id]/route.ts +35 -0
  186. package/dashboard/app/api/issues/[id]/revert-auto/route.ts +18 -0
  187. package/dashboard/app/api/nav/route.ts +120 -0
  188. package/dashboard/app/api/palette/route.ts +68 -0
  189. package/dashboard/app/api/progress/route.ts +54 -23
  190. package/dashboard/app/api/xref/route.ts +30 -0
  191. package/dashboard/app/changes/ChangesClient.tsx +730 -356
  192. package/dashboard/app/changes/page.tsx +27 -19
  193. package/dashboard/app/excalidraw-assets/[...path]/route.ts +56 -0
  194. package/dashboard/app/globals.css +231 -77
  195. package/dashboard/app/issues/BoardClient.tsx +817 -0
  196. package/dashboard/app/issues/page.tsx +27 -272
  197. package/dashboard/app/layout.tsx +32 -17
  198. package/dashboard/app/model/ModelClient.tsx +1303 -0
  199. package/dashboard/app/model/page.tsx +98 -0
  200. package/dashboard/app/page.tsx +191 -277
  201. package/dashboard/app/report/ReportClient.tsx +147 -74
  202. package/dashboard/app/report/page.tsx +25 -14
  203. package/dashboard/app/review/ReviewClient.tsx +1180 -0
  204. package/dashboard/app/review/page.tsx +93 -0
  205. package/dashboard/components/AutoRefresh.tsx +22 -19
  206. package/dashboard/components/CodeComments.tsx +303 -0
  207. package/dashboard/components/CodeNav.tsx +523 -0
  208. package/dashboard/components/CodeReference.tsx +92 -99
  209. package/dashboard/components/CodeViewer.tsx +526 -0
  210. package/dashboard/components/CommandPalette.tsx +141 -66
  211. package/dashboard/components/DiagramCanvas.tsx +275 -0
  212. package/dashboard/components/DianeNote.tsx +244 -0
  213. package/dashboard/components/LiveStatus.tsx +30 -68
  214. package/dashboard/components/MarkdownRenderer.tsx +34 -32
  215. package/dashboard/components/RecordButton.tsx +132 -0
  216. package/dashboard/components/ui/Button.tsx +39 -0
  217. package/dashboard/components/ui/Chip.tsx +37 -0
  218. package/dashboard/components/ui/EmptyState.tsx +31 -0
  219. package/dashboard/components/ui/Icons.tsx +126 -0
  220. package/dashboard/components/ui/Inspector.tsx +122 -0
  221. package/dashboard/components/ui/Kbd.tsx +15 -0
  222. package/dashboard/components/ui/ListRow.tsx +92 -0
  223. package/dashboard/components/ui/LocalTime.tsx +14 -0
  224. package/dashboard/components/ui/ProgressRing.tsx +54 -0
  225. package/dashboard/components/ui/ResizeHandle.tsx +93 -0
  226. package/dashboard/components/ui/RiskMeter.tsx +27 -0
  227. package/dashboard/components/ui/SearchField.tsx +55 -0
  228. package/dashboard/components/ui/SegmentedControl.tsx +71 -0
  229. package/dashboard/components/ui/SeverityDot.tsx +57 -0
  230. package/dashboard/components/ui/Sidebar.tsx +236 -0
  231. package/dashboard/components/ui/SplitView.tsx +122 -0
  232. package/dashboard/components/ui/StateGlyph.tsx +66 -0
  233. package/dashboard/components/ui/Toast.tsx +91 -0
  234. package/dashboard/lib/api.ts +17 -0
  235. package/dashboard/lib/cn.ts +4 -0
  236. package/dashboard/lib/data.ts +2 -21
  237. package/dashboard/lib/finding-markdown.ts +1 -1
  238. package/dashboard/lib/focus.ts +42 -0
  239. package/dashboard/lib/hotkeys.ts +41 -0
  240. package/dashboard/lib/inline-markdown.test.ts +11 -0
  241. package/dashboard/lib/live.ts +32 -0
  242. package/dashboard/lib/pane-width.ts +36 -0
  243. package/dashboard/lib/server/board.ts +229 -0
  244. package/dashboard/lib/server/diagrams.ts +191 -0
  245. package/dashboard/lib/server/safe-path.ts +28 -0
  246. package/dashboard/lib/server/workspace.ts +113 -0
  247. package/dashboard/lib/server/xref.ts +42 -0
  248. package/dashboard/lib/solidity.test.ts +37 -0
  249. package/dashboard/lib/solidity.ts +191 -0
  250. package/dashboard/lib/source.ts +28 -0
  251. package/dashboard/lib/types.ts +164 -0
  252. package/dashboard/lib/url.ts +18 -0
  253. package/dashboard/lib/watcher.ts +31 -22
  254. package/dashboard/tailwind.config.ts +6 -3
  255. package/dist/analysis/code-model.d.ts.map +1 -1
  256. package/dist/analysis/code-model.js +4 -1
  257. package/dist/analysis/code-model.js.map +1 -1
  258. package/dist/analysis/diff.d.ts +12 -1
  259. package/dist/analysis/diff.d.ts.map +1 -1
  260. package/dist/analysis/diff.js +143 -0
  261. package/dist/analysis/diff.js.map +1 -1
  262. package/dist/commands/analyze.d.ts.map +1 -1
  263. package/dist/commands/analyze.js +17 -48
  264. package/dist/commands/analyze.js.map +1 -1
  265. package/dist/commands/claude.d.ts.map +1 -1
  266. package/dist/commands/claude.js +5 -0
  267. package/dist/commands/claude.js.map +1 -1
  268. package/dist/commands/dashboard.d.ts.map +1 -1
  269. package/dist/commands/dashboard.js +10 -2
  270. package/dist/commands/dashboard.js.map +1 -1
  271. package/dist/commands/diagram.d.ts +3 -0
  272. package/dist/commands/diagram.d.ts.map +1 -0
  273. package/dist/commands/diagram.js +71 -0
  274. package/dist/commands/diagram.js.map +1 -0
  275. package/dist/commands/diff.d.ts +4 -5
  276. package/dist/commands/diff.d.ts.map +1 -1
  277. package/dist/commands/diff.js +56 -17
  278. package/dist/commands/diff.js.map +1 -1
  279. package/dist/commands/doctor.d.ts.map +1 -1
  280. package/dist/commands/doctor.js +5 -18
  281. package/dist/commands/doctor.js.map +1 -1
  282. package/dist/commands/facts.d.ts +23 -0
  283. package/dist/commands/facts.d.ts.map +1 -0
  284. package/dist/commands/facts.js +121 -0
  285. package/dist/commands/facts.js.map +1 -0
  286. package/dist/commands/fix-review.d.ts +9 -0
  287. package/dist/commands/fix-review.d.ts.map +1 -0
  288. package/dist/commands/fix-review.js +367 -0
  289. package/dist/commands/fix-review.js.map +1 -0
  290. package/dist/commands/init.d.ts.map +1 -1
  291. package/dist/commands/init.js +51 -47
  292. package/dist/commands/init.js.map +1 -1
  293. package/dist/commands/issue.d.ts.map +1 -1
  294. package/dist/commands/issue.js +151 -2
  295. package/dist/commands/issue.js.map +1 -1
  296. package/dist/commands/mcp.d.ts +3 -0
  297. package/dist/commands/mcp.d.ts.map +1 -0
  298. package/dist/commands/mcp.js +11 -0
  299. package/dist/commands/mcp.js.map +1 -0
  300. package/dist/commands/model.d.ts +4 -0
  301. package/dist/commands/model.d.ts.map +1 -0
  302. package/dist/commands/model.js +275 -0
  303. package/dist/commands/model.js.map +1 -0
  304. package/dist/commands/note.d.ts.map +1 -1
  305. package/dist/commands/note.js +31 -1
  306. package/dist/commands/note.js.map +1 -1
  307. package/dist/commands/review.d.ts +4 -0
  308. package/dist/commands/review.d.ts.map +1 -0
  309. package/dist/commands/review.js +164 -0
  310. package/dist/commands/review.js.map +1 -0
  311. package/dist/core/comments.d.ts +59 -0
  312. package/dist/core/comments.d.ts.map +1 -0
  313. package/dist/core/comments.js +263 -0
  314. package/dist/core/comments.js.map +1 -0
  315. package/dist/core/config.d.ts.map +1 -1
  316. package/dist/core/config.js +0 -1
  317. package/dist/core/config.js.map +1 -1
  318. package/dist/core/dedup.d.ts +56 -0
  319. package/dist/core/dedup.d.ts.map +1 -0
  320. package/dist/core/dedup.js +208 -0
  321. package/dist/core/dedup.js.map +1 -0
  322. package/dist/core/errors.d.ts +1 -1
  323. package/dist/core/errors.d.ts.map +1 -1
  324. package/dist/core/errors.js +0 -15
  325. package/dist/core/errors.js.map +1 -1
  326. package/dist/core/external-tools.d.ts +0 -14
  327. package/dist/core/external-tools.d.ts.map +1 -1
  328. package/dist/core/external-tools.js +2 -52
  329. package/dist/core/external-tools.js.map +1 -1
  330. package/dist/core/fix-review.d.ts +54 -0
  331. package/dist/core/fix-review.d.ts.map +1 -0
  332. package/dist/core/fix-review.js +98 -0
  333. package/dist/core/fix-review.js.map +1 -0
  334. package/dist/core/fuzz-sync.d.ts +93 -0
  335. package/dist/core/fuzz-sync.d.ts.map +1 -0
  336. package/dist/core/fuzz-sync.js +516 -0
  337. package/dist/core/fuzz-sync.js.map +1 -0
  338. package/dist/core/git.d.ts +7 -0
  339. package/dist/core/git.d.ts.map +1 -1
  340. package/dist/core/git.js +42 -0
  341. package/dist/core/git.js.map +1 -1
  342. package/dist/core/issues.d.ts +32 -1
  343. package/dist/core/issues.d.ts.map +1 -1
  344. package/dist/core/issues.js +135 -3
  345. package/dist/core/issues.js.map +1 -1
  346. package/dist/core/mcp-config.d.ts +12 -0
  347. package/dist/core/mcp-config.d.ts.map +1 -0
  348. package/dist/core/mcp-config.js +29 -0
  349. package/dist/core/mcp-config.js.map +1 -0
  350. package/dist/core/model.d.ts +38 -0
  351. package/dist/core/model.d.ts.map +1 -0
  352. package/dist/core/model.js +160 -0
  353. package/dist/core/model.js.map +1 -0
  354. package/dist/core/notes.d.ts +2 -0
  355. package/dist/core/notes.d.ts.map +1 -1
  356. package/dist/core/notes.js +13 -3
  357. package/dist/core/notes.js.map +1 -1
  358. package/dist/core/review.d.ts +47 -0
  359. package/dist/core/review.d.ts.map +1 -1
  360. package/dist/core/review.js +177 -1
  361. package/dist/core/review.js.map +1 -1
  362. package/dist/core/rules.d.ts +12 -0
  363. package/dist/core/rules.d.ts.map +1 -0
  364. package/dist/core/rules.js +66 -0
  365. package/dist/core/rules.js.map +1 -0
  366. package/dist/core/schema.d.ts +4817 -2245
  367. package/dist/core/schema.d.ts.map +1 -1
  368. package/dist/core/schema.js +452 -113
  369. package/dist/core/schema.js.map +1 -1
  370. package/dist/core/scope.d.ts +8 -0
  371. package/dist/core/scope.d.ts.map +1 -0
  372. package/dist/core/scope.js +18 -0
  373. package/dist/core/scope.js.map +1 -0
  374. package/dist/diagrams/build.d.ts +18 -0
  375. package/dist/diagrams/build.d.ts.map +1 -0
  376. package/dist/diagrams/build.js +135 -0
  377. package/dist/diagrams/build.js.map +1 -0
  378. package/dist/diagrams/excalidraw.d.ts +27 -0
  379. package/dist/diagrams/excalidraw.d.ts.map +1 -0
  380. package/dist/diagrams/excalidraw.js +219 -0
  381. package/dist/diagrams/excalidraw.js.map +1 -0
  382. package/dist/diagrams/layout.d.ts +48 -0
  383. package/dist/diagrams/layout.d.ts.map +1 -0
  384. package/dist/diagrams/layout.js +686 -0
  385. package/dist/diagrams/layout.js.map +1 -0
  386. package/dist/facts/build.d.ts +23 -0
  387. package/dist/facts/build.d.ts.map +1 -0
  388. package/dist/facts/build.js +112 -0
  389. package/dist/facts/build.js.map +1 -0
  390. package/dist/facts/extract.d.ts +53 -0
  391. package/dist/facts/extract.d.ts.map +1 -0
  392. package/dist/facts/extract.js +635 -0
  393. package/dist/facts/extract.js.map +1 -0
  394. package/dist/facts/fallback.d.ts +7 -0
  395. package/dist/facts/fallback.d.ts.map +1 -0
  396. package/dist/facts/fallback.js +156 -0
  397. package/dist/facts/fallback.js.map +1 -0
  398. package/dist/facts/implementations.d.ts +29 -0
  399. package/dist/facts/implementations.d.ts.map +1 -0
  400. package/dist/facts/implementations.js +43 -0
  401. package/dist/facts/implementations.js.map +1 -0
  402. package/dist/facts/query.d.ts +35 -0
  403. package/dist/facts/query.d.ts.map +1 -0
  404. package/dist/facts/query.js +157 -0
  405. package/dist/facts/query.js.map +1 -0
  406. package/dist/facts/xref.d.ts +53 -0
  407. package/dist/facts/xref.d.ts.map +1 -0
  408. package/dist/facts/xref.js +282 -0
  409. package/dist/facts/xref.js.map +1 -0
  410. package/dist/index.js +14 -16
  411. package/dist/index.js.map +1 -1
  412. package/dist/mcp/server.d.ts +3 -0
  413. package/dist/mcp/server.d.ts.map +1 -0
  414. package/dist/mcp/server.js +400 -0
  415. package/dist/mcp/server.js.map +1 -0
  416. package/dist/skills/ai-audit/SKILL.md +16 -6
  417. package/dist/skills/ai-audit/UPSTREAM.md +9 -4
  418. package/dist/skills/ai-audit/references/hex-board.md +34 -46
  419. package/dist/skills/diane.md +26 -12
  420. package/dist/skills/fix-review.md +58 -0
  421. package/dist/skills/fuzz/LICENSE +21 -0
  422. package/dist/skills/fuzz/SKILL.md +655 -0
  423. package/dist/skills/fuzz/UPSTREAM.md +119 -0
  424. package/dist/skills/fuzz/agents/implementers/global-property-implementer.md +81 -0
  425. package/dist/skills/fuzz/agents/implementers/specific-property-implementer.md +121 -0
  426. package/dist/skills/fuzz/agents/invariant-discovery/adversarial-profit-maximizer.md +123 -0
  427. package/dist/skills/fuzz/agents/invariant-discovery/conservation-auditor.md +92 -0
  428. package/dist/skills/fuzz/agents/invariant-discovery/protocol-type-specialist.md +173 -0
  429. package/dist/skills/fuzz/agents/invariant-discovery/roundtrip-rounding-analyst.md +164 -0
  430. package/dist/skills/fuzz/agents/invariant-discovery/state-transition-mapper.md +92 -0
  431. package/dist/skills/fuzz/agents/invariant-discovery/synthesizer.md +261 -0
  432. package/dist/skills/fuzz/agents/protocol-analyzer.md +80 -0
  433. package/dist/skills/fuzz/agents/report-writer.md +135 -0
  434. package/dist/skills/fuzz/references/handler-patterns.md +222 -0
  435. package/dist/skills/fuzz/references/hex-invariants.md +102 -0
  436. package/dist/skills/fuzz/references/property-generation.md +149 -0
  437. package/dist/skills/fuzz/references/selection-policy.md +49 -0
  438. package/dist/skills/fuzz/references/setup-playbook.md +92 -0
  439. package/dist/skills/fuzz/references/template-map.md +121 -0
  440. package/dist/skills/fuzz/scripts/ensure_foundry.sh +125 -0
  441. package/dist/skills/fuzz/scripts/estimate_cost.js +157 -0
  442. package/dist/skills/fuzz/scripts/extract_abis.js +303 -0
  443. package/dist/skills/fuzz/scripts/fizz_sync.js +692 -0
  444. package/dist/skills/fuzz/scripts/generate_handlers.js +370 -0
  445. package/dist/skills/fuzz/scripts/generate_suite.js +254 -0
  446. package/dist/skills/fuzz/scripts/lib/log-viewer.js +332 -0
  447. package/dist/skills/fuzz/scripts/run_echidna.js +192 -0
  448. package/dist/skills/fuzz/scripts/run_medusa.js +329 -0
  449. package/dist/skills/fuzz/scripts/select_functions.js +637 -0
  450. package/dist/skills/fuzz/scripts/setup_fuzz_profile.sh +142 -0
  451. package/dist/skills/fuzz/templates/Actor.sol +63 -0
  452. package/dist/skills/fuzz/templates/Base.sol +121 -0
  453. package/dist/skills/fuzz/templates/FoundryTester.sol +29 -0
  454. package/dist/skills/fuzz/templates/FuzzTester.sol +11 -0
  455. package/dist/skills/fuzz/templates/Properties.sol +17 -0
  456. package/dist/skills/fuzz/templates/README.md +56 -0
  457. package/dist/skills/fuzz/templates/Snapshots.sol +26 -0
  458. package/dist/skills/fuzz/templates/echidna.yaml +18 -0
  459. package/dist/skills/fuzz/templates/handlers/Handlers.sol +13 -0
  460. package/dist/skills/fuzz/templates/medusa.json +93 -0
  461. package/dist/skills/fuzz/templates/utils/Clamp.sol +223 -0
  462. package/dist/skills/fuzz/templates/utils/DecimalPrinter.sol +63 -0
  463. package/dist/skills/fuzz/templates/utils/Deployer.sol +17 -0
  464. package/dist/skills/fuzz/templates/utils/EnumerableSet.sol +206 -0
  465. package/dist/skills/fuzz/templates/utils/Hevm.sol +62 -0
  466. package/dist/skills/fuzz/templates/utils/Logger.sol +619 -0
  467. package/dist/skills/fuzz/templates/utils/Math.sol +52 -0
  468. package/dist/skills/fuzz/templates/utils/MockERC20.sol +279 -0
  469. package/dist/skills/fuzz/templates/utils/PropertiesAsserts.sol +238 -0
  470. package/dist/skills/fuzz/templates/utils/StringUtils.sol +85 -0
  471. package/dist/skills/fuzz-convert/SKILL.md +249 -0
  472. package/dist/skills/fuzz-sync/SKILL.md +342 -0
  473. package/dist/skills/generate-poc.md +8 -26
  474. package/dist/skills/generate-report.md +17 -5
  475. package/dist/skills/ingest-aa-report.md +11 -30
  476. package/dist/skills/init-audit/SKILL.md +155 -0
  477. package/dist/skills/init-audit/references/agents/conformance-checker.md +36 -0
  478. package/dist/skills/init-audit/references/agents/contract-reader.md +59 -0
  479. package/dist/skills/init-audit/references/agents/diagram-composer.md +48 -0
  480. package/dist/skills/init-audit/references/agents/docs-extractor.md +26 -0
  481. package/dist/skills/init-audit/references/agents/prior-audit.md +32 -0
  482. package/dist/skills/init-audit/references/agents/regression-checker.md +28 -0
  483. package/dist/skills/init-audit/references/agents/skeptic.md +31 -0
  484. package/dist/skills/init-audit/references/agents/standards-checker.md +39 -0
  485. package/dist/skills/init-audit/references/agents/synthesizer.md +50 -0
  486. package/dist/skills/prevalidate.md +62 -0
  487. package/dist/skills/sync-issues.md +11 -25
  488. package/dist/skills/validate-all-findings.md +2 -2
  489. package/dist/skills/validate-finding.md +25 -24
  490. package/dist/skills/write-finding.md +6 -5
  491. package/dist/types/index.d.ts +16 -12
  492. package/dist/types/index.d.ts.map +1 -1
  493. package/package.json +5 -4
  494. package/dashboard/.next/server/app/access/page.js +0 -1
  495. package/dashboard/.next/server/app/access/page_client-reference-manifest.js +0 -1
  496. package/dashboard/.next/server/app/api/flows/route.js +0 -1
  497. package/dashboard/.next/server/app/api/mermaid/route.js +0 -1
  498. package/dashboard/.next/server/app/calls/page.js +0 -1
  499. package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +0 -1
  500. package/dashboard/.next/server/app/conformance/page.js +0 -1
  501. package/dashboard/.next/server/app/conformance/page.js.nft.json +0 -1
  502. package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +0 -1
  503. package/dashboard/.next/server/app/diagram/page.js +0 -1
  504. package/dashboard/.next/server/app/diagram/page.js.nft.json +0 -1
  505. package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +0 -1
  506. package/dashboard/.next/server/app/flows/page.js +0 -1
  507. package/dashboard/.next/server/app/flows/page.js.nft.json +0 -1
  508. package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +0 -1
  509. package/dashboard/.next/server/app/functions/page.js +0 -1
  510. package/dashboard/.next/server/app/functions/page.js.nft.json +0 -1
  511. package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +0 -1
  512. package/dashboard/.next/server/app/notes/page.js +0 -22
  513. package/dashboard/.next/server/app/notes/page.js.nft.json +0 -1
  514. package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +0 -1
  515. package/dashboard/.next/server/app/progress/page.js +0 -1
  516. package/dashboard/.next/server/app/progress/page.js.nft.json +0 -1
  517. package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +0 -1
  518. package/dashboard/.next/server/app/stats/page.js +0 -1
  519. package/dashboard/.next/server/app/stats/page.js.nft.json +0 -1
  520. package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +0 -1
  521. package/dashboard/.next/server/chunks/530.js +0 -1
  522. package/dashboard/.next/server/chunks/622.js +0 -3
  523. package/dashboard/.next/server/chunks/665.js +0 -13
  524. package/dashboard/.next/server/chunks/939.js +0 -1
  525. package/dashboard/.next/static/chunks/3017.4a5312e3c20a173f.js +0 -1
  526. package/dashboard/.next/static/chunks/7397-37adf76cad543297.js +0 -1
  527. package/dashboard/.next/static/chunks/7973.e34032723285a616.js +0 -79
  528. package/dashboard/.next/static/chunks/8452-6d77fa353402422c.js +0 -13
  529. package/dashboard/.next/static/chunks/8928-fc049decdfbdaa6d.js +0 -1
  530. package/dashboard/.next/static/chunks/app/access/page-f8403cbdfc1c176b.js +0 -1
  531. package/dashboard/.next/static/chunks/app/calls/page-41f20d01e12382ef.js +0 -1
  532. package/dashboard/.next/static/chunks/app/changes/page-82bf8b6f48cdc506.js +0 -1
  533. package/dashboard/.next/static/chunks/app/conformance/page-6bb8e3b372e38098.js +0 -1
  534. package/dashboard/.next/static/chunks/app/diagram/page-469cd7a6f183efba.js +0 -1
  535. package/dashboard/.next/static/chunks/app/flows/page-7872dd9141ba0b07.js +0 -1
  536. package/dashboard/.next/static/chunks/app/functions/page-5847bcb77a8e7edf.js +0 -1
  537. package/dashboard/.next/static/chunks/app/issues/page-1ffc64fe40439002.js +0 -1
  538. package/dashboard/.next/static/chunks/app/layout-6c6d2a0fd7c989d3.js +0 -1
  539. package/dashboard/.next/static/chunks/app/notes/page-8bcaa52304500098.js +0 -1
  540. package/dashboard/.next/static/chunks/app/page-d63800ddb072b77b.js +0 -1
  541. package/dashboard/.next/static/chunks/app/progress/page-e26554f655a62eef.js +0 -1
  542. package/dashboard/.next/static/chunks/app/report/page-18c04fb2f193b020.js +0 -1
  543. package/dashboard/.next/static/chunks/app/stats/page-67ff59fd69bed651.js +0 -1
  544. package/dashboard/.next/static/chunks/webpack-4de0e79bdd6a0418.js +0 -1
  545. package/dashboard/.next/static/css/1112cea2260b3926.css +0 -3
  546. package/dashboard/app/access/AccessClient.tsx +0 -402
  547. package/dashboard/app/access/ReadOnlyFunctions.tsx +0 -114
  548. package/dashboard/app/access/page.tsx +0 -125
  549. package/dashboard/app/api/flows/route.ts +0 -32
  550. package/dashboard/app/api/mermaid/route.ts +0 -25
  551. package/dashboard/app/calls/CallsClient.tsx +0 -170
  552. package/dashboard/app/calls/page.tsx +0 -57
  553. package/dashboard/app/conformance/ConformanceTable.tsx +0 -214
  554. package/dashboard/app/conformance/page.tsx +0 -186
  555. package/dashboard/app/diagram/page.tsx +0 -65
  556. package/dashboard/app/flows/page.tsx +0 -102
  557. package/dashboard/app/functions/FunctionsClient.tsx +0 -167
  558. package/dashboard/app/functions/page.tsx +0 -178
  559. package/dashboard/app/issues/IssuesBoardClient.tsx +0 -813
  560. package/dashboard/app/notes/NotesClient.tsx +0 -706
  561. package/dashboard/app/notes/page.tsx +0 -47
  562. package/dashboard/app/progress/ProgressClient.tsx +0 -354
  563. package/dashboard/app/progress/page.tsx +0 -127
  564. package/dashboard/app/stats/StatsClient.tsx +0 -452
  565. package/dashboard/app/stats/page.tsx +0 -50
  566. package/dashboard/components/ConfidenceBadge.tsx +0 -53
  567. package/dashboard/components/DashboardLayout.tsx +0 -510
  568. package/dashboard/components/FilterableTable.tsx +0 -293
  569. package/dashboard/components/MermaidViewer.tsx +0 -267
  570. package/dashboard/components/NotYetGenerated.tsx +0 -32
  571. package/dashboard/components/SeverityBadge.tsx +0 -28
  572. package/dashboard/components/SignalBars.tsx +0 -27
  573. package/dashboard/components/SortableTable.tsx +0 -122
  574. package/dashboard/lib/conformance-tokens.ts +0 -49
  575. package/dist/skills/init-audit.md +0 -386
  576. /package/dashboard/.next/server/app/api/{flows → xref}/route.js.nft.json +0 -0
  577. /package/dashboard/.next/server/app/{api/mermaid → excalidraw-assets/[...path]}/route.js.nft.json +0 -0
  578. /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_buildManifest.js +0 -0
  579. /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_ssgManifest.js +0 -0
  580. /package/dashboard/.next/static/chunks/{3205-47d09be47325709f.js → 3205-fd963acf2fdfd080.js} +0 -0
  581. /package/dashboard/.next/static/chunks/{3924-88d849290406ee6f.js → 3924-f1f85ccc7d59d7ab.js} +0 -0
  582. /package/dashboard/.next/static/chunks/{618f8807-69fc7bb97c2b87c1.js → 618f8807-fbb1466bc29c17c6.js} +0 -0
  583. /package/dashboard/.next/static/chunks/{7498-d1814d68ba346d13.js → 7498-7cf464d8af69cd0a.js} +0 -0
  584. /package/dashboard/.next/static/chunks/app/_not-found/{page-c299b935209993df.js → page-5ff5d54b6fd6f17e.js} +0 -0
package/README.md CHANGED
@@ -1,461 +1,259 @@
1
- # Hex
1
+ # Hex — AI-enhanced manual review for Solidity audits
2
2
 
3
- A toolkit for Solidity smart contract auditors. Hex combines Claude Code skills, deterministic analysis tools, and a local dashboard to take you from "I just received the code" to "here are my validated findings" — faster and with better coverage.
3
+ You read the code and make the calls. Hex keeps an exact map of the protocol, runs AI where breadth beats depth, and makes the AI prove what it claims.
4
4
 
5
- Hex does not replace your expertise. It automates the mechanical parts of auditing (parsing, stat collection, diagramming, PoC scaffolding, finding write-ups, LaTeX report generation) so you can spend your time on what actually matters: reading code and thinking about what can break.
5
+ The first versions of Hex automated the boring parts of an audit. Hex is now a way of auditing in which manual review and AI work as one loop: the AI covers ground fast and checks itself, and you spend your time where judgement matters.
6
6
 
7
- ![Hex dashboard — VaultX Protocol home page with KPI strip, AI-generated overview, and contract architecture](dashboard.png)
7
+ [![Watch the demo: Hex in Claude Code, from an empty repo to a fix review](docs/media/demo-poster.png)](https://youtu.be/VIDEO_ID)
8
+ <!-- Replace VIDEO_ID with the YouTube video id once the demo is uploaded. -->
8
9
 
9
- ## How It Works
10
+ ## The hybrid loop
10
11
 
11
- You drive Hex through Claude Code. Type `/init-audit` and Claude runs the whole pre-review pipeline. Three components do the work behind the scenes off a shared project directory:
12
+ | You | Hex |
13
+ |---|---|
14
+ | Read the code, follow the flows, decide what breaks | Exact facts from the compiler: call graph, every read and write, storage layout, every reference |
15
+ | Question the model and accept the invariants that hold | A protocol model built by agents working in silos, then attacked by skeptics; contested claims are marked |
16
+ | Write findings, narrate what you see, sign off function by function | Attacker agents over your scope; every finding deduplicated, then reproduced with a PoC or refuted twice |
17
+ | Judge the client's fixes | Fix review re-runs every PoC on the fix commit and flags the changes nobody explained |
18
+ | Own the report | A report drafted from what you verified |
12
19
 
13
- **Claude Code skills** are the front door. They handle anything that requires reasoning — generating the protocol overview and diagrams, checking spec conformance, writing PoCs, drafting findings, ingesting external AI reports, syncing with GitHub, producing the final LaTeX report. You invoke them as native slash commands (e.g., `/init-audit`, `/write-finding`, `/validate-finding`). Skills are markdown files that ship with the `hex` package and get copied into your project's `.claude/skills/` directory. They're editable per-project if you need to customise them.
20
+ The two halves meet on the dashboard's **Review** page, a calm workspace next to your Claude Code session:
21
+ - **Blind spots:** the riskiest code that nobody, human or AI, has looked at hard yet.
22
+ - **Walk flows like in your IDE:** go to definition through interfaces, peek inline, list every caller and every write.
23
+ - **Comments in the code**, pull-request style, and **Diane**, a voice pair-auditor who checks what you say against the code.
24
+ - **Ask about *this*:** select anything and ask Claude why it is safe; the Hex MCP server tells it what you are looking at.
14
25
 
15
- **The `hex` CLI** is the deterministic engine the skills call into. It wraps battle-tested tools like Slither, solc, and Forge rather than reinventing static analysis, and it emits structured JSON with confidence metadata so you always know how much to trust a given data point. You can call it directly when you want to, but you usually won't — `/init-audit` does it for you.
26
+ ![The Review page: walking a flow through an interface, with an inline peek](dashboard.png)
16
27
 
17
- **The dashboard** is a local Next.js app that visualises everything the tools and skills produce. It reads directly from your project directory and auto-refreshes when files change. The Issues board writes back to `tracking.json`/`findings.json` when you drag a card between columns or edit it in the modal.
28
+ ## What Hex does
18
29
 
19
- All three components read from and write to the same project directory. There is no server, no database, no accounts. Everything stays local.
30
+ **Exact facts from the compiler.** `hex analyze` compiles the project into Hex's own cache (never your `out/`) and reads the solc AST: every call edge resolved by the compiler (`internal`, `super`, `library`, `external`, virtual dispatch, modifiers), every read and write of every state variable, inheritance linearization, entry points, and the compiler's own storage layout. No regexes, no heuristics. When a project does not compile, Hex falls back to a parser and says so.
20
31
 
21
- ## Prerequisites
32
+ **A verified protocol model, built by agents.** `/init-audit` runs a team of agents in waves:
33
+ - Independent readers each model one cluster of contracts, and a docs reader extracts what the documentation promises without ever seeing the code.
34
+ - A synthesizer merges the drafts into one model: actors, assets, privileges and their worst cases, trust assumptions, dependencies, state machines, accounting equations, risky flows, and proposed invariants.
35
+ - Skeptics then check every claim against the code without seeing the synthesizer's reasoning. Claims end up `verified` or `contested`, and contested claims are often where the bugs are.
22
36
 
23
- Before using Hex, make sure you have the following installed:
37
+ **Diagrams that explain.** Five views drawn from the verified model, rendered in Excalidraw, each with a one-sentence takeaway:
38
+ - **custody**: where the money sits and who can move it
39
+ - **privilege**: who can do what, and the worst case
40
+ - **accounting**: the conservation law and every function that moves each term
41
+ - **state machine**: lifecycles and their guards
42
+ - **sequence**: the riskiest cross-contract flows
24
43
 
25
- - **Claude Code** — Anthropic's CLI tool for agentic coding
26
- - **Node.js** (v18+) and npm
27
- - **Foundry** (`forge`, `cast`) — or Hardhat if that's what the project uses
28
- - **Slither** — `pip install slither-analyzer`
29
- - **solc** — the Solidity compiler (managed via `solc-select` or Foundry)
30
- - (Optional, for `/ingest-aa-report`) **AuditAgent CLI** — `pip install git+https://github.com/NethermindEth/auditagent-cli.git`
44
+ You can edit them in the dashboard and put them in the report.
31
45
 
32
- Run `hex doctor` once you've installed Hex (next section) to confirm everything is in place — it prints a labelled preflight table with install hints for anything missing.
46
+ **Findings with proof.** `/ai-audit` runs 12 attacker agents (a fork of pashov's solidity-auditor). `/prevalidate` reproduces each new machine finding with a PoC or refutes it with two independent agents, and conclusive cases move on their own. `/validate-finding` writes a PoC by default. One dedup engine serves every source. Triage rules (trusted roles, out-of-scope tokens, known issues) feed back into every AI run so the same false positives stop coming back.
33
47
 
34
- ## Quick Start
48
+ **A review workspace next to the CLI.** The dashboard tracks review per function (unread → read → questioned → cleared), ranks blind spots by risk, lets you walk flows and comment in the code, and shows the board, the model and the report. Select something in the dashboard and ask Claude about "this": the Hex MCP server tells the CLI session what you are looking at.
35
49
 
36
- ### 1. Clone the client project and install Hex
50
+ Everything stays local: no server, no database, no accounts.
37
51
 
38
- ```bash
39
- # Clone or receive the client project as usual
40
- git clone https://github.com/client/protocol.git
41
- cd protocol
52
+ ## Prerequisites
42
53
 
43
- # Install Hex globally
44
- npm install -g hex-audit
45
- ```
54
+ - **Claude Code**
55
+ - **Node.js** (v18+) and npm
56
+ - **Foundry** (`forge`), or Hardhat if that is what the project uses
57
+ - Optional: **Medusa** / **Echidna** for `/fuzz`; `gh` (GitHub CLI) for `/sync-issues` and `/fix-review`; a local Whisper engine (`pip install faster-whisper`) for Diane; the AuditAgent CLI for `/ingest-aa-report`
46
58
 
47
- ### 2. Drop the skills into the project and open Claude Code
59
+ `hex doctor` checks all of it.
60
+
61
+ ## Quick Start
48
62
 
49
63
  ```bash
50
- hex claude # copies the audit skills into .claude/skills/
51
- claude # open Claude Code in this directory
64
+ git clone https://github.com/client/protocol.git && cd protocol
65
+ npm install -g hex-audit
66
+ hex claude # installs the skills and registers the Hex MCP server in .mcp.json
67
+ claude # approve the "hex" MCP server once when asked
52
68
  ```
53
69
 
54
- `hex claude` is the only CLI call you need before Claude Code can take over — it copies the skill files so `/init-audit` and friends show up as native slash commands.
55
-
56
- ### 3. Let Claude initialise the audit
57
-
58
- Inside Claude Code (switch to **Opus** first):
70
+ Inside Claude Code:
59
71
 
60
72
  ```
61
73
  /init-audit
62
74
  ```
63
75
 
64
- Claude will ask you for scope, commit, chain, and docs URL, then run the entire pre-manual-review pipeline in one skill: dependency-safety audit → `hex analyze` → protocol overview → system diagram → flow charts → spec conformance → materialize conformance deviations onto the issue board as Potential cards.
65
-
66
- By the time `/init-audit` finishes, every analysis page on the dashboard has data and the `/issues` board shows the conformance-derived items waiting for manual triage.
76
+ It asks for the scope, commit, chain, docs and (optionally) the GitHub repo, then:
77
+ 1. Runs the dependency-safety gate before anything compiles.
78
+ 2. Builds the exact facts.
79
+ 3. Runs the agent waves.
80
+ 4. Builds the diagrams.
81
+ 5. Files conformance deviations as Potential cards.
82
+ 6. Opens the dashboard at `http://localhost:3000`.
67
83
 
68
- ### 4. Dashboard opens automatically
84
+ Accept the invariants that hold (on the Model page or with `hex invariant accept`), then start reading. The **Today** page tells you where.
69
85
 
70
- `/init-audit` launches `hex dashboard` in the background as its last step, so `http://localhost:3000` opens in your browser when the pre-review pipeline finishes. Leave it open as you work — every page fills in automatically as Claude generates more analysis. If you ever need to start it manually, just run `hex dashboard` in a second terminal (`--port 8080` for a custom port, `--no-open` to skip the auto-open).
86
+ > Always call the CLI as `hex …` or `npx --no-install hex …`. An unrelated npm package is named `hex`; a bare `npx hex` on a machine without hex-audit would download and run it.
71
87
 
72
88
  ---
73
89
 
74
90
  ## The Audit Workflow
75
91
 
76
- Hex follows a four-phase workflow. You move through the phases sequentially, but you can always go back and re-run earlier steps. Every command in this section is typed inside Claude Code.
92
+ ### Phase 1: Pre-review (`/init-audit`)
77
93
 
78
- ### Phase 1 — Pre-review (`/init-audit`)
94
+ **Waves and silos.** Agents work in silos where independence matters and share context where integration matters. They never message each other; they communicate through files under `.hex/model/` and answer exact questions with `hex facts query`.
79
95
 
80
- One skill does it all:
81
-
82
- ```
83
- /init-audit
84
- ```
85
-
86
- Inside `/init-audit`:
87
-
88
- - **Dependency safety scan.** Inspects `package.json` install hooks, Foundry `lib/` submodules, `foundry.toml` (FFI, fs_permissions, remappings), `.env*` for plaintext secrets, `.vscode/extensions.json` for untrusted publishers. Stops before compilation if anything looks risky.
89
- - **`hex analyze`** runs stats, deps, access, state, calls, patterns, constraints in parallel, then surface last.
90
- - **`overview.md`** — a 2-3 paragraph protocol overview with a key contracts table, external dependencies, and architecture notes. Same scope as the simpler standalone skill it replaced — pure description, no findings or speculation.
91
- - **System diagram** — `.hex/diagrams/diagram.mmd` (split into multiple files if >15 nodes). Semantic symbols (🏦 Vault, 💰 Token, 🔮 Oracle, 🔒 Governance, 📦 Storage), trust-zone colour coding, typed edge labels (delegatecall, external call, access-controlled), visual legend.
92
- - **Flow charts** — `.hex/diagrams/flow-*.mmd` per archetype (Vault → deposit/withdraw/strategy; Lending → borrow/repay/liquidate; Bridge → send/receive; Governance → propose/vote/execute; AMM → swap/add/remove; Staking → stake/claim/compound). Distinct shapes by semantic role. Every decision diamond shows both success and revert paths.
93
- - **Spec conformance** — cross-references docs, NatSpec, interfaces, ERC/EIPs. Canonical specs are fetched from `eips.ethereum.org`. Output: `spec-conformance.json` with `CONFORMS / DEVIATES / PARTIAL / UNVERIFIABLE / UNDOCUMENTED` + spec-section URLs.
94
- - **Materialize conformance items.** Every DEVIATES/PARTIAL spec item is materialized as a Potential card on the issue board (source `conformance`).
95
-
96
- All pages support filtering by confidence level so you can focus on entries that need manual verification.
96
+ | Wave | Who | Silo? | Output |
97
+ |---|---|---|---|
98
+ | 0 | You + orchestrator: inputs, dependency-safety gate, `hex init`, `hex analyze` | — | `facts.json`, `stats.json`, `diff.json` |
99
+ | 1 | Contract readers (one per cluster), docs extractor (docs only), standards checker, prior-audit importer | **siloed** | claim drafts |
100
+ | 2 | Synthesizer | shared | `model/protocol.json`, `model/invariants.json`, `overview.md` |
101
+ | 3 | Skeptics (per model section), conformance checker, regression checker | **siloed** | verified / contested claims, conformance cards |
102
+ | 4 | Diagram composers (per view) | shared | `model/diagrams/*.excalidraw` |
97
103
 
98
104
  #### Differential audits
99
105
 
100
- For a re-audit, pick **Differential** when `/init-audit` asks for the audit type. You give a **base commit** (what the previous audit covered), the **head commit** (checked out), and optionally the **previous audit**: the old engagement's `.hex/` folder, or its report as PDF or Markdown.
101
-
102
- ```bash
103
- # what /init-audit runs for you
104
- npx hex init --mode diff --base <base-commit> --scope "src/**/*.sol" [--previous-audit ../old-audit/.hex]
105
- npx hex analyze # the usual analyses at head, then `hex diff`
106
- ```
107
-
108
- `hex diff` is deterministic (AST + git, no model). It writes `.hex/diff.json`:
109
-
110
- - **Changed entities**: functions, modifiers, state variables, events, errors, structs and inheritance, each `added` / `modified` / `removed` / `comments_only`. Comment and whitespace edits do not count as code changes, and overloads are told apart by signature.
111
- - **Storage layout changes**: variables inserted, removed, reordered or retyped, changed storage structs, and every contract that inherits a changed layout.
112
- - **Impacted flows**: every function the change reaches, with the reason chain. A function is impacted when it calls into changed code, applies a changed modifier, reads state a changed function writes, dispatches to a changed override, or exposes an impacted function by inheritance. Entry points are flagged, and every row carries a confidence.
113
-
114
- `/init-audit` then narrows each phase to that change set: a `diff-overview.md` explains what changed and why (from the diff and the commit log), the flow charts cover the impacted flows, and conformance checks only changed and impacted functions. With a previous audit, prior findings are imported to `.hex/previous-audit/` and regression-checked; only **regressions** become board cards (source `prior-audit`), while acknowledged issues stay known issues. The dashboard gains a **Changes** page, and `/generate-report` writes the report as a differential review of base → head.
115
-
116
- #### AI audit (`/ai-audit`)
117
-
118
- `/ai-audit` runs **12 specialised attacker agents in parallel** over the audit scope, gates their output, and assembles one report. It is a fork of [pashov's `solidity-auditor` skill](https://github.com/pashov/skills/tree/main/solidity-auditor) (v4.1, MIT), adapted for Hex:
119
-
120
- - **Scope** comes from `.hex/config.json`. In a differential audit it scans only the changed and impacted files, and every agent gets a brief on the change.
121
- - **Findings land on the board** as Potential cards (source `ai-audit`, status `unverified`). Each one is rewritten to Hex's finding standard and given a severity, then deduped against every card already on the board. Re-scans never file the same finding twice.
122
- - **Leads** (trails without a complete proof) go to the contract's **Notes** as open leads, not to the board.
123
- - Loop mode (`--loop 3`, or pick a pass count when asked) and the cross-scan memory work as upstream. Everything the skill writes lives under `.hex/ai-audit/`.
124
-
125
- ```
126
- /ai-audit
127
- /ai-audit --loop 3
128
- /ai-audit src/Vault.sol
129
- ```
130
-
131
- ### Phase 2 — Manual review
132
-
133
- Read the code in your editor. Drop `@audit-issue` comments above anything suspicious:
134
-
135
- ```solidity
136
- // @audit-issue Possible reentrancy — external call before state update.
137
- IERC20(token).transfer(recipient, amount);
138
- ```
139
-
140
- When you have something concrete, file it as a Potential issue:
141
-
142
- ```
143
- /write-finding for the rounding error in src/Vault.sol
144
- ```
145
-
146
- `/write-finding` allocates a uniform `H-NNN` id (all issues share one scheme regardless of origin; `source` is a separate field) and records the finding with `status: "pending_validation"` and `source: "manual"`, so the card lands in the **Potential** column. It does not write `@audit-issue` comments into the source — the board is the only place the issue lives.
147
-
148
- Phase 2 is where Hex gets out of your way. You think; the toolkit just gives you a place to record what you find.
149
-
150
- ### Phase 3 — Validate, ingest, sync
151
-
152
- #### Validate any Potential card (`/validate-finding`)
153
-
154
- `/validate-finding` is source-agnostic. It validates:
155
-
156
- - Manual `pending_validation` entries from `/write-finding`.
157
- - Conformance DEVIATES/PARTIAL entries materialized by `/init-audit`.
158
- - Auditagent `unverified` entries materialized by `/ingest-aa-report`.
159
- - AI audit `unverified` entries filed by `/ai-audit`.
160
- - Prior-audit regressions filed by `/init-audit` in a differential audit.
161
- - GitHub teammate entries materialized by `/sync-issues`.
162
-
163
- ```
164
- /validate-finding H-003
165
- /validate-finding for the rounding issue in Vault.sol
166
- ```
167
-
168
- Claude reads the relevant source record, traces the attack path in the code, and writes a validation memo to `.hex/validations/<id>_memo.md`. Then it asks per issue:
169
-
170
- > The issue appears valid. PoC or memo-only?
171
-
172
- If PoC: invokes `/generate-poc` to produce a runnable test and iterates until it passes. If memo-only: skips PoC, just records the validation reasoning.
173
-
174
- Valid → the card moves to Verified (`hex issue move`). Invalid → it moves to Invalid. Severity adjustment is offered after promotion. To clear a whole backlog, **`/validate-all-findings`** runs this same flow over every Potential card, one at a time.
175
-
176
- #### Ingest a Nethermind AuditAgent scan (`/ingest-aa-report`)
177
-
178
- Hex's only AI integration is **Nethermind AuditAgent**, and it expects the scan to already exist. The skill **does not start scans** — you start the scan separately (the Nethermind portal or `aa scan --quality auditor <scope-files>` from the command line), then paste the scan ID:
179
-
180
- ```
181
- /ingest-aa-report <scan-id>
182
- ```
183
-
184
- The skill:
185
-
186
- 1. Calls `aa scan --status <scan_id>`. If the scan is still running, it prints status and exits — come back later. (`hex ai-status --watch` in a second terminal notifies when the scan finishes.)
187
- 2. On completion, fetches the report and writes raw output to `.hex/ai-results/auditagent/raw-output.md` plus normalised findings to `findings.json` + `metadata.json` under the same folder.
188
- 3. Materializes each finding as a Potential card (source `auditagent`, status `unverified`).
189
- 4. **Runs inline dedup** against every existing tracking entry. Auditagent findings that match a manual / conformance / github entry on contract+function+root_cause+attack_vector flip to `duplicate` and surface in the Duplicate column with the match_signals visible on the card.
190
-
191
- #### Team mode (`/sync-issues`)
192
-
193
- GitHub is the source of truth for an audit's findings. Set the repo at init time with `hex init --github-repo <owner/repo>` (or `settings.github.repo` in `.hex/config.json`) — the firm's internal repo, e.g. `nethermind/audit-vaultx` — and authenticate the `gh` CLI once:
194
-
195
- ```bash
196
- gh auth login
197
- ```
198
-
199
- Hex never stores GitHub credentials — `/sync-issues` drives the `gh` CLI directly. Then:
200
-
201
- ```
202
- /sync-issues
203
- ```
204
-
205
- One invocation does both directions. **Identity is the GitHub issue number `#N`** — there is no hidden footer in the issue body (auditors create issues by hand), so reconciliation matches a local finding to the issue number it has stored.
206
-
207
- - **Pull every issue** in the repo (no label filter — audit repos contain only findings). Each issue's title (`[Severity] Title`) and five-field body are parsed back into the local finding. If a body is blatantly not in the Hex format it's skipped with a warning. Issues already linked by `#N` are refreshed from GitHub; new ones become local findings. All pulled issues land in the **Synced** column.
208
- - **Push** every local finding whose tracking status is in `settings.github.publish_status` (default `["verified"]`) and that isn't already on GitHub. The body is exactly the five-field template (File(s), Description, Recommendation(s), Status, Update from the client) — no labels, no footer. The returned issue number is stored on the finding, which locks it into Synced.
209
-
210
- **Once synced, an issue is read-only in Hex.** Edit it on GitHub (severity, description, recommendation, status), then re-run `/sync-issues` to pull the changes back. `/generate-report` reports only from synced issues. The board's `/issues` page surfaces sync state as a chip: `GH unsynced` (verified, not pushed), `GH #N open` / `GH #N closed`, or `GH conflict`.
211
-
212
- Comments stay on GitHub — Hex never posts, edits, or deletes comments. Auditors discuss inside GitHub itself.
213
-
214
- ### Phase 4 — Deliverable (`/generate-report`)
215
-
216
- Once findings are validated and the engagement is winding down:
217
-
218
- ```
219
- /generate-report
220
- ```
221
-
222
- The skill prompts once for any missing report metadata (initial/final commit, dates, audit type, documentation/test assessment, kick-off/availability notes) and persists them to `config.json` under `settings.report.*` so reruns don't re-prompt. Then it emits seven report sections into `.hex/report/`, each in two forms: a `.txt` for the dashboard viewer / copy-paste and a numbered `.tex` (`01-executive-summary.tex`, …) for direct `\input{}` into the Overleaf `main.tex`:
223
-
224
- 1. **Executive Summary** (§1) — project synopsis, severity histogram, status histogram, summary table.
225
- 2. **Audited Files** (§2) — LaTeX table of scope files (LoC, comments, ratio, blank, total).
226
- 3. **Summary of Issues** (§3) — table with `\hyperref` rows.
227
- 4. **System Overview** (§4) — descriptive protocol architecture (components, actors & roles, per-module/flow subsections) built from `overview.md` and the access-control/deps analysis.
228
- 5. **Issues** (§6) — one `\subsection{[Sev] title}\label{issue:N}` per synced finding (description, code blocks via `minted`, recommendation, status, client update).
229
- 6. **Documentation Evaluation** (§7) — a `tcolorbox` remarks paragraph about the client's documentation.
230
- 7. **Test Suite Evaluation** (§8) — coverage summary and automated-tooling note, generated from `stats.json.test_coverage`.
231
-
232
- Upload these into the Nethermind Overleaf template's matching slots (§5 risk methodology and §9 conclusion stay template-static). Only `synced` findings make the report; duplicates, rejected, and pending entries are skipped.
233
-
234
- ---
235
-
236
- ## Claude Code Skills Reference
237
-
238
- Each skill has a recommended model — switch your Claude Code model before invoking skills that recommend Opus.
239
-
240
- | Skill | Phase | Recommended Model | What it does |
241
- | ----------------------- | ----- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
242
- | `init-audit` | 1 | Opus | Dependency-safety → `hex analyze` → overview → diagram → flows → spec conformance → materialize DEVIATES/PARTIAL items as Potential cards. Full or differential (base → head, impacted flows, prior-findings regression check) |
243
- | `ai-audit` | 1-3 | Opus | 12 parallel attacker agents (fork of pashov's solidity-auditor v4.1); findings → Potential cards with dedup, leads → contract notes; diff-aware |
244
- | `write-finding` | 2 | Sonnet | Records a manual issue to `findings.json` as a Potential card (`status: pending_validation`, `source: manual`) |
245
- | `diane` | 2 | Sonnet | Voice pair-auditor: ingests recorded narration into a structured per-contract profile (Leads / Description / Questions), verifies your claims against the code, and surfaces leads |
246
- | `validate-finding` | 3 | Opus | Validates any Potential card (manual / ai-audit / auditagent / conformance / github / prior-audit); per-issue choice of PoC vs memo-only; promotes to Verified or Invalid |
247
- | `validate-all-findings` | 3 | Opus | Runs the `/validate-finding` flow over every Potential card, one at a time |
248
- | `generate-poc` | 3 | Opus | Generates and runs a PoC test (invoked by `/validate-finding`) |
249
- | `ingest-aa-report` | 3 | Sonnet | Ingests a completed Nethermind AuditAgent scan by ID; materializes findings + inline dedup |
250
- | `sync-issues` | 3 | Sonnet | Two-way GitHub Issues sync; GitHub is the source of truth (issue number is identity, synced issues are read-only) |
251
- | `generate-report` | 4 | Sonnet | Writes the LaTeX report sections (exec summary, audited files, summary, system overview, issues, documentation eval, test suite) as `.txt` + `.tex` from synced issues |
252
-
253
- ### Where Skills Live
254
-
255
- Skills use Claude Code's native skill format, stored in `.claude/skills/<name>/SKILL.md`. They're copied there when you run `hex claude` or `hex init`.
256
-
257
- ```
258
- .claude/skills/
259
- ├── .hex-skills.json # which skills Hex installed (cleanup never touches your own skills)
260
- ├── init-audit/SKILL.md
261
- ├── ai-audit/ # directory skill: SKILL.md + references/ (agents, assembler, LICENSE)
262
- ├── write-finding/SKILL.md
263
- ├── diane/SKILL.md
264
- ├── validate-finding/SKILL.md
265
- ├── validate-all-findings/SKILL.md
266
- ├── generate-poc/SKILL.md
267
- ├── ingest-aa-report/SKILL.md
268
- ├── sync-issues/SKILL.md
269
- └── generate-report/SKILL.md
270
- ```
271
-
272
- **How Claude Code finds them:** Claude Code auto-discovers skills in `.claude/skills/`. They appear as native slash commands — type `/` in Claude Code to see them.
273
-
274
- **Customising skills:** Edit any `SKILL.md` file in place. `hex claude` and `hex update-skills` only remove skills Hex installed itself (tracked in `.hex-skills.json`), so a project's own skills, such as a separate `solidity-auditor` install, are left alone.
275
-
276
- **Upgrading Hex:**
277
-
278
- ```bash
279
- hex update # install latest hex-audit + prompt to re-sync skills (one command)
280
- hex update --check # check for an available update without installing
281
- hex update-skills # re-sync skills only (use if you've already npm-installed manually)
282
- hex update-skills --keep-custom # skip existing skill files to preserve per-project modifications
283
- ```
284
-
285
- `hex update` detects how Hex was installed (global or local), runs the appropriate `npm install …@latest`, then asks whether to re-copy the bundled skill files into the current project's `.claude/skills/`. Both commands remove orphaned skill directories so renamed/deleted skills clean up across versions.
286
-
287
- ---
288
-
289
- ## Notes & Diane (voice pair-auditor)
290
-
291
- Diane is an optional companion for **Phase 2 manual review**. You read a contract top-to-bottom and narrate your thinking out loud; Diane records it, organizes it into a living per-contract profile, and audits alongside you.
292
-
293
- **The loop:**
294
-
295
- 1. **Record** — open the dashboard **Notes** page (`/notes`), pick the contract from the dropdown, and hit Record. Audio is transcribed **locally** with a Whisper engine — nothing leaves your machine. The model is loaded only while the dashboard is running and is freed when you close it.
296
- 2. **Process** — run **`/diane`** in Claude Code. It ingests the latest recording into the contract's structured profile:
297
- - **Leads** — things worth investigating (only open ones are shown; closing one or logging it as a finding removes it).
298
- - **Description** — Purpose / Inheritance / Storage / Roles & Modifiers / Functions (one collapsible entry per function).
299
- - **Questions** — your questions with answers, collapsible.
300
- 3. **Pair-audit** — Diane verifies the claims you make against the code, corrects what's wrong (with `file:line`), flags what you missed, and ends each run with a candid verdict.
301
- 4. **Track** — once a contract is marked "done reading" with no open leads and no unanswered questions, it auto-ticks as reviewed on `/progress`.
302
-
303
- **Whisper setup (one-time):** install a local engine — `pip install faster-whisper` (lightweight, CPU) or `pip install openai-whisper`. Without one, recordings are still saved and Hex shows a setup hint; transcription just waits until an engine is present.
106
+ Pick **Differential** when `/init-audit` asks. Give the base commit (what the previous audit covered), the head commit, and optionally the previous audit (its `.hex/` folder or its report).
107
+ - **What changed:** `hex diff` compiles both commits and reports every changed function, modifier, variable, event, error, struct and base list.
108
+ - **Storage layout:** the compiler storage-layout diff, slot by slot. An insertion that shifts every later slot is called out explicitly.
109
+ - **Impact:** every function the change reaches, through calls, modifiers, state coupling, virtual dispatch and inheritance.
110
+ - **Focus:** every wave then focuses on the change.
111
+ - **Prior findings:** imported, and the ones the change touched are regression-checked. Only regressions become cards.
112
+ - **Dashboard and report:** a Changes page appears, and `/generate-report` writes a differential review.
113
+
114
+ ### Phase 2: Review
115
+
116
+ **Review map.** Read the code with the dashboard's **Review** page open:
117
+ - Every in-scope function has a state (unread, read, questioned, cleared) and a risk score built from facts and the model: moves value, updates accounting, external calls, privileged, changed in a diff, and so on.
118
+ - **Blind spots** are the riskiest functions nobody, human or AI, has looked at hard.
119
+ - Mark functions with the keyboard (`r`/`q`/`c`) or the inspector.
120
+ - **Walk flows like in your IDE.** Ctrl/⌘-click (or F12) any call, variable, type or event to go to its definition; calls through an interface land where they run (`IToken.transferFrom` → `MockToken.transferFrom`). Alt-click (⌥F12) peeks the code inline under the call. On a function's name, or with ⇧F12, a band lists every call site (or every read and write of a state variable). Back and Forward retrace the path, and the code header shows the trail. Upstream and downstream come from the compiler (`.hex/xref.json`, written by `hex facts`); `hex facts query call-sites|implementations` gives the same answers to Claude.
121
+ - **Comment on code** like a pull request: hover a line and click `+`, or select lines and click *Comment*. Comments are stored in `.hex/notes/comments.json` and follow their code when lines move. *Write to source* puts a comment into the file as `// @audit` lines (and *Remove from file* takes it out again); Hex rebuilds the facts afterwards because the line numbers shift. Diane and Claude read them (`hex note comments`, MCP `hex_code_comments`).
122
+
123
+ **Diane, the voice pair-auditor.** Narrate while you read: record on the Review page, then run `/diane`. Diane:
124
+ - turns the narration into a structured note for the contract;
125
+ - checks your claims against the code, then corrects mistakes and flags what you missed;
126
+ - **ticks the functions you say you are done with**. Only what you say counts; she never ticks on inference, and a function where she found a problem goes to *questioned* instead.
127
+
128
+ Transcription is local (Whisper).
129
+
130
+ **Record findings and run the AI.**
131
+ - **Manual findings:** `/write-finding`.
132
+ - **AI audit:** `/ai-audit` runs 12 attacker agents over the scope, or over the changed and impacted code in a differential audit. Every agent is briefed with your accepted invariants and triage rules. Findings land on the board, deduped against everything there, and leads go to the contract notes. Then `/prevalidate` runs on the new cards.
133
+ - **AuditAgent:** `/ingest-aa-report <scan-id>` ingests a Nethermind AuditAgent scan the same way.
134
+ - **Fuzzing:** `/fuzz` (a fork of pashov's fizz) turns accepted invariants into Echidna/Medusa/Foundry suites. Results sync back to each invariant; a violation becomes a card whose repro test is its PoC.
135
+
136
+ ### Phase 3: Validate, sync
137
+
138
+ - **`/prevalidate`.** Validates every new machine-generated card in parallel. It moves a card on its own only in two conclusive cases:
139
+ - **reproduced:** the PoC passes, asserts the impact, and the finding passes the reality gate → Verified;
140
+ - **refuted:** two independent agents cite the blocking code → Rejected.
141
+
142
+ Everything else waits for you with a verdict and memo. Every auto-move is marked and can be reverted with one click.
143
+ - **`/validate-finding`** and **`/validate-all-findings`**: correctness, then a reality gate (true *and* a security issue?). A PoC is the default and is recorded on the card. Rejecting a finding as by-design or out of scope proposes a triage rule.
144
+ - **`/sync-issues`.** Two-way sync with GitHub Issues, and GitHub is the source of truth:
145
+ - Identity is the issue number.
146
+ - Synced cards are read-only in Hex: edit on GitHub and pull.
147
+ - Verified cards are pushed as the five-field body (File(s), Description, Recommendation(s), Status, Update from the client).
148
+
149
+ ### Phase 4: Fix review and report
150
+
151
+ - **`/fix-review`**. After the client fixes the issues, it:
152
+ 1. Maps fix commits to cards.
153
+ 2. Re-runs every PoC at the fix commit in a throwaway worktree. A PoC that reproduced the bug and now fails is the strongest proof of a fix.
154
+ 3. Sends the rest to judgement agents.
155
+ 4. Flags code the fixes changed that no finding explains, reviews each change, and records the verdict (a new card when it finds a problem).
156
+ 5. After **one confirmation**, updates only the Status and Update-from-the-client fields of each GitHub issue.
157
+ - **`/generate-report`**. Emits the seven LaTeX report sections, as `.txt` + `.tex`, from the synced issues. The System Overview uses the verified model and embeds the diagrams you marked "Use in report".
304
158
 
305
159
  ---
306
160
 
307
- ## Dashboard Pages
308
-
309
- The dashboard runs locally at `http://localhost:3000` and auto-refreshes when output files change. A live "Updated Ns ago" indicator in the sidebar footer tells you the watcher is connected.
310
-
311
- | Page | URL | What you see |
312
- | ---------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
313
- | Home | `/` | Project info, AI overview, key stats. In a differential audit, a base → head banner linking to Changes |
314
- | **Changes** | `/changes` | **Differential audits only.** Base → head summary, `diff-overview.md`, storage-layout changes, a filterable table of changed entities, the impacted flows with their reason chain and confidence, and the prior-findings regression check |
315
- | Progress | `/progress` | Weighted progress bar (70% nSLOC reviewed, 20% audit steps, 10% findings triage), contract review checklist (auto-ticks a contract once its Diane notes are done — see Notes) |
316
- | **Notes** | `/notes` | **Diane's workspace.** Record voice narration (local Whisper), then `/diane` builds a structured per-contract profile — **Leads** (open only), **Description** (Purpose / Inheritance / Storage / Roles / Functions, collapsible), **Questions** (collapsible). Per-contract section nav; close leads; "mark done reading." |
317
- | Statistics | `/stats` | Per-contract metrics, test coverage, dependencies, ERCs |
318
- | System Diagram | `/diagram` | Mermaid architecture diagram with zoom/pan |
319
- | Flows | `/flows` | Mermaid flow charts with zoom/pan |
320
- | Access Control | `/access` | Role → function matrix with "Show unprotected only" and "Show inferred / unknown modifiers" toggles |
321
- | State Variables | `/state` | Variable inventory with reader/writer tracking and storage-collision warnings |
322
- | External Calls | `/calls` | Call surface with filterable Trust column |
323
- | Functions | `/functions` | Aggregated function view |
324
- | Spec Conformance | `/conformance` | Code vs spec check results, deviations first, clickable spec links |
325
- | **Issues** | `/issues` | **The board.** Five columns (Potential / Verified / Synced / Invalid / Duplicate). Drag cards between the editable columns, click to edit (severity, description, recommendation, resolution, client update), or copy a finding as HackMD markdown. The **Synced** column is reached only via `/sync-issues` and is read-only (edit on GitHub). GitHub-sync chip per verified/synced card. |
326
- | **Report** | `/report` | The seven LaTeX report sections from `/generate-report`, each with a copy-to-clipboard button — paste straight into the Nethermind Overleaf template. |
161
+ ## Claude Code Skills
327
162
 
328
- ---
329
-
330
- ## Understanding Confidence Levels
163
+ | Skill | What it does |
164
+ |---|---|
165
+ | `init-audit` | Safety gate, exact facts, multi-agent protocol model + invariants + conformance + diagrams; full or differential |
166
+ | `ai-audit` | 12 parallel attacker agents (pashov solidity-auditor v4.1 fork); findings → board (deduped, pre-validated), leads → notes |
167
+ | `prevalidate` | Parallel PoC-or-refute validation of new machine cards; conclusive cases auto-move |
168
+ | `fuzz`, `fuzz-sync`, `fuzz-convert` | Fuzz accepted invariants (pashov fizz fork); violations become cards |
169
+ | `write-finding` | Record a manual finding as a Potential card |
170
+ | `validate-finding`, `validate-all-findings` | Validate cards; PoC by default; propose triage rules |
171
+ | `generate-poc` | Write and run a PoC (used by the validators) |
172
+ | `diane` | Narration → structured notes, pair-audit corrections, review ticks |
173
+ | `ingest-aa-report` | Ingest a Nethermind AuditAgent scan |
174
+ | `sync-issues` | Two-way GitHub Issues sync (GitHub canonical) |
175
+ | `fix-review` | Check fixes (PoCs re-run at the fix commit) and update GitHub after confirmation |
176
+ | `generate-report` | LaTeX report sections + figures |
331
177
 
332
- Every analysis output includes confidence metadata so you know how much to trust it.
178
+ Skills live in `.claude/skills/<name>/` and are editable per project. `hex claude` / `hex update-skills` only remove skills Hex installed itself (tracked in `.claude/skills/.hex-skills.json`).
333
179
 
334
- **High confidence** — Derived from compiler artifacts or established static analysis tools (solc AST, Slither detectors, compiler storage layout). Treat as ground truth.
180
+ ## The Hex MCP Server
335
181
 
336
- **Medium confidence** — Derived from AST pattern matching or known library detection (e.g., recognising OpenZeppelin Ownable). Reliable for standard patterns, but may miss custom implementations.
182
+ `hex claude` registers `hex mcp` in the project's `.mcp.json` (Claude Code asks you to approve it once). It gives the CLI session typed tools:
183
+ - **`hex_focus`**: what you have selected in the dashboard.
184
+ - **`hex_facts_query`**: exact callers, callees, readers, writers, layout, linearization and reach.
185
+ - **Model:** `hex_model_get`, `hex_invariant_*`.
186
+ - **Board:** `hex_board_list`, `hex_issue_*` (including validation, dedup and mark-duplicate).
187
+ - **Review map:** `hex_review_*`.
188
+ - **Notes and rules:** `hex_note_*`, `hex_rules_*`.
337
189
 
338
- **Low confidence** — Derived from naming heuristics (e.g., inferring a "keeper" role from a modifier named `onlyKeeper`). Use as a starting point, then verify manually.
190
+ So "why is this safe?" in the terminal knows what "this" is.
339
191
 
340
- Access-control roles also carry a `kind` field (`access_control`, `state_check`, `guard`, or `unknown`) and an `is_likely_access_control` flag. `/access` hides roles classified as `unknown` by default and exposes a "Show inferred / unknown modifiers" toggle.
192
+ ## The Dashboard
341
193
 
342
- Storage-slot collisions and inheritance-layout divergences detected from the compiler's storage layout are flagged with `Critical` severity in `state-vars.json` and roll into `attack-surface.json`.
194
+ Six destinations, one question each:
343
195
 
344
- ---
196
+ | Page | What it answers |
197
+ |---|---|
198
+ | **Today** | What should I do next? Progress, the top blind spots, cards that need triage, recent changes |
199
+ | **Model** | How does the system work? Excalidraw diagrams with takeaways (editable, exportable to the report), actors, assets, privileges, trust, dependencies, accounting, invariants, spec conformance; verified vs contested claims |
200
+ | **Review** | What have I read? Contracts → functions with review state and risk; full code viewer; inspector with facts, notes, cards and Diane's recorder |
201
+ | **Changes** | (differential audits, or after `/fix-review`) What changed, what it reaches, storage layout; fix review results |
202
+ | **Board** | Potential / Verified / Synced / Rejected / Duplicate, with validation verdicts, PoCs and auto-move reverts |
203
+ | **Report** | The LaTeX sections and figures, ready to paste into Overleaf |
345
204
 
346
- ## Output Directory Structure
205
+ It refreshes live as the CLI writes to `.hex/`. `⌘K` searches pages, contracts, functions, cards and invariants.
347
206
 
348
- All Hex outputs live in a single directory inside the project (default: `.hex/`, configurable in `config.json`).
207
+ ## Output Directory (`.hex/`)
349
208
 
350
209
  ```
351
210
  .hex/
352
- ├── config.json # Audit scope, settings (incl. settings.ai.auditagent_scan_id, settings.report.*)
353
- ├── overview.md # AI-generated protocol overview
354
- ├── stats.json # Codebase statistics and test coverage
355
- ├── deps.json # Contract dependency graph
356
- ├── access-control.json # Role → function mapping (with `kind`, `is_likely_access_control`)
357
- ├── state-vars.json # State variable inventory + storage_collisions
358
- ├── external-calls.json # External call surface
359
- ├── patterns.json # Security pattern flags (ORACLE, TEMPORAL, etc.)
360
- ├── constraints.json # Setter validation and event analysis
361
- ├── attack-surface.json # Attack surface summary
362
- ├── spec-conformance.json # Spec vs code conformance checks (with spec_location.url for ERCs)
363
- ├── spec-conformance.md # Rendered conformance report
364
- ├── diagrams/ # All Mermaid diagram files
365
- │ ├── diagram.mmd # System architecture diagram (possibly split)
366
- │ └── flow-*.mmd # Flow charts (one per flow)
367
- ├── progress.json # Audit progress tracking (contract review state)
368
- ├── findings.json # Canonical finding data (incl. resolution, update_from_client)
369
- ├── tracking.json # Board state (status, source, duplicate_of)
370
- ├── comparison.json # Dedup match_signals (written by /ingest-aa-report, /ai-audit and /sync-issues)
371
- ├── diff.json # Differential mode: changed entities, storage-layout changes, impacted flows
372
- ├── diff/changes.patch # Differential mode: in-scope unified diff, base → head
373
- ├── diff-overview.md # Differential mode: what changed and why (written by /init-audit)
374
- ├── previous-audit/ # Differential mode with a prior audit
375
- │ ├── findings.json # Prior findings, normalized
376
- │ └── review.json # Regression check per prior finding
377
- ├── ai-audit/ # /ai-audit scans
378
- │ ├── runs/<stamp>/ # Run files, assembled full-report.md, winners.tsv, hex-digest.md
379
- │ └── memory.tsv # Cross-scan ledger (when memory is on)
380
- ├── validations/ # Issue validation memos
381
- │ ├── F001_memo.md
382
- │ └── SC-003_memo.md
383
- ├── ai-results/ai-audit/ # /ai-audit records behind the board cards
384
- │ └── findings.json
385
- ├── ai-results/auditagent/ # AuditAgent ingest output
386
- │ ├── raw-output.md
387
- │ ├── findings.json
388
- │ └── metadata.json
389
- ├── ai-status.json # AuditAgent run status (used by `hex ai-status`)
390
- ├── external/github/ # Pulled teammate findings + sync metadata
391
- │ ├── findings.json
392
- │ ├── sync-status.json
393
- │ └── raw-issues.json
394
- └── report/ # Final LaTeX report sections, .txt + .tex (produced by /generate-report)
395
- ├── executive_summary.txt
396
- ├── audited_files.txt
397
- ├── summary_of_findings.txt
398
- └── findings.txt
211
+ ├── config.json # scope, mode, commits, settings
212
+ ├── facts.json # exact compiler facts (or parser fallback, flagged)
213
+ ├── stats.json # nSLOC, ERCs, coverage
214
+ ├── model/
215
+ │ ├── protocol.json # verified protocol model
216
+ │ ├── invariants.json # invariants + test results
217
+ │ ├── drafts/, verdicts/ # agent working files
218
+ │ └── diagrams/ # <name>.spec.json, <name>.excalidraw, index.json
219
+ ├── overview.md, diff-overview.md
220
+ ├── spec-conformance.json/.md
221
+ ├── diff.json, diff/changes.patch # differential mode
222
+ ├── previous-audit/{findings,review}.json # differential mode with a prior audit
223
+ ├── findings.json, tracking.json, comparison.json
224
+ ├── validations/<id>_memo.md
225
+ ├── progress.json # per-function review state
226
+ ├── triage-rules.json
227
+ ├── notes/ # Diane: contract notes, sessions, audio
228
+ ├── ai-audit/runs/<stamp>/ # /ai-audit run files and reports
229
+ ├── ai-results/{ai-audit,auditagent}/findings.json
230
+ ├── fuzz/ # /fuzz PROPERTIES.md, run data, corpora
231
+ ├── fix-review/<sha>.json
232
+ ├── focus.json # current dashboard selection (read by hex_focus)
233
+ ├── report/ # LaTeX sections + figures/
234
+ └── .cache/ # build-info, compiler output, worktrees
399
235
  ```
400
236
 
401
- You can change the output directory by setting `settings.output_dir` in `config.json` before running init.
402
-
403
- ---
404
-
405
- ## Scope vs. Full Project Access
406
-
407
- When you initialise an audit, you specify which files are in scope. This is the set of contracts you're responsible for auditing — all analysis tools focus on these files.
408
-
409
- But the entire project remains accessible. Claude Code can read out-of-scope contracts, run the existing test suite, compile everything, and leverage the project's test infrastructure when writing PoCs. The scope simply tells the tools where to focus their output.
410
-
411
- ```
412
- # In-scope: these are what you're auditing
413
- src/core/Vault.sol, src/core/Strategy.sol, src/libraries/Math.sol
414
-
415
- # Still accessible: tests, mocks, deploy scripts, dependencies, interfaces
416
- # Claude Code can read them all, forge can compile and run tests against them
417
- ```
418
-
419
- ---
420
-
421
237
  ## CLI Reference
422
238
 
423
- You usually don't call these directly — `/init-audit` and the other skills do. But they're the deterministic engine underneath, and they're useful when you want to re-run a single analysis, script something, or troubleshoot.
424
-
425
- All commands run from within the project directory (or with `--project /path/to/project`).
426
-
427
- | Command | What it does |
428
- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
429
- | `hex doctor` | Preflight check: node, forge, slither, solc, Claude Code, output-dir writability, project config |
430
- | `hex claude` | Copy skills to `.claude/skills/` for Claude Code discovery |
431
- | `hex init` | Initialise audit config — scope, commit, chain, docs URL, `--github-repo` (called by `/init-audit`) |
432
- | `hex init --mode diff --base <c>` | Differential audit against base commit `<c>`; `--previous-audit <path>` records the prior `.hex/` or report |
433
- | `hex diff` | Differential mode: changed entities, storage-layout changes and impacted flows → `diff.json` (run by `analyze`) |
434
- | `hex analyze` | Run all analysis commands in parallel (stats, deps, access, state, calls, patterns, constraints), then surface; then `diff` in differential mode |
435
- | `hex stats` | Generate codebase statistics and test coverage |
436
- | `hex deps` | Build contract dependency graph |
437
- | `hex access` | Extract access control mapping (roles → functions, including inherited) |
438
- | `hex state` | Generate state variable inventory + storage-collision detection |
439
- | `hex calls` | Map external call surface (AST-based, Slither optional) |
440
- | `hex patterns` | Detect security-relevant patterns (ORACLE, FLASH_LOAN, TEMPORAL, etc.) |
441
- | `hex constraints` | Extract setter validation status (AST-aware, follows helpers and modifiers) |
442
- | `hex surface` | Build attack surface summary cross-referencing all analysis |
443
- | `hex context` | Assemble optimised AI context from codebase |
444
- | `hex context --target Vault` | Context for a specific contract and its dependencies |
445
- | `hex context --estimate` | Show token count without generating context |
446
- | `hex dashboard` | Start local dashboard and open in browser |
447
- | `hex dashboard --port 8080` | Start dashboard on a custom port |
448
- | `hex update` | Update hex-audit to the latest version on npm, then prompt to re-sync skills into the current project |
449
- | `hex update --check` | Check for an available update without installing |
450
- | `hex update --yes` | Update and re-sync skills without the post-install prompt |
451
- | `hex update-skills` | Re-copy skill files from package, removing orphans (overwrites by default) |
452
- | `hex update-skills --keep-custom` | Skip existing skill files instead of overwriting |
453
- | `hex issue new\|move\|patch\|show` | Create and mutate board cards (sources: manual, conformance, auditagent, ai-audit, github, prior-audit) |
454
- | `hex note lead <Contract>` | Add an open lead to a contract note; idempotent with `--source` + `--source-ref` (used by `/ai-audit`) |
455
- | `hex ai-status` | Show the latest status for AuditAgent scans |
456
- | `hex ai-status --watch` | Poll every 5 minutes until pending scans resolve (typical scan: 30-60 min) |
457
- | `hex issue new --source <s> ...` | Allocate a uniform `H-NNN` id and create a board card (used by the skills) |
458
- | `hex issue move <id> --to <col>` | Move an issue between board columns (potential / verified / invalid / duplicate); materializes a finding on verify |
459
- | `hex issue patch <id> [...]` | Edit an issue's severity / resolution / description-file / recommendation-file / update-from-client / notes |
460
- | `hex issue sync-set <id> ...` | Mark an issue synced to a GitHub issue number (used by `/sync-issues`) |
461
- | `hex issue show <id>` | Print the merged finding + tracking record for an issue |
239
+ | Command | What it does |
240
+ |---|---|
241
+ | `hex doctor` | Preflight check |
242
+ | `hex claude` | Install skills into `.claude/skills/`, register the MCP server |
243
+ | `hex init [--mode diff --base <c>] …` | Initialise the audit config |
244
+ | `hex analyze` | `facts` + `stats` (+ `diff` in differential mode) |
245
+ | `hex facts` / `hex facts query <q> [ref]` | Build exact facts and the navigation index (`.hex/xref.json`) / query them: `callers`, `call-sites`, `callees`, `implementations`, `readers`, `writers`, `layout`, `linearization`, `entry-points`, `reach`, `function` |
246
+ | `hex stats` | nSLOC, ERCs, coverage |
247
+ | `hex diff [--focus <file>] [--scan-files]` | Differential analysis |
248
+ | `hex model show\|validate\|apply-verdicts` | The protocol model |
249
+ | `hex invariant list\|accept\|reject\|set-test\|link-issue\|export\|sync-fuzz` | Invariants |
250
+ | `hex diagram build\|list` | Build Excalidraw scenes from specs |
251
+ | `hex review mark\|status\|blind-spots` | The per-function review map |
252
+ | `hex issue new\|move\|patch\|show\|validation\|revert-auto\|dedup\|mark-duplicate\|exclude\|sync-set` | Board cards |
253
+ | `hex rules list\|add\|remove\|export` | Triage rules |
254
+ | `hex note …` | Notes (Diane), including `note lead` |
255
+ | `hex fix-review [run]\|propose\|reviewed\|apply` | Fix review |
256
+ | `hex mcp` | The MCP server (started by Claude Code) |
257
+ | `hex dashboard [--port <n>] [--no-open]` | The review workspace |
258
+ | `hex ai-status [--watch]` | AuditAgent scan status |
259
+ | `hex update`, `hex update-skills` | Update the package / re-sync skills |