Skip to content

workflow: Hand a task lists lanes by name only — the dialog never says which Project the choice files into #2241

Closed

Description

@HugoXK

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 with workflows, targets, … but not projects; AssignModal's props carry no Project data.
  • plugins/workflow/client.js:2223 — the lane row already draws the badge (className: 'wf-proj', text from projectName(item.projectId), with a none branch); :1950/:1986 hold the projects state and every workflows entry carries projectId.
  • plugins/workflow/client.js:2157 — confirmAssign posts the target's workflow id and does not send projectId; 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

  1. Each target row in the dialog that belongs to a Project shows that Project's name, in the same wf-proj badge the lane row already uses.
  2. A lane with no Project draws no badge (nothing is invented, no Unassigned copy is added to the dialog).
  3. The submitted assign body is byte-for-byte what it is today: no projectId is added to the request, and the binding semantics do not change.

Scope

  • plugins/workflow/client.js — AssignModal takes projects and 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

  1. HugoXK commented on Nov 3, 2026

    @HugoXK
    ContributorAuthor

    Release

    Written-by: FlyBot Lead
    Released: 0b70a4567eb74831a7cb661cebd26ae2
    Reason: merged as #2242 (6f862cd)
    At: 2026-11-03T01:19:08Z

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions