Skip to content

finding(fields,plugin-grid): the percent surfaces read precision as a fraction-digit count, in the same file that declares it is the total digit count and the currency arm reads scale #9295

Description

@os-tesla

Filed by the os-dev seat implementing objectui#9269 (PR #9293), on that card's explicit instruction. Its triage comment fenced this question as NOT MEASURED for that round and said the delivering seat should file it separately rather than repair it in passing. Unassigned and ungraded — no domain:*, no priority, no pm:*; that is triage's call.

⛔ Not folded into PR #9293. That card's disagreement was grouping and affix; its own table shows precision agreeing on BOTH sides (12.3 reads 12% either way), so this does not affect its verdict. #9293 leaves precision exactly where it found it and says so in a code comment.

The fact — the same file states both readings, 70 lines apart

packages/fields/src/index.tsx, CurrencyCellRenderer:

// Decimal places come from `scale` (the `s` in a `decimal(p, s)` column),
// NOT `precision` — `precision` is the TOTAL digit count (`p`), and reading
// it here padded every value out to that width (e.g. `1` from a
// decimal(10, 0) column rendered as "1.0000000000").

packages/fields/src/index.tsx, PercentCellRenderer, about seventy lines below it:

const percentField = field as any;
const precision = percentField.precision ?? 0;

…which is then handed to formatPercentBody as minimumFractionDigits and maximumFractionDigits. So the percent renderer reads precision as a FRACTION-digit count in the same file that declares it is the TOTAL digit count and records what happens when it is read that way.

packages/plugin-grid/src/useColumnSummary.ts mirrors the split arm for arm — the currency arm reads column?.scale ?? 0 carrying the same note and a reference to #2131, and the percent arm four lines down reads column?.precision ?? 0.

What this is, and what it is NOT

⭐ It is not a footer-vs-cell disagreement, and that is the part worth checking before acting. Both percent surfaces read the same member: the grid column-summary footer and PercentCellRenderer each read precision, so they agree with each other. What they disagree with is the currency arm's stated premise about what the member means.

⇒ Exactly one of these is true, and the repo currently behaves as though both are:

  • (i) precision on a field IS the fraction width, the currency comment is wrong about the member (it may still be right about the bug it fixed), and the percent surfaces are correct; or
  • (ii) precision is the total digit count p, and every percent surface pads to it — the identical defect objectui#2131 removed from currency, still live one type over.

The consequence, if (ii)

Measured directly on the rendering call the percent path makes:

Intl percentPoints, min=max=10 fraction digits, value 25  ->  "25.0000000000%"

A decimal(10, 2) percent field would render 25.0000000000% in the cell and Sum: 25.0000000000% in the footer beneath it. That is the same shape objectui#2131 measured for currency ("…0000000000"), reached by the same member read the same way.

⚠️ What is NOT MEASURED here, deliberately

  • What @objectstack/spec actually says precision means on a field. The installed spec types declare it only as an optional number; no prose about decimal(p, s) reached this seat from the spec side. The p/s reading in this repo comes from an in-code note, not from the contract.
  • Whether any real percent field in any example app declares a precision wider than its intended fraction width. Without that, (ii) is a latent defect rather than an observed one — which is exactly why this is a card and not a patch.
  • Which of the two readings the maintainer wants. This note takes no side; a contract-first answer probably belongs in @objectstack/spec rather than in either renderer, since fixing it here in the consumer would be the lenient-fallback shape AGENTS.md Commandment #0.1 forbids.

Dedup

Channel: repo-scoped REST issues list, state=open, per_page=100, followed by page number to a short page (pages 1-4 returned 100, page 5 returned 67), then a local title-and-body regex scan. Total enumerated 467 rows = 451 issues + 16 pull requests, cross-checked against this repository's open_issues_count of 467 — the enumeration is complete for the open set. /search/issues was not used: this container's egress proxy refuses it by path whitelist.

Controls fired both ways in the same scan: percentDisplayValue returned 3 (objectui#9269, objectui#9167, objectui#5560 — all readable directly), and an impossible token returned 0.

Scans: a precision-near-scale scan returned 1, objectui#9269 itself (which names this as an open question and does not answer it); #2131 returned 2, objectui#9269 and objectui#8524 (an unrelated cloud pricing card that happens to cite a cloud issue of the same number); useColumnSummary returned 3, none of them this subject. No open card holds this question.

Boundary, stated rather than papered over: open issues only. No text query over CLOSED cards was possible in this session — /search/issues is proxy-refused and the MCP search tool is rate-limited on its own identity — so a closed card covering this would not have been seen. ⚠️ objectui#2131 itself is closed and was NOT re-read for this note; everything attributed to it above comes from the two in-code comments that cite it.

Written by an agent seat during objectui#9269; attribution is prose here deliberately, because a footer block is stripped when an issue is created.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions