Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion docs/adr/0018-the-release-workflow-publishes-on-a-version-tag.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ADR-0018: The release workflow publishes to Hex on a version tag, and only when the tagged commit is on the default branch, names the version in `mix.exs` and passes the full gate there

Status: proposed (2026-10-04)
Status: accepted (2026-10-10, statifier_persistence 0.24.1)

## Context

Expand Down Expand Up @@ -104,3 +104,38 @@ the toolchain read out of `mise.toml` and the gate command read out of
they are in the run's log.
- The toolchain, cache, dependency and gate steps are a copy of `ci.yml`'s.
A change to one is made to both in the same change.

## Note (2026-10-10): accepted

This Note decides nothing and changes no decision; it records the flip of
the Status line above from proposed to accepted. The record was to be
accepted once the release workflow had published a version of this
package; that these records flip together on that first publish, one pull
request per repository, was ruled by the operator, 2026-10-06.

- **The first publish through the workflow.** statifier_persistence
0.24.1: the tag `v0.24.1` on commit `019710344401bce3a7c3607978b9a0e8b39c8bb5`,
published by the workflow run
https://github.com/riddler/statifier_persistence/actions/runs/37307983702
(started 2026-10-05T12:12:57Z, on a tag push, first attempt), every step
of the job green: the ancestry check, the version check, the Hex check,
the full quality gate, the publish and the printed addresses. Hex shows
the version.
- **Later publishes through the workflow.** None: that run is the only run
of the release workflow.
- **Verified at.** Every claim of the Context, the Decision and the
Consequences was re-read on `main` at
`f14c8a642c684071cc3b679e165072f0b968cbcb` on the day of this Note, in
`.github/workflows/release.yml`, `.github/workflows/ci.yml`,
`.claude/wurk.json` `gate.full`, `.claude/wurk/release.md` ("What a
release here still is not"), `CLAUDE.md` (the release row and the
"Release preps" paragraph), `mix.exs` and `mise.toml`; each holds. No
commit after the tag touches any of those files.
- **The Context's "Nothing runs on a tag push today".** That sentence
describes the repository when the record was written; decision 1 is the
change that made it no longer so, and the record is unchanged.

That the Note gives the first publish, the later ones and the verified
SHA, and that the Status line names the first version published through
the workflow, were decided by the conductor under a standing consent,
2026-10-10.
2 changes: 1 addition & 1 deletion docs/adr/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
| [0015](0015-the-tree-migration.md) | The tree migration: `Executions.migrate_tree/4` takes one ADR-0013 plan per node by execution id, reads the tree through the linkage, validates every node before any is written and writes children first in one store unit through a new optional adapter callback, applies `on_failure: :refuse \| :park` to the whole tree, reports ADR-0013's event once per node moved, and rewrites a migrated child's linkage pin in the same unit | accepted |
| [0016](0016-pruning-finished-executions.md) | Pruning a finished execution: `Retention.prune/3` nulls the position blob and deletes the input log of every `:completed`, `:failed` or `:cancelled` execution whose `ended_at` is before a host-supplied `DateTime`, in idempotent batches through one optional adapter callback; the execution row is kept whole as the tombstone, the positions table is not touched, no duration and no default window, and a read after a prune is not yet distinct from an empty log | accepted |
| [0017](0017-migrating-the-executions-on-a-chart.md) | Migrating the executions on a chart: `Executions.migrate_batch/3` applies one plan per pair of chart hashes to every `:active` and `:needs_migration` execution on `from`, with a dry run answering `:would_migrate`, `:would_refuse` or `:skipped` per execution, `on_failure: :refuse` by default and `:park` on request, linked executions through `migrate_tree/4`, classes as a composition, one report and one `[:statifier_persistence, :execution, :migrate_batch]` span, rollback as a reverse plan, and a status-set listing by content hash behind the existing capability | accepted |
| [0018](0018-the-release-workflow-publishes-on-a-version-tag.md) | The release workflow publishes to Hex on a `v*.*.*` tag push and nothing else, only when the tagged commit is on the default branch (read from the push event), the tag equals `@version` in `mix.exs` there and the full gate is green there; the `HEX_API_KEY` secret reaches the publish step alone, the docs publish with the package, a failed run is never retried by the workflow, and a published version stands | proposed |
| [0018](0018-the-release-workflow-publishes-on-a-version-tag.md) | The release workflow publishes to Hex on a `v*.*.*` tag push and nothing else, only when the tagged commit is on the default branch (read from the push event), the tag equals `@version` in `mix.exs` there and the full gate is green there; the `HEX_API_KEY` secret reaches the publish step alone, the docs publish with the package, a failed run is never retried by the workflow, and a published version stands | accepted |

New ADRs: next number, same three-section format (Context, Decision,
Consequences). Pick the number against a freshly fetched remote. A bare
Expand Down
Loading