mjolnir-qa 2.0.2 → 3.0.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/CHANGELOG.md CHANGED
@@ -11,6 +11,143 @@ once shipped, so this file is the record of what changed between versions.
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ### Changed
15
+
16
+ - **Advisory-first CI adoption** — `mjolnir ci install` and the root
17
+ GitHub Action now default to non-blocking findings and non-blocking partial
18
+ scans. Blocking remains explicit through `--gate error`, `--gate warning`,
19
+ or `fail-on`.
20
+ - Suppression counts now report matched findings, not configured entries;
21
+ `suppression-gate` evaluates all-tier pre-suppression findings and enforces
22
+ total-count limits.
23
+ - Zero-finding reports no longer claim the suite is clean or that CI is green.
24
+
25
+ ### Added
26
+
27
+ - **Zero-touch PR framework** — Conventional Commits enforcement via
28
+ `commitlint` + `.husky/commit-msg` (scope is mandatory; WIP/fixup/squash
29
+ commits are rejected before they reach the object store); pinned-seed
30
+ property tests (`vitest.property.config.ts`, `tests/scope/property-invariants.spec.ts`
31
+ with a shared `SEED` constant so failures are reproducible); the
32
+ `merge-verify` CI job that runs the full gate on the **merge result**,
33
+ not the PR head, so a green PR that merges into a red `main` is visible
34
+ before it ships; and `scripts/check-ci-local-parity.mjs`, which keeps
35
+ `ci.yml`, `merge-verify.yml` and the local gate exercising the same
36
+ command list. All additive — no frozen surface changed.
37
+
38
+ ## [3.0.0] — 2026-09-24
39
+
40
+ ### Breaking changes
41
+
42
+ - Trust and execution boundaries are now explicit and bounded. JavaScript/local-rule execution requires the plugin trust gate; output writers reject symlink/traversal targets; JSON, file, cache, and runtime inputs have size budgets; CLI/MCP durations are finite.
43
+ - Saved report and machine-contract consumers now receive completion, scope, evidence, and verdict fields. Incomplete, L0/zero-evidence, and partial states cannot be presented as `WORTHY`.
44
+ - Privileged PR publication is split into a read-only scan job and an artifact-only publisher with commit-bound, paginated `mjolnir-report:v2` upserts.
45
+
46
+ ### Added
47
+
48
+ - Enterprise threat-model and data-flow artifacts with a strict validator, claim registry with implementation/test/authority/expiry evidence, and a candidate trust manifest/readiness gate.
49
+ - Canonical completion derivation, bounded cache/artifact persistence, run-identity tree binding, same-process concurrency evidence, and deterministic source-scoped self-scan/replay gates.
50
+ - Public-output redaction/escaping across trust reports, job summaries, dashboards, triage, and Playwright reports; atomic artifact writes and release-mode retention controls.
51
+
52
+ ### Fixed
53
+
54
+ - Cross-platform CI matrix coverage for Node 22/24 and Linux/macOS/Windows, including clean-checkout candidate-manifest hashing and deterministic self-scans.
55
+ - Partial/degraded scope accounting now distinguishes intentionally excluded fixtures from missed test-like files and propagates reasons through CLI, reports, and machine contracts.
56
+ - Generated blast-radius, demo/video, site, and release evidence is refreshed from the current tree.
57
+
58
+ ### Migration
59
+
60
+ - Install `mjolnir-qa@3.0.0` with Node.js `>=22.18`.
61
+ - Use the `@v3` consumer tag after the stable release; use an exact `v3.0.0` tag for reproducible enforcement.
62
+ - Review the new `--enable-plugins` gate, finite `--max-duration` budget, report completion fields, and strict artifact path requirements.
63
+
64
+ ### Certification boundary
65
+
66
+ This release is software-complete and locally certified for the declared engineering gates. Trust certification remains `NOT_CERTIFIED` until protected holdout, real-world, platform/consumer, and human authority evidence is supplied.
67
+
68
+ ## [2.1.0] — 2026-09-24
69
+
70
+ ### Added
71
+
72
+ - Added seven milestone commands to the public CLI and root help:
73
+ - `mjolnir ci-integrity` validates GitHub/GitLab/Jenkins scan gates and reports non-blocking or disabled candidates.
74
+ - `mjolnir framework-maturity` reports bounded F0–F5 maturity while preserving human calibration authority.
75
+ - `mjolnir suppression-gate` evaluates reasons, expiry, allowlists, total counts, and matched-finding mass suppression.
76
+ - `mjolnir cross-file` reports duplicate test names, shared imports, circular dependencies, and amplified findings.
77
+ - `mjolnir contract-verify` validates machine-contract fields and binds persisted contracts to a fresh scan.
78
+ - `mjolnir trust-trend` persists, deduplicates, and compares trust snapshots.
79
+ - `mjolnir evidence-graph` builds provenance-bearing evidence graphs and supports file/rule queries.
80
+ - Added a zero-touch PR framework: Conventional Commit enforcement, seeded property tests, merge-result verification, and local/CI command-parity checks.
81
+ - Added dedicated, discoverable property and fuzz suites. Fuzz cases use fixed seeds; property tests remain isolated from default coverage collection.
82
+ - Added CI integrity, suppression, contract, provenance, cross-file, and trust regression suites covering malformed input, partial scans, inactive suppressions, and platform-stable exit behavior.
83
+ - Added stable-only `v1`/`v2` action-tag maintenance. RC tags never move stable consumer tags.
84
+ - Added pinned current corpus revisions and local fixture tree revisions. Baseline counts were not rewritten; corpus drift remains an explicit audit failure.
85
+
86
+ ### Fixed
87
+
88
+ - Fixed false-green milestone engines:
89
+ - machine-contract verification now compares every contract projection, including optional provenance and forensic verdicts;
90
+ - trust snapshots use caller-provided timestamps instead of an embedded wall clock;
91
+ - suppression mass uses actual matched pre-suppression findings and active suppressions;
92
+ - evidence provenance is derived from real file contents;
93
+ - cross-file dependency analysis uses the requested target root;
94
+ - framework maturity uses the supported F5 ceiling.
95
+ - Fixed persisted contract handling: documents use strict runtime schema validation and are verified against a fresh scan rather than self-attesting.
96
+ - Fixed zero-finding and partial-scan reporting so incomplete or unclassified analysis cannot render as a clean, proven, or merge-ready suite.
97
+ - Fixed CI workflow audit parsing to fail closed for dynamic conditions, `continue-on-error`, negated commands, multi-pipe status masking, inactive GitLab rules, advisory `after_script` commands, and missing blocking scans.
98
+ - Fixed the coverage job/ratchet mismatch: merge verification now generates the coverage summary it enforces.
99
+ - Fixed stress determinism by normalizing both analysis and machine-contract duration fields, running real concurrent scans, and making the 10k workflow validate JSON even when findings are advisory.
100
+ - Fixed property/fuzz discovery and workflow trigger/name so required PR checks are actually produced.
101
+ - Fixed root help, command registry, README, and release documentation drift for the new command surface.
102
+
103
+ ### Security
104
+
105
+ - The composite Action and generated CI surfaces use exact released versions, immutable action references, least-privilege permissions, and explicit exit semantics.
106
+ - The composite Action defaults to blocking on findings and partial scans; advisory behavior requires an explicit opt-out.
107
+ - Release publication is isolated from `main`, uses audited artifacts, npm OIDC trusted publishing with provenance, npm 11.5.1+, a `next` RC dist-tag, and verified GitHub prerelease assets.
108
+ - Pull-request shell inputs and workflow-derived values are passed through environment variables instead of direct `${{ }}` interpolation.
109
+ - Machine-contract, suppression-policy, roadmap, and persisted-artifact validation now reject malformed and adversarial inputs rather than fabricating or trusting them.
110
+ - Main-branch deletion and the complete required PR check matrix are enforced by repository ruleset `01`. The repository is solo-maintained, so the owner explicitly chose not to require a second approving review.
111
+
112
+ ### Performance
113
+
114
+ - Centralized deterministic CLI timing normalization and expanded replay, soak, and concurrent stress coverage.
115
+ - Added bounded corpus scans, exact source revisions, and fail-closed baseline provenance checks.
116
+ - Added practical pipeline/command regression tests without changing the frozen 96% branch ratchet.
117
+
118
+ ### Testing
119
+
120
+ - Full instrumented release gate: 408 test files, 10,351 passing tests, one expected failure documenting the outstanding orphan corpus baseline, and five intentional skips.
121
+ - Coverage ratchet at release: 98.58% statements, 96.00% branches, 99.38% functions, and 98.84% lines.
122
+ - Focused gates green: build, lint, typecheck, certification, property, fuzz, stress/soak/concurrency, release/workflow contract tests, pack audit, brand, site, and local/CI parity.
123
+ - Historical failed runs remain historical evidence; they are not retroactively changed.
124
+
125
+ ### Changed
126
+
127
+ - `ci-local` now runs one complete instrumented suite plus property/fuzz/ratchet/audit/brand/site/parity gates instead of silently omitting release checks.
128
+ - Release promotion is explicit and branch/tag based; merging the version PR does not itself publish npm.
129
+ - Suppression counts and governance outputs distinguish configured, active, expired, and matched findings.
130
+ - Rule IDs remain immutable across the 2.x line. Existing detector contracts,
131
+ including `QA-PW-001`, retain their identity while framework maturity and
132
+ evidence quality improve around them.
133
+ - The CLI command registry is shared by help, dispatch, and CI-integrity classification.
134
+
135
+ ### Breaking changes
136
+
137
+ - The package now requires Node.js `>=22.18`.
138
+ - Direct composite-Action consumers now get blocking defaults for findings and partial scans unless they explicitly opt out.
139
+ - Generated CI installation remains opt-in/advisory for first adoption; use `mjolnir ci install --gate error` when an enforcing install is required.
140
+ - Stable release publication no longer occurs automatically from `main`; use the protected release branch and release workflow.
141
+ - The historical `v2.0.3` tag is retained unchanged. This release does not move, delete, or republish that tag.
142
+
143
+ ### Migration
144
+
145
+ 1. Install or invoke `mjolnir-qa@2.1.0` with Node.js 22.18 or newer.
146
+ 2. Replace floating Action versions with `@v2` or the exact `v2.1.0` tag when reproducible enforcement is required.
147
+ 3. Review suppression expiry/allowlist policy before enabling `suppression-gate`; existing entries are policy data, not proof of human validation.
148
+ 4. Run the seven new commands in report mode first and review their JSON before making them release gates.
149
+ 5. Adjudicate remaining corpus count/orphan drift and human/design-partner validation separately; this release does not claim those are closed.
150
+
14
151
  ## [2.0.2] — 2026-09-22
15
152
 
16
153
  ### Fixed
package/README.md CHANGED
@@ -150,6 +150,17 @@ FP risk: low (author estimate)
150
150
  Languages: yaml
151
151
  Frameworks: github-actions, azure-pipelines
152
152
 
153
+ COPY-READY REVIEW COMMENT
154
+ Advisory finding — this does not block merging: Job `security-scan` runs a
155
+ verification gate under `continue-on-error: true`.
156
+ Why it weakens verification: This job can fail every day and CI will still
157
+ show green. The checkmark on this workflow cannot be trusted.
158
+ Confidence: high, evidence E2, tier quarantine; measured FP 11% (19 verdicts).
159
+ Suggested fix: Remove continue-on-error, or scope it to individual
160
+ non-blocking steps only.
161
+ Verify with: mjolnir --scope changed, then mjolnir explain QA-CI-001 if the
162
+ finding still appears.
163
+
153
164
  WHAT WAS FOUND (real detector output, not a mockup)
154
165
  Job `security-scan` runs a verification gate under `continue-on-error: true`.
155
166
 
@@ -197,30 +208,26 @@ Three steps to trust your release pipeline:
197
208
  2. **Block in CI** — `npx mjolnir-qa@latest --scope changed` — scans only changed lines, blocks PRs with error findings
198
209
  3. **Fix and re-verify** — `mjolnir fix` applies safe auto-fixes, then re-scans to prove each one landed
199
210
 
200
- Add it to your pipeline so it gates releases on error findings:
211
+ Install the advisory PR workflow first, so existing trust debt cannot break
212
+ CI on day one:
201
213
 
202
214
  ```bash
203
- npx mjolnir-qa@latest --scope changed --blocking error
215
+ mjolnir ci install
204
216
  ```
205
217
 
206
- `mjolnir ci install` writes the GitHub Actions workflow with a blocking gate (error severity), pinned to this version:
218
+ After reviewing the findings or baselining existing debt, opt into blocking:
207
219
 
208
220
  ```bash
209
221
  mjolnir ci install --gate error
210
222
  ```
211
223
 
212
- Run advisory mode only when you want to preview findings without blocking:
213
-
214
- ```bash
215
- mjolnir ci install --gate advisory
216
- ```
217
-
218
224
  | Command | What it does |
219
225
  | ----------------------------------- | ----------------------------------------------- |
220
226
  | `mjolnir` | Trust Report: verdict, confidence, next action |
221
227
  | `mjolnir --scope changed` | Only what your branch introduced (CI form) |
222
228
  | `mjolnir --blocking error` | Exit 1 on error findings — gate releases |
223
- | `mjolnir ci install --gate error` | Write the blocking PR workflow |
229
+ | `mjolnir ci install` | Write the advisory PR workflow (default) |
230
+ | `mjolnir ci install --gate error` | Opt into the blocking PR workflow |
224
231
  | `mjolnir business-case` | ROI estimate: projected savings per finding |
225
232
  | `mjolnir explain QA-CI-001` | What, why and fix, plus the measured FP rate |
226
233
  | `mjolnir why src/a.spec.ts:42` | Why this exact line was flagged. Never gates. |
@@ -236,30 +243,37 @@ mjolnir ci install --gate advisory
236
243
 
237
244
  <br />
238
245
 
239
- | Command | What it does |
240
- | ----------------------------------- | ---------------------------------------------------- |
241
- | `mjolnir --classic` | The pre-Trust-Report score banner render |
242
- | `mjolnir explain verdict` | Why the saved scan's verdict is what it is |
243
- | `mjolnir triage ./test-results/` | Guided triage. Every row ends in a next action. |
244
- | `mjolnir pw-report ./test-results/` | Playwright run summary: retries, flakes, slowest |
245
- | `mjolnir doctor:playwright` | Playwright-only deep scan plus Selector Health Score |
246
- | `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed |
247
- | `mjolnir baseline` / `diff` | Snapshot findings, then report only new or worse |
248
- | `mjolnir impact --since <ref>` | What a commit introduced and resolved |
249
- | `mjolnir summary` | CI annotations and a step summary from a report |
250
- | `mjolnir pr-comment` | A scoped PR comment, as Markdown |
251
- | `mjolnir debt` | Test-debt register with a cost model |
252
- | `mjolnir handover` | Onboarding map of the suite for a new QA engineer |
253
- | `mjolnir init` | Detect frameworks, print a setup checklist |
254
- | `mjolnir suppressions` | List suppressed findings, for governance |
255
- | `mjolnir rules --unmeasured` | The rules running on assumption, not measurement |
256
- | `mjolnir rules --md` | Full rule catalog (JSON or Markdown) |
257
- | `mjolnir doctor` | Self-audit of Mjölnir's own rule base |
258
- | `mjolnir create-rule <ID>` | Scaffold a new rule and its fixtures |
259
- | `mjolnir stats` | Local all-time counters of fixes seen |
260
- | `mjolnir badge` | shields.io endpoint JSON and snippet |
261
- | `mjolnir --cache` | Incremental re-scans via a local verdict cache |
262
- | `mjolnir --format mermaid` | Test-architecture diagram for a PR comment |
246
+ | Command | What it does |
247
+ | ----------------------------------- | ----------------------------------------------------- |
248
+ | `mjolnir --classic` | The pre-Trust-Report score banner render |
249
+ | `mjolnir explain verdict` | Why the saved scan's verdict is what it is |
250
+ | `mjolnir triage ./test-results/` | Guided triage. Every row ends in a next action. |
251
+ | `mjolnir pw-report ./test-results/` | Playwright run summary: retries, flakes, slowest |
252
+ | `mjolnir doctor:playwright` | Playwright-only deep scan plus Selector Health Score |
253
+ | `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed |
254
+ | `mjolnir baseline` / `diff` | Snapshot findings, then report only new or worse |
255
+ | `mjolnir impact --since <ref>` | What a commit introduced and resolved |
256
+ | `mjolnir summary` | CI annotations and a step summary from a report |
257
+ | `mjolnir pr-comment` | A scoped PR comment, as Markdown |
258
+ | `mjolnir debt` | Test-debt register with a cost model |
259
+ | `mjolnir handover` | Onboarding map of the suite for a new QA engineer |
260
+ | `mjolnir init` | Detect frameworks, print a setup checklist |
261
+ | `mjolnir suppressions` | List suppressed findings, for governance |
262
+ | `mjolnir ci-integrity` | Verify blocking CI scans and suppression policy |
263
+ | `mjolnir framework-maturity` | Inspect bounded maturity with human calibration |
264
+ | `mjolnir suppression-gate` | Enforce expiry, allowlist, and mass-suppression rules |
265
+ | `mjolnir cross-file` | Analyze duplicate, shared, and circular test signals |
266
+ | `mjolnir contract-verify` | Verify a persisted machine contract artifact |
267
+ | `mjolnir trust-trend` | Persist and compare trust snapshots over time |
268
+ | `mjolnir evidence-graph` | Build or query the verification evidence graph |
269
+ | `mjolnir rules --unmeasured` | The rules running on assumption, not measurement |
270
+ | `mjolnir rules --md` | Full rule catalog (JSON or Markdown) |
271
+ | `mjolnir doctor` | Self-audit of Mjölnir's own rule base |
272
+ | `mjolnir create-rule <ID>` | Scaffold a new rule and its fixtures |
273
+ | `mjolnir stats` | Local all-time counters of fixes seen |
274
+ | `mjolnir badge` | shields.io endpoint JSON and snippet |
275
+ | `mjolnir --cache` | Incremental re-scans via a local verdict cache |
276
+ | `mjolnir --format mermaid` | Test-architecture diagram for a PR comment |
263
277
 
264
278
  `mjolnir help <command>` prints usage, examples and the next step for any
265
279
  of them.
@@ -556,22 +570,20 @@ propagate, always-success steps, reports consumed but never generated, and
556
570
  gates skipped on the events that should block. Each finding names the job,
557
571
  the step and the line, and carries its own evidence level.
558
572
 
559
- Generate the PR workflow with a blocking gate (error severity) — this is the
560
- default for a reason: findings that survive your pipeline survive your release.
573
+ Generate an advisory PR workflow first. It reports findings without blocking
574
+ and is pinned to this version, so adopting it cannot change gate semantics:
561
575
 
562
576
  ```bash
563
- mjolnir ci install --gate error
577
+ mjolnir ci install
564
578
  ```
565
579
 
566
- The gate is pinned to this version — a new release must not change your gate
567
- semantics without a commit of yours. Switch to advisory only when you want
568
- to preview findings without blocking:
580
+ After reviewing existing debt, opt into an enforcing gate:
569
581
 
570
582
  ```bash
571
- mjolnir ci install --gate advisory
583
+ mjolnir ci install --gate error
572
584
  ```
573
585
 
574
- In your existing workflow, pin the action and gate on error severity:
586
+ In your existing workflow, pin the action and explicitly opt into an error gate:
575
587
 
576
588
  ```yaml
577
589
  - uses: Sergey-Bar/Mjolnir@4a588bc62d517bc85fc44c0eae64c6587d3bf70b0
@@ -634,11 +646,11 @@ SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
634
646
  **AI writes the fix. Mjölnir verifies it.** The proof comes from the
635
647
  re-scan, never from the agent's own report of success.
636
648
 
637
- | Command | What the agent gets |
638
- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
639
- | `mjolnir mcp` | An [MCP](https://modelcontextprotocol.io) server over stdio. `scan`, `explain` and `diff` become callable tools. |
640
- | `mjolnir handoff` | A saved `--json` report becomes a deterministic Markdown plan: what was detected, the evidence boundary per finding, what must **not** change, how to verify. |
641
- | `mjolnir install` | Writes into the agent surfaces your repo already has (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`) so the agent re-scans before it claims it is done. |
649
+ | Command | What the agent gets |
650
+ | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
651
+ | `mjolnir mcp` | An [MCP](https://modelcontextprotocol.io) server over stdio. `scan`, `explain`, `diff`, `verify`, `forensics`, `triage`, and `pw-report` are read-only callable tools. |
652
+ | `mjolnir handoff` | A saved `--json` report becomes a deterministic Markdown plan: what was detected, the evidence boundary per finding, what must **not** change, how to verify. |
653
+ | `mjolnir install` | Writes into the agent surfaces your repo already has (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`) so the agent re-scans before it claims it is done. |
642
654
 
643
655
  Add it to a client that ships its own CLI:
644
656
 
package/dist/cli.d.mts CHANGED
@@ -325,12 +325,15 @@ interface ScanResult {
325
325
  * truncation actually happened — absence means the scan is whole.
326
326
  */
327
327
  truncationReasons?: string[];
328
+ /** Canonical completion reasons, including scope and parser degradation. */
329
+ reasons?: string[];
328
330
  /**
329
331
  * Rule executions that threw and were swallowed by crash isolation
330
332
  * (audit R-9). 0 means no rule silently failed; absence means the
331
333
  * producer predates the counter.
332
334
  */
333
335
  rulesCrashed?: number;
336
+ parseFallbacks?: number;
334
337
  };
335
338
  /**
336
339
  * Scoring model version stamped into the result (ENGINE-001). Allows
@@ -378,6 +381,7 @@ interface ScanResult {
378
381
  trustModelVersion?: string;
379
382
  scoringModelVersion?: string;
380
383
  frameworkSupportMatrixVersion?: string;
384
+ commit?: string;
381
385
  };
382
386
  /**
383
387
  * Evidence Graph (R4c): the chain-law links (VERDICT ← EVIDENCE ←
@@ -956,9 +960,9 @@ interface ScanContext {
956
960
  maxFiles: number;
957
961
  /** R4c Scope Integrity: counted matcher exclusions (optional — adapters
958
962
  * whose discovery walks sharedWalk pass this through to the counters). */
959
- onIgnored?: () => void;
963
+ onIgnored?: (path: string) => void;
960
964
  /** R4c Scope Integrity: counted files no adapter claims (optional). */
961
- onUnrecognized?: () => void;
965
+ onUnrecognized?: (path: string) => void;
962
966
  /**
963
967
  * Called when a rule throws on a file (audit R-9): crash isolation
964
968
  * stays silent by default, but the scan counts it and `--debug`
@@ -1226,6 +1230,8 @@ interface ScanHooks {
1226
1230
  * never on the stdout machine contracts.
1227
1231
  */
1228
1232
  onGateNotice?: (notice: string) => void;
1233
+ onTestFilesDiscovered?: (files: readonly string[]) => void;
1234
+ onPreSuppressionFindings?: (findings: readonly Finding[]) => void;
1229
1235
  }
1230
1236
  /**
1231
1237
  * Workspace fallback for targets with no discoverable project root
@@ -1289,7 +1295,9 @@ interface FileAnalysisResult {
1289
1295
  testDeclarationCount: number;
1290
1296
  rulesPartial: boolean;
1291
1297
  parseFailed: number;
1298
+ parseFallbacks: number;
1292
1299
  scanned: number;
1300
+ analyzed: number;
1293
1301
  }
1294
1302
  declare function runFileAnalysisPhase(findings: Finding[], testFiles: string[], workspace: Workspace, activeRules: UniversalRule[], hooks: ScanHooks, cache: ScanCache, rulesDigest: string, deadline: number, truncationReasons: Set<string>, declarationsByFile: Map<string, number>, fileProvenance: Array<{
1295
1303
  path: string;
@@ -1304,6 +1312,7 @@ interface PostScanResult {
1304
1312
  suppressionCount: number;
1305
1313
  frameworks: ReturnType<typeof detectFrameworks>;
1306
1314
  runtimeReportPath: string | undefined;
1315
+ runtimeIncomplete: boolean;
1307
1316
  /** Aggregate forensic classifications from the ingested runtime report. */
1308
1317
  forensicVerdicts: ForensicVerdictSummary | undefined;
1309
1318
  config: ReturnType<typeof loadConfig>["config"];
@@ -1329,7 +1338,9 @@ interface AssembleScanResultInput {
1329
1338
  scopeIgnored: number;
1330
1339
  scopeUnrecognized: number;
1331
1340
  parseFailed: number;
1341
+ parseFallbacks?: number;
1332
1342
  scanned: number;
1343
+ analyzed?: number;
1333
1344
  testFiles: string[];
1334
1345
  workspace: Workspace;
1335
1346
  scanRoot: Workspace;
@@ -1348,6 +1359,7 @@ interface AssembleScanResultInput {
1348
1359
  suppressionCount: number;
1349
1360
  frameworks: ReturnType<typeof detectFrameworks>;
1350
1361
  runtimeReportPath: string | undefined;
1362
+ runtimeIncomplete?: boolean;
1351
1363
  forensicVerdicts: ForensicVerdictSummary | undefined;
1352
1364
  config: ReturnType<typeof loadConfig>["config"];
1353
1365
  fileProvenance: Array<{
@@ -1381,7 +1393,7 @@ declare function runScan$1(args: CliArgs, hooks?: ScanHooks): Promise<ScanResult
1381
1393
  * scripts/sync-sarif-version.cjs and guarded by the version-consistency
1382
1394
  * spec. cli.ts re-exports this as CLI_VERSION.
1383
1395
  */
1384
- declare const ENGINE_VERSION = "2.0.2";
1396
+ declare const ENGINE_VERSION = "3.0.0";
1385
1397
  //#endregion
1386
1398
  //#region src/cli-io.d.ts
1387
1399
  /**
@@ -1623,7 +1635,7 @@ export declare function runAnalyzeCommand(argv: string[], io: {
1623
1635
  export declare function runCiAdapterCommand(argv: string[], io: {
1624
1636
  out: Output;
1625
1637
  err: Output;
1626
- }): Promise<number>;
1638
+ }): number;
1627
1639
  //#endregion
1628
1640
  //#region src/commands/dashboard.d.ts
1629
1641
  export declare function runDashboardCommand(argv: string[], io: {
@@ -1643,6 +1655,36 @@ export declare function runMaturityCommand(argv: string[], io: {
1643
1655
  err: Output;
1644
1656
  }): number;
1645
1657
  //#endregion
1658
+ //#region src/commands/milestone.d.ts
1659
+ export declare function runFrameworkMaturityCommand(argv: string[], io?: {
1660
+ out: Output;
1661
+ err: Output;
1662
+ }): number;
1663
+ export declare function runSuppressionGateCommand(argv: string[], io?: {
1664
+ out: Output;
1665
+ err: Output;
1666
+ }): Promise<number>;
1667
+ export declare function runCrossFileCommand(argv: string[], io?: {
1668
+ out: Output;
1669
+ err: Output;
1670
+ }): Promise<number>;
1671
+ export declare function runContractVerifyCommand(argv: string[], io?: {
1672
+ out: Output;
1673
+ err: Output;
1674
+ }): Promise<number>;
1675
+ export declare function runTrustTrendCommand(argv: string[], io?: {
1676
+ out: Output;
1677
+ err: Output;
1678
+ }): Promise<number>;
1679
+ export declare function runEvidenceGraphCommand(argv: string[], io?: {
1680
+ out: Output;
1681
+ err: Output;
1682
+ }): Promise<number>;
1683
+ export declare function runCIIntegrityCommand(argv: string[], io?: {
1684
+ out: Output;
1685
+ err: Output;
1686
+ }): Promise<number>;
1687
+ //#endregion
1646
1688
  //#region src/cli.d.ts
1647
1689
  export declare const runScan: typeof runScan$1, buildUniversalRules: typeof buildUniversalRules$1, fallbackWorkspace: typeof fallbackWorkspace$1, pathMatchesGlob: typeof pathMatchesGlob$1, isValidFindingRecord: typeof isValidFindingRecord$1, discoverAndParseRuntimeReport: typeof discoverAndParseRuntimeReport$1, KNOWN_RULE_IDS: ReadonlySet<string>, OVERLAP_META_BY_RULE_ID: ReadonlyMap<string, OverlapMeta>, EVIDENCE_OVERRIDES: ReadonlyMap<string, string>, SUITE_INVALIDATING_RULE_IDS: ReadonlySet<string>;
1648
1690
  /** A usage-error detail: the offending token, when one exists. */
@@ -1652,6 +1694,8 @@ export interface UsageErrorDetail {
1652
1694
  /** The flag whose value was rejected (`--tone` for `--tone loud`). */
1653
1695
  flag?: string | undefined;
1654
1696
  }
1697
+ export declare const DEFAULT_MAX_DURATION_MS = 600000;
1698
+ export declare const MAX_DURATION_MS = 3600000;
1655
1699
  export declare function parseArgs(argv: string[], onError?: (detail: UsageErrorDetail) => void): CliArgs | null;
1656
1700
  /** Hand-rolled Levenshtein distance (plan M2: no new dependencies). */
1657
1701
  export declare function levenshtein(a: string, b: string): number;
@@ -1695,7 +1739,7 @@ export declare function runSuppressions(io?: {
1695
1739
  out: Output;
1696
1740
  err?: Output;
1697
1741
  }): number;
1698
- export declare function printUsage(print: (s: string) => void): void;
1742
+ export declare function printUsage(print: (s: string) => void, width?: number): void;
1699
1743
  export declare function main(argv?: string[], io?: {
1700
1744
  out: Output;
1701
1745
  err: Output;