Zero Downtime Hackathon · Port · Bright Data · SigNoz · Claude Code

Release engineering
for agent-written fixes

Agents already write the fix. The failure mode isn't "the agent can't fix it" — it's "the fix is subtly wrong and ships." Canary Refinery canaries every agent-authored change against production data, lets SigNoz decide rollback or promote, and makes Port hold the human gate. Users never see a bad number — even when the agent is wrong.

0
Bad-data-minutes served
3
Config versions shipped
1
Wrong fix caught by canary
1
Human approval
100%
Repeatable — same brief, same sequence

Product · PricePulse wall · replay of a real run

This is the product. Press BREAK.

The real PricePulse projector UI, fed by telemetry recorded from an actual run of the factory (57 frames, one per second). It auto-plays here; open it full-screen to drive it yourself — BREAK injects the bait, the loop repairs, the canary catches the wrong fix, and it waits for you to tap APPROVE.

BREAK: app stays on last-good with a STALE badge
Canary diverged: $129,900 vs $1,299, rolled back
v3 healthy, waiting for human approval
Promoted v3, bad-data-minutes 0

Mission profile · T+ from BREAK

Press BREAK. Watch the agent get it wrong. Watch nobody get hurt.

Four minutes, one button, one tile that never moves. Everything below happens live; the only thing seeded is the bait that makes the agent's first fix subtly wrong — and we say exactly how.

  1. Break

    A judge presses the Port self-service action. The store's markup changes: cents in data-price, a was price, split digits. SigNoz freshness goes red → FreshnessBreach webhook → the Mayor opens bead REP-001 → a polecat spins up in a git worktree. PricePulse still shows $1,299 with a STALE badge. Bad-data-minutes: 0.

  2. Ralph loop

    until ./verify.sh …; do claude -p "$(cat PROMPT.md)"; done. Iteration 1: 4/7 checks. Iteration 2: 7/7 — candidate v2. Each iteration is a span.

  3. Canary diverged

    The Refinery ships v2 on 5 of 50 pages. SigNoz split dashboard: canary parse_ok 100 % … canary price median $129,900 vs prod $1,299. By every check the agent had, this fix was perfect.

  4. Rollback, by alert

    CanaryDiverged → Port automation → rollback. Evidence attached to the Release. Tile: still 0. "The agent was wrong, and nobody got hurt."

  5. Loop learns

    The canary diff lands in PROMPT.md — "page P07 expected ≈1299, got 129900 — check units". v3 passes in one iteration. The caught case is banked as a regression fixture and verify.sh grows a magnitude check.

  6. Human decision

    The Witness dropped the site's autonomy tier to approve-required after the rollback. v3 waits in Port with the canary snapshot, diff and trace link. A judge taps Approve → promote → 50/50 pages on v3.

  7. Nominal

    The SigNoz timeline reads like a release log; Port's audit reads v1 → v2 rolled back (evidence) → v3 promoted by <judge>. Run it again: same brief, same sequence.

Vehicle · Gas Town roles · one Ralph loop

Separation of duties is the product

You can collapse the processes; you shouldn't collapse the permissions.

Mayor

Reads SigNoz alerts and Port actions, opens beads, dispatches polecats, runs the production scrape on the promoted config.

Never edits rules

Polecat

One repair job in a throwaway git worktree. Runs the Ralph loop with an allow-listed tool set until verify.sh is green.

Cannot promote

Refinery

Canaries the candidate on 10 % of pages, compares to last-good, promotes or rolls back — only on production evidence. Banks regressions; tightens verify.

Never edits rules

Witness

Watches for stuck loops and cost, keeps the autonomy tier (auto → approve after a rollback), escalates to a human through Port.

Cannot edit · cannot promote
# factory/ralph.sh — dumb, relentless, bounded
until ./verify.sh "$RULES"; do
  i=$((i+1)); [ "$i" -gt "$MAX_ITER" ] && exit 2
  python -m factory.agent --rules "$RULES" --prompt PROMPT.md --iteration "$i"
done
# brief/constraints.yaml — what the factory is held to
slo:      { freshness_seconds: 20, bad_data_minutes: 0 }
canary:   { fraction: 0.10, drift_band_pct: 20, healthy_after_seconds: 15 }
repair:   { max_iterations: 8, max_cost_usd: 2.00 }
autonomy: { default_tier: auto, drop_to_approve_after_rollback: true }

Payload · what the sponsors' tools carry

Load-bearing, not bolted on

Remove any one of them and the loop stops being safe.

Port

Control plane · human boundary · audit
  • The brief → AI Builder Plan → blueprints, actions, automations → Build.
  • inject_site_change is BREAK; approve_release has requiredApproval — the human decision on stage.
  • Every Release carries drift, parse rate, evidence, trace id, approver. Audit answers "why is v3 in prod?"
  • Claude Code talks to Port through the Port MCP server.

Bright Data

The artifact under release control
  • The versioned Scraper Studio rules file is what gets repaired, canaried, promoted and git-tagged.
  • Pin a collector id and the same file runs through Bright Data; a bdata scraper heal is just another candidate — it still has to survive the canary.
  • Drift detection is automatic; recovery is the loop; PricePulse serves only promoted data.

SigNoz

The judge, not the dashboard
  • Spans per page with config_version and lane; gauges for freshness, price median by lane, canary drift, bad-data-minutes.
  • Four alert rules — FreshnessBreach, CanaryDiverged, CanaryHealthy, RepairStuck — webhook the Mayor. SigNoz decides promote vs rollback.
  • Alerts → retries → escalation is the factory's spine.

Launch · 60 seconds · no accounts needed

Quickstart

Fully offline by default: a deterministic scripted agent and a local alerter that speaks SigNoz's webhook format. Flip env switches to go live with Claude Code, SigNoz Cloud, Port and Bright Data.

git clone https://github.com/vnmoorthy/canary-refinery && cd canary-refinery
make setup     # uv venv + deps
make up        # store :8701 · PricePulse :8702/wall · Mayor :8703
make break     # VARIANT=3 — the bait
make approve   # when the tier asks for a human
make test      # incl. the scripted end-to-end loop

Seeded vs live

The wrong fix is seeded: verify.sh v1 checks parse rate, nulls, types and schema — deliberately not magnitude — and the bait puts the price in cents in a clean data-price attribute. The canary catching it is real; the rollback, evidence injection, regression banking and tier drop are real; the approval is a real human tap.

With AGENT=claude the live agent may get it right first time. Then the canary promotes cleanly and make replay re-runs the banked wrong-fix path — and we say so.

Telemetry · one trace, one audit trail

Reads like a release log

Every transition is a canonical event in SigNoz, Port and the local mirror. This is the sequence the factory emits, every run.

Rubric map for judges

Office hours

Hard questions

Isn't this just Argo Rollouts / LaunchDarkly for a config file?

Those canary on 5xx and latency. We canary on data correctness — parse rate, null rate, distribution drift vs last-good — for a change a human never wrote, and the rollback feeds the evidence back into the agent loop and tightens the next verify. Nothing today does evidence-gated promotion for agent-authored commits.

Why not just write a better verify.sh?

We do — every caught case becomes a check (you watch the magnitude rule land). But you can't enumerate every way a fix can be subtly wrong before you've seen it. Verify catches what you knew; canary catches what you didn't.

Why scrapers? Who pays, for what?

Scrapers are the wedge because the output is objectively measurable and agent churn is highest. The buyer is the data-platform team; the unit is a protected pipeline; the metric is bad-data-minutes. The same gate generalizes to ETL transforms, prompt changes, feature-flag rules.

Mayor, polecats, Witness, Refinery — isn't this a cron and an if-statement?

The roles are separation of duties: the thing that writes the fix can't promote it; the thing that promotes only acts on production evidence; the thing that watches for stuck loops can't edit code. Beads make every run replayable — that's how we show repeatability.

Flapping, legitimate 30 % price moves, unrepresentative canary slices?

Drift band and canary size are per-site policy in the brief; a diverged canary escalates to a human with evidence rather than blocking forever; canary pages are stratified by price band. We'd rather false-block and ask than false-promote.