diff --git a/CHANGELOG.md b/CHANGELOG.md index e71b3e0..91da3df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixed - Stop classifying package source entrypoints as missing when the published package provides built runtime entrypoints, and collapse SDK alias findings into a single compat-gap row. +- Treat compat-gap issues as reconciled contract coverage for their own compatibility record. ## 0.3.10 - 2026-05-03 diff --git a/src/contract-coverage.js b/src/contract-coverage.js index 1806623..fbf54f4 100644 --- a/src/contract-coverage.js +++ b/src/contract-coverage.js @@ -157,10 +157,15 @@ function requireCompatRecordReconciliation(report, errors) { .filter((finding) => finding.code === "missing-compat-record") .map((finding) => `${finding.fixture}:${finding.compatRecord}`), ); + const compatGapRecords = new Set( + report.issues + .filter((issue) => issue.issueClass === "compat-gap" && issue.compatRecord) + .map((issue) => `${issue.fixture}:${issue.compatRecord}`), + ); for (const finding of [...report.warnings, ...report.suggestions].filter((item) => item.compatRecord)) { const key = `${finding.fixture}:${finding.compatRecord}`; - if (!presentRecords.has(key) && !missingRecords.has(key)) { + if (!presentRecords.has(key) && !missingRecords.has(key) && !compatGapRecords.has(key)) { errors.push(`${finding.fixture}: compat record ${finding.compatRecord} was not reconciled`); } } diff --git a/test/contract-coverage.test.js b/test/contract-coverage.test.js index d83b598..7effc2f 100644 --- a/test/contract-coverage.test.js +++ b/test/contract-coverage.test.js @@ -165,4 +165,20 @@ test("contract coverage requires compat record reconciliation evidence", () => { compatRecord: "fixture.provider-auth-env-vars", }); assert.deepEqual(validateContractCoverage(report), []); + + report.logs = []; + report.issues.push({ + id: "PLUGIN-COMPAT", + fixture: "fixture", + severity: "P1", + issueClass: "compat-gap", + code: "provider-auth-env-vars", + evidence: ["fixture"], + compatRecord: "fixture.provider-auth-env-vars", + }); + report.contractProbes.push({ + fixture: "fixture", + id: "compat.provider-auth-env-vars:fixture", + }); + assert.deepEqual(validateContractCoverage(report), []); });