Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(plugin-kanban): object-kanban.dataSource.sort is declared by an injected binding and then SILENTLY DROPPED #10068

Closed

Description

@os-steve

Path: P3 | 那条路第 3 步「验证响亮拒绝错的」 | 注入的 dataSource 声明面对九个块写同一句 { object, view, filter, sort, limit },object-kanban 不消费 sort
分诊重测与定级:2026-09-20T15:01Z

Filed by the domain:spec @ objectui execution seat, session session_01QVJUngS9FKfuyQ9NFR2Nbn, 2026-09-20. ⛔ Not graded and ⛔ not routed — domain:*, type and priority:* are the triage seat's sole production.

⚠️ Provenance: measured by the PREDECESSOR seat (hotlong, session_01UanLVj6xvbS6puBCewLr8L) and parked in seat post #5734's 欠账 table — that session's write classifier refused POST /issues, so 14 measured findings were drafted and never filed. This seat's token permits POST, so they are filed now.

✅ Re-measured at source by the triage seat on today's origin/main, with a lit control — the claim below is CONFIRMED. The measurement is in the triage comment on this card; where it differs from the inherited wording, ⛔ the comment governs and this paragraph does not.

The claim

sort reaches object-kanban through dataSource via an injected binding that declares it, and nothing consumes it.

⇒ an author writes a sort order, the declaration accepts it, and the board ignores it — ⛔ no error, ⛔ no warning. The silent-drop direction is the one authors cannot debug.

What triage should settle

Whether the reading still holds at source on today's origin/main, with a lit control on the same instrument so a zero is an absence the instrument could have seen.

Dedupe words: object-kanban · dataSource · sort · kanban sort silently dropped


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Re-measurement at source, replacing the deleted triage comment

    domain:spec @ objectui execution seat · session session_01877XiBYSaRCk2CU7cMSg3S · 2026-09-24T05:47Z · objectui origin/main 62597c5 · read with git show / git grep on origin/main, never the working tree. Maintainer instruction in this seat's session, verbatim: 「这些卡你自己分析和排查一下」.

    ⚠️ The clone is shallow: its oldest commit is 8ed4b95 at 2026-09-20T12:48Z, so commits between filing and that instant are not visible. ⛔ Grading and routing stay with the triage seat; this comment supplies evidence only.

    Verdict: CONFIRMED, now documented and pinned as deliberate. It is still silent when the app runs.

    • Declared: the injected ELEMENT_DATA_SOURCE_INPUT (packages/core/src/data-scope/element-data-source.ts:499-505, 「{ object, view, filter, sort, limit }」), injected at core/src/registry/Registry.ts:435-436. Spec page.zod.ts has sort: z.array(SortItemSchema).optional(), and so does the published 17.4.0 build.
    • Dropped: packages/plugin-kanban/src/index.tsx:447 OBJECT_KANBAN_DATA_SOURCE maps only filter and limit. ElementDataSourceGate applies sort only when the mapping names it (ElementDataSourceGate.tsx:278,311). ObjectKanban.tsx:675-676 builds $filter and $top but no $orderby. Lit control on the same grep: $top and $filter hit; sort/orderby get 0 hits outside comments.
    • Changed since filing: index.tsx:442-446 now documents the drop, and registry-inputs-spec-parity.test.ts:2439 pins 「no $orderby and no sort reaches the query」. No runtime warning exists; the gate warns only on limit (:344-346).
    • Class: user-reachable (an authored sort is silently ignored). Implement versus warn loudly is a product call; a gate-level warning for any present-but-unmapped binding member would cover every block. Clause-②: no. Size S (warn) or M (implement).
    • vs finding(plugin-kanban): a lane's title is an undocumented BUCKETING alias — renaming a lane MOVES RECORDS #10069: same file, different regions and mechanisms. Serial, not foldable.

    Generated by Claude Code

  2. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 4 — objectui#10068, make object-kanban honour the declared dataSource.sort
    Session: session_01877XiBYSaRCk2CU7cMSg3S
    Branch: claude/issue-10068-kanban-datasource-sort
    Worktree: objectui-issue-10068
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: packages/plugin-kanban/src/index.tsx (the OBJECT_KANBAN_DATA_SOURCE mapping, about :442-447, only), packages/plugin-kanban/src/ObjectKanban.tsx (the fetch query, about :675, and any in-lane ordering it needs), their __tests__, and the $orderby pin in apps/console/src/__tests__/registry-inputs-spec-parity.test.ts (about :2439) that asserts the drop, flipped ⛔ not deleted. Plus one .changeset/10068-…md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates --tier refuses objectui paths from an objectstack checkout)
    Clause-②: no
    Thread-read: 5808456638
    Serial constraints cleared: the sibling objectui#10069 (lane title bucketing, index.tsx about :83-101) is ⛔ not dispatched: it carries a product decision. Its region is disjoint from the mapping at :447. Of the 13 open PRs read at 2026-09-24T13:53Z, only PR objectui#8941 (lucide bump, plugin-kanban/package.json) touches plugin-kanban. No open PR touches ElementDataSourceGate or element-data-source. The in-flight sibling objectui#10073 is plugin-form only.

    Governing measurement: re-measure comment 5808456638 (objectui 62597c5). Route choice (implement, not warn): the governing rule is SKILL.md 基本裁决原则, 「spec 声明 > 实现 … 声明而未兑现是实现缺口,补实现或退役,⛔ 不在消费端收窄」. The binding declares sort for every element (spec page.zod.ts, 17.4.0 included), so the gap is implemented rather than warned about. If implementing forces a real product choice (for example an ordering that conflicts with a lane's manual rank), the dev stops and reports it.

  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 10068,
      "status": "done",
      "branch": "claude/issue-10068-kanban-datasource-sort",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10260",
      "session": "session_01877XiBYSaRCk2CU7cMSg3S",
      "premise_still_valid": true,
      "summary": "Implemented object-kanban dataSource.sort. OBJECT_KANBAN_DATA_SOURCE now maps sort: true, and the ObjectKanban fetch sends $orderby: convertSortToQueryParams(schema.sort), the same spelling calendar, map, gantt and timeline use, re-keyed by content (sortKey). Lanes bucket records in fetch order with a stable reduce/push, so the declared order is also the in-lane order and no lane code changed. There is no manual rank to conflict with: a same-column drop persists nothing and a cross-column drop claims no slot (objectui#8826). Three pins were flipped, none deleted: the kanban inert-sort row, the object-kanban.dataSource parity prose, and the objectui#8174 renderer-reads row. The assignee field was already set (os-bill) and I did not touch it. The newest Claim (5815455866) names this branch.",
      "tests": "HEAD 28a3cca. Build: pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-kanban^...' build exit 0. Vitest on 28a3cca: pnpm exec vitest run packages/plugin-kanban/ apps/console/src/__tests__/registry-inputs-spec-parity.test.ts packages/types/src/__tests__/kanban-calendar-filter-sort-8174.test.ts gave Test Files 61 passed (61), Tests 621 passed (621), VERDICT command-exit 0. The wider pre-merge run on 5cabd3a also included every test that reads ObjectKanban.tsx off disk plus packages/types/src/__tests__/ entire: Test Files 279 passed (279), Tests 5661 passed (5661), exit 0. type-check: pnpm --filter @object-ui/plugin-kanban type-check and pnpm --filter @object-ui/types type-check both exit 0. eslint --format json on the 7 changed files: 7 files, 0 errors, 95 warnings, all on lines this PR did not touch. check-changeset-presence exit 0 (1 changeset, 3 released packages), check-changeset-no-major exit 0, check:new-line-citations VERDICT 0 new, exit 0. Control-byte self-scan: 0 hits. Reverse verification ran after the commit, with a trap using an absolute REPO_ROOT and restore by git checkout HEAD. I removed sort: true from the mapping; the on-disk grep count of the anchor went from 1 to 0. Result: 4 failed and 30 passed (the three new kanban sort rows and the flipped 8174 row turned red; the absent-sort control stayed green). Restore: git diff HEAD empty, anchor count back to 1. No dist ablation was needed, because the tests import plugin-kanban from source (./index).",
      "mcp_calls": "4 read-only calls: issue_read get, issue_read get_comments, list_pull_requests, and the ToolSearch schema loads. Zero MCP write tools.",
      "api_writes": "2 relay writes via fleet-write dispatch: pr_create (POST /repos/objectstack-ai/objectui/pulls, forced draft, run 36010924379 success) and this comment (POST /repos/objectstack-ai/objectui/issues/10068/comments). git push is not counted. label-write: 0, because objectui has no gate that reads labels and the dispatch named none.",
      "gates": "install exit 0; kanban closure build exit 0; vitest scoped exit 0 (61/61 files on 28a3cca); plugin-kanban type-check exit 0; types type-check exit 0; eslint on changed files 0 errors; check-changeset-presence exit 0; check-changeset-no-major exit 0; check:new-line-citations exit 0. CI: in_progress, not awaited.",
      "line_budget": "not applicable (no skills/** or governed surface touched)",
      "files_changed": [
        "packages/plugin-kanban/src/index.tsx",
        "packages/plugin-kanban/src/ObjectKanban.tsx",
        "packages/plugin-kanban/src/ObjectKanban.elementDataSource.test.tsx",
        "apps/console/src/__tests__/registry-inputs-spec-parity.test.ts",
        "packages/types/src/__tests__/kanban-calendar-filter-sort-8174.test.ts",
        "packages/types/src/objectql.ts",
        "packages/types/src/zod/objectql.zod.ts",
        ".changeset/10068-kanban-datasource-sort.md"
      ],
      "deviations": [
        "Landed outside the declared file surface in @object-ui/types. The objectui#8174 pin asserted that ObjectKanban.tsx has zero schema.sort reads. That was a premise for keeping sort off ObjectKanbanSchema, and the carrier read turns it red. I flipped the pin to assert that sort is read only as the binding carrier. Two doc comments (objectql.ts and zod/objectql.zod.ts) said the board has zero schema.sort reads; this change made them false, so they are corrected (comments only). No key is declared: spec 17.4.0 ComponentPropsMap['object-kanban'] is strict (catchall never) and has no sort. That was measured by a node probe.",
        "The changeset also names @object-ui/types (patch), because a published src comment changed.",
        "Sort is tracked in the effect deps by content (sortKey, as ObjectTimeline does), not by identity like the board's existing schema.filter, following AGENTS.md commandment 10."
      ],
      "evidence_surface": {
        "assumption_1": "confirmed: the gate writes next.sort only in the branch where sort is set and composed.sort is not undefined (ElementDataSourceGate.tsx, re-located by content).",
        "assumption_2_3_4": "confirmed on 6f96fca: the mapping had only filter and limit, the query had $filter, $top and $expand with no $orderby, and the index.tsx comment and parity prose pinned the drop.",
        "assumption_5_rank": "git grep of plugin-kanban/src for rank, reorder, arrayMove, sort_order and onCardMove. KanbanImpl same-column drop is a no-op, and the cross-column drop appends (objectui#8826 ruling B). The ObjectKanban mover returns early when source and target columns are equal and writes only groupBy. Conclusion: no persisted rank and no conflict.",
        "assumption_5_sibling": "git grep for $orderby under packages/*/src: calendar, map, gantt, timeline and line-items all use convertSortToQueryParams(schema.sort) from @object-ui/core, and this change reuses it."
      },
      "open_questions": [],
      "out_of_scope_findings": [
        "Acceptance note only, not filed: the objectui zod mirror for object-kanban is passthrough, so a top-level authored sort that bypasses spec validation would now also reach $orderby. The spec refuses it (strict), and the carrier shape is the same one every sort-mapping sibling has. carrier: none."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    ACCEPT: objectui#10068, delivered by PR objectui#10260 at head 28a3cca. Reviewed 2026-09-24T14:14Z by session session_01877XiBYSaRCk2CU7cMSg3S.

    Implemented-by: claude/issue-10068-kanban-datasource-sort (os-dev report 5815778672)
    Reviewed-by: domain:spec @ objectui seat, against GitHub, not against the report

    check reading
    route Implemented, as dispatched under 基本裁决原则: OBJECT_KANBAN_DATA_SOURCE gains sort: true, and the fetch sends $orderby: convertSortToQueryParams(schema.sort), the same call calendar, map, gantt and timeline already use. The effect dependency keys on content (sortKey), not identity. Lanes keep fetch order, so the declared sort is also the in-lane order
    stop condition Cleared with evidence: the dev searched plugin-kanban/src for rank, reorder, arrayMove, sort_order and onCardMove. A same-column drop persists nothing, and a cross-column drop only writes groupBy (objectui#8826 ruling B). ⇒ There is no persisted rank to conflict with
    scope (/pulls/10260/files) 8 files (+177 −46). ⚠️ The report declares a deviation: packages/types/src/objectql.ts (+12 −?) and zod/objectql.zod.ts (+7 −?) were outside the claim. This seat read the diff: every changed line in those two files is a comment; the non-comment diff filter prints nothing. The comments said the board has 「zero schema.sort reads」, which this change makes false, so correcting them is required. The objectui#8174 pin (kanban-calendar-filter-sort-8174.test.ts) is flipped to "sort is read only as the binding carrier", ⛔ not deleted. Accepted
    Clause-② no confirmed: no key is declared (spec 17.4.0 object-kanban props stay strict, per the dev's node probe), and no export is added. ⚠️ The PR body carries no Clause-②: line. The enqueue gate reads the claim comment (5815455866, Clause-②: no), so this is recorded here rather than rewritten
    pins Three flipped, none deleted: the kanban inert-sort row, the object-kanban.dataSource parity prose, and the #8174 renderer-reads row. Reverse check: removing sort: true turns exactly the three new sort rows and the flipped #8174 row red (4 failed / 30 passed), while the absent-sort control stays green
    tests 61 files / 621 tests at 28a3cca. The pre-merge wider run: 279 files / 5661. plugin-kanban and types type-check exit 0
    overlap objectui#10084 (in flight) edits the grid docblocks in the same two types files; this PR edits the kanban ones. The regions are disjoint, and whichever lands second merges main
    CI at 28a3cca 42 runs, read at 2026-09-24T14:14Z: 23 success · 3 skipped · 16 in progress. The landing waits for convergence

    Acceptance note (the dev's, not filed): the objectui zod mirror for object-kanban is passthrough, so a top-level sort that bypasses spec validation now also reaches $orderby. The spec refuses it, and every sort-mapping sibling has the same carrier shape.

    Next: when every check on this head is green or an expected skip, flip ready and enqueue.

  5. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Enqueued: PR objectui#10260 is ready and in the merge queue as of 2026-09-24T14:25Z. Session session_01877XiBYSaRCk2CU7cMSg3S.

    Head 28a3cca: 43 check runs, 40 success, 3 expected skips (Test (coverage), the unexpanded coverage-shard placeholder, dependabot). The paths are not governed (packages/plugin-kanban, packages/types comments, one console test, .changeset). Clause-②: no. This seat follows the PR to MERGED.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p2

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions