Skip to content

the merge-before-finalize warning only reaches operators who run the verb that prints it #712

Description

@0xLeif

I merged a PR without finalizing its change today. The warning that exists to prevent exactly that never appeared, because it is printed by ship and I never ran ship.

What happened

PR #710 was verified, pushed, CI-green, and merged. change review and change ship were never run. The deliverable was fine — the docs landed — but the lifecycle record stayed verifying on main, and when the next PR moved project_input_digest its evidence went stale.

change audit --strict then failed on main, and nobody noticed. It was found incidentally by an agent establishing a baseline for unrelated work, some hours later.

Why the existing warning could not help

#687 improved this text and it is accurate:

do not merge the PR before finalize — merging first orphans its verification evidence AND blocks every earlier accepted change sharing a delivery input from archiving

It is emitted by ship / ship-status / finalize. Every one of those is a verb you run when you are already doing the right thing. The operator who is about to make this mistake is, by definition, not running them.

Nothing on the merge path asks the question. There is no check that fails when a PR carrying an active change is merged, and audit — which does detect the result — runs only when someone chooses to run it.

So the guidance is well-worded and unreachable. That is the same shape as several defects this release has already fixed: a signal that exists but cannot arrive at the moment it is needed.

Options, none obviously right

  1. A CI check on the PR. If the head commit carries an active change workspace whose state is not archived, fail — or warn on the PR itself. This puts the signal where the merge decision is made. Cost: it must not fire on legitimately multi-change PRs mid-sequence, and it needs to distinguish "not finalized yet" from "finalized in a later commit on this branch".
  2. Make audit part of the required gate, so a stale or unfinalized workspace blocks the merge button rather than being discovered later. Bluntest, and it would have caught this — but it turns every mid-flight PR red until its last change ships.
  3. Detect it after the fact and say so loudly. A post-merge job that runs audit --strict on main and opens an issue or fails the branch. Does not prevent the mistake; does bound how long main stays quietly red.

Option 3 is worth doing regardless of the others. main was red for hours and the only reason it surfaced is that an unrelated agent happened to run audit first.

What this is not

Not an argument for weakening the warning — it is correct and #687's second-order cost is real. The problem is placement, not wording.

Filed against myself: I have quoted this warning repeatedly today and then walked into it. If the operator most steeped in it can skip two verbs and merge with nothing objecting, the mechanism is not doing the work the wording implies.

Related: #687 (the wording), #703 (a fold-back step that also depends on the operator following next_action).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:governanceLifecycle, approval, adoption, or release-policy behaviorarea:product-bugRuntime or CLI behavior is incorrectarea:uxMessages, output, or next actions mislead or frustrateimpact:user-facingCan affect an end user or repository operator directlypriority:p1Highest-impact or release-blocking riskscope:legacy-validLegacy or migration path remains supported and affectedscope:specsync-6Applies to current SpecSync 6 behavior or release contract

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions