ArchitectureThree places, one loop.
Insurixa watches what upstream projects retire (Kubernetes APIs, GitLab CI/CD features, OpenTelemetry names) and keeps a service current without a person in the loop. Code decides what is retired and whether a fix is mechanical. GitLab Duo agents handle only the changes that need judgement. Every change ships through the same nine stages a person's change would.
GitLab · does the work
OIDC token
per job
Google Cloud · serves and records
main, nothing elsebrowsers
read live
Runtime · what people touch
The full flow diagram, with the three entry points and the three flows, is on the overview.
Lifecycle coverageAll nine stages, each doing something specific.
Touching a stage counts; Insurixa makes each one do work that only makes sense for this problem. Job names are the real ones in .gitlab-ci.yml.
| Stage | What it does for Insurixa | Where |
|---|---|---|
| plan | Reads what production emits and opens an issue for retired names; the upgrade radar opens issues for removals one release ahead; auto-merge arms Insurixa's own merge requests. | semconv-watch, upgrade-radar, auto-merge |
| create | Code commits every provably safe fix; GitLab Duo flows write the rest: upgrade (issue to merge request), pipeline repair (failed merge request to fix), incident response (incident to fix). | insurixa-safe-fix (runs in verify), 3 Duo flows |
| verify | 17 unit tests; the three packs through the CI/CD component; a telemetry contract that runs the service and reads what it emits; kubeconform strict against Kubernetes 1.33; Ruff with GitLab Code Quality. | insurixa-*-scan, telemetry-contract, kubernetes-schema |
| secure | SAST and secret detection on every merge request and main; their findings feed the policy gate. | semgrep-sast, secret_detection |
| package | Builds the service image per commit and bundles the Kubernetes manifests. The gate image the CI/CD component runs is built first in the pipeline (gate-image), so the component is tested before it is used. | build-image, manifest-bundle |
| release | Release notes for dashboard owners: which names changed and what to update; a tagged GitLab release per shipped change. | release-notes |
| configure | Environment config as code, applied per environment under a resource group; monitor can restore the last good config. | configure-staging, configure-production |
| monitor | After every deploy and every 6 hours, reads production; restores config or rolls back, then opens an incident for the incident flow. | monitor-production |
| govern | Checks insurixa-policy.yml rule by rule, posts the audit where the work started, closes the issue, and writes the pipeline's record to the ledger on Google Cloud. | governance, ledger |
The deploy stage sits between configure and monitor: deploy-staging, validate-staging, deploy-production, deploy-firebase and pages.
AgentsCode decides. Agents judge. Both are measured.
Insurixa upgrade
Issue to merge request: assess, upgrade, ship. Starts from the plan stage's issues and from the upgrade radar (runs 1 and 7).
Insurixa pipeline repair
A merge request failed an Insurixa gate and code could not fix it safely: diagnose from job logs, repair on the same branch (runs 2, 5, 6).
Insurixa incident response
Monitor opened an incident: find the commit and line, keep the teammate's intent, ship the fix (run 3).
Guards that save credits and stop loops
- Each flow's first agent answers
SKIPfor events that are not its job; a router ends the flow before any other model call. - The repair flow skips a failed pipeline that is not for the merge request's latest commit, and stops after two attempts so a person looks.
- When upstream has no replacement (
NO_REPLACEMENT), it explains on the merge request instead of deleting or inventing.
Evaluation on real upstream files
Six files copied unchanged from Argo CD, kubernetes/examples and go-redis, one merge request each. scripts/agent_eval.py grades the final file with code, never a model.
| Case | What makes it hard | Result |
|---|---|---|
| !8 Argo CD nginx Deployment | extensions/v1beta1: apps/v1 needs a selector matching the pod template | repaired, green in 9 min |
| !9 New Relic agent DaemonSet | a trap: the object's labels differ from the pod template's, so copying the wrong ones selects nothing | repaired, chose the template labels |
| !10 Flexvolume installer DaemonSet | privileged hostPath workload; volumes and security context must not change | repaired, template unchanged |
| !11 Argo Workflows, 5 CRDs | apiextensions/v1 needs a structural schema per version; printer columns move into each version | repaired, names and columns kept |
| !12 PodSecurityPolicies | no replacement API exists; the right move is to stop | refused, explained four options |
| !13 go-redis pool metrics | code fixed 6 renames; two histograms had to move from milliseconds to seconds | repaired, values converted |
6 of 6, each in one attempt. Full table: eval/agent/RESULTS.md. Six cases is a small sample; it shows the behaviours, not a rate.
Google CloudWhat runs on Google Cloud, and why there.
Docs, this guide and the playground
insurixa.web.app, served from Google's CDN with HSTS and strict headers. The deploy-firebase job publishes it on every main pipeline that changes it, uploading only changed files. The playground ships the packs from that same commit.
The ledger
The ledger job writes one record per main pipeline: stages, policy verdict, what production emitted, runner time and carbon. Security rules make it public to read and writable only by the pipeline's identity. See it live.
Short-lived identity, no keys
One service account with two roles (firebasehosting.admin, datastore.user). Only this project's main branch can borrow it, for 10 minutes per job.
The service, when billing exists
deploy-cloudrun and deploy/gcp deploy the checkout service keylessly. Cloud Run needs a billing account this project does not have, so the service runs on Render; setting GCP_PROJECT_ID switches it on.
Why this split works
- Zero idle cost. Hosting and Firestore's free tier cost nothing between pipelines; nothing is a server waiting for traffic.
- No server between users and data. The playground runs in the browser and reads production directly; the ledger view reads Firestore directly. Fewer moving parts to secure or keep up.
- Same region as the runners. Firestore sits in
us-east1, where GitLab's hosted runners run, which is also the grid factor the carbon estimate uses. - Everything as code.
firebase.json,firestore.rules, deploy/gcp/firebase-setup.sh and the CI jobs are in the repository.
SecurityKeyless identity, end to end.
main→ id_tokens: OIDC JWT, aud gitlab.com →Google STS→ provider checks project path and ref →federated token→ iamcredentials →10-minute service account token→Hosting, Firestore- No JSON key, no long-lived secret in CI variables. The variables hold only names: provider, service account, site.
- The provider's attribute condition accepts only
gitlab-ai-hackathon/transcend-october-2026/43322398/showcaseonmain; a fork or another branch gets nothing. - The same pattern secures the other external calls: the Vault login in
secrets-syncuses an ID token (run 6), andinsurixa-safe-fixnever runs for merge requests from forks. - Agents run in GitLab's sandbox with no network and may change only the paths their flow allows.
deploy-firebase:
id_tokens:
GCP_ID_TOKEN:
aud: https://gitlab.com
script:
- python scripts/build_site.py public
- python scripts/firebase_deploy.py "$FIREBASE_SITE" public
Live from FirestoreThe ledger: every main pipeline, recorded.
Read straight from Google Cloud by your browser. Older records were backfilled from the GitLab API; new ones are written by the ledger job.
| Pipeline | Trigger | Change | Stages | Policy | Prod retired names | gCO2e |
|---|---|---|---|---|---|---|
| Loading the ledger from Firestore… | ||||||
Production readinessBuilt to run against production, not a demo.
One change at a time
Config, deploys and the production monitor share a resource_group per environment, so two pipelines never change the same environment at once.
Fast feedback, safe deploys
Verify jobs are interruptible and a newer commit cancels them; deploy jobs never are. Stuck runners and registry hiccups are retried.
Self-healing
Monitor restores the last good config or rolls back before opening an incident, and knows when a newer pipeline owns production.
Gates that cannot be gamed
Legacy fixtures are frozen, so an agent cannot pass by editing tests; the telemetry contract runs the real service.
Policy as code
insurixa-policy.yml is checked rule by rule on every merge request and main pipeline, and the audit lands on the issue.
Looks a release ahead
Removals that land next release open an issue now, while the old feature still works (run 7).
EfficiencyCompute and model calls only where they change the outcome.
Measured with the SCI method (SCI = ((E × I) + M) per R), runner time from the GitLab API, and Cloud Carbon Footprint's GCP coefficients for us-east1:
- A change shipped by the agent path costs about 2.30 gCO2e; by code alone 1.93 gCO2e, 16% less and with zero model calls.
SKIPguards end irrelevant sessions in a median 45 s instead of 183 s: 75% less runner time.- Scheduled pipelines only plan and monitor: 64% less runner time than a full pipeline.
- Static hosting and in-browser checks mean no always-on server for docs, playground or ledger.
- Each pipeline's own carbon is now in the ledger above, so the trend is visible, not a one-off claim.
Method, sources and limits: docs/sustainability.md. Model inference is excluded because no public per-request energy data exists.
PositioningHow it compares.
| Approach | Finds removals | Decides safe vs judgement | Fixes | Verifies and ships | Watches production | Ecosystems |
|---|---|---|---|---|---|---|
| Dependency bots (Renovate, Dependabot) | versions, not removed APIs in your files | no | version bumps | through your CI | no | packages |
| Deprecation scanners (Pluto, kubent) | Kubernetes APIs | no | no | no | no | Kubernetes |
| CI Lint | syntax only; passes removed variables | no | no | no | no | GitLab CI |
| General coding agents | from training data; 16 of 17 models wrote retired names | no | yes, unverified | no | no | any |
| Insurixa | from upstream's own data | per finding, in code | code for safe, agents for judgement | 9 stages, policy audit | monitor, heal, incident | Kubernetes, GitLab CI/CD, OpenTelemetry |
Insurixa complements dependency bots: they move versions forward; Insurixa makes sure what you wrote against the old version still works.
Adopt itThree steps for a platform team.
- Include the component:
include: - component: gitlab.com/gitlab-ai-hackathon/transcend-october-2026/43322398/showcase/insurixa@main inputs: paths: "src/" kubernetes_paths: "deploy/" kubernetes_version: "1.33" gitlab_ci_paths: ".gitlab-ci.yml" - Enable the three flows from
.gitlab/duo/flows/in AI › Flows, with their triggers (work item created, pipeline failed). - Optional: run
deploy/gcp/firebase-setup.shonce for keyless publishing and the ledger.
Before any of that, paste a file into the playground to see what it would find.
Path BRequirements, with evidence.
| Requirement | Where |
|---|---|
| Started from an MIT-licensed open-source project | github.com/vignesh2027/attrition (MIT); Insurixa reuses its OpenTelemetry dataset |
| Agentic automation built on or after 5 Oct | three Duo flows, the Steward agent, safe-fix, the packs, the pipeline: all in commits from 5 Oct |
| Deployed, and live until mid-November | checkout production, playground, docs on GitLab Pages |
| Google Cloud bonus: live link and deployment code in the repo | insurixa.web.app (Firebase Hosting) and the Firestore ledger; deploy-firebase, ledger, deploy/gcp/, firebase.json, firestore.rules |
| Most Environmentally Impactful (opt-in) | SCI method and numbers in docs/sustainability.md; per-pipeline carbon in the ledger |
Honest limitsWhat it does not do yet.
- The scanners read files, not rendered Helm output, and the OpenTelemetry pack finds quoted names, not names behind language constants.
- The checkout service runs on Render's free tier, which sleeps when idle; Cloud Run is wired but needs billing.
- The agent evaluation is six cases: enough to show the behaviours, not to claim a success rate.
- Carbon numbers exclude model inference, which has no public per-request energy data.