Skip to content

fix(repo): let dependency updates clear the DCO and title gates - #65

Merged
justinmerrell merged 1 commit into
mainfrom
fix/dependency-update-gates
Aug 25, 2026
Merged

fix(repo): let dependency updates clear the DCO and title gates#65
justinmerrell merged 1 commit into
mainfrom
fix/dependency-update-gates

Conversation

@justinmerrell

Copy link
Copy Markdown
Contributor

Closes the two stuck Dependabot pull requests, #60 and #61, by fixing what
actually rejected them — which was not the dependency in either case. Lint,
Schema, Site Build and the whole Dev Container workflow pass on both.

The DCO check rejected a sign-off that was there

Dependabot signs its commits. It authors them as one identity and signs them as
another:

author:  dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
trailer: Signed-off-by: dependabot[bot] <support@github.com>

dco.yml matched the trailer against %an <%ae> exactly, so the address failed
it. Signed off is a required check, so this left every dependency update
mergeable only by spending the OrganizationAdmin bypass — the habit ADR 0015
was written to end, recreated for a class of change nobody would think to look
at.

A GitHub App's sign-off is now matched on name, and only when both halves
of the author identity say bot (%an ends [bot] and %ae ends
[bot]@users.noreply.github.com). Verified against the real commits on #60 and
#61, and against five negatives — an unsigned human, a human signing under a
different address, a bot name with a human address, a bot signing under someone
else's name, all still rejected.

The title check rejected a prefix the config could never have got right

dependabot.yml set prefix: 'devcontainer'. Dependabot emits the prefix as
the type, and devcontainer is a scope. Every dev container update
since that line was written opened with a title no gate would accept, and
nothing said why: check:commits reconciled three copies of the vocabulary and
dependabot.yml was a fourth it never read.

Prefixes become build(deps), build(deps-dev) and ci(deps) — the vocabulary
this repository already used in build(deps): bump the tooling group, dropping ajv-formats — and check:commits now reads dependabot.yml and
CONTRIBUTING.md too. The check found the drift on its first run:
CONTRIBUTING.md was missing deps-dev.

The capitalised subject (Bump …) is not configurable — dependabot-core decides
it from a heuristic over recent commits. dependabot-title.yml lowercases it
rather than exempting the bot, so the rule stays single and nothing lands on
main reading Bump.

Also

wrangler leaves the tooling group. GOVERNANCE.md names it as the only
dependency here handed a credential and rests its guarantee on that pin moving
"through a diff someone opened deliberately"; inside the group it would move in
four other packages' lockfile churn.

Rationale in ADR 0016.

Next

Once this is on main, @dependabot recreate on #60 and #61 brings them back
correctly prefixed and green — merging on CI alone, with no bypass.

Checklist

  • Commits are DCO signed off (git commit -s)
  • Commit messages are Conventional and correctly scoped
  • task ci:lint, task check:types, task check:test pass locally
  • No specification prose, schema, or conformance fixture is touched

Dependabot's two open pull requests were red on the same two checks, and
neither failure was about the dependency.

The DCO check rejected a sign-off that was present. Dependabot authors as
`dependabot[bot] <…@users.noreply.github.com>` and signs off as
`dependabot[bot] <support@github.com>`, and dco.yml demanded the two match
exactly. Since `Signed off` is a required check, that left every dependency
update mergeable only by spending the org-admin bypass — the habit ADR 0015
was written to end. A GitHub App's sign-off is now matched on name, with both
halves of the author identity required to say bot.

The title check rejected a prefix the config could never have got right:
`prefix: 'devcontainer'` is a scope where Dependabot emits a type. Prefixes
become build(deps), build(deps-dev) and ci(deps) — the vocabulary PR #5
already used — and check:commits now reads dependabot.yml and CONTRIBUTING.md
alongside the three copies it reconciled, so the next one fails at the hook
rather than a week later in a bot's pull request. CONTRIBUTING.md had already
drifted; it was missing deps-dev.

Dependabot's capitalised subject is not configurable, so a normaliser
lowercases it rather than exempting the bot from the rule.

Also excludes wrangler from the tooling group: GOVERNANCE.md rests its
guarantee on that pin moving through a diff someone opened deliberately, and
inside the group it would move in someone else's lockfile churn.

See docs/adr/0016-dependency-update-policy.md.

Signed-off-by: Justin Merrell <merrelljustin@gmail.com>
@justinmerrell
justinmerrell merged commit 99ddafa into main Aug 25, 2026
7 checks passed
@justinmerrell
justinmerrell deleted the fix/dependency-update-gates branch August 25, 2026 16:44
justinmerrell added a commit that referenced this pull request Aug 25, 2026
The normaliser added in #65 was a workflow of its own, on the assumption that
its retitle would re-run the title check. It does not: a retitle made with
GITHUB_TOKEN does not trigger a new workflow run — GitHub suppresses that to
prevent loops — so the check sits on the red it produced before the edit, with
a title that is now correct.

Both recreated Dependabot pull requests showed it. #66 stayed red with a
correct title until the run was re-run by hand. #60 went green, but only
because Dependabot pushed again a minute later.

Folding the step into the `Conventional PR title` job removes the second event
from the picture entirely. It works because the action re-reads the title from
the REST API rather than the event payload, deliberately and for exactly this
reason — re-running the stale failed run on #66, with its original payload,
passed.

Costs lint-pr.yml `pull-requests: write`. It has no checkout step and takes
every pull request value through `env:`, which is what makes that safe on
pull_request_target; both are now stated in the file.

Signed-off-by: Justin Merrell <merrelljustin@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant