Let one family lock the contract #351

Open
PerishFire wants to merge 1 commit from task/the-line-is-the-contracts-lock into main
Owner

plumb stable is gone. Its four verbs are plumb release prepare|pick|freeze|rejoin.

Why

The contract this task exists to model is a version, a lock form, and a projection surface. Two were in release; the third was not. A line is the apparatus by which a version is fixed to a commit and made permanent — that is the lock form, and it was living under a family of its own.

It looked like a lifecycle beside the release only because it has its own git objects. It is not one: a line is cut for a release, carries that release's points, and rejoins when the release ends. The alternation said so

stable prepare → stable pick → release stamp → dispatch → stable freeze → release stamp → dispatch → stable rejoin

every arrow crosses a family boundary. The split was not by object or by phase but by implementation medium — git refs on one side, the authority on the other — a detail wearing a family name.

rejoin

It was in both families meaning two things: performing the merge, and proving the topology. One verb now. Given a version it performs and proves; given none it reads the run's environment and proves what a run already did — which is what the unmigrated shared workflow still calls.

$ plumb release rejoin --version v0.26.0        # performs
$ PLUMB_RELEASE_VERSION=… plumb release rejoin  # proves
stable v0.26.0 at 831223a… is rejoined into origin/main at f246fa0…

Scope

  • stable is not retired as a word — the channel, the latest, the pointer keep it. Only the command moved, so nothing goes out of true for using it.
  • No lane calls these verbs, so no lane changes.
  • ship is untouched. It executes against what was locked, and the binary is one of its adaptors like any other.
`plumb stable` is gone. Its four verbs are `plumb release prepare|pick|freeze|rejoin`. ## Why The contract this task exists to model is **a version, a lock form, and a projection surface**. Two were in `release`; the third was not. **A line is the apparatus by which a version is fixed to a commit and made permanent** — that is the lock form, and it was living under a family of its own. It looked like a lifecycle beside the release only because it has its own git objects. It is not one: a line is cut for a release, carries that release's points, and rejoins when the release ends. **The alternation said so** — ``` stable prepare → stable pick → release stamp → dispatch → stable freeze → release stamp → dispatch → stable rejoin ``` every arrow crosses a family boundary. The split was not by object or by phase but by **implementation medium** — git refs on one side, the authority on the other — a detail wearing a family name. ## `rejoin` It was in both families meaning two things: performing the merge, and proving the topology. **One verb now.** Given a version it performs and proves; given none it reads the run's environment and proves what a run already did — which is what the unmigrated shared workflow still calls. ``` $ plumb release rejoin --version v0.26.0 # performs $ PLUMB_RELEASE_VERSION=… plumb release rejoin # proves stable v0.26.0 at 831223a… is rejoined into origin/main at f246fa0… ``` ## Scope - **`stable` is not retired as a word** — the channel, the latest, the pointer keep it. Only the command moved, so nothing goes out of true for using it. - **No lane calls these verbs**, so no lane changes. - **`ship` is untouched.** It executes against what was locked, and the binary is one of its adaptors like any other.
Let one family lock the contract
All checks were successful
guard / guard (pull_request) Successful in 2m47s
9e1810eea0
`plumb stable` is gone; its four verbs are `plumb release prepare|pick|freeze|
rejoin`.

The contract this line exists to model is a version, a lock form, and a
projection surface. Two of those were in `release` and the third was not. A line
is the apparatus by which a version is fixed to a commit and made permanent —
that is the lock form, and it was living under a family of its own.

It looked like a lifecycle beside the release only because it has its own git
objects. It is not one. A line is cut for a release, carries that release's
points, and rejoins when the release ends; it has no existence outside one. The
alternation said so plainly: written in order a release read `stable prepare →
stable pick → release stamp → dispatch → stable freeze → release stamp →
dispatch → stable rejoin`, and every arrow crossed a boundary. The split was not
by object or by phase but by implementation medium — git refs on one side, the
authority on the other — which is a detail wearing a family name.

`rejoin` was in both families meaning two things, performing the merge and
proving the topology. It is one verb: given a version it performs and proves;
given none it reads the run's environment and proves what a run already did,
which is what the unmigrated shared workflow still calls.

`stable` stays an ordinary word — the channel, the latest, the pointer — so it
is not retired and nothing goes out of true for using it. Only the command
moved, and no lane calls these verbs, so no lane changes.

`ship` is untouched. It executes against what was locked, and the binary is one
of its adaptors like any other. That is the two-layer model this task set out to
reach, and this is the last of the contract that was living somewhere else.

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/src/dispatch/release/mod.rs
  • crates/cli/src/main.rs
  • crates/cli/tests/operator/datum.rs
  • crates/cli/tests/operator/line/stable/mod.rs
  • crates/cli/tests/operator/rejoined.rs
  • crates/cli/tests/operator/settlement.rs
  • docs/CHANGELOG/v0.27.0/en/INDEX.md
  • docs/CHANGELOG/v0.27.0/en/MIGRATION.md
  • docs/CHANGELOG/v0.27.0/zh/INDEX.md
  • docs/CHANGELOG/v0.27.0/zh/MIGRATION.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/the-line-is-the-contracts-lock:task/the-line-is-the-contracts-lock
git switch task/the-line-is-the-contracts-lock
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!351
No description provided.