Inspiration

Life After Code asked what happens when generation is solved. The leftover work is the DevSecOps lifecycle: review, tests, scanners, packages, tags, config, health, and proof. Small teams after codegen still babysit those steps. Stagehand is the night crew that takes that shift.

What it does

Stagehand is a Path A, hands-off control room on GitLab. A human types one sentence on an issue and assigns Stagehand Nightshift. The flow walks the change through all nine GitLab stages: plan, create, verify, package, secure, release, configure, monitor, and govern.

Nightshift labels the issue, opens the branch and merge request, waits on a green pipeline (tests, SAST, secret detection, SBOM, Terraform, SCI gate), and files evidence. The only extra human click in our run was Merge, after GitLab returned 403 insufficient_scope and Nightshift refused to bypass that permission boundary. It then tagged v0.1.0 and recorded SCI 67.15 gCO2e against a 250 g budget.

Public project: https://gitlab.com/gitlab-ai-hackathon/transcend-october-2026/43585257/showcase

How we built it

  • FastAPI Stagehand board plus nine-stage CI in .gitlab-ci.yml
  • Custom Duo agents in agents/ (one per stage) and the Nightshift flow in flows/
  • Triggers: mention, assign, assign reviewer
  • MCP client .gitlab/duo/mcp.json → python -m mcp_server.server for the board, SCI, and evidence
  • MIT license, DCO 1.1, GSF SCI in docs/SCI.md

Challenges

GitLab Duo cloud sessions could not call our stdio MCP tools, so the board record lived in issue notes and pipeline artifacts instead. The merge API 403 was a real gate: we did not force-push around it. Cloud Run is in the repo (infra/terraform, release:cloud-run) but is not live, so we are not claiming the 0.2 Google Cloud bonus.

What's next

Keep Nightshift public through judging. If we add Cloud Run, it stays at min instances 0 so the house does not draw power between shows.

Built With

Share this project:

Updates

Submission history