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.

tree / Org Chart: cells render raw values (a boolean shows as true) #11686

Closed

Description

@objectstack-fleet

Path: ② the capabilities an end user meets in the app — tree views | 缺项 | P2

Split by the triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U from objectui#11672 (the 2026-10-06 console dogfood sweep, showcase, framework ce577ec4), item 14. Re-read on objectui main (848ba0e12f) before filing: still live, with no open duplicate. ⛔ Not a claim, ⛔ not a dispatch.

Triage: lands in packages/plugin-tree/src/ObjectTree.tsx (String(value), about :598) ⇒ domain:ui; rationale: the tree stringifies values instead of using the field display faces.

What happens

Setup → Business Units (Org Chart view) renders the boolean "Active" column as the text true.

Done when

  • Tree cells render through the same field display faces as list cells: booleans, options, dates.
  • Pin: the Active column renders the boolean face, localized.

Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 6, 2026
  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01DrKzdPdyLLBW3qpZ4vtk7z
    Account: huangyiirene
    Branch: claude/issue-11686-tree-cell-display-faces
    Worktree: objectui-issue-11686
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/plugin-tree/src/ — ObjectTree.tsx's cell value formatter (the return String(value); tail, about :598, and the call sites that print its result) and the tests beside it; packages/plugin-tree/package.json only if a workspace dependency on the package that owns the list cell faces must be added; and .changeset/11686-*.md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; default tier)
    Clause-②: no
    Thread-read: none
    Serial constraints cleared: none. No open objectui PR touches packages/plugin-tree/** (objectui#11718, #11069 and the release PR objectui#11600 were read); seat 2's in-flight objectui#11680, #11682 and #11684 are on components, core and plugin-detail files. Queued sibling objectui#11689 owns the read-only boolean WORDS (packages/fields/src/widgets/BooleanField.tsx "Yes"/"No"); this card does not edit that file, and is not folded with it (fold gate ①: different defect — a missing face vs. untranslated words in an existing face). Read 2026-10-06T13:50Z.

    Why Clause-②: no: tree cells start rendering through the faces list cells already use. That widens no accepted input and adds no export, prop, type member or i18n key to anything a package entry reaches.

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 11686,
      "status": "done",
      "branch": "claude/issue-11686-tree-cell-display-faces",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11721",
      "session": "session_01DrKzdPdyLLBW3qpZ4vtk7z — the dispatching PM seat's session (subagent run, so the parent's id)",
      "premise_still_valid": true,
      "summary": "The Org Chart tab is sys_business_unit's org_chart list view (type tree), which ListView's case 'tree' hands to object-tree, i.e. plugin-tree's ObjectTree; its formatCellValue ended in return String(value), so the boolean active column printed true (H1 confirmed). New renderTreeCell draws every cell whose column has a DECLARED type through @object-ui/fields' published two-step getCellRenderer(resolveCellRendererType(field)), the resolution grid, kanban, gallery and report use (H2), handing the face the column key as name, the renderer key as type, translateOptions-translated options and the header's translated label; untyped columns keep the old string and the overlay plain fallback is unchanged (H3: the string fed display only). H4: the boolean face draws a checkbox for true and, for false on a status-named field, a FIELD-LABEL — Off badge whose label is now localized; the word Off and the Completed / Not completed accessible names are hard-coded English in BooleanCellRenderer (packages/fields/src/index.tsx), a file objectui#11689 does NOT list, so they are named below for folding into that family rather than riding it as the order assumed. plugin-tree now declares @object-ui/fields (workspace:*): no cycle, and it already reached fields at runtime through plugin-detail's built entry.",
      "tests": {
        "union_head": "142121e",
        "gates": [
          "bash os-verify-lock.sh -c \"pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-tree^...' build\" → 0 → os-verify-lock: VERDICT command-exit 0 (Scope: 13 of 47 workspace projects, @object-ui/fields built; closure packages untouched by the diff)",
          "pnpm --filter @object-ui/plugin-tree build → 0 → os-verify-lock: VERDICT command-exit 0 (dts built; @object-ui/fields stays external in dist/index.js)",
          "pnpm --filter @object-ui/plugin-tree test @142121e → 0 → Test Files 24 passed (24) · Tests 178 passed (178) · os-verify-lock: VERDICT command-exit 0",
          "pnpm --filter @object-ui/plugin-tree type-check @142121e (script name echoed: type-check → tsc --noEmit && tsc -p tsconfig.test.json; tsc --listFiles shows the new test in tsconfig.test.json) → 0 → os-verify-lock: VERDICT command-exit 0",
          "vitest run ObjectTree.cellFaces-11686 + ObjectTree.fieldFormatting (verbose) → 0 → Tests 11 passed (11): 5 new pins + the 6 objectui#6014 pins",
          "pnpm check:control-bytes @142121e → 0 → check-control-bytes: OK (scanned 7664 tracked text file(s); skipped 85 binary)",
          "pnpm check:new-line-citations @142121e → 0 → VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0",
          "pnpm check:changeset-claims @142121e → 0 → No pending changeset names a file this change touches.",
          "pnpm check:pending-changeset-literals @142121e → 0 → No test source names a pending changeset.",
          "pnpm check:phantom-deps @142121e → 0 → Every in-scope import is declared by the package that publishes it.",
          "pnpm check:unused-deps @142121e → 0 → Every gated declaration has a consumer in the package that declares it.",
          "pnpm check:lockfile-integrity @142121e → 0 → VERDICT clean — no @objectstack/* identity moved backward and no package gained a copy.",
          "ADDED pnpm check:lockfile-dedupe @142121e (lockfile touched) → 0 → VERDICT deduped — pnpm dedupe would collapse nothing in this lockfile.",
          "ADDED pnpm check:test-path-roots @142121e (new test file) → 0 → check-test-path-roots: OK",
          "ADDED node scripts/check-changeset-presence.mjs @142121e (changeset) → 0 → 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)",
          "ADDED node scripts/check-changeset-no-major.mjs @142121e (changeset) → 0 → No changeset declares a major bump.",
          "node scripts/check-governed-queue-guard.mjs --test (the 5 paths) → 0 → NOT GOVERNED — 5 path(s) checked against 5 governed surface(s); none matched.",
          "eslint --no-inline-config --format json on the 2 touched source files → 0 → 2 files, 0 errors; ObjectTree.tsx 24 warnings = base 24 (measured on the c910630 blob); test file 0. Invariance: flat config has empty parserOptions (no project / projectService), no import/* rules, no object-ui/* rule reads fs or type services, so the diff cannot move an untouched file's verdict. Repo-wide pnpm lint left to CI.",
          "ablation (from committed 506a6e5, objectstack scripts/ablation-replace.mjs wrap mode, under the lock): renderTreeCell forced to the old string; anchor x1→x0, blob 9a76f60b→b395115b; result Tests 4 failed | 7 passed — each face pin red at its own assertion (expected 'true' not to contain 'true'; expected 'false' not to contain 'false'; expected '2024-03-05' not to be '2024-03-05'; zh pin 'true'), untyped-bound pin + 6 objectui#6014 pins green; restore: blob after restore 9a76f60b == HEAD, git diff HEAD empty. No dist in the path: subject imported as ./ObjectTree (src) and @object-ui/fields aliased to src by vitest.config.mts, so no rebuild leg applies."
        ],
        "not_measured": [
          "NOT MEASURED: check:eager-closure, reason: needs a full console vite build (CI Bundle Analysis); stated instead: plugin-tree already imports @object-ui/plugin-detail statically and plugin-detail's dist entry imports @object-ui/fields statically, so the new edge adds no module to any closure",
          "NOT MEASURED: live console run of the Org Chart tab, reason: not required by the card; the ListView mount shape is pinned in unit tests"
        ],
        "deviations": [
          "pnpm-lock.yaml is outside the claim's named file surface: it changed only as the mechanical consequence of the allowed package.json dependency (a 3-line importer entry; lockfile-integrity and lockfile-dedupe green)",
          "first ablation run (at 6a5fa29) was not evidence: all 5 new pins went red at a shared wait-for-checkbox helper; the helper now waits on a schema-arrival signal the old code also produced (506a6e5) and the ablation was rerun from committed state",
          "union full suite: three lock windows ended queue-timeout exit 99 (holder pid 23576, pnpm exec vitest run --maxWorkers=2 packages/app-shell/, held at least 1785s, then finished on its own), so the PR body declares a narrowing citing the suite at 506a6e5; a fourth attempt acquired and measured the suite directly at 142121e (24/178 green). The PR body's 'Declared narrowing' paragraph is therefore superseded; dev did not PATCH it (seat may replace it with: full suite 24 files / 178 tests and type-check green at 142121e under the lock)",
          "conflict named: the harness attribution reminder asks for a model-bearing Co-Authored-By trailer and a different PR footer; the os-dev definition and objectui AGENTS.md govern, so commits carry the model-free pair (Claude-Session + Co-authored-by: Claude) and the PR ends with the session-URL footer"
        ],
        "files_changed": [
          ".changeset/11686-tree-cell-display-faces.md",
          "packages/plugin-tree/package.json",
          "packages/plugin-tree/src/ObjectTree.cellFaces-11686.test.tsx",
          "packages/plugin-tree/src/ObjectTree.tsx",
          "pnpm-lock.yaml"
        ]
      },
      "mcp_calls": "0 — none",
      "api_writes": "3 REST writes, each a POST /repos/objectstack-ai/objectstack/dispatches relayed as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (#11721, draft, body read back identical 10031/10031 bytes); (2) label-write --assign huangyiirene → PR #11721 assignees (read back MATCHES; zero label writes); (3) this os-dev-report → POST /repos/objectstack-ai/objectui/issues/11686/comments. Plus git push of the one branch (4 pushes: empty probe + 3 commits; not REST). Otherwise REST reads only (card, its comments, objectui#11689, PR read-back).",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: objectui#11689 (family fold, not a separate card) · BooleanCellRenderer in packages/fields/src/index.tsx hard-codes the badge word Off (FIELD-LABEL — Off) and the completion indicator accessible names Completed / Not completed, drawn on every list surface and now the tree; objectui#11689 lists BooleanField.tsx, FormulaField.tsx, lookupColumnDisplay.tsx and HomePage.tsx only · evidence: the zh pin in ObjectTree.cellFaces-11686.test.tsx renders the badge with 启用 beside the English word Off · dedupe words: BooleanCellRenderer Off badge, Completed aria-label, boolean cell i18n, hard-coded English boolean · noted, not filed",
        "carrier: objectui#11689 implementer · ObjectGrid hands its cell face fieldMeta.label = the authored fieldDef.label while its header uses resolveFieldLabel, so under a non-en pack the grid's Off badge names the column in the authored language; after objectui#11721 the tree's names it like its header · noted, not filed",
        "carrier: 承接者:无 · packages/plugin-tree/vite.config.ts names no UMD output.globals for @object-ui/fields (new), @object-ui/plugin-detail, @object-ui/permissions, react/jsx-runtime, so the build warns MISSING_GLOBAL_NAME and guesses; ESM output unaffected · Acceptance notes only, noted, not filed"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — PR objectui#11721 (head 142121e)

    domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · reviewed against the PR diff and check runs, read 2026-10-06T15:00Z. Report: os-dev-report on this card.

    • Shape: draft → main; body line 1 Fixes #11686; Clause-②: no at line start; PR assignee huangyiirene (= card).
    • Scope: 5 files. The 4 in the claim's surface, plus pnpm-lock.yaml (+3, the importer entry for the new @object-ui/fields workspace dependency, which the claim allowed; declared in deviations). Nothing under content/docs/releases/. Governed guard: NOT GOVERNED. +332/−3.
    • Clause-② re-read on the diff: renderTreeCell and CellFormatContext are module-private. No export, prop, type member or locale key is added to the @object-ui/plugin-tree entry ⇒ no holds and no contract review is owed.
    • Mechanism checked on the diff: the label cell and every other cell now go through getCellRenderer(resolveCellRendererType({type, format})). Untyped columns keep formatCellValue, and the overlay fallback is unchanged. Options are translated through translateOptions as before (objectui#6014's pins green). The face's label is the header's own fieldLabel(field).
    • Changeset (@object-ui/plugin-tree patch; the package is published, private unset). Sentences checked against the diff:
      • "Each tree cell whose column the object defines now draws through the field package's cell display…": matches renderTreeCell's declared-type guard.
      • "A column the object does not define keeps the plain text": matches the !declaredType arm.
      • "…it uses the column label the tree's header shows, so it reads in the session's language": true of the label. The badge's own word Off stays English; that is carried to objectui#11689 below.
      • "Nothing is added to the package entry": matches.
    • Tests: 5 new pins in ObjectTree.cellFaces-11686.test.tsx, including the card's zh pin. Ablation from committed state turned the 4 face pins red at their own assertions while the untyped-bound pin and the 6 objectui#6014 pins stayed green; the restore was proven by the blob hash. Local union at 142121e: 24 files / 178 tests, plus type-check (script name echoed).
    • CI at 142121e: 44 check runs. Not yet converged at this read: Type Check and test shards 1–4 and 6–8 are in_progress; every completed run is success or an expected skip. Enqueue waits for every check to be green.
    • Deviation the seat corrects: the PR body's "Declared narrowing" paragraph predates the dev's fourth lock attempt, which measured the full suite at 142121e. The seat rewrites that paragraph; nothing else in the body changes.
    • Out-of-scope findings:
      • BooleanCellRenderer's hard-coded Off / Completed / Not completed (packages/fields/src/index.tsx): folded into objectui#11689, the boolean-words card, as an enumerated extra site (comment there). Not a new card.
      • The grid's fieldMeta.label comes from the authored label while its header is translated (packages/plugin-grid/src/ObjectGrid.tsx): folded into objectui#11689, same family, same comment.
      • plugin-tree's UMD output.globals gaps: Acceptance notes only. ESM is unaffected and nothing reads the UMD globals.

    Next: once every check on the head is green, the seat flips the PR to ready and enables auto-merge (merge queue).


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11721 → main a58626c

    domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · verified 2026-10-06T15:26Z.

    • Merged through the merge queue at 2026-10-06T15:25:25Z. The PR was added to the queue at 2026-10-06T15:08:56Z.
    • Content check against the first parent:
      • a58626c is one squash commit on parent 7300fca. It changes 5 files, +332/−3, the same as the PR.
      • git diff 142121e a58626c over those 5 paths is 0 bytes: the landed bytes are the reviewed head's bytes.
      • On main: renderTreeCell hits ObjectTree.tsx, and @object-ui/fields is declared in packages/plugin-tree/package.json.
    • Card: closed completed by the PR's Fixes. pm:dispatched was removed and read back. The assignee is kept.
    • Landing window: only this card closed between 15:20Z and the read. No other card was closed by a closing keyword.
    • Carried: the two boolean-face family sites are on objectui#11689 (comment 6019099345).

    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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions