The host ignore step skipped on author, and dropped three registry deploys
Date: 2026-08-31 Status: closed Supersedes: none Superseded-by: none — current
Context
Section titled “Context”petrova-host builds from the repo root. scripts/vercel-build.sh stages registry.yaml,
registry.schema.json, state/, docs/, contracts/, spec/, schemas/, core/,
cli/dist and the host and dashboard builds into the function bundle, so those paths are its
build inputs.
scripts/vercel-ignore.sh deliberately excluded it, and the reasoning was about cost and was
correct: re-measured over the 265 non-merge commits on main since 2026-08-20, only 4 (1.5%)
touch none of its inputs. There is no meaningful saving here.
What the reasoning did not cover is that the project was not unguarded. It carried an Ignored Build Step in the Vercel project settings, invisible to this repo:
if git log -1 --pretty=%an | grep -qiE "\[bot\]"; then echo "skip: bot commit"; exit 0; fi;npx --yes turbo-ignore 2>/dev/null; if [ $? -eq 0 ]; then exit 0; else exit 1; fiThe first arm skips on the author of a commit. The second cannot fire at all — this repo has
no turbo.json, so turbo-ignore infers a package name, finds no graph, and fails open.
Every commit petrova-act[bot] has landed on main since 2026-08-20 was therefore skipped.
There are three, and all three changed host build inputs:
| commit | subject | outcome |
|---|---|---|
fd01b9b8 | act(petrova): edit registry for console (#384) | CANCELED |
02994347 | act(petrova): register consumer console (#381) | CANCELED |
c2bc471b | act(petrova): reconcile drift for null0-toll | CANCELED |
Read from the build log of the first:
Running "if git log -1 --pretty=%an | grep -qiE "\[bot\]" ... "skip: bot commitThe Deployment has been canceled as a result of running the command defined inthe "Ignored Build Step" setting.These are control-plane writes — the registry edits the petrova-act path exists to make — and
they did not reach production. The surface has been serving a registry older than the ledger
says it is, and nothing reported it, because a cancelled deployment is a normal-looking event.
Decision
Section titled “Decision”Add a host surface to scripts/vercel-ignore.sh with the real input list, and set
ignoreCommand in the root vercel.json so it overrides the settings-UI string. The author
check is not carried forward in any form: a guard that skips on who wrote a commit cannot be
right about what the commit did, and it is wrong in both directions — a bot commit that
changes the app is skipped, and a human commit that changes nothing is built.
This is a correctness change, not a cost change. It is expected to skip roughly 1 commit in 65 and its purpose is to stop skipping the other 64. The cost lever for this project is deployment frequency and is addressed separately.
Input list, from scripts/vercel-build.sh rather than from the directory layout:
cli host dashboard state docs contracts spec schemas core registry.yaml registry.schema.json package.json package-lock.json vercel.json scripts/vercel-build.sh scripts/vercel-ignore.sh.
The guard script lists itself: a change to the predicate should rebuild the surface it guards.
Alternatives considered
Section titled “Alternatives considered”- Delete the settings string and run unguarded — rejected. It fixes the wrong skips and leaves the project with no rule under review, which is how the broken string survived.
- Keep the bot arm and add a path check — rejected. The bot arm has no correct use here; the path check subsumes every case it was standing in for.
- Leave it alone because the saving is 1.5% — rejected once the three dropped deploys were found. The finding is not about minutes.
Consequences
Section titled “Consequences”- Bot-authored commits that change host inputs now deploy. The three above are already
superseded by later deploys of
main, so no backfill is required. - Roughly 1 commit in 65 will skip where it previously built.
- The settings-UI string is overridden by
vercel.jsonand should be cleared in the UI when convenient, so two rules do not sit in two places.
Verification
Section titled “Verification”Run from the repo root as Vercel invokes it, against real commit ranges on origin/main:
| case | expected | got |
|---|---|---|
fd01b9b8 (bot, registry edit) | build | build |
02994347 (bot, register consumer) | build | build |
c2bc471b (bot, reconcile drift) | build | build |
d663755a (CLAUDE.md only) | skip | skip |
1de9675d (two workflow files) | skip | skip |
7435aacf (eight SKILL.md) | skip | skip |
4010cd04 (.gitignore) | skip | skip |
| unknown surface | build | build |
| base unreachable after deepening | build | build |
That is all four of the 4/264 non-input commits, and all three of the wrongly-skipped ones.
Sign-off
Section titled “Sign-off”- subagent: claude-sonnet-5, re-verified 2026-09-04 — author-skip logic confirmed absent
from
scripts/vercel-ignore.shat HEAD (negative evidence, not merely untriggered); re-ran both falsifiers againsthostlive:4010cd04(should-skip) → skip, exit 0;fd01b9b8(should-build) → build, namesregistry.yamlexactly as this doc predicts. - human: alex@devarno.com