|
136 | 136 | "Covers all languages in hyperpolymath ecosystem" |
137 | 137 | "20 weak point categories (up from ~5)" |
138 | 138 | "Per-file language detection with family-specific patterns" |
139 | | - "Cross-language analysis possible via kanren engine"))) |
| 139 | + "Cross-language analysis possible via kanren engine")) |
| 140 | + |
| 141 | + (adr |
| 142 | + (id "ADR-011") |
| 143 | + (date "2026-03-01") |
| 144 | + (status "accepted") |
| 145 | + (title "Assemblyline batch scanning with rayon parallelism and BLAKE3 fingerprinting") |
| 146 | + (context "Need to scan 100+ repos efficiently; sequential scanning too slow") |
| 147 | + (decision "Use rayon for parallel repo scanning, BLAKE3 for source fingerprinting to enable incremental rescans") |
| 148 | + (consequences |
| 149 | + "17.7x speedup (141 repos in 39.9s vs ~705s sequential)" |
| 150 | + "BLAKE3 fingerprint infrastructure for future delta scanning" |
| 151 | + "Sorted output: riskiest repos first" |
| 152 | + "JSON aggregate report with per-repo breakdowns")) |
| 153 | + |
| 154 | + (adr |
| 155 | + (id "ADR-012") |
| 156 | + (date "2026-03-01") |
| 157 | + (status "accepted") |
| 158 | + (title "SARIF output format for standardised security reporting") |
| 159 | + (context "GitHub Security tab requires SARIF for code scanning integration") |
| 160 | + (decision "Implement SARIF 2.1.0 output via --output-format sarif") |
| 161 | + (consequences |
| 162 | + "GitHub Security tab integration via codeql-action/upload-sarif" |
| 163 | + "Standard format consumed by multiple security tools" |
| 164 | + "Rules deduplicated by WeakPointCategory")) |
| 165 | + |
| 166 | + (adr |
| 167 | + (id "ADR-013") |
| 168 | + (date "2026-03-01") |
| 169 | + (status "accepted") |
| 170 | + (title "Cryptographic attestation chain (intent/evidence/seal)") |
| 171 | + (context "Need to prove scans are genuine and untampered for trust chain") |
| 172 | + (decision "Three-phase model: intent (pre-commit), evidence (rolling hash), seal (post-bind)") |
| 173 | + (consequences |
| 174 | + "Scans are cryptographically bound to inputs and outputs" |
| 175 | + "Optional Ed25519 signing via --features signing" |
| 176 | + "A2ML envelope wraps attestation for transport" |
| 177 | + "Diagnostics checks signing health")) |
| 178 | + |
| 179 | + (adr |
| 180 | + (id "ADR-014") |
| 181 | + (date "2026-03-01") |
| 182 | + (status "accepted") |
| 183 | + (title "i18n support using ISO 639-1 (10-language catalog)") |
| 184 | + (context "Potential for non-English-speaking users; internationalisation should be built in early") |
| 185 | + (decision "Compile-time safe catalog with t() and t_or_key() lookups, 10 languages") |
| 186 | + (consequences |
| 187 | + "All user-facing strings translatable" |
| 188 | + "Doc-tested examples ensure catalog stays valid" |
| 189 | + "ISO 639-1 validation for language codes")) |
| 190 | + |
| 191 | + (adr |
| 192 | + (id "ADR-015") |
| 193 | + (date "2026-03-01") |
| 194 | + (status "accepted") |
| 195 | + (title "Notification pipeline (markdown-first, critical-only filtering)") |
| 196 | + (context "Assemblyline produces aggregate reports; need human-readable summaries and actionable alerts") |
| 197 | + (decision "notify subcommand generates markdown with severity breakdown, optional critical-only filter, optional GitHub issue creation") |
| 198 | + (consequences |
| 199 | + "Markdown output works in GitHub, email, Slack, etc." |
| 200 | + "--critical-only reduces noise to actionable items only" |
| 201 | + "GitHub issue creation automates remediation workflow")) |
| 202 | + |
| 203 | + (adr |
| 204 | + (id "ADR-016") |
| 205 | + (date "2026-03-01") |
| 206 | + (status "accepted") |
| 207 | + (title "Manifest-first framework detection (fixes false positives)") |
| 208 | + (context "Source-level substring matching caused self-referential false positives (analyzer detecting its own patterns)") |
| 209 | + (decision "Primary detection from dependency manifests (Cargo.toml, mix.exs, package.json, etc.); Rust excluded from source scanning entirely") |
| 210 | + (consequences |
| 211 | + "Eliminates self-referential false positives" |
| 212 | + "Cargo.toml detection is authoritative for Rust" |
| 213 | + "Source scanning kept for BEAM, Go, Ruby, Python, JS only" |
| 214 | + "~8% overall FP rate (down from higher)")) |
| 215 | + |
| 216 | + (adr |
| 217 | + (id "ADR-017") |
| 218 | + (date "2026-03-01") |
| 219 | + (status "accepted") |
| 220 | + (title "Machine-verifiable readiness tests (CRG grades D/C/B)") |
| 221 | + (context "Need automated evidence for Component Readiness Grading") |
| 222 | + (decision "tests/readiness.rs with grade-prefixed test names; justfile recipes for summary output") |
| 223 | + (consequences |
| 224 | + "CRG grades derivable from test results" |
| 225 | + "D (Alpha): component runs without crashing" |
| 226 | + "C (Beta): correct output on representative input" |
| 227 | + "B (RC): edge cases and multi-language support" |
| 228 | + "18 tests across 3 grades, automated via just readiness-summary"))) |
140 | 229 |
|
141 | 230 | (development-practices |
142 | 231 | (practice |
|
150 | 239 | (description "All features must have tests") |
151 | 240 | (rationale "Untested code is untrusted code") |
152 | 241 | (target "80% code coverage") |
153 | | - (current "30 tests: 16 unit + 11 analyzer + 3 integration")) |
| 242 | + (current "269 tests: unit, integration, analyzer, readiness (CRG D/C/B), SARIF, PanLL, report, assemblyline, pattern")) |
154 | 243 |
|
155 | 244 | (practice |
156 | 245 | (name "RSR compliance") |
|
168 | 257 | (rationale "Predictable releases, clear breaking changes") |
169 | 258 | (policy |
170 | 259 | "1.x = stable foundation, naming finalised" |
171 | | - "2.x = major feature expansion (logic engine, 47 langs)" |
| 260 | + "2.x = major feature expansion (logic engine, 47 langs, batch scanning, attestation)" |
172 | 261 | "3.0 = public release (crates.io)")) |
173 | 262 |
|
174 | 263 | (practice |
|
184 | 273 | (name "Eat your own dogfood") |
185 | 274 | (description "Run panic-attack on panic-attack itself") |
186 | 275 | (rationale "Find bugs, validate thresholds, prove usefulness") |
187 | | - (status "active: self-scan shows 3 weak points"))) |
| 276 | + (status "active: self-scan shows 30 findings, ~8% false positive rate"))) |
188 | 277 |
|
189 | 278 | (design-rationale |
190 | 279 | (rationale |
|
214 | 303 | (current "47 languages: BEAM, ML, Lisp, Functional, Proof, Logic, Systems, Config, Scripting, NextGen DSLs") |
215 | 304 | (benefit "Cross-language vulnerability detection via kanren engine")) |
216 | 305 |
|
| 306 | + (rationale |
| 307 | + (aspect "Manifest-first framework detection") |
| 308 | + (reasoning "Source-level substring matching causes self-referential false positives when the analyzer scans its own code") |
| 309 | + (decision "Use dependency manifests (Cargo.toml, mix.exs, etc.) as primary signal; exclude Rust from source scanning") |
| 310 | + (benefit "Eliminates FPs from string literals containing detection patterns")) |
| 311 | + |
| 312 | + (rationale |
| 313 | + (aspect "Cryptographic attestation") |
| 314 | + (reasoning "Prove scans are genuine and untampered for CI/CD trust chains") |
| 315 | + (components "intent.rs (pre-commit), evidence.rs (rolling hash), seal.rs (post-bind), chain.rs (orchestration), envelope.rs (A2ML wrapper)") |
| 316 | + (benefit "Scans can be verified by echidnabot or other proof verifiers")) |
| 317 | + |
217 | 318 | (rationale |
218 | 319 | (aspect "CLI + library") |
219 | 320 | (reasoning "Useful standalone and as integration component") |
220 | | - (benefit "src/lib.rs enables testing, hypatia integration, verisimdb pipeline"))) |
| 321 | + (benefit "src/lib.rs enables testing, hypatia integration, verisimdb pipeline, panicbot subprocess invocation"))) |
221 | 322 |
|
222 | 323 | (cross-cutting-concerns |
223 | 324 | (concern |
|
227 | 328 |
|
228 | 329 | (concern |
229 | 330 | (name "Performance") |
230 | | - (approach "Reasonable defaults, search strategy optimisation via kanren") |
231 | | - (current "Single-threaded file analysis with risk-weighted prioritisation") |
232 | | - (future "rayon for parallel assail analysis")) |
| 331 | + (approach "Rayon parallelism for batch scanning, search strategy optimisation via kanren") |
| 332 | + (current "Parallel assemblyline scanning (17.7x speedup); single-threaded per-file analysis with risk-weighted prioritisation") |
| 333 | + (future "Incremental analysis via BLAKE3 delta fingerprinting")) |
233 | 334 |
|
234 | 335 | (concern |
235 | 336 | (name "Security") |
236 | | - (approach "cargo-audit in CI, SBOM generation, self-testing") |
| 337 | + (approach "cargo-audit in CI, SBOM generation, self-testing, attestation chain") |
237 | 338 | (policy "No unsafe code in panic-attack itself except when required for FFI")) |
238 | 339 |
|
239 | 340 | (concern |
|
246 | 347 | (name "Extensibility") |
247 | 348 | (approach "Pattern library, kanren rule system, pluggable analyzers") |
248 | 349 | (current "miniKanren rules for taint, cross-language, and strategy") |
249 | | - (future "User-definable rules, plugin system"))) |
| 350 | + (future "User-definable rules, plugin system, context-fact FP suppression"))) |
250 | 351 |
|
251 | 352 | (metadata |
252 | 353 | (created "2026-02-07") |
253 | | - (updated "2026-02-08") |
254 | | - (maintainer "Jonathan D.A. Jewell <jonathan.jewell@open.ac.uk>") |
| 354 | + (updated "2026-03-01") |
| 355 | + (maintainer "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>") |
255 | 356 | (license "PMPL-1.0-or-later"))) |
0 commit comments