Delivery ends at perception, not at release #202

Open
opened 2026-08-02 11:00:40 +00:00 by PerishFire · 0 comments
Owner

A change to what a managed repository should contain is not delivered when it
ships. It is delivered when every managed repository is certain to encounter
it. Today that last step has no owner, so it is the step that gets skipped.

Proposed principle

Delivery ends at perception, not at release. A change to what a managed
repository should contain is not complete until its signal sits on a path every
managed repository already traverses. The producing closure names that path and
shows the signal on it. Whether and when a repository responds is that
repository's own scheduling; what a correct response looks like is still the
producer's to state.

Announced and documented do not count. A changelog entry, an issue, and a
reference page are all things a reader must go and find. Perception is what
happens without going to look.

This is the missing half of the wall stands until the check does. That
principle says what to do when a law cannot be mechanized yet: write it plainly
and say plainly that nothing checks it. It does not say who is responsible for
the downstream ever seeing the wall — and today the answer is nobody.

Why it decides coupling, not hygiene

Without a perception channel the only safe move on a shared shape is to avoid
sharing it. That is not theory: ensign copied concord's release callers
rather than consuming a shared thing, concord later added guard_contexts as
part of its wrapperless adoption, and the copy went stale silently. The first
stable promotion then failed in a way that is not winnable by being quicker,
because the shared workflow re-ran guard and guard re-asked a registry that had
moved.

Copy-instead-of-consume is the signature of a domain that cannot guarantee
perception. It looks like loose coupling — separate files — while being tight
coupling with nothing holding the two ends together.

So a perception channel is what makes sharing shape affordable. It is the
enabling condition for moving fast on a common substrate, not a tax on it.

A falsifiable test

Perception has grades, and only the first is perception:

grade carrier counts
traversed plumb doctor and Ectropy output — every repository, every commit yes
loaded domain skill text — every agent that loads the skill weak; agents often do not
findable rule catalog, MIGRATION.md no, a reader must look
announced issue, changelog entry no

So the claim "this was delivered" reduces to two checkable lines: name the
traversed path, and show the signal on it.

The channel already exists, and is empty

plumb doctor prints the same line in every managed repository:

vocabulary p64-v1 ae4be6b8f362 retired=0 scanned=0/0

Verified today across ensign, codehull, concord, plumb, ectropy and keel: same
dictionary digest, same empty count. This is a universal, versioned, traversed
channel carrying nothing.

Meanwhile perish.code/sealkit-combination-models states its own definition of
done as "Plumb carries the release-locked retired vocabulary signal; all
managed repositories receive that signal and remove active references."
The
design is right and the mechanism is installed. The delivery stopped one step
short of the task's own stated completion, because nothing forces the question
did the signal actually go out?

That is the shape this principle is for. It is not about people failing to know
what to do. It is about the last square being unowned.

Three more instances from one working day:

  • runseal 0.14 documented its migration well and then delegated propagation
    explicitly: "let existing repository tasks consume Runseal v0.14.1
    themselves."
    Nine repositories sat on the old shape; the one that broke
    first broke silently, as a hook that could no longer run.
  • cold-start.ts was deleted from this repository when release and site
    operation were absorbed. The capability to open a new R2 delivery chain now
    has no home, and nothing announced that.
  • guard_contexts, above.

Cost, and the settlement it implies

A traversed channel accumulates. If every release adds a line to what every
repository sees, the channel becomes noise, and noise is the opposite of
perception. So a signal placed there must be settleable: it exists while
repositories are dirty and disappears when they are clean.

The existing shape already anticipates this — retired=N is a counter and
scanned=X/Y is a completion ratio. The obligation is to use them, not to add
a second mechanism.

Standing

Prose-only, deliberately. The shape of which signals must be traversed is not
settled, and writing the principle before the check is this repository's own
practice. What should be fixed now is the falsifiable part: name the path, show
the signal, and do not let announced or documented be offered in their place.

A change to what a managed repository should contain is not delivered when it ships. It is delivered when every managed repository is certain to encounter it. Today that last step has no owner, so it is the step that gets skipped. ## Proposed principle **Delivery ends at perception, not at release.** A change to what a managed repository should contain is not complete until its signal sits on a path every managed repository already traverses. The producing closure names that path and shows the signal on it. Whether and when a repository responds is that repository's own scheduling; what a correct response looks like is still the producer's to state. Announced and documented do not count. A changelog entry, an issue, and a reference page are all things a reader must go and find. Perception is what happens without going to look. This is the missing half of *the wall stands until the check does*. That principle says what to do when a law cannot be mechanized yet: write it plainly and say plainly that nothing checks it. It does not say who is responsible for the downstream ever seeing the wall — and today the answer is nobody. ## Why it decides coupling, not hygiene Without a perception channel the only safe move on a shared shape is to avoid sharing it. That is not theory: `ensign` copied concord's release callers rather than consuming a shared thing, concord later added `guard_contexts` as part of its wrapperless adoption, and the copy went stale silently. The first stable promotion then failed in a way that is not winnable by being quicker, because the shared workflow re-ran guard and guard re-asked a registry that had moved. Copy-instead-of-consume is the signature of a domain that cannot guarantee perception. It looks like loose coupling — separate files — while being tight coupling with nothing holding the two ends together. So a perception channel is what makes sharing shape affordable. It is the enabling condition for moving fast on a common substrate, not a tax on it. ## A falsifiable test Perception has grades, and only the first is perception: | grade | carrier | counts | |---|---|---| | traversed | `plumb doctor` and Ectropy output — every repository, every commit | yes | | loaded | domain skill text — every agent that loads the skill | weak; agents often do not | | findable | rule catalog, MIGRATION.md | no, a reader must look | | announced | issue, changelog entry | no | So the claim "this was delivered" reduces to two checkable lines: name the traversed path, and show the signal on it. ## The channel already exists, and is empty `plumb doctor` prints the same line in every managed repository: ``` vocabulary p64-v1 ae4be6b8f362 retired=0 scanned=0/0 ``` Verified today across ensign, codehull, concord, plumb, ectropy and keel: same dictionary digest, same empty count. This is a universal, versioned, traversed channel carrying nothing. Meanwhile `perish.code/sealkit-combination-models` states its own definition of done as *"Plumb carries the release-locked retired vocabulary signal; all managed repositories receive that signal and remove active references."* The design is right and the mechanism is installed. The delivery stopped one step short of the task's own stated completion, because nothing forces the question *did the signal actually go out?* That is the shape this principle is for. It is not about people failing to know what to do. It is about the last square being unowned. Three more instances from one working day: - **runseal 0.14** documented its migration well and then delegated propagation explicitly: *"let existing repository tasks consume Runseal v0.14.1 themselves."* Nine repositories sat on the old shape; the one that broke first broke silently, as a hook that could no longer run. - **`cold-start.ts`** was deleted from this repository when release and site operation were absorbed. The capability to open a new R2 delivery chain now has no home, and nothing announced that. - **`guard_contexts`**, above. ## Cost, and the settlement it implies A traversed channel accumulates. If every release adds a line to what every repository sees, the channel becomes noise, and noise is the opposite of perception. So a signal placed there must be settleable: it exists while repositories are dirty and disappears when they are clean. The existing shape already anticipates this — `retired=N` is a counter and `scanned=X/Y` is a completion ratio. The obligation is to use them, not to add a second mechanism. ## Standing Prose-only, deliberately. The shape of *which* signals must be traversed is not settled, and writing the principle before the check is this repository's own practice. What should be fixed now is the falsifiable part: name the path, show the signal, and do not let announced or documented be offered in their place.
Sign in to join this conversation.
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#202
No description provided.