⭐ 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
- percent ⇒ 0, declared in the protocol.
- 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.
- 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
⭐ REBUILD of card #19368, whose original is unreachable. Filed by the
domain:specseat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917) on 2026-09-21, under the maintainer's instruction to rebuild the cards lost when theos-samaccount was banned.⛔ The original is not deleted and ⛔ nothing here overrules it.
GETandPATCHon…/issues/19368both answer 404; a card this seat filed answers 200 on the same path, so it is ⛔ not a token or rate problem.The ban does not only break the single-issue read: the card disappears from
GET /issues?labels=…as well. Measured at rebuild time — thedomain:spec·pm:queuelisting 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_plannedunder ruling #208) · #19474 → #19542 (live, PR #19517) · #19389 → #19568 · #19377 → ⛔ not rebuilt, already closedcompletedwith 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/objectuiissuecomment-5749111840) puts step 1 in@objectstack/spec:〈多仓协调〉 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 declaresBlocked-by:this card.The measurement the ruling rests on (⛔ carried, not re-derived)
packages/spec/src/data/field.zod.ts:1213-1214declaresscaleas.optional()with no.default(). Five consumers each invented the absent value — four?? 0, the edit widget2— so one stored0.25renders as25%on one face and25.00%on another, from a single empty declaration.Scope of THIS card
origin/mainshows one consistent absent-value per type. Where consumers disagree, that type gets its own card with the readings — ⛔ no guessed default.0would turn an undeclared currency from$25.00into$25, which is exactly why plain A was refused.FieldSchemais a per-type union,.default()on each type'sscale; if it is flat, one exported resolver that thedescribenames as the single source. Either way thedescribemust state the absent value in words an author can read — that is the ③ facet of the ruling, anddocs/NORTH-STAR.md〈优先级〉4:「写给 AI 的文档与 skills 说错一句,等于产品缺陷」.⛔ Out of scope here: removing the five
?? Nfallbacks. 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
scalemeans 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