Repository navigation
docs(spec): field-scale docblock states number's ruled absent width - #20248
Conversation
An absent `scale` on a `number` field means no fixed width, the value's natural precision, as maintainer ruling 5791809146 (batch 215 item 2, letter A′) declares. The docblock's `number` bullet and the closing sentence no longer call it open, the existing resolveFieldScale pin for `number` is tied to the ruling, and grouping is named as useGrouping's to decide. No code token of field-scale.ts moves. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ
The footer/widget changes and the computed-result rounding rule are the ruling's consumer half, not yet landed; say so rather than state them in the present tense. Comment text only. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ
Measured after `pnpm --filter @objectstack/spec build`: the module docblock of field-scale.ts reaches none of the package's files[] paths (0 hits for its heading, the old sentence and the ruling id), while the unchanged resolveFieldScale TSDoc (positive control) hits in dist/data/index.d.ts. field-scale.ts is outside src/**/*.zod.ts. A diff that publishes nothing takes skip-changeset, not a patch. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ
📓 Docs Drift Check
What this run could not see
Coarse fallback — 136 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contract reviewServed-tier: Read: card #19628 body, triage 5782023392, ruling 5791809146 (items 1–4), PM claim 5856375966, dev report 5856798203 (the PM's corrected id); PR #20248 object, body, file list, labels, 39 check-runs and the ruleset's required contexts on the head; the full diff against merge-base c02fa12; ① Derived judgments(a) No code token moves — holds. (b) The test keeps its meaning — holds. The 25 (c) The docblock states the ruling faithfully — holds. Head :59–:62 gives item 1 as the platform's declared answer: "an absent (d) (e) The out-of-scope note — consistent with the truth, and non-blocking here. At the pinned objectui sha f8a9d0fb, ② Semver level
③ Boundary flagsBlocking: none. CI at this head: 39 check-runs, all Implemented-by: VERDICT: PASS |
Fixes #19628
Clause-②: no
What this does
This is the spec half of ruling 5791809146 (batch 215 item 2, letter A′, maintainer 「215 同意」), item 1 only. It changes docblock prose and one test case's title and comment. No key, schema, export or behaviour changes.
packages/spec/src/data/field-scale.ts: thenumberbullet under "Why the table has exactly one row" now states the ruled answer instead of the open question. An absentscaleon anumberfield means NO fixed width, the value's natural precision. That is the platform's declared answer, not an open question, and the bullet cites the ruling by its record.number「still awaits its own ruling」 now says its absent value is ruled to be no fixed width.FieldSchema.useGrouping's to decide. The interim heuristic for an absentuseGroupingreads the DECLAREDscaleonly, never a resolved width (ruling item 4).currencybullet is byte-identical.numberrow. No code token moves (evidence below).packages/spec/src/data/field-scale.test.ts: the existing pinresolveFieldScale({ type: 'number' })returningundefinednow has its own case, whose title and comment carry the ruling. Thecurrencyassertion keeps its own case, and its comment facts are unchanged. No assertion was added, removed or altered.Items 2–4 of the ruling live on objectstack-ai/objectui#9843, which carries them on its own card. Those items are: every consumer reads the width through
resolveFieldScaleand drops its private?? 0; computed results round to the widest decimal count among their inputs; grouping reads the declaredscaleonly. This PR does not touch objectui.Evidence (all at HEAD
bf7b0ff03, basec02fa1276)field-scale.tsmoves. I compared base and head with the TypeScript scanner, comments skipped.identical=true, and the sha256 prefix of the token stream is65aed4895c596175on both sides.percent: 0topercent: 1) answersidentical=false, exit 1. The raw bytes do differ (cmpexit 1), since the comments changed.pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/data/field-scale.test.ts: 13 passed, exit 0.vitest run --project local --maxWorkers=2: 546 files, 16071 passed and 2 todo, exit 0.pnpm --filter @objectstack/spec typecheck: exit 0. This runs tsc, the scripts program andcheck:test-typecheck. The test program listsfield-scale.test.ts(1 hit via--listFilesOnly); the maintsconfig.jsonexcludes tests.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 77 families, and--ranreconciles them as 74 run, 3 NOT MEASURED and 0 unrun, with every exit code recorded.check:doc-formula-expressionsfirst answered exit 3 (its formula, sdui-parser and lint closure was not built). After building that closure it exits 0.PREREQUISITE NOT MET(each needs a full workspace build, so CI runs them):check:dual-build-cjs-loads,check:lean-entry-closure,check:type-check-debt.check:meta-url-spelling,check:spec-changes,check:authz-resolver,check:error-code-casing,check:filter-alias-parity.eslint --no-inline-config --format jsonover the 2 touched files lints 2 files with 0 errors and 0 warnings. The resolved config for this path carries noparserOptions.projectorprojectService, so no type-aware rule runs. That means this diff cannot move the verdict of any untouched file. The repo-widepnpm lintis CI's.Changeset: none,
skip-changesetThe dispatch asked for a
patchchangeset on the premise that the docblock ships. I measured it afterpnpm --filter @objectstack/spec build, and it does not.@objectstack/spec'sfiles[]paths.dist,json-schema,liveness,prompts,llms.txt,README.md,CHANGELOG.md,api-surfaceandspec-changes.jsongive 0 hits for the docblock heading, the old sentence, the new text and the ruling id.resolveFieldScaleTSDoc does hit, indist/data/index.d.tsanddist/data/index.d.mts.field-scale.tsis not matched bysrc/**/*.zod.ts, so it does not ship as source either.A diff that publishes nothing takes
skip-changeset, so the changeset I first added was removed inbf7b0ff03.Acceptance notes
FieldSchema.useGroupingTSDoc inpackages/spec/src/data/field.zod.tsgives the interim heuristic's example as "scale: 0+ no upper bound reads as a plain count and keeps grouping". The objectui heuristic reads differently: at the pinned.objectui-shaf8a9d0fb,packages/core/src/utils/number-display.ts:166-171isscale !== 0, with no bound. The control token got 0 hits.field-scale.test.ts:40-42still describes a declared0as "rendered ungrouped" without naminguseGrouping. That is true of the interim heuristic for an absentuseGrouping(ruling item 4). It is outside the claimed lines and was left alone.Generated by Claude Code