You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Pattern 5 — continue-on-error: true on a job, paired with documentation that says "remove this when X lands"
Severity: medium (gate-quality erosion; the workflow drifts further from green main-line)
Detection (Hypatia.Rules.WorkflowAudit):
For each job with continue-on-error: true:
Scan the job's leading comments for phrases like until #N lands, until #N closes, remove when #N.
If a referenced issue is now closed or merged (via GitHub API), flag as "stale continue-on-error mask".
Bonus: detect continue-on-error on a job whose name matches an entry in branch-protection's required_status_checks.contexts (structural contradiction).
Worked example (this session):
affinescript/.github/workflows/ci.ymlvscode-smoke had continue-on-error: true with the comment "Remove the continue-on-error: true line when chore(deps): bump bb8 from 0.8.6 to 0.9.1 #104 publishes the adapter to npm." chore(deps): bump bb8 from 0.8.6 to 0.9.1 #104 is still open so this didn't trigger as stale, but the related affinescript#380 fixed the root cause and removed the mask anyway.
Remediation guidance to emit:
If the gating issue has closed, drop continue-on-error: true and let the job report accurately. If the issue is still open but the workflow logic has changed (e.g. root cause fixed differently), also drop and update the comment.
Implementation pointers
Detection algorithm: For each continue-on-error: true job, scan leading comments for until #N lands/until #N closes/remove when #N; resolve #N via GitHub API; flag if closed/merged. Bonus: contradiction check against branch-protection required contexts.
Real-world example: affinescript/.github/workflows/ci.ymlvscode-smoke had continue-on-error: true with comment "Remove the continue-on-error: true line when chore(deps): bump bb8 from 0.8.6 to 0.9.1 #104 publishes the adapter to npm."
Rule statement: If the gating issue has closed, drop continue-on-error: true and let the job report accurately. If the issue is still open but the workflow logic has changed (e.g. root cause fixed differently), also drop and update the comment.
Acceptance
Rule encoded in hypatia (file path follows existing rule naming convention — lib/rules/<name>.ex if Elixir, or matching the repo's rule DSL)
Test fixture exercising the positive case + at least one negative case
Smoke test passes against the cited landed-fix repo
Detector spec (from hypatia#333 Pattern 5)
Pattern 5 —
continue-on-error: trueon a job, paired with documentation that says "remove this when X lands"Severity: medium (gate-quality erosion; the workflow drifts further from green main-line)
Detection (
Hypatia.Rules.WorkflowAudit):continue-on-error: true:until #N lands,until #N closes,remove when #N.continue-on-erroron a job whose name matches an entry in branch-protection'srequired_status_checks.contexts(structural contradiction).Worked example (this session):
affinescript/.github/workflows/ci.ymlvscode-smokehadcontinue-on-error: truewith the comment "Remove thecontinue-on-error: trueline when chore(deps): bump bb8 from 0.8.6 to 0.9.1 #104 publishes the adapter to npm." chore(deps): bump bb8 from 0.8.6 to 0.9.1 #104 is still open so this didn't trigger as stale, but the related affinescript#380 fixed the root cause and removed the mask anyway.Remediation guidance to emit:
Implementation pointers
continue-on-error: truejob, scan leading comments foruntil #N lands/until #N closes/remove when #N; resolve #N via GitHub API; flag if closed/merged. Bonus: contradiction check against branch-protection required contexts.affinescript/.github/workflows/ci.ymlvscode-smokehadcontinue-on-error: truewith comment "Remove thecontinue-on-error: trueline when chore(deps): bump bb8 from 0.8.6 to 0.9.1 #104 publishes the adapter to npm."continue-on-error: trueand let the job report accurately. If the issue is still open but the workflow logic has changed (e.g. root cause fixed differently), also drop and update the comment.Acceptance
lib/rules/<name>.exif Elixir, or matching the repo's rule DSL)Source cohort: hypatia#333.