CI was not the bottleneck, explainer deck

Storyboard view: one scene per row of the companion script, in order. The recording is captured from this same file with the animation runtime inlined; a person records and uploads the video. Scene five is the one bold moment; the close carries the fixed eight-second end-screen hold.

assay  ·  learnings

CI was not the bottleneck

The pipeline finished in five minutes. The acceptance path took six days.

Narration: We were weeks from pricing a CI migration when the measurement came back. The pipeline was fine. Everything after it was not.

The pipelines felt slow.

Delivery was behind, and the migration question was already on the table: which provider to move to.

Before anyone priced runners, we asked a different question.

Narration: The pipelines felt slow, the way pipelines always feel slow when delivery is behind. The question on the table was which provider to move to. Before anyone priced runners, we asked a different question. Where do the hours sit, between a change entering the queue and that change reaching an accepted result?

The instrument is a dwell map.

intake dispatch worker review verified

a timestamp on both ends of every hand-off — one median per edge, trailing month

Narration: The instrument is a dwell map. Take the delivery path apart into hand-offs — intake to dispatch, dispatch to worker, opened to review, merge to verified. A timestamp on both ends of each. A median per edge, over a trailing month.

Three stages turned out to be fast.

opened → first review

12 min

median · n=400 · 28d

one main CI run

5m 37s

11 jobs · all green

ready → merged

12 min

median · n=100 · 7d

Narration: Three stages turned out to be fast. A pull request meets its first reviewer in about twelve minutes. A full CI run finishes in five minutes and change. The human merge gate takes twelve minutes more.

And then the merged change waits.

median per edge — bars drawn to scale

opened → review12 min
ready → merged12 min
one CI run5m 37s
merge → verified6 days

The pipeline was never the constraint.
The acceptance path was.

Narration: And then the merged change waits. Six days at the median — a hundred and forty-four hours — for independent verification to close. The ninetieth percentile is eleven days. The pipeline was never the constraint. The acceptance path was.

86%

of the verification desk's own tool calls went to plumbing — tokens, worktrees, claims, lint — in one forensic pass over 68 transcripts.

The models were not the problem. The plumbing was.

Narration: Why does verification take six days? A forensic pass over sixty-eight verification transcripts found eighty-six percent of the desk's own tool calls going to plumbing — tokens, worktrees, claims, lint — and most of its check tables failing as written on the wrong operating system. The models were not the problem. The plumbing was.

A faster job with a slower acceptance path does not satisfy the goal.

reject: a candidate that loses required coverage

reject: one that changes what a failure means

reject: one that weakens credential isolation

Narration: So: no migration. Instead, a threshold declared before any benchmark runs — what would have to be true for a switch to be worth it. A candidate that loses coverage, or changes what a failure means, is rejected whatever its stopwatch says. A faster job with a slower acceptance path does not satisfy the goal.

assay  ·  learnings

Measure the dwell
before you buy
the runner.

Four or five hand-offs. Timestamps you already have. One median per edge.

Narration: Draw your own map before the vendor demos start. Four or five hand-offs, timestamps you already have, a median per edge. If the hours sit inside the pipeline, buy the runner. If they sit after merge — you know what to fix.