Skip to content

Stage path and kanban read the select option's lifecycle kind: terminal options drawn apart from the steps, lost ones marked, instead of guessing from closed_won / closed_lost spelling #26612

Closed

Description

@objectstack-fleet

Source

Walked on 2026-10-27 on the published console 18.2.0 with HotCRM: the lead stage path draws 未通过 as the fifth step; the opportunity path draws Closed Won / ✗ Closed Lost apart only because the renderer recognises those two values by name. The spec's option kind (#23809) is published; nothing in ui/packages/plugin-detail (the stage path) or ui/packages/plugin-kanban (column order) reads it yet. HotCRM declares the kinds in its own card (objectstack-ai/hotcrm, filed beside this one).

Target

  1. The stage path lays out the open options as steps and the terminal options at the end as outcomes: the won/done one with a check when reached, the lost one with ✗ and never as a step; a record in a lost state shows the path stopped at its last open step with the lost chip.
  2. The kanban orders columns open → done → lost, and collapses lost columns by default with a count.
  3. The name-based guess (closed_won / closed_lost) stays as the fallback for packages that declare no kind, with a dev-mode warning naming the field.

File surface

ui/packages/plugin-detail/src/ (stage path), ui/packages/plugin-kanban/src/, the field metadata reader in ui/packages/app-shell, tests beside.

Acceptance

  1. Tests: a select with kinds renders the path with the lost option apart; without kinds the fallback renders as today with the warning.
  2. Screenshots of a lead (未通过) and an opportunity (Closed Lost) at 1280 px.

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-27 fifth review: objectstack main f9867020c6 (Object UI now under ui/), HotCRM 1f3f8880 on platform 18.2.0 (the published console at /_console, a fresh dev database), the maintainer's browser pane at 955 × 452 (zh-CN), plus cloud staging (the control-plane home and the test1016 tenant's build chat). The maintainer asked for every finding to be filed by where the fix lands, verbatim: 「全部立卡,按落点分仓;#25943 让车道正常派发。」

Activity

  1. added
    bugSomething isn't working
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Oct 27, 2026
  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: audit line · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T10:59Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01QsR2jTfvjNTaR29ehLk26T
    Account: zhuangjianguo
    Branch: claude/project-thread-1l75bu (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)
    Worktree: objectstack-issue-26612
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: ui/packages/plugin-detail/src/ (stage path), ui/packages/plugin-kanban/src/ (column order), the field metadata reader in ui/packages/app-shell, tests beside, one root changeset; ⛔ packages/spec/** and server packages (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; reason: the maintainer's standing rule 「只认领不需要 fable 的卡」, 2026-10-27T10:39Z), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: RecordPathRenderer (plugin-detail) and the kanban column order (plugin-kanban), both this lane, read the published option kind (#23809) · the platform path that may cover it: none, the kind is declared in the spec and no consumer reads it yet · reached by every reader of a record:path or a kanban over a select with terminal options (HotCRM lead and opportunity)
    Thread-read: 6440222656
    Premise: holds (no reader of option kind under ui/packages/plugin-detail or ui/packages/plugin-kanban on origin/main a76f811e, re-read at 2026-10-27T11:54Z)
    Serial constraints cleared: #26581 (this seat, thread waiting on a maintainer decision) also lands on record-path.tsx; this card goes first and #26581 rebases after it. No open PR touches record-path.tsx or plugin-kanban/src (scan 2026-10-27T11:54Z; #26556 bumps only plugin-kanban/package.json).

    Dispatched at 2026-10-27T11:55Z to the card thread on that branch; the order lives in the thread's opening message.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26612,
      "status": "done",
      "branch": "claude/project-thread-1l75bu",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26689",
      "head_sha": "ba8cc73a3f7e18a71158ce6c24e025beed4f82a1",
      "session": "session_01QsR2jSjdwziSeaPzNdLFi1",
      "premise_still_valid": true,
      "summary": "Measured on origin/main a76f811e: item 1 was partly done (record:path read a declared kind, but still spelling-guessed every option without one and laid stages out by position, so a lost option authored mid-list pulled later open/won options into the lost group); item 2 (kanban) and item 3 (dev warning) were open. record:path now keeps no name-based fallback once the status field declares any kind (absent reads as open, per the spec), lays stages out by kind (open steps, won terminus, lost apart; stable), marks every declared won as a terminus, and warns once in a dev build naming object, field and guessed stages when the fallback decides a stage. The kanban orders option-derived lanes open, won, lost and starts lost lanes collapsed (spine plus count, openable); authored columns and kind-less fields are unchanged. No new key, prop or export; app-shell needed no change.",
      "tests": "head ba8cc73a. New: record-path.declaredKindLayout-26612.test.tsx (7) and ObjectKanban.laneLifecycle-26612.test.tsx (6). Lock: cd ui && vitest run packages/plugin-detail/ packages/plugin-kanban/ --maxWorkers=2 -> Test Files 394 passed, 1 skipped (395); Tests 3441 passed, 18 skipped; VERDICT command-exit 0. record-path suites plus both new files: 12/12 files, 90/90 tests. type-check: turbo type-check for both packages (49 tasks with ^build) -> plugin-kanban green, plugin-detail red on 2 TS7006 in the new test, fixed in ba8cc73a, then plugin-detail pnpm run type-check (tsc --noEmit && tsc -p tsconfig.test.json) exit 0. Ablations via scripts/ablation-replace.mjs from source (no dist between), each restored to the HEAD blob with git diff HEAD empty: A1 per-option guess gate -> 1 failed/6; A2 no by-kind sort -> 3 failed/4; A3 last-forward-only won -> 1 failed/6; A4 warning effect returns early -> 1 failed/6 (first attempt was a refused no-op, anchor 1->1, rerun with a distinct replacement); A5 lanesFromOptions ignores kind -> 3 failed/3.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 34 derived from 6 paths vs merge base a76f811e; all 34 exit 0, captured before any pipe (PR-body gates through GITHUB_EVENT_PATH on the final body; check:type-check-debt and pnpm --dir ui exec vitest run scripts/ under the lock, the latter with --maxWorkers=2 added: 178 passed, 2 skipped files). --ran: '34 derived famil(ies) accounted for — 34 run, 0 NOT-MEASURED (a DERIVED zero ...)'. Extra: ui/scripts/check-new-cross-file-line-citations.mjs 0 new, exit 0. CI check-runs on PR #26689: in_progress at report time, not awaited.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "line_budget": "+555 / -20 over 6 files (575 changed lines), under the 3000 threshold; no skills/** touched",
      "files_changed": [
        ".changeset/26612-stage-path-kanban-option-kind.md",
        "ui/packages/plugin-detail/src/renderers/record-path.tsx",
        "ui/packages/plugin-detail/src/renderers/__tests__/record-path.declaredKindLayout-26612.test.tsx",
        "ui/packages/plugin-kanban/src/ObjectKanban.tsx",
        "ui/packages/plugin-kanban/src/kanbanLaneLifecycle.ts",
        "ui/packages/plugin-kanban/src/ObjectKanban.laneLifecycle-26612.test.tsx"
      ],
      "deviations": [
        "PR reviewer request for zhuangjianguo not made: the harness asks for it through GitHub MCP, the seat's rule forbids MCP writes, and the relay pr_create carries assignees only. Assignee zhuangjianguo is set (read back).",
        "Card acceptance 2 (screenshots of a HotCRM lead and opportunity at 1280 px) NOT MEASURED: no HotCRM in this container; DOM pins assert the layout instead.",
        "pnpm --dir ui exec vitest run scripts/ ran with --maxWorkers=2 added to the derived command."
      ],
      "mcp_calls": "0 — no GitHub MCP calls (card and comment reads via plain REST GET)",
      "api_writes": "2 — fleet-write relay repository_dispatch fw-20261027T125207Z-94ad2e (run 40507189006: pr_create -> POST /repos/objectstack-ai/objectstack/pulls + assignees), and this os-dev-report comment via post-stamped",
      "open_questions": [
        {
          "question": "Card target 1 asks that a record in a lost state show the path stopped at its last open step. The record carries only its current value, so the PR draws the lost stage current, apart, with the forward steps untravelled (as main does). Build the last-open-step view?",
          "options": ["A: no; the current lost chip is the answer and the card closes", "B: a child card that reads the stage field's history (audit/field history) to mark the last open step travelled"],
          "recommendation": "A, because the four axes: no measured demand beyond the card's sentence, and B adds a history read to a readout block (startup-stage focus); revisit on a named user ask"
        }
      ],
      "out_of_scope_findings": []
    }

    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

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uipm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions