| Step succeeds but next step skipped | if: condition string vs. boolean | if: github.event.inputs.x != 'true' |
command not found: linkinator | npm ci not run before npm run linkcheck | Add install step |
| X API returns 403 | Duplicate tweet OR auth credentials rotated | Check duplicate-detect; rotate creds |
Tweet >280 chars | URL not counted as 23, or templated copy too long | Use length check incl. URL = 23 |
permissions: contents: write denied | permissions: block missing or scoped wrong | Add explicit permissions |
| CodeQL finds path-traversal | fs.readFile(userInput) without allowlist | Add path-normalize + allowlist root |
| Pages deploy stale | Workflow built old commit; rerun | Re-run deploy job; check artifact |
| Provider smoke flaky | 3rd-party rate limit or transient outage | Retry once; alert if persistent |