You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
bug(llc): Kanban swimlane humanItems() filters on assignee_type === 'human' but backend only ever writes 'user' #13954
Discovered while implementing #13937 (AssigneeType enum SSOT).
Evidence
Backend AssigneeType (now the canonical SSOT in autobot-backend/llc/models/enums.py) has exactly two members: USER = "user" and AGENT = "agent". Every write site (work_item_service.py, handoff.py) persists "user" for the human branch — never "human".
autobot-frontend/src/views/llc/workItemTypes.ts:40 types the field as assignee_type?: 'human' | 'agent' | null.
The swimlane split on the Kanban board is a silent no-op for the human lane: it can never match a real row because the backend value is always 'user', never 'human'. agentItems() (line 163, === 'agent') does match correctly, so the board looks like it works (agent items show) while human items are structurally invisible to that filter — the same "lying detector" pattern as #13852's cluster.
Fix
Either:
Change the frontend type/comparison to 'user' | 'agent' (matches the backend SSOT), or
This issue understates the bug — do not start with the string literal.
Verified while reviewing PR #13955: the 'human' vs 'user' mismatch is the third defect in a chain, not the first. The board renders zero cards in every column regardless, because autobot-backend/llc/api/boards.py:245-248 returns {board, columns} with no top-level items key while KanbanBoardView.vue:226 reads itemsData.items ?? []. _work_item_summary() also omits both assignee_type and column_id.
Full chain filed above. Whoever picks this up would otherwise change one string, see nothing change, and be confused.
Also relevant here: workItemTypes.ts:40 types the field 'human' | 'agent' | null — 'user' is absent, so the fix is a type change too.
Delivered in PR #14043 (via #13993, which supersedes this framing — this was the third defect in a three-defect chain that made the board render zero cards in every column).
Option 1 as recommended here, no backend change:
autobot-frontend/src/views/llc/workItemTypes.ts:46 — assignee_type?: 'user' | 'agent' | null (was 'human' | 'agent' | null, a union that did not contain the value the backend actually sends).
autobot-frontend/src/views/llc/KanbanBoardView.vue:159 — humanItems() now filters === 'user'.
grep -rn "assignee_type" autobot-frontend/src confirms no 'human' literal remains anywhere in the frontend.
Guarded by a regression test that mutation-proves specifically this defect: reverting only the 'user' → 'human' comparison turns the swimlane test red (2 cards → 1) while the other three tests stay green, so the assertion is specific to this bug rather than incidentally coupled to the shape fix.
The CoWorkerType {agent,human} vs assignee {user,agent} vocabulary fork remains open as #13970 and is untouched.
The human swimlane now filters on 'user', matching what the backend actually writes at every write
site. workItemTypes.ts was retyped and its provenance comment corrected — it had claimed assignee_type was board-only, when in fact the work-items response emits it and only column_id is
board-only.
Scope note recorded on this issue earlier still stands: this string was the third defect in a
chain, not the first. The board rendered zero cards regardless, because the API returns {board, columns} with items nested per column while three frontend views read a nonexistent
top-level items key. That was #13993, fixed in the same PR, along with a fourth broken caller
(GanttTimelineView) that the original issue never mentioned.
Mutation evidence from review: reverting only this 'user' → 'human' literal reddens exactly
one test (swimlane split uses the backend vocabulary), confirming the assertion is specific rather
than incidental.
Related follow-ups spun out of the same work: #14074 (sprint/burndown never render), #14075 (board
summary typed as full WorkItem, so the detail drawer shows a blank description), #14062 (fixtures
asserting API shapes the backend never returns), #14064 (load failure renders as a legitimately
empty board).
Activity
mrveiss commentedon Aug 11, 2026
This issue understates the bug — do not start with the string literal.
Verified while reviewing PR #13955: the
'human'vs'user'mismatch is the third defect in a chain, not the first. The board renders zero cards in every column regardless, becauseautobot-backend/llc/api/boards.py:245-248returns{board, columns}with no top-levelitemskey whileKanbanBoardView.vue:226readsitemsData.items ?? []._work_item_summary()also omits bothassignee_typeandcolumn_id.Full chain filed above. Whoever picks this up would otherwise change one string, see nothing change, and be confused.
Also relevant here:
workItemTypes.ts:40types the field'human' | 'agent' | null—'user'is absent, so the fix is a type change too.mrveiss commentedon Aug 11, 2026
Delivered in PR #14043 (via #13993, which supersedes this framing — this was the third defect in a three-defect chain that made the board render zero cards in every column).
Option 1 as recommended here, no backend change:
autobot-frontend/src/views/llc/workItemTypes.ts:46—assignee_type?: 'user' | 'agent' | null(was'human' | 'agent' | null, a union that did not contain the value the backend actually sends).autobot-frontend/src/views/llc/KanbanBoardView.vue:159—humanItems()now filters=== 'user'.grep -rn "assignee_type" autobot-frontend/srcconfirms no'human'literal remains anywhere in the frontend.Guarded by a regression test that mutation-proves specifically this defect: reverting only the
'user'→'human'comparison turns the swimlane test red (2 cards → 1) while the other three tests stay green, so the assertion is specific to this bug rather than incidentally coupled to the shape fix.The
CoWorkerType {agent,human}vs assignee{user,agent}vocabulary fork remains open as #13970 and is untouched.mrveiss commentedon Aug 11, 2026
Delivered in PR #14043, squash-merged into
Dev_new_guias93f64153f.Closing manually:
Closes #NNNdoes not fire onDev_new_gui(only on the default branch), and thePR body named this issue.
Verified on the merged base, not assumed:
The human swimlane now filters on
'user', matching what the backend actually writes at every writesite.
workItemTypes.tswas retyped and its provenance comment corrected — it had claimedassignee_typewas board-only, when in fact the work-items response emits it and onlycolumn_idisboard-only.
Scope note recorded on this issue earlier still stands: this string was the third defect in a
chain, not the first. The board rendered zero cards regardless, because the API returns
{board, columns}with items nested per column while three frontend views read a nonexistenttop-level
itemskey. That was #13993, fixed in the same PR, along with a fourth broken caller(
GanttTimelineView) that the original issue never mentioned.Mutation evidence from review: reverting only this
'user'→'human'literal reddens exactlyone test (
swimlane split uses the backend vocabulary), confirming the assertion is specific ratherthan incidental.
Related follow-ups spun out of the same work: #14074 (sprint/burndown never render), #14075 (board
summary typed as full
WorkItem, so the detail drawer shows a blank description), #14062 (fixturesasserting API shapes the backend never returns), #14064 (load failure renders as a legitimately
empty board).