Public: anyone can read this; the crew can change it.

Pipeline: approval → live in minutes, robustness kept: gate on impact, parallel lanes, fewer reds, input-addressed results, flags, blue/green #6001

shipped production is serving it opened this has it
opened this

Owner, 2026-10-25: "I really love the robustness of the pipeline… I have appreciated the great uptime… is there any way to improve it? My mind goes to feature flags and blue/green… I would love to 1000x the pipeline speed."

The baseline (probes, 2026-10-25):

  • Landing rate: ~12–15 pulls landed an hour against ~50 opened.
  • The gate: it runs the full suite (checks/tiers.ts "full"), avg 433 s (410–600 s), on a merge candidate of 1–8 pulls. About 4 in 10 gates went red today, and each red costs another full gate per bisect round.
  • The pull check: it runs only the impacted tests (the "fast" tier from checks/impact.ts), ~246 s.
  • Approval to live: hours (queue, then an hourly release).

What "1000×" should mean: not 15,000 pulls an hour. It means the cost and wait of one safe change falls by orders of magnitude, while main stays green and the forge stays up. These levers multiply; each is one or more issues with its own measured before and after:

#LeverMechanismExpected
1Gate on impact, not everythingThe gate runs the union of the batch's impacted tests plus the quick tier. The full suite runs on main right after landing, and a red there is auto-reverted within 5 min (#5994).gate 7 min → ~1–2 min
2Independent lanesPulls whose impacted test sets don't overlap gate in parallel lanes (an app's change never waits behind forge core). The impact map already knows the sets.throughput ×(number of lanes)
3Fewer redsOne file per entry for registries (#5924). Every red names its test (#5994). Bisect in halves.red rate 40% → < 10%, batches stay big
4Never test the same thing twiceResults keyed by the inputs: the tree OID + lockfile + Bun version + shard. An identical candidate or shard is skipped (the one idea worth taking from Dagger).re-gates ≈ free
5Flags make pulls smallUnfinished work lands dark behind a declared flag (core/flags.ts already exists), so big changes become many small, low-conflict pulls. A flag-debt gate keeps flags from rotting.conflicts ↓, pull size ↓
6Deploy every landing, release with flagsEach landing deploys to a green slot (blue/green), canary first (staff, then 10%, then all) on the existing zero-downtime roll. Exposure is a flag flip, so rollback is one switch, not a re-deploy. The hourly release becomes a label, not a gate.approve → live: hours → < 2 min for a flagged change

KPIs (on /flow, #5930):

KPITarget
Approval → live, p50< 10 min (then < 2)
Landed per hour≥ opened
Gate p50< 2 min
Red rate< 10%
Main red minutes per day~0
Forge uptimeunchanged (100%)

Order: 3 and 1 first (they remove today's pain), then 4, 2, 5, 6. Each lever ships behind a capacity setting, so it can be turned back in one step.

commented

Live triage (automatic, not written by a person): no pillar named, so it waits behind the Later gate; name a pillar to move it.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs