hex-audit 0.6.2 → 0.7.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/DEMO.md +13 -0
- package/README.md +60 -6
- package/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/app-build-manifest.json +100 -89
- package/dashboard/.next/app-path-routes-manifest.json +1 -1
- package/dashboard/.next/build-manifest.json +14 -14
- 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 +118 -118
- 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_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/access/page.js +1 -1
- package/dashboard/.next/server/app/access/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/access/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/calls/page.js +1 -1
- package/dashboard/.next/server/app/calls/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/changes/page.js +20 -0
- package/dashboard/.next/server/app/changes/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/changes/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/conformance/page.js +1 -1
- package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/diagram/page.js +1 -1
- package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/flows/page.js +1 -1
- package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/functions/page.js +1 -1
- package/dashboard/.next/server/app/functions/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/issues/page.js +6 -6
- package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/notes/page.js +3 -3
- package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/page.js +2 -2
- package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/progress/page.js +1 -1
- package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/report/page.js +1 -1
- package/dashboard/.next/server/app/report/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/stats/page.js +1 -1
- package/dashboard/.next/server/app/stats/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app-paths-manifest.json +9 -8
- package/dashboard/.next/server/chunks/42.js +1 -1
- package/dashboard/.next/server/chunks/530.js +1 -1
- package/dashboard/.next/server/chunks/649.js +1 -1
- package/dashboard/.next/server/chunks/939.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-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/chunks/{1.8868c4d131111be7.js → 1.a666047ea18866fb.js} +2 -2
- package/dashboard/.next/static/chunks/1015.39008440ab15e196.js +226 -0
- package/dashboard/.next/static/chunks/1151.497fa63c5b9eba52.js +1 -0
- package/dashboard/.next/static/chunks/1199.f30cbfa151e56076.js +148 -0
- package/dashboard/.next/static/chunks/1375.64c20f1064a38a10.js +43 -0
- package/dashboard/.next/static/chunks/1799.8dc56017eede704e.js +9 -0
- package/dashboard/.next/static/chunks/20154aaa.e87f69fe10483f8b.js +1 -0
- package/dashboard/.next/static/chunks/2077.5603adeb156c7d10.js +1 -0
- package/dashboard/.next/static/chunks/2166.9f6592b9399eadd8.js +215 -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/{2383.62c035a052272594.js → 2383.ca81f980ce6528a4.js} +1 -1
- package/dashboard/.next/static/chunks/2694.7dfa5fef28851903.js +1 -0
- package/dashboard/.next/static/chunks/275.38af87389c1d33d7.js +34 -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/{2879.51436986f93981d9.js → 2879.74d65e33e60505ee.js} +1 -1
- package/dashboard/.next/static/chunks/3017.4a5312e3c20a173f.js +1 -0
- package/dashboard/.next/static/chunks/3205-47d09be47325709f.js +2 -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/3626.c5dacee11c8fbc4d.js +64 -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-88d849290406ee6f.js +1 -0
- package/dashboard/.next/static/chunks/3948.74201b9f0672234d.js +287 -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/5060.47402abc10273699.js +1 -0
- package/dashboard/.next/static/chunks/5284.334c7c0587d5d47a.js +1 -0
- package/dashboard/.next/static/chunks/5715.e16b1230cc4b4652.js +115 -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/6177.a01cf0a03734cf09.js +1 -0
- package/dashboard/.next/static/chunks/618f8807-69fc7bb97c2b87c1.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/690f35d0.ab57e02a04c7e9e0.js +119 -0
- package/dashboard/.next/static/chunks/{7020.831e16e26d91abc1.js → 7020.b718b1b9cea36e60.js} +2 -2
- package/dashboard/.next/static/chunks/7397-37adf76cad543297.js +1 -0
- package/dashboard/.next/static/chunks/7498-d1814d68ba346d13.js +1 -0
- package/dashboard/.next/static/chunks/7802.f0134c792fccd382.js +80 -0
- package/dashboard/.next/static/chunks/7973.e34032723285a616.js +79 -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/{8452-e616b5f43bceb95f.js → 8452-6d77fa353402422c.js} +2 -2
- package/dashboard/.next/static/chunks/8645.98a43217d406500e.js +1 -0
- package/dashboard/.next/static/chunks/8928-fc049decdfbdaa6d.js +1 -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/9466.a914ce0de7d3bb84.js +1 -0
- package/dashboard/.next/static/chunks/9660.b1c8deae2c449d14.js +1 -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/9811.2993c4cbd28e8d1b.js +1 -0
- package/dashboard/.next/static/chunks/app/_not-found/page-c299b935209993df.js +1 -0
- package/dashboard/.next/static/chunks/app/access/page-f8403cbdfc1c176b.js +1 -0
- package/dashboard/.next/static/chunks/app/calls/page-41f20d01e12382ef.js +1 -0
- package/dashboard/.next/static/chunks/app/changes/page-82bf8b6f48cdc506.js +1 -0
- package/dashboard/.next/static/chunks/app/conformance/page-6bb8e3b372e38098.js +1 -0
- package/dashboard/.next/static/chunks/app/diagram/page-469cd7a6f183efba.js +1 -0
- package/dashboard/.next/static/chunks/app/flows/page-7872dd9141ba0b07.js +1 -0
- package/dashboard/.next/static/chunks/app/functions/page-5847bcb77a8e7edf.js +1 -0
- package/dashboard/.next/static/chunks/app/issues/page-1ffc64fe40439002.js +1 -0
- package/dashboard/.next/static/chunks/app/layout-6c6d2a0fd7c989d3.js +1 -0
- package/dashboard/.next/static/chunks/app/notes/page-8bcaa52304500098.js +1 -0
- package/dashboard/.next/static/chunks/app/page-d63800ddb072b77b.js +1 -0
- package/dashboard/.next/static/chunks/app/progress/page-e26554f655a62eef.js +1 -0
- package/dashboard/.next/static/chunks/app/report/page-18c04fb2f193b020.js +1 -0
- package/dashboard/.next/static/chunks/app/stats/page-67ff59fd69bed651.js +1 -0
- package/dashboard/.next/static/chunks/{b7167ec1.7afbab6f609e3326.js → b7167ec1.708a3d61698ca2e6.js} +1 -1
- 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-app-5662c64b50ba40d1.js +1 -0
- package/dashboard/.next/static/chunks/main-cc3a889b25e9aa68.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-4de0e79bdd6a0418.js +1 -0
- package/dashboard/.next/static/css/1112cea2260b3926.css +3 -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/a1f87af3f44fadbb-s.woff2 +0 -0
- package/dashboard/.next/static/media/f9e1dbe9676d9bb6-s.woff2 +0 -0
- package/dashboard/.next/static/z5XBev05xDAkDrxWxAjNu/_buildManifest.js +1 -0
- package/dashboard/app/changes/ChangesClient.tsx +464 -0
- package/dashboard/app/changes/page.tsx +36 -0
- package/dashboard/app/issues/IssuesBoardClient.tsx +11 -1
- package/dashboard/app/layout.tsx +13 -1
- package/dashboard/app/notes/NotesClient.tsx +5 -0
- package/dashboard/app/page.tsx +42 -0
- package/dashboard/components/DashboardLayout.tsx +43 -18
- 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 +529 -0
- package/dist/analysis/code-model.js.map +1 -0
- package/dist/analysis/diff.d.ts +64 -0
- package/dist/analysis/diff.d.ts.map +1 -0
- package/dist/analysis/diff.js +644 -0
- package/dist/analysis/diff.js.map +1 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +18 -2
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/diff.d.ts +26 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +218 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +72 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +4 -4
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +30 -2
- package/dist/commands/note.js.map +1 -1
- package/dist/core/config.d.ts +9 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +18 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +16 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/git.d.ts +24 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +115 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/issues.d.ts +4 -2
- package/dist/core/issues.d.ts.map +1 -1
- package/dist/core/issues.js +67 -28
- package/dist/core/issues.js.map +1 -1
- package/dist/core/notes.d.ts +25 -1
- package/dist/core/notes.d.ts.map +1 -1
- package/dist/core/notes.js +34 -2
- package/dist/core/notes.js.map +1 -1
- package/dist/core/schema.d.ts +750 -53
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +153 -1
- package/dist/core/schema.js.map +1 -1
- 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/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/skills/ai-audit/LICENSE +21 -0
- package/dist/skills/ai-audit/SKILL.md +476 -0
- package/dist/skills/ai-audit/UPSTREAM.md +46 -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 +223 -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/generate-report.md +9 -3
- package/dist/skills/ingest-aa-report.md +11 -2
- package/dist/skills/init-audit.md +104 -2
- package/dist/skills/validate-all-findings.md +1 -1
- package/dist/skills/validate-finding.md +12 -7
- package/dist/skills/write-finding.md +8 -6
- package/dist/types/index.d.ts +7 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
- 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/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.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/chunks/44.js +0 -1
- package/dashboard/.next/server/pages/404.html +0 -1
- package/dashboard/.next/static/ZYqkgvjnS38aMxfanyctA/_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/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/.next/static/{ZYqkgvjnS38aMxfanyctA → z5XBev05xDAkDrxWxAjNu}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Publish to the Hex board — Turn 6
|
|
2
|
+
|
|
3
|
+
This file is Hex's addition to the skill. It runs **once per scan, after Turn 5** has printed
|
|
4
|
+
the report, and turns the scan's result into Hex board state:
|
|
5
|
+
|
|
6
|
+
- every **FINDING** → a raw record in `.hex/ai-results/ai-audit/findings.json` and a
|
|
7
|
+
**Potential** card on the Issues board (`source: ai-audit`, `status: unverified`), deduped
|
|
8
|
+
against everything already on the board;
|
|
9
|
+
- every **LEAD** → an open lead on the contract's Hex note (`/notes`), never a card.
|
|
10
|
+
|
|
11
|
+
The report Turn 5 printed is not touched. The board copy is a **rewrite** of each finding to
|
|
12
|
+
Hex's report standard, because the board's text ends up verbatim in the client's report.
|
|
13
|
+
|
|
14
|
+
**Never** hand-edit `.hex/tracking.json` or `.hex/findings.json` — cards go through
|
|
15
|
+
`npx hex issue`, leads through `npx hex note lead`. **Never** move a card to Verified, and never
|
|
16
|
+
run `/validate-finding` or `/sync-issues` from here: those are the auditor's calls.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 1 — Export the winners
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
bash {resolved_path}/hex-export.sh --dir .hex/ai-audit/runs/{stamp}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Then Read `.hex/ai-audit/runs/{stamp}/hex-digest.md`. It holds one block per key — the winner
|
|
27
|
+
across all passes, the same set the report printed — with its key, confidence, location, title
|
|
28
|
+
and body (Description and Fix for a FINDING, the one-line body for a LEAD). Work from this file
|
|
29
|
+
only; do not re-read run files by line number, and do not re-run the gate.
|
|
30
|
+
|
|
31
|
+
If the digest says `None`, print `Hex board: nothing to publish (scan {stamp}).` and stop.
|
|
32
|
+
|
|
33
|
+
## Step 2 — Load the board once
|
|
34
|
+
|
|
35
|
+
Read, in one parallel message:
|
|
36
|
+
|
|
37
|
+
- `.hex/tracking.json` and `.hex/findings.json` — every card on the board, all sources.
|
|
38
|
+
- `.hex/ai-results/ai-audit/findings.json` — records from earlier `/ai-audit` scans (may not exist).
|
|
39
|
+
- `.hex/config.json` — the scope (to find each contract's file) and `project.mode`.
|
|
40
|
+
- In a differential audit with prior findings: `.hex/previous-audit/findings.json` and
|
|
41
|
+
`.hex/previous-audit/review.json` (either may not exist).
|
|
42
|
+
|
|
43
|
+
**Already on the board** = the set of `scan_key` values of records in
|
|
44
|
+
`ai-results/ai-audit/findings.json` whose `id` is the `source_ref` of a tracking entry with
|
|
45
|
+
`source: "ai-audit"`, in any column. A key in this set was filed by an earlier scan.
|
|
46
|
+
|
|
47
|
+
## Step 3 — Triage each FINDING
|
|
48
|
+
|
|
49
|
+
Go through the digest's FINDINGs in order. For each one decide **exactly one** outcome:
|
|
50
|
+
|
|
51
|
+
1. **already on board** — its key is in the set above. Skip it. Do not update that card: the
|
|
52
|
+
auditor may have edited, validated or rejected it, and a re-scan does not overrule them.
|
|
53
|
+
2. **known from the prior audit** — differential audit only. It matches a prior finding (match
|
|
54
|
+
rules below) that the prior audit left open: `review.json` status
|
|
55
|
+
`acknowledged_still_present`, or a prior `resolution` of `Acknowledged`, `Unresolved` or
|
|
56
|
+
`Not Fixed`. Skip it; the client already knows. A match to a prior finding that was **fixed**
|
|
57
|
+
is not "known" — that is a regression, and it is filed (outcome 4, or 3 if `/init-audit`
|
|
58
|
+
already carded the regression).
|
|
59
|
+
3. **duplicate** — it matches an existing card from any other source, or an `ai-audit` card with
|
|
60
|
+
a different key. It is filed, then moved to the Duplicate column (Step 5).
|
|
61
|
+
4. **new** — none of the above. It is filed.
|
|
62
|
+
|
|
63
|
+
### Match rules (the same rules `/ingest-aa-report` uses)
|
|
64
|
+
|
|
65
|
+
Compare the finding against each candidate on four signals:
|
|
66
|
+
|
|
67
|
+
| Signal | How to compare |
|
|
68
|
+
|---|---|
|
|
69
|
+
| **contract** (boolean) | Does the affected contract name match? |
|
|
70
|
+
| **function** (boolean) | Does the affected function name match? |
|
|
71
|
+
| **root_cause** | `same` / `overlapping` / `different` — judge the technical mechanism. |
|
|
72
|
+
| **attack_vector** | `same` / `overlapping` / `different` — judge what an attacker actually does. |
|
|
73
|
+
|
|
74
|
+
A match is **at least one of**:
|
|
75
|
+
- `root_cause = same` AND `function = true`, or
|
|
76
|
+
- `root_cause = same` AND `contract = true` AND `attack_vector = same`, or
|
|
77
|
+
- `root_cause = overlapping` AND `function = true` AND `attack_vector = same`.
|
|
78
|
+
|
|
79
|
+
When several cards match, the canonical one is the earliest-created card that is not itself in
|
|
80
|
+
the Duplicate column.
|
|
81
|
+
|
|
82
|
+
## Step 4 — Write the raw records
|
|
83
|
+
|
|
84
|
+
For every finding that is **new** or a **duplicate**, read the code at its location
|
|
85
|
+
(`Contract.function` — find the contract's file in the scope, then read the function), and write
|
|
86
|
+
one record. Ids continue from the highest `AI-NNN` already in the file (`AI-001` when empty).
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"id": "AI-NNN",
|
|
91
|
+
"tool": "ai-audit",
|
|
92
|
+
"scan_key": "<the digest's key, verbatim>",
|
|
93
|
+
"scan_stamp": "{stamp}",
|
|
94
|
+
"title": "<concise, descriptive title>",
|
|
95
|
+
"severity": "Critical | High | Medium | Low | Info",
|
|
96
|
+
"confidence": "high | medium | low",
|
|
97
|
+
"category": "<auditor-style category, e.g. Reentrancy, Access Control, Math / Rounding>",
|
|
98
|
+
"raw_category": "<the bug-class segment of the key, verbatim>",
|
|
99
|
+
"description": "<Hex description standard, below>",
|
|
100
|
+
"recommendation": "<prose only, 'Consider ...', 1-2 sentences, no code>",
|
|
101
|
+
"affected_code": [{ "file": "<path>", "snippet": "<the offending code>" }]
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Write the whole file once with the Write tool, keeping every earlier record:
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{ "tool": "ai-audit", "ran_at": "<ISO now>", "duration_seconds": null, "total_findings": <all records>, "findings": [ ... ] }
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
This file is the source record behind the cards (as `ai-results/auditagent/findings.json` is for
|
|
112
|
+
AuditAgent); `hex issue new` materializes each card from it. Writing it directly is correct.
|
|
113
|
+
Skipped findings (already on board, known from the prior audit) get **no** record.
|
|
114
|
+
|
|
115
|
+
### Field rules
|
|
116
|
+
|
|
117
|
+
**confidence** — from the digest's score: `90-100` → `high`, `75-89` → `medium`, below `75` → `low`.
|
|
118
|
+
It says how sure the scan is that the bug is real. It is **not** severity.
|
|
119
|
+
|
|
120
|
+
**severity** — assess impact and likelihood yourself, from the code, with Hex's matrix:
|
|
121
|
+
|
|
122
|
+
| | Low Impact | Medium Impact | High Impact |
|
|
123
|
+
|---|---|---|---|
|
|
124
|
+
| **High Likelihood** | Medium | High | Critical |
|
|
125
|
+
| **Medium Likelihood** | Low | Medium | High |
|
|
126
|
+
| **Low Likelihood** | Info | Low | Medium |
|
|
127
|
+
|
|
128
|
+
- **Impact:** High = direct fund loss, permanent state corruption, or full bypass of critical
|
|
129
|
+
access control. Medium = temporary DoS, griefing with cost, accounting errors that compound, or
|
|
130
|
+
partial access bypass. Low = minor inefficiency, cosmetic, or best-practice deviation.
|
|
131
|
+
- **Likelihood:** High = anyone can trigger it with no preconditions, and it pays. Medium =
|
|
132
|
+
specific but realistic conditions or timing. Low = unlikely conditions, complex multi-step
|
|
133
|
+
setup, or unprofitable.
|
|
134
|
+
|
|
135
|
+
**title** — the digest's title is a good start. Keep it concise and descriptive, backtick
|
|
136
|
+
identifiers, no em dashes, no confidence score.
|
|
137
|
+
|
|
138
|
+
**description** — the digest's Description is one Simplified-English sentence. The board needs
|
|
139
|
+
the Hex standard, which every source (manual, AuditAgent, conformance, GitHub) meets:
|
|
140
|
+
|
|
141
|
+
- **Short paragraphs that separate the parts:** how the code is supposed to work (expected
|
|
142
|
+
behavior), what is wrong (the flaw), and the impact. Not one dense block.
|
|
143
|
+
- **No markdown headings and no bold section labels** (`**Summary**:`, `**Impact**:`). The
|
|
144
|
+
separation is paragraph breaks.
|
|
145
|
+
- **Backtick every Solidity identifier.** Functions as `` `functionName(...)` `` with the literal
|
|
146
|
+
`(...)`; contracts, variables and constants in plain backticks. Standard names (ERC-4626, UUPS)
|
|
147
|
+
stay plain.
|
|
148
|
+
- **Show the offending code** in a minimal fenced ```` ```solidity ```` block. Never modify the
|
|
149
|
+
original code: the only additions allowed are `// ....` for omitted lines and a
|
|
150
|
+
`// @audit-issue <full sentence>.` comment on its own line **above** the affected line.
|
|
151
|
+
- **No line numbers, no confidence scores, no PoC references, no cross-references** to other
|
|
152
|
+
findings (`H-NNN`, "the previous finding"), no em dashes. The text must stand alone in a report.
|
|
153
|
+
|
|
154
|
+
**recommendation** — turn the Fix into a suggestion: start with *Consider...*, *One option
|
|
155
|
+
is...* or *The team may want to...*; 1-2 sentences; prose only, no code or diff. When the digest
|
|
156
|
+
had Option A / Option B fixes, name both directions in prose. A finding below 75 has no Fix:
|
|
157
|
+
write the direction its Description implies.
|
|
158
|
+
|
|
159
|
+
**affected_code** — one entry per affected file, with the snippet of the offending lines (same
|
|
160
|
+
code-block rules as above). This is what fills the card's File(s) line and the report's code.
|
|
161
|
+
|
|
162
|
+
## Step 5 — File the cards
|
|
163
|
+
|
|
164
|
+
For each record, in id order:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
npx hex issue new --source ai-audit --source-ref AI-NNN --title "<title>" --severity <Severity>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
It prints the allocated `H-NNN`; capture it. The card lands in Potential as `unverified`, with
|
|
171
|
+
description, recommendation and code materialized from the record.
|
|
172
|
+
|
|
173
|
+
For each **duplicate**, move it and record why:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npx hex issue move <new H-NNN> --to duplicate --duplicate-of <canonical H-NNN>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Then append to `.hex/comparison.json` → `duplicates` (create the file as
|
|
180
|
+
`{ "duplicates": [], "novel": [], "rejected": [] }` if it does not exist):
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"ai_finding": "<new H-NNN>",
|
|
185
|
+
"matches": "<canonical H-NNN>",
|
|
186
|
+
"confidence": "high | medium | low",
|
|
187
|
+
"match_signals": { "contract": true, "function": true, "root_cause": "same", "attack_vector": "same" },
|
|
188
|
+
"reasoning": "<one short sentence: which signals carried the call>"
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Step 6 — Leads to notes
|
|
193
|
+
|
|
194
|
+
For each LEAD in the digest, add it to the contract's note. `<Contract>` is the part of the
|
|
195
|
+
location before the first `.`:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
npx hex note lead "<Contract>" \
|
|
199
|
+
--text "<title> (\`Contract.function\`): <the lead's body, one line>" \
|
|
200
|
+
--source ai-audit --source-ref "<key>"
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
The command is idempotent on the key: a lead already added by an earlier scan (open, logged or
|
|
204
|
+
dismissed) is left as it is, and the command says so on stderr. Open leads keep the contract
|
|
205
|
+
unreviewed on `/progress` until the auditor closes them — that is intended.
|
|
206
|
+
|
|
207
|
+
## Step 7 — Summary
|
|
208
|
+
|
|
209
|
+
Print, and nothing else:
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
Hex board — scan {stamp}
|
|
213
|
+
- N new Potential card(s): H-0xx, H-0yy, ...
|
|
214
|
+
- K marked Duplicate of existing cards
|
|
215
|
+
- J already on the board from an earlier scan (not re-filed)
|
|
216
|
+
- P known from the prior audit (not filed)
|
|
217
|
+
- L lead(s) added to contract notes (M already there)
|
|
218
|
+
Report: .hex/ai-audit/runs/{stamp}/full-report.md
|
|
219
|
+
|
|
220
|
+
Run /validate-finding <id> on a card to confirm it and promote it to Verified.
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Print the "known from the prior audit" line only in a differential audit with prior findings.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# HEX EXPORT. Turn 6 step 1 runs it, after assemble.sh. No model judgment runs in here.
|
|
3
|
+
#
|
|
4
|
+
# hex-export.sh --dir .hex/ai-audit/runs/{stamp}
|
|
5
|
+
#
|
|
6
|
+
# reads dir/winners.tsv the cross-run winners assemble.sh persisted (15 columns, see there)
|
|
7
|
+
# dir/run-K.md the run files, for each finding's body (Description + Fix)
|
|
8
|
+
# writes dir/hex-digest.md one block per winner, FINDINGs first — what Turn 6 publishes
|
|
9
|
+
#
|
|
10
|
+
# The digest exists so Turn 6 never re-reads run files by line number: the geometry lives in
|
|
11
|
+
# one place (assemble.sh's indexer) and this script copies bodies through byte for byte.
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
dir=
|
|
15
|
+
while [ $# -gt 0 ]; do
|
|
16
|
+
case "$1" in
|
|
17
|
+
--dir) dir=$2; shift 2 ;;
|
|
18
|
+
*) echo "hex-export.sh: unknown argument $1" >&2; exit 2 ;;
|
|
19
|
+
esac
|
|
20
|
+
done
|
|
21
|
+
[ -d "$dir" ] || { echo "hex-export.sh: no such directory $dir" >&2; exit 2; }
|
|
22
|
+
[ -f "$dir/winners.tsv" ] || { echo "hex-export.sh: $dir/winners.tsv missing — run assemble.sh first" >&2; exit 2; }
|
|
23
|
+
|
|
24
|
+
out="$dir/hex-digest.md"
|
|
25
|
+
part="$out.part"
|
|
26
|
+
: > "$part"
|
|
27
|
+
say() { printf '%s\n' "$1" >> "$part"; }
|
|
28
|
+
|
|
29
|
+
N=$(ls "$dir"/run-*.md 2>/dev/null | wc -l | tr -d ' ')
|
|
30
|
+
stamp=$(basename "$dir")
|
|
31
|
+
|
|
32
|
+
say "# Hex digest — scan $stamp"
|
|
33
|
+
say ""
|
|
34
|
+
say "_One block per key, the winner across $N run file(s). Bodies are copied from the run files unchanged._"
|
|
35
|
+
|
|
36
|
+
nf=0; nl=0
|
|
37
|
+
while IFS=$'\t' read -r k key conf kind agents file pass start end bstart bend title loc lbody memtag; do
|
|
38
|
+
[ -n "${key:-}" ] || continue
|
|
39
|
+
# assemble.sh recorded the run file as it saw the path; resolve it inside this directory.
|
|
40
|
+
run="$dir/$(basename "$file")"
|
|
41
|
+
if [ "$kind" = "FINDING" ]; then nf=$((nf+1)); n=$nf; else nl=$((nl+1)); n=$nl; fi
|
|
42
|
+
say ""
|
|
43
|
+
say "## $kind $n"
|
|
44
|
+
say ""
|
|
45
|
+
say "- key: \`$key\`"
|
|
46
|
+
[ "$kind" = "FINDING" ] && say "- confidence: $conf"
|
|
47
|
+
[ "$agents" != "" ] && [ "$agents" != "-" ] && say "- agents: $agents"
|
|
48
|
+
[ "$N" -gt 1 ] && say "- seen in: $k/$N runs"
|
|
49
|
+
[ -n "${memtag:-}" ] && say "- memory: $memtag"
|
|
50
|
+
say "- location: \`$loc\`"
|
|
51
|
+
say "- title: $title"
|
|
52
|
+
say ""
|
|
53
|
+
if [ "$kind" = "FINDING" ]; then
|
|
54
|
+
if [ -f "$run" ]; then
|
|
55
|
+
awk -v s="$bstart" -v e="$bend" 'NR>=s && NR<=e' "$run" \
|
|
56
|
+
| awk '{ lines[++n] = $0 } END {
|
|
57
|
+
b=1; while (b<=n && lines[b]=="") b++
|
|
58
|
+
while (n>=b && lines[n]=="") n--
|
|
59
|
+
for (i=b; i<=n; i++) print lines[i] }' >> "$part"
|
|
60
|
+
else
|
|
61
|
+
say "**Body missing** — run file $run not found."
|
|
62
|
+
fi
|
|
63
|
+
else
|
|
64
|
+
if [ "$lbody" = "-" ]; then say "**Body missing**"; else say "$lbody"; fi
|
|
65
|
+
fi
|
|
66
|
+
done < "$dir/winners.tsv"
|
|
67
|
+
|
|
68
|
+
[ "$nf" = 0 ] && [ "$nl" = 0 ] && { say ""; say "_None — this scan raised no findings and no leads._"; }
|
|
69
|
+
|
|
70
|
+
mv "$part" "$out"
|
|
71
|
+
echo "exported $out — $nf findings, $nl leads"
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Finding Validation
|
|
2
|
+
|
|
3
|
+
Every finding passes four sequential gates. Fail any gate → **rejected** or **demoted** to lead. Later gates are not evaluated for failed findings.
|
|
4
|
+
|
|
5
|
+
You are not defending the code. The job of these gates is to verify the attacker's claimed exploit actually fires end-to-end — anything that interrupts the attack between the attacker's call and the harm means the agent's claim does not execute, and only then does it fail to qualify as a finding.
|
|
6
|
+
|
|
7
|
+
## Gate 1 — Attack execution
|
|
8
|
+
|
|
9
|
+
Trace the agent's claimed attack path from caller to harm. Read every guard, check, modifier, and constraint that sits on that path. Confirm that none of them interrupts the attack before the exploit step fires.
|
|
10
|
+
- A specific guard / check / modifier on the attack path interrupts the claimed exploit step before harm occurs (quote the exact line and trace it) → **REJECTED** (or **DEMOTE** if a related code smell remains)
|
|
11
|
+
- The supposed interruption is speculative ("probably wouldn't happen", "the caller would notice", "the deployer would set X") → **clears**, continue
|
|
12
|
+
|
|
13
|
+
## Gate 2 — Reachability
|
|
14
|
+
|
|
15
|
+
Prove the vulnerable state exists in a live deployment.
|
|
16
|
+
|
|
17
|
+
- Structurally impossible (enforced invariant prevents it) → **REJECTED**
|
|
18
|
+
- Requires privileged actions outside normal operation → **DEMOTE**
|
|
19
|
+
- Achievable through normal usage or common token behaviors → **clears**, continue
|
|
20
|
+
|
|
21
|
+
## Gate 3 — Trigger
|
|
22
|
+
|
|
23
|
+
Prove an unprivileged actor executes the attack.
|
|
24
|
+
|
|
25
|
+
- Only trusted roles can trigger → **DEMOTE**
|
|
26
|
+
- Unprivileged actor triggers profitably → **clears**, continue
|
|
27
|
+
|
|
28
|
+
**Admin-action findings — reject unless an unprivileged amplifier is named.** This applies ONLY to actions performed by admin/owner, NOT to unprivileged attacker actions. If the harm requires the admin acting maliciously or against documented intent, **REJECT** — do not even emit as a LEAD (stricter than the DEMOTE above). The finding clears only when the body names a concrete unprivileged amplifier:
|
|
29
|
+
|
|
30
|
+
- **race** — admin sets X mid-flow; an unprivileged user exploits the window before the update propagates.
|
|
31
|
+
- **retroactive sweep** — an admin update rewrites a pending value already credited.
|
|
32
|
+
- **asymmetric formula** — admin output chains into a formula an unprivileged actor profits from.
|
|
33
|
+
- **access gap** — missing guard, tautological auth, or missing init guard (the access mechanism itself is the bug).
|
|
34
|
+
|
|
35
|
+
No amplifier named → **REJECTED**. Amplifier named → judge it on that unprivileged path.
|
|
36
|
+
|
|
37
|
+
## Gate 4 — Impact
|
|
38
|
+
|
|
39
|
+
Prove material harm to an identifiable victim.
|
|
40
|
+
|
|
41
|
+
- Self-harm only → **REJECTED**
|
|
42
|
+
- Dust-level, no compounding → **DEMOTE**
|
|
43
|
+
- Material loss to identifiable victim → **CONFIRMED**
|
|
44
|
+
|
|
45
|
+
## Confidence
|
|
46
|
+
|
|
47
|
+
Start at **100**, deduct: partial attack path **-20**, bounded non-compounding impact **-15**, requires specific (but achievable) state **-10**. Confidence ≥ 75 gets description + fix. Below 75 gets description only.
|
|
48
|
+
|
|
49
|
+
**The threshold is 75, and it is set here.** `report-formatting.md` reads it from this line and states it nowhere else. It is 75 and not 80 because the three lead-promotion rules below all land a promoted lead at exactly 75: at a threshold of 80 every cross-contract echo, every multi-agent convergence and every completed partial path would be promoted to a finding and then printed with no **Fix** block. Moving this number means moving those three, or the promotions stop being worth making.
|
|
50
|
+
|
|
51
|
+
## Safe patterns (do not flag)
|
|
52
|
+
|
|
53
|
+
- `unchecked` in 0.8+ (but verify the reasoning is correct)
|
|
54
|
+
- Explicit narrowing casts in 0.8+ (reverts on overflow)
|
|
55
|
+
- MINIMUM_LIQUIDITY burn on first deposit
|
|
56
|
+
- SafeERC20 (`safeTransfer`/`safeTransferFrom`)
|
|
57
|
+
- `nonReentrant` (only flag cross-contract attacks)
|
|
58
|
+
- Two-step admin transfer
|
|
59
|
+
- Consistent protocol-favoring rounding unless compounding or zero-rounding
|
|
60
|
+
|
|
61
|
+
## Lead promotion
|
|
62
|
+
|
|
63
|
+
Before finalizing leads, promote where warranted:
|
|
64
|
+
|
|
65
|
+
- **Cross-contract echo.** Same root cause confirmed as FINDING in one contract → promote in every contract where the identical pattern appears.
|
|
66
|
+
- **Multi-agent convergence.** 2+ agents flagged same area, lead was demoted (not rejected) → promote to FINDING at confidence 75.
|
|
67
|
+
- **Partial-path completion.** Only weakness is incomplete trace but path is reachable and unguarded → promote to FINDING at confidence 75, **description only — a deliberate exception to the threshold**. 75 clears the line, so this finding would otherwise carry a **Fix** block; it does not, because the trace it would fix was never completed. The other two promotions above take their **Fix** block normally.
|
|
68
|
+
|
|
69
|
+
## Leads
|
|
70
|
+
|
|
71
|
+
High-signal trails for manual investigation. No confidence score, no fix — title, code smells, and what remains unverified.
|
|
72
|
+
|
|
73
|
+
## Do Not Report
|
|
74
|
+
|
|
75
|
+
Linter/compiler issues, gas micro-opts, naming, NatSpec. Admin privileges by design. Missing events. Centralization without exploit path. Implausible preconditions (but fee-on-transfer, rebasing, blacklisting ARE plausible for contracts accepting arbitrary tokens).
|