Sembl
Proof

Watch the gate work

Sembl is the deterministic accountability gate for AI coding agents. These are two real runs - a real app built by a real agent through a Sembl-gated loop, and the gate catching a patch that breaks its contract. Process accountability, not “better code”.

1. Built through the gate

PASS

A working link shortener was built end-to-end by a real coding agent (MiniMax-M3) driven through the Sembl-gated loop - spec, declared bounds, agent writes in a disposable sandbox, Sembl verifies the diff, apply - in two steps. Each step stayed inside its declared bounds, so each step PASSed.

Loop 1 - the core

A LinkStore plus shorten() / expand(). shorten() derives a short base62 code from the URL with sha256 and reuses the code for repeat URLs.

# shorten() - sha256 the URL, base62 it, reuse if seen def shorten(url, store): code = _code_for(url) # sha256(url) -> base62 if store.get(code) == url: return code store.save(code, url) return code
Loop 2 - the HTTP API

A standard-library http.server exposing POST /shorten (JSON in, short code out) and GET /<code> (302 redirect to the original URL). Also in scope, also PASSed.

Live - the assembled app
$ curl -X POST localhost:8000/shorten -d '{"url":"https://anthropic.com/claude"}' {"code":"oOodV20ShJK"}   $ curl -i localhost:8000/oOodV20ShJK HTTP/1.0 302 Found Location: https://anthropic.com/claude

Every step stayed inside its declared bounds, so every step PASSed - the gate confirming the agent did what it was scoped to do, nothing more.

2. Caught by the gate

BLOCK

This is the core product: sembl verify checks a real diff against a declared bounds contract and returns PASS / WARN / BLOCK - deterministically, no LLM, free in CI. To show it catching a breach, we ran it on a rogue patch (the kind an over-eager agent produces) against this bounds contract:

{ "editable_paths": ["src/linkshort/api.py"], "forbidden_areas": ["infra/"], "churn_budget": { "max_files": 3, "max_lines": 120 } }

The rogue patch edited api.py (allowed) but also touched infra/deploy.yaml, quietly modified src/linkshort/store.py, and its self-report claimed a tests/test_ratelimit.py it never wrote and “tests passed” with no evidence. One command - sembl verify - returned BLOCK (exit 1, fails CI) with five reasons at once:

#ReasonEvidence
1Forbidden-area editinfra/deploy.yaml
2Out-of-scope editsrc/linkshort/store.py
3Fabricated claimtests/test_ratelimit.py (reported, never changed)
4Validation not evidencedtests_passed, status claimed with no proof
5Unreported changesrc/linkshort/store.py
sembl verifyBLOCK
Verdict

BLOCK - exit 1. Five hard reasons caught from the diff and the report alone. No model, no judgement call, same answer on every machine.

Honest framing: this is sembl verify run on a diff that breaks the contract - the product's core use. The agent in Section 1 actually complied. The story is the gate is deterministic and catches breaches.

Try it on your own agent

Sembl is a pip install away. Read the getting-started guide, declare your first bounds file, and put the gate in CI.

Install
pip install sembl
# or run it as an isolated tool
uv tool install sembl

The full source, the Agent Skills, and the MCP server live on github.com/speedvibecode/sembl. The install command is also on the home page.