styleproof 3.12.0 → 3.14.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
@@ -7,6 +7,33 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.14.0] - 2026-07-05
11
+
12
+ ### Added
13
+
14
+ - **The GitHub Action hard-gates on unacknowledged navigable removals, out of the box.**
15
+ A removed route / tab / menu-item — a feature going unreachable — is categorically not a
16
+ restyle, so it must not be waved through by the review-gate's "approve all changes" box.
17
+ The Action now reads the diff's machine-readable inventory verdict (3.13.0) and, as a
18
+ final step in **both** certify and review-gate modes, fails when
19
+ `inventory.unacknowledged > 0`, naming each removed affordance — unless the removal is
20
+ recorded (with a reason) in `styleproof.inventory.json`. Style diffs are unaffected
21
+ (they stay report-only / sign-off). On by default; set `"gateInventoryRemovals": false`
22
+ in `styleproof.config.json` to opt out. Covered by a new `action-dogfood` removal
23
+ scenario (base offers `/a` + `/b`, head drops `/b` → the Action fails).
24
+
25
+ ## [3.13.0] - 2026-07-05
26
+
27
+ ### Added
28
+
29
+ - **`styleproof-diff --json` now carries the inventory verdict.** The structured output
30
+ gained an `inventory` field alongside `coverage` and `determinism` — so all three
31
+ source-of-truth axes are machine-readable, matching the report's certification block.
32
+ Shape: `{ removed, added, unacknowledged, staleAcknowledgements }` (arrays of keys),
33
+ or `null` when no capture carried inventory. Previously the inventory removals were
34
+ printed to stdout but absent from `--json`, forcing a CI that wanted to hard-gate on a
35
+ dropped nav item to grep human prose. Now it can read `inventory.unacknowledged.length`.
36
+
10
37
  ## [3.12.0] - 2026-07-05
11
38
 
12
39
  ### Changed
@@ -306,7 +306,26 @@ const determinismFails = printDeterminismVerdict(determinismVerdict);
306
306
  if (jsonOut)
307
307
  fs.writeFileSync(
308
308
  jsonOut,
309
- JSON.stringify({ counts, surfaces, compared, coverage: coverageVerdict, determinism: determinismVerdict }, null, 2),
309
+ JSON.stringify(
310
+ {
311
+ counts,
312
+ surfaces,
313
+ compared,
314
+ coverage: coverageVerdict,
315
+ determinism: determinismVerdict,
316
+ // The inventory verdict, machine-readable — parallel to coverage/determinism and
317
+ // to the report's certification block. `null` when no capture carried inventory.
318
+ // `unacknowledged` is the gating set: a CI can hard-fail on `unacknowledged.length`.
319
+ inventory: inventoryAudit && {
320
+ removed: inventoryAudit.delta.removed.map((i) => i.key),
321
+ added: inventoryAudit.delta.added.map((i) => i.key),
322
+ unacknowledged: inventoryAudit.unexplained.map((i) => i.key),
323
+ staleAcknowledgements: inventoryAudit.staleAllowances,
324
+ },
325
+ },
326
+ null,
327
+ 2,
328
+ ),
310
329
  );
311
330
 
312
331
  const total = counts.dom + counts.style + counts.state;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "styleproof",
3
- "version": "3.12.0",
3
+ "version": "3.14.0",
4
4
  "description": "Catch every CSS change before it ships — review PRs and certify refactors by the browser's computed styles, not pixels. Works with any styling system.",
5
5
  "keywords": [
6
6
  "playwright",