Commit graph

102 commits

Author SHA1 Message Date
trvon
b8c997c732
fix(scan): report quarantined TUs as coverage gaps
Problem: a TU skipped because a prior run quarantined it was not analysed,
but coverage did not say so. The serial path dropped it from the attempted
set, so a scan whose only TU was quarantined was complete and exited 0; the
fan-out path saw no file_finished record and called it frontend-failed.

Fix: the shard runner counts every requested TU and records skipped ones
with gap reason `quarantined`; a worker emits a file_finished record with
that reason so the parent classifies it the same way. USAGE lists the reason.

Test: test_subprocess_fanout "[quarantine]" covers serial (was 2 attempted,
no gap) and fan-out (was frontend-failed). CLI probe: serial and fan-out
both exit 2 with a `quarantined` gap.
2026-09-24 21:41:42 -06:00
trvon
2945e59bc2
docs: trim the README and move the performance roadmap to docs/
The README listed 11 of fold's 17 detectors, never explained the
confidence tiers every finding carries, did not mention the new exit
code 2 / coverage reporting, and spent half its length on a
performance roadmap.

It now says what fold is, defines the five tiers (from
include/fold/report/finding.hpp, including concrete-witness and
latent), what "bounded" means after the loop-exit fix, a quick start,
output formats and exit codes (0 none, 1 any unsuppressed finding, 2
unwritable report or any unanalysed translation unit), and links. The
detector list defers to the complete table in docs/USAGE.md.

The performance section moves to docs/architecture/performance.md, with
one correction: the gold set was derived from fold's own reviewed output
and is matched by detector kind and file, so it catches drift rather
than measuring precision/recall independently. The lint pre-commit hook
note moves to BUILD.md.
2026-09-24 21:11:54 -06:00
trvon
c785a6acee
docs(positioning): drop claims the code and evidence do not support
Problem: docs/positioning.md claimed four confidence tiers (there are
five, including Latent) and defined Proved as any Z3 SAT, which
contradicts soundness.md's exact-model requirement. It claimed "fold
scans a 100k-LOC codebase in minutes" with no committed benchmark (the
audit measured 2 files in 5.9 s at 407 MB RSS). It described CBMC as
asking Z3/MathSAT (its default back end is SAT) and as scaling poorly
past a few thousand lines, without support. It claimed a scan-to-fuzz
loop "no other open-source analyzer covers" and "no commercial vendor
ships" (directed and hybrid fuzzers such as AFLGo and SAVIOR cover
related ground, and prior-art.md cites that line of work). It said most
analyzers "stop at SAT", ignoring the Clang Static Analyzer's Z3
refutation.

Fix: five tiers with Latent defined; Proved requires an exact bounded
model; the CBMC comparison describes the method and fold's real scope
(per-sink, mostly intraprocedural, unroll 5) instead of speed; the
uniqueness claims now describe the loop without exclusivity; CSA's Z3
refutation is acknowledged. The README is left for a separate docs pass.
2026-09-24 20:58:26 -06:00
trvon
f0fe006d6b
fix(docs,tests): correct the pre-push hook claim, a dead link, MCP cleanup
Problem: the README said setup enables "tracked ... OpenGrep pre-push
hooks", but only .githooks/pre-commit is tracked, so fresh clones get no
pre-push hook. docs/research/prior-art.md pointed to prior-art-full.md,
which has never been in the repository. test_mcp_stdio's TempDir
destructor called the throwing remove_all overload; a failure during
unwinding terminates the test binary and leaves .fold-mcp-test-*
directories behind.

Fix: the README names only the tracked pre-commit hook. The pre-push
hook is not committed: it runs `opengrep --config auto`, which needs the
network. The dead reference is removed. TempDir uses the error_code
remove_all overload. It stays under the working directory, because the
MCP server rejects paths outside its workspace root (moving it to
temp_directory_path broke three MCP tests).

Test: mcp_stdio passes.
2026-09-24 20:57:32 -06:00
trvon
c9811b7d41
fix(scan): report unanalyzed translation units and exit 2
Problem: a TU the front end could not parse left no trace. ClangTool::run's
status was discarded, TUs with compile errors were analyzed on a partial
AST and counted as done, and the isolated-worker path dropped TUs that
never produced an AST. A scan of only broken files printed no findings and
exited 0, the same as a clean scan. Separately, the scan logger wrote to
stdout, so any warning corrupted a SARIF/JSON report written to stdout.

Fix: every TU now yields an outcome (clean, compile-errors,
analysis-failed); workers carry it on their file_finished record, and the
fan-out parent adds timeout/crash/worker-exit for the TU a worker died on.
tuCoverage() turns the requested file list plus outcomes into a
ScanCoverage (requested TUs with no outcome are frontend-failed). SARIF
gets a run `invocations` entry (executionSuccessful, one
toolExecutionNotification per gap); findings JSON gets an additive
`coverage` object. A scan with any gap, or with nothing analyzed, exits 2
after writing its report. CLI diagnostics now go to stderr, as
docs/internal/cli-philosophy.md principle 12 requires. USAGE.md and
AGENTS.md document the coverage fields and the exit code.

Test: tests/unit/test_scan_coverage.cpp (classification, path spelling,
complete/untracked controls, merge, both writers, and unchanged output
without coverage); test_cli_paths "[coverage]" covers a clean TU (exit 0,
complete) and a TU with a missing include (exit 2, gap in JSON, SARIF on
stdout parseable with executionSuccessful=false). Before: both probe files
exited 0 with no coverage information. Full suite: 139/139.
2026-09-24 20:37:51 -06:00
trvon
425eeb0751
docs: record option-2 S0 result — candidate expansion is empty on fold/yams
Some checks failed
build / build-linux (push) Failing after 7m50s
build / build-macos (push) Has been cancelled
build / release (push) Has been cancelled
Measured (scratch, reverted): with the graph-fed cross-TU candidate
expansion disabled, finding fingerprints stay exact (fold 0fec78e5...,
yams 247523c5..., status ok) and securityGraphCandidateFunctions
returns an empty set (expanded=0) for these manifests. The 18.8s graph
build is pure overhead for the expansion path here. Remaining graph
consumer is summary priming; S0b tests whether its SCC-ordered eager
prepass can be dropped in favor of the lazy on-demand summary path.
2026-09-01 17:32:40 -06:00
trvon
94287522f8
docs: spec single-pass graph building (option 2) with seam map and slice plan 2026-09-01 17:24:55 -06:00
trvon
d6beaab635
docs: record single-pass graph-building decision (option 2) for portability
Some checks failed
build / build-linux (push) Failing after 7m53s
build / build-macos (push) Has been cancelled
build / release (push) Has been cancelled
README 'Performance architecture' documents the measurement-first,
gate-guarded optimization loop and the roadmap decision: collapse the
double per-TU parse into single-pass graph building over PCH/module
caching, chosen specifically to preserve portability. The decision
doc records the option-2 scoping: the graph->detector dependency map
(candidate expansion, summary priming, cross-TU property priming) and
the open memory-vs-parse tension to resolve before implementation.
2026-09-01 17:19:55 -06:00
trvon
118b745fea
docs(loop): mark in-pass contribution collection INVALIDATED (ordering dependency)
Iteration 12 of the fold optimization loop
(docs/research/optimization-loop-2026-07-30.md).

Implementation of the recorded design began (~7 files plumbed) and
collapsed on an ordering dependency: assembleProjectCallGraph runs
BEFORE the main TU pass because the TU pass consumes the graph
(graph_security_candidates cross-TU expansion; summary priming from
the call graph). In-pass collection cannot serve the same scan —
the TU pass needs the graph the contributions would feed. Reversing
the order breaks candidate expansion (finding fingerprints would
change), and keeping every TU AST alive across both passes is
infeasible (~1.4 GiB RSS for the fold self-scan).

All plumbing reverted; production byte-identical. The ~16.9s
no-index exhaustive build is the inherent cold-run price of
cross-TU facts; target closed.
2026-08-31 07:38:44 -06:00
trvon
1699e5618e
docs(loop): record iteration ledger + in-pass contribution collection design
Iteration 11 of the fold optimization loop
(docs/research/optimization-loop-2026-07-30.md).

Records the campaign iteration ledger (10 iterations, fold self-scan
wall 251.7s -> 86.2s, 66% reduction, fingerprints exact throughout)
and the completed design for the deferred in-pass graph contribution
collection (the no-index exhaustive call-graph build's ~16.9s
re-parse): expose buildContributionFromContext, accumulate
contributions in the main TU pass, feed prebuilt contributions to
assembleProjectCallGraph when they cover the shard's files and no
project index is open. Equivalence argument and worst-case fallback
preservation documented; implementation is the next slice.

No production code change.
2026-08-31 07:30:38 -06:00
trvon
c9a5e7390d
test(symbolic): guard summary recomputation stability; add optimization loop contract
Iteration 1 of the fold optimization loop
(docs/research/optimization-loop-2026-07-30.md, workflow-driven
measure->select->implement->validate->checkpoint).

Baseline measured (tests/benchmarks/runs/optimization-2026-07-30/):
- fold self-scan median 251.7s, peak RSS 1390.5 MiB; sql-injection
  detector 40.37% of analyze share (101.4s median) with 0 Z3 queries
- yams self-scan median 10.7s, peak RSS 489.9 MiB

Implement attempt: shared thread-local scratch Z3 context for
summarizeLeafFunctionSymbolically (stack samples showed Z3 ast_table
init from the ensureSymbolicSummary chain dominating walk time).
REJECTED by the new characterization test: Z3 hash-consing collapses
same-named parameters across functions and summary composition
silently degrades. Reverted; regression test retained plus rationale
comment at the reverted site.

Also documents: SummaryStore::lookupOrCompute returns pointers into
its internal map (invalidated by clear()); open finding on
load-sensitive summary recomputation under CPU saturation.

No production behavior change; fold:symbolic_summary 10/10 green,
focused suites green, git diff --check clean.
2026-08-30 19:39:26 -06:00
trvon
8ac9ddb175
docs: expand fold-sast skill; document call-graph decomposition + budgets
- skills/fold-sast: rename to skill-fold-sast and expand the scan/precision
  guidance for C++/Rust/Swift lanes
- docs/architecture: record call-graph phase decomposition and the
  optimization-loop TP/FP/TN/FN evidence policy
- docs/mcp-tools + README: update budget/per-query defaults (1800s/6000ms)
  and note the OpenGrep pre-push hook
2026-08-16 16:41:33 -06:00
trvon
86b2f14a43
feat(analysis): harden project-wide scans
- persist TU-owned graphs and guarded configuration evidence
- add closed-world production reachability classification
- calibrate detector precision and reviewed self-scan policy
- terminate poisoned workers instead of longjmp recovery
2026-07-30 18:18:04 -04:00
trvon
0f2e8ca6b6
docs: record quality convergence evidence 2026-07-29 20:47:10 -04:00
trvon
bcdcb3036b
feat(analysis): harden quality and solver pipelines 2026-07-29 20:46:51 -04:00
trvon
8d85829481
docs: document convergence contracts 2026-07-29 00:58:19 -04:00
trvon
ab262b2220
feat(quality): enforce evaluator policies 2026-07-28 14:09:12 -04:00
trvon
f37222d4fb
fix(scan): harden frontend analysis 2026-07-28 11:57:38 -04:00
trvon
f0ece0794a
feat(eval): add manifest project runner 2026-07-27 23:18:03 -04:00
trvon
2dcbdbc75d
feat: harden Fold quality guard
Preserve source, binary, and runtime evidence boundaries while making precision and performance regressions reproducible.

- decompose analysis orchestration into bounded modules
- add differential, metamorphic, organic, and Yams change-time gates
- fix detector, P-Code, fuzz sanitizer, and report identity precision
2026-07-13 15:05:35 -04:00
trvon
8d053f4727
feat: checkpoint. Bug fixes and good improvements 2026-07-10 09:59:49 -04:00
trvon
1914d8284e
feat: many improvements and bug fixes 2026-06-12 13:25:11 -04:00
trvon
50230c809b
checkpoint 2026-06-04 20:20:29 -04:00
trvon
374aa7475d
many good updates for binary and SAST / DAST scanning 2026-06-02 12:39:03 -04:00
trvon
c10b99961f
fix(binary): bound r2 security scans
- add r2 CLI timeouts and cap structural sweeps
- fix SQL return-source taint and base64 blob filtering
- document vendor lanes and Ghidra .sla runtime policy
2026-05-31 22:49:56 -04:00
trvon
5152d0c9f7
feat(binary): vendor Ghidra 12.1 decompiler + validate P-Code lifting (Phase 0-1)
Foundation for replacing fold's dead/abstract binary encoder with a real
SSA P-Code frontend. Verified root-cause gap: serializeBinaryIR() emits only
data-discovery nodes (sections/strings/imports/exports); the control-flow
BinaryExprKind values (BasicBlock/CallSite/...) are never constructed, so the
Z3-BB encoder's encodable filter is always empty and encodeBinaryBBs never
runs — hence 0 binary Z3 findings. The P-Code pipeline supersedes that path.

Phase 0 — docs/internal/ghidra-pcode-integration-research.md: P-Code opcode
core, the decompiler C++ embedding API (LoadImage/SleighArchitecture/Funcdata),
the CORE+DECCORE+SLEIGH source sets, no-bison finding, and pypcode as build
reference.

Phase 1 — vendored Ghidra decompiler at pinned commit (Ghidra_12.1_build,
7e89d94e34...) under third_party/ghidra-decompiler/ (cpp + AArch64 specs +
Apache-2.0 LICENSE + VENDOR.md + .gitignore for build artifacts). Validated by
hand on this clang-21/macOS toolchain:
  - full SSA engine (CORE+DECCORE+SLEIGH, 80 files incl. heritage/funcdata/
    action) compiles clean, -std=c++11 -O2, NO BFD, NO bison (generated
    parsers are committed upstream; ruleparse isn't in the lib set);
  - sleigh compiler builds; AArch64 .slaspec -> .sla compiles;
  - tools/pcode_dump.cpp (custom LoadImage, no BFD) lifts the real arm64
    sym._div_by_zero_direct to correct P-Code: `mov w9,#0 -> COPY(const 0)`,
    `sdiv -> INT_SDIV(w8,w9)` — divisor zero-ness explicit in the data flow,
    so the Phase-3 encoder proves div-by-zero trivially, multi-arch.

Not yet meson-wired (next step) and no fold-side IR/encoder yet (Phase 2-3);
this commit is the validated vendor + smoke tool.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 17:32:47 -04:00
trvon
dd98730988
docs: remaining loop-IR work + cross-frontend architecture finding
Record that rust_ir_encoder and binary_bb_encoder do not route through
SecurityWalker/unrollLoop and have no loop handling, so "cross-frontend
ir::Loop reuse" is gated on a shared clang-free loop-walk core rather than
being a standalone slice. Lay out the realistic sequencing (clang-free CFG
foundation -> rust/binary lowering -> recall-preserving while(1) acceleration)
and note no safe small gate-validatable slice exists short of starting the
foundation. Clang counted+affine summarization is complete.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 13:44:48 -04:00
trvon
b693d8a038
bench: tracked precision baseline + enforcing local drift gate
The old fp-baseline.json lived under gitignored bench/results/, so it had
no history and nothing compared against it — precision drift went unnoticed.

- Move the committed baseline to a tracked path (bench/fp-baseline.json)
  regenerated from the current build.
- Add `score_fp.py --gate`: diff per-detector P/R/F1 vs the baseline and
  exit non-zero on any drop beyond --tolerance (default 0.02).
- Add `--max-files-per-cwe` deterministic stride sampling so huge CWEs are
  tractable; restrict gold to the scanned subset so recall stays meaningful.
- Document the gate (local, not CI) in bench/README.md.
- docs/internal/loop-summarization-research.md: Workstream B research + the
  null-deref drift root-cause appendix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 18:04:16 -04:00
trvon
6348820f92
audit: binary scan timeout root cause — repeated aaa per session
- Each R2Session construction runs full auto-analysis
- 4-6 aaa runs on a single binary → 60-90s timeout
- Fix: share one R2Session across all extraction calls
- Progressive analysis levels: aa (quick), aaa (full), aaaa (experimental)
2026-05-30 00:26:15 -04:00
trvon
0d63dbbd7e
research+feat: interprocedural buffer-bound threading — pre-pass architecture
- SafetyObserver::seedInterproceduralContext() called before function walks
- OOBObserver override scans all call sites for ConstantArrayType args
- Seeds param_buffer_sizes_ from any caller, regardless of decl order
- Research doc covers Inferbo/ARCHER/FunFrog approaches and fold's infrastructure
2026-05-29 23:49:56 -04:00
trvon
95a5ddb462
audit: CTF binary detector gap analysis — 5 gaps, projected 7%→70%
- #1 fortified import _chk strip (+4 CWE-121, S effort)
- #2 binary format-string xref (+3 CWE-134, S effort)
- #3 hardcoded-string re-enable (+2 CWE-798, S effort)
- #4 BB encoder per-instruction granularity (+6 CWE-369/190/476, M)
- #5 binary UAF observer (+2 CWE-416, M)
2026-05-29 22:54:17 -04:00
trvon
eb85913f6e
eval: CTF loop 2 — 3.7%→7.4% detection, 2x improvement
- dangerous-import correctly flags gets() and system() imports
- Hardcoded-string FP fix too aggressive (drops real findings)
- CWE gaps: buffer overflow, format string, UAF, div-zero still missed
- Next: wire binary_bb_encoder into pipeline for Z3-proved findings
2026-05-29 21:30:38 -04:00
trvon
5a4d27d60e
audit: loop 2 priorities — top 5 by ROI across all backends
- #1: wire binary BB Z3 encoder into scan pipeline (binary 50%→70%)
- #2: Juliet benchmark scoring (standardized recall/precision)
- #3: Rust OSS benchmark formalization (ripgrep 49 findings)
- #4: binary BB encoder pipeline wiring
- #5: watch mode + CI/CD integration
2026-05-29 21:25:10 -04:00
trvon
8af924dd47
research: binary analysis tools — Ghidra P-code, angr, r2 levels
- Ghidra P-code: 25-op arch-neutral IR → BinaryIR design
- angr: symbolic path exploration → basic block to Z3
- r2 aaaa: function signature recovery → fix default params=3
- 6 recommended features ordered by effort/impact
2026-05-29 20:24:00 -04:00
trvon
f4e3d32fcb
audit: binary backend test coverage — 35% coverage, 8 failure points
- Only 5/15 functions tested; extractCalls/extractXrefs/pdbj untested
- CTF failures mapped to specific r2_backend.cpp code paths
- Top fix: flag dangerous imports + hardcoded strings (S effort, +12 findings)
- Full basic block analysis needed for div-by-zero/null-deref (L effort, +6)
2026-05-29 20:22:37 -04:00
trvon
d40707c6a7
design: BinaryIR + BinaryDetector pipeline v2
- BinaryExprKind enum (8 kinds): HardcodedString, CallSite, VtableEntry...
- 8 BinaryFindingKind values for binary-specific vulnerabilities
- Detector pipeline mirrors source architecture (standalone functions)
- Phase plan: 4 phases, target 3.7% → 40%+ detection
2026-05-29 20:22:02 -04:00
trvon
592a6b4acd
docs: fold runtime performance profile — Z3 is not the bottleneck
- Z3 solver <0.01% of wall time (74 queries, ~0ms)
- Real bottleneck: AST walkers + CFG traversal (~85%)
- Top optimization: TU pre-filter (skip files with no security ops)
- Bitwuzla multi-solver would not help — SMT queries are already fast
2026-05-29 14:05:03 -04:00
trvon
e9e23227cb
docs: fold expansion roadmap — 4 sprints, security + performance + utility
- Sprint 1: 4 syntactic detectors (deprecated API, weak crypto, format string, creds)
- Sprint 2: 3 Z3-powered (use-after-move, iterator invalidation, SQL injection)
- Sprint 3: Bitwuzla multi-solver, TU pre-filter, clone cache
- Sprint 4: watch mode, pre-commit hooks, GitHub Code Scanning SARIF
2026-05-29 13:20:34 -04:00
trvon
706c86013e
docs: CTF binary validation corpus — 7 challenges to test fold binary analysis
- picoCTF, CSAW, DEF CON, Flare-On, HackTheBox challenges
- Tests: string extraction, xrefs, heap UAF, ARM64 ABI, ObjC routing
- Gaps identified: packed binaries, fat Mach-O, PE IAT, encrypted strings
2026-05-29 13:19:39 -04:00
trvon
d7258c4021
docs: Z3 multi-solver portfolio research — Bitwuzla 5.1x faster on BV
- Bitwuzla BV solver is 5.1x faster than Z3 (SMT-COMP 2023)
- ESBMC pattern: dispatch to 6 solvers, race for first result
- Proposal: add --solver bitwuzla | z3 | portfolio-all flag
- Expected 2-5x speedup on fold's BV-64 queries
2026-05-29 10:10:53 -04:00
trvon
ec8492431c
docs: Semgrep C/C++ gap matrix — ~80 rules vs fold 11 detectors
- Banned functions: 15 rules, 0 fold detectors — largest gap
- Crypto misuse: 8 rules completely uncovered
- Phase 1: 9 syntactic detectors covering 30+ Semgrep rules
- What fold does better: Z3 proofs, CFG analysis, type-aware checking
2026-05-29 10:06:52 -04:00
trvon
a598e9dd96
docs: Facebook Infer gap matrix — ~30 checkers vs fold 10 detectors
- Concurrency: 7 Infer checkers, 0 in fold — biggest gap
- C++ lifetime: 4 Infer, 0 fold (dangling refs, ownership)
- Resource mgmt: file/socket leak missing from fold's memory-leak
- Performance: vector reallocation, loop invariants
2026-05-29 10:06:12 -04:00
trvon
5d81aa5b98
docs: CodeQL C/C++ gap matrix — ~200 queries vs fold 29 detectors
- Memory safety: 7/30 covered (7 new detectors added this session)
- Injection/taint: 1/25 covered — high-impact gap
- Phase 1: 8 syntactic detectors (deprecated APIs, format strings, weak crypto)
- Phase 2: 5 Z3-powered (path/command/SQL injection, tainted format, process)
- What fold does better: Z3-proved findings, semantic equivalence, binary scanning
2026-05-29 10:04:26 -04:00
trvon
27bb4d807f
docs: code quality detector opportunities — API misuse, exception safety, concurrency, deprecated APIs
- 12 detector ideas across 4 categories
- Phase 1 (S effort): deprecated APIs, throwing dtors, missing noexcept
- Phase 2 (M-L): use-after-move, iterator invalidation, lock inversion
- All phase 1 detectors are syntactic (RecursiveASTVisitor, no Z3 needed)
2026-05-29 10:03:25 -04:00
trvon
04642c46af
docs: rustc internals research for HIR/MIR analysis in fold-rust
- rustc_driver Callbacks, TyCtxt, HIR ExprKind, MIR BasicBlock/Rvalue
- TyKind type system: bit-width queries via LayoutS
- Borrow checker: BorrowKind, loan scopes, BorrowTracker usage
2026-05-28 20:09:14 -04:00
trvon
585ae4e4ab
docs: clang API research, multi-language IR patterns, Rust-Clang parity gap analysis
- clang-analysis-api-research.md: AST nodes, CFG, type system, constant folding
- multi-language-ir-patterns.md: CodeQL shared engine, Infer SIL, Kani MIR→Goto-C
- rust-clang-scanning-parity.md: 9-component comparison table, 8 priority fixes
2026-05-28 20:08:38 -04:00
trvon
18ce5a6050
docs: Swift/C++ ABI, fuzzing, IR, MIR research for multi-language pipeline
- Swift ABI: tagged pointers, garbage-input abort path, ObjC bridging
- C++ fuzz: libFuzzer dlopen coverage limits, AFL++ QEMU mode, vtable seeding
- Cross-language IR: CodeQL/Infer/Joern patterns, Swift SIL gaps in fold IR
- MIR verification: Kani/Prusti/Creusot approaches, BorrowTracker wiring
2026-05-28 10:28:41 -04:00
trvon
811aab5254
docs: Z3 symbolic encoder robustness audit (31 files, 7 fixes ranked by ROI)
- H1: &&/|| short-circuit not forked → 30-40% null-deref FP reduction
- H3: Rust IR incomplete (Member, Conditional, signedness, path)
- 7 recommended fixes ordered by effort/impact
- Precision gaps mapped per detector family
2026-05-27 21:15:38 -04:00
trvon
56550a93a1
feat: symex-fuzz landscape, SWAN SIL parser, Juliet expansion, FP scoring
- docs/internal/symex-fuzz-landscape.md: 11 tools across 6 categories
- tools/fold-swift/swan_sil_parser: 75 SIL operator kinds, JSON converter
- bench/juliet/expansion/: 118-CWE catalog, gold generator, runner
- bench/score_fp.py: precision/recall/F1 per detector
2026-05-27 18:00:06 -04:00
trvon
9bdcd9f7a0
feat: audit fixes — complexity, CLI UX, MCP parity, binary fuzz
- CompositeSafetyObserver replaced with macros (composite_observer.hpp)
- tool_registry split per category
- Renamed --null-deref-nullable-allocations to --nullable-allocations
- --input-type hidden from help, fold-swift --help added
- MCP: fold.scan_rust, fold.scan_swift, backend filter on get_findings
- Binary fuzz: fold fuzz prep --binary <mach-o>, --compile-db optional
2026-05-27 16:29:39 -04:00