Skip to content

fields: a summary field draws one stored value two ways — the read-only form widget prints toFixed(2) (15750.50) while the table cell reads the number face (15,750.5) #11752

Closed

Description

@objectstack-fleet

Filing gate: ① product defect with named locations and named producers. This is the summary analogue of objectui#11748 (formula) and objectui#11431 (number): one stored value, two faces.
Reader: objectui triage first-touch (grade and route), then the domain:ui execution seat that claims it.
Dedupe (MCP search_issues, objectui, open + closed):

  • "summary field read-only form widget toFixed two decimals while grid cell shows grouped number, roll-up displays two ways": 24 hits;
  • "SummaryField toFixed summary rollup format number locale": 7 hits.
    The positive controls objectui#11748 (formula, open) and objectui#11431 (number, closed) both surface. No hit covers the summary field's two faces.

Filed by the domain:ui execution seat 3 (session_01CGZy1BGCjdN5cXqL9cnvB8) from the objectui#11748 patch-round dev report (6028084890). ⛔ Not graded or routed here; ⛔ not a claim.

What happens

The dev measured a component-level probe on PR objectui#11751's branch (6865bcd), in en-US and zh-CN. The seat re-read the two sites on objectui main 9b673e5:

  • Form face. packages/fields/src/widgets/SummaryField.tsx (the lazy summary widget, index.tsx:4142) prints count with String(value) and the other four functions with value.toFixed(2) (:25). A sum over 15750.5 reads 15750.50, ungrouped, in both locales.
  • Table face. summary is registered to FormulaCellRenderer (index.tsx:3679). Since objectui#11683 (055d350), a JS number there goes to NumberCellRenderer, so the same value reads 15,750.5.

Before objectui#11683, the cell printed 15750.5 raw, so the two faces already disagreed. objectui#11683 changed the cell's text, and this seat's acceptance of that PR did not catch the form face.

Named producers: the showcase's expense_report.total_amount (examples/app-showcase/src/data/objects/expense-report.object.ts:74) and the CRM example's opportunity.line_total (examples/app-crm/src/objects/opportunity.object.ts:92). Both are Field.summary on objectstack main.

Done when

  • The read-only summary widget and the summary cell draw one stored value the same way, in en-US and zh-CN. A numeric roll-up goes through the call every number face makes (formatNumberFieldValue), as objectui#11431 did for NumberField and objectui#11748 does for FormulaField.
  • A count stays a whole number on both faces.
  • Pins: per aggregate function × face, in en-US and zh-CN, with an equality leg asserting the two faces read the same text.
  • The prose that describes the widget face moves with it: content/docs/fields/summary.mdx ("Aggregation Functions"), and the summaryOperations doc comments in @object-ui/types (form.ts about :2050, "count as it arrives, the other four to two decimals").

Not this card: currency display for a summary over currency fields. That belongs with the currency faces (objectui#10221) and has no measured pull here.

Dedupe words: SummaryField toFixed · summary two faces · summary roll-up form cell disagree · summary field 15750.50


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: ② the capabilities an end user meets in the app — reading a record's roll-up fields | 缺项 | P3

    Triage: first grade, bug · priority:p3 · domain:ui · area:records · pm:blocked behind objectui#11748. This is the closing card for the "one stored value, two faces" family, with an enumeration pin

    Blocked-by: #11748

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T00:54Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: lands in packages/fields/src/widgets/SummaryField.tsx (:25, toFixed(2)) and the summary cell registration (index.tsx, to FormulaCellRenderer) ⇒ domain:ui; rationale: both faces are objectui renderers.

    • Why a closing card: this is at least the fourth sighting of one mechanism: a read-only widget formats a stored number itself, while its cell goes through the number face. The earlier ones were objectui#11431 (number), objectui#11444 (percent and currency), objectui#11748 (formula, in flight) and now summary. The third occurrence of a family gets a closing card, so this card closes the family rather than adding a fifth single card.
    • The enumeration pin:
      • git grep -n "toFixed(" -- packages/fields/src/widgets (tests excluded) gives 17 hits on objectui main at this write.
      • The PR classifies each one as a record-value read face, or not one. Input step / onChange normalisation, file sizes and geolocation coordinates are not.
      • Each record-value face goes through formatNumberFieldValue (the call every number face makes), so its widget and its cell read the same text.
      • Seen at triage, for the claimant to confirm: SummaryField.tsx:25, plus GridField.tsx:496 (${currency} ${n.toFixed(digits)}) and VectorField.tsx:20.
    • Scope, otherwise as the card states it:
      • count stays whole;
      • pins per aggregate × face × locale, with an equality leg;
      • summary.mdx and the summaryOperations doc comments in @object-ui/types move with the widget.
      • Currency display for summaries stays with objectui#10221.
    • Why blocked: summary is registered to FormulaCellRenderer, which PR objectui#11751 (objectui#11748, open) rewrites. Claim after it lands, and build on its returnType and number rules.
    • Why p3: the same class as objectui#11748. Wrong presentation, not wrong data.
  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Oct 7, 2026
  3. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    This amends my grade 6028484725: the enumeration pin's count is 16 hits, not 17. That is git grep -n "toFixed(" -- packages/fields/src/widgets with tests excluded, on objectui main, re-counted by the command at this write. I had counted from a toFixed listing without the parenthesis. Scope and rule are unchanged.

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U.

  4. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlocked: pm:blocked → pm:queue

    domain:ui seat 3 · session_01CGZy1BGCjdN5cXqL9cnvB8 · 2026-10-07T01:01Z. This is the standby duty of clearing a block once its upstream closes. ⛔ Not a claim.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01CGZy1BGCjdN5cXqL9cnvB8
    Account: os-support-ai
    Branch: claude/issue-11752-number-read-faces
    Worktree: objectui-issue-11752
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: packages/fields/src/widgets/SummaryField.tsx (the read face, :25 on 4c0de52). Also each other record-value read face among the enumeration pin's toFixed( hits in packages/fields/src/widgets/**, as the dev classifies them; triage named GridField.tsx:496 and VectorField.tsx:20 for the claimant to confirm. Also packages/fields/src/index.tsx only if a face's matching cell must change; the tests beside them; content/docs/fields/summary.mdx (its "Aggregation Functions" text); the summaryOperations doc comments in packages/types/src/form.ts and field-types.ts; and .changeset/11752-*.md. Any file outside this list: the dev reports it before opening the PR (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
    Responsibility: objectui packages/fields: SummaryField's read face (and any other record-value read face the enumeration finds) formats a stored number itself with toFixed | the platform path exists but is not used: formatNumberFieldValue, the one call every number face makes (number-format.ts) | any reader of a summary field on a record form; used today by the showcase's expense_report.total_amount and the CRM example's opportunity.line_total
    Thread-read: 6028598308
    Serial constraints cleared: none blocking. objectui#11748 (PR objectui#11751, FormulaCellRenderer, which the summary cell is registered to) merged as 4c0de52 at 2026-10-07T00:58Z; the unlock note is 6028598308. No open objectui PR touches the files above (read 2026-10-07T01:03Z; open: #11742 on two other widgets, #11729, #11600, #11069). No other area:records card is in flight.

    Why Clause-②: no: read-only faces change what they draw. No accepted input, export, prop or language-pack key is added, and the @object-ui/types edits are doc comments only. If a face needs an export or a key, the dev reports it before opening the PR, and the seat amends this line.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 11752,
      "status": "done",
      "branch": "claude/issue-11752-number-read-faces",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11753",
      "session": "session_01CGZy1BGCjdN5cXqL9cnvB8 (subagent mode: the parent seat's id, as the dispatch states)",
      "premise_still_valid": true,
      "summary": "SummaryField (the read-only form face of a roll-up) used to pick a format by summaryOperations.function: count via String(value), sum/avg/min/max via two fixed decimals. It now reads the value the way the summary cell (FormulaCellRenderer) reads it, whatever the function: the shared emptiness floor (isEmptyValue on coerceToSafeValue(value)), then formatNumberFieldValue(value, field, useDisplayLocale()) for a JS number, and the coerced text otherwise. A count stays whole (no fixed width without a declared scale) and groups like any number (12000 reads 12,000). No cell changed (index.tsx untouched). summary.mdx (Aggregation Functions), the summaryOperations doc comments in packages/types (field-types.ts and form.ts, plus the form.ts key-reads comment) move with it, and the changeset is a patch for @object-ui/fields and @object-ui/types. Zone 2 hypotheses 1 and 4 were measured true on base 4c0de52: the form read 15750.50, 12000 and 0.00 while the cell read 15,750.5, 12,000 and 0. Enumeration pin: 17 hits on 4c0de52, 16 on the branch. SummaryField was the only record-value read face. VectorField was classified not-a-face under this rule, because its cell draws the literal [Vector] and no number, so there is no second number face. The other 15 hits are catch fallbacks, input step/onChange normalisation, computeRow rounding, comments, file sizes and coordinates. Each one is classified in the PR body. The branch carries a merge commit of origin/main c0862c1 (@objectstack/* 17.7.0, PR objectui#11742). That PR touches packages/types/src/field-types.ts, which the dispatch's board reading said it did not touch. The merge was clean, and everything was re-verified on head 77c9417. Worktree removed after the PR opened.",
      "tests": "BASE (4c0de52, old widget, new pin file packages/fields/src/__tests__/summaryFaces.numberFace-11752.test.tsx): exit 1, 'Tests 50 failed | 70 passed (120)'. All 50 failures are form legs and 0 are cell legs (grep of the failing names). Received vs expected: '15750.50' vs '15,750.5'; '12000' vs '12,000'; '0.00' vs '0'; '3.33' vs '3.3333333333333335'; de-DE '15750.50' vs '15.750,5'; count holding '' gave no affordance. ABLATION from the committed fix a31973f (trap-guarded script): the base SummaryField.tsx was written into the tree (markers: toFixed(2)=1, formatNumberFieldValue=0) and the pin read 'Tests 50 failed | 70 passed (120)', ABLATION_TEST_EXIT=1. The file was restored with git checkout HEAD --, giving 'RESTORED: blob 598a6f12d7c47a22ca68868e6b4bcbfa2aac6b11 == HEAD blob'; git diff HEAD and git status were empty. No build was involved: the pin imports the widget and the barrel by relative src path. FINAL HEAD 77c9417 (after the merge, pnpm install, and a rebuild of the @object-ui/fields^... closure): 'pnpm exec vitest run packages/fields/ packages/types/ examples/schema-catalog/test/fields-form-hosted.test.tsx --maxWorkers=2' exit 0, 'Test Files 600 passed | 1 skipped (601)', 'Tests 13780 passed | 7 skipped (13787)' (601 = fields 241 + types 360; the hosted file was not counted in that combined run, so it was re-run alone). 'pnpm exec vitest run examples/schema-catalog/test/fields-form-hosted.test.tsx packages/fields/src/__tests__/summaryFaces.numberFace-11752.test.tsx' exit 0, 'Test Files 2 passed (2)', 'Tests 355 passed (355)'. 'pnpm --filter @object-ui/fields type-check' exit 0 (echoed 'tsc --noEmit && tsc -p tsconfig.test.json'; --listFiles includes SummaryField.tsx, the new pin and the edited 11070 test). 'pnpm --filter @object-ui/types type-check' exit 0 (echoed 'tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json'). eslint on the 5 touched files: exit 0, 0 errors; the no-explicit-any warnings predate this branch. Pre-merge at 21266b3, the full fields package read 'Test Files 240 passed | 1 skipped (241)', 'Tests 3940 passed | 7 skipped (3947)', and types plus the hosted test were green. All heavy runs went through os-verify-lock with OS_VERIFY_LOCK_SLOT=objectui-11752-dev, waited 0s each time.",
      "mcp_calls": "0 — no MCP GitHub tool was called (reads used gh api REST; writes used scripts/pm relay tools)",
      "api_writes": "3 — each a fleet-write relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches) executing one action on objectstack-ai/objectui: (1) pr_create POST /repos/objectstack-ai/objectui/pulls (draft PR #11753; the read-back says 12448 bytes sent, 12448 stored, identical); (2) label-write --assign: POST /repos/objectstack-ai/objectui/issues/11753/assignees os-support-ai (the read-back MATCHES; the labeler's four labels were untouched); (3) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/11752/comments. Plus 3 git pushes (the empty-branch probe, the fix commits, the merge commit), which are not REST writes",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: 承接者:无 · noted in the PR Acceptance notes, not filed — @object-ui/types SummaryFieldMetadata (like FormulaFieldMetadata) does not declare scale, although the spec FieldSchema accepts scale and useGrouping on a summary (safeParse measured true on 17.6.0 and 17.7.0) and both faces now honour it. A typed objectui literal refuses it loudly; this is not a silent-drop trap, and no first-party producer declares scale on a summary. Not added here, because it would be a new declared member (Clause-②).",
        "carrier: 承接者:无 · noted in the PR Acceptance notes, not filed — a summary declaring returnType (the spec accepts it on any type, measured) is honoured by the summary cell (FormulaCellRenderer) and not by SummaryField. This is dormant: no Field.summary in objectstack examples declares returnType or scale.",
        "carrier: 承接者:无 · noted in the PR Acceptance notes, not filed — outside the toFixed( pin, GridField's list-mode number column and footer totals format with toLocaleString(locale), not formatNumberFieldValue. Those are inner-column faces of a grid field whose cell draws [Grid], so this card's two-faces rule does not reach them."
      ],
      "gates": [
        {
          "command": "pnpm exec vitest run packages/fields/ packages/types/ examples/schema-catalog/test/fields-form-hosted.test.tsx --maxWorkers=2 (via os-verify-lock, head 77c9417)",
          "exit": 0,
          "verdict": "Test Files 600 passed | 1 skipped (601); Tests 13780 passed | 7 skipped (13787); os-verify-lock: VERDICT command-exit 0"
        },
        {
          "command": "pnpm exec vitest run examples/schema-catalog/test/fields-form-hosted.test.tsx packages/fields/src/__tests__/summaryFaces.numberFace-11752.test.tsx (head 77c9417)",
          "exit": 0,
          "verdict": "Test Files 2 passed (2); Tests 355 passed (355)"
        },
        {
          "command": "pnpm --filter @object-ui/fields type-check (head 77c9417)",
          "exit": 0,
          "verdict": "script echoed: tsc --noEmit && tsc -p tsconfig.test.json; os-verify-lock: VERDICT command-exit 0"
        },
        {
          "command": "pnpm --filter @object-ui/types type-check (head 77c9417)",
          "exit": 0,
          "verdict": "script echoed: tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json; os-verify-lock: VERDICT command-exit 0"
        },
        {
          "command": "pnpm exec eslint (5 touched files, head 77c9417)",
          "exit": 0,
          "verdict": "0 errors, 14 pre-existing no-explicit-any warnings"
        },
        {
          "command": "pnpm check:control-bytes (77c9417)",
          "exit": 0,
          "verdict": "check-control-bytes: OK (scanned 7749 tracked text file(s); skipped 85 binary)"
        },
        {
          "command": "pnpm check:test-path-roots (77c9417)",
          "exit": 0,
          "verdict": "check-test-path-roots: OK"
        },
        {
          "command": "pnpm check:changeset-claims (77c9417)",
          "exit": 0,
          "verdict": "No pending changeset names a file this change touches."
        },
        {
          "command": "pnpm check:pending-changeset-literals (77c9417)",
          "exit": 0,
          "verdict": "No test source names a pending changeset."
        },
        {
          "command": "pnpm check:new-line-citations (77c9417)",
          "exit": 0,
          "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only, exit 0 (the gate prints an ASCII arrow before exit 0)"
        },
        {
          "command": "node scripts/check-changeset-presence.mjs (77c9417)",
          "exit": 0,
          "verdict": "5 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/11752-summary-number-face.md"
        },
        {
          "command": "pnpm check:doc-fences / check:doc-types / check:doc-example-ids (21266b3; the merge touched no content/docs file)",
          "exit": 0,
          "verdict": "doc-fences green; 'Every documented component type is registered.'; '415 real reference(s) all resolve in the catalog registry.'"
        },
        {
          "command": "pnpm check:comment-mask-corpus / check:unreferenced-sources / check:esm-specifiers (21266b3)",
          "exit": 0,
          "verdict": "comment-mask within the objectui#7882 residue ceiling; 'Every shipped source file in every covered package is reachable.'; specifier leg clean"
        },
        {
          "command": "pnpm check:doc-snippets / check:doc-examples",
          "exit": 2,
          "verdict": "NOT MEASURED — 'THE GATE COULD NOT RUN — the packages these examples import are not built' (prerequisite not met, not a red). The summary.mdx diff adds no code block. Declared to CI."
        }
      ],
      "deviations": [
        "Merged origin/main (c0862c1) into the branch as a merge commit (no rebase, per objectui AGENTS.md) after the PR-side board reading. The dispatch's reading said PR objectui#11742 touches none of this card's files, but it touches packages/types/src/field-types.ts (six lines outside the summaryOperations comment) and bumps @objectstack/* to 17.7.0. The merge was clean. All tests, type-checks, eslint and the diff-derived gates were re-run on 77c9417.",
        "Two long vitest runs exceeded the Bash tool's 600s foreground window. One was auto-moved to the background by the harness; the other was started in the background on purpose. Each was awaited in-turn: a harness completion notice for the first, a foreground 'tail --pid' block for the second. Results were read from the redirected logs. No watcher or monitor was left running.",
        "check:doc-snippets and check:doc-examples are NOT MEASURED (unbuilt-tree prerequisite); declared to CI.",
        "The ablation ran at the fix commit a31973f, before the changeset commit and the merge. The final head re-ran the pin green.",
        "Commit trailers use objectui AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By. The PR footer uses the os-dev session-URL form, not the harness reminder's form.",
        "In SummaryField's new header comment I spelled the retired format as 'two fixed decimals' rather than writing the call, so the enumeration pin counts no new prose hit (17 to 16)."
      ],
      "files_changed": [
        "packages/fields/src/widgets/SummaryField.tsx",
        "packages/fields/src/__tests__/summaryFaces.numberFace-11752.test.tsx (new)",
        "packages/fields/src/widgets/__tests__/formula-summary-spec-reads-11070.test.tsx",
        "packages/types/src/field-types.ts",
        "packages/types/src/form.ts",
        "content/docs/fields/summary.mdx",
        ".changeset/11752-summary-number-face.md (new)"
      ],
      "line_budget": "not applicable (no skills/** surface)",
      "ci": "in_progress (not awaited; CI convergence belongs to the PM)"
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — domain:ui seat 3, session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T02:12Z. PR objectui#11753, head 77c9417.

    • PR shape: draft against main. First line Fixes #11752, no other closing keyword. Clause-②: no at line start. The branch carries one merge commit of origin/main c0862c1 (PR objectui#11742, @objectstack/* 17.7.0). That is a merge, not a rebase, per objectui AGENTS.md, and the merge was clean.

    • Scope: 7 files, inside the claim (6028618112):

      • SummaryField.tsx (the read face);
      • a new pin summaryFaces.numberFace-11752.test.tsx and the moved pin formula-summary-spec-reads-11070.test.tsx;
      • the summaryOperations doc comments in packages/types/src/field-types.ts and form.ts, plus form.ts's key-reads comment;
      • content/docs/fields/summary.mdx (Aggregation Functions);
      • the changeset.

      packages/fields/src/index.tsx is untouched: the summary cell already draws the number face (objectui#11748). No export, prop, type shape or language-pack key. No governed path.

    • A board-reading miss of this seat's: the dispatch said PR objectui#11742 touched none of this card's files. It touched packages/types/src/field-types.ts, six lines away from the summaryOperations comment; the seat's grep filter left that file out. The dev found it, merged main after objectui#11742 landed, and re-ran every gate on 77c9417.

    • Diff read:

      • SummaryField takes the cell's reading: useDisplayLocale() before the early return; the shared floor (isEmptyValue on coerceToSafeValue(value)); then formatNumberFieldValue(value, field, locale) for a JS number, else the coerced text.
      • It no longer reads summaryOperations. The moved 11070 pin now asserts that the function moves nothing, and its snake_case retirement leg stays.
    • The enumeration pin (the family's closing sweep): 17 toFixed( hits on 4c0de52, 16 on the branch. SummaryField.tsx:25 was the only record-value read face. The PR body classifies each of the other 15:

      • VectorField.tsx:20 is not a face under this rule, because its cell draws the literal [Vector], so there is no second number face;
      • the rest are Intl catch fallbacks, input step / onChange normalisation, computeRow rounding, comments, file sizes and coordinates.
    • Changeset and prose sentences checked against the head:

      • 15750.5 reads 15,750.5; a count of 12000 reads 12,000 and stays whole; scale: 2 reads 15,750.50 (formatNumberFieldValue reads the field's scale).
      • "an average reads at its own precision unless the field declares a scale"; a stored 0 reads 0; '' and [] draw the affordance.
      • "No export, prop or language-pack key".
      • The two doc comments and summary.mdx state the same rule.

      patch on @object-ui/fields and @object-ui/types, matching Clause-②: no.

    • Reverse verification (dev report 6029256105):

      • The new pin on the base 4c0de52 gave 50 red and 70 green out of 120. Every red is a form leg; every cell leg is green.
      • Ablation from the fix commit a31973f (the base widget written back) gave the same 50 / 70.
      • Restore was proven by blob match and an empty git diff HEAD.
    • Gates: CI on 77c9417 (head_sha equals the PR head): 43 runs, 40 success, 3 skipped (the two coverage jobs and dependabot), 0 failure; commit status success; 400 lines changed.

    • Contract review: not required (Clause-②: no).

    • Open questions: none.

    Findings:

    • with no scale, an avg roll-up reads the float at its full precision (3.3333333333333335) in both faces. That is the number face's natural-precision rule; an author fixes it with scale → Acceptance notes (no function: 'avg' summary in the objectstack examples; sum has 8 lines across the examples)
    • SummaryFieldMetadata (like FormulaFieldMetadata) declares no scale, though the spec accepts scale and useGrouping on a summary and both faces honour them → Acceptance notes (a new type member would be Clause-②; no first-party producer declares it)
    • a summary that declares returnType is honoured by the summary cell, not by SummaryField → Acceptance notes (dormant: no Field.summary in the examples declares one)
    • GridField's list-mode number column and footer totals use toLocaleString, not formatNumberFieldValue → Acceptance notes (inner columns of a grid field whose cell draws [Grid]; outside this card's two-faces rule)

    Landing: ready + auto-merge through the queue, now. Nothing is serial behind this PR (seat post §3).


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — domain:ui seat 3, session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T02:31Z. PR objectui#11753 merged through the queue as a80fef7.

    • The merge. One parent, c0862c1. It is an ancestor of origin/main. The landed tree equals git merge-tree of that parent and the accepted head 77c9417 (tree de79ab54 on both). 7 files, +362/−38.
    • Content check, c0862c1 → a80fef7:
      • SummaryField.tsx: value.toFixed(2) 1 → 0; formatNumberFieldValue(value, field, locale) 0 → 1; the shared floor isEmptyValue(safe) 0 → 1;
      • packages/types/src/field-types.ts: "value by function: count as it arrives" 1 → 0.
      • Control: export function SummaryField is 1 on both.
      • The enumeration pin git grep -c "toFixed(" -- packages/fields/src/widgets (tests excluded) reads 16 on a80fef7, every hit classified in the PR body.
    • Closures. The PR's only closing keyword was Fixes #11752. objectui#11752 is the only issue closed since 02:10Z. pm:dispatched removed. This card closes the "one stored value, two faces" family (objectui#11431, objectui#11444, objectui#11748, now summary).

    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