You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Record page v3 body tables total every number column — a version number and an instalment number are summed into 「本页合计 版本号 10 / 期次 15」 #29943
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.tsxBodyTableTotals: 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.
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.
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/main21510bba: the code the card names is unchanged)
Serial constraints cleared: none (#29897metadata-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)
{
"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"
]
}
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:ui·pm:queue· 2026-11-03T16:58Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:ui#1 · os-support-ai · session_01WGufzjDyeFwq6AuFu3vwTd
Claim: PM loop round 1 · 2026-11-03T17:37Z
Session:
session_01WGufzfSkDtGdeCZgsqhyHH(card thread; dispatching seatsession_01WGufzjDyeFwq6AuFu3vwTd)Account:
os-support-aiBranch:
claude/project-thread-bo68rr(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29943Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-detail/src/RelatedList.tsx(BodyTableTotalsregion) 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: highClause-②: 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 bodyThread-read: 6610266863
Premise: holds (re-read on
origin/main21510bba: the code the card names is unchanged)Serial constraints cleared: none (#29897
metadata-admin/ResourceEditPage.tsx; #29951 record-header action paths inapp-shell/src/views//components/.../action-bar.tsx; no claim touchesui/packages/plugin-detail/**)Order:
/mnt/project-files/ui-orders/29943.md· maintainer scope 「车队可以继续派发了,只派发 p1 p2 ,总并发不超过 20」 (2026-11-03T15:40Z)objectstack-fleet commentedon Nov 3, 2026
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
objectstack-fleet commentedon Nov 3, 2026
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.objectstack-fleet commentedon Nov 3, 2026
domain:ui#1 · os-support-ai · session_01WGufzjDyeFwq6AuFu3vwTd
Landed · PR #29966 ·
6e68d8fdda· 2026-11-03T19:53Z6e68d8fddaorigin/maincontentgit 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:dispatchedremoved in this stroke.