-
Notifications
You must be signed in to change notification settings - Fork 1
ship-status advertises check --commit from accepted, where check's own state machine rejects it #690
Copy link
Copy link
Open
Labels
area:product-bugRuntime or CLI behavior is incorrectRuntime or CLI behavior is incorrectarea:uxMessages, output, or next actions mislead or frustrateMessages, output, or next actions mislead or frustrateimpact:developer-experienceAffects authors, maintainers, or local workflowsAffects authors, maintainers, or local workflowsimpact:user-facingCan affect an end user or repository operator directlyCan affect an end user or repository operator directlypriority:p2Important but not immediately release-blockingImportant but not immediately release-blockingresolution:partialRelated work landed but meaningful residual work remainsRelated work landed but meaningful residual work remainsscope:specsync-6Applies to current SpecSync 6 behavior or release contractApplies to current SpecSync 6 behavior or release contract
Description
Activity
Metadata
Metadata
Assignees
Labels
area:product-bugRuntime or CLI behavior is incorrectRuntime or CLI behavior is incorrectarea:uxMessages, output, or next actions mislead or frustrateMessages, output, or next actions mislead or frustrateimpact:developer-experienceAffects authors, maintainers, or local workflowsAffects authors, maintainers, or local workflowsimpact:user-facingCan affect an end user or repository operator directlyCan affect an end user or repository operator directlypriority:p2Important but not immediately release-blockingImportant but not immediately release-blockingresolution:partialRelated work landed but meaningful residual work remainsRelated work landed but meaningful residual work remainsscope:specsync-6Applies to current SpecSync 6 behavior or release contractApplies to current SpecSync 6 behavior or release contract
Measured on a real repository. The tool computes "your next step is X" from a state in which X is refused by its own state machine.
Observed
ship-statusat the same moment, unchanged, still advertising exactly that command:Mechanism
src/commands/change.rs:1171-1188:And
check's guard,src/change.rs:6852:The stage's done predicate admits
Accepted. The action printed when not done is valid only for states that excludeAccepted.So
state == Acceptedwithverification_ancestor == false— which is what a squash-merge produces (#689) — lands in the gap: not done, therefore printcheck --commit; butcheckrefuses that state.Why the state reaches that combination at all
Squash-merge rewrites the verification commit, so
verification_ancestorgoes false while the record staysaccepted. See #689 — on a squash-only repository there is no merge path that avoids it.Where it leaves the change
Wedged by two rules whose escapes each require the other side to move.
Suggested fix
The reporter's framing, which I think is right and is a small extension of the disclosure fix already proposed in #688:
The tool has everything needed: it knows the record's state, and each verb's accepted states are already explicit in the guards. A stage action that cannot execute from the current state should never be printed as the current stage.
A design note in the tool's favour, from the reporter
reopenrequires--actorand--reasonand describes itself as an audited transition. That is the right shape for the only door out of a wedged state — and it means the door cannot be opened by an agent acting alone. The reporting session declined to run it on exactly that basis: an audited human-authorization flag is not something an agent should supply on a user's behalf.Worth preserving that property in any fix here. The goal is to name the door, not to make it easier to walk through unattended.
Related
shiprefuses a stale review whilereviewrefuses inaccepted). Both are "the tool names a verb it will then refuse."