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:

  1. jira:issuePanel — paste Terraform (.tf) or Kubernetes YAML, Scan, then Suggest verified fix.
  2. 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 agree
    • create-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_16 privileged; MEDIUM CKV_K8S_23_ROOT missing runAsNonRoot; MEDIUM CKV_K8S_11 no CPU/memory limits; MEDIUM CKV_K8S_14 :latest tag (human).
  • Suggest verified fix → verdict verified: fixed 3 (privileged false, pod runAsNonRoot: true, limits cpu: 500m / memory: 256Mi); left :latest for 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, three action modules, Node 22 runtime.
  • Pure JS core under src/core/ (kind detect, rules, intent, LLM mock/Groq, repair loop) so 14 unit tests run with npm test and no Atlassian login.
  • Local CLI bin/shipguard-local.js for offline demos.
  • Panel Vite build → static/panel/build; Rovo prompt in prompts/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 to resolver.handler / rovoActions.*.
  • Pointing the agent prompt resource at . tried to upload node_modules (5000-file limit); narrowed to prompts/.
  • Personal apps are blocked in Developer Spaces; registered into space Niaz Dev instead.
  • niaz.atlassian.net exists but Jira was not activated there — used the Forge demo site for the working install.
  • Non-TTY forge prompts needed a pseudo-TTY (script) plus FORGE_EMAIL / FORGE_API_TOKEN after 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 easebot imports or Checkov/Trivy subprocess adapters in shipguard-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

Share this project:

Updates

Submission history