Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/repo-gates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ name: Repo Gates
# reads the live set; when this fold landed the ruleset named
# `Governed Surface Queue Guard`, `Changeset Declaration` and
# `Spec Main Shape Gate`, which is why those three workflows were NOT folded --
# the last has since left the set by objectui#12240's ruling and keeps its own
# workflow for its hourly run on `main`), so the queue is unchanged. The one in-tree reader
# the last has since left the set by objectui#12240's ruling, and objectui#12352
# deleted its workflow when the spec shape gate moved to objectstack), so the
# queue is unchanged. The one in-tree reader
# of the old names, `scripts/dependabot-merge-gate.mjs`, now waits for the one
# context this job produces, `Repo Gates`.
#
Expand Down
425 changes: 0 additions & 425 deletions .github/workflows/spec-main-shape-gate.yml

This file was deleted.

160 changes: 40 additions & 120 deletions content/docs/guide/ci-cd-pipeline.md

Large diffs are not rendered by default.

14 changes: 0 additions & 14 deletions scripts/__tests__/ci-cd-pipeline-doc.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3565,20 +3565,6 @@ function inheritedDeclarations(): Map<string, string> {
* STALE rather than quietly widening the hole.
*/
const SWEEP_DECLARED_NON_RUN_COMMANDS = new Map<string, string>([
[
'spec-main-shape-gate.yml: scripts/dependabot-merge-gate.mjs',
'Named as the registry that classifies this context: `REQUIRED_CONTEXTS` from ' +
'objectui#9969 (the in-tree half of the enrolment), `NOT_A_GATE` since objectui#12240 ' +
'(the in-tree half of its removal from the required set). A declaration this section ' +
'points at, not a step this workflow runs (objectui#9860, objectui#9969, objectui#12240).',
],
[
'spec-main-shape-gate.yml: scripts/check-required-check-set.mjs',
'Named as the one thing in this tree that can READ the ruleset where requiredness actually ' +
'lives — the instrument that says whether this context is still enrolled, which the ' +
"section deliberately does not answer. A different workflow's instrument, cited to keep " +
'the claim falsifiable (objectui#9860, objectui#9969, objectui#12240).',
],
[
'changeset-guard.yml: scripts/check-changeset-presence.mjs',
'Introduced by the words "Deliberately not listed": the overwrite gate imports that ' +
Expand Down
47 changes: 0 additions & 47 deletions scripts/__tests__/dependabot-merge-gate.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -392,53 +392,6 @@ describe('the path-filtered blocking checks (optional bucket)', () => {
});
});

/**
* objectui#12240 — the maintainer's ruling B on objectui#12214's open question
* 1 (ACCEPT 6123370050). `Spec Main Shape Gate` leaves the required set and is
* advisory on a pull request, so it moved back from `REQUIRED_CONTEXTS` (where
* objectui#9969's ruling A had put it) to `NOT_A_GATE`. This block pins the
* MOVE by name, in both directions: an edit that parks the name back in
* `REQUIRED_CONTEXTS` without a ruling fails here, and so does one that drops
* it from every bucket. The control comes first: the same red on a context
* that IS required still refuses the head, so each green below is about this
* one name and not about a snapshot that stopped being read.
*/
describe('Spec Main Shape Gate is advisory, not waited for (objectui#12240)', () => {
const NAME = 'Spec Main Shape Gate';
const withSpecGate = (conclusion: string | null, status = 'completed') => [
...allGreenSnapshot(),
{ id: 95_325_290_000, name: NAME, status, conclusion },
];

it('is declared NOT_A_GATE, with a reason, and in neither other bucket', () => {
expect(Object.keys(NOT_A_GATE)).toContain(NAME);
expect(NOT_A_GATE[NAME as keyof typeof NOT_A_GATE]).toMatch(/objectui#12240/);
expect(REQUIRED_CONTEXTS).not.toContain(NAME);
expect(Object.keys(OPTIONAL_CONTEXTS)).not.toContain(NAME);
});

it('CONTROL: the same red on a REQUIRED context still refuses the head', () => {
const runs = withSpecGate('success').map((run) =>
run.name === 'Type Check' ? { ...run, conclusion: 'failure' } : run,
);
expect(evaluateGate({ checkRuns: runs }).verdict).toBe('red');
});

it('does not refuse a head on which it reported failure', () => {
const result = evaluateGate({ checkRuns: withSpecGate('failure') });

expect(result.verdict).toBe('green');
expect(result.failing).toEqual([]);
});

it('does not hold a head on which it is still running, or has not reported', () => {
expect(evaluateGate({ checkRuns: withSpecGate(null, 'in_progress') }).verdict).toBe('green');
const absent = evaluateGate({ checkRuns: allGreenSnapshot().filter((run) => run.name !== NAME) });
expect(absent.verdict).toBe('green');
expect(absent.missing).toEqual([]);
});
});

describe('waitForGate: the deadline fails closed', () => {
const fakeClock = () => {
let nowMs = 0;
Expand Down
Loading
Loading