feat(task-board): draw the columns the board says it has - #6716
Merged
Conversation
The client stopped assuming it knows every column in #6710; now it stops assuming it knows the SET. `laneVisibility` takes the columns the board read returned instead of starting from the hardcoded `STATUSES`, so an org that owns its board gets its own columns, in its own order, under its own names. A board with no columns draws none. Falling back to Studio's lanes would file an org's cards under names nobody there chose, which is the failure this whole direction exists to remove. The delivery-lane and hidden-lane rules still apply, and still only to lanes Studio defined — `isDeliveryLane` is false for a key we did not invent, so they fall away on an org board without a special case. Also regenerates the tool contracts, which were stale on main: `tool-io.ts` still carried the closed status union #6710 removed and was missing the `org_board_columns` flag. Typecheck passed anyway because the API compiles against Zod and the stale union is a subset — the client was the only thing being lied to, which is exactly where it matters. `TaskTab` in home-tasks is named outright rather than `Extract`ed from a card's status: extracting three literals from an open `string` collapses to `never`, which silently reduced the strip to one tab.
decocms Bot
pushed a commit
that referenced
this pull request
Aug 28, 2026
PR: #6716 feat(task-board): draw the columns the board says it has Bump type: minor - decocms (apps/api/package.json): 4.298.2 -> 4.299.0 - @decocms/native (apps/native/package.json): 4.298.2 -> 4.299.0 - @decocms/shared (packages/shared/package.json): 0.71.2 -> 0.72.0 Deploy-Scope: web
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What is this contribution about?
#6710 taught the client to tolerate a column key it does not know. This teaches it to stop assuming it knows the set.
laneVisibilitynow takes the columns the board read returned, instead of starting from the hardcodedSTATUSES:So an org that owns its board gets its own columns, in its own order, under its own names.
useTaskBoardItemscarries them through fromTASK_BOARD_ITEM_LIST, and the board threads them into the lane renderer.A board with no columns draws none. Falling back to Studio's lanes would file an org's cards under names nobody there chose — the exact failure this whole direction exists to remove — so the empty case is asserted first.
The delivery-lane and hidden-lane rules survive and still apply only to lanes Studio defined:
isDeliveryLaneis false for a key we did not invent, so those rules fall away on an org board with no special case for it.A stale artifact this uncovered
packages/shared/src/tools/tool-io.tswas out of date on main. It still carried the closed status union that #6710 removed, and was missing theorg_board_columnsflag added in #6698.Typecheck passed anyway, which is the interesting part: the API compiles against Zod, and a stale narrower union is a subset, so nothing on the server noticed. The client was the only thing being lied to — and the client is exactly where the contract matters. Regenerated here.
That also explains a bug it was hiding:
TaskTabinhome-taskswasExtract<TaskBoardItemStatus, "in_progress" | "in_review" | "done">. Withstatusopen,Extractfrom a barestringcollapses toneverand the strip silently reduced to a single "All" tab. Named outright now — those three are Studio's own lanes, which is what that strip is about.How did you verify your code works?
Two new cases in
config.test.ts, both about the thing that is new rather than the thing that already worked:BACKLOG,Fazendo,Code Review) — and withdeliveryEnabled: false, assertinghiddenandhideableare empty, i.e. Studio's lane rules do not leak onto a set it did not define;{ lanes: [], hidden: [], hideable: [] }, not the nine lanes.The existing
laneVisibilitycases keep passing with an explicitCANONICALcolumn set, which is the honest way to say "these describe the board Studio ships".apps/web/src+apps/api/src/tools/task-board: 3545 pass / 114 fail, against a baseline of 3543 / 114 measured by stashing and re-running — same failures, two more tests.bun run check0 errors,bun run lintat baseline,knipclean,fmt:checkclean.Not verified, flagging honestly:
titleis still not used. Columns carry the tracker's own name and the client still renderslaneLabel(key, t), which translates a canonical key and otherwise shows the raw key. For a Jira board that means "Code Review" renders asCode Review(the key happens to be the name) but a renamed column would show the old key. Wiringtitlethrough is small and belongs with the sync that first produces titles worth showing.archivedis a Studio lane; an org board has no such column, so a card archived there would sit in no column. The FK does not catch it (board_column_orgis null for those) and nothing renders it. Real, and it needs an answer before any org turns the flag on.Screenshots/Demonstration
Not captured. With
org_board_columnsoff — every org today — the board is unchanged.How to Test
org_board_columns: trueon a test org with no columns — the board should draw nothing, not Studio's lanes.positionorder, with their own names.Migration Notes
None. No schema change.
tool-io.tsis regenerated; the diff widensstatustostringand addsorg_board_columnsto the flags, both of which the server already accepted.Review Checklist
Summary by cubic
Makes the task board render the columns the board read returns instead of starting from the hardcoded Studio
STATUSES. An org that owns its board now sees its own columns, in the server's order, and a board with no columns draws none rather than falling back to Studio's nine lanes.New Features
isDeliveryLaneis false for a key the client did not invent.org_board_columnsflag enabled; with it off, the board is unchanged.Bug Fixes
tool-io.tswas stale on main — regenerated;statusis nowstringand the missingorg_board_columnsflag is added, both of which the server already accepted.TaskTabinhome-taskscollapsed toneverwhenExtracted from the openstringstatus, silently leaving a single "All" tab; the three Studio lanes are now named outright.Not verified: no live browser check, and column
titleis not yet rendered — a renamed column would show its raw key. A card moved toarchivedon an org board has nowhere to go, since that lane is Studio's.Written for commit a892fb9. Summary will update on new commits.