This document defines which CI checks are hard gates (must pass to merge) vs advisory/external (informational, won't block merge).
These checks block merge if they fail. Fix them before requesting review.
| Check | Workflow | What it validates |
|---|---|---|
| DCO / Signed-off-by | dco-check.yml |
Every commit has Signed-off-by: line |
| DCO Audit | pr-checks.yml |
Same as above, embedded in audit workflow |
| Secret Scan | pr-checks.yml |
No API keys, tokens, or credentials in diff |
| Dependency Audit | pr-checks.yml |
No known vulnerabilities in dependencies |
| CodeQL (python) | GitHub default | No security vulnerabilities in Python code |
| CodeQL (javascript) | GitHub default | No security vulnerabilities in JS/TS code |
These checks provide feedback but won't prevent merge. They may fail due to external issues.
| Check | Workflow | Why it's advisory |
|---|---|---|
| Agent Quality Score | pr-checks.yml |
continue-on-error: true — score unavailable doesn't block |
| Run Test Suite | pr-checks.yml |
continue-on-error: true — tests may fail on external deps |
| Validate Lesson Schema | pr-checks.yml |
continue-on-error: true — legacy lessons may not pass |
| Workers Builds | Cloudflare bot | External service, frequently fails on bot PRs |
| submit-pypi | deploy workflow | Only runs on release tags, not PRs |
These are informational only and never block merge.
| Check | Source | Notes |
|---|---|---|
| Cloudflare Workers | cloudflare-workers-and-pages[bot] |
Bot-generated, ignores project needs |
| Opire bot | opirebot[bot] |
Bounty tracking, not code review |
| CodeRabbit / Devin | External bots | Review suggestions, not blockers |
The Auto-Merge Gate step in pr-checks.yml checks success() — meaning ALL steps in the audit job must pass. If an advisory step fails (like continue-on-error: true steps), the gate still passes because those steps report success even on failure.
However, if an external check (like Workers Builds) is configured as a required status check in branch protection rules, the Auto-Merge Gate will fail because GitHub sees the external check as failed.
If a good PR is blocked by Auto-Merge Gate due to external checks:
- Manual merge: Maintainer can merge directly (bypass branch protection)
- Update branch protection: Remove external checks from required status checks
- Fix the external check: Address the underlying issue (e.g., remove Cloudflare Workers integration if not needed)
When adding a new CI check, decide its gate level:
- Hard gate: Use
continue-on-error: false(default) — blocks merge on failure - Soft gate: Use
continue-on-error: true— provides feedback but doesn't block - External: Don't add to branch protection required checks