§§1–3 (detector accuracy, score validity, threats to validity) are Phase 2 (deferred, not currently active). §4 (agility-layer JMH benchmarks) is independent of migration validation and can run in Phase 1. See doc 03 §8.
This is the step-4 playbook: what gets measured, how it is analyzed, and what each outcome would mean.
- Ground truth: hand-labeled vulnerable-usage sites in each selected case study. Labeling happens from raw source (imports/call sites), before reading auditor output for that codebase; labels join to findings on rule IDs + file:line.
- TP = flagged site that genuinely requires change for a PQC migration. FP = flagged site needing no change (e.g., dead code path, test fixture, with the judgment logged). FN = labeled site the auditor missed (found by manual sweep of
java.security/javax.crypto/BC imports). - Report: precision / recall / F1 overall, per rule family (JCA entry point, TLS, JOSE, concrete-type), and per confidence level. Confidence calibration matters: HIGH findings should have near-1.0 precision; LOW findings are allowed to be noisy (they exist to drive F5 credit, not alarms).
- Single-rater mitigation: a second labeling pass after a ≥2-week washout on a 20% sample; report self-agreement (a poor-man's κ). Honest limitation, stated as such.
- Data: per-module predicted score S (frozen v0, doc 03) vs. measured effort vector (doc 04): files touched, LOC changed, breakages, test failures, minutes (Track A only).
- Statistics:
- Primary: Spearman ρ between S and each effort metric (rank-based, right for small n, non-normal effort data). Secondary: Kendall τ.
- Comparative claim (H1): paired bootstrap over modules (≥10k resamples) for Δρ = ρ(S, effort) − ρ(B0, effort), with 95% CI. H1 supported iff CI excludes 0 in favor of S.
- Size control: partial Spearman of S vs effort controlling module LOC; plus ρ(LOC, effort) reported as the trivial second baseline. S must survive both.
- Target n: ≥5 codebases, ≥30 modules pooled. Report per-codebase and pooled (pooled with codebase as a stratum in the bootstrap).
- Key figure: scatter of predicted S vs. measured effort (one point per module, shape = codebase, color = track), with ρ, τ, and the S-vs-B0 comparison inset.
- Interpretation grid (decided before seeing data):
| Outcome | Inference |
|---|---|
| ρ(S) high, Δρ > 0 | H1 supported: fragility signals predict cost beyond counting, so static triage is viable; the report's hotspot ranking is trustworthy |
| ρ(S) high, Δρ ≈ 0 | Counting is enough; fragility indicators add no signal (linters suffice: still useful, deflationary) |
| ρ(S) low everywhere | Static signals insufficient; migration cost is dominated by factors invisible to static analysis (negative result, publishable, redirects the field to dynamic/organizational measures) |
| ρ high on Track A, low on Track B (or vice versa) | Effort metrics or simulated-migration realism are suspect. Investigate before claiming anything |
Single rater (scorer = migrator on Track A, mitigated by pre-registration + Track B); simulated migrations may miss organizational cost; case-study selection bias (mitigated: selection uses wave-1 counts only); BC-specific API shapes may not generalize to other providers; small n (mitigated: module-level pooling, rank statistics, CIs not p-values).
Matrix (JMH, benchmarks module):
| Axis | Values |
|---|---|
| Operation | KEM keygen / encaps / decaps; sign / verify |
| Algorithm | RSA-2048, RSA-3072, ECDSA-P256, Ed25519, X25519(ECDH), ML-KEM-768, ML-DSA-65, SLH-DSA-SHA2-128s, hybrid X25519+ML-KEM-768, dual-sig ECDSA+ML-DSA-65 |
| Path | direct Bouncy Castle; via agility-provider (policy resolved); via agility-provider incl. capability negotiation |
Headline number: relative overhead (agility − direct)/direct per operation, i.e. the standard objection ("your abstraction is too slow") answered with data. Negotiation cost reported separately (expected ns–µs; it's a table intersection).
Scenarios: peer classical-only / hybrid-capable / PQC-only / mismatch → fallback vs fail-closed policy paths (each exercises a different negotiation branch).
JMH configuration: @Fork(3), @Warmup(iterations = 5), @Measurement(iterations = 5), Throughput + SampleTime (p50/p99) modes, -prof gc for allocation/op, Blackhole discipline, parameterized @State for algorithm/mode. SLH-DSA gets reduced iteration counts (slow by design; note it).
JVM-specific observables (the unstudied-territory claim from doc 01): allocation pressure and GC behavior from multi-KB signatures/keyshares vs. 64-byte classical equivalents; steady-state vs. cold JIT differences across modes. Fixed JDK 21 + pinned BC version; hardware documented in the report.
Interpretation: overhead <5% → agility layer adoption case holds; sizes dominating latency/allocations → quantified JVM-specific finding either way.
- Per-codebase readiness report (JSON + markdown, doc 03 schema).
- The correlation figure (scatter + ρ/τ + Δρ inset), the paper's key result.
- Precision/recall/F1 table per rule family and confidence level.
- Benchmark tables/plots: overhead %, latency distributions, alloc/op, payload sizes.
- Threats-to-validity section drafted from §3 above.