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
List grid: a formula field with returnType currency renders as a bare number ("90,000.00") beside a currency field ("$150,000.00") in the showcase Projects list #27494
Found in the 18.3.0 release-candidate browser walkthrough (wave anchor #27377, card W3-UX), at framework main @ c4c515ad, Console built in-repo from the same commit.
Repro (fresh boot)
Boot examples/app-showcase with --seed-admin and sign in as admin. Viewport 1440×900.
Open Showcase → Projects.
Expected
Budget Remaining shows its currency like Budget does. It is declared Field.formula({ returnType: 'currency', currencyConfig: { currencyMode: 'fixed', defaultCurrency: 'USD' }, scale: 2 }) in examples/app-showcase/src/data/objects/project.object.ts, the shape #22727 added for this case.
Actual
A row reads $150,000.00 for Budget beside 90,000.00 for Budget Remaining in the same row.
Possibly the same gap elsewhere (seen, not traced): the approvals inbox amounts 1,500.5 and 198, and the approval request page's Total 8,900.00 / Approved 0.00 on an expense report.
Claim: PM loop round 1 · 2026-10-29T16:42Z
Session: session_01Utp6CY2n1JmZZKrHgtp9jC (seat; implementation by a card thread, mode:thread)
Account: os-bill
Branch: claude/project-thread-34d66a (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
Worktree: objectstack-issue-27494
Domain: domain:ui
Seat: domain:ui#2
File surface: the formula cell renderer(s) in ui/packages/fields/src/** / ui/packages/plugin-grid/src/** that draw the list and related-list cell (measured by the dev: ui/packages/plugin-grid/src/objectGridGenerateColumns.tsx's picked-key field bags), + ui/packages/plugin-detail/src/fieldEnrichment.ts (the record page's enriched keys; a widening the seat accepted 2026-10-29), tests beside, a changeset; ⛔ ui/packages/plugin-detail/src/RelatedList.tsx (held by open PR #27636, #27056 — the related-list cell follows after it lands, under #27430 row 1); ⛔ packages/spec/**, every server file, examples/** (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no (expected; the dev measures from the diff)
Metadata-protocol: none (expected; the dev measures from the diff)
Responsibility: the console's formula cell path (draws a declared returnType: 'currency' as a bare number) | FormulaField's existing currency branch (objectui#12111) is the face to reach | every reader of a currency formula in a list or related list, today
Thread-read: 6495354739
Premise: partly holds — on origin/mainFormulaField.tsx already draws currency for returnType: 'currency', so the cell path that bypasses it is unmeasured; step 1 of the order measures whether the served metadata carries returnType and which renderer draws the cell, and stops if the metadata drops it
Serial constraints cleared: none — no open PR touches FormulaField.tsx or the formula cell renderers (read 2026-10-29). Triage 6495354739 folds this card into #27430 row 1: the PR carries Fixes #27494 + Refs #27430 (row 1 only); #27430 rows 2–4 stay unclaimed
Dispatch order: /mnt/project-files/ui-seat2/dispatch-27494.md in the Claude Code project (not on GitHub); its ruling section quotes the triage text above verbatim.
{
"issue": 27494,
"status": "done",
"branch": "claude/project-thread-34d66a",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27689",
"session": "session_01Utp6CYFYwzxE4fR2Vr1sQo (card thread; seat session_01Utp6CY2n1JmZZKrHgtp9jC)",
"premise_still_valid": true,
"summary": "Premise partly held, as the Claim said: FormulaField and FormulaCellRenderer already draw returnType currency through the currency faces; the served metadata carries returnType, currencyConfig and scale (GET /api/v1/meta/object/showcase_project on a fresh showcase boot). The defect was the hosts that rebuild a field bag from a picked key list without returnType: plugin-grid objectGridGenerateColumns (three configured-column paths) and plugin-detail ENRICHED_FIELD_METADATA_KEYS (record page). Both now forward returnType verbatim beside currencyConfig (4 code lines, no formatter, no spec change); live Projects list read 180,000.00 with the grid fix ablated and $180,000.00 on the branch. The related-list cell (RelatedList makeCell) is deferred per the seat until PR #27636 lands; Refs #27430 row 1.",
"tests": "Merged head 0191a4f9: pnpm --dir ui exec vitest run --maxWorkers=2 packages/plugin-grid/ packages/plugin-detail/ -> Test Files 595 passed | 1 skipped (596), Tests 5347 passed | 18 skipped (5365), lock VERDICT command-exit 0. Targeted (2 new + gridFixedCurrency-10354 + currencyConfigRelay-12242 + fieldEnrichment) -> 5 files, 36 tests passed. Ablation (source; ui vitest resolves @object-ui/* to src): grid anchor 'fieldMeta.returnType = ' --expect 3, blob 90f02baa3e9c -> 6aac6616f1bb, Tests 6 failed | 4 passed (10) with cells [$150,000.00, 90,000.00, 1,234.50, 4,321], restored blob == HEAD; detail anchor \" 'returnType',\", blob 910282667aac -> 35f03459ed4a, Tests 2 failed | 1 passed (3), restored blob == HEAD, git diff HEAD empty. A first grid leg was refused ANCHOR AMBIGUOUS (nothing written) and re-run with --expect 3.",
"gates": "Local on 0191a4f9: pnpm --filter @object-ui/plugin-grid run type-check :: exit 0; pnpm --filter @object-ui/plugin-detail run type-check :: exit 0; dispatch-gates --commands: 34 derived, 34 run, all exit 0, --ran reconciliation 0 NOT-MEASURED 0 UNRUN (incl. node scripts/check-sdui-manifest.mjs :: exit 0 and --self-test :: exit 0). pnpm check:type-check-debt first exit 3 (PREREQUISITE NOT MET, closure build queue-timeout behind this card's own locked test run), re-run alone under the lock :: exit 0. pnpm --dir ui exec vitest run scripts/ :: exit 0 (169 passed | 2 skipped files). ui pnpm check:new-line-citations :: exit 0 (0 new). CI families (type-check lanes, Lint UI, Test UI, Build & E2E UI, Lint & Repo Gates): in_progress on PR #27689 at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "1 — mcp__github__issue_read (get #27494); no MCP write tool",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no assignees, no labels) via repository_dispatch run 40927636152, body read back 9153/9153 bytes identical; this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/27494/comments). Plus git pushes of the branch (not REST). Harness post-PR assign/review step skipped per the dispatch order.",
"line_budget": "code 14 lines (+14/-0, 4 statements plus comments) in 2 source files; tests 256 lines in 2 new files; changeset 11 lines; 281 changed lines total",
"deviations": [
"Commit trailers use the model-free pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md, not the harness's model-named Co-Authored-By.",
"File surface amended by the seat mid-run (Claim 6502707609) to add plugin-detail/src/fieldEnrichment.ts; RelatedList.tsx left untouched as instructed."
],
"files_changed": [
".changeset/27494-formula-currency-cell.md",
"ui/packages/plugin-detail/src/__tests__/formulaReturnTypeRelay-27494.test.tsx",
"ui/packages/plugin-detail/src/fieldEnrichment.ts",
"ui/packages/plugin-grid/src/__tests__/gridFormulaCurrency-27494.test.tsx",
"ui/packages/plugin-grid/src/objectGridGenerateColumns.tsx"
],
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: deferred by seat, same family as this card · RelatedList.tsx makeCell bag drops returnType, so a returnType currency formula in a related list reads as a bare number; one-line fix is a returnType spread beside its currencyConfig: def.currencyConfig spread · carrier: #27430 row 1 (after PR #27636 lands) · dedupe: formula returnType related list currency",
"class: a · reach: not measured live (code reading only) · RecordDetailPanel buildRecordDetailFields (quick-look overlay) builds its field from a picked list (currencyConfig, scale, …) without returnType, the same drop · carrier: #27430 row 1 · dedupe: RecordDetailPanel returnType formula currency quick-look"
]
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 看数据的视图 | none | P②
Triage: p3 ·
domain:ui·area:records· 2026-10-29T11:25Z⛔ Not a claim.
domain:uiseat folds it into console analytics: a formula declared returnType currency renders as a bare number, a KPI tile cannot show its description, percent fields always draw a progress bar, and report charts cannot split a series by a second dimension #27430's PR and closes this card as a duplicate, citing the PR.bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
Claim: PM loop round 1 · 2026-10-29T16:42Z
Session:
session_01Utp6CY2n1JmZZKrHgtp9jC(seat; implementation by a card thread,mode:thread)Account:
os-billBranch:
claude/project-thread-34d66a(the card thread's harness push branch, self-reported — the measured platform exception toclaude/issue-N-slug)Worktree:
objectstack-issue-27494Domain:
domain:uiSeat:
domain:ui#2File surface: the formula cell renderer(s) in
ui/packages/fields/src/**/ui/packages/plugin-grid/src/**that draw the list and related-list cell (measured by the dev:ui/packages/plugin-grid/src/objectGridGenerateColumns.tsx's picked-key field bags), +ui/packages/plugin-detail/src/fieldEnrichment.ts(the record page's enriched keys; a widening the seat accepted 2026-10-29), tests beside, a changeset; ⛔ui/packages/plugin-detail/src/RelatedList.tsx(held by open PR #27636, #27056 — the related-list cell follows after it lands, under #27430 row 1); ⛔packages/spec/**, every server file,examples/**(stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no (expected; the dev measures from the diff)
Metadata-protocol: none (expected; the dev measures from the diff)
Responsibility: the console's formula cell path (draws a declared
returnType: 'currency'as a bare number) |FormulaField's existing currency branch (objectui#12111) is the face to reach | every reader of a currency formula in a list or related list, todayThread-read: 6495354739
Premise: partly holds — on
origin/mainFormulaField.tsxalready draws currency forreturnType: 'currency', so the cell path that bypasses it is unmeasured; step 1 of the order measures whether the served metadata carriesreturnTypeand which renderer draws the cell, and stops if the metadata drops itSerial constraints cleared: none — no open PR touches
FormulaField.tsxor the formula cell renderers (read 2026-10-29). Triage 6495354739 folds this card into #27430 row 1: the PR carriesFixes #27494+Refs #27430(row 1 only); #27430 rows 2–4 stay unclaimedDispatch order:
/mnt/project-files/ui-seat2/dispatch-27494.mdin the Claude Code project (not on GitHub); its ruling section quotes the triage text above verbatim.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
os-dev-report
{ "issue": 27494, "status": "done", "branch": "claude/project-thread-34d66a", "pr": "https://github.com/objectstack-ai/objectstack/pull/27689", "session": "session_01Utp6CYFYwzxE4fR2Vr1sQo (card thread; seat session_01Utp6CY2n1JmZZKrHgtp9jC)", "premise_still_valid": true, "summary": "Premise partly held, as the Claim said: FormulaField and FormulaCellRenderer already draw returnType currency through the currency faces; the served metadata carries returnType, currencyConfig and scale (GET /api/v1/meta/object/showcase_project on a fresh showcase boot). The defect was the hosts that rebuild a field bag from a picked key list without returnType: plugin-grid objectGridGenerateColumns (three configured-column paths) and plugin-detail ENRICHED_FIELD_METADATA_KEYS (record page). Both now forward returnType verbatim beside currencyConfig (4 code lines, no formatter, no spec change); live Projects list read 180,000.00 with the grid fix ablated and $180,000.00 on the branch. The related-list cell (RelatedList makeCell) is deferred per the seat until PR #27636 lands; Refs #27430 row 1.", "tests": "Merged head 0191a4f9: pnpm --dir ui exec vitest run --maxWorkers=2 packages/plugin-grid/ packages/plugin-detail/ -> Test Files 595 passed | 1 skipped (596), Tests 5347 passed | 18 skipped (5365), lock VERDICT command-exit 0. Targeted (2 new + gridFixedCurrency-10354 + currencyConfigRelay-12242 + fieldEnrichment) -> 5 files, 36 tests passed. Ablation (source; ui vitest resolves @object-ui/* to src): grid anchor 'fieldMeta.returnType = ' --expect 3, blob 90f02baa3e9c -> 6aac6616f1bb, Tests 6 failed | 4 passed (10) with cells [$150,000.00, 90,000.00, 1,234.50, 4,321], restored blob == HEAD; detail anchor \" 'returnType',\", blob 910282667aac -> 35f03459ed4a, Tests 2 failed | 1 passed (3), restored blob == HEAD, git diff HEAD empty. A first grid leg was refused ANCHOR AMBIGUOUS (nothing written) and re-run with --expect 3.", "gates": "Local on 0191a4f9: pnpm --filter @object-ui/plugin-grid run type-check :: exit 0; pnpm --filter @object-ui/plugin-detail run type-check :: exit 0; dispatch-gates --commands: 34 derived, 34 run, all exit 0, --ran reconciliation 0 NOT-MEASURED 0 UNRUN (incl. node scripts/check-sdui-manifest.mjs :: exit 0 and --self-test :: exit 0). pnpm check:type-check-debt first exit 3 (PREREQUISITE NOT MET, closure build queue-timeout behind this card's own locked test run), re-run alone under the lock :: exit 0. pnpm --dir ui exec vitest run scripts/ :: exit 0 (169 passed | 2 skipped files). ui pnpm check:new-line-citations :: exit 0 (0 new). CI families (type-check lanes, Lint UI, Test UI, Build & E2E UI, Lint & Repo Gates): in_progress on PR #27689 at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "1 — mcp__github__issue_read (get #27494); no MCP write tool", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no assignees, no labels) via repository_dispatch run 40927636152, body read back 9153/9153 bytes identical; this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/27494/comments). Plus git pushes of the branch (not REST). Harness post-PR assign/review step skipped per the dispatch order.", "line_budget": "code 14 lines (+14/-0, 4 statements plus comments) in 2 source files; tests 256 lines in 2 new files; changeset 11 lines; 281 changed lines total", "deviations": [ "Commit trailers use the model-free pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md, not the harness's model-named Co-Authored-By.", "File surface amended by the seat mid-run (Claim 6502707609) to add plugin-detail/src/fieldEnrichment.ts; RelatedList.tsx left untouched as instructed." ], "files_changed": [ ".changeset/27494-formula-currency-cell.md", "ui/packages/plugin-detail/src/__tests__/formulaReturnTypeRelay-27494.test.tsx", "ui/packages/plugin-detail/src/fieldEnrichment.ts", "ui/packages/plugin-grid/src/__tests__/gridFormulaCurrency-27494.test.tsx", "ui/packages/plugin-grid/src/objectGridGenerateColumns.tsx" ], "open_questions": [], "out_of_scope_findings": [ "class: a · reach: deferred by seat, same family as this card · RelatedList.tsx makeCell bag drops returnType, so a returnType currency formula in a related list reads as a bare number; one-line fix is a returnType spread beside its currencyConfig: def.currencyConfig spread · carrier: #27430 row 1 (after PR #27636 lands) · dedupe: formula returnType related list currency", "class: a · reach: not measured live (code reading only) · RecordDetailPanel buildRecordDetailFields (quick-look overlay) builds its field from a picked list (currencyConfig, scale, …) without returnType, the same drop · carrier: #27430 row 1 · dedupe: RecordDetailPanel returnType formula currency quick-look" ] }objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
ACCEPT → PR #27689 comment 6504972839 (head
0191a4f9); contract review not owed (Clause-②: no,Metadata-protocol: none); landing through the merge queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
Landed · 2026-10-29T18:49Z
69991ffa1810df089756ba0d6e554b36a7ecef41completedby the PR'sFixeslineState:
pm:dispatchedremoved; the assignee stays as the record of who carried it.Generated by Claude Code