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
- Structuralparses · resolves
- Policyauth-required
- Blast radius12 routes
Illustrative data — example content, not a customer's.
Capabilities
One surface, five guarantees.
- DVG-241
Add input validation to /login
GREENapi - DVG-240
Remove auth middleware
RED · BLOCKEDsecurity - DVG-238
Rename user_id → account_id
YELLOWschema - DVG-235
Add rate limiter to gateway
GREENinfra
Illustrative data — example content, not a customer's.
Station 01 / 05
- 01GREEN
Deterministic verdicts
Structural and policy checks produce a repeatable GREEN / YELLOW / RED. Same input, same verdict, every time.
devolyn guard · pull requestsGREENOpen4- DVG-241
Add input validation to /login
GREENapi - DVG-240
Remove auth middleware
RED · BLOCKEDsecurity - DVG-238
Rename user_id → account_id
YELLOWschema - DVG-235
Add rate limiter to gateway
GREENinfra
Illustrative data — example content, not a customer's.
- 02RED
Blocks unsafe merges
RED doesn't merge. The gate enforces it at the boundary — not as a suggestion.
payments/src/middleware/auth.tsREDpayments/src/middleware/auth.tsRED · merge blocked14export 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.
- 03GREEN
Tamper-proof audit
Every decision is written to a hash-chained, signed trail. Prove what was allowed, and by whom.
devolyn guard · audit trailGREENChain verified1,412 entries · signed · append-onlyVerifyExport- #1408a1b2c9↑ f07e31
- #1409c3d4e0↑ a1b2c9
- #1410e5f6a7↑ c3d4e0
- #14110b9c1d↑ e5f6a7
- #14127d2e4f↑ 0b9c1d
time event ref result hash 14:02:11 gate DVG-241 GREEN 14:02:37 gate DVG-240 RED 14:05:52 gate DVG-238 YELLOW 14:11:08 approval DVG-238 granted · m.okafor 14:11:19 merge DVG-238 committed Illustrative data — example content, not a customer's.
- 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 queueYELLOWApproval queue1 waitingdeadline 00:41:12DVG-238YellowRename 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 requiredIllustrative data — example content, not a customer's.
- 05GREEN
Runs on your infrastructure
Self-hosted. Your code never leaves your network; Guard reads only metadata.
ops@guard-host:~GREEN$docker compose psNAME STATE HEALTH PORTS guard-nginx running healthy 0.0.0.0:443→443 guard-api running healthy internal guard-dashboard running healthy internal guard-postgres running healthy internal guard-redis running healthy internal 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.
- 01Verdict is YELLOWThe change is queued for a named reviewer with a deadline.
- 02A human decidesApprove or reject, with a reason. Both outcomes are recorded.
- 03A single-use approval is issuedBound to the exact change; it expires and cannot be replayed.
- 04The same change is re-submittedWith the approval it proceeds and the record shows who approved it. Without it, the verdict is YELLOW again.
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
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.
- #1408a1b2c9↑ f07e31
- #1409c3d4e0↑ a1b2c9
- #1410e5f6a7↑ c3d4e0
- #14110b9c1d↑ e5f6a7
- #14127d2e4f↑ 0b9c1d
| time | event | ref | result | hash |
|---|---|---|---|---|
| 14:02:11 | gate | DVG-241 | GREEN | |
| 14:02:37 | gate | DVG-240 | RED | |
| 14:05:52 | gate | DVG-238 | YELLOW | |
| 14:11:08 | approval | DVG-238 | granted · m.okafor | |
| 14:11:19 | merge | DVG-238 | committed |
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.