Repository navigation
Description
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.
Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: 0b70a4567eb74831a7cb661cebd26ae2
Branch: dev/1-p450-assign-dialog-project
Base: 7d1f1bb
At: 2026-11-03T01:00:17Z
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment.
Written-by: FlyBot Lead
Credit: found by FlyBot Product (P-450 audit on live main).
Kind: usability gap (a choice point hides the one attribute that tells two lanes apart)
Source: FlyBot Product audit P-450; every line below re-read by Lead on live main 986399246ff8c26bd418978785ce1199dbd239ca, fix verified on 7d1f1bb7ed2f097beb5376eb48f08cfeed794c3b.
Dedupe (searched before opening)
Searched open and closed issues for Pick who runs it, assign dialog project, wf-proj, Hand a task: no hit for this gap. Pick who runs it returns 12, all about other surfaces (#2240/#2193 refusals, #2230 lane counters, #2099, #2027, #1962, #1804); assign dialog project returns 3, all refusal fixes (#2237, #2193, #1099); wf-proj returns only #2230 (lane row counter). Fix follows #2240 in the same file and is not a repeat of it.
What is missing
Hand a task to a Workflow asks Pick who runs it and lists each lane by name only. Two lanes that belong to different Projects look identical in that list, and the list already knows the Project everywhere else.
plugins/workflow/client.js:1416— the dialog is opened withworkflows,targets, … but notprojects;AssignModal's props carry no Project data.plugins/workflow/client.js:2223— the lane row already draws the badge (className: 'wf-proj', text fromprojectName(item.projectId), with anonebranch);:1950/:1986hold theprojectsstate and everyworkflowsentry carriesprojectId.plugins/workflow/client.js:2157—confirmAssignposts the target's workflow id and does not sendprojectId; the server therefore assigns to the target lane's Project (src/service.js:1260-1264), so picking the wrong same-named lane silently files the work in another Project's account.
The user-visible result: with interleaved Projects, the pick list is a row of same-shaped names, and nothing on that row says which Project the choice files into.
Reproduction (red-first captured on live main before the fix)
plugins/workflow/test/client.test.js with workflow/state carrying two lanes whose projectId differ (project-alpha / project-beta, named Alpha / Beta) plus a third lane with no projectId, with sources untouched:
# tests 150 / # pass 148 / # fail 2
not ok 148 - P-450: the Hand a task dialog names each lane's Project
the first lane names its Project, saw Lane AWorkflowPlanner → Writer → Coder → Reviewer ‖ Tester → Deployer
not ok 149 - P-450: a lane with no Project carries no Project badge
only the two lanes that have a Project draw the badge
0 !== 2
ok 150 - P-450: picking a lane still posts the same assign body
Test 148 shows the dialog names no Project at all; 149 shows no badge is drawn; 150 is the counter-proof that the submitted body is unchanged today.
Expected
- Each target row in the dialog that belongs to a Project shows that Project's name, in the same
wf-projbadge the lane row already uses. - A lane with no Project draws no badge (nothing is invented, no
Unassignedcopy is added to the dialog). - The submitted assign body is byte-for-byte what it is today: no
projectIdis added to the request, and the binding semantics do not change.
Scope
plugins/workflow/client.js—AssignModaltakesprojectsand renders the badge on target rows; caller passes the state it already holds. No new endpoint, no new request field.plugins/workflow/test/client.test.js— the three cases above.docs/subsystems/workflow.md— one line describing what the dialog names.changelog.d/— one fragment.- Out of scope: the card row (core's task rows carry no
projectId) and the cross-Project warning sentence (an optional idea, not part of this slice).
Not run / notes
No browser was used; the dialog was exercised through the test harness. The full suite was run at the fix tip with TZ=UTC ARCH_DOCS_BASE=7d1f1bb7 npm run verify (see the pull request).
Activity
HugoXK commentedon Nov 3, 2026
Release
Written-by: FlyBot Lead
Released: 0b70a4567eb74831a7cb661cebd26ae2
Reason: merged as #2242 (6f862cd)
At: 2026-11-03T01:19:08Z