test(W7c): ship-apple-gate matches its gates on meaning, not capitals

W7c (t06 #19). One test file.

Removed assertion groups:
- "A genuine blocker may require a safety or named documentation-risk
  decision" and "routine interactions and blocking decisions above" sentence
  pins. Invariant: routine release authorization never waives a blocking
  safety/docs decision. Remaining protection: kept free meaning check
  `/stop for that decision rather than treating release authorization as a waiver/i`
  plus `/named documentation-risk exception before distribution/i`.
- Full-sentence "in `read-only` mode against the selected release source".
  Invariant: the docs preflight is read-only. Remaining protection: kept free
  check on "`read-only` mode".

Loosened (case-insensitive, kept): apply-only-to-repository-landing scope
line, CLASSIFY-before-credentials (credential boundary), never abort a store
release over branch topology (demonstrated failure), two routine interactions
(numeric limit), stop-for-decision (consent/stop line).

Kept unchanged: manifest trigger routing, Apple read before the branch gate,
byte-exact branch gate appearing once, docs preflight before the
authorization moment, fastlane/iris/appPriceSchedules command anchors,
stale-wording bans. No gate-tier E2E covers the Apple adapter, so every
invariant keeps a free check here.

Cosmetic pins dropped: capitals on ONLY / CLASSIFY / STOP.

Mutation log: .context/mutation-ship-apple-gate.md (14 mutations, 0
unexpected: 2 reorders, 1 marker and 6 safety mutations red; 5 rewordings green).
This commit is contained in:
garrytan committed 2026-10-03 01:03:14 +00:00
1 parent ff54f3c955
commit 8b1e3423a7
1 file changed
+9 -16
+9 -16
View File
@@ -39,7 +39,7 @@ describe("ship Apple gate ordering (R2)", () => {
test("store distribution explicitly bypasses the branch/PR ceremony", () => {
expect(SKELETON).toContain("Store distribution proceeds");
expect(SKELETON).toMatch(/branch gate and repository-landing pipeline below apply ONLY to\s*\n?repository-landing asks/);
expect(SKELETON).toMatch(/branch gate and repository-landing pipeline below apply only to\s+repository-landing asks/i);
});
test("the non-Apple branch gate is byte-unchanged and appears exactly once", () => {
@@ -50,30 +50,23 @@ describe("ship Apple gate ordering (R2)", () => {
test("the adapter section exists in the union with its battle-tested spine", () => {
const section = readFileSync(join(ROOT, "ship", "sections", "apple-release.md"), "utf-8");
for (const anchor of [
"one authorization moment",
"fastlane spaceauth",
"iris/v1/apiKeys",
"appPriceSchedules",
"CLASSIFY the error before touching credentials",
"Never abort an App Store release over branch topology",
]) {
for (const anchor of ["one authorization moment", "fastlane spaceauth", "iris/v1/apiKeys", "appPriceSchedules"]) {
expect(section).toContain(anchor);
}
expect(section).toMatch(/classify the error before touching credentials/i);
expect(section).toMatch(/never abort an App Store release over branch topology/i);
});
test("routine interaction limits cannot waive blocking documentation or safety decisions", () => {
for (const name of ["apple-release.md.tmpl", "apple-release.md"]) {
const section = readFileSync(join(ROOT, "ship", "sections", name), "utf-8");
expect(section).toContain("Plan for two routine interactions");
expect(section).toContain("A genuine blocker may require a safety or named documentation-risk decision");
expect(section).toContain("STOP for that decision rather than treating release authorization as a waiver");
expect(section).toContain("routine interactions and blocking decisions above");
const section = readFileSync(join(ROOT, "ship", "sections", name), "utf-8").replace(/\s+/g, " ");
expect(section).toMatch(/two routine interactions/i);
expect(section).toMatch(/stop for that decision rather than treating release authorization as a waiver/i);
expect(section).not.toContain("exactly two interactions, and no others");
expect(section).not.toContain("two permitted interactions");
expect(section.indexOf("**Documentation preflight:**")).toBeLessThan(section.indexOf("## The one authorization moment"));
expect(section).toContain("in `read-only` mode against the selected release source");
expect(section).toContain("Resolve blockers or obtain an explicit named documentation-risk exception before distribution");
expect(section).toContain("`read-only` mode");
expect(section).toMatch(/named documentation-risk exception before distribution/i);
}
});
});