ForgeFX Simulations

Incident explainer / Vercel deployment queue

Queue overload, in plain English

500 Builds Waiting

The healthy target is 50 or fewer. The queue is holding 450 too many deployment records, with an average wait of 1 hour 26 minutes and an oldest wait of 3 hours.

1h 26maverage wait
3holdest wait
ally: 14most affected project
Queued deployment records 500 total
50 = healthy ceiling

Each square is one queued deployment record. Green is the entire desired queue; red is overload.

+450 OVER
01 / IDENTITY

What Does “adamo-bot: 500” Mean?

It is an author stamp on deployment records, not a count of unique changes made by one bot.

deployment / 497trigger: adamo-bot
deployment / 498trigger: adamo-bot
deployment / 499trigger: adamo-bot
deployment / 500trigger: adamo-bot
Same Trigger Identity 500 queued records carry this stamp

It Does Mean

The same automation identity authored or triggered all 500 queued deployment records.

It Does Not Mean

One bot performed 500 unique app changes. It also does not mean AdamoBot is a Vercel project with 500 builds.

Why the identity count is still useful

It ties the records to one automation channel. That makes the origin traceable, but the project and commit fields explain how a small number of repository changes multiplied into hundreds of deployment rows.

02 / FANOUT

One Commit Can Become 51 Deployments

In a monorepo, Vercel projects watch the same repository. A routine maintenance commit can be interpreted as work for many projects, even when it genuinely changed only a few apps.

1maintenance commit

One repository event lands.

~51 Vercel projects evaluate the same commit. Gold marks ally, the current leader with 14 queued rows.

51deployment rows

Top commit 2047d2d462a1

The top commit generated 51 deployments. That is fanout: one commit, many project-level queue records.

03 / SNOWBALL

Commits Arrived Faster Than Vercel Drained

Each repeated commit produced another fanout wave. Newer rows piled up behind older rows for the same projects, creating duplicate, superseded work.

commit 1
commit 2
commit 3
commit 4
commit 5+
500

This is accumulation, not 500 separate ideas. Repeated repository events multiplied across projects while earlier deployment rows were still waiting.

Why duplicates remain in the queue

For a given project, an older queued build may already be obsolete because a newer commit is waiting behind it. Unless the older row is prevented or safely canceled, Vercel continues treating it as pending work.

04 / FILTERS

The Existing Filter Acts Too Late

The current Ignored Build Step can cancel after a deployment reaches build processing. The better control is Skip unaffected projects, which prevents unrelated deployment records before they enter the queue.

Ignored Build Step

Late filter: the record already exists and has entered deployment processing.

01 / QUEUEpressure consumed
02 / PROCESSslot evaluated
03 / CANCELtoo late

Reduces build work, but still creates queue and concurrency pressure.

Skip Unaffected Projects

Early filter: Vercel checks whether the project changed before creating the deployment.

01 / CHECKunaffected?
02 / QUEUEonly if affected
03 / BUILDreal work only

Prevents unrelated deployments before they can consume queue capacity.

33 enabled
2 disabled
22 unset

57 audited / 24 need repair

05 / CLEANUP

Safe Cleanup Keeps the Newest Queued Build

The reducer only considers QUEUED rows. Per project, it preserves the newest queued deployment and removes older queued copies that the newest one supersedes.

Example projectnewest first
Commit D
4 min ago / newest
KEEP QUEUED
Commit C
31 min ago / superseded
CANCEL QUEUED
Commit B
1h 18m ago / superseded
CANCEL QUEUED
Commit A
2h 42m ago / superseded
CANCEL QUEUED
Pass 1 / Superseded copies

Preserve the newest queued row per project. Cancel only older queued rows for that same project.

Pass 2 / Unrelated fanout

Cancel queued rows for projects the commit did not genuinely touch. Preserve affected apps.

Never touched by this reducer
BUILDINGINITIALIZINGREADYERRORCANCELEDBLOCKED
Current dry-run evidencePREVIEW ONLY
405superseded candidates
490unrelated-fanout candidates
0cancellations performed

Candidate groups can overlap. Do not add 405 and 490 together. The dry run identifies records; it has not mutated production.

06 / PREVENTION

Fix the Source, Then Hold the Line

Cleanup restores capacity once. Prevention keeps routine repository activity from rebuilding the same queue.

Repair Project Settings

Enable Skip unaffected projects for all 24 projects currently disabled or unset.

Teach Vercel the Workspace

Classify top-level channels, docs, and .forgebot content as workspace packages so affected-project logic can reason about them.

Stop Accidental Artifacts

Do not land routine-generated app artifacts unless the app change is intentional.

Make Audits Enforce It

Fail deployment configuration audits whenever affected-project skipping is absent.

500
current queued records
≤50
healthy queue target
The whole incident in one sentence

Repeated maintenance commits fanned out across many Vercel projects faster than the platform could drain them, while the current build filter acted after queue creation; safe cleanup removes obsolete queued records, and early affected-project skipping prevents the next pileup.