Files
callstack__agent-device/scripts/gate/declarations.ts
Michał Pierzchała 4b44c1c53a chore(test): remove the contention retry and shrink the subprocess-stub project (#1781 A4) (#1827)
The enumerated single-retry policy (#1419) has fired zero times since it
landed on 2026-07-29: 0 of 234 sampled Coverage-job lane envelopes
(2026-08-11 to 2026-08-18) have retryCount > 0, and none of 17 recent
failed runs was retried (5 refused "outside the enumerated retry list",
4 refused "unhandled error"). All three trackers its entries pointed at
(#1098, #1414, #1419) are closed. It cost ~1,454 LOC, a per-run secret
marker threaded through a setup file on every Vitest project, and a
standing obligation for every future gate reporter to call the blocker
bus.

Delete the scripts, tests and fixtures, the check:contention-retry
script and gate, the envelope artifact upload, and the runner-timeout
setup file; test:coverage:ci is a plain `vitest run --coverage` again.
lane-envelope.ts stays: the mutation, fuzz and concurrency-torture lanes
build their envelopes from it. run-blocker-bus.ts goes: its only
consumer was the retry's failure sink, and its only publisher already
fails the run by setting process.exitCode.

Keep the subprocess-stub project for the three files that really spawn
(client-metro, fuzz harness, fuzz corpus-replay) and drop the three that
run in 31/212/277ms in CI, which cannot contend for anything. The list
is now a plain array in vitest.config.ts with the reason at each entry.
Membership and the project's kill criterion live in #1823.

Because test:coverage:ci is a bare vitest run, the gate manifest reads
its projects directly, so OPAQUE_RUNNERS no longer needs it and an
unrun Vitest project becomes unrepresentable rather than detected; the
audit test now constructs that state by project-scoping the script.
2026-08-18 15:35:25 +02:00

73 lines
3.6 KiB
TypeScript

// The four small facts the manifest cannot derive from package scripts and workflow YAML.
// A script whose Vitest/node-test invocation the loader cannot read, mapped to the units it
// really runs. Empty right now: the one entry was a coverage wrapper, and `test:coverage:ci`
// is a plain `vitest run --coverage` again, which the loader reads directly.
export const OPAQUE_RUNNERS: Readonly<Record<string, readonly string[]>> = {};
export const REPORTING_SCRIPTS: Readonly<Record<string, string>> = {
'test:integration:progress': [
'Prints the provider-backed integration status table and exits 0. The assertion lives in',
'its `--check` sibling, `test:integration:progress:check`, which IS the registered',
'`integration-progress` gate. Running the reporter in CI would gate nothing.',
].join(' '),
};
// A check whose lane runs, but through a surface the loader cannot read. Empty right now:
// the one entry moved to MANUAL_ONLY_OWNERS when its lane stopped running automatically.
export const UNPROVABLE_OWNERS: Readonly<Record<string, string>> = {};
/**
* A check whose only lane is a `workflow_dispatch` workflow.
*
* `lane` is the load-bearing field, not documentation: the audit resolves it against the
* derived model and fails when the named lane is gone, has become a pull_request/schedule
* lane again, or has stopped declaring the gate. Without it the record would be a plain
* allowlist, and deleting the parked job would read as "parked" forever — parked coverage
* quietly becoming deleted coverage.
*/
export type ManualOnlyOwner = {
/** Lane label, exactly as the loader builds it: `<workflow name> / <job name>`. */
readonly lane: string;
/**
* Set when the lane's own steps cannot show the gate, so the lane's existence is the whole
* attestation the model can make. Every opaque entry needs the surface named in `reason`.
*/
readonly opaque?: true;
readonly reason: string;
};
// Checks nothing runs on the way in or on a schedule — *unowned by design and temporarily*,
// the opposite of the claim UNPROVABLE_OWNERS makes. `check.ts` prints them by name on every
// run rather than folding them into the wired count, because a check that quietly loses its
// owner reads exactly like a green build. Delete the entry when the lane goes back on
// `pull_request` or `schedule`; the audit fails if an entry outlives its parking, and fails
// the other way too if a declaration is deleted while its lane is still dispatch-only.
export const MANUAL_ONLY_OWNERS: Readonly<Record<string, ManualOnlyOwner>> = {
'replay-android': {
lane: 'Replay Manual / Android Full Emulator Suite',
opaque: true,
reason: [
'Parked on `workflow_dispatch` by #1781 A1. The lane runs `pnpm gate replay-android`',
'inside the `script:` input of `reactivecircus/android-emulator-runner` — shell handed',
'to a third-party action, which this loader does not read — so the job existing is all',
'the model can attest, and the gate would be invisible even back on a schedule. Routing',
'the emulator lane through steps the loader opens is the open item named in #1429.',
].join(' '),
},
'replay-ios': {
lane: 'Replay Manual / iOS Replay Suite',
reason: [
'Parked on `workflow_dispatch` by #1781 A1 after the suite failed every scheduled run',
'from 2026-07-24 on.',
].join(' '),
},
'replay-ios-device': {
lane: 'Replay Manual / iOS Replay Suite',
reason: [
'Parked on `workflow_dispatch` by #1781 A1 with the simulator suite it shares a job',
'with; the step is additionally skipped unless the `IOS_UDID` repository variable is set.',
].join(' '),
},
};