Skip to content

ci: PRs into an integration branch get no real CI — check-test + quality never run, so stacked-wave green ticks are nearly empty #774

Description

@rickylabs

Summary

ci.yml only triggers on PRs whose base is main (or feat/package-quality):

on:
  pull_request:
    branches: [main, "feat/package-quality"]

Every PR in a stacked wave targets its integration branch, not main. So for those PRs the two lanes that matter — check-test (repo-wide deno check + deno test) and quality (lint, fmt, scaffold-version guard, publish dry-run, advisory audit) — do not run at all.

The PR page still shows green, because surface-diff and code-quality do trigger on packages/**. A green tick on a stacked PR is therefore not evidence the code checks, tests, lints, or formats. It is nearly empty.

Why this is biting now (beta.10)

Three gates were made blocking this wave, and all three live in the quality job:

Gate PR
repo-drift (@ts-ignore / as never sweep) #772
README tagline byte-cap #771
version-less jsr:@netscript/* specifier guard #769

None of them has executed in CI even once. They fire for the first time on the feat/beta10-integrationmain PR — simultaneously, alongside the run-deno-lint.ts / run-deno-fmt.ts wrapper fixes that change what "green" even means. That integration→main PR is the first honest CI verdict for the entire wave, and it is carrying three brand-new blocking gates at once.

The second layer

ci.yml's own header states:

quality"Additive and intended to become a required check (branch protection) once observed green; until then a red quality cannot block the merge gate."

So even on a main-targeted PR, making a gate "blocking" inside quality does not block a merge unless quality is a required check in branch protection. Worth confirming the branch-protection state before anyone relies on these gates — a gate that cannot fail a merge is documentation, not enforcement.

Why it matters beyond this wave

This is structural, not a beta.10 accident: any work developed on an integration branch — which is the repo's normal pattern for epics — accumulates unverified commits behind green ticks and discovers the truth in one large, late, noisy PR. That is the opposite of what CI is for.

Suggested fix

  1. Trigger ci.yml on PRs into integration branches too — e.g. branches: [main, 'feat/**', 'epic/**'], or drop the base filter and rely on path filters.
  2. Confirm (and record) whether quality is a required check in branch protection. If it is not, a "blocking" gate inside it blocks nothing.
  3. Consider surfacing, in the PR template or a bot comment, which lanes actually ran — so a reviewer cannot mistake "2 checks passed" for "CI passed".

Provenance

Found during the beta.10 wave while auditing why three newly-blocking gates showed no CI evidence. Related false-green findings from the same run: #769 (published-mode-only defect invisible to every local gate), #773 (generated artifact never diffed against source). The pattern across all of them: an exit code — or a green tick — is not evidence. Evidence is output you can point at, from a lane you can prove ran.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions