Skip to content

Record page v3 body tables total every number column — a version number and an instalment number are summed into 「本页合计 版本号 10 / 期次 15」 #29943

Closed

Description

@objectstack-fleet

repo:hotclm#1 · zhuangjianguo · session_01QsR2jUw8KJgAwuwk6sqYLD

Filing gate: ① user-visible defect, reproduced in the browser on @objectstack 18.3.0 (hotclm 18.3 upgrade pass; hotclm decision-box batch 11, maintainer 「同意」 2026-11-03T16:16:59Z).

Symptom. On a hotclm contract page the full-width body tables (relatedList: 'primary' via inlineEdit) end in a totals line. It adds up every number column, including ordinals:

  • 合同版本 (versions v1–v4): 「本页合计 版本号 10」 — 1+2+3+4.
  • 收付款计划 (5 instalments): 「本页合计 期次 15 · 计划金额 3,380,500 · 实际金额 1,352,200」 — the instalment number summed, and the two amounts of a EUR contract summed with no currency.

Where. ui/packages/plugin-detail/src/RelatedList.tsx BodyTableTotals: TOTALLED_FIELD_TYPES = {currency, number, integer, decimal} totals any column of those types (objectstack#27055 Target 8). clm_contract_version.version_no and clm_payment_plan.seq are Field.number with scale: 0 — identifiers, not quantities — and there is no field- or list-level way to say "do not total this column". The currency branch only reads currencyConfig.defaultCurrency, so a number amount whose currency lives in the parent's currency_code prints bare.

Expected capability. Totals only where the author says a column is additive (an opt-in on the field or on the related list), or at least an opt-out; and amounts formatted in the record's currency when one is declared.

Evidence: /mnt/project-files/hotclm-objectstack-18-3-upgrade/02-detail-counsel-2.png and -3.png. Platform version: 18.3.0.

Activity

  1. added
    bugSomething isn't working
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:ui · pm:queue · 2026-11-03T16:58Z

    ⛔ Not a claim.

    • Read fresh. Reproduced on 18.3.0: v3 record-page body tables total every number column, so a version number and an instalment number are summed (「本页合计 版本号 10 / 期次 15」). A wrong figure on a released page, so p2. The fix totals only columns declared summable, such as currency or a declared aggregate. The rule is the ui seat's call from precedent.

    Generated by Claude Code

  3. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    pm:queueReady for the PM dispatch loop
    on Nov 3, 2026
  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-support-ai · session_01WGufzjDyeFwq6AuFu3vwTd

    Claim: PM loop round 1 · 2026-11-03T17:37Z
    Session: session_01WGufzfSkDtGdeCZgsqhyHH (card thread; dispatching seat session_01WGufzjDyeFwq6AuFu3vwTd)
    Account: os-support-ai
    Branch: claude/project-thread-bo68rr (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29943
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-detail/src/RelatedList.tsx (BodyTableTotals region) and its tests, one root .changeset/ file (stop on breach; explain in the report)
    Container & model: S/M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui code produces it (domain:ui) | no platform path covers it | every Studio/Console user who reaches the surface named in the card body
    Thread-read: 6610266863
    Premise: holds (re-read on origin/main 21510bba: the code the card names is unchanged)
    Serial constraints cleared: none (#29897 metadata-admin/ResourceEditPage.tsx; #29951 record-header action paths in app-shell/src/views/ / components/.../action-bar.tsx; no claim touches ui/packages/plugin-detail/**)
    Order: /mnt/project-files/ui-orders/29943.md · maintainer scope 「车队可以继续派发了,只派发 p1 p2 ,总并发不超过 20」 (2026-11-03T15:40Z)

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-support-ai · session_01WGufzfSkDtGdeCZgsqhyHH
    os-dev-report
    Stamp: 2026-11-03T18:21Z

    {
      "issue": 29943,
      "status": "done",
      "branch": "claude/project-thread-bo68rr",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29966",
      "session": "session_01WGufzfSkDtGdeCZgsqhyHH",
      "premise_still_valid": true,
      "summary": "BodyTableTotals in ui/packages/plugin-detail/src/RelatedList.tsx now totals a currency column only when every counted row resolves (resolveFieldCurrency, the cell's reader: fixed code / tenant default for dynamic / the row's currencyField for record) to one currency, formatted with formatCurrency; a number/integer/decimal column only when the record page's own object (useRecordContext().objectSchema, provided by RecordDetailView) declares a summary field with summaryOperations {function: sum, object: this child, field: this column}; nothing else, and no line when nothing qualifies. No fetch added, no spec key. hotclm reading: number amounts with the currency on the parent's currency_code get no total unless a sum roll-up declares them, and then a plain-number total; the spec route to a currency total is currency + currencyMode record + a currencyField on the child (ADR-0144 D2). The hotclm screenshots path named in the order is not in this project's shared folder, so that reading is from the card text. Card assignee untouched.",
      "tests": "pnpm --dir ui exec vitest run packages/plugin-detail/src/__tests__/RelatedList.bodyTable-27055.test.tsx: 12 passed (12) (9 new in a top-level describe in the existing harness; the 27055 case updated: quantity no longer totalled, fixture currencyConfig gains currencyMode fixed). Full suite after plugin-detail build: pnpm --dir ui exec vitest run --maxWorkers=2 packages/plugin-detail/ VERDICT command-exit 0, Test Files 369 passed / 1 skipped (370), Tests 3250 passed / 18 skipped. pnpm --filter @object-ui/plugin-detail type-check (tsc --noEmit && tsc -p tsconfig.test.json) VERDICT command-exit 0. Closure build plugin-detail^... VERDICT command-exit 0. Ablation via scripts/ablation-replace.mjs on fix commit 1ba2ba51 (gate line restored to the old type set): anchor 1 to 0, blob 4270c0b477d1 to d31d47e2ca1d, 5 tests red incl. 'totals no ordinal column'; restored blob == HEAD 4270c0b477d1, git diff HEAD empty. Subject imported from src (../RelatedList), no dist in the path. All on head ad05c644.",
      "gates": "dispatch-gates --commands derived 35 on head ad05c644; all 35 exit 0 (incl. node scripts/check-sdui-manifest.mjs exit 0); dispatch-gates --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. CI check-runs on PR 29966: in_progress at report time (not awaited per os-dev).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "1 — mcp__github__issue_read (card read); no MCP write tools",
      "api_writes": "2 — fleet-write pr_create (PR 29966, read back identical, 11682 bytes, no assignees, no labels); post-stamped comment on issue 29943 (this report). Plus git push (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: an authored-column related list's $select projects only drawn columns plus predicate operands, so a record-mode currency amount whose currencyField column is not drawn arrives without its code; the cell renders no symbol and the new totals line reads it as unknown and draws no total. Fix would add drawn record-mode amounts' currencyField to the projection through the same declared+FLS gate. Not reproduced at a public door, so not class a. Dedupe words: related list select currencyField, record-mode currency projection, body table currency code"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-support-ai · session_01WGufzjDyeFwq6AuFu3vwTd

    ACCEPT → PR #29966 comment 6612113074 · head ad05c644 · 2026-11-03T18:25Z. Landing waits for every check green on that head.

  7. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-support-ai · session_01WGufzjDyeFwq6AuFu3vwTd

    Landed · PR #29966 · 6e68d8fdda · 2026-11-03T19:53Z

    Probe Reading
    PR #29966 merged by the merge queue at 2026-11-03T19:50Z, merge commit 6e68d8fdda
    origin/main content git grep -c "rolledUpSumFields|agreedRowCurrency" origin/main -- ui/packages/plugin-detail/src/RelatedList.tsx: 5; TOTALLED_FIELD_TYPES: 0 hits (the type-only rule is gone)

    ACCEPT 6612113074 · card closed by Fixes #29943 (completed); pm:dispatched removed in this stroke.

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions