From 635d32793953f33365aa3f8eab2c9b4394094758 Mon Sep 17 00:00:00 2001 From: Aaron Trowbridge Date: Tue, 15 Sep 2026 08:51:45 -0400 Subject: [PATCH] test(lint): hardware-loop fence-scope pin follows the deliberate Intonato re-scope (#1193) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fleet-gated regression pinned the hardware-loop skill's fence scope to Strumento, but the live skill's fence resolves to Intonato. Adjudication from history: the skill moved correctly, the pin was the drifted side. - The pin (and the 'ten' claim inventory) date to 504277c5 (#1002), when the skill's fence read `using Strumento # reexports Intonato ...`. - The 2026-09-10 freshness audit (armonissima#88, vault 10a93ce) deliberately updated the fence to `using Intonato` — the old `using` was the stale v0.2 reexport idiom: the seam inverted in Strumento v0.2, so Intonato (the chassis) now reexports the substrate (Strumento), not vice versa. - Inventory fallout: the old `Intonato` claim was minted by the old fence comment; the extracted claim set is nine now. Intonato coverage lives in the fence-scope pin and the reexport-chain inversion test. Red→green verified on a fleet machine (live checkouts mounted): the focused test failed with `expected [ 'Intonato' ] to deeply equal [ 'Strumento' ]`, then the full skill_drift_lint file passed 68/68. Stays mount-gated (CI-blind by design). --- .../test/scores/skill_drift_lint.test.ts | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/extension/test/scores/skill_drift_lint.test.ts b/packages/extension/test/scores/skill_drift_lint.test.ts index 48d9996d1..49e9302b6 100644 --- a/packages/extension/test/scores/skill_drift_lint.test.ts +++ b/packages/extension/test/scores/skill_drift_lint.test.ts @@ -866,21 +866,32 @@ describe("real fleet regressions (amicode#1002 lint false positives)", () => { } }); - it("the live hardware-loop regression: all ten fence claims VERIFY against the real fleet packages when scoped to Strumento", () => { + it("the live hardware-loop regression: all nine live claims VERIFY against the real fleet packages when scoped to Intonato", () => { const root = realPackagesRoot(); const skill = path.join(os.homedir(), ".amico", "vaults", "armonissima", "skills", "hardware-loop", "SKILL.md"); if (!root || !fs.existsSync(skill)) return; // CI — mount-gated skip - const ten = [ + // amicode#1193 adjudication: the fence-scope re-scope was DELIBERATE — the + // 2026-09-10 freshness audit (armonissima#88, vault 10a93ce) updated the + // skill's fence from the stale v0.2 idiom `using Strumento # reexports + // Intonato` to `using Intonato` (the seam inverted in Strumento v0.2: + // Intonato, the chassis, now reexports the substrate Strumento, not vice + // versa — same inversion the reexport-chain test below pins). The skill + // moved correctly; this test's pin was the drifted side. + // Inventory fallout of that re-scope: the old `Intonato` claim was minted + // by the OLD fence comment (`# reexports Intonato`) — the new fence comment + // doesn't name a symbol, so the extracted claim set is nine, not ten. The + // Intonato reference itself is now covered by the fence-scope pin below. + const nine = [ "MockSoc", "StrumentoBackend", "QickChannelMap", "QickGenChannel", "StrumentoExperiment", - "MeasurementModel", "PulseTuningProblem", "Intonato", "QuantumSystem", "PiPulseReference", + "MeasurementModel", "PulseTuningProblem", "QuantumSystem", "PiPulseReference", ]; const claims = extractClaims(fs.readFileSync(skill, "utf8")); - // the fence scope is Strumento now (comment-stripped) — pin that first + // the fence scope is Intonato (comment-stripped) — pin that first const mockSoc = claims.find((c) => c.text === "MockSoc")!; - expect(mockSoc.packages).toEqual(["Strumento"]); - const results = checkClaims(claims.filter((c) => c.kind === "symbol" && ten.includes(c.text)), [root]); + expect(mockSoc.packages).toEqual(["Intonato"]); + const results = checkClaims(claims.filter((c) => c.kind === "symbol" && nine.includes(c.text)), [root]); const verifiedTexts = new Set(results.filter((r) => r.verdict === "VERIFIED").map((r) => r.claim.text)); - for (const text of ten) { + for (const text of nine) { expect(verifiedTexts, `${text} must VERIFY (was a #1002 false positive)`).toContain(text); } for (const r of results) {