coderifts 4.12.0 → 5.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coderifts",
3
- "version": "4.12.0",
3
+ "version": "5.0.0",
4
4
  "description": "Detect breaking API changes from the command line. Works locally or with the CodeRifts cloud API.",
5
5
  "author": "CodeRifts <hello@coderifts.com>",
6
6
  "license": "MIT",
@@ -45,7 +45,7 @@
45
45
  "test": "node --test test/*.test.js"
46
46
  },
47
47
  "dependencies": {
48
- "@coderifts/agent-guard": "^10.0.0",
48
+ "@coderifts/agent-guard": "^11.0.0",
49
49
  "chalk": "^4.1.2",
50
50
  "cli-table3": "^0.6.4",
51
51
  "commander": "^12.0.0",
@@ -15,13 +15,23 @@
15
15
  * 4.12.0: floor raised to 10 (ENFORCING_STRICT requires the execution chain — a strict
16
16
  * composition that built under 9.x refuses to construct under 10.x, so a CLI that documents or
17
17
  * scaffolds strict must not run against a guard with the older meaning).
18
+ * 4.13.0: floor raised to 11 (computeBundleFingerprint returned a WRONG digest in 10.x — it
19
+ * omitted the artifact count and the whole context block, so on identical inputs it produced
20
+ * sha256:1a0e7470… where the server produced sha256:049650f2…; 11.0.0 delegates to the single
21
+ * canonical crbundle.v1 preimage and matches byte for byte. COST MEASURED AS ZERO, the same way
22
+ * the 10-raise was: the CLI imports only deployGate, asVerifiedDeployReceiptView,
23
+ * DEPLOY_RECEIPT_VIEW_SPEC and matchGlob, none of which 11.0.0 touched, and the suite staged
24
+ * against 11.0.0 returned an identical 532/530/2 with a byte-identical failure set. The floor
25
+ * rises anyway, because a semantics floor is about what the CLI may RUN against, not about what
26
+ * it happens to import today — a fingerprint that disagrees with the server is exactly the class
27
+ * of difference this gate exists to refuse.)
18
28
  */
19
29
 
20
30
  const fs = require('fs');
21
31
  const path = require('path');
22
32
 
23
33
  /** Minimum acceptable major for @coderifts/agent-guard in THIS package (the CLI). */
24
- const MIN_GUARD_MAJOR = 10;
34
+ const MIN_GUARD_MAJOR = 11;
25
35
  const DEP = '@coderifts/agent-guard';
26
36
 
27
37
  /**
@@ -55,17 +65,42 @@ const CHECKOUTS = [
55
65
  /**
56
66
  * DELIBERATE, MEASURED, AND LOWER THAN THE CLI'S — recorded so it is a decision, not a default.
57
67
  *
58
- * 2026-08-26: bumping the root to ^10 breaks three merge-gate tests. gateDecision under 10.0.0
59
- * returns residuals: [] where the app expects 'required_check_app_not_bound'
60
- * (test/mergegate-webhook.test.js: 46/46 on 3.0.0, 3 failures on 10.0.0). The app's own comment
61
- * at webhook-integration.js:336-339 records why 3.x has been SAFE rather than merely unnoticed:
62
- * the app ANDs three conditions so a stale package can never fail-open.
68
+ * 2026-08-26: bumping the root to ^10 breaks three merge-gate tests
69
+ * (test/mergegate-webhook.test.js: 46/46 on 3.0.0, 43/46 on 10.x). The app's own comment at
70
+ * webhook-integration.js:336-339 records why 3.x has been SAFE rather than merely unnoticed:
71
+ * the app ANDs three conditions (protection_inescapable && change_set_rebound && app_bound) so
72
+ * a stale package can never fail-open. That AND is load-bearing — measured against 3.0.0,
73
+ * gateDecision claims inescapable_merge:true even when required_check_app_bound is false or
74
+ * absent; the published claim is correct only because the app re-derives it.
63
75
  *
64
- * So the floor is pinned at 3 to stop it drifting LOWER unnoticed, and raising it is a separate
65
- * round that must first reconcile the residual vocabulary. Raise this number in that round and
66
- * record the reason on the line below, in the style of the CLI history above.
76
+ * RE-MEASURED 2026-08-26 against 11.0.0, and TWO THINGS IN THE OLD NOTE WERE WRONG:
77
+ *
78
+ * 1. It said 10.0.0 "returns residuals: []". It does not. Given the correct input shape it
79
+ * returns ['required_check_app_not_bound'] / ['required_check_app_binding_unknown'] — the
80
+ * app's own vocabulary. The earlier reading passed protection.enforcement_state; the field
81
+ * the gate reads is protection.enforcement, so the gate saw no protection at all.
82
+ * 2. The real difference is PRECEDENCE, not absence. The guard emits exactly ONE residual and
83
+ * short-circuits on the enforcement gap, so where two gaps hold at once it reports
84
+ * 'admin_bypass_open' and the app expects 'required_check_app_binding_unknown'. The app's
85
+ * collectBindingResiduals emits EVERY residual that holds — its docstring says so: "the
86
+ * pure gate's published shape is a single honesty slot ... the second was suppressed".
87
+ * That is why the app duplicates rather than consumes, and it is the whole reconciliation.
88
+ *
89
+ * 11.0.0 vs 10.0.0: NO CHANGE. Residual output is byte-identical across all three app-binding
90
+ * cases, and 11.0.0 touched only computeBundleFingerprint, which this path does not import. So
91
+ * 11 makes the bump neither easier nor harder — the blocker is unchanged and the deferral still
92
+ * holds for exactly the reason above, not for a residual shape that moved.
93
+ *
94
+ * WHAT THE BUMP ROUND MUST DECIDE: whether the guard should emit all holding residuals (then
95
+ * the app consumes gateOut.residuals and collectBindingResiduals is deleted), or whether the
96
+ * single-slot shape is deliberate (then the app keeps its collector and the duplication is
97
+ * documented as intended rather than left looking accidental). Do not bump before that choice.
98
+ *
99
+ * So the floor is pinned at 3 to stop it drifting LOWER unnoticed. Raise this number in that
100
+ * round and record the reason on the line below, in the style of the CLI history above.
67
101
  */
68
- why: 'root pinned at 3 pending the gateDecision residual-vocabulary reconciliation (see comment).',
102
+ why: 'root pinned at 3 pending the gateDecision residual-PRECEDENCE reconciliation (see comment; '
103
+ + 're-measured against 11.0.0 — unchanged from 10.0.0).',
69
104
  },
70
105
  ];
71
106