hex-audit 0.6.3 → 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.
- package/CLAUDE.md +137 -77
- package/DEMO.md +41 -105
- package/README.md +205 -353
- package/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/app-build-manifest.json +65 -99
- package/dashboard/.next/app-path-routes-manifest.json +1 -1
- package/dashboard/.next/build-manifest.json +14 -14
- package/dashboard/.next/next-minimal-server.js.nft.json +1 -1
- package/dashboard/.next/next-server.js.nft.json +1 -1
- package/dashboard/.next/prerender-manifest.js +1 -1
- package/dashboard/.next/prerender-manifest.json +1 -1
- package/dashboard/.next/react-loadable-manifest.json +540 -119
- package/dashboard/.next/routes-manifest.json +1 -1
- package/dashboard/.next/server/app/_not-found/page.js +1 -1
- package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/api/code/route.js +1 -1
- package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/comments/route.js +1 -0
- package/dashboard/.next/server/app/api/comments/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/figures/[name]/route.js +1 -0
- package/dashboard/.next/server/app/api/figures/[name]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/focus/route.js +1 -0
- package/dashboard/.next/server/app/api/focus/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/github-status/route.js +1 -1
- package/dashboard/.next/server/app/api/invariants/[id]/route.js +1 -0
- package/dashboard/.next/server/app/api/invariants/[id]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/nav/route.js +1 -0
- package/dashboard/.next/server/app/api/nav/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/notes/done/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/lead/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/question/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/record/route.js +3 -3
- package/dashboard/.next/server/app/api/notes/route.js +2 -2
- package/dashboard/.next/server/app/api/palette/route.js +1 -0
- package/dashboard/.next/server/app/api/palette/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/progress/route.js +1 -1
- package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/watch/route.js +2 -2
- package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/xref/route.js +1 -0
- package/dashboard/.next/server/app/changes/page.js +1 -0
- package/dashboard/.next/server/app/{access → changes}/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/changes/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/excalidraw-assets/[...path]/route.js +1 -0
- package/dashboard/.next/server/app/issues/page.js +5 -28
- package/dashboard/.next/server/app/issues/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/model/page.js +1 -0
- package/dashboard/.next/server/app/{calls → model}/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/model/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/page.js +1 -20
- package/dashboard/.next/server/app/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/report/page.js +1 -1
- package/dashboard/.next/server/app/report/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/report/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/review/page.js +1 -0
- package/dashboard/.next/server/app/{conformance → review}/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/review/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app-paths-manifest.json +20 -16
- package/dashboard/.next/server/chunks/310.js +4 -0
- package/dashboard/.next/server/chunks/370.js +1 -0
- package/dashboard/.next/server/chunks/42.js +1 -1
- package/dashboard/.next/server/chunks/624.js +14 -0
- package/dashboard/.next/server/chunks/645.js +1 -1
- package/dashboard/.next/server/chunks/649.js +1 -1
- package/dashboard/.next/server/chunks/653.js +1 -0
- package/dashboard/.next/server/functions-config-manifest.json +1 -1
- package/dashboard/.next/server/middleware-build-manifest.js +1 -1
- package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dashboard/.next/server/next-font-manifest.js +1 -1
- package/dashboard/.next/server/next-font-manifest.json +1 -1
- package/dashboard/.next/server/pages/500.html +1 -1
- package/dashboard/.next/server/pages/_error.js +1 -1
- package/dashboard/.next/server/pages-manifest.json +1 -1
- package/dashboard/.next/server/server-reference-manifest.js +1 -1
- package/dashboard/.next/server/server-reference-manifest.json +1 -1
- package/dashboard/.next/static/bGV1ry1vvIbM5b506eVBR/_buildManifest.js +1 -0
- package/dashboard/.next/static/chunks/0bbe10ee.8e7ffa06d2170dfe.js +84 -0
- package/dashboard/.next/static/chunks/{1.8868c4d131111be7.js → 1.a666047ea18866fb.js} +2 -2
- package/dashboard/.next/static/chunks/1015.39008440ab15e196.js +226 -0
- package/dashboard/.next/static/chunks/1026.0ef689a305302427.js +1 -0
- package/dashboard/.next/static/chunks/1151.497fa63c5b9eba52.js +1 -0
- package/dashboard/.next/static/chunks/1164.34eb76767ebea46f.js +8 -0
- package/dashboard/.next/static/chunks/119.a9a79633900a235f.js +5 -0
- package/dashboard/.next/static/chunks/1199.f30cbfa151e56076.js +148 -0
- package/dashboard/.next/static/chunks/1291.6c486c9b1d4b1b3a.js +1 -0
- package/dashboard/.next/static/chunks/1375.64c20f1064a38a10.js +43 -0
- package/dashboard/.next/static/chunks/139.4691848fc5a46253.js +10 -0
- package/dashboard/.next/static/chunks/145.1bf74fecdb4022e3.js +11 -0
- package/dashboard/.next/static/chunks/1517.8e7075f78e22b3a0.js +8 -0
- package/dashboard/.next/static/chunks/165.6f174060a0ce2db4.js +6 -0
- package/dashboard/.next/static/chunks/1741.5c370b7702d2eb40.js +8 -0
- package/dashboard/.next/static/chunks/1799.8dc56017eede704e.js +9 -0
- package/dashboard/.next/static/chunks/1e36816c.5748c83adc8a6bd6.js +108 -0
- package/dashboard/.next/static/chunks/20154aaa.e87f69fe10483f8b.js +1 -0
- package/dashboard/.next/static/chunks/2061.eab75b3c1dfa068a.js +1 -0
- package/dashboard/.next/static/chunks/2077.5603adeb156c7d10.js +1 -0
- package/dashboard/.next/static/chunks/2148.3ce718f62d1b2f7c.js +10 -0
- package/dashboard/.next/static/chunks/2166.9f6592b9399eadd8.js +215 -0
- package/dashboard/.next/static/chunks/217-1d5b680ffd10e3f9.js +1 -0
- package/dashboard/.next/static/chunks/2208.fb884379aa3ae968.js +1 -0
- package/dashboard/.next/static/chunks/2276.112c7855333fca5f.js +6 -0
- package/dashboard/.next/static/chunks/{2291.85a70cb0c228157b.js → 2291.584b42ccad079b99.js} +1 -1
- package/dashboard/.next/static/chunks/2325.7decd077edfb81d9.js +24 -0
- package/dashboard/.next/static/chunks/2374-8c6f137938f8518a.js +1 -0
- package/dashboard/.next/static/chunks/{2383.62c035a052272594.js → 2383.ca81f980ce6528a4.js} +1 -1
- package/dashboard/.next/static/chunks/2445.18a86507d2996b95.js +1 -0
- package/dashboard/.next/static/chunks/2694.7dfa5fef28851903.js +1 -0
- package/dashboard/.next/static/chunks/2712.15dd8577973baf22.js +10 -0
- package/dashboard/.next/static/chunks/275.38af87389c1d33d7.js +34 -0
- package/dashboard/.next/static/chunks/2759.533dec5317e0a1d1.js +1 -0
- package/dashboard/.next/static/chunks/2781.fba46046dbf2693b.js +93 -0
- package/dashboard/.next/static/chunks/2805.35b4cd8a94978aaf.js +1 -0
- package/dashboard/.next/static/chunks/2812.62b213bef580b69a.js +1 -0
- package/dashboard/.next/static/chunks/{2879.51436986f93981d9.js → 2879.74d65e33e60505ee.js} +1 -1
- package/dashboard/.next/static/chunks/2895.bb57cacb7aaf42a1.js +9 -0
- package/dashboard/.next/static/chunks/2972.e5a9251b538dcf19.js +9 -0
- package/dashboard/.next/static/chunks/3205-fd963acf2fdfd080.js +2 -0
- package/dashboard/.next/static/chunks/3206.8d9a10db2b04b93f.js +1 -0
- package/dashboard/.next/static/chunks/3236.eac9855778a54518.js +1 -0
- package/dashboard/.next/static/chunks/3480.853a445a3784642a.js +1 -0
- package/dashboard/.next/static/chunks/3485.36766504793b7237.js +9 -0
- package/dashboard/.next/static/chunks/3626.c5dacee11c8fbc4d.js +64 -0
- package/dashboard/.next/static/chunks/3725.de9376dc994735d4.js +9 -0
- package/dashboard/.next/static/chunks/3774.1df377928e8387f7.js +9 -0
- package/dashboard/.next/static/chunks/3865.5e6d2d501380e03b.js +90 -0
- package/dashboard/.next/static/chunks/3887.073cece834a4eae2.js +1 -0
- package/dashboard/.next/static/chunks/3924-f1f85ccc7d59d7ab.js +1 -0
- package/dashboard/.next/static/chunks/3948.74201b9f0672234d.js +287 -0
- package/dashboard/.next/static/chunks/3963.39d72b3875dfe2e9.js +13 -0
- package/dashboard/.next/static/chunks/4013.73884b23bfaebdde.js +11 -0
- package/dashboard/.next/static/chunks/4117.278aff1fa23fd36e.js +6 -0
- package/dashboard/.next/static/chunks/4210.cc8594110017c579.js +11 -0
- package/dashboard/.next/static/chunks/4282.28485875540886cc.js +7 -0
- package/dashboard/.next/static/chunks/4318.a2f469a88d88f6d0.js +8 -0
- package/dashboard/.next/static/chunks/4363.8999a6e727c48003.js +1 -0
- package/dashboard/.next/static/chunks/4641.e03d118fffebd580.js +5 -0
- package/dashboard/.next/static/chunks/4728.e69372b5e5b61b8d.js +24 -0
- package/dashboard/.next/static/chunks/4787.821a6ad2816cdc60.js +23 -0
- package/dashboard/.next/static/chunks/483.a910dab7734a1074.js +8 -0
- package/dashboard/.next/static/chunks/4926.76693f542e9cc062.js +6 -0
- package/dashboard/.next/static/chunks/4938.03f6d04dabf38745.js +10 -0
- package/dashboard/.next/static/chunks/5060.47402abc10273699.js +1 -0
- package/dashboard/.next/static/chunks/5112.0757c2b0c285e62e.js +1 -0
- package/dashboard/.next/static/chunks/5199.c83ea7efb0eec705.js +11 -0
- package/dashboard/.next/static/chunks/5284.334c7c0587d5d47a.js +1 -0
- package/dashboard/.next/static/chunks/530.849957a8907eb288.js +1 -0
- package/dashboard/.next/static/chunks/5424.4e8ca0711a32bccf.js +7 -0
- package/dashboard/.next/static/chunks/55.a593a78be9714679.js +1 -0
- package/dashboard/.next/static/chunks/5535.6cd0bd8d368d8902.js +4 -0
- package/dashboard/.next/static/chunks/5626.7d4e93d7acbeffc9.js +10 -0
- package/dashboard/.next/static/chunks/5715.e16b1230cc4b4652.js +115 -0
- package/dashboard/.next/static/chunks/5775.a0d7c1b1e89b9a93.js +9 -0
- package/dashboard/.next/static/chunks/6014.641a2c53ba506241.js +104 -0
- package/dashboard/.next/static/chunks/6024.f099c15f75aa6722.js +79 -0
- package/dashboard/.next/static/chunks/{6052.033a6f1013c666eb.js → 6052.3001318955e5b36c.js} +2 -2
- package/dashboard/.next/static/chunks/6118.266956b3333b1d7a.js +9 -0
- package/dashboard/.next/static/chunks/6121.a2e6d93720b1205e.js +77 -0
- package/dashboard/.next/static/chunks/6177.a01cf0a03734cf09.js +1 -0
- package/dashboard/.next/static/chunks/618f8807-fbb1466bc29c17c6.js +1 -0
- package/dashboard/.next/static/chunks/6434.f560693253fea8de.js +1 -0
- package/dashboard/.next/static/chunks/6468.976d89ba133185f1.js +77 -0
- package/dashboard/.next/static/chunks/6540.6f3c4f2c6877ed89.js +1 -0
- package/dashboard/.next/static/chunks/6549.e3c4c1766cff1449.js +1 -0
- package/dashboard/.next/static/chunks/6853.d3ad43614e8ca0ab.js +1 -0
- package/dashboard/.next/static/chunks/690f35d0.ab57e02a04c7e9e0.js +119 -0
- package/dashboard/.next/static/chunks/6951.02a3a158d02158c9.js +5 -0
- package/dashboard/.next/static/chunks/6970.013f24568c87d918.js +11 -0
- package/dashboard/.next/static/chunks/7013.39d41e82b37be63b.js +9 -0
- package/dashboard/.next/static/chunks/{7020.831e16e26d91abc1.js → 7020.b718b1b9cea36e60.js} +2 -2
- package/dashboard/.next/static/chunks/7107.1c5412197912b8ed.js +8 -0
- package/dashboard/.next/static/chunks/7498-7cf464d8af69cd0a.js +1 -0
- package/dashboard/.next/static/chunks/7508.dd60e2d06d149f5f.js +9 -0
- package/dashboard/.next/static/chunks/7524.0fde4c61553d1491.js +3 -0
- package/dashboard/.next/static/chunks/7802.f0134c792fccd382.js +80 -0
- package/dashboard/.next/static/chunks/7834-47f318a04a05688f.js +1 -0
- package/dashboard/.next/static/chunks/{7a04ac15.1c6cea694301806c.js → 7a04ac15.e49de94ece135900.js} +1 -1
- package/dashboard/.next/static/chunks/8216.1138ec313908a708.js +5 -0
- package/dashboard/.next/static/chunks/{8233babc.780b8e272eda298f.js → 8233babc.09872dcb3ff44064.js} +1 -1
- package/dashboard/.next/static/chunks/8317.d0b3eddef4cae0d5.js +1 -0
- package/dashboard/.next/static/chunks/838.2b2aa006519ba44c.js +10 -0
- package/dashboard/.next/static/chunks/8398.924fd8f4c83417c0.js +7 -0
- package/dashboard/.next/static/chunks/8428b36f.8ac4e67061c01307.js +34 -0
- package/dashboard/.next/static/chunks/8514.85ccbbea8ab21d04.js +5 -0
- package/dashboard/.next/static/chunks/8538.5f7ebe76c4b63162.js +1 -0
- package/dashboard/.next/static/chunks/8645.98a43217d406500e.js +1 -0
- package/dashboard/.next/static/chunks/8687.9406baa8b5601fd0.js +1 -0
- package/dashboard/.next/static/chunks/8721.47346e2cb6412376.js +10 -0
- package/dashboard/.next/static/chunks/8770.4f544bd1a6f03a62.js +8 -0
- package/dashboard/.next/static/chunks/8812.3d96fd54dba566f8.js +9 -0
- package/dashboard/.next/static/chunks/8962.d22aa67a97970dd8.js +1 -0
- package/dashboard/.next/static/chunks/8986.b327224b83f4399a.js +5 -0
- package/dashboard/.next/static/chunks/9173.a7160f7d0b685fa7.js +1 -0
- package/dashboard/.next/static/chunks/9178.998a8c49996de8e4.js +1 -0
- package/dashboard/.next/static/chunks/9271.5f66c19a8ee1ff36.js +10 -0
- package/dashboard/.next/static/chunks/9282.f8d01442bab4c0da.js +2 -0
- package/dashboard/.next/static/chunks/9366.0ec24a0791b9b00f.js +1 -0
- package/dashboard/.next/static/chunks/9466.a914ce0de7d3bb84.js +1 -0
- package/dashboard/.next/static/chunks/9660.b1c8deae2c449d14.js +1 -0
- package/dashboard/.next/static/chunks/9707.5cd7d2ee933a4af5.js +6 -0
- package/dashboard/.next/static/chunks/9716.15fffc0b0038601d.js +4 -0
- package/dashboard/.next/static/chunks/{9717.6cf5c8c89403b651.js → 9717.bba51b78ebd8fd29.js} +1 -1
- package/dashboard/.next/static/chunks/9720.d63a0696776bcc60.js +1 -0
- package/dashboard/.next/static/chunks/9791.e3b3f5a367f63c8a.js +1 -0
- package/dashboard/.next/static/chunks/9811.2993c4cbd28e8d1b.js +1 -0
- package/dashboard/.next/static/chunks/9820.8c1efad5260e8137.js +1 -0
- package/dashboard/.next/static/chunks/985.50150e9eaa4bde33.js +39 -0
- package/dashboard/.next/static/chunks/997.56901b86e1b8a87b.js +8 -0
- package/dashboard/.next/static/chunks/app/_not-found/page-5ff5d54b6fd6f17e.js +1 -0
- package/dashboard/.next/static/chunks/app/changes/page-f8a860034221cad4.js +1 -0
- package/dashboard/.next/static/chunks/app/issues/page-da4da93188c414a6.js +1 -0
- package/dashboard/.next/static/chunks/app/layout-27a9da4610423c1e.js +1 -0
- package/dashboard/.next/static/chunks/app/model/page-9680e22fdd6ddb81.js +1 -0
- package/dashboard/.next/static/chunks/app/page-0e67750d99fb2836.js +1 -0
- package/dashboard/.next/static/chunks/app/report/page-b56b1db9b9dcf2b6.js +1 -0
- package/dashboard/.next/static/chunks/app/review/page-3ef69f0e0badd333.js +1 -0
- package/dashboard/.next/static/chunks/{b7167ec1.7afbab6f609e3326.js → b7167ec1.708a3d61698ca2e6.js} +1 -1
- package/dashboard/.next/static/chunks/c75e29e3.d91220f782934d80.js +1 -0
- package/dashboard/.next/static/chunks/c7ea4e13.3073a2f551aa5ac8.js +1 -0
- package/dashboard/.next/static/chunks/framework-a117d81bf1b91f9a.js +33 -0
- package/dashboard/.next/static/chunks/main-9c95a7ffedc7afb4.js +1 -0
- package/dashboard/.next/static/chunks/main-app-5662c64b50ba40d1.js +1 -0
- package/dashboard/.next/static/chunks/pages/_app-308fef0bf9b328f2.js +1 -0
- package/dashboard/.next/static/chunks/pages/_error-c91b5eabd7ac9382.js +1 -0
- package/dashboard/.next/static/chunks/webpack-6da70e4f9fcf1799.js +1 -0
- package/dashboard/.next/static/css/ceafd91ca8dd753d.css +3 -0
- package/dashboard/.next/static/css/e4aad1f9c715b79a.css +1 -0
- package/dashboard/.next/static/media/39f449c8730c2295-s.woff2 +0 -0
- package/dashboard/.next/static/media/86f65e8637cc94e3-s.woff2 +0 -0
- package/dashboard/.next/static/media/8760c4774489e4ba-s.p.woff2 +0 -0
- package/dashboard/.next/static/media/9fabb9c65b63d798-s.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-Bold.c8f39f24.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-Medium.1e75d8e6.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-Regular.7acbabb8.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-SemiBold.167acbf8.woff2 +0 -0
- package/dashboard/.next/static/media/a1f87af3f44fadbb-s.woff2 +0 -0
- package/dashboard/.next/static/media/f9e1dbe9676d9bb6-s.woff2 +0 -0
- package/dashboard/app/api/code/route.ts +26 -20
- package/dashboard/app/api/comments/route.ts +158 -0
- package/dashboard/app/api/diagrams/[name]/export/route.ts +26 -0
- package/dashboard/app/api/diagrams/[name]/resolve/route.ts +25 -0
- package/dashboard/app/api/diagrams/[name]/route.ts +37 -0
- package/dashboard/app/api/figures/[name]/route.ts +15 -0
- package/dashboard/app/api/focus/route.ts +35 -0
- package/dashboard/app/api/invariants/[id]/route.ts +35 -0
- package/dashboard/app/api/issues/[id]/revert-auto/route.ts +18 -0
- package/dashboard/app/api/nav/route.ts +120 -0
- package/dashboard/app/api/palette/route.ts +68 -0
- package/dashboard/app/api/progress/route.ts +54 -23
- package/dashboard/app/api/xref/route.ts +30 -0
- package/dashboard/app/changes/ChangesClient.tsx +838 -0
- package/dashboard/app/changes/page.tsx +44 -0
- package/dashboard/app/excalidraw-assets/[...path]/route.ts +56 -0
- package/dashboard/app/globals.css +231 -77
- package/dashboard/app/issues/BoardClient.tsx +817 -0
- package/dashboard/app/issues/page.tsx +27 -272
- package/dashboard/app/layout.tsx +37 -10
- package/dashboard/app/model/ModelClient.tsx +1303 -0
- package/dashboard/app/model/page.tsx +98 -0
- package/dashboard/app/page.tsx +195 -239
- package/dashboard/app/report/ReportClient.tsx +147 -74
- package/dashboard/app/report/page.tsx +25 -14
- package/dashboard/app/review/ReviewClient.tsx +1180 -0
- package/dashboard/app/review/page.tsx +93 -0
- package/dashboard/components/AutoRefresh.tsx +22 -19
- package/dashboard/components/CodeComments.tsx +303 -0
- package/dashboard/components/CodeNav.tsx +523 -0
- package/dashboard/components/CodeReference.tsx +92 -99
- package/dashboard/components/CodeViewer.tsx +526 -0
- package/dashboard/components/CommandPalette.tsx +141 -66
- package/dashboard/components/DiagramCanvas.tsx +275 -0
- package/dashboard/components/DianeNote.tsx +244 -0
- package/dashboard/components/LiveStatus.tsx +30 -68
- package/dashboard/components/MarkdownRenderer.tsx +34 -32
- package/dashboard/components/RecordButton.tsx +132 -0
- package/dashboard/components/ui/Button.tsx +39 -0
- package/dashboard/components/ui/Chip.tsx +37 -0
- package/dashboard/components/ui/EmptyState.tsx +31 -0
- package/dashboard/components/ui/Icons.tsx +126 -0
- package/dashboard/components/ui/Inspector.tsx +122 -0
- package/dashboard/components/ui/Kbd.tsx +15 -0
- package/dashboard/components/ui/ListRow.tsx +92 -0
- package/dashboard/components/ui/LocalTime.tsx +14 -0
- package/dashboard/components/ui/ProgressRing.tsx +54 -0
- package/dashboard/components/ui/ResizeHandle.tsx +93 -0
- package/dashboard/components/ui/RiskMeter.tsx +27 -0
- package/dashboard/components/ui/SearchField.tsx +55 -0
- package/dashboard/components/ui/SegmentedControl.tsx +71 -0
- package/dashboard/components/ui/SeverityDot.tsx +57 -0
- package/dashboard/components/ui/Sidebar.tsx +236 -0
- package/dashboard/components/ui/SplitView.tsx +122 -0
- package/dashboard/components/ui/StateGlyph.tsx +66 -0
- package/dashboard/components/ui/Toast.tsx +91 -0
- package/dashboard/lib/api.ts +17 -0
- package/dashboard/lib/cn.ts +4 -0
- package/dashboard/lib/data.ts +2 -21
- package/dashboard/lib/finding-markdown.ts +1 -1
- package/dashboard/lib/focus.ts +42 -0
- package/dashboard/lib/hotkeys.ts +41 -0
- package/dashboard/lib/inline-markdown.test.ts +11 -0
- package/dashboard/lib/live.ts +32 -0
- package/dashboard/lib/pane-width.ts +36 -0
- package/dashboard/lib/server/board.ts +229 -0
- package/dashboard/lib/server/diagrams.ts +191 -0
- package/dashboard/lib/server/safe-path.ts +28 -0
- package/dashboard/lib/server/workspace.ts +113 -0
- package/dashboard/lib/server/xref.ts +42 -0
- package/dashboard/lib/solidity.test.ts +37 -0
- package/dashboard/lib/solidity.ts +191 -0
- package/dashboard/lib/source.ts +28 -0
- package/dashboard/lib/types.ts +164 -0
- package/dashboard/lib/url.ts +18 -0
- package/dashboard/lib/watcher.ts +31 -22
- package/dashboard/tailwind.config.ts +6 -3
- package/dist/analysis/code-model.d.ts +113 -0
- package/dist/analysis/code-model.d.ts.map +1 -0
- package/dist/analysis/code-model.js +532 -0
- package/dist/analysis/code-model.js.map +1 -0
- package/dist/analysis/diff.d.ts +75 -0
- package/dist/analysis/diff.d.ts.map +1 -0
- package/dist/analysis/diff.js +787 -0
- package/dist/analysis/diff.js.map +1 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +25 -40
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/claude.d.ts.map +1 -1
- package/dist/commands/claude.js +5 -0
- package/dist/commands/claude.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +10 -2
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/diagram.d.ts +3 -0
- package/dist/commands/diagram.d.ts.map +1 -0
- package/dist/commands/diagram.js +71 -0
- package/dist/commands/diagram.js.map +1 -0
- package/dist/commands/diff.d.ts +25 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +257 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -18
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/facts.d.ts +23 -0
- package/dist/commands/facts.d.ts.map +1 -0
- package/dist/commands/facts.js +121 -0
- package/dist/commands/facts.js.map +1 -0
- package/dist/commands/fix-review.d.ts +9 -0
- package/dist/commands/fix-review.d.ts.map +1 -0
- package/dist/commands/fix-review.js +367 -0
- package/dist/commands/fix-review.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +106 -42
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +154 -5
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +11 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/model.d.ts +4 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +275 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +61 -3
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/review.d.ts +4 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +164 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/core/comments.d.ts +59 -0
- package/dist/core/comments.d.ts.map +1 -0
- package/dist/core/comments.js +263 -0
- package/dist/core/comments.js.map +1 -0
- package/dist/core/config.d.ts +9 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +18 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/dedup.d.ts +56 -0
- package/dist/core/dedup.d.ts.map +1 -0
- package/dist/core/dedup.js +208 -0
- package/dist/core/dedup.js.map +1 -0
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +16 -15
- package/dist/core/errors.js.map +1 -1
- package/dist/core/external-tools.d.ts +0 -14
- package/dist/core/external-tools.d.ts.map +1 -1
- package/dist/core/external-tools.js +2 -52
- package/dist/core/external-tools.js.map +1 -1
- package/dist/core/fix-review.d.ts +54 -0
- package/dist/core/fix-review.d.ts.map +1 -0
- package/dist/core/fix-review.js +98 -0
- package/dist/core/fix-review.js.map +1 -0
- package/dist/core/fuzz-sync.d.ts +93 -0
- package/dist/core/fuzz-sync.d.ts.map +1 -0
- package/dist/core/fuzz-sync.js +516 -0
- package/dist/core/fuzz-sync.js.map +1 -0
- package/dist/core/git.d.ts +31 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +157 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/issues.d.ts +35 -2
- package/dist/core/issues.d.ts.map +1 -1
- package/dist/core/issues.js +201 -30
- package/dist/core/issues.js.map +1 -1
- package/dist/core/mcp-config.d.ts +12 -0
- package/dist/core/mcp-config.d.ts.map +1 -0
- package/dist/core/mcp-config.js +29 -0
- package/dist/core/mcp-config.js.map +1 -0
- package/dist/core/model.d.ts +38 -0
- package/dist/core/model.d.ts.map +1 -0
- package/dist/core/model.js +160 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/notes.d.ts +27 -1
- package/dist/core/notes.d.ts.map +1 -1
- package/dist/core/notes.js +47 -5
- package/dist/core/notes.js.map +1 -1
- package/dist/core/review.d.ts +47 -0
- package/dist/core/review.d.ts.map +1 -1
- package/dist/core/review.js +177 -1
- package/dist/core/review.js.map +1 -1
- package/dist/core/rules.d.ts +12 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +66 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/schema.d.ts +5458 -2189
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +605 -114
- package/dist/core/schema.js.map +1 -1
- package/dist/core/scope.d.ts +8 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +18 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/core/skills.d.ts +10 -4
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +100 -37
- package/dist/core/skills.js.map +1 -1
- package/dist/diagrams/build.d.ts +18 -0
- package/dist/diagrams/build.d.ts.map +1 -0
- package/dist/diagrams/build.js +135 -0
- package/dist/diagrams/build.js.map +1 -0
- package/dist/diagrams/excalidraw.d.ts +27 -0
- package/dist/diagrams/excalidraw.d.ts.map +1 -0
- package/dist/diagrams/excalidraw.js +219 -0
- package/dist/diagrams/excalidraw.js.map +1 -0
- package/dist/diagrams/layout.d.ts +48 -0
- package/dist/diagrams/layout.d.ts.map +1 -0
- package/dist/diagrams/layout.js +686 -0
- package/dist/diagrams/layout.js.map +1 -0
- package/dist/facts/build.d.ts +23 -0
- package/dist/facts/build.d.ts.map +1 -0
- package/dist/facts/build.js +112 -0
- package/dist/facts/build.js.map +1 -0
- package/dist/facts/extract.d.ts +53 -0
- package/dist/facts/extract.d.ts.map +1 -0
- package/dist/facts/extract.js +635 -0
- package/dist/facts/extract.js.map +1 -0
- package/dist/facts/fallback.d.ts +7 -0
- package/dist/facts/fallback.d.ts.map +1 -0
- package/dist/facts/fallback.js +156 -0
- package/dist/facts/fallback.js.map +1 -0
- package/dist/facts/implementations.d.ts +29 -0
- package/dist/facts/implementations.d.ts.map +1 -0
- package/dist/facts/implementations.js +43 -0
- package/dist/facts/implementations.js.map +1 -0
- package/dist/facts/query.d.ts +35 -0
- package/dist/facts/query.d.ts.map +1 -0
- package/dist/facts/query.js +157 -0
- package/dist/facts/query.js.map +1 -0
- package/dist/facts/xref.d.ts +53 -0
- package/dist/facts/xref.d.ts.map +1 -0
- package/dist/facts/xref.js +282 -0
- package/dist/facts/xref.js.map +1 -0
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +400 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/skills/ai-audit/LICENSE +21 -0
- package/dist/skills/ai-audit/SKILL.md +486 -0
- package/dist/skills/ai-audit/UPSTREAM.md +51 -0
- package/dist/skills/ai-audit/references/agent-prompts.md +133 -0
- package/dist/skills/ai-audit/references/assemble.sh +357 -0
- package/dist/skills/ai-audit/references/dedup-and-assembly.md +420 -0
- package/dist/skills/ai-audit/references/hacking-agents/access-control-agent.md +27 -0
- package/dist/skills/ai-audit/references/hacking-agents/asymmetry-agent.md +77 -0
- package/dist/skills/ai-audit/references/hacking-agents/boundary-agent.md +79 -0
- package/dist/skills/ai-audit/references/hacking-agents/economic-security-agent.md +35 -0
- package/dist/skills/ai-audit/references/hacking-agents/execution-trace-agent.md +33 -0
- package/dist/skills/ai-audit/references/hacking-agents/first-principles-agent.md +36 -0
- package/dist/skills/ai-audit/references/hacking-agents/flow-gap-agent.md +49 -0
- package/dist/skills/ai-audit/references/hacking-agents/invariant-agent.md +44 -0
- package/dist/skills/ai-audit/references/hacking-agents/math-precision-agent.md +48 -0
- package/dist/skills/ai-audit/references/hacking-agents/numerical-gap-agent.md +46 -0
- package/dist/skills/ai-audit/references/hacking-agents/periphery-agent.md +27 -0
- package/dist/skills/ai-audit/references/hacking-agents/shared-rules.md +61 -0
- package/dist/skills/ai-audit/references/hacking-agents/trust-gap-agent.md +40 -0
- package/dist/skills/ai-audit/references/hex-board.md +211 -0
- package/dist/skills/ai-audit/references/hex-export.sh +71 -0
- package/dist/skills/ai-audit/references/judging.md +75 -0
- package/dist/skills/ai-audit/references/report-formatting.md +385 -0
- package/dist/skills/ai-audit/references/report-language.md +151 -0
- package/dist/skills/ai-audit/references/senior-auditor-sop.md +63 -0
- package/dist/skills/diane.md +26 -12
- package/dist/skills/fix-review.md +58 -0
- package/dist/skills/fuzz/LICENSE +21 -0
- package/dist/skills/fuzz/SKILL.md +655 -0
- package/dist/skills/fuzz/UPSTREAM.md +119 -0
- package/dist/skills/fuzz/agents/implementers/global-property-implementer.md +81 -0
- package/dist/skills/fuzz/agents/implementers/specific-property-implementer.md +121 -0
- package/dist/skills/fuzz/agents/invariant-discovery/adversarial-profit-maximizer.md +123 -0
- package/dist/skills/fuzz/agents/invariant-discovery/conservation-auditor.md +92 -0
- package/dist/skills/fuzz/agents/invariant-discovery/protocol-type-specialist.md +173 -0
- package/dist/skills/fuzz/agents/invariant-discovery/roundtrip-rounding-analyst.md +164 -0
- package/dist/skills/fuzz/agents/invariant-discovery/state-transition-mapper.md +92 -0
- package/dist/skills/fuzz/agents/invariant-discovery/synthesizer.md +261 -0
- package/dist/skills/fuzz/agents/protocol-analyzer.md +80 -0
- package/dist/skills/fuzz/agents/report-writer.md +135 -0
- package/dist/skills/fuzz/references/handler-patterns.md +222 -0
- package/dist/skills/fuzz/references/hex-invariants.md +102 -0
- package/dist/skills/fuzz/references/property-generation.md +149 -0
- package/dist/skills/fuzz/references/selection-policy.md +49 -0
- package/dist/skills/fuzz/references/setup-playbook.md +92 -0
- package/dist/skills/fuzz/references/template-map.md +121 -0
- package/dist/skills/fuzz/scripts/ensure_foundry.sh +125 -0
- package/dist/skills/fuzz/scripts/estimate_cost.js +157 -0
- package/dist/skills/fuzz/scripts/extract_abis.js +303 -0
- package/dist/skills/fuzz/scripts/fizz_sync.js +692 -0
- package/dist/skills/fuzz/scripts/generate_handlers.js +370 -0
- package/dist/skills/fuzz/scripts/generate_suite.js +254 -0
- package/dist/skills/fuzz/scripts/lib/log-viewer.js +332 -0
- package/dist/skills/fuzz/scripts/run_echidna.js +192 -0
- package/dist/skills/fuzz/scripts/run_medusa.js +329 -0
- package/dist/skills/fuzz/scripts/select_functions.js +637 -0
- package/dist/skills/fuzz/scripts/setup_fuzz_profile.sh +142 -0
- package/dist/skills/fuzz/templates/Actor.sol +63 -0
- package/dist/skills/fuzz/templates/Base.sol +121 -0
- package/dist/skills/fuzz/templates/FoundryTester.sol +29 -0
- package/dist/skills/fuzz/templates/FuzzTester.sol +11 -0
- package/dist/skills/fuzz/templates/Properties.sol +17 -0
- package/dist/skills/fuzz/templates/README.md +56 -0
- package/dist/skills/fuzz/templates/Snapshots.sol +26 -0
- package/dist/skills/fuzz/templates/echidna.yaml +18 -0
- package/dist/skills/fuzz/templates/handlers/Handlers.sol +13 -0
- package/dist/skills/fuzz/templates/medusa.json +93 -0
- package/dist/skills/fuzz/templates/utils/Clamp.sol +223 -0
- package/dist/skills/fuzz/templates/utils/DecimalPrinter.sol +63 -0
- package/dist/skills/fuzz/templates/utils/Deployer.sol +17 -0
- package/dist/skills/fuzz/templates/utils/EnumerableSet.sol +206 -0
- package/dist/skills/fuzz/templates/utils/Hevm.sol +62 -0
- package/dist/skills/fuzz/templates/utils/Logger.sol +619 -0
- package/dist/skills/fuzz/templates/utils/Math.sol +52 -0
- package/dist/skills/fuzz/templates/utils/MockERC20.sol +279 -0
- package/dist/skills/fuzz/templates/utils/PropertiesAsserts.sol +238 -0
- package/dist/skills/fuzz/templates/utils/StringUtils.sol +85 -0
- package/dist/skills/fuzz-convert/SKILL.md +249 -0
- package/dist/skills/fuzz-sync/SKILL.md +342 -0
- package/dist/skills/generate-poc.md +8 -26
- package/dist/skills/generate-report.md +24 -8
- package/dist/skills/ingest-aa-report.md +11 -30
- package/dist/skills/init-audit/SKILL.md +155 -0
- package/dist/skills/init-audit/references/agents/conformance-checker.md +36 -0
- package/dist/skills/init-audit/references/agents/contract-reader.md +59 -0
- package/dist/skills/init-audit/references/agents/diagram-composer.md +48 -0
- package/dist/skills/init-audit/references/agents/docs-extractor.md +26 -0
- package/dist/skills/init-audit/references/agents/prior-audit.md +32 -0
- package/dist/skills/init-audit/references/agents/regression-checker.md +28 -0
- package/dist/skills/init-audit/references/agents/skeptic.md +31 -0
- package/dist/skills/init-audit/references/agents/standards-checker.md +39 -0
- package/dist/skills/init-audit/references/agents/synthesizer.md +50 -0
- package/dist/skills/prevalidate.md +62 -0
- package/dist/skills/sync-issues.md +11 -25
- package/dist/skills/validate-all-findings.md +3 -3
- package/dist/skills/validate-finding.md +33 -28
- package/dist/skills/write-finding.md +6 -5
- package/dist/types/index.d.ts +22 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +6 -4
- package/dashboard/.next/server/app/_not-found.html +0 -1
- package/dashboard/.next/server/app/_not-found.meta +0 -6
- package/dashboard/.next/server/app/_not-found.rsc +0 -12
- package/dashboard/.next/server/app/access/page.js +0 -1
- package/dashboard/.next/server/app/access/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/api/flows/route.js +0 -1
- package/dashboard/.next/server/app/api/mermaid/route.js +0 -1
- package/dashboard/.next/server/app/calls/page.js +0 -1
- package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/conformance/page.js +0 -1
- package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/diagram/page.js +0 -1
- package/dashboard/.next/server/app/diagram/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/diagram.html +0 -1
- package/dashboard/.next/server/app/diagram.meta +0 -5
- package/dashboard/.next/server/app/diagram.rsc +0 -10
- package/dashboard/.next/server/app/flows/page.js +0 -1
- package/dashboard/.next/server/app/flows/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/flows.html +0 -1
- package/dashboard/.next/server/app/flows.meta +0 -5
- package/dashboard/.next/server/app/flows.rsc +0 -10
- package/dashboard/.next/server/app/functions/page.js +0 -1
- package/dashboard/.next/server/app/functions/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/notes/page.js +0 -22
- package/dashboard/.next/server/app/notes/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/progress/page.js +0 -1
- package/dashboard/.next/server/app/progress/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/stats/page.js +0 -1
- package/dashboard/.next/server/app/stats/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/chunks/44.js +0 -1
- package/dashboard/.next/server/chunks/530.js +0 -1
- package/dashboard/.next/server/chunks/622.js +0 -3
- package/dashboard/.next/server/chunks/665.js +0 -13
- package/dashboard/.next/server/pages/404.html +0 -1
- package/dashboard/.next/static/AyrRAwu4mazjp8iX4Yjbb/_buildManifest.js +0 -1
- package/dashboard/.next/static/chunks/1015.3ab89142e5f44120.js +0 -226
- package/dashboard/.next/static/chunks/1151.b6ef5c786e587ed7.js +0 -1
- package/dashboard/.next/static/chunks/1199.a072929dbec89965.js +0 -148
- package/dashboard/.next/static/chunks/1375.d4d2f7fc9c9c2ff1.js +0 -43
- package/dashboard/.next/static/chunks/1799.83206776abbbf1fc.js +0 -9
- package/dashboard/.next/static/chunks/20154aaa.ccc347c04ab5ad4a.js +0 -1
- package/dashboard/.next/static/chunks/2077.7011a570c87aa7b1.js +0 -1
- package/dashboard/.next/static/chunks/2166.cc0fabeb2e89b840.js +0 -215
- package/dashboard/.next/static/chunks/2325.2c55cb9a6282ae3f.js +0 -24
- package/dashboard/.next/static/chunks/2694.92bbe252063e4786.js +0 -1
- package/dashboard/.next/static/chunks/275.0d761aa0e5b030b8.js +0 -34
- package/dashboard/.next/static/chunks/2781.8536b644a480aede.js +0 -93
- package/dashboard/.next/static/chunks/2805.a8d71d2f92bb6ba9.js +0 -1
- package/dashboard/.next/static/chunks/3017.e55781da9dd32d37.js +0 -1
- package/dashboard/.next/static/chunks/3205-728c260fbb4f89c6.js +0 -2
- package/dashboard/.next/static/chunks/3236.dff44fa7961d9d5e.js +0 -1
- package/dashboard/.next/static/chunks/3480.9451396ad7ee7613.js +0 -1
- package/dashboard/.next/static/chunks/3626.ba1cf848a9f2e93d.js +0 -64
- package/dashboard/.next/static/chunks/3865.a432a7910a2f5281.js +0 -90
- package/dashboard/.next/static/chunks/3887.c22cbfa3f095826c.js +0 -1
- package/dashboard/.next/static/chunks/3924-4a05057b5450abe1.js +0 -1
- package/dashboard/.next/static/chunks/3948.fe3c7d758568d98b.js +0 -287
- package/dashboard/.next/static/chunks/4728.07d87640a3e7dd0d.js +0 -24
- package/dashboard/.next/static/chunks/4787.4e5f6a0e0e40a583.js +0 -23
- package/dashboard/.next/static/chunks/5060.baca226af35ed016.js +0 -1
- package/dashboard/.next/static/chunks/5284.f949ac90c95ff143.js +0 -1
- package/dashboard/.next/static/chunks/5715.1524bcc9591e180b.js +0 -115
- package/dashboard/.next/static/chunks/6014.700ae4969b64d728.js +0 -104
- package/dashboard/.next/static/chunks/6024.4d23707c65514679.js +0 -79
- package/dashboard/.next/static/chunks/6177.e5c84cfc4c0dea51.js +0 -1
- package/dashboard/.next/static/chunks/618f8807-547c5614e1318888.js +0 -1
- package/dashboard/.next/static/chunks/6434.9481771c33195d29.js +0 -1
- package/dashboard/.next/static/chunks/6468.f4a3e8fa6accc6da.js +0 -77
- package/dashboard/.next/static/chunks/6540.86f367d7390738d4.js +0 -1
- package/dashboard/.next/static/chunks/6549.4d0d472df96429a5.js +0 -1
- package/dashboard/.next/static/chunks/690f35d0.3e40ca0930e4bbdb.js +0 -119
- package/dashboard/.next/static/chunks/7397-f6f4dddc7a20bfc1.js +0 -1
- package/dashboard/.next/static/chunks/7498-ea83cb9e30ec5491.js +0 -1
- package/dashboard/.next/static/chunks/7802.89aec9ee11680850.js +0 -80
- package/dashboard/.next/static/chunks/7973.8b526f589aca5d84.js +0 -79
- package/dashboard/.next/static/chunks/8216.1bead812eb126c35.js +0 -5
- package/dashboard/.next/static/chunks/8452-e616b5f43bceb95f.js +0 -13
- package/dashboard/.next/static/chunks/8645.a5ca76f11edc9633.js +0 -1
- package/dashboard/.next/static/chunks/8928-60c623ee89d2e6ad.js +0 -1
- package/dashboard/.next/static/chunks/9173.2486ffca31131ec5.js +0 -1
- package/dashboard/.next/static/chunks/9178.469341860bf8caec.js +0 -1
- package/dashboard/.next/static/chunks/9466.e904660d38c03eea.js +0 -1
- package/dashboard/.next/static/chunks/9660.84a85811380c5f33.js +0 -1
- package/dashboard/.next/static/chunks/9720.67d4d0d15a96d691.js +0 -1
- package/dashboard/.next/static/chunks/9811.65e1d080c2d256af.js +0 -1
- package/dashboard/.next/static/chunks/app/_not-found/page-548ab392d0e890d1.js +0 -1
- package/dashboard/.next/static/chunks/app/access/page-3668562e7464eb5d.js +0 -1
- package/dashboard/.next/static/chunks/app/calls/page-d07f5b8664cc8303.js +0 -1
- package/dashboard/.next/static/chunks/app/conformance/page-2fede1d7b5f9265d.js +0 -1
- package/dashboard/.next/static/chunks/app/diagram/page-b228444265546495.js +0 -1
- package/dashboard/.next/static/chunks/app/flows/page-fa67783d8cd79cab.js +0 -1
- package/dashboard/.next/static/chunks/app/functions/page-686f0296639133a3.js +0 -1
- package/dashboard/.next/static/chunks/app/issues/page-98a298e1c1045c91.js +0 -1
- package/dashboard/.next/static/chunks/app/layout-49f2496c7637d931.js +0 -1
- package/dashboard/.next/static/chunks/app/notes/page-17af94c67ba79c00.js +0 -1
- package/dashboard/.next/static/chunks/app/page-24bac51dfe007c66.js +0 -1
- package/dashboard/.next/static/chunks/app/progress/page-427fb18da3afb061.js +0 -1
- package/dashboard/.next/static/chunks/app/report/page-796f2f4a8a5ac8f7.js +0 -1
- package/dashboard/.next/static/chunks/app/stats/page-db81f600a086f252.js +0 -1
- package/dashboard/.next/static/chunks/c7ea4e13.5effeeba6618bdb7.js +0 -1
- package/dashboard/.next/static/chunks/framework-cf6f5bdca6ba0184.js +0 -33
- package/dashboard/.next/static/chunks/main-63ff429eab01f5bf.js +0 -1
- package/dashboard/.next/static/chunks/main-app-9d2f6b8a47133e9b.js +0 -1
- package/dashboard/.next/static/chunks/pages/_app-6ad2b50514c24ab4.js +0 -1
- package/dashboard/.next/static/chunks/pages/_error-d5eb11c5c4626811.js +0 -1
- package/dashboard/.next/static/chunks/webpack-08869f2b18792e51.js +0 -1
- package/dashboard/.next/static/css/4a38d8f6f6b7a68f.css +0 -3
- package/dashboard/.next/static/media/438aa629764e75f3-s.woff2 +0 -0
- package/dashboard/.next/static/media/4c9affa5bc8f420e-s.p.woff2 +0 -0
- package/dashboard/.next/static/media/51251f8b9793cdb3-s.woff2 +0 -0
- package/dashboard/.next/static/media/875ae681bfde4580-s.woff2 +0 -0
- package/dashboard/.next/static/media/cc978ac5ee68c2b6-s.woff2 +0 -0
- package/dashboard/.next/static/media/e857b654a2caa584-s.woff2 +0 -0
- package/dashboard/app/access/AccessClient.tsx +0 -402
- package/dashboard/app/access/ReadOnlyFunctions.tsx +0 -114
- package/dashboard/app/access/page.tsx +0 -125
- package/dashboard/app/api/flows/route.ts +0 -32
- package/dashboard/app/api/mermaid/route.ts +0 -25
- package/dashboard/app/calls/CallsClient.tsx +0 -170
- package/dashboard/app/calls/page.tsx +0 -57
- package/dashboard/app/conformance/ConformanceTable.tsx +0 -214
- package/dashboard/app/conformance/page.tsx +0 -186
- package/dashboard/app/diagram/page.tsx +0 -65
- package/dashboard/app/flows/page.tsx +0 -102
- package/dashboard/app/functions/FunctionsClient.tsx +0 -167
- package/dashboard/app/functions/page.tsx +0 -178
- package/dashboard/app/issues/IssuesBoardClient.tsx +0 -803
- package/dashboard/app/notes/NotesClient.tsx +0 -701
- package/dashboard/app/notes/page.tsx +0 -47
- package/dashboard/app/progress/ProgressClient.tsx +0 -354
- package/dashboard/app/progress/page.tsx +0 -127
- package/dashboard/app/stats/StatsClient.tsx +0 -452
- package/dashboard/app/stats/page.tsx +0 -50
- package/dashboard/components/ConfidenceBadge.tsx +0 -53
- package/dashboard/components/DashboardLayout.tsx +0 -485
- package/dashboard/components/FilterableTable.tsx +0 -293
- package/dashboard/components/MermaidViewer.tsx +0 -267
- package/dashboard/components/NotYetGenerated.tsx +0 -32
- package/dashboard/components/SeverityBadge.tsx +0 -28
- package/dashboard/components/SignalBars.tsx +0 -27
- package/dashboard/components/SortableTable.tsx +0 -122
- package/dashboard/lib/conformance-tokens.ts +0 -49
- package/dist/skills/init-audit.md +0 -284
- /package/dashboard/.next/server/app/api/{flows → xref}/route.js.nft.json +0 -0
- /package/dashboard/.next/server/app/{api/mermaid → excalidraw-assets/[...path]}/route.js.nft.json +0 -0
- /package/dashboard/.next/static/{AyrRAwu4mazjp8iX4Yjbb → bGV1ry1vvIbM5b506eVBR}/_ssgManifest.js +0 -0
|
@@ -4,9 +4,8 @@ description: "Generate the LaTeX report sections for the final audit report (Ove
|
|
|
4
4
|
|
|
5
5
|
# Skill: Generate Report
|
|
6
6
|
|
|
7
|
-
**Recommended model:** Sonnet
|
|
8
7
|
|
|
9
|
-
This skill produces the LaTeX section files an auditor assembles into the Nethermind Overleaf report template at the end of an engagement. It runs from the GitHub-synced issues (the report's source of truth), after findings have been pushed via /sync-issues, and reuses the analysis Hex already produced during /init-audit (`overview.md`, `stats.json`, `
|
|
8
|
+
This skill produces the LaTeX section files an auditor assembles into the Nethermind Overleaf report template at the end of an engagement. It runs from the GitHub-synced issues (the report's source of truth), after findings have been pushed via /sync-issues, and reuses the analysis Hex already produced during /init-audit (`overview.md`, `stats.json`, the verified protocol model in `model/protocol.json`, and the diagrams the auditor marked for the report).
|
|
10
9
|
|
|
11
10
|
## What it writes
|
|
12
11
|
|
|
@@ -15,7 +14,7 @@ Seven report sections in `<output_dir>/report/`, each emitted in **two forms** (
|
|
|
15
14
|
1. **Executive Summary** (§1) — project synopsis, severity histogram, status histogram, summary table of audit metadata.
|
|
16
15
|
2. **Audited Files** (§2) — a LaTeX table of in-scope files (LoC, comments, ratio, blank, total).
|
|
17
16
|
3. **Summary of Issues** (§3) — hyperlinked finding rows.
|
|
18
|
-
4. **System Overview** (§4) — descriptive protocol architecture: components, actors & roles, per-module or per-flow subsections. Built from `overview.md` +
|
|
17
|
+
4. **System Overview** (§4) — descriptive protocol architecture: components, actors & roles, per-module or per-flow subsections. Built from `overview.md` + the verified protocol model, with the diagrams marked "Use in report" as figures.
|
|
19
18
|
5. **Issues** (§6) — one `\subsection{[Sev] title}\label{issue:N}` per synced finding, with description, code blocks, recommendation, status, client update.
|
|
20
19
|
6. **Documentation Evaluation** (§7) — a `tcolorbox` remarks paragraph about the client's documentation.
|
|
21
20
|
7. **Test Suite Evaluation** (§8) — the test-run result (passed/failed/skipped), coverage summary, and automated-tooling note, generated from a live test run plus `stats.json.test_coverage`.
|
|
@@ -56,10 +55,10 @@ Each section has a defined **input signature** — the exact set of data it deri
|
|
|
56
55
|
|
|
57
56
|
| Section | Input signature (hash over) |
|
|
58
57
|
|---|---|
|
|
59
|
-
| `executive_summary` | severity + resolution histograms, `stats.totals.nsloc`, all `settings.report.*` fields, and the `overview.md` bytes (the synopsis derives from it) |
|
|
60
|
-
| `audited_files` | the per-file LoC results for every `project.scope` file, `repository_url`, `initial_commit` |
|
|
58
|
+
| `executive_summary` | severity + resolution histograms, `stats.totals.nsloc`, all `settings.report.*` fields, and the `overview.md` bytes (the synopsis derives from it); differential: also `diff.json` `base_commit` / `head_commit` / `summary` |
|
|
59
|
+
| `audited_files` | the per-file LoC results for every `project.scope` file (differential: every changed file, with its +/- counts), `repository_url`, `initial_commit` |
|
|
61
60
|
| `summary_of_findings` | the ordered synced-findings list: `(id, title, severity, resolution)` each |
|
|
62
|
-
| `system_overview` | `overview.md`, `
|
|
61
|
+
| `system_overview` | `overview.md`, `model/protocol.json` and `model/diagrams/index.json` bytes, and the bytes of every `report/figures/*.png` marked `in_report` |
|
|
63
62
|
| `findings` | the synced-findings full content: `(title, severity, description, code blocks, recommendation, resolution, update_from_client, root_cause.locations)` each |
|
|
64
63
|
| `documentation_eval` | `settings.report.{doc_assessment,kickoff_call,client_availability}`, `project.docs_url`, and the NatSpec-presence signal (`stats.totals.comment_lines`) |
|
|
65
64
|
| `test_suite` | the test-run summary (pass/fail/skip counts) and `stats.test_coverage`, `settings.report.test_assessment` |
|
|
@@ -85,7 +84,7 @@ Read `<output_dir>/config.json`. Look under `settings.report.*` for:
|
|
|
85
84
|
- `final_commit` — commit hash after fixes (defaults to `initial_commit` if no remediation cycle).
|
|
86
85
|
- `initial_report_date` — date the initial report was delivered (e.g. `May 22, 2026`).
|
|
87
86
|
- `final_report_date` — date the final report was delivered (defaults to `initial_report_date`).
|
|
88
|
-
- `audit_type` — defaults to `Security Review`.
|
|
87
|
+
- `audit_type` — defaults to `Security Review`. A differential audit (`project.mode: "diff"`) is initialized with `Differential Review`.
|
|
89
88
|
- `doc_assessment` — `High` / `Medium` / `Low`.
|
|
90
89
|
- `test_assessment` — `High` / `Medium` / `Low`.
|
|
91
90
|
- `kickoff_call` — optional focus note for the §7 kick-off sentence (e.g. "with a focus on the upgrade changes"). Empty means omit the kick-off sentence.
|
|
@@ -138,6 +137,8 @@ Style hints:
|
|
|
138
137
|
|
|
139
138
|
Write to `executive_summary.txt` **and** `01-executive-summary.tex`.
|
|
140
139
|
|
|
140
|
+
**Differential audit** (`config.json` → `project.mode` is `diff`): the review covers the changes between two commits, and the first paragraph must say so. Use `<SCOPE_DESCRIPTION>` = `changes to <scope description> between commit \href{<REPOSITORY_URL>/commit/<BASE_COMMIT>}{\texttt{<BASE_SHORT>}} and commit \href{<REPOSITORY_URL>/commit/<HEAD_COMMIT>}{\texttt{<HEAD_SHORT>}}` (commits from `.hex/diff.json`, short = first 7 characters). Replace the `<TOTAL_NSLOC>` sentence with the size of the change: `\textbf{The audit comprises} <ADDITIONS> added and <DELETIONS> removed lines of Solidity code across <FILES_CHANGED> files` (from `diff.json` `summary`). Everything else in the section is unchanged.
|
|
141
|
+
|
|
141
142
|
```latex
|
|
142
143
|
\pagebreak \vspace*{0cm}
|
|
143
144
|
\sectioncolor
|
|
@@ -222,6 +223,8 @@ Substitutions:
|
|
|
222
223
|
|
|
223
224
|
Write to `audited_files.txt` **and** `02-audited-files.tex`.
|
|
224
225
|
|
|
226
|
+
**Differential audit:** the rows are the files in `.hex/diff.json` `files` with status `added`, `modified` or `renamed` (not `deleted`), counted at the head commit, instead of every `project.scope` file. Keep the same columns; the table still describes the audited files at head. `<INITIAL_COMMIT>` in the links is the head commit.
|
|
227
|
+
|
|
225
228
|
Compute per-file line counts from each scope file. For each in-scope file in `config.json.project.scope`:
|
|
226
229
|
|
|
227
230
|
- Read the file. Count:
|
|
@@ -301,7 +304,20 @@ For each synced finding in severity-sorted order (Critical → Info), assign a s
|
|
|
301
304
|
|
|
302
305
|
Write to `system_overview.txt` **and** `04-system-overview.tex`.
|
|
303
306
|
|
|
304
|
-
Primary source: `<output_dir>/overview.md` (produced by /init-audit — it already carries an intro, a `## Key Contracts` table, `## External Dependencies`, and `## Architecture Notes`).
|
|
307
|
+
Primary source: `<output_dir>/overview.md` (produced by /init-audit — it already carries an intro, a `## Key Contracts` table, `## External Dependencies`, and `## Architecture Notes`). Take actors, roles and privileges from the protocol model (`npx --no-install hex model show actors` / `privileges`), using **only claims with `status: "verified"`**; a contested claim is not a fact about the system. Exact relationships (inheritance, who calls what) come from `npx --no-install hex facts query linearization|callers|callees <ref>`.
|
|
308
|
+
|
|
309
|
+
**Figures.** For every entry in `<output_dir>/model/diagrams/index.json` with `in_report: true` and a PNG at `<output_dir>/report/figures/<name>.png`, add a figure in the subsection it explains (custody near the components, privilege under Actors and Roles, sequences in their flow subsection), with the diagram's `takeaway` as the caption:
|
|
310
|
+
|
|
311
|
+
```latex
|
|
312
|
+
\begin{figure}[H]
|
|
313
|
+
\centering
|
|
314
|
+
\includegraphics[width=\textwidth]{figures/<name>.png}
|
|
315
|
+
\caption{<takeaway, LaTeX-escaped>}
|
|
316
|
+
\label{fig:<name>}
|
|
317
|
+
\end{figure}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Tell the auditor to upload `report/figures/` next to the `.tex` files in Overleaf.
|
|
305
321
|
|
|
306
322
|
**If `overview.md` is absent, abort**: "System Overview needs `<output_dir>/overview.md`. Run `/init-audit` first, then re-run `/generate-report`."
|
|
307
323
|
|
|
@@ -4,7 +4,6 @@ description: "Ingest a completed Nethermind AuditAgent scan into the board and d
|
|
|
4
4
|
|
|
5
5
|
# Skill: Ingest AuditAgent Report
|
|
6
6
|
|
|
7
|
-
**Recommended model:** Sonnet
|
|
8
7
|
|
|
9
8
|
This skill is the single point of integration with Nethermind's AuditAgent. It does **not** start scans — the auditor starts a scan separately (e.g. via the Nethermind portal or `aa scan ...` from the command line) and passes the resulting scan ID into this skill. The skill fetches the results, normalizes them into the board, and inline-dedupes against everything already there.
|
|
10
9
|
|
|
@@ -110,48 +109,30 @@ to `<output_dir>/ai-results/auditagent/findings.json`. Also write a small `metad
|
|
|
110
109
|
The raw AuditAgent findings keep their own `AA-<NNN>` ids inside `ai-results/auditagent/findings.json` (that file is the source record). The **board** card gets a uniform `H-NNN` id. Create one per finding via the CLI — it allocates the id and materializes the full finding (title, severity, description, affected code) from the raw record by `source_ref`:
|
|
111
110
|
|
|
112
111
|
```bash
|
|
113
|
-
npx hex issue new --source auditagent --source-ref <AA-NNN> --title "<title>" --severity <Severity>
|
|
112
|
+
npx --no-install hex issue new --source auditagent --source-ref <AA-NNN> --title "<title>" --severity <Severity>
|
|
114
113
|
```
|
|
115
114
|
|
|
116
115
|
Capture each printed `H-NNN`. Cards land in the Potential column with `status: unverified`. Never hand-edit `tracking.json`.
|
|
117
116
|
|
|
118
117
|
## Step 6 — Inline dedup
|
|
119
118
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
| Signal | How to compare |
|
|
123
|
-
|---|---|
|
|
124
|
-
| **contract** (boolean) | Does the affected contract name match? |
|
|
125
|
-
| **function** (boolean) | Does the affected function name match? |
|
|
126
|
-
| **root_cause** | `same` / `overlapping` / `different` — judge the technical mechanism (e.g. "reentrancy on external call before state update" is `same` as "missing CEI pattern around external call"). |
|
|
127
|
-
| **attack_vector** | `same` / `overlapping` / `different` — judge what an attacker actually does to exploit it. |
|
|
128
|
-
|
|
129
|
-
A match is **at least one of**:
|
|
130
|
-
- `root_cause = same` AND `function = true`, or
|
|
131
|
-
- `root_cause = same` AND `contract = true` AND `attack_vector = same`, or
|
|
132
|
-
- `root_cause = overlapping` AND `function = true` AND `attack_vector = same`.
|
|
133
|
-
|
|
134
|
-
On match, **move the new auditagent card to the Duplicate column** (the canonical is the existing entry — the auditor already filed or already has it from another source):
|
|
119
|
+
For each new card, run the one Hex dedup engine:
|
|
135
120
|
|
|
136
121
|
```bash
|
|
137
|
-
npx hex issue
|
|
122
|
+
npx --no-install hex issue dedup <new-H-id>
|
|
138
123
|
```
|
|
139
124
|
|
|
140
|
-
|
|
125
|
+
It maps the card to the exact functions it is about (from its code and the compiler facts), ranks existing cards that touch the same function or contract, and prints **the match rules** (four signals: contract, function, root cause, attack vector; three clauses) and the triage rules. Judge each strong candidate against those rules (root cause and attack vector are your call; the rules decide). On a match:
|
|
141
126
|
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
"
|
|
146
|
-
"confidence": "high | medium | low",
|
|
147
|
-
"match_signals": { "contract": true, "function": true, "root_cause": "same", "attack_vector": "same" },
|
|
148
|
-
"reasoning": "<one short sentence: which signals carried the call>"
|
|
149
|
-
}
|
|
127
|
+
```bash
|
|
128
|
+
npx --no-install hex issue mark-duplicate <new-H-id> --of <canonical-H-id> \
|
|
129
|
+
--root-cause <same|overlapping|different> --attack-vector <same|overlapping|different> \
|
|
130
|
+
[--same-contract] [--same-function] --reasoning "<one sentence: which signals carried the call>"
|
|
150
131
|
```
|
|
151
132
|
|
|
152
|
-
|
|
133
|
+
It moves the card and records the signals in `comparison.json` in one step (the board shows the "dup of" chip). When a **triage rule** covers the finding's whole impact, exclude it instead: `npx --no-install hex issue exclude <new-H-id> --rule R-NNN`.
|
|
153
134
|
|
|
154
|
-
|
|
135
|
+
Cards that match nothing stay `unverified`. Then run **`/prevalidate`** on them: background agents reproduce or refute each one, conclusive cases move automatically, and the auditor triages the rest.
|
|
155
136
|
|
|
156
137
|
## Step 7 — Report
|
|
157
138
|
|
|
@@ -163,7 +144,7 @@ Ingested N AuditAgent findings (scan <scan_id>).
|
|
|
163
144
|
- K flagged as Duplicate of existing entries
|
|
164
145
|
- 0 errors
|
|
165
146
|
|
|
166
|
-
Run /validate-finding <id> on
|
|
147
|
+
Pre-validation ran on the new cards; see its summary. Run /validate-finding <id> on anything left uncertain.
|
|
167
148
|
```
|
|
168
149
|
|
|
169
150
|
## Outputs (recap)
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: init-audit
|
|
3
|
+
description: 'Initialize a Solidity audit with Hex: dependency safety, exact compiler facts, then a team of agents that builds and verifies the protocol model (actors, assets, privileges, accounting, state machines, invariants), spec conformance and explanatory diagrams. Full or differential (base → head) audits.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Initialize Audit
|
|
7
|
+
|
|
8
|
+
You are the **orchestrator** of the pre-review. You gather inputs, run the safety gate and the deterministic layer yourself, then direct agents in four waves. By the end the dashboard shows a verified protocol model, proposed invariants, conformance cards and diagrams that explain the system.
|
|
9
|
+
|
|
10
|
+
Use `npx --no-install hex …` for every Hex command (an unrelated npm package is called `hex`; `--no-install` makes sure only Hex runs). When the Hex MCP tools are available (`hex_facts_query`, `hex_model_get`, …) you may use them instead; they do the same thing.
|
|
11
|
+
|
|
12
|
+
## How the agents work together
|
|
13
|
+
|
|
14
|
+
The topology follows one rule: **silo where independence is the point, share where integration is the point.**
|
|
15
|
+
|
|
16
|
+
- **Discovery is siloed.** Each contract reader sees only its own cluster plus the exact facts. Readers do not see each other's notes, so one reader's framing cannot anchor another's. The docs extractor reads documentation only and never code, so a gap between what the docs promise and what the code does shows up as a mismatch instead of being explained away.
|
|
17
|
+
- **Synthesis is shared.** One synthesizer reads every draft and the facts and writes one consistent model.
|
|
18
|
+
- **Verification is siloed again.** Skeptics get the claims and the code, but not the synthesizer's reasoning, so they check what the code does rather than whether the argument sounds right.
|
|
19
|
+
- **Diagrams are shared.** Composers draw from the verified model.
|
|
20
|
+
|
|
21
|
+
Agents never message each other. They communicate through files under `.hex/model/` (drafts, verdicts, specs), and they answer exact cross-contract questions ("who calls X?", "who writes Y?", "which entry points reach Z?") with `npx --no-install hex facts query …` instead of guessing or asking another agent.
|
|
22
|
+
|
|
23
|
+
Agent prompts are in `references/agents/` next to this file. Claude Code prints this skill's base directory when it loads the skill ("Base directory for this skill: …"); the references live under it. If no base directory was printed, Glob exactly `.claude/skills/init-audit/references/agents/*.md`. Spawn agents with the Agent tool as **background** calls, in **one message per wave**, and wait for every completion notification before starting the next wave. Never poll or sleep.
|
|
24
|
+
|
|
25
|
+
It runs in one of two modes, chosen in Phase 0:
|
|
26
|
+
|
|
27
|
+
- **Full**: audit the whole scope at one commit (the default).
|
|
28
|
+
- **Differential**: audit what changed between a previously audited **base** commit and the **head** commit, plus the flows those changes reach. Sections marked **(differential)** run only in this mode.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Phase 0 — Inputs, safety gate, exact facts (orchestrator, sequential)
|
|
33
|
+
|
|
34
|
+
### 0.1 Gather information
|
|
35
|
+
|
|
36
|
+
Ask the auditor (one AskUserQuestion where possible):
|
|
37
|
+
|
|
38
|
+
- **Audit type**: *Full* or *Differential*. Ask this first; the rest branches on it.
|
|
39
|
+
- **Project directory** (default: current directory), **scope** globs (e.g. `src/**/*.sol`), **commit** (default `HEAD`), **chain** (default ethereum), **documentation URL** if any, and optionally the **GitHub repo** (`owner/repo`) findings sync to.
|
|
40
|
+
- **(differential)** The **base commit** (required), the **head commit** (default `HEAD`, which must be checked out; `git fetch --unshallow` first on a shallow clone), and an optional **previous audit**: the earlier engagement's `.hex/` folder or its report (PDF or Markdown). When a previous `.hex/` is given, propose its `project.scope_globs` (or `project.scope`) as the scope and its `project.commit` as the base, and confirm both.
|
|
41
|
+
|
|
42
|
+
### 0.2 Dependency safety (BEFORE anything compiles)
|
|
43
|
+
|
|
44
|
+
Build scripts and install hooks are a supply-chain vector. Check, before any `forge build`, `npm install` or compile:
|
|
45
|
+
|
|
46
|
+
1. `package.json` install hooks (`preinstall`, `postinstall`, `prepare`, `prebuild`, `pretest`) that shell out, download, or touch files outside the project.
|
|
47
|
+
2. Foundry `lib/` submodules: each `lib/*/foundry.toml` for `ffi = true`, broad `fs_permissions`, or `script` entries.
|
|
48
|
+
3. Root `foundry.toml`: `ffi = true` is **high risk**; `fs_permissions` broader than read-only on `./src`/`./out`; profile overrides that differ from the main profile.
|
|
49
|
+
4. `remappings.txt`: every target exists in `lib/`; flag shadowed or hijacking remaps (`@openzeppelin/=lib/malicious-oz/`).
|
|
50
|
+
5. Root-level `*.sh`, `*.py`, `Makefile` targets and `.github/` workflows.
|
|
51
|
+
6. Plaintext secrets in `.env*` (do not print the values).
|
|
52
|
+
7. `.vscode/extensions.json` recommending unknown publishers.
|
|
53
|
+
|
|
54
|
+
**If anything looks risky, STOP and warn before compiling.** Then evaluate Solidity dependencies: known libraries and versions with advisories (OZ < 4.9.3, old Solmate `SafeTransferLib`), typosquats (`@openzepplin`), unused dependencies, and unknown packages with inline assembly, `selfdestruct` or `delegatecall` to fixed addresses.
|
|
55
|
+
|
|
56
|
+
### 0.3 Initialize and build the deterministic layer
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx --no-install hex init --project "<path>" --scope "<globs>" --commit <hash> --chain <chain> --docs "<url>" [--github-repo <owner/repo>] \
|
|
60
|
+
[--mode diff --base <base-commit> [--previous-audit "<path>"]]
|
|
61
|
+
npx --no-install hex analyze
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`hex analyze` compiles into `.hex/.cache` (never the client's `out/`) and writes:
|
|
65
|
+
|
|
66
|
+
- `.hex/facts.json`: exact compiler facts (call graph with `internal`/`super`/`library`/`external`/`virtual`/`modifier` edges, reads/writes per function, inheritance linearization, entry points, compiler storage layouts);
|
|
67
|
+
- `.hex/stats.json`: nSLOC, ERC usage, coverage;
|
|
68
|
+
- **(differential)** `.hex/diff.json` and `.hex/diff/changes.patch`: changed entities, slot-exact storage-layout changes, and impacted functions with reason chains.
|
|
69
|
+
|
|
70
|
+
Read the first lines of `facts.json`. If `"source": "parser-fallback"`, the build failed: tell the auditor that facts are approximate (calls resolved by name, layout without packing) and how to fix the build, then continue.
|
|
71
|
+
|
|
72
|
+
**(differential)** If `diff` failed (usually a commit missing from a shallow clone), stop: a differential audit without the diff is a full audit under the wrong label.
|
|
73
|
+
|
|
74
|
+
### 0.4 Plan the waves
|
|
75
|
+
|
|
76
|
+
From `facts.json` and `stats.json`, group the in-scope contracts into **clusters** of roughly 800–1500 nSLOC. Contracts that inherit from each other or call each other heavily belong together (use `linearization`, and `calls` edges between contracts). One reader per cluster; a small codebase may be a single cluster. Write the plan as a short list for the auditor (cluster → contracts → nSLOC) and continue without waiting.
|
|
77
|
+
|
|
78
|
+
**(differential)** Readers cover only clusters that contain changed or impacted functions (`npx --no-install hex diff --scan-files` lists the files); each reader also gets `.hex/diff/changes.patch`.
|
|
79
|
+
|
|
80
|
+
`mkdir -p .hex/model/drafts .hex/model/verdicts .hex/model/diagrams`
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Phase 1 — Discovery (siloed, parallel)
|
|
85
|
+
|
|
86
|
+
Spawn in **one message**:
|
|
87
|
+
|
|
88
|
+
| Agent | Prompt file | Count | Writes |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| Contract reader | `references/agents/contract-reader.md` | one per cluster | `.hex/model/drafts/reader-<n>.json` |
|
|
91
|
+
| Docs extractor | `references/agents/docs-extractor.md` | one, only when there is documentation (URL, `docs/`, README with protocol text) | `.hex/model/drafts/docs-claims.json` |
|
|
92
|
+
| Standards checker | `references/agents/standards-checker.md` | one, only when `stats.json` lists ERCs/EIPs or contracts implement known interfaces | `.hex/model/drafts/standards.json` |
|
|
93
|
+
| **(differential)** Prior-audit importer | `references/agents/prior-audit.md` | one, only with a previous audit | `.hex/previous-audit/findings.json` |
|
|
94
|
+
|
|
95
|
+
Substitute the placeholders each prompt file declares (cluster contracts and files, output path, docs URL, previous-audit path). Do not paste source code into prompts; agents read files themselves.
|
|
96
|
+
|
|
97
|
+
## Phase 2 — Synthesis (shared)
|
|
98
|
+
|
|
99
|
+
Spawn **one** synthesizer (`references/agents/synthesizer.md`). It reads every draft plus the facts and writes:
|
|
100
|
+
|
|
101
|
+
- `.hex/model/protocol.json` (schema in its prompt; every claim has a `claim_id` and evidence),
|
|
102
|
+
- `.hex/model/invariants.json` (all `status: "proposed"`),
|
|
103
|
+
- `.hex/overview.md` (2–3 paragraphs + key contracts table; the report's System Overview is built from it),
|
|
104
|
+
- **(differential)** `.hex/diff-overview.md`.
|
|
105
|
+
|
|
106
|
+
When it finishes, run `npx --no-install hex model validate`. Every function id the model cites must exist in the facts. If validation fails, send the errors back to the synthesizer (SendMessage to the same agent) and re-validate. Do not hand-edit the model.
|
|
107
|
+
|
|
108
|
+
## Phase 3 — Verification (siloed, parallel)
|
|
109
|
+
|
|
110
|
+
On a re-run, first move the previous conformance results aside so the checker works fresh but can keep ids stable (cards cite them as `source_ref`): `mv .hex/spec-conformance.json .hex/model/drafts/spec-conformance.prev.json` (skip if absent).
|
|
111
|
+
|
|
112
|
+
Spawn in **one message**:
|
|
113
|
+
|
|
114
|
+
| Agent | Prompt file | Count | Writes |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| Skeptic | `references/agents/skeptic.md` | one per section group: (actors + privileges + trust), (assets + external dependencies), (accounting), (state machines + risky flows), (invariants) — skip empty groups | `.hex/model/verdicts/<group>.json` |
|
|
117
|
+
| Conformance checker | `references/agents/conformance-checker.md` | one, when Phase 1 produced docs claims or standards checks | `.hex/spec-conformance.json` + `.md` |
|
|
118
|
+
| **(differential)** Regression checker | `references/agents/regression-checker.md` | one, when prior findings were imported | `.hex/previous-audit/review.json` |
|
|
119
|
+
|
|
120
|
+
Each skeptic gets **only** its claims (the JSON array for its sections, extracted from `protocol.json` without any prose) and the code. Then:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npx --no-install hex model apply-verdicts
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
It marks each claim `verified` or `contested` (any contesting skeptic wins), and records verdicts on invariant ids on the invariant itself (`verification`). Contested claims and invariants stay with the skeptic's note; the dashboard shows them, so the auditor sees where the system is not what it seems before accepting anything. Leads that skeptics raise go to the contract notes with `npx --no-install hex note lead <Contract> --text "<…>" --source init-audit --source-ref skeptic-<group>-<claim_id>`; skip leads that repeat one already in `npx --no-install hex note show <Contract>` (skeptics work in silos, so they often rediscover the same bug).
|
|
127
|
+
|
|
128
|
+
## Phase 4 — Diagrams (shared, parallel)
|
|
129
|
+
|
|
130
|
+
Spawn one diagram composer per view that has material in the verified model (`references/agents/diagram-composer.md`, with `{view}` set to `custody`, `privilege`, `accounting`, `state-machine` or `sequence`). In **one message**. Each writes `.hex/model/diagrams/<name>.spec.json`. Then:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
npx --no-install hex diagram build
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
If a spec is invalid, send the error to its composer and rebuild. **(differential)** Composers draw the impacted flows and changed state; `hex diagram build` highlights changed functions automatically.
|
|
137
|
+
|
|
138
|
+
## Phase 5 — Cards, summary, dashboard (orchestrator)
|
|
139
|
+
|
|
140
|
+
1. **Conformance cards.** For every item in `spec-conformance.json` with status `DEVIATES` or `PARTIAL`, unless a tracking entry already has that `source_ref`:
|
|
141
|
+
```bash
|
|
142
|
+
npx --no-install hex issue new --source conformance --source-ref "<SC-NNN>" --title "<first sentence of finding, ~80 chars, plain text without backticks>" --severity "<severity_hint or Info>"
|
|
143
|
+
```
|
|
144
|
+
Then run `npx --no-install hex issue dedup <new id>` and apply its match rules. A conformance item often restates a finding the auditor already filed (a deviation from ERC-4626 is also a manual "first-depositor inflation" card); when it matches, `npx --no-install hex issue mark-duplicate <new id> --of <existing id> --root-cause <same|overlapping> --attack-vector <same|overlapping|different> [--same-contract] [--same-function] --reasoning "<one sentence>" --confidence <level>`, so the existing card (GitHub-synced cards first) stays canonical.
|
|
145
|
+
2. **(differential) Regression cards.** For every `regressed` item in `previous-audit/review.json` (skip ids that already have a `prior-audit` tracking entry), create `npx --no-install hex issue new --source prior-audit --source-ref "<prior id>" --title "<title>" --severity <Severity>`, record the returned id as the item's `issue_id`, and rewrite the card's description for the head code with `npx --no-install hex issue patch <id> --description-file …`.
|
|
146
|
+
3. **Summary.** Scope (files, contracts, nSLOC); facts source; model size and how many claims were contested (name the contested ones in one line each, since they are the most valuable output); proposed invariants (`npx --no-install hex invariant list`), with a reminder to accept the ones that hold (`npx --no-install hex invariant accept INV-…` or on the dashboard's Model page); conformance cards created; diagrams built; **(differential)** base → head, files changed, impacted entry points, storage-layout changes, and the prior-findings tally. Suggest next steps: `/ai-audit` (in a differential audit it scans only changed and impacted code), `/fuzz` once invariants are accepted, and the Review page's blind spots.
|
|
147
|
+
4. **Dashboard.** Launch it in the background (`run_in_background: true`):
|
|
148
|
+
```bash
|
|
149
|
+
npx --no-install hex dashboard --project "<absolute project dir>"
|
|
150
|
+
```
|
|
151
|
+
and print one line: `Dashboard starting at http://localhost:3000`.
|
|
152
|
+
|
|
153
|
+
## Writing standard (applies to every agent's prose)
|
|
154
|
+
|
|
155
|
+
Everything written to `.hex/` may reach a client report. Plain, specific, technical prose. Backtick identifiers (`deposit(...)`, `totalAssets`). No em dashes, no filler, no speculation in the overview. Claims cite evidence as `file` + line range; the evidence is for navigation and never appears as "line N" in report prose.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Conformance checker
|
|
2
|
+
|
|
3
|
+
You compare what the protocol **promises** with what the code **does**: documentation claims (`.hex/model/drafts/docs-claims.json`, written by an agent that never saw the code), standards checks (`.hex/model/drafts/standards.json`), and NatSpec (`@notice`, `@dev`, `@param`, `@return`, especially conditional promises such as "reverts if…" and "only when…").
|
|
4
|
+
|
|
5
|
+
Use the protocol model (`.hex/model/protocol.json`) for orientation only: skeptics verify it in parallel with you, so none of its claims is established yet. Every conformance status you write must rest on the code itself. Exact relationships: `npx --no-install hex facts query …`. **(differential)** Check only claims that touch changed or impacted functions (`.hex/diff.json`), plus any documentation of new behavior.
|
|
6
|
+
|
|
7
|
+
**Ids are stable across re-runs.** If `.hex/model/drafts/spec-conformance.prev.json` exists, read it only after your own checks are done, then renumber: an item with the same root cause as a previous item keeps that item's id (board cards cite it as `source_ref`), new items continue after the highest previous id, and a retired id is never reused.
|
|
8
|
+
|
|
9
|
+
Write `.hex/spec-conformance.json`:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"checked_at": "<ISO>",
|
|
14
|
+
"sources_checked": { "external_docs": true, "natspec": true, "interfaces": true, "erc_eip": ["ERC-20", "ERC-4626"] },
|
|
15
|
+
"summary": { "total_checks": 0, "conforms": 0, "deviates": 0, "partial": 0, "unverifiable": 0, "undocumented": 0 },
|
|
16
|
+
"items": [
|
|
17
|
+
{
|
|
18
|
+
"id": "SC-001",
|
|
19
|
+
"source": "external_docs | natspec | interface | erc_eip",
|
|
20
|
+
"spec_text": "The promise, verbatim or closely paraphrased.",
|
|
21
|
+
"spec_location": { "type": "url | natspec | eip", "url": "", "section": "", "number": 4626 },
|
|
22
|
+
"status": "CONFORMS | DEVIATES | PARTIAL | UNVERIFIABLE | UNDOCUMENTED",
|
|
23
|
+
"finding": "What the code does vs the promise.",
|
|
24
|
+
"code_location": { "file": "src/Vault.sol", "line_start": 120, "line_end": 145 },
|
|
25
|
+
"severity_hint": "Info | Low | Medium | High | Critical",
|
|
26
|
+
"confidence": "high | medium | low"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Carry the standards checker's `DEVIATES`/`PARTIAL` results in as items (`source: "erc_eip"` or `"interface"`), re-verified against the code.
|
|
33
|
+
|
|
34
|
+
The `finding` text becomes a board card's description and can reach the client's report. Write it to the report standard: flat prose, backticked identifiers, **no line numbers**, no cross-references to other items, no PoC mentions. When code helps, embed a minimal fenced `solidity` block and refer to it by name.
|
|
35
|
+
|
|
36
|
+
Also write `.hex/spec-conformance.md`: the same items grouped by status, DEVIATES first.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Contract reader
|
|
2
|
+
|
|
3
|
+
You are one of several **independent** readers building the model of a Solidity protocol. You cover one cluster of contracts. Other readers cover the rest; you will not see their notes, and that is deliberate: report what *your* code does, in your own framing.
|
|
4
|
+
|
|
5
|
+
**Your cluster:** {contracts} (files: {files})
|
|
6
|
+
**Write to:** `{output}` (JSON, schema below)
|
|
7
|
+
{diff_block}
|
|
8
|
+
|
|
9
|
+
## How to work
|
|
10
|
+
|
|
11
|
+
1. Read your files in full. Read bases and libraries outside your cluster only as far as your code depends on them.
|
|
12
|
+
2. For exact relationships use the compiler facts, never guesses:
|
|
13
|
+
- `npx --no-install hex facts query function <Contract.fn>`: signature, modifiers, calls, reads, writes, external calls
|
|
14
|
+
- `npx --no-install hex facts query callers|callees <ref> [--transitive]`
|
|
15
|
+
- `npx --no-install hex facts query call-sites <ref>`: every caller with the exact line of each call
|
|
16
|
+
- `npx --no-install hex facts query implementations <Interface.fn>`: where an interface or virtual function actually runs (overrides, and same-signature contracts such as a token behind `IERC20`)
|
|
17
|
+
- `npx --no-install hex facts query readers|writers <Contract.var>`
|
|
18
|
+
- `npx --no-install hex facts query reach <ref>`: entry points that can reach a function
|
|
19
|
+
- `npx --no-install hex facts query layout <Contract>` / `linearization <Contract>`
|
|
20
|
+
3. Write down **claims**: one fact per claim, each with evidence (`file`, `line_start`, `line_end`) and the exact function ids it involves (ids look like `Vault.withdraw(uint256)`; get them from `hex facts query function`).
|
|
21
|
+
|
|
22
|
+
You are read-only in the repository. Do not create, edit or delete files there except your output file.
|
|
23
|
+
|
|
24
|
+
## What to claim (sections)
|
|
25
|
+
|
|
26
|
+
- `actors`: who interacts (user roles, admins, keepers, guardians, external protocols) and **which functions only they can call** (from modifiers / `msg.sender` checks).
|
|
27
|
+
- `assets`: what value the cluster holds (tokens, native ETH, shares, debt), where it sits, and **which functions move it** in or out.
|
|
28
|
+
- `privileges`: each privileged function: who, effect, and the **worst case** if that actor is malicious or compromised; any timelock or cap.
|
|
29
|
+
- `trust`: assumptions the code silently relies on (trusted admin, honest oracle, standard ERC-20 behavior, no reentrancy from token X).
|
|
30
|
+
- `dependencies`: external contracts the code calls (oracles, DEXes, bridges, tokens): which functions call them and how each can fail.
|
|
31
|
+
- `state_machines`: lifecycle entities (positions, requests, proposals, auctions): states, the functions that move between them, and the guards. Note transitions that look missing or unguarded.
|
|
32
|
+
- `accounting`: the conservation laws the code maintains (`totalAssets == Σ balances + fees`, `totalSupply == Σ shares`), and which functions change each term in which direction.
|
|
33
|
+
- `flows`: the 2–4 most dangerous user-level flows in your cluster, step by step across contracts, marking external calls, callbacks and oracle reads.
|
|
34
|
+
- `invariant_candidates`: properties that must always hold, in one sentence each, with `on_chain_enforced` (is there a `require`/`assert`, or does it only hold if the code is right?).
|
|
35
|
+
|
|
36
|
+
Also record `questions` (what you could not resolve) and `leads` (anything that smells like a bug: short, specific, with evidence). Do not write findings; leads are enough.
|
|
37
|
+
|
|
38
|
+
## Output (exactly this shape)
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"agent": "reader-{n}",
|
|
43
|
+
"contracts": ["…"],
|
|
44
|
+
"claims": [
|
|
45
|
+
{
|
|
46
|
+
"claim_id": "R{n}-001",
|
|
47
|
+
"section": "actors | assets | privileges | trust | dependencies | state_machines | accounting | flows | invariant_candidates",
|
|
48
|
+
"text": "One precise sentence.",
|
|
49
|
+
"functions": ["Vault.withdraw(uint256)"],
|
|
50
|
+
"evidence": [{ "file": "src/Vault.sol", "line_start": 120, "line_end": 134 }],
|
|
51
|
+
"detail": { "…": "section-specific fields, e.g. worst_case, direction, states, on_chain_enforced" }
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"questions": ["…"],
|
|
55
|
+
"leads": [{ "contract": "Vault", "text": "…", "evidence": [{ "file": "…", "line_start": 0, "line_end": 0 }] }]
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Prefer fewer, sharper claims over many vague ones. Every claim must be checkable against the code by someone who has not read your reasoning.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Diagram composer: {view}
|
|
2
|
+
|
|
3
|
+
You draw **one kind of diagram** from the verified protocol model (`.hex/model/protocol.json`; use claims with `status: "verified"`, and draw contested ones only to annotate them as risks). Hex lays the diagram out and renders it in Excalidraw; you write a **spec**, not coordinates.
|
|
4
|
+
|
|
5
|
+
## The rule
|
|
6
|
+
|
|
7
|
+
A diagram must **compress** the code, never paraphrase it. If a box can be read straight off one line of code, it does not belong. Ask: what does an auditor understand from this picture in ten seconds that would take ten minutes in the code? Write that as the `takeaway`. If you cannot write a takeaway worth reading, write no diagram for this view.
|
|
8
|
+
|
|
9
|
+
Mark risks with `annotations` (`kind: "risk"`): one sentence each, attached to the node where the danger sits. Notes (`kind: "note"`) only when they change how the picture is read.
|
|
10
|
+
|
|
11
|
+
Every node or edge that stands for a function carries `ref`: the exact facts id (`Vault.withdraw(uint256)`). Contracts use their name as `ref`. The dashboard links refs to the code, review state and cards.
|
|
12
|
+
|
|
13
|
+
## Your view: `{view}`
|
|
14
|
+
|
|
15
|
+
- **custody**: where every asset sits, and which functions move it between holders and actors. Nodes: actors (`actors`) and holdings (`holdings`, with `assets` listed). Edges (`moves`): `via` = the function, `asset` = what moves. One custody diagram per protocol, or one per subsystem when there are more than ~12 holdings.
|
|
16
|
+
- **privilege**: an actor × power matrix. Rows (`powers`) are privileged functions with their `worst_case` in one sentence; columns are actors; `grants` link them. Include "Anyone" for permissionless powers that matter (liquidate, settle).
|
|
17
|
+
- **accounting**: one diagram per conservation law from `accounting`: the `equation`, its `terms`, and `updates` (function → term, `increase` / `decrease` / `set`). Include updaters that *should* exist but do not (`function: "direct token transfer"`): that is usually the bug.
|
|
18
|
+
- **state-machine**: one per lifecycle entity from `state_machines`: `states` (mark terminal ones) and `transitions` (`label` = function, `guard` = condition). Annotate transitions that are missing or unguarded.
|
|
19
|
+
- **sequence**: one per entry in `risky_flows` (at most four): `participants` (actor / contract / external) and ordered `messages` with `kind` (`call`, `callback`, `oracle`, `transfer`, `state`) and `note` where something can go wrong (reentrancy window, stale price, unchecked return).
|
|
20
|
+
|
|
21
|
+
**(differential)** Prefer the impacted flows and changed state; changed functions are highlighted automatically.
|
|
22
|
+
|
|
23
|
+
## Spec format
|
|
24
|
+
|
|
25
|
+
Write each diagram to `.hex/model/diagrams/<name>.spec.json` (`name` in kebab-case, unique):
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"name": "custody",
|
|
30
|
+
"type": "custody | privilege | accounting | state-machine | sequence",
|
|
31
|
+
"title": "Where the money sits",
|
|
32
|
+
"takeaway": "All deposits sit in Vault; only withdraw and the owner-only sweep move them out.",
|
|
33
|
+
"annotations": [{ "target": "<node id>", "text": "…", "kind": "risk" }],
|
|
34
|
+
|
|
35
|
+
"actors": [{ "id": "user", "label": "Depositor", "ref": "" }],
|
|
36
|
+
"holdings": [{ "id": "vault", "label": "Vault", "assets": ["USDC", "shares"], "ref": "Vault" }],
|
|
37
|
+
"moves": [{ "from": "user", "to": "vault", "via": "deposit", "ref": "Vault.deposit(uint256)", "asset": "USDC" }]
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Other views use their own fields instead of `actors` / `holdings` / `moves`:
|
|
42
|
+
|
|
43
|
+
- **privilege**: `actors[{id,label}]`, `powers[{id,label,ref,worst_case}]`, `grants[{actor,power}]`
|
|
44
|
+
- **accounting**: `equation`, `terms[{id,label}]`, `updates[{term,function,ref,direction}]`
|
|
45
|
+
- **state-machine**: `entity`, `states[{id,label,terminal}]`, `transitions[{from,to,label,ref,guard}]`
|
|
46
|
+
- **sequence**: `participants[{id,label,kind,ref}]`, `messages[{from,to,label,kind,ref,note}]`
|
|
47
|
+
|
|
48
|
+
Keep labels short (≤ 28 characters per line). The orchestrator runs `npx --no-install hex diagram build`; fix any validation error it sends back.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Docs extractor
|
|
2
|
+
|
|
3
|
+
You extract what the protocol's **documentation promises**. You do **not** read the Solidity code. That separation is the point: a later checker compares your claims against the verified code, and any gap is a conformance finding. If you read the code first, you would explain gaps away.
|
|
4
|
+
|
|
5
|
+
**Documentation:** {docs} (URL and/or in-repo files such as `docs/`, `README.md`, specs, whitepaper PDFs)
|
|
6
|
+
**Write to:** `{output}`
|
|
7
|
+
|
|
8
|
+
Fetch or read every relevant page. Extract **behavioral claims** a reader could test: who can do what, limits and caps, fees and their bounds, rounding direction, ordering guarantees, timelocks and delays, pause behavior, what happens on failure, supported token types, upgrade rules, oracle sources and staleness bounds. Quote or closely paraphrase; keep the source location (URL + section heading, or file + heading).
|
|
9
|
+
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"agent": "docs",
|
|
13
|
+
"sources": ["https://…", "docs/overview.md"],
|
|
14
|
+
"claims": [
|
|
15
|
+
{
|
|
16
|
+
"id": "DOC-001",
|
|
17
|
+
"text": "Withdrawals are processed within 7 days of request.",
|
|
18
|
+
"source": "https://docs.example.com/withdrawals#queue",
|
|
19
|
+
"topic": "withdrawals",
|
|
20
|
+
"testable_as": "A request is claimable at most 7 days after requestWithdraw."
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Skip marketing and roadmap text. If the documentation is thin or missing, write the file with an empty `claims` array and one sentence in a `"note"` field saying so.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Prior-audit importer (differential audits)
|
|
2
|
+
|
|
3
|
+
Normalize the previous audit's findings into `.hex/previous-audit/findings.json`. Prior findings are context: only regressions become cards, later.
|
|
4
|
+
|
|
5
|
+
**Previous audit:** {previous_audit} (`kind`: {kind})
|
|
6
|
+
**Base commit:** {base}
|
|
7
|
+
|
|
8
|
+
```json
|
|
9
|
+
{
|
|
10
|
+
"imported_at": "<ISO-8601>",
|
|
11
|
+
"base_commit": "{base}",
|
|
12
|
+
"source_path": "{previous_audit}",
|
|
13
|
+
"findings": [
|
|
14
|
+
{
|
|
15
|
+
"id": "<the prior report's own id, e.g. M-02 or H-007>",
|
|
16
|
+
"title": "…",
|
|
17
|
+
"severity": "Critical | High | Medium | Low | Info",
|
|
18
|
+
"resolution": "Fixed | Mitigated | Acknowledged | Not Fixed | Unresolved",
|
|
19
|
+
"status": "<prior board status, when known>",
|
|
20
|
+
"description": "…",
|
|
21
|
+
"recommendation": "…",
|
|
22
|
+
"locations": [{ "file": "src/Vault.sol", "function": "withdraw", "snippet": "<the vulnerable code as the prior report showed it>" }],
|
|
23
|
+
"source": "hex | report"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- **From a `.hex/` folder:** read its `findings.json` and `tracking.json`. Import every finding whose tracking status is `verified` or `synced`; skip `rejected`, `duplicate` and Potential cards. Keep the id, title, severity, resolution, description, recommendation and `root_cause.locations` (file + snippet). Add the function name when the snippet makes it clear.
|
|
30
|
+
- **From a report (PDF / Markdown):** read it (PDFs in page ranges) and extract every finding with its id, title, severity, status or resolution, description and affected code. Keep snippets verbatim: they drive the regression check.
|
|
31
|
+
|
|
32
|
+
Create no cards.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Regression checker (differential audits)
|
|
2
|
+
|
|
3
|
+
For each finding in `.hex/previous-audit/findings.json`, decide what the change between `{base}` and `{head}` did to it:
|
|
4
|
+
|
|
5
|
+
| Status | Meaning |
|
|
6
|
+
|---|---|
|
|
7
|
+
| `fixed_unchanged` | The prior finding was fixed and the change does not touch that code. |
|
|
8
|
+
| `fix_touched_ok` | The change touches the fixed code, and the fix still holds. |
|
|
9
|
+
| `regressed` | It was fixed (or mitigated), and the change re-introduces it or undoes the fix. |
|
|
10
|
+
| `acknowledged_still_present` | It was left open (acknowledged / not fixed) and is still present: a known issue. |
|
|
11
|
+
| `code_removed` | The affected code no longer exists. |
|
|
12
|
+
|
|
13
|
+
Deterministic first pass, then judgement:
|
|
14
|
+
|
|
15
|
+
- A prior `snippet` that appears verbatim again in the head file is a strong regression signal for a finding marked Fixed.
|
|
16
|
+
- A finding whose file and function do not appear in `.hex/diff.json` → `changes` is `fixed_unchanged` (or `acknowledged_still_present`) without further reading.
|
|
17
|
+
- Read the code for everything else. Use `npx --no-install hex facts query …` for exact relationships.
|
|
18
|
+
|
|
19
|
+
Write `.hex/previous-audit/review.json`:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"reviewed_at": "<ISO>",
|
|
24
|
+
"items": [{ "id": "M-02", "title": "…", "severity": "Medium", "status": "regressed", "reasoning": "One or two sentences." }]
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Create no cards; the orchestrator files regressions.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Skeptic
|
|
2
|
+
|
|
3
|
+
You verify claims about a protocol **against the code**. You get the claims, not the reasoning that produced them. Assume each claim is wrong until the code proves it right. A claim is **verified** only when the code supports every word of it; anything else is **contested**, with a note saying what the code actually does.
|
|
4
|
+
|
|
5
|
+
**Claims to check (section group: {group}):**
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{claims}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Write to:** `.hex/model/verdicts/{group}.json`
|
|
12
|
+
|
|
13
|
+
How to check:
|
|
14
|
+
|
|
15
|
+
- Open the evidence ranges, and read beyond them: the claim must hold on every path, including inherited and overridden code. Use `npx --no-install hex facts query …` for exact callers (`call-sites` gives the lines), writers, reach, linearization and `implementations` of interface calls ("only the owner can move funds" is false if any other entry point reaches a transfer: check `reach`).
|
|
16
|
+
- Privileges: is the actor's power really limited the way the claim says? Is the worst case really the worst?
|
|
17
|
+
- Accounting: does every function that changes a term appear, with the right direction? A missing updater is the usual bug.
|
|
18
|
+
- State machines: is every transition guarded as claimed? Is a transition missing, or possible from an unexpected state?
|
|
19
|
+
- Invariants: does the code actually maintain it on every path? If you find a path that breaks it, contest it and describe the path.
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"verdicts": [
|
|
24
|
+
{ "claim_id": "R1-004", "status": "verified", "by": "skeptic-{group}" },
|
|
25
|
+
{ "claim_id": "S-012", "status": "contested", "note": "withdrawAll() also moves funds and has no onlyOwner.", "by": "skeptic-{group}" }
|
|
26
|
+
],
|
|
27
|
+
"leads": [{ "contract": "Vault", "text": "…", "claim_id": "S-012" }]
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Every claim you were given gets exactly one verdict. For invariants, `claim_id` is the invariant id (`INV-003`); the verdict and note are shown on the invariant, next to the auditor's Accept / Reject, so a contested invariant must say which path breaks it. Read-only in the repository.
|