Inspiration
A green pipeline does not tell a release approver what was actually checked, which commit was tested, or who still owns the decision to ship. In small teams that gap gets filled with trust and screenshots. ShiftProof AI makes the evidence chain explicit, and it keeps the final call with a human.
The application domain is deliberately small and synthetic: fictional shift records. The validator is deterministic and never uses AI for payroll or personnel decisions. The interesting part starts after the code exists: review, verification, packaging, release, deployment and live observation.
What it does
1. The app. A dependency-free validator and browser demo for fictional shift records. It:
- rejects malformed rows, impossible dates, unknown IDs and invalid hour values,
- drops duplicate worker/date/project rows without double counting,
- fails daily totals above 24 hours and warns above a synthetic weekly threshold,
- never repeats rejected raw input in reports, and exports downloadable evidence.
2. The post-code automation (Path A: Start Fresh, Supervised).
- GitLab CI/CD runs on every push and merge request:
test(verify),source_policy(secure),release_candidate(package). Onmainit addspublish_pages, a manual production release that asks "Human decision: approve this tested ShiftProof release candidate?", andlive_smoke, which checks the live site against the tested CI artifact after every release. - ShiftProof Read-Only Release Guard is a custom GitLab Duo Agent Platform flow, published in the AI Catalog (flow 1018870, v1.0.0). A human starts it by assigning the flow's service account as a reviewer on a merge request. Three agents then run in sequence:
- Release Readiness Reviewer reads the MR, its diff,
AGENTS.mdand the real pipeline and job evidence, using GET-only API calls. - Independent Verifier does not trust step 1. It re-checks the claims against primary evidence and may run exactly one command,
node scripts/verify.mjs. It reports that local check separately from the GitLab pipeline. - Human Handoff writes the verdict,
READY_FOR_HUMAN_REVIEWorBLOCKED, with blockers, caveats and next steps for the approver.
- Release Readiness Reviewer reads the MR, its diff,
The flow has no tools that change GitLab. It cannot edit files, comment, approve, merge, deploy or release. That is the Supervised contract: the agents gather and cross-check the evidence, and a person approves the outcome.
How we built it
- Pure JavaScript on Node.js 22+ with zero runtime dependencies: validator, CLI, browser demo and a Node test suite.
- A deterministic static build with an integrity manifest, so the deployed site can be checked byte for byte against the CI artifact.
.gitlab-ci.ymlwith five evidence stages (verify, secure, package, release, observe), a prebuilt Node image and no package installs inside jobs. The production environment, deployment locking (resource_group) and the Duo agent runtime (.gitlab/duo/agent-config.yml) are configured as code.- Flow Registry v1 YAML for the Duo flow (
flows/shiftproof-supervised.yml), accepted by the live AI Catalog validator. Contract tests fail if the flow gains write tools or loses the human handoff. - A publication regression test that blocks private paths, personal email addresses and private project names from reaching the public repository.
Challenges we ran into
- Configuration theatre. A YAML file or a prompt proves nothing about what actually ran. We treated provider execution as its own evidence gate: a claim only counts once a GitLab pipeline, Duo session or Pages deployment can be linked.
- Schema drift. The live AI Catalog validator rejected fields that older examples still used, so the flow was rewritten for Flow Registry v1 and pinned by tests.
- Letting the agent criticise us. The first Duo session (9757467) returned
READY_FOR_HUMAN_REVIEWwith no blockers. It also flagged stale documentation, a package install inside CI and plaintext private markers in a test. We fixed all three on the branch, and a second Duo Workflow run (pipeline 2968259473) succeeded on the corrected head.
Accomplishments that we're proud of
- A real Duo Agent Platform run, not a mock-up: session 9757467 was triggered by reviewer assignment on MR !1, and its Duo Workflow pipeline 2968122614 succeeded.
- MR !1 was merged. The
mainpipeline 2968415860 passed all five jobs:test,source_policy,release_candidate,publish_pagesandlive_smoke. - The live demo runs on GitLab Pages. All nine deployed assets matched the original CI
release_candidateartifact byte for byte. - 62 automated tests with zero failures (Node.js v24.19.0, 21 October 2026). MIT licensed. No real personal data anywhere.
What we learned
Agentic DevSecOps is most useful when every action is inspectable, bounded and reproducible. Two agents that are designed to disagree, a reviewer and an independent verifier, catch more than one confident agent. A deterministic test suite and a human decision are still the right place to end.
What's next
- An opt-in mode that posts the handoff verdict as a merge request note, so approvers see it inline.
- An optional "propose a fix" step that opens a draft MR for a human to review. It would still never merge on its own.
- GitLab security scanning (SAST, Secret Detection) feeding its reports into the verifier.
- Measuring pipeline energy per release (SCI), to keep the guard cheap to run.
Built With
- css
- gitlab-ci/cd
- gitlab-duo-agent-platform
- gitlab-pages
- html
- javascript
- node.js
Log in or sign up for Devpost to join the conversation.