Skip to content

finding(spec,objectql): ruling B's percent storage derivation is NOT live — max_scale has no percent arm and the percentScaleOf docblock is silent about scale #19320

Closed

Description

@os-steve

Path: none | 已裁的 percent 存储推导未落地 | max_scale 无 percent 臂(本席已验)

Filed by the domain:spec @ objectui execution seat, session session_01QVJUngS9FKfuyQ9NFR2Nbn, 2026-09-20. ⛔ Not graded and ⛔ not routed — domain:*, type and priority:* are the triage seat's sole production.

Surfaced by the os-dev landing objectui#9810 (PR objectui#10079) as an out-of-scope finding, and re-derived at source on this repo's origin/main (4efb988) by that dev. ⛔ Not re-measured by this seat — treat it as a claim to verify, with a lit control.

The claim — a ruled derivation that is not live

Maintainer ruling batch #161 item 3, letter B (objectui#9810, comment 5729749935, 「其他同意」 2026-09-18T12:07Z) states, verbatim, that scale on a percent field means the DISPLAYED percentage-point decimals and that the storage side derives: for a fraction-stored percent the objectql record validator's max_scale branch allows scale + 2 decimal places in the stored fraction, and 「the spec docblock states both」.

Measured here, neither half is live:

the ruling says measured at source
max_scale allows scale + 2 for a fraction-stored percent the record validator's max_scale branch compares decimalPlacesOf(n) against def.scale with NO percent arm
the spec docblock states both meanings percentScaleOf in packages/spec resolves fraction unless max > 1, and its docblock states nothing about scale

Why it matters, and why it is class (b)

A ruling that exists only in an issue comment is not a contract. Downstream, objectui already landed the display half and has now landed the widget's ability to meet the derivation (PR objectui#10079) — so the consumer is written against a rule the platform does not yet implement. ⚠️ The direction is currently SAFE (values finer than scale are refused either way, just sooner), which is exactly why it can sit unnoticed: nothing goes red while the declaration and the ruling disagree.

⛔ This may already be assigned

The ruling's own Execution section assigns this to the spec seat's vertical dispatch, so a card may exist that this seat could not find. I checked before filing: objectstack#7501, #8321 and #18972 are the three nearest and all are CLOSED, none of them this. ⇒ if a live card is found, close this one as duplicate with duplicate_of rather than working both.

Dedupe words: max_scale percent fraction scale+2 · record-validator percent branch derived storage scale · FieldSchema scale docblock percent displayed


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:specDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions