Skip to content
Devolyn

Product · Devolyn Guard

Gate the boundary, not the agent.

Devolyn Guard sits at your git/CI boundary — and optionally as a real-time hook — and gives every change a deterministic verdict before it can merge. It works with any agent because it checks the change, not the tool.

FIG 0.1

Gate the boundary

Guard sits at git/CI — agent-agnostic. It checks the change, not the tool, so every agent is covered.

FIG 0.2

Deterministic verdict

Structural and policy checks produce a repeatable GREEN / YELLOW / RED. Same input, same verdict.

FIG 0.3

Tamper-proof audit

Each decision is hash-chained to the last. Break one link and the chain no longer verifies.

The verdict

Three outcomes. No ambiguity.

Structural and policy checks produce a repeatable verdict. Same input, same verdict, every time — which is what makes it possible to audit.

  • GREENMergesThe change passed every structural and policy check. It can proceed without a human in the loop.
  • YELLOWNeeds a humanA named person decides. The change waits in the approval queue until they do — or the deadline passes.
  • REDBlockedThe change does not merge. There is no override at the boundary; a RED cannot be approved into a GREEN.
GREEN
merges
YELLOW
needs a human approval
RED
blocked
payments/src/middleware/auth.tsRED
payments/src/middleware/auth.tsRED · merge blocked
14export const handler = async (req, res) => {
15- app.use(requireAuth)
PolicyRemoving requireAuth deletes the authentication check on 12 protected routes. Blocked by policy auth-required.
16 const user = await getUser(req)
17 if (!user) return res.status(401)
18 return next()
19}
  • Structuralparses · resolves
  • Policyauth-required
  • Blast radius12 routes

Illustrative data — example content, not a customer's.

Capabilities

One surface, five guarantees.

  1. 01GREEN

    Deterministic verdicts

    Structural and policy checks produce a repeatable GREEN / YELLOW / RED. Same input, same verdict, every time.

    devolyn guard · pull requestsGREEN
    Open4
    1. DVG-241

      Add input validation to /login

      GREENapi
    2. DVG-240

      Remove auth middleware

      RED · BLOCKEDsecurity
    3. DVG-238

      Rename user_id → account_id

      YELLOWschema
    4. DVG-235

      Add rate limiter to gateway

      GREENinfra

    Illustrative data — example content, not a customer's.

  2. 02RED

    Blocks unsafe merges

    RED doesn't merge. The gate enforces it at the boundary — not as a suggestion.

    payments/src/middleware/auth.tsRED
    payments/src/middleware/auth.tsRED · merge blocked
    14export const handler = async (req, res) => {
    15- app.use(requireAuth)
    PolicyRemoving requireAuth deletes the authentication check on 12 protected routes. Blocked by policy auth-required.
    16 const user = await getUser(req)
    17 if (!user) return res.status(401)
    18 return next()
    19}
    • Structuralparses · resolves
    • Policyauth-required
    • Blast radius12 routes

    Illustrative data — example content, not a customer's.

  3. 03GREEN

    Tamper-proof audit

    Every decision is written to a hash-chained, signed trail. Prove what was allowed, and by whom.

    devolyn guard · audit trailGREEN
    Chain verified1,412 entries · signed · append-onlyVerifyExport
    1. #1408a1b2c9f07e31
    2. #1409c3d4e0a1b2c9
    3. #1410e5f6a7c3d4e0
    4. #14110b9c1de5f6a7
    5. #14127d2e4f0b9c1d
    timeeventrefresult
    14:02:11gateDVG-241GREEN
    14:02:37gateDVG-240RED
    14:05:52gateDVG-238YELLOW
    14:11:08approvalDVG-238granted · m.okafor
    14:11:19mergeDVG-238committed

    Illustrative data — example content, not a customer's.

  4. 04YELLOW

    Closed approval loop

    When a change needs a human, it becomes a single-use, commit-bound approval — not a message someone forgets.

    devolyn guard · approval queueYELLOW
    Approval queue1 waitingdeadline 00:41:12
    DVG-238Yellow

    Rename user_id → account_id

    Blast radius: 14 files across 3 services

    requester
    agent · claude-code
    environment
    staging
    files
    14
    fingerprint
    sha256:e5f6a7…91c0

    Decision packet

    • 01What changes: column rename across 3 services
    • 02Why it stopped: blast-radius threshold (14 > 8)
    • 03Policy that fired: blast-radius-review
    reason required

    Illustrative data — example content, not a customer's.

  5. 05GREEN

    Runs on your infrastructure

    Self-hosted. Your code never leaves your network; Guard reads only metadata.

    ops@guard-host:~GREEN
    $docker compose ps
    NAMESTATEHEALTHPORTS
    guard-nginxrunninghealthy0.0.0.0:443→443
    guard-apirunninghealthyinternal
    guard-dashboardrunninghealthyinternal
    guard-postgresrunninghealthyinternal
    guard-redisrunninghealthyinternal

    only nginx binds host ports · nothing leaves this host

    Illustrative data — example content, not a customer's.

The approval loop

An approval is bound to one exact change.

When a verdict is YELLOW, the change becomes a single-use approval tied to that specific commit. It cannot be reused for a different change, and the decision — who, when, why — is written to the audit trail.

  1. 01Verdict is YELLOWThe change is queued for a named reviewer with a deadline.
  2. 02A human decidesApprove or reject, with a reason. Both outcomes are recorded.
  3. 03A single-use approval is issuedBound to the exact change; it expires and cannot be replayed.
  4. 04The same change is re-submittedWith the approval it proceeds and the record shows who approved it. Without it, the verdict is YELLOW again.
devolyn guard · approval queueYELLOW
Approval queue1 waitingdeadline 00:41:12
DVG-238Yellow

Rename user_id → account_id

Blast radius: 14 files across 3 services

requester
agent · claude-code
environment
staging
files
14
fingerprint
sha256:e5f6a7…91c0

Decision packet

  • 01What changes: column rename across 3 services
  • 02Why it stopped: blast-radius threshold (14 > 8)
  • 03Policy that fired: blast-radius-review
reason required

Illustrative data — try Approve to see the single-use grant.

Audit trail

Every decision, chained and signed.

Each entry carries the hash of the one before it and a signature made with a key the database does not hold. The application role can append but never update or delete — and Guard re-checks that at every boot.

devolyn guard · audit trailSigned
Chain verified1,412 entries · signed · append-onlyVerifyExport
  1. #1408a1b2c9f07e31
  2. #1409c3d4e0a1b2c9
  3. #1410e5f6a7c3d4e0
  4. #14110b9c1de5f6a7
  5. #14127d2e4f0b9c1d
timeeventrefresult
14:02:11gateDVG-241GREEN
14:02:37gateDVG-240RED
14:05:52gateDVG-238YELLOW
14:11:08approvalDVG-238granted · m.okafor
14:11:19mergeDVG-238committed

Illustrative data — example content, not a customer's.

Trust & security

Every trust claim is checkable on your own host.

Self-hosted, by design
A docker compose stack on a Linux host you administer. No hosted version, no central login, no account with Devolyn.
Your code never leaves your network
The gate reads only the metadata it needs to reach a verdict. Source stays in your repository, on your infrastructure.
Tamper-evident audit trail
Each entry is content-hashed, chained to the previous entry and signed. Verify the chain from the dashboard, or export and verify it elsewhere.
Single-admin
One administrator owns the deployment. A deliberately small trust boundary for a pilot, stated plainly rather than hidden.
No data sent to Devolyn
Guard has nothing to report to us and no endpoint to report it to. What happens on your host stays on your host.

Deploy

One command. About five minutes.

Deploy Devolyn Guard →