Skip to content

fix(security): differential gate + immediate VEX so every CVE resolves - #88

Merged
ry-ops merged 1 commit into
mainfrom
feat/differential-gate-and-vex-residuals
Jun 27, 2026
Merged

fix(security): differential gate + immediate VEX so every CVE resolves#88
ry-ops merged 1 commit into
mainfrom
feat/differential-gate-and-vex-residuals

Conversation

@ry-ops

@ry-ops ry-ops commented Jun 27, 2026

Copy link
Copy Markdown
Owner

Why

git-steer stopped landing CVE fixes. Diagnosis: the automation was running fine, but the ADR-005 functional-integrity gate was holding good security fixes for reasons unrelated to the bump, so every repo with any pre-existing breakage froze after 3 NO-GO sweeps. This PR restores the simple contract:

If there's a fix, apply it. If there isn't, VEX it until one exists.

Evidence (from the frozen fleet)

Repo Fix itself Why it was wrongly held
commit-relay BUILD=PASS npm test β†’ test file missing on main too; SMOKE β†’ broken monorepo import on main too
DriveIQ valid bump gate's npm install hit a vite peer-dep conflict; never retried --legacy-peer-deps
qdrant-fabric, linux transitive dep bump worker is a no-op β†’ looped 3Γ— instead of VEX'ing

What changed (all in the shared remediation path β€” every caller benefits)

  1. Differential gate (run-gate.mjs + verify-functional-form.yml): gate the base branch too; a dimension is only NO-GO if it regresses (passed on base, fails on fix). Pre-existing failures are neutralized and reported as such. Genuine regressions still produce NO-GO (verified).
  2. --legacy-peer-deps fallback in the gate's npm install ladder (npm ci β†’ npm install β†’ npm install --legacy-peer-deps).
  3. Terminal disposition (escalate-remediate.mjs): a no-op residual gets VEX under_investigation on the first sweep; escalates to affected at the hard-stop threshold; lifts to fixed on clear. Nothing sits in limbo.
  4. Drop stale ry-ops/blog from dispatch-fixes.mjs (transferred to fabric-forge/blog, out of the managed fleet).

Testing

  • npm run build clean; npm test 42 passed / 3 skipped.
  • Synthetic gate checks: base-also-fails β†’ GO (excused); base-passes-fix-fails β†’ NO-GO (regression held).

πŸ€– Generated with Claude Code

git-steer stopped landing fixes because the ADR-005 gate held good security
fixes for reasons unrelated to the bump. This restores the simple contract:
if there's a fix, apply it; if there isn't, VEX it until one exists.

Three changes, all in the shared remediation path (every caller benefits):

1. Differential gate (run-gate.mjs + verify-functional-form.yml). The gate now
   checks the BASE branch too and only counts a dimension as NO-GO when it
   REGRESSES (passed on base, fails on fix). Pre-existing repo debt β€” a missing
   test file, a broken monorepo import, an already-red build β€” no longer holds a
   fix it didn't cause. (Unsticks commit-relay: BUILD passes, the held TEST/SMOKE
   were already failing on main.) Genuine regressions still produce NO-GO.

2. --legacy-peer-deps fallback in the gate's npm install. An ERESOLVE peer
   conflict is npm being strict, not the fix being unsafe. (Unsticks DriveIQ's
   vite/@vitejs/plugin-react peer conflict.)

3. Terminal disposition in escalate-remediate.mjs. A no-op fall-out (worker can't
   bump a transitive dep) now gets a VEX `under_investigation` on the FIRST sweep
   instead of looping to the hard-stop; the residual escalates to `affected` at
   threshold and lifts to `fixed` on clear. No CVE sits in limbo.

Also drop the stale ry-ops/blog entry from dispatch-fixes.mjs (transferred to
fabric-forge/blog, out of the managed fleet).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ry-ops
ry-ops merged commit 4fa7103 into main Jun 27, 2026
3 checks passed
@ry-ops
ry-ops deleted the feat/differential-gate-and-vex-residuals branch June 27, 2026 23:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant