fix: A release that released nothing is neither a success nor a failure #81

Closed
opened 2026-09-09 18:56:46 +00:00 by ahmad · 1 comment
Owner

Context

A merge that warrants no release still sends a release notification, and that notification claims an outcome that did not happen.

ahmad/trip announced its last such run as ❌ failure. Its status expression still asks whether publish succeeded, and on a no-release run publish is skipped — so the expression falls through to failure. #72 fixed exactly this in six repositories; ahmad/trip and ahmad/portfolio were never converted and still carry the old expression.

The converted repositories are better but still wrong in a quieter way: they report ✅ success. Nothing succeeded — nothing ran. The reader cannot tell a release that worked from a merge that released nothing, which is the distinction they actually want at a glance.

notify-telegram documents skipped as a valid status but has no branch for it, so it lands on the catch-all warning icon — a normal, expected outcome dressed as something to look at.

Scope

  • In: a distinct, calm status for "nothing to release" in notify-telegram; the shared release template sending it; the two repositories that never adopted #72.
  • Out: whether a no-release run should notify at all (a separate question for the owner); the notify job's own resilience (#65).

Acceptance criteria

  • Given a run that released nothing, when the notification is sent, then its status is neither success nor failure, and its icon is distinct from both.
  • Given a release that published and deployed, then it still reports success exactly as now.
  • Given any job in the release genuinely failing, then it still reports failure — the new state must not swallow a real failure.
  • Given notify-telegram, then every status it documents has an explicit icon, and an unknown status still falls back rather than failing.
  • Given the shared template, then a consumer copying it gets all three outcomes without writing an expression of its own.
  • Given every repository that sends a release notification, then a follow-up issue exists for it, and ahmad/trip and ahmad/portfolio are fixed as part of this one because they are wrong today, not merely imprecise.
### Context A merge that warrants no release still sends a release notification, and that notification claims an outcome that did not happen. `ahmad/trip` announced its last such run as **❌ failure**. Its status expression still asks whether `publish` succeeded, and on a no-release run `publish` is skipped — so the expression falls through to `failure`. `#72` fixed exactly this in six repositories; `ahmad/trip` and `ahmad/portfolio` were never converted and still carry the old expression. The converted repositories are better but still wrong in a quieter way: they report **✅ success**. Nothing succeeded — nothing ran. The reader cannot tell a release that worked from a merge that released nothing, which is the distinction they actually want at a glance. `notify-telegram` documents `skipped` as a valid status but has no branch for it, so it lands on the catch-all warning icon — a normal, expected outcome dressed as something to look at. ### Scope - In: a distinct, calm status for "nothing to release" in `notify-telegram`; the shared release template sending it; the two repositories that never adopted `#72`. - Out: whether a no-release run should notify at all (a separate question for the owner); the notify job's own resilience (`#65`). ### Acceptance criteria - [ ] Given a run that released nothing, when the notification is sent, then its status is neither success nor failure, and its icon is distinct from both. - [ ] Given a release that published and deployed, then it still reports success exactly as now. - [ ] Given any job in the release genuinely failing, then it still reports failure — the new state must not swallow a real failure. - [ ] Given `notify-telegram`, then every status it documents has an explicit icon, and an unknown status still falls back rather than failing. - [ ] Given the shared template, then a consumer copying it gets all three outcomes without writing an expression of its own. - [ ] Given every repository that sends a release notification, then a follow-up issue exists for it, and `ahmad/trip` and `ahmad/portfolio` are fixed as part of this one because they are wrong today, not merely imprecise.
ahmad self-assigned this 2026-09-09 18:56:56 +00:00
ahmad 2026-09-09 18:58:29 +00:00
Author
Owner

All thirteen consumers now have a pull request.

Repository Issue State
ahmad/trip #144 merged fc69142
ahmad/portfolio #91 merged 9944df5
Bayan/bayan-web #35 merged 499d3aa
Bayan/kidpoints #214 merged 2cd62ad
Bayan/stem #19 merged d9b7f5d
ahmad/expiro #88 merged e867aeb
ahmad/imamah #163 merged f303546
ahmad/launchpad #89 PR 90, ready
ahmad/namey #82 PR 86, ready
suhba/khitta #58 PR 59, ready
suhba/suhba-docs #18 PR 19, ready
suhba/suhba-web #45 PR 46, ready
ahmad/larda #75 PR 78, ready

Two things found in the doing that were not in the issues:

The family contained two different bugs. ahmad/trip and ahmad/portfolio asked whether publish succeeded, so a no-release run returned 'failure' — a false failure, which is why those two were the P1s. The other eleven had already taken #72's intermediate fix, tolerated a skipped publish, and returned 'success'. Evaluating the old expression in each repository is what distinguished them; the issue text alone did not.

One repository could not take the expression verbatim. ahmad/namey's notify has a fourth dependency, dashboard, which this template does not model. Copying character-identically would have satisfied "matches the shared template" and left a failing dashboard reporting success — the same collapse, one job over. It is extended there, in the same two positions, with the reason written into the workflow.

Every one was verified by evaluating the expression against all eight (nine for namey) reachable combinations of needs.*, and by confirming per repository that notify depends on version and that version declares the released output the expression reads.

All thirteen consumers now have a pull request. | Repository | Issue | State | | --- | --- | --- | | `ahmad/trip` | #144 | merged `fc69142` | | `ahmad/portfolio` | #91 | merged `9944df5` | | `Bayan/bayan-web` | #35 | merged `499d3aa` | | `Bayan/kidpoints` | #214 | merged `2cd62ad` | | `Bayan/stem` | #19 | merged `d9b7f5d` | | `ahmad/expiro` | #88 | merged `e867aeb` | | `ahmad/imamah` | #163 | merged `f303546` | | `ahmad/launchpad` | #89 | PR 90, ready | | `ahmad/namey` | #82 | PR 86, ready | | `suhba/khitta` | #58 | PR 59, ready | | `suhba/suhba-docs` | #18 | PR 19, ready | | `suhba/suhba-web` | #45 | PR 46, ready | | `ahmad/larda` | #75 | PR 78, ready | Two things found in the doing that were not in the issues: **The family contained two different bugs.** `ahmad/trip` and `ahmad/portfolio` asked whether `publish` *succeeded*, so a no-release run returned `'failure'` — a false failure, which is why those two were the P1s. The other eleven had already taken `#72`'s intermediate fix, tolerated a skipped publish, and returned `'success'`. Evaluating the old expression in each repository is what distinguished them; the issue text alone did not. **One repository could not take the expression verbatim.** `ahmad/namey`'s `notify` has a fourth dependency, `dashboard`, which this template does not model. Copying character-identically would have satisfied "matches the shared template" and left a **failing dashboard reporting success** — the same collapse, one job over. It is extended there, in the same two positions, with the reason written into the workflow. Every one was verified by evaluating the expression against all eight (nine for `namey`) reachable combinations of `needs.*`, and by confirming per repository that `notify` depends on `version` and that `version` declares the `released` output the expression reads.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
amtronics/platform-actions#81
No description provided.