Skip to content

[rebuild of #19368] spec: declare what an ABSENT scale means per numeric field type — percent ⇒ 0 — the @objectstack/spec half of objectstack-ai/objectui#9843 (ruled A′) #19579

Description

@os-steve

REBUILD of card #19368, whose original is unreachable. Filed by the domain:spec seat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917) on 2026-09-21, under the maintainer's instruction to rebuild the cards lost when the os-sam account was banned.

⛔ The original is not deleted and ⛔ nothing here overrules it. GET and PATCH on …/issues/19368 both answer 404; a card this seat filed answers 200 on the same path, so it is ⛔ not a token or rate problem.

⚠️ This card had fallen out of every listing, which is why it was nearly lost

The ban does not only break the single-issue read: the card disappears from GET /issues?labels=… as well. Measured at rebuild time — the domain:spec · pm:queue listing returned 93 cards at 2026-09-21T03:45Z and 80 now; of the 17 that left, eleven closed or moved legitimately and six are simply unreadable: #19354, #19368, #19377, #19389, #19410, #19421.

⇒ nothing would ever have surfaced this card again. Its body below is reproduced from a read this seat took at 2026-09-21T03:45Z, before the ban — ⛔ not reconstructed, ⛔ not summarised. Its original labels were pm:queue · domain:spec · priority:p3, and this rebuild carries them; ⛔ a re-grade is triage's, not this seat's.

Rebuild ledger for the ban: #19384#19541 (closed not_planned under ruling #208) · #19474#19542 (live, PR #19517) · #19389#19568 · #19377 → ⛔ not rebuilt, already closed completed with its PR merged · and this batch: #19354, #19368, #19410, #19421.


The original card, reproduced verbatim below, ⛔ not rewritten

Filed by the triage seat (session_01KYzNJPin9Ar4oMMkSh4S9h) at 2026-09-20T14:20Z as the spec half of the cross-repo work ruled on objectstack-ai/objectui#9843. ⛔ Not claimed, ⛔ not dispatched.

Why this card exists in THIS repo

The ruling (director seat, summon #25 batch #194 item 1, letter A′, maintainer 「同意」, objectstack-ai/objectui issuecomment-5749111840) puts step 1 in @objectstack/spec:

@objectstack/spec declares the default decimal places for an absent scale per field type, and consumers read it from the protocol — ⛔ no ?? N in any consumer. percent ⇒ 0 in this card.

〈多仓协调〉 rule 1: 「issue 住在修复落地的仓」. The declaration lands in packages/spec; the consumer clean-up lands in objectui. ⇒ rule 2: 「跨仓 feature 永不是一次派发:父单 + 每仓一 sub-issue,spec/后端先行」. This is the spec-first half; objectstack-ai/objectui#9843 keeps the consumer half and now declares Blocked-by: this card.

The measurement the ruling rests on (⛔ carried, not re-derived)

packages/spec/src/data/field.zod.ts:1213-1214 declares scale as .optional() with no .default(). Five consumers each invented the absent value — four ?? 0, the edit widget 2 — so one stored 0.25 renders as 25% on one face and 25.00% on another, from a single empty declaration.

Scope of THIS card

  1. percent ⇒ 0, declared in the protocol.
  2. number and currency ride the same PR only if a consumer census on origin/main shows one consistent absent-value per type. Where consumers disagree, that type gets its own card with the readings — ⛔ no guessed default. ⚠️ The ruling names why: a global 0 would turn an undeclared currency from $25.00 into $25, which is exactly why plain A was refused.
  3. Shape is measured first, ⛔ not assumed: if FieldSchema is a per-type union, .default() on each type's scale; if it is flat, one exported resolver that the describe names as the single source. Either way the describe must state the absent value in words an author can read — that is the ③ facet of the ruling, and docs/NORTH-STAR.md〈优先级〉4:「写给 AI 的文档与 skills 说错一句,等于产品缺陷」.

⛔ Out of scope here: removing the five ?? N fallbacks. That is objectstack-ai/objectui#9843's half and must not land before this one.

Adjacent, ⛔ not a duplicate

#19320 — 「ruling B's percent storage derivation is NOT live」 — is about how a percent value is stored/derived, not about what an absent scale means when rendering. Different key, different ruling. Checked by title across all open objectstack issues in this act; whoever takes either should read the other first, because both touch percent and a fix that assumes the other's state will be wrong.

Refs: objectstack-ai/objectui#9843 (the consumer half + the ruling) · objectstack-ai/objectui#9568 (「Whether the two faces should agree at all needs its own ruling」 — this is that ruling, executed) · #19320 (adjacent)


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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions