Summary
desktop-native-linux in .github/workflows/e2e-cli.yml declares needs: classify but its job
condition never reads the classifier's verdict. It inherits the dependency and ignores the
decision, so it builds a .deb and a signed updater on every pull request — including
documentation-only and run-record-only PRs where scaffold-static and scaffold-runtime correctly
skipped.
Observed
Job conditions as they stand:
| Job |
needs |
Reads env.RUN? |
scaffold-static |
classify |
yes |
scaffold-runtime |
classify |
yes |
desktop-native-linux |
classify |
no — only !cancelled() && needs.classify.result != 'skipped' |
Measured across the last 20 closed PRs, three cases prove it directly — the classifier said skip,
static and runtime obeyed, desktop ran anyway:
| PR |
Scope |
scaffold-static |
scaffold-runtime |
desktop-native-linux |
| #1055 |
one file, .agents/ only |
0m (skipped) |
0m (skipped) |
1m — ran |
| #1063 |
3 files, harness only |
0m (skipped) |
0m (skipped) |
1m — ran |
| #1123 |
RFC, run-record |
0m (skipped) |
0m (skipped) |
1m — ran |
Across all 20 PRs desktop-native-linux accounts for ~41 minutes and ran on 20/20, most of
which touched nothing related to desktop packaging.
Why it matters beyond the minutes
The classifier is explicitly designed to be the single decision point for this workflow's expensive
jobs, and it is pure and unit-tested (ci-classify-changes.test.ts). A job that depends on it but
does not read it is a gate wired to a switch that isn't connected — it reads as governed while
being ungoverned. That is the same defect class as the two inert guards this milestone already
shipped and fixed, and it will silently defeat any future tightening of the classifier.
Fix
Read the classifier verdict in the job condition, exactly as its two siblings do. If desktop
packaging warrants a signal distinct from the scaffold tiers, that signal belongs in the
classifier as its own output, not as an unconditional job.
Acceptance
Provenance
Found 2026-08-03 while auditing CI spend across the last 20 closed PRs, after the owner observed
that the Actions queue is growing and that most PRs run CI unrelated to their scope.
Broader redesign tracked separately.
Summary
desktop-native-linuxin.github/workflows/e2e-cli.ymldeclaresneeds: classifybut its jobcondition never reads the classifier's verdict. It inherits the dependency and ignores the
decision, so it builds a
.deband a signed updater on every pull request — includingdocumentation-only and run-record-only PRs where
scaffold-staticandscaffold-runtimecorrectlyskipped.
Observed
Job conditions as they stand:
needsenv.RUN?scaffold-staticclassifyscaffold-runtimeclassifydesktop-native-linuxclassify!cancelled() && needs.classify.result != 'skipped'Measured across the last 20 closed PRs, three cases prove it directly — the classifier said skip,
static and runtime obeyed, desktop ran anyway:
scaffold-staticscaffold-runtimedesktop-native-linux.agents/onlyAcross all 20 PRs
desktop-native-linuxaccounts for ~41 minutes and ran on 20/20, most ofwhich touched nothing related to desktop packaging.
Why it matters beyond the minutes
The classifier is explicitly designed to be the single decision point for this workflow's expensive
jobs, and it is pure and unit-tested (
ci-classify-changes.test.ts). A job that depends on it butdoes not read it is a gate wired to a switch that isn't connected — it reads as governed while
being ungoverned. That is the same defect class as the two inert guards this milestone already
shipped and fixed, and it will silently defeat any future tightening of the classifier.
Fix
Read the classifier verdict in the job condition, exactly as its two siblings do. If desktop
packaging warrants a signal distinct from the scaffold tiers, that signal belongs in the
classifier as its own output, not as an unconditional job.
Acceptance
desktop-native-linuxdoes not run when the classifier says the PR needs no scaffold workci-classify-changes.tsand coveredby a unit test — not encoded in workflow YAML
scaffold-static's existing one, so the jobcan stay a required check
Provenance
Found 2026-08-03 while auditing CI spend across the last 20 closed PRs, after the owner observed
that the Actions queue is growing and that most PRs run CI unrelated to their scope.
Broader redesign tracked separately.