Page MenuHomePhabricator

"Other assignee" icon disappears briefly after loading a workboard
Open, Needs TriagePublicBUG REPORT

Description

For the last couple weeks or so, I noticed multiple times that, while I had a workboard open, something would suddenly "change" (like when someone moves a task to another column). Every time this happened I went checking for recent changes to that project, without finding anything every single time. Today, I finally discovered why phabricator has been gaslighting me: when a task has an "other assignee" set, you would typically see the icons for both assignees in the workboard view. However, the "other assignee" icon will disappear and cause a slight reflow shortly after the page is loaded.

For an example, see the following screencast taken from https://phabricator.wikimedia.org/project/view/6076/:

Timeline:

  • 0:00 I refresh the page
  • 0:04 the page reloads and I start moving to the right with click-and-drag on the blank space
  • 0:05 I stop, you can see that a few tasks show the "other assignee": the one in "Development in progress", the second one in "QA", and the only one (barely visible) in "design sign-off".
  • 0:06 The "other assignee" icons disappear and all the affected tasks (and columns) have a reflow

Steps to reproduce:

  • Go to a workboard which has cards with Other Assignee set.
  • Press Shft+R and see the Other Assignee disappear.

Event Timeline

Aklapper changed the task status from Open to Stalled.Jun 14 2025, 10:52 PM
Aklapper changed the subtype of this task from "Task" to "Bug Report".

I cannot reproduce this using Firefox 139 or Chromium 137.
Tasks with both an assignee and other assignee show both icons on that workboard; no one icon disappears here.

I have no good idea why that could happen... Wondering about browser add-ons (though unlikely); also does that also happen when logged out? Which browser?

For the records the whole "other assignee" stuff is custom downstream code inserted in https://phabricator.wikimedia.org/source/phabricator/browse/wmf%252Fstable/src/applications/project/controller/PhabricatorProjectBoardViewController.php

I cannot reproduce this using Firefox 139 or Chromium 137.
Tasks with both an assignee and other assignee show both icons on that workboard; no one icon disappears here.

I have no good idea why that could happen... Wondering about browser add-ons (though unlikely); also does that also happen when logged out? Which browser?

This is Chrome 137. A bunch of extensions enabled, so in principle it could've been that. But I also cannot reproduce it reliably. Yesterday while grabbing the video, it would happen every time I reloaded the page (I had to try a few times to get the recording right). Now I tried again a few times and it didn't happen. I logged out and it also did not happen. But then I logged back in and I could reproduce. Except it then stopped being buggy, and then it started again. So, I thought it could be some kind of race condition or something. I did a few hard reloads while trying to reproduce it and I'd like to say that it helped, but the sample isn't large enough to be statistically significant.

But then I managed to add a DOM breakpoint which thanfully outlived the page reload and grabbed the following trace from when stuff disappeared:

replace (core.pkg.js:332)
redraw (WorkboardCard.js:5)
updateCard (WorkboardBoard.js:137)
_onReloadResponse (WorkboardBoard.js:161)
(anonymous) (core.pkg.js:80)
pass (core.pkg.js:164)
_dispatchProxy (core.pkg.js:159)
invoke (core.pkg.js:102)
(anonymous) (core.pkg.js:78)
_done (core.pkg.js:248)
(anonymous) (core.pkg.js:252)
_complete (core.pkg.js:209)
setTimeout
load (core.pkg.js:197)
_handleResponse (core.pkg.js:252)
_onreadystatechange (core.pkg.js:236)
XMLHttpRequest.send
send (core.pkg.js:233)
_reloadCards (WorkboardBoard.js:161)
(anonymous) (WorkboardBoard.js:17)
pass (core.pkg.js:164)
_dispatchProxy (core.pkg.js:159)
invoke (core.pkg.js:102)
onAphlictMessage (core.pkg.js:1003)
_receive (core.pkg.js:977)
(anonymous) (core.pkg.js:82)
pass (core.pkg.js:164)
_dispatchProxy (core.pkg.js:159)
invoke (core.pkg.js:102)
(anonymous) (core.pkg.js:78)
_receiveBroadcast (core.pkg.js:1461)
broadcast (core.pkg.js:1446)
reconnect (core.pkg.js:974)
_didReconnect (core.pkg.js:969)
setTimeout
_open (core.pkg.js:968)
_onopen (core.pkg.js:1468)

core.pkg.js being https://phab.wmfusercontent.org/res/defaultX/phabricator/2eeda9e0/core.pkg.js

The node being replaced is:

<li class="phui-oi phui-oi-with-attrs phui-oi-with-handle-icons phui-oi-bar-color-violet phui-oi-with-actions phui-oi-with-2-actions phui-oi-enabled draggable-card phui-workcard" data-sigil=" project-card draggable-card" data-meta="1_26"><div class="phui-oi-frame"><div class="phui-oi-frame-content"><ul class="phui-oi-actions"><li class="phui-list-item-view phui-list-item-type-link phui-list-item-has-icon " data-sigil="edit-project-card"><a href="/maniphest/task/edit/386273/" class="phui-list-item-href" data-meta="0_361" data-sigil="has-tooltip"><span class="visual-only phui-icon-view phui-font-fa fa-pencil phui-list-item-icon" data-meta="0_362" aria-hidden="true"></span></a></li></ul><div class="phui-oi-content-box"><div class="phui-oi-table"><div class="phui-oi-table-row"><div class="phui-oi-col1"><div class="phui-oi-name"><span class="phui-oi-objname" data-sigil="ungrabbable">T386273</span> <a href="/T386273" class="phui-oi-link" title="Add new field to Event Registration to specify event type">Add new field to Event Registration to specify event type</a></div><div class="phui-oi-content"><ul class="phui-oi-attributes"><li class="phui-oi-handle-icons"><span class="phui-oi-handle-icon" style="background-image: url(https://phab.wmfusercontent.org/file/data/dmkuyaxet347ptiwvtlt/PHID-FILE-nv2fk46jhjnj54drmbqz/467a70-alphanumeric_lato-dark_C.png-0%2C0%2C0%2C0.png)" data-sigil="has-tooltip" data-meta="0_355"></span><span class="phui-oi-handle-icon" style="background-image: url(https://phab.wmfusercontent.org/file/data/247abt7phqlbitgglyxa/PHID-FILE-tx36db6dprvfuxu72bcj/alphanumeric_aleo-white_D.png-_ec9da1-0%2C0%2C0%2C0.png)" data-sigil="has-tooltip" data-meta="0_356"></span></li><li class="phui-oi-attribute"><ul class="phabricator-handle-tag-list "><li class="phabricator-handle-tag-list-item"><a href="/tag/campaignevents/" class="phui-tag-view phui-tag-type-shade phui-tag-blue phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-briefcase" data-meta="0_357" aria-hidden="true"></span>CampaignEvents</span></a></li><li class="phabricator-handle-tag-list-item"><a href="/tag/campaign-registration/" class="phui-tag-view phui-tag-type-shade phui-tag-orange phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-flag-checkered" data-meta="0_358" aria-hidden="true"></span>Campaign-Registration</span></a></li><li class="phabricator-handle-tag-list-item"><a href="/tag/okr-work/" class="phui-tag-view phui-tag-type-shade phui-tag-yellow phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-tags" data-meta="0_359" aria-hidden="true"></span>OKR-Work</span></a></li><li class="phabricator-handle-tag-list-item"><a href="/project/view/7913/" class="phui-tag-view phui-tag-type-shade phui-tag-orange phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-map-marker" data-meta="0_360" aria-hidden="true"></span>MW-1.45-notes (1.45.0-wmf.6; 2025-06-17)</span></a></li></ul></li></ul></div></div></div></div></div></div></div></li>

and the replacement:

<li class="phui-oi phui-oi-with-attrs phui-oi-with-handle-icons phui-oi-bar-color-violet phui-oi-with-actions phui-oi-with-1-actions phui-oi-enabled draggable-card phui-workcard" data-sigil=" project-card draggable-card" data-meta="1_45"><div class="phui-oi-frame"><div class="phui-oi-frame-content"><ul class="phui-oi-actions"><li class="phui-list-item-view phui-list-item-type-link phui-list-item-has-icon " data-sigil="edit-project-card"><a href="/maniphest/task/edit/386273/" class="phui-list-item-href" data-meta="2_162" data-sigil="has-tooltip"><span class="visual-only phui-icon-view phui-font-fa fa-pencil phui-list-item-icon" data-meta="2_163" aria-hidden="true"></span></a></li></ul><div class="phui-oi-content-box"><div class="phui-oi-table"><div class="phui-oi-table-row"><div class="phui-oi-col1"><div class="phui-oi-name"><span class="phui-oi-objname" data-sigil="ungrabbable">T386273</span> <a href="/T386273" class="phui-oi-link" title="Add new field to Event Registration to specify event type">Add new field to Event Registration to specify event type</a></div><div class="phui-oi-content"><ul class="phui-oi-attributes"><li class="phui-oi-handle-icons"><span class="phui-oi-handle-icon" style="background-image: url(https://phab.wmfusercontent.org/file/data/dmkuyaxet347ptiwvtlt/PHID-FILE-nv2fk46jhjnj54drmbqz/467a70-alphanumeric_lato-dark_C.png-0%2C0%2C0%2C0.png)" data-sigil="has-tooltip" data-meta="2_157"></span></li><li class="phui-oi-attribute"><ul class="phabricator-handle-tag-list "><li class="phabricator-handle-tag-list-item"><a href="/tag/campaignevents/" class="phui-tag-view phui-tag-type-shade phui-tag-blue phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-briefcase" data-meta="2_158" aria-hidden="true"></span>CampaignEvents</span></a></li><li class="phabricator-handle-tag-list-item"><a href="/tag/campaign-registration/" class="phui-tag-view phui-tag-type-shade phui-tag-orange phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-flag-checkered" data-meta="2_159" aria-hidden="true"></span>Campaign-Registration</span></a></li><li class="phabricator-handle-tag-list-item"><a href="/tag/okr-work/" class="phui-tag-view phui-tag-type-shade phui-tag-yellow phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-tags" data-meta="2_160" aria-hidden="true"></span>OKR-Work</span></a></li><li class="phabricator-handle-tag-list-item"><a href="/project/view/7913/" class="phui-tag-view phui-tag-type-shade phui-tag-orange phui-tag-slim phui-tag-shade phui-tag-icon-view "><span class="phui-tag-core "><span class="visual-only phui-icon-view phui-font-fa fa-map-marker" data-meta="2_161" aria-hidden="true"></span>MW-1.45-notes (1.45.0-wmf.6; 2025-06-17)</span></a></li></ul></li></ul></div></div></div></div></div></div></div></li>

Which is indeed missing the "other assignee".

Completely uneducated guess, by just looking at the last couple calls in the stack trace and the HTML above: some JavaScript code is redrawing the task cards and replacing the existing nodes with new nodes generated in JS; we're not hooking into whatever routines generate these new nodes in JS to add the "other assignee" icon.

Let me know if you need more information from the trace. I still have a tab with the debugger paused.

I'm not familiar with the phab internals, but from a quick read at the code, it's redrawing cards based on the response of an API request. So I reopened the board to trigger the bug, and there is indeed an API request being made to https://phabricator.wikimedia.org/project/board/6076/reload/. The response has a payload property with cards inside, and each card has a nodeHTMLTemplate. I grabbed the one for the task I used in T396878#10915619 and the HTML matches the "replacement" in that message; a couple attributes are different, but that may be because the task has been updated. What matters is that the HTML template in the response does not contain "other assignee".

From a quick code search, and based on https://phabricator.wikimedia.org/source/phabricator/browse/wmf%252Fstable/src/applications/project/application/PhabricatorProjectApplication.php$102, the endpoint handler seems to be https://phabricator.wikimedia.org/source/phabricator/browse/wmf%252Fstable/src/applications/project/controller/PhabricatorProjectBoardReloadController.php. This then leads to https://phabricator.wikimedia.org/source/phabricator/browse/wmf%252Fstable/src/applications/project/engine/PhabricatorBoardResponseEngine.php, which does indeed set a nodeHTMLTemplate property. Digging deeper, line 269 calls PhabricatorBoardRenderingEngine::renderCard, which returns a ProjectBoardTaskCard instance; setOtherAssignee() is called on this instance, at least. The HTML template is generated by stringifying $card->getItem(). Other assignee seems to be set there as well. And then, other assignees become just normal handle icons that the upstream code should be able to handle.

Something in this path must be broken, but I don't know what that is or how to test it.

A_smart_kitten changed the task status from Stalled to Open.Jul 4 2025, 5:25 PM
A_smart_kitten subscribed.

For the record, this also occurs for me. (Boldly un-stalling, as lack of reproducibility was the reason for being stalled IIUC)

Side note - thanks to coming across this commit message, I think I've found a way to (hopefully reliably!) reproduce this issue: navigate to a workboard that has tasks containing an 'other assignee', and press Shift+R on your keyboard.

Aklapper added a project: JavaScript.

and press Shift+R on your keyboard.

Indeed, I can confirm that. Congrats for finding this!

I've also noticed this quite a while ago. I have vague memory that it depended on whether I am using a filter or not to view the board.