Inspiration
I work as a DevSecOps engineer and my research is on LLM repair of Infrastructure-as-Code security problems. In my study of 499 Kubernetes and Terraform files, 52.9% of the fixes from openai/gpt-oss-120b that made the scanner pass still failed to deploy or changed what the file does (11.7% for Gemini). Most “AI fixes your IaC” tools stop at “the scanner is green”.
For Codegeist I wanted that missing verifier where software teams already triage work: Jira — and as a Rovo agent teammates can chat with. The idea is the same as my Arbiter entry EASE-Bot (a GitHub Action), but ShipGuard is a new Forge codebase in JavaScript/TypeScript-friendly Node, not a port of that Python Action.
What it does
ShipGuard IaC is an Atlassian Forge app with:
jira:issuePanel— paste Terraform (.tf) or Kubernetes YAML, Scan, then Suggest verified fix.rovo:agent“ShipGuard IaC” with three actions:scan-iac— return findings (severity, ruleId, resource, needsHuman)suggest-verified-fix— LLM repair loop; keep the fix only if intent + re-scan agreecreate-finding-issue— open a Jira Task for findings that need a human
Verified live on SGD-1 (payments-api Deployment):
- Scan found 4 findings: CRITICAL
CKV_K8S_16privileged; MEDIUMCKV_K8S_23_ROOTmissingrunAsNonRoot; MEDIUMCKV_K8S_11no CPU/memory limits; MEDIUMCKV_K8S_14:latesttag (human). - Suggest verified fix → verdict
verified: fixed 3 (privileged false, podrunAsNonRoot: true, limitscpu: 500m/memory: 256Mi); left:latestfor a human. - Rovo agent, given a public-read S3 Terraform snippet, replied with CKV_AWS_70 (HIGH) missing public access block and offered a verified fix.
Forge cannot shell out to Checkov/Trivy/terraform validate, so ShipGuard ships a curated JS rule engine that is also the re-scan verifier. The Groq API key is an encrypted Forge environment variable (api.groq.com egress declared in the manifest).
How I built it
- Forge app (
manifest.yml): issue panel Custom UI + resolver,rovo:agent, threeactionmodules, Node 22 runtime. - Pure JS core under
src/core/(kind detect, rules, intent, LLM mock/Groq, repair loop) so 14 unit tests run withnpm testand no Atlassian login. - Local CLI
bin/shipguard-local.jsfor offline demos. - Panel Vite build →
static/panel/build; Rovo prompt inprompts/agent-prompt.txt. - Deployed to production (shared via install link) and installed on the Forge demo site one-atlas-rfoi.atlassian.net.
Challenges I ran into
- Forge handler paths are resolved under
src/—src/functions/...in the manifest failed lint until flattened toresolver.handler/rovoActions.*. - Pointing the agent prompt resource at
.tried to uploadnode_modules(5000-file limit); narrowed toprompts/. - Personal apps are blocked in Developer Spaces; registered into space Niaz Dev instead.
niaz.atlassian.netexists but Jira was not activated there — used the Forge demo site for the working install.- Non-TTY
forgeprompts needed a pseudo-TTY (script) plusFORGE_EMAIL/FORGE_API_TOKENafter disabling usage-analytics prompts.
Accomplishments that I'm proud of
- End-to-end on a real Jira issue: scan → verified fix → human-deferred
:latest, with matching Rovo behaviour on Terraform. - Verifier discards bad candidates before an engineer sees them.
- Free to run: Groq free tier + Forge development environment.
- Offline-testable core (14/14) for reviewers who cannot install the app immediately.
What I learned
- Platform constraints shape the product: without Checkov in Forge, a honest JS rule engine + clear “not Checkov” messaging is better than pretending.
- The same verified-repair loop maps cleanly to Rovo actions when inputs and descriptions are written for the agent, not only for humans.
- Findings that need a human (image digests, KMS, IAM
*) should be deferred in code, not only mentioned in the prompt.
What's next
- Bitbucket PR panel for IaC diffs.
- Optional Teamwork Graph / MCP bonus modules if time remains before 23 Dec.
- Marketplace listing for the Marketplace bonus once polish and share link are ready.
- Broader rule coverage aligned with the high-signal Checkov IDs from my study.
Built during the event
- During Codegeist (opened 27 Oct 2026): all ShipGuard Forge code, manifest, panel UI, Rovo agent/actions, tests, demo project SGD / SGD-1, deploy + install, and this submission draft/video.
- Before / parallel: research numbers and the verified-repair idea come from my IaC-repair study and from EASE-Bot (GitHub Action, Python). ShipGuard does not reuse EASE-Bot source — it is a new JS Forge app. Confirmed: no
easebotimports or Checkov/Trivy subprocess adapters inshipguard-iac/src. - Tools: I used an AI coding assistant while building; the design, verifier rules, deferred-human policy and evaluation on SGD-1 are mine.
Built With
- atlassian-forge
- devsecops
- groq
- javascript
- jira
- kubernetes
- llm
- node.js
- rovo
- terraform
- vite