fix(repo): let dependency updates clear the DCO and title gates - #65
Merged
Conversation
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>
4 tasks
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 Buildand 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:
dco.ymlmatched the trailer against%an <%ae>exactly, so the address failedit.
Signed offis a required check, so this left every dependency updatemergeable only by spending the
OrganizationAdminbypass — the habit ADR 0015was 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 (
%anends[bot]and%aeends[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.ymlsetprefix: 'devcontainer'. Dependabot emits the prefix asthe type, and
devcontaineris a scope. Every dev container updatesince that line was written opened with a title no gate would accept, and
nothing said why:
check:commitsreconciled three copies of the vocabulary anddependabot.ymlwas a fourth it never read.Prefixes become
build(deps),build(deps-dev)andci(deps)— the vocabularythis repository already used in
build(deps): bump the tooling group, dropping ajv-formats— andcheck:commitsnow readsdependabot.ymlandCONTRIBUTING.mdtoo. The check found the drift on its first run:CONTRIBUTING.md was missing
deps-dev.The capitalised subject (
Bump …) is not configurable — dependabot-core decidesit from a heuristic over recent commits.
dependabot-title.ymllowercases itrather than exempting the bot, so the rule stays single and nothing lands on
mainreadingBump.Also
wranglerleaves the tooling group. GOVERNANCE.md names it as the onlydependency 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 recreateon #60 and #61 brings them backcorrectly prefixed and green — merging on CI alone, with no bypass.
Checklist
git commit -s)task ci:lint,task check:types,task check:testpass locally