bug(deploy): a bot-published release does not fire deploy.yml — every automated cut publishes without deploying #40
Labels
No labels
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
status/deferred
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/purser#40
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What happened
The
v0.2.0cut succeeded end to end and the deploy never ran. purser is still serving the previous image.deploy.ymlison: release: types: [published]. A non-draft release was published. The workflow did not run.The zero is real, not a filter artifact.
deploy.yml's job is nameddeploy purser to /srv/docker/purser, so adeploy-substring filter would match it; it appears in none of the distinct job names across 237 runs returned by the same query (non-zero result ⇒ the query works).Probable mechanism — labelled probable, NOT measured
v0.1.0is fully explained by absence (measured previously by @quartermaster, and it must not be generalised — see #36).v0.2.0is not explained that way: the workflow is present and the trigger event occurred.The one variable that changed is who published the release.
release.ymlusessecrets: inheritwith no dedicated release token, so the release is created by the Actions token and appears asGhost. That is consistent with Forgejo suppressing workflow events generated by its own Actions token — the same anti-recursion safeguard recorded in/srv/CLAUDE.mdfor bot-token pushes producing zero commit statuses.⚠️ Not confirmed. The discriminator is a human-published release firing the deploy, which cannot be run cheaply without another cut. Do not fix on this hypothesis before testing it — the same "plausible mechanism, never verified" shape cost most of 2026-08-06 on this repo.
Why it matters
On the automated path, every cut publishes and never deploys.
#19's pipeline is inert exactly where it was built to run, and it fails silently — green release job, published release, no red anywhere. Absence of a signal is not evidence of health.It also means
v0.2.0is released but not deployed, and will stay that way; the plan is to supersede it rather than back-fill.Scope
release: publishedevent here.release.ymldirectly rather than via areleaseeventAcceptance criteria
They are struck rather than ticked because none of them was true at close time, and ticking a
state-assertion that the substrate does not back is the failure
/srv/CLAUDE.md§ Acceptance-criteriatick discipline exists to prevent. The ticked line above is an action AC — the supersession is what
actually happened, and it is verifiable.
- [ ] Mechanism confirmed by measurement, not inference; the confirming observation recorded here- [ ] An automated release cut results indeploy.ymlrunning- [ ] Verified on a real cut (v0.3.0), not only in dry-run — the deployed binary reports the new version- [ ] A cut that publishes without deploying is detectable without someone thinking to lookLive status of each, on #39:
⚠️ I closed this tracker and left four unticked state-assertions behind, which is exactly the
closed-with-unticked drift
scripts/ac-state-audit.py --closed-untickedscans for. Filing theduplicate-close was correct; leaving the ACs in a state that reads as abandoned work was not.
Related
#19— the deploy pipeline this makes inert#36— release/deploy facts measured during the stuck cut; thev0.1.0deploy.yml-absent precedent and why it must not be generalised#32— rollback on failed probe; landing before the first real deploy/srv/CLAUDE.md§ reflex table, A GATE'S SILENCE — passed and never-ran emit the same absence of redAnchor
Measured by Bosun 2026-08-06 immediately after the operator's
v0.2.0cut. Service was never at risk: nothing was replaced, no probe fired, no rollback needed.Closing as duplicate of #39, which @engineer filed a minute earlier and which traces the mechanism further — down to purser having no
RELEASE_TOOLKIT_TOKEN, so the release is created by the Actions token. Measurements, eliminated alternatives, the discriminator and the ACs from this tracker are folded into #39. Nothing here is lost; do not work from this one.