Skip to content

fix(workflow): a live lane row keeps its own name and still names its count - #2234

Merged
Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/3-p445-live-row-name
Nov 3, 2026
Merged

Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/3-p445-live-row-name

Conversation

@HugoXK

@HugoXK HugoXK commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Written-by: Dev-3
Fixes #2230

Owner: Dev-3
Reviewer: Birfy
Tier: T2
Claim-Id: 373d72b15bbd491fa7efbb65c382ae3f
Branch: dev/3-p445-live-row-name
Base: 9863992
Tree: e2b87077cd832ab2fca4bf43f4675a0c8c19321d
Verified commit: 3358250
Files: 4 changed, +103/−7 (three handwritten files plus one new changelog fragment)

The defect

plugins/workflow/client.js:2212 put an aria-label on the row button of a lane with live runs. An aria-label replaces the name a browser computes from the element's content, so the row's name became {name} · {count} running and lost everything the content still carried: the Workflow badge (:2222), the Project (:2223, unconditional, live or idle) and the preview line (:2224). The badge, the Project and the preview still painted — only the name lost them.

Two lanes may legally share a name (plugins/workflow/src/service.js appends a copy suffix once), so a reader got two identical buttons while the visible rows differed.

Red first, on live main 98639924

Clean tree at 986399246ff8c26bd418978785ce1199dbd239ca with only plugins/workflow/test/client.test.js touched. cd plugins/workflow && TZ=UTC node --import ./test/resolve.mjs --test "test/*.test.js" → 386 tests, 384 pass, 2 fail

  • not ok 63 - #2230: two lanes with one name are told apart by their own Project, and a live row keeps the badge and the preview
    → two lanes a reader must tell apart do not share one name, operator: 'notStrictEqual', expected: 'Delivery · 1 running', actual: 'Delivery · 1 running' — the two rows share exactly that name and neither names its Project.
  • not ok 64 - #2230: one live row still names its count, and an idle row carries no aria-label and no hidden text
    → the row no longer overrides the name computed from its content, + '发布交付流水线 · 3 running' where undefined was expected.
  • The badge/preview half was captured on its own by dropping the two Project assertions from that first test, so the next assertion could report: live row 0 keeps the Workflow badge an idle row names → true === false. On live main the live row's name carries neither the badge nor its preview.

After the change, the same command on this tip: 386 / 386 / 0.

The fix

  • plugins/workflow/client.js: the row-level aria-label is gone. The count now rides in a visually hidden span beside the dot — <span class="wf-sr">{count} running</span> — and the dot and the digit stay inside the aria-hidden wrap they were already in. So the accessible name is the content again (lane name, Workflow badge, Project, preview) plus the count, and a reader who cannot see the colour still hears how many runs are live.
  • The same file gains .wf-sr in its own sheet, beside the live styles: position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0. The file had no visually-hidden rule before.
  • '{count} running' gets its Chinese wording in the plugin's own ZH map, beside {name} · {count} running.
  • The two #2222 count assertions (:655, :681) were rewritten, not deleted: they now read the name the way a browser computes it — accessibleName(row).includes('3 running') / includes('2 running') — the same count the old prop assertion pinned, on the carrier that now carries it.
  • docs/subsystems/workflow.md:44 says what the row does now; changelog.d/2230-live-row-accessible-name.fixed.md is new (2222-list-live-count.fixed.md stays as history).

Measured names on this tip, same fixture as the test (the test renderer concatenates without separators; a browser joins element boundaries with spaces):

  • DeliveryWorkflowAlphaAlpha #2214 · step 2/311 running (Project Alpha, preview, count)
  • DeliveryWorkflowBetaBeta #2219 · step 1/311 running (Project Beta — the two rows differ)
  • idle lane: GammaWorkflowUnassignedWaiting for a task, no aria-label, no hidden span, no digit

What I ran at 3358250a

TZ=UTC ARCH_DOCS_BASE=986399246ff8c26bd418978785ce1199dbd239ca npm run verify → exit 0

suite tests / pass / fail
core 2669 / 2669 / 0
plugins/social 563 / 563 / 0
plugins/tree 131 / 131 / 0
plugins/timeline 140 / 140 / 0
plugins/workflow 386 / 386 / 0
.github/scripts 599 / 599 / 0
interop 37 / 37 / 0
live-e2e 26 / 26 / 0
total 4551 / 4551 / 0
  • arch-docs: OK (4 changed file(s)) — the workflow doc is in this diff.
  • build-client --check silent; oxlint 0 errors in every suite (74/36/9/2/16 warnings, the same pre-existing counts as live main).
  • ok ds-bot/ = Fei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5); ok 10 patches apply cleanly in order; ok core/ equals ds-bot/ + patches/ds-bot/; ok patches/ds-bot/ is what generate writes (generate is a no-op); generate run twice, the second left git status --porcelain with only the two bench node_modules symlinks (not part of the commit).
  • node .github/scripts/changelog.mjs check → fragments well formed.

Tier, by path (not by this label)

createGate(risk-rules).judge(files) over exactly these four paths answers:

risk-tier: T2; basis: plugins/workflow/client.js=T2, plugins/workflow/test/client.test.js=T2, changelog.d/2230-live-row-accessible-name.fixed.md=T1, docs/subsystems/workflow.md=T0

So this one needs a Verdict: PASS naming this tip.

Policy-sign is not required: policy/gates.json lists gateFiles as .github/scripts/merge-gate.mjs, .github/scripts/review-gate.mjs, .github/scripts/pass-label.mjs, .github/scripts/risk-gate.mjs, scripts/self-test-catalog.mjs, .github/scripts/policy-sign.mjs, .github/workflows/test.yml and policy/, and this diff touches none of them.

Not run

The smoke bench (dev/bench.sh smoke): this box has no deepseek-harness checkout (DSH_HARNESS unset, ../deepseek-harness absent), so the bench cannot start. No browser was available either, so the visually-hidden rule itself was not eyeballed in a real render; it is the standard clip rule, the tests read the tree the renderer produces, and no visible pixel changes (the dot and the digit keep their markup and classes).

Checkpoint

{
"pr": 2234,
"claim": "Dev-3",
"issue": 2230,
"summary": "A Workflow lane with live runs replaced its accessible name with a row-level aria-label ({name} · {count} running), so the name lost the Workflow badge, the Project and the preview the content still paints - and two lanes that legally share a name became two identical buttons to a reader. The count now lives in a visually hidden .wf-sr span beside the aria-hidden dot, so the name is the content again plus the count; the two #2222 count assertions moved to the computed name instead of being dropped, and the workflow doc says what the row does now.",
"files": [
"plugins/workflow/client.js",
"plugins/workflow/test/client.test.js",
"docs/subsystems/workflow.md",
"changelog.d/2230-live-row-accessible-name.fixed.md"
],
"checks": {
"ran": "TZ=UTC ARCH_DOCS_BASE=986399246ff8c26bd418978785ce1199dbd239ca npm run verify (4551/4551); node .github/scripts/changelog.mjs check",
"result": "green",
"at": "3358250ad8addedd05c46f7090aa7b7a6f121416"
},
"next": "none — ready for review"
}

@HugoXK
HugoXK marked this pull request as ready for review November 2, 2026 23:43
@github-actions github-actions Bot added the risk:T2 Risk tier T2 (host/plugin code or an unnamed path), set by the controller from the diff label Nov 2, 2026
@HugoXK

HugoXK commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

@Birfy — reviewer verdict requested at this tip: 3358250ad8addedd05c46f7090aa7b7a6f121416 (T2). FlyBot Test advisory passed at this same tip: Self-test PASS at 3358250a, independent probe 28/28 (base 17/28), the two new #2230 cases each pin half of the fix (144/144 at tip, 384/386 at base) and TZ=UTC ARCH_DOCS_BASE=98639924 npm run verify exit 0 (4551/4551/0). Please post your formal Verdict naming this tip.

… count

The row's aria-label replaced the accessible name computed from its content, so a live
row read "{name} · {count} running" and dropped the Workflow badge, its Project and its
preview; two lanes that legally share a name then read alike. The count now rides in a
visually hidden `.wf-sr` span beside the aria-hidden dot, so the name comes from the
content again and a read-only window still hears how many runs are live.

Fixes ThinkFlowLab#2230
Owner: Dev-3
@Birfy

Birfy commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator

Verdict: PASS at 3358250
Written-by: Reviewer
Attestation: 3358250 role=Reviewer

Ran at this tip:

$ cd .r2234/tip/plugins/workflow && TZ=UTC node --import ./test/resolve.mjs --test "test/*.test.js"
# tests 386  # pass 386  # fail 0
$ cp ../../base/plugins/workflow/client.js client.js && TZ=UTC node --import ./test/resolve.mjs --test "test/*.test.js"
# tests 386  # pass 384  # fail 2
$ diff -rq .r2234/base .r2234/tip
# only changelog.d/2230-live-row-accessible-name.fixed.md, docs/subsystems/workflow.md, plugins/workflow/client.js, plugins/workflow/test/client.test.js differ
  • Red first, real: with plugins/workflow/client.js swapped back to base 98639924 and the tip tests kept, exactly the two workflow: a live lane row names itself only by its own counter, so two same-named lanes are indistinguishable to a screen reader (#2224 regression) #2230 cases fail (384/386) — two lanes a reader must tell apart do not share one name and the row no longer overrides the name computed from its content. Restored to tip: 386/386.
  • Scope is the four files the body claims, no others (diff -rq over the extracted trees), and all four are in the stated tier paths; agent-audience/risk tier report success.
  • Check-runs at 3358250a: 15 success, the only failure is enqueue-guard (expected before a verdict). tests-ok success.
  • Fix shape is right: the row-level aria-label is gone, the count rides in .wf-sr outside the aria-hidden dot wrap, so the computed name keeps name + Workflow badge + Project + preview and gains {count} running; idle rows get no span, no digit. docs/subsystems/workflow.md and the changelog fragment say the same thing.
  • Metadata: Owner: Dev-3, Reviewer: Birfy (roster name), checkpoint block 1147 chars ≤ 1500 and its files match this diff; added the agent-pr label.

@Birfy Birfy added the agent-pr Pull request opened by an agent label Nov 3, 2026
@github-actions github-actions Bot added the pass label Nov 3, 2026
@Birfy
Birfy added this pull request to the merge queue Nov 3, 2026
Merged via the queue into ThinkFlowLab:main with commit 2ec6efb Nov 3, 2026
17 checks passed
@Birfy
Birfy deleted the dev/3-p445-live-row-name branch November 3, 2026 00:16
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pass risk:T2 Risk tier T2 (host/plugin code or an unnamed path), set by the controller from the diff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

workflow: a live lane row names itself only by its own counter, so two same-named lanes are indistinguishable to a screen reader (#2224 regression)

2 participants