The CI gate

Most application security tools tell you what is wrong. The gate is the part that can decide whether a build goes out.

It runs after every ingest, asks a small fixed question of the findings it has just processed, and gives your pipeline an answer it can act on.

What blocks a build

A finding blocks if either condition holds:

Both conditions, and the tier list, are settings you control.

What deliberately does not block

Not a conditionWhy not
Severity, or the priority scoreA wall of unverified criticals is exactly what the gate exists not to relay. A threshold also produces an argument about the number every time it fires.
A scanner's own "exploitable" labelThe gate acts on Sinterly's verified verdict, never on a vendor's unevidenced claim.
ReachabilitySinterly does not analyse your source, so this cannot be verified for every finding. A gate with a condition it cannot evaluate is a gate nobody trusts.
Threat model findingsA design threat is not something a build can fix.
Anything under a live risk acceptanceA documented, expiring, signed-off exception is honoured. See Risk decisions.

Advisory first, always

Every tenant starts in advisory mode. The gate evaluates, records its verdict, and reports what it would have blocked. It never fails a build.

This means you can wire the gate into your pipeline today with nothing at risk. Watch it for a few weeks, see what it would have caught and what it would have annoyed you about, and only then decide.

Switching to blocking is a deliberate change you make. A gate that starts by breaking builds is a gate that gets switched off in a fortnight.

Wiring it in

Create an ingest token (see Ingest API) and give it to your CI system as SINTERLY_TOKEN. Ingest calls go to the pipeline host, not the dashboard API:

export SINTERLY_URL=https://pipeline.sinterly.com
export SINTERLY_TOKEN=stk_...

semgrep --config p/owasp-top-ten --sarif -o results.sarif .
./sinterly-ci-gate.sh results.sarif sarif

The helper script uploads the file, waits for the run, and exits with a code your pipeline understands.

Exit codeMeaning
0The gate passed, or the policy is advisory
1The gate failed and the policy is blocking
2Something went wrong: upload rejected, run failed, or timed out

Accepted formats are sarif, csv and otm. The script needs curl, and either jq or python3.

Doing it without the script

Two calls. Ingestion is asynchronous, so the verdict arrives with the run status rather than with the upload.

curl -X POST "$SINTERLY_URL/ingest/commit?format=sarif" \
     -H "Authorization: Bearer $SINTERLY_TOKEN" \
     --data-binary @results.sarif
# {"status":"accepted","run_id":"...","tenant_id":"..."}

curl "$SINTERLY_URL/ingest/runs/$RUN_ID" \
     -H "Authorization: Bearer $SINTERLY_TOKEN"
{
  "run": { "status": "completed", "findings_created": 3 },
  "gate": {
    "status": "fail",
    "enforcement": "advisory",
    "blocking_count": 1,
    "blocking_findings": [
      {
        "finding_id": "...",
        "condition": "kev_listed",
        "detail": "Listed in the CISA KEV catalogue, exploited in the wild",
        "cve_id": "CVE-2026-1234",
        "title": "Deserialisation of untrusted data"
      }
    ],
    "policy_version": 1,
    "should_fail_build": false
  }
}

should_fail_build is the only field your pipeline needs to read. It is false in advisory mode however bad the verdict.

gate is null while the run is still going, and for a tenant with no policy configured.

Reading a verdict later

Every evaluation is stored permanently and cannot be edited, including a copy of the policy exactly as it stood at the time. A verdict from six months ago still explains itself after the policy has changed.

Suggested rollout

  1. Week one. Wire the script into one pipeline. Leave the policy advisory. Change nothing else.
  2. Weeks two and three. Look at what it would have blocked. If anything looks wrong, the usual cause is a target tier that does not match reality.
  3. Week four. Decide. If the verdicts have been right, switch to blocking on that one pipeline first.
  4. Afterwards. Watch the override rate on the executive view. A rising override rate means the policy is too broad, or the team is under too much delivery pressure. Both are worth knowing.
If the gate blocks something you need to ship now. Accept the risk on that finding with a reason and an expiry, and the gate stops counting it immediately. That is the intended escape hatch, and it leaves a record instead of a mystery.