feat(stop): explain blocking change conflicts#829
Open
tlm wants to merge 7 commits into
Open
Conversation
Collaborator
|
@tlm thank you, I just noted, we don't use any commit message annotation. Just capital letter, preferably start with a verb. |
Contributor
Author
|
@dmitry-lyfar ta, will update going forward. |
18 tasks
dmitry-lyfar
reviewed
Jun 8, 2026
dmitry-lyfar
left a comment
Collaborator
There was a problem hiding this comment.
There are unit tests and linter issues
18 tasks
Add a change-conflict API error kind and client-side conversion to a typed ChangeConflictError so commands can inspect blocking change details without parsing daemon error messages.
Show a clearer error when stop is blocked by a refresh change, including the tasks command and the refresh abort/continue steps needed before retrying stop.
Preserve blocking change details when stop is requested for a workshop waiting on an errored change, so API clients can surface the change kind, status, and task ID.
Expose blocking change details in change-conflict API errors so clients can guide users to the relevant tasks output and recovery commands without parsing human-readable daemon messages.
Reorder the test imports so they match the project's gci configuration.
Update the mid-refresh removal test to expect the blocking change status now preserved by ChangeConflictError.
69ed36c to
34de700
Compare
"Change" is internal overlord terminology that the CLI never exposes; users inspect work through "workshop tasks". Reword the stop conflict errors to say task instead, and drop the change kind from the generic conflict message since it added internal jargon without helping the user act on the error.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This improves the
workshop stopUX when the stop action is blocked by anotherworkshop change, especially a refresh that is paused on error.
Previously, if a user ran
workshop stop devwhile a refresh was paused onerror, the CLI only received a generic daemon error. The output did not explain
which change was blocking the stop or what the user should do next.
Before:
After:
For non-refresh change conflicts, the CLI also now has enough context to show a
more specific blocking-change message:
Design
This change keeps the existing project layering:
workshopstate.StopManyremains responsible for deciding whether stop canproceed.
conflict.CheckChangeConflictremains the source of blocking change details.errors.As.The daemon now returns structured
change-conflictAPI errors when a workshopaction is blocked by a change conflict. The response includes the blocking
change ID, kind, status, project ID, and workshop name.
Example API error value:
{ "kind": "change-conflict", "message": "workshop \"dev\" has \"refresh\" change in progress", "value": { "change-id": "29", "change-kind": "refresh", "change-status": "Wait", "project-id": "...", "workshop": "dev" } }The client exposes this through
client.ChangeConflictError, allowing CLIcommands to inspect structured change details without parsing human-readable
daemon messages.
QA
Unit and package tests run:
End-to-end manual QA:
--wait-on-error.workshop stopwhile the refresh was paused.Observed output:
The paused refresh was then cleaned up with:
Self-review quick check
Docs
Procedure:
Content:
tutorial/andhow-to/sections).docs/.coverage.yamlupdated, coverage tags added (.. artefact).Or: