Skip full lint for observability-only changes - #4661
Merged
Conversation
lukemelia
force-pushed
the
cs-10958-ci-lint-path-filter
branch
from
May 5, 2026 18:07
3da821b to
fdfb823
Compare
Contributor
Observability diff (vs staging)No dashboard / folder changes detected against the staging Grafana. (Run: https://github.com/cardstack/boxel/actions/runs/25394273650) |
Adds paths-ignore: ["packages/observability/**"] to ci-lint.yaml's pull_request trigger so observability-only PRs skip the ~5-min lint job of the other 19 packages. Removes the now-redundant `Lint Observability` step from ci-lint.yaml. Coverage moves to a new dedicated `lint` job in observability-diff.yml, which runs on every observability PR (including from forks — no AWS credentials needed) and executes the full lint script: shellcheck, jq, prettier YAML check, and the manifest/secret regression checks. The existing `diff` job retains its own lint step (renamed to "Lint (with live-staging validate)") so non-fork PRs still get GRAFANACTL_VALIDATE_ENV running grafanactl resources validate against live staging Grafana; PRETTIER_SKIP=1 stays there since the new lint job already covers prettier. Why deny-list (paths-ignore) over allow-list (paths): the failure mode of forgetting to add a new package to an allow-list is silent — lint just doesn't run for the new package. Deny-list's failure mode is benign — lint runs unnecessarily on a PR that doesn't need it. Observability is the only package with a self-contained dedicated workflow, so it's the only entry on the deny-list. Verified: main has no required_status_checks set in either classic protection or rulesets, so the lint job being skipped on observability- only PRs won't block PR merges.
lukemelia
force-pushed
the
cs-10958-ci-lint-path-filter
branch
from
May 5, 2026 18:19
c02a889 to
99c1d3d
Compare
backspace
approved these changes
May 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
paths-ignore: ['packages/observability/**']toci-lint.yaml'spull_request:trigger so observability-only PRs skip the ~5-minute lint job of the other 19 packages. The now-redundantLint Observabilitystep is removed fromci-lint.yaml.Coverage moves to a new dedicated
lintjob inobservability-diff.ymlthat runs on every observability PR (including from forks — no AWS credentials needed) and executes the full lint script: shellcheck, jq, prettier YAML check (no longer skipped), and the manifest/secret regression checks.Why this approach
A previous iteration of this PR introduced per-package gating via
dorny/paths-filterinci-lint.yaml. Review surfaced two correctness regressions vs. the existing pattern (workspace-dep changes wouldn't trigger dependent packages' lint; e.g. a breaking type change inruntime-commonwould not retrigger Host'sember-tsc --noEmit) and unnecessary unconditional Boxel UI / Boxel Icons builds. The simplerpaths-ignoredeny-list avoids both: every package other than observability still runs the full existing lint flow on every PR, exactly as it does onmaintoday.The original objection to
paths-ignorewas thatobservability-diff.yml's lint step setPRETTIER_SKIP=1, so the prettier YAML check would never run on observability-only PRs. This PR fixes that root cause by adding a separatelintjob (noPRETTIER_SKIP) insideobservability-diff.yml.Deny-list rather than allow-list because the failure modes are asymmetric: forgetting to add a new package to an allow-list silently skips lint for that package; running lint unnecessarily on a deny-list miss is harmless. Observability is the only package with a self-contained dedicated workflow, so it's the only entry on the deny-list.
What lint coverage looks like after this PR
ci-lint.yamlruns?observability-diff.yml::lintruns?observability-diff.yml::diffruns?packages/observability/**mainThe
diffjob's existing lint step is renamed to "Lint (with live-staging validate)" and retainsGRAFANACTL_VALIDATE_ENV=stagingplusPRETTIER_SKIP=1(since the new siblinglintjob already covers prettier).Risk check
mainhas norequired_status_checksset in either classic protection or rulesets, so a skipped lint job on observability-only PRs won't block merges.pnpm run lintscript still requires adding aLint <Package>step inci-lint.yaml— same as before this PR. No new fragility.lintjob (no AWS access required), so coverage matches non-fork PRs minus the live-staging validate.Test plan
packages/observability/**→ci-lint.yamlis skipped;observability-diff.yml'slintanddiffjobs both run; prettier check passes/fails on YAML formatting issues.packages/host/**→ci-lint.yamlruns every existingLint <Package>step;observability-diff.ymlis not triggered.ci-lint.yamlruns (full sweep),observability-diff.yml::lintand::diffboth run.ci-lint.yamlskipped,observability-diff.yml::lintruns,::diffskipped via fork guard.packages/observability/**→ caught byobservability-diff.yml::lint(the prettier check that previously didn't run on observability-only PRs).🤖 Generated with Claude Code