Context
Adopting the record (ADR-001) added a Docs workflow that regenerates the
views and commits them back. The repository already had Build README, which
rendered README.md from its templates and committed that back. Both
triggered on changes under docs/, and the record’s views are written to
docs/.
The observed sequence on the first pull request:
- A push ran
Docs. Itsdocs-generatejob regenerated and committed; itsdocs-lintjob checked out exactly the SHA that job output, and passed. Build READMEthen renderedREADME.mdand committed it — becoming the branch tip, after the lint had already run.- That bot commit opened a fresh
Docsrun for the pull request, which GitHub gated ataction_requiredbecause the triggering actor wasgithub-actions[bot]. It had zero jobs and never executed.
So the tip of the branch was never linted, and there was a permanently
unapproved run sitting on the pull request. docs-lint reads
docs-generate’s output SHA precisely to avoid this class of problem, and a
second committing workflow defeats it from outside.
Luria’s generate action had already solved the half it controls: its default
commit message carries GitHub’s skip marker, so its own bot pushes open no
run. Build README carried no marker, and neither did the SVG converter or
the registry builder.
Decision
One job generates and commits. docs-generate renders the README from
its templates — llamero build_template ... --commit=False, which writes the
file and leaves it staged for someone else — and then runs luria’s generate
action, whose git add -A picks up the README along with the record’s views
and makes a single commit carrying the skip marker.
Build README is deleted. Every remaining workflow that commits as the bot
names the skip marker in its message.
The luria actions are pinned to a released tag rather than @main, which is
what their own comments ask for once a project depends on them.
Alternatives considered
- Mark the generated files unscannable. The first fix attempted, and it addressed a different symptom of the same tangle — the reference scanner reading filenames out of a generated file tree. It left both workflows committing, so the unchecked-tip problem survived. Removing a generated inventory and a duplicate committer removed both.
- Have
Build READMErun first andDocssecond. Ordering two independent workflows means guessing at scheduling. They are not independent — one writes what the other reads — so they are one job. - Let the bot’s commits trigger runs, and approve them. Manual approval on every regeneration, forever, for a run whose only purpose is to check work the previous run already checked.
- Status quo. The lint stays green while never seeing the commit anyone will actually merge, which is worse than not having it: it reports safety it is not providing.
Consequences
The README is now regenerated on the Docs workflow’s triggers — pull
requests and pushes to the default branch — rather than on any push touching
docs/. That is broader coverage, not narrower.
llamero’s --commit=False is load-bearing and easy to drop by accident.
If it is ever removed, the old behaviour returns silently: the build still
works, and the lint quietly stops covering the tip. The step carries a
comment saying so.