Skip to content

Kanban board draws only the declared lanes, in their order: ObjectKanban reads kanban.lanes #28211

Closed

Description

@objectstack-fleet

domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

Filing gate: ③ the renderer half of #28018, whose contract half lands in PR #28196 (claim 6526161926 and amendment 6526184775 name this follow-up; contract review 6528382115 PASS). ⛔ Not a claim. Triage sets the lane and grade.
Reach: any kanban whose view filters out a status. HotCRM's task board filters out completed tasks but still draws an always-empty Completed lane, and its author cannot reorder lanes, until the console reads the key.

Observed (once PR #28196 is on main)

  • KanbanConfigSchema.lanes (packages/spec/src/ui/view.zod.ts) is declared: an ordered list of the group field's stored option values. Lint refuses a non-option lane (list-view-kanban-lane-unknown) and a repeat (list-view-kanban-lane-repeated) at validate, build and the publish door.
  • ui/packages/plugin-kanban/src/ObjectKanban.tsx effectiveColumns (≈L1453–1482) still builds one lane per explicit column or per option and reads no lane list, so the key draws nothing. The liveness/view.json kanban row names lanes at planned strength.

Wanted

  • effectiveColumns filters and orders its lane list by kanban.lanes when set. A record whose value is not listed lands in the existing Uncategorized lane (≈L1819–1873), never hidden. Test plus ablation.
  • The liveness note moves lanes from planned to live in the same PR, with the reader as evidence.
  • Riders named by the contract review 6528382115 (should-fix, non-blocking): S1 an author of lanes gets no "declared, not yet drawn" word today, because the blanket kanban row cannot carry authorWarn. Flipping the row to live here closes it. S2 a one-line note in the checkKanbanLanes module docblock that any future widening of inline options must join its option map.

Dedupe words: kanban lanes renderer, effectiveColumns lanes, hide empty kanban lane, kanban lane order.

Links back: #28018, PR #28196.

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 看数据的视图 | none | P②

    Triage: p3 · domain:ui · area:records · 2026-10-30T18:16Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 6 · 2026-10-31T02:44Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibymteTr9Zsy1aSkJPt, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-b1o0dq (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28211
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-kanban/src/**, packages/spec/liveness/view.json (the kanban row only), tests, root changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
    Metadata-protocol: none
    Responsibility: the console Kanban draws only the declared kanban.lanes, in their order (renderer half of #28018)
    Thread-read: 6530215469
    Premise: holds (PR #28196 is on main; effectiveColumns reads no lane list)
    Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. domain:ui#2 and #4 are off duty.

    Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28211.md under FRAME.md.

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment · 2026-10-31T02:45Z · amends claim 6537960788 after the card thread's read-only pre-check on origin/main 6285203d. Append-only.

    File surface (replaces the claim's): the kanban branches of ui/packages/plugin-list/src/ListView.tsx and ui/packages/plugin-view/src/ObjectView.tsx; one shared helper in @object-ui/core; tests in those packages, plus a pin in ui/packages/plugin-kanban; the packages/spec/liveness/view.json kanban row only; a root changeset. Stop and explain on any breach.

    Why: ObjectKanban never receives kanban.lanes. Both object-kanban producers forward only named block keys, and ComponentPropsMap['object-kanban'] has no lanes. Adding one would be a spec edit, which the triage exception doesn't cover. So the producers map kanban.lanes onto the existing node key columns ({ id, title } in the author's order, the title taken from the option label, a lost-kind lane collapsed: true per #26612). An unlisted value still lands in Uncategorized, both when the client buckets values and when the lanes page, so nothing is hidden.

    Clause-②: no (the seat's expectation; a new @object-ui/core export would move it to yes (widening), and the dev measures it on the diff)

    Riders: S2 doesn't ride (checkKanbanLanes is in packages/lint, outside the liveness file). The TSDoc on KanbanConfigSchema.lanes ("Lands ahead of its reader…") goes stale once this lands. That is a spec-source edit outside this card, and the seat files it, together with S2, as a domain:spec follow-up after this PR merges.

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibymteTr9Zsy1aSkJPt
    os-dev-report

    {
      "issue": 28211,
      "status": "done",
      "branch": "claude/project-thread-b1o0dq",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28291",
      "session": "session_01L9qibymteTr9Zsy1aSkJPt",
      "premise_still_valid": true,
      "summary": "The card's effect holds, but the order's mechanism did not: ObjectKanban never receives kanban.lanes, because both object-kanban producers forward only named block keys and ComponentPropsMap['object-kanban'] declares no lanes. Per claim amendment 6537973671, the new @object-ui/core kanbanDeclaredLanes maps kanban.lanes onto the node's existing columns key: the author's order, option labels as titles, a lost-kind lane collapsed. ListView (case 'kanban') and ObjectView#generateViewSchema (case 'kanban') both call it, and ObjectKanban.tsx is unchanged. Unlisted values land in Uncategorized, both when the client buckets values and when lanes page. The liveness view.json kanban row now records lanes as live.",
      "tests": "head 8f4d9c61: new pins core kanban-declared-lanes-28211 (4), plugin-kanban ObjectKanban.declaredLanes-28211 (3), plugin-list ListView.kanbanDeclaredLanes-28211 (2), plugin-view ObjectView.kanbanDeclaredLanes-28211 (2), all green. Suites: vitest packages/core/ + packages/plugin-kanban/ 306 files 4723 passed 27 skipped; packages/plugin-view/ 78 files 716 passed; packages/plugin-list/ shard 1/2 85 files 794 passed, shard 2/2 89 files 908 passed. type-check exit 0 in ui core, plugin-kanban, plugin-list, plugin-view (real dts closure build). Ablation via scripts/ablation-replace.mjs --delete of the columns spread in ListView.tsx and in ObjectView.tsx: anchor 1 -> 0 landed, producer test 1 failed | 1 passed (columns arm red, control green), restored blob == HEAD with git diff HEAD empty. No dist hop (ui packages resolve to source).",
      "gates": "dispatch-gates --commands derived 67; all run with stdin closed; --ran reconciliation exit 0: 66 run, 1 NOT MEASURED. pnpm check:dual-build-cjs-loads :: exit 3 (PREREQUISITE NOT MET, full workspace dist), left to CI Lint & Repo Gates. node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 3 first (shallow clone missing 621a4876), exit 0 after fetching that commit. Every other derived command exit 0, including node scripts/check-sdui-manifest.mjs, pnpm --filter @objectstack/spec run check:liveness, pnpm check:doc-authoring. eslint --no-inline-config on changed TS files exit 0 (0 errors). PR check-runs: in_progress at report time.",
      "line_budget": "517 changed lines (+510/-7) across 10 files, under the 3000 human-merge threshold",
      "files_changed": [
        ".changeset/28211-kanban-declared-lanes.md",
        "packages/spec/liveness/view.json",
        "ui/packages/core/src/index.ts",
        "ui/packages/core/src/utils/kanban-declared-lanes.ts",
        "ui/packages/core/src/utils/__tests__/kanban-declared-lanes-28211.test.ts",
        "ui/packages/plugin-kanban/src/ObjectKanban.declaredLanes-28211.test.tsx",
        "ui/packages/plugin-list/src/ListView.tsx",
        "ui/packages/plugin-list/src/__tests__/ListView.kanbanDeclaredLanes-28211.test.tsx",
        "ui/packages/plugin-view/src/ObjectView.tsx",
        "ui/packages/plugin-view/src/__tests__/ObjectView.kanbanDeclaredLanes-28211.test.tsx"
      ],
      "deviations": [
        "File surface widened before any edit (claim amendment 6537973671): kanban branches of ListView.tsx and ObjectView.tsx plus one @object-ui/core helper, in place of ui/packages/plugin-kanban/src/**.",
        "Clause-②: yes (widening), against the claim's no: a new @object-ui/core export (kanbanDeclaredLanes, KanbanDeclaredLane, KanbanLaneOption).",
        "One ListView.tsx hunk sits outside case 'kanban': the @object-ui/core import line. That matters for the serial overlap with seat 4's #25918. origin/main had not touched ListView.tsx as of 03:30Z, so neither PR has landed first yet.",
        "ui AGENTS.md #2 docs-driven not covered: no package README or content/docs/frontend page is in the surface."
      ],
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "6: issue_read get x1, issue_read get_comments x2 (#28211), plus 3 ToolSearch schema loads; 0 writes",
      "api_writes": "2: fleet-write relay pr_create (PR #28291), and this os-dev-report comment via post-stamped.mjs",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: domain:ui#1 seat (spec follow-up after merge) · S2 docblock line in packages/lint/src/validate-list-view-field-refs.ts checkKanbanLanes, plus the stale 'Lands ahead of its reader' sentence in the KanbanConfigSchema.lanes TSDoc (packages/spec/src/ui/view.zod.ts) · noted, not filed"
      ]
    }
  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment 2 · 2026-10-31T03:32Z · amends claim 6537960788 (and amendment 6537973671) after the card thread's os-dev-report 6538446315. Append-only.

    Clause-②: yes (widening: @object-ui/core gains the public export kanbanDeclaredLanes and its two types; the liveness kanban row's lanes moves from planned to live; no accept set moves)

    The seat expected this in amendment 1, and the dev's measure on PR #28291 confirms it, so the PR goes to the contract-review lane before the seat lands it.

    Seat read on head 8f4d9c61, no blockers so far:

  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-31T04:29Z · PR #28291 (seat ACCEPT 6538755730, pinned to 8f4d9c61; contract-review PASS 6538743783).

    reading value
    PR merged 2026-10-31T04:26:06Z as 85a1b9d8 through the merge queue, on the first pass
    origin/main content ui/packages/core/src/utils/kanban-declared-lanes.ts is present. Both object-kanban producers (ListView.tsx, ObjectView.tsx) hand declared lanes to the board as columns. The liveness view.json kanban row reads lanes as live.

    State: Fixes #28211 closes the card as completed. pm:dispatched comes off in the same stroke as this note. The review's boundary flag (the stale KanbanConfigSchema.lanes TSDoc, plus rider S2's checkKanbanLanes docblock line) is filed as domain:spec follow-up #28319, as committed. Nothing else remains on this card.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uienhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions