Repository navigation
Closed
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingSomething isn't workingdomain:specDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3Medium: important, M3
Description
Filing gate ③ (maintainer-directed). Ruling 6464202770 on #27119 (batch #421 item 2, Q2 = X, maintainer 「其他同意」 2026-10-28): G3. Filed by the director seat (session_01QSeKYo7qYsX6HsAneHBMP2, ledger objectstack#12708). ⛔ Not a claim; triage sets the lane (domain:spec expected) and grade.
Ruling-ref: 6464202770
维护者速读
- 改了什么:
currencyConfig.currencyMode: 'fixed'必须写defaultCurrency;去掉 schema 里的'CNY'默认值。没写的在发布时拒收,拒收信息写明「fixed 需要币种代码,或改用 dynamic(组织默认币种)」。 - 为什么改: 今天不写代码的
fixed字段静默变成人民币字段;美元 / 欧元应用看到¥。而且这个默认值在每次 parse 都被物化,连dynamic配置也带着它、前端只能刻意忽略——违反已裁原则 FieldSchema acceptsdeleteBehavior: 'set_null'on amaster_detail, and the engine silently resolves it tocascade#9689「永不物化一个 schema 本不会接受的默认」。 - 风险与回滚: BREAKING(narrowing,minor + 迁移 + ADR-0087 处置)。存量调查:
fixed且无代码的配置预期 0 条,调查是证明。动态行上物化出的defaultCurrency: 'CNY'由 ADR-0087 转换剥掉(无读者),固定行保留(曾是生效值)。 - 先看:
packages/spec/src/data/field.zod.ts:555–559。 - 两分钟验证:
{ currencyMode: 'fixed' }不带代码 ⇒ 发布拒收;{ currencyMode: 'dynamic' }parse 结果不再带defaultCurrency。 - 需要您做的: 无。
Measured (on origin/main e6e41998, 2026-10-28)
git grep -n "default('CNY')" origin/main -- packages/spec/src/data/field.zod.ts→ 1 hit (L559);currencyModedefaultsdynamic(L558).ui/packages/i18n/src/currency.ts:34–36: the display rule already has to ignore the materialisedCNYon dynamic configs.- Principle FieldSchema accepts
deleteBehavior: 'set_null'on amaster_detail, and the engine silently resolves it tocascade#9689 (maintainer 2026-08-24,FieldSchemadocblock): "NEVER materialize a default the schema itself would refuse as authored". [Epic] multi-currency (shape C′): record currency, dated exchange rates, write-time home-currency projection — 17 children, R1/R2/R3 release pairing (ruling 6465431966) #8345's design round Q7 recommended the same (6041378776).
Task
-
defaultCurrencyloses.default('CNY'); asuperRefinerefusesfixedwithout it, with the prescription in the message;dynamicoutput carries nodefaultCurrency. - The
spec-property-retirementkit as applicable to a tightened requirement: ADR-0087 disposition in the changeset (strip on dynamic rows, keep on fixed rows), liveness ledger line, generated baselines / forms, pin testsparse(parse(x)). - Stored-metadata survey (
examples/**,packages/platform-objects/**, seeds) forfixedconfigs without a code; the count goes in the PR body. - The
formulafield withreturnType: 'currency'shares the shape (spec: a formula field cannot declare a currency result —returnTypeisnumber | text | boolean | date, so a formula over money renders as a bare number #22727): same refusal.
Clause-②: no (narrowing) · Metadata-protocol: narrowed · Skills-docs: line owed in the PR body. Dedupe: #27119 (the ruling), #8345 Q7 (on hold), #9689, #19992 (precision removal); no open card on the CNY default.
Metadata
Metadata
Assignees
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingSomething isn't workingdomain:specDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3Medium: important, M3
Activity
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 3 · 2026-10-28T09:15Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-rd9t22(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-27157-<slug>)Worktree:
objectstack-issue-27157Domain:
domain:specSeat:
domain:spec#3Ruling-ref: 6464202770 (on #27119, Q2 = X:
fixedrequiresdefaultCurrency; the'CNY'default goes;dynamicoutput carries nodefaultCurrency)File surface:
packages/spec/src/data/field.zod.ts(currencyConfig) and the formulareturnType: 'currency'shape, their tests, the ADR-0087 disposition, the liveness ledger line, regenerated baselines / forms / docs, any stored metadata the survey finds, one changeset per touched published package(stop on breach; explain in the report) Container & model:S,mode:thread,model: TIER_DEFAULT — --tier: no path-derived mandate (narrowing; one CONTRACT_REVIEW_TIER review owed, run by the seat; full dogfood owed),effort: highClause-②: no (narrowing) Metadata-protocol: narrowed Responsibility: the spec lane ownsFieldSchema's currency shape; readers outside spec are measured, and changed only if the narrowing breaks them Thread-read: 6464202770 Premise: holds onorigin/main6866e2e:field.zod.ts:559declaresdefaultCurrency: z.string().length(3).default('CNY'), materialised on every parse includingdynamicSerial constraints cleared:no open PR on field.zod.ts's currency shape (open PRs searched 09:13Z; #26937 touches formula/plugin-email currency holes, not this schema)`objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 27157, "status": "done", "branch": "claude/project-thread-rd9t22", "pr": "https://github.com/objectstack-ai/objectstack/pull/27218", "session": "session_01WGufzgHpEdH4Nc37mK73zh", "premise_still_valid": true, "summary": "Measured on main 6866e2e7: {currencyMode:'fixed'} parsed to defaultCurrency 'CNY' and {currencyMode:'dynamic'} / {} carried 'CNY'. CurrencyConfigSchema.defaultCurrency is now optional with no default; a superRefine refuses fixed without a code at defaultCurrency with the prescription (ISO 4217 code, or dynamic = tenant default), shared by currency fields and formula returnType currency. ADR-0087: D2 currency-config-dynamic-default-currency-removed (toMajor 18, retiredFromLoadPath, retiredAfter 18.2.0) strips the code from dynamic/mode-less stored configs and keeps fixed ones; D3 currency-config-fixed-default-currency-required; DEFAULT_CHANGES_BY_MAJOR[18] row; dropped-refinements +13 sites; liveness note; forms + 4 locale bundles; two docs tables. Survey: 11 fixed configs in examples/platform-objects/qa/seeds/fixtures, 0 without a code. Readers: only @objectstack/formula currencyOf changes (fixed without code now reads unproven, pinned); ui resolveFieldCurrency, analytics relay, share-link projection display unchanged.", "tests": "head 5f876858f: spec vitest --project local 742/742 files, 22243 passed | 1 todo; spec typecheck exit 0; formula 56/56 files, 1484 tests, typecheck exit 0; platform-objects 96/96 files, 1361 tests; ui packages/i18n 89/89 files, 1373 passed | 13 skipped; check:generated --fix 14/14 current. Final head c172c878e changes the changeset text only. No ablation run.", "gates": "dispatch-gates --commands: 113 derived (same list on c172c878e). 110 exit 0 on the code head; ui scripts vitest (one 15s timeout under dogfood load, exit 0 on rerun), spec check:skill-examples and check:dual-build-cjs-loads (exit 3 prerequisite, exit 0 after building their dist) re-run on c172c878e; changeset families re-run on c172c878e all exit 0; --ran: 113 run, 0 NOT-MEASURED. check-adr-0087-registration: registered currency-config-fixed-default-currency-required, currency-config-dynamic-default-currency-removed. CI check-runs: in_progress at report time.", "dogfood_battery": "5f876858f · VERDICT command-exit 0 · Test Files 348 passed | 3 skipped (351) · Tests 2804 passed | 20 skipped (2824) · no failures", "mcp_calls": "1 — get_session (read, own session id); no GitHub MCP calls", "api_writes": "3 via fleet-write relay — pr_create objectstack-ai/objectstack#27218; pr_request_reviewers #27218; comment #27157 (this report)", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
fix(spec): state what a stored fixed currency row without a code does (…
objectstack-fleet commentedon Oct 28, 2026
ACCEPT → PR #27218 comment 6469020240
objectstack-fleet commentedon Oct 28, 2026
Landed ·
domain:specseat 3 ·os-support-ai· 2026-10-28T13:23Z0cd578f726origin/maingit merge-base --is-ancestor)Delivered (ruling X, 6464202770 on #27119 Q2):
currencyConfig.defaultCurrencyhas no'CNY'default. Afixedconfig with no code is refused at parse, for currency fields and for formula fields returning currency, with the prescription "give an ISO 4217 code, or usedynamic(the tenant default currency)".dynamicconfig's parse output carries nodefaultCurrency. The ADR-0087 conversioncurrency-config-dynamic-default-currency-removedstrips the materialised code from stored dynamic rows on read.fixedrow still loads and registers, is countedinvalidat boot with[metadata_spec_invalid], and its next save returns 422 until a code is written. Its display is unchanged.Owed elsewhere: #27184 (
currencyMode: 'record'), which also reshapescurrencyModeand is where a discriminated union would make the JSON Schema project this rule exactly.pm:dispatchedis removed here.docs(adr): ADR-0144 dates the #27157 landing in Context and the verif…
docs(adr): ADR-0144 takes the three should-fixes of contract review 6…
docs(adr): ADR-0144 takes the three should-fixes of delta review 6485…