A workflow can be changed where it is drawn, at #/orgs/<id>/workflows/<name>.
The selected step's panel has "Edit step": title, the state the step puts a task in, and roles as checkboxes. A role the step names that no longer exists is listed first and marked missing.
Add a step after the selected one (or at the end), remove the selected step, move it earlier or later. Buttons, in tab order. No drag.
Changes are held on the page. The graph draws the pending workflow and the header shows "Unsaved" with Save and Discard. Save sends one POST with the revision the page read.
A refused Save says why next to the button and keeps the change. Save refuses while a step form holds edits that were not applied.
The poll does not repaint over a pending change. If this workflow changed underneath, a note says so and offers Discard.
The list page has "New workflow" (a name and a first step). The graph page has "Delete workflow" with a confirm in the bar.
When the read says the Console cannot write, there are no controls and one line says who can change it.
Two sp9 follow-ups: the missing-role line shows the whole role name at 1440, and the box-fit test measures the text.
How
workflows.js: the graph editor calls the same refusal, stepRefusal, shape, saveFlow and removeFlow as the form editor on the organization page. One copy of the validation and write code.
MosaicWorkflows.hasDraft() feeds the existing leave guards: one line each in display.js (dirty(), discard()) and console-restart.js (dirty()).
Existing POST and DELETE /api/orgs/<id>/workflows/<name>. No new server route, no schema change.
Behaviour change in the organization page's form editor: it now refuses a step with no title, no role, more than eight roles or a duplicate role on the page, before the bus sees it.
Tests
tests/workflows-browser.test.mjs: new tests for edit and save (POST body and revision), add, remove, move, discard, a kept refusal, the poll, not writable, new, delete, the keyboard path and the leave guard. Each failed before its fix.
Lane gate on bd29e756a: 190 webui test files, 1515 pass, 0 fail, 4 skipped (org-quick-live, needs a live scratch instance).
Lead check on bd29e756a: 146 pass, 0 fail over the changed test file plus the workspace, restart, switch and system page files.
Review
Two rounds, each a fresh claude-opus-5-5 reviewer. Round 1 asked for one change (Save dropped a step form's edits that were not applied) and raised six smaller notes, three fixed. Round 2 approved; its two wording notes are fixed in bd29e756a.
Left for later
A saved step change is 6 clicks from the Dashboard (3 to reach the step, then Edit step, Apply, Save).
A poll that starts before the POST lands and returns after Save's re-read can draw the old steps under "Saved" until the next poll.
The restart guard line has no test of its own; the organization-switch guard, which reads the same hasDraft(), has one.
The client name rule is narrower than the route's.
The form editor on the organization page is now redundant and stays for a later slice.
No branches, triggers, gates or inputs: the workflow file is a flat list of steps.
## What changes
- A workflow can be changed where it is drawn, at `#/orgs/<id>/workflows/<name>`.
- The selected step's panel has "Edit step": title, the state the step puts a task in, and roles as checkboxes. A role the step names that no longer exists is listed first and marked missing.
- Add a step after the selected one (or at the end), remove the selected step, move it earlier or later. Buttons, in tab order. No drag.
- Changes are held on the page. The graph draws the pending workflow and the header shows "Unsaved" with Save and Discard. Save sends one POST with the revision the page read.
- A refused Save says why next to the button and keeps the change. Save refuses while a step form holds edits that were not applied.
- The poll does not repaint over a pending change. If this workflow changed underneath, a note says so and offers Discard.
- The list page has "New workflow" (a name and a first step). The graph page has "Delete workflow" with a confirm in the bar.
- When the read says the Console cannot write, there are no controls and one line says who can change it.
- Two sp9 follow-ups: the missing-role line shows the whole role name at 1440, and the box-fit test measures the text.
## How
- `workflows.js`: the graph editor calls the same `refusal`, `stepRefusal`, `shape`, `saveFlow` and `removeFlow` as the form editor on the organization page. One copy of the validation and write code.
- `MosaicWorkflows.hasDraft()` feeds the existing leave guards: one line each in `display.js` (`dirty()`, `discard()`) and `console-restart.js` (`dirty()`).
- Existing `POST` and `DELETE /api/orgs/<id>/workflows/<name>`. No new server route, no schema change.
- Behaviour change in the organization page's form editor: it now refuses a step with no title, no role, more than eight roles or a duplicate role on the page, before the bus sees it.
## Tests
- `tests/workflows-browser.test.mjs`: new tests for edit and save (POST body and revision), add, remove, move, discard, a kept refusal, the poll, not writable, new, delete, the keyboard path and the leave guard. Each failed before its fix.
- Lane gate on bd29e756a: 190 webui test files, 1515 pass, 0 fail, 4 skipped (`org-quick-live`, needs a live scratch instance).
- Lead check on bd29e756a: 146 pass, 0 fail over the changed test file plus the workspace, restart, switch and system page files.
## Review
Two rounds, each a fresh claude-opus-5-5 reviewer. Round 1 asked for one change (Save dropped a step form's edits that were not applied) and raised six smaller notes, three fixed. Round 2 approved; its two wording notes are fixed in bd29e756a.
## Left for later
- A saved step change is 6 clicks from the Dashboard (3 to reach the step, then Edit step, Apply, Save).
- A poll that starts before the POST lands and returns after Save's re-read can draw the old steps under "Saved" until the next poll.
- The restart guard line has no test of its own; the organization-switch guard, which reads the same `hasDraft()`, has one.
- The client name rule is narrower than the route's.
- The form editor on the organization page is now redundant and stays for a later slice.
- No branches, triggers, gates or inputs: the workflow file is a flat list of steps.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What changes
#/orgs/<id>/workflows/<name>.How
workflows.js: the graph editor calls the samerefusal,stepRefusal,shape,saveFlowandremoveFlowas the form editor on the organization page. One copy of the validation and write code.MosaicWorkflows.hasDraft()feeds the existing leave guards: one line each indisplay.js(dirty(),discard()) andconsole-restart.js(dirty()).POSTandDELETE /api/orgs/<id>/workflows/<name>. No new server route, no schema change.Tests
tests/workflows-browser.test.mjs: new tests for edit and save (POST body and revision), add, remove, move, discard, a kept refusal, the poll, not writable, new, delete, the keyboard path and the leave guard. Each failed before its fix.bd29e756a: 190 webui test files, 1515 pass, 0 fail, 4 skipped (org-quick-live, needs a live scratch instance).bd29e756a: 146 pass, 0 fail over the changed test file plus the workspace, restart, switch and system page files.Review
Two rounds, each a fresh claude-opus-5-5 reviewer. Round 1 asked for one change (Save dropped a step form's edits that were not applied) and raised six smaller notes, three fixed. Round 2 approved; its two wording notes are fixed in
bd29e756a.Left for later
hasDraft(), has one.