Three layers
Layer 1 — GitHub Rulesets
When you bootstrap a repository (full-tier GitHub App), LaneSync creates rulesets that:- Require pull request reviews before merging
- Require status checks including
SDLC Enforceand checks fromsdlc.yamlrequired_checks - Block force-push and deletion on protected branches
sdlc.yaml changes. The propagation chain:
SDLC Enforce is always a required check — it is LaneSync’s own status check, not a user-configured workflow name.Layer 2 — Backend state machine
The state machine in the LaneSync backend:- Computes
current_stagefrom GitHub data (issues, PRs, workflow runs, evidence) - Marks individual gate items as
blockingin stage details - Exposes deploy readiness via
/api/milestones/check(CI auth required: OIDC or API key)
required_checks (from live sdlc.yaml) and the workflow conclusion is failure.
Stage details are fetched live from GitHub on every request to GET /api/milestones/:id/stage-details (60-second cache TTL). Do not substitute DB reads for the live file — the DB cache may lag until the webhook fires.
Layer 3 — SDLC Enforce CI action
Bootstrapped repos include a GitHub Actions workflow that runs thesdlc-enforce action. It posts a commit status named SDLC Enforce and fails when:
- PR targets a protected branch without meeting SDLC requirements
- Milestone linkage or stage rules are violated
Enforcement vs visibility
Troubleshooting enforcement
Rulesets not created
Rulesets not created
The GitHub App needs Administration: Read & Write (full tier). Re-approve permissions on the installation.
Phantom BLOCKING badges
Phantom BLOCKING badges
Usually caused by stale check names. Ensure
required_checks in sdlc.yaml matches your GitHub Actions job names exactly, then push the file to trigger re-sync.SDLC Enforce always failing
SDLC Enforce always failing
Verify the repo completed bootstrap and the workflow template was pushed. Check workflow run logs on the PR branch.