Skip to content

Promote to main: GT-677 — an approved waiver now suppresses on every shipped path - #499

Merged
beyondnetPeru merged 5 commits into
mainfrom
develop
Aug 15, 2026
Merged

Promote to main: GT-677 — an approved waiver now suppresses on every shipped path#499
beyondnetPeru merged 5 commits into
mainfrom
develop

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

Promotion of developmain. Carries the GT-677 fix (product code in four packages) and its board closure.

What changes in behaviour

evaluateDriftGate implemented complete waiver suppression behind an optional waivers?: IWaiverStore and all three production call sites omitted it, so evolith waiver approve wrote a durable record no evaluation ever read. After this promotion:

before after
evaluate --format drift with an approved waiver blockingFailures 95 · frozen 0 · waiverRef undefined 94 · frozen 1 · waiverRef W-9, "Waived findings" renders W-9@v1 + expiry
every blocking finding waived exit 2 exit 0
waiver request from a foreign cwd wrote the store next to the caller writes <workspace>/.evolith/waivers.json

Two contract changes worth knowing before this reaches main:

  1. A waiver can now take a pipeline from exit 2 to exit 0. That is the point of the row, and also the risk if a waiver is approved carelessly — approval remains a human act through evolith waiver approve, and every suppression is named in the PR comment with its waiverRef, version and expiry.
  2. --waivers <relative-path> that does not exist is now a hard error (exit 1) instead of silence. Any script that was passing a wrong path was silently getting an empty store; it will now fail loudly and name both the requested and the resolved path.

Why the fix is larger than three call sites

--evidence never touched the drift gate, so wiring only the gate would have left the row's own reproduction unchanged; one shared mechanism now serves both. The writer anchored on process.cwd() while a reader anchored on the workspace — the exact symptom, reintroduced, while looking correct in review. Nothing printed the fingerprint waiver request --fingerprint needs. A mistyped fingerprint was a silent no-op. MCP passed no codeowners while its comment claimed owner enrichment.

A defect in the fix itself, found by adversarially verifying it, is closed here too: a relative --waivers path resolved against the current directory and a missing file was read as an empty store — blocking 95 frozen 0, suppressing nothing while reporting success.

Evidence

The negatives are the deliverable, because the green path already passed while the product suppressed nothing. isWaiverActive → return true turns the four negatives red; removing waivers: from either CLI call site, the evidence emitter or the MCP tool turns the round-trip, contract and MCP suites red; the doc-claim test was observed red against an ad hoc store and green once restored. Each mutation was reverted.

Not claimed: MCP suppression is real but not observable in the tool response (it reaches the Tracker deposit); --format json|text|sarif exit codes are unchanged; lint is unchanged, not clean.

Verification

All 33 checks on #498 passed (3 skipped). Suites: core-domain 157/1861 · infra-providers 19/167 · cli 105/1476 · cli e2e 18/133 · mcp-server 63/570 · contracts 6/113 · test:contract 3/47. Guards: 08 (685 gaps, 637 closure records) · 04 · 01 · 41 · 42 · 43 · 46 at a fixed point · 47 · 54.

Board: GT-677 → DONE, counters 655 / 685 done · 2 in progress · 18 pending · 10 deferred.

🤖 Generated with Claude Code

beyondnetPeru and others added 5 commits August 14, 2026 20:12
…ed path

GT-677. `evaluateDriftGate` implemented complete waiver suppression behind an
optional `waivers?: IWaiverStore`, and all three production call sites omitted
it, so `evolith waiver approve` wrote a durable, versioned, state-machine-correct
record that no evaluation ever read.

Measured before, on a temp workspace: `blockingFailures 95 · frozen 0 · waiverRef
undefined`, no "Waived findings" section, and `waiver request` run from a foreign
cwd wrote the store next to the CALLER instead of next to the workspace. After:
`95 -> 94 · frozen 1 · waiverRef W-9`, the section renders `W-9@v1` with its
expiry, and a workspace whose blocking findings are all waived exits 0.

The fix is larger than the three call sites, and each addition was measured
rather than assumed:

- `--evidence` never touched the drift gate, so wiring only the gate would have
  left the board's own reproduction unchanged. `emitEvaluationEvidence` now takes
  the same store through one shared mechanism, `freezeWaivedViolations`, so the
  PR comment and the manifest cannot disagree inside one run.
- The writer anchored on `process.cwd()` and a reader anchored on the workspace
  reproduces the exact symptom while looking correct in review. Both now resolve
  through `resolveWaiverStorePath`, anchored on the workspace.
- Nothing printed the fingerprint `waiver request --fingerprint` requires, so the
  flow was unusable by hand even once wired. Citations now carry `[fp <hash>]` and
  the blocked comment prints the waive command.
- A stale or mistyped fingerprint was a silent no-op -- the very failure this row
  records. Active waivers matching no finding are now reported as unmatched.
- MCP passed no `codeowners` while its own comment claimed owner enrichment; one
  shared loader now serves both surfaces.

A defect found by adversarial verification OF THIS FIX is closed here too: an
explicit `--waivers <relative-path>` resolved against the current directory,
found nothing, and `FileWaiverStore` read a missing file as an EMPTY store --
`blocking 95 frozen 0`, suppressing nothing while reporting success. Readers now
use `openWaiverStoreForRead`, which fails loudly and names both the requested and
the resolved path; the DEFAULT path stays exempt, because a workspace with no
waivers is the normal state, not a mistake. Writers keep the creating opener.

Tests are the negatives, because the green path already passed while the product
suppressed nothing: requested-but-unapproved, rejected, expired and
fingerprint-mismatch each assert non-suppression, and mutating `isWaiverActive`
to `return true` turns them red. Removing `waivers:` from either CLI call site,
from the evidence emitter or from the MCP tool turns the round-trip, contract and
MCP suites red. The doc-claim test was observed red against an ad hoc
`new FileWaiverStore(...)` at the MCP call site and green again once restored.

Suites: core-domain 157/1861, infra-providers 19/167, cli 105/1476, cli e2e
18/133, mcp 63/570, contracts 6/113, test:contract 3/47 -- all green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…suppression

# Conflicts:
#	reference/core/control-center/gaps/gap-tracking.es.md
#	reference/core/control-center/gaps/gap-tracking.md
… after GT-677

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(waiver): make an approved waiver actually suppress on every shipped path (GT-677)
@beyondnetPeru
beyondnetPeru requested a review from a team as a code owner August 15, 2026 02:34
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions

Copy link
Copy Markdown

📊 Bilingual Coverage Impact

PR Changes

  • Paired EN/ES files modified: 3
  • New EN files needing ES translation: 1

Repository Coverage

Metric Value
Total EN files 527
Total ES files 501
Paired files 0
Coverage 0%

⚠️ Action required: 1 new EN file(s) added without ES counterparts.

To create skeletons:

node .harness/scripts/generate-es-skeleton.mjs <file.md>

Generated by GitHub Actions

@beyondnetPeru
beyondnetPeru merged commit ed7a591 into main Aug 15, 2026
73 checks passed
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