Skip to main content
LaneSync enforcement is technical, not procedural. Teams cannot skip stages by convention — the pipeline blocks merges and deploys when gates fail.

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 Enforce and checks from sdlc.yaml required_checks
  • Block force-push and deletion on protected branches
Rulesets are re-applied when 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_stage from GitHub data (issues, PRs, workflow runs, evidence)
  • Marks individual gate items as blocking in stage details
  • Exposes deploy readiness via /api/milestones/check (CI auth required: OIDC or API key)
Key invariant: A milestone in DEVELOPMENT only shows a check as blocking if that check name appears in 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 the sdlc-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
See SDLC Enforce action reference for behavior details.

Enforcement vs visibility

Troubleshooting enforcement

The GitHub App needs Administration: Read & Write (full tier). Re-approve permissions on the installation.
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.
Verify the repo completed bootstrap and the workflow template was pushed. Check workflow run logs on the PR branch.