Stamp the exact point with the mechanism that stamps the stable one #342

Open
PerishFire wants to merge 1 commit from task/a-verb-that-stamps-the-exact-point into main
Owner

An exact release began with git tag and git push, typed by hand. That is the documented procedure, and it is the softest end of a model whose whole purpose is that a version names one commit and keeps naming it.

The machinery to do it properly was already here and already correct. stamp writes an annotated tag at a line's head, refuses to move a point that already stands — "a stamped point never moves" — and pushes it. It had one caller, freeze, which is the stable path, so nothing could reach it for an exact version.

plumb stable stamp --version <exact> reaches it:

$ plumb stable stamp --version v0.27.0 --dry-run
v0.27.0 belongs to channel stable, whose point is stamped by freeze

$ plumb stable stamp --version v0.27.0-beta.1 --dry-run
git tag -a v0.27.0-beta.1 at 594dddd… on release/v0.27.0, then push

It derives the line from the version, reads that line's head, and stamps there. Each point now has exactly one verb that makes it: freeze refuses an exact version, stamp refuses a stable one.

This is not the whole of what an exact point deserves — a stamped tag can still be moved by anything with push rights, and guarding that is not Plumb's to do. It is the half that is: the release procedure no longer asks a person to make the thing the release depends on.

An exact release began with `git tag` and `git push`, **typed by hand**. That is the documented procedure, and it is the softest end of a model whose whole purpose is that a version names one commit and keeps naming it. The machinery to do it properly was already here and already correct. `stamp` writes an annotated tag at a line's head, refuses to move a point that already stands — *"a stamped point never moves"* — and pushes it. It had **one caller**, `freeze`, which is the stable path, so nothing could reach it for an exact version. `plumb stable stamp --version <exact>` reaches it: ``` $ plumb stable stamp --version v0.27.0 --dry-run v0.27.0 belongs to channel stable, whose point is stamped by freeze $ plumb stable stamp --version v0.27.0-beta.1 --dry-run git tag -a v0.27.0-beta.1 at 594dddd… on release/v0.27.0, then push ``` It derives the line from the version, reads that line's head, and stamps there. Each point now has exactly one verb that makes it: `freeze` refuses an exact version, `stamp` refuses a stable one. This is not the whole of what an exact point deserves — a stamped tag can still be moved by anything with push rights, and guarding that is not Plumb's to do. It is the half that is: **the release procedure no longer asks a person to make the thing the release depends on.**
Stamp the exact point with the mechanism that stamps the stable one
All checks were successful
guard / guard (pull_request) Successful in 2m47s
b983e1515e
An exact release began with `git tag` and `git push`, typed by hand. That is
the documented procedure, and it is the softest end of a model whose whole
purpose is that a version names one commit and keeps naming it: a hand-made tag
can be force-moved, and nothing downstream would know.

The machinery to do it properly was already here and already correct. `stamp`
writes an annotated tag at the head of a line, refuses to move a point that
already stands — "a stamped point never moves" — and pushes it. It had one
caller, `freeze`, which is the stable path, so nothing could reach it for an
exact version.

`plumb stable stamp --version <exact>` reaches it. It derives the line the
version belongs to from the version itself, reads that line's head, and stamps
there. It refuses a stable version, which is `freeze`'s to stamp, and `freeze`
already refuses an exact one, so each point has exactly one verb that makes it.

This is not the whole of what an exact point deserves — a stamped tag can still
be moved by anything with push rights, and guarding that is not Plumb's to do.
It is the half that is: the release procedure no longer asks a person to make
the thing the release depends on.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
All checks were successful
guard / guard (pull_request) Successful in 2m47s
This pull request has changes conflicting with the target branch.
  • AGENTS.md
  • crates/cli/src/command/operator/line/mod.rs
  • crates/cli/src/command/version.rs
  • crates/cli/tests/operator/line/stable/mod.rs
  • docs/CHANGELOG/v0.27.0/en/INDEX.md
  • docs/CHANGELOG/v0.27.0/zh/INDEX.md
  • plumb.toml
  • skills/plumb/SKILL.md
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin task/a-verb-that-stamps-the-exact-point:task/a-verb-that-stamps-the-exact-point
git switch task/a-verb-that-stamps-the-exact-point
Sign in to join this conversation.
No reviewers
No labels
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
PerishLab/plumb!342
No description provided.