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
Filed by the
os-devseat 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 — nodomain:*, no priority, nopm:*; 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.3reads12%either way), so this does not affect its verdict. #9293 leavesprecisionexactly 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:packages/fields/src/index.tsx,PercentCellRenderer, about seventy lines below it:…which is then handed to
formatPercentBodyasminimumFractionDigitsandmaximumFractionDigits. So the percent renderer readsprecisionas 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.tsmirrors the split arm for arm — the currency arm readscolumn?.scale ?? 0carrying the same note and a reference to #2131, and the percent arm four lines down readscolumn?.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
PercentCellRenderereach readprecision, 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:
precisionon 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; orprecisionis the total digit countp, 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:
A
decimal(10, 2)percent field would render25.0000000000%in the cell andSum: 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.@objectstack/specactually saysprecisionmeans on a field. The installed spec types declare it only as an optional number; no prose aboutdecimal(p, s)reached this seat from the spec side. Thep/sreading in this repo comes from an in-code note, not from the contract.precisionwider 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.@objectstack/specrather 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'sopen_issues_countof 467 — the enumeration is complete for the open set./search/issueswas not used: this container's egress proxy refuses it by path whitelist.Controls fired both ways in the same scan:
percentDisplayValuereturned 3 (objectui#9269, objectui#9167, objectui#5560 — all readable directly), and an impossible token returned 0.Scans: a
precision-near-scalescan returned 1, objectui#9269 itself (which names this as an open question and does not answer it);#2131returned 2, objectui#9269 and objectui#8524 (an unrelated cloud pricing card that happens to cite a cloud issue of the same number);useColumnSummaryreturned 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 —⚠️ 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.
/search/issuesis 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.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