Skip to content

ci: assert the produced tag set on pull requests and write down the verification standard - #24

Merged
smoochy merged 7 commits into
mainfrom
claude/workflow-verification
Aug 23, 2026
Merged

ci: assert the produced tag set on pull requests and write down the verification standard#24
smoochy merged 7 commits into
mainfrom
claude/workflow-verification

Conversation

@smoochy

@smoochy smoochy commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Closes #20.

Issue #20 asked whether this repository wants a local dry-run path for its build workflow, and listed three candidates. This branch answers all three.

act is rejected. The decide step calls crane against caddy:latest and the GitHub API, so a local run is not hermetic. act cannot reproduce the multi-arch push or the crane copy mirror, which is exactly the part no static check covers. What a local run would prove is already proven more cheaply by the static checks and by the new assertion, in the place that gates a merge. Against that, it costs a Docker-in-Docker setup in a repository with no other local toolchain.

The pull request now asserts the tag list it produced. A new Assert produced tag set step runs on pull requests only, and only when do_build is true, comparing the tag set docker/metadata-action produced against the set the decide step's caddy_tag implies. It compares by set membership plus a count rather than by string equality, so a change in how the action renders its output cannot fail the job on its own. It never runs on push, schedule or workflow_dispatch, so it cannot fail a publishing build.

The standard is written down. README.md gains a "Workflow Verification" section naming each layer: the static checks before review, actionlint and the tag assertion in CI, and the run on main as the first real execution. It states plainly what is not verified before a merge, and records the act ruling with its reason. CLAUDE.md gains one pointer line to it.

The run record and report are in docs/assembly-line/2026-08-24-workflow-verification/.

Two things worth a reviewer's attention. First, do_build is not always true on a pull request: the trigger's path filter evaluates the pushed commits' diff while Classify local changes diffs base to head, so a pull request whose later commit reverts an earlier change re-triggers the workflow with both change flags false. That is why the assertion step carries the do_build guard. Second, this branch was rebased onto the actionlint merge from #23, which landed while the work was in flight, and the README section names that layer.

Generated by an assembly-line run with two inspectors per package.

smoochy and others added 7 commits August 24, 2026 00:49
Add a step after the metadata step that fails the job when the tag set
produced by docker/metadata-action does not match the expected set for
the current caddy_tag, so a change to the tag logic is caught in CI
instead of relying on manual review. The check runs only when the
pull_request event triggers a build and compares by set membership
plus count, not by exact string or line order.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Add a Workflow Verification section to README.md that states what the
pull request tag assertion, the pull request build with push: false,
the local static checks, and the live scheduled run each cover, and
what is not verified before a merge. Record the act ruling with its
reason. Add the matching table of contents entry and a pointer line
in CLAUDE.md outside the OpenWiki marker block.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The section claimed every scheduled run and every push to main does a
real multi-arch publish and crane copy mirror. That is false: a push
only forces a build when Dockerfile-cloudflare or .dockerignore
changed, a scheduled run never forces one, and the decide step still
gates a real publish behind detecting an upstream change either way.
Rewrite both paragraphs to say what the decide step and the mirror
step's condition actually guarantee, and drop the duplicated cron
time in favor of pointing at "When Builds Run".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
README.md's Workflow Verification section now names the actionlint CI
job from PR #23 and reframes the local static checks as a fast
pre-review pass rather than the only gate.

The run-record's stale-worktree finding now records what was observed
and when, and that it resolved on its own via PR #23 once this branch
was rebased onto main, instead of asserting a now-false current state.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@smoochy
smoochy merged commit 9b9cb07 into main Aug 23, 2026
4 checks passed
@smoochy
smoochy deleted the claude/workflow-verification branch August 23, 2026 23:00
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.

The build workflow has no executable verification path

1 participant