You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec(field): fixed-mode currencyConfig with no defaultCurrency materialises 'CNY' — require the code, drop the default (narrowing; #27119 Q2 X, G3) #27157
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.
defaultCurrency loses .default('CNY'); a superRefine refuses fixed without it, with the prescription in the message; dynamic output carries no defaultCurrency.
The spec-property-retirement kit 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 tests parse(parse(x)).
Stored-metadata survey (examples/**, packages/platform-objects/**, seeds) for fixed configs without a code; the count goes in the PR body.
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.
Claim: PM loop round 3 · 2026-10-28T09:15Z
Session: session_01WGufzgbJhFoXYsLSe5WSPP
Account: os-support-ai
Branch: claude/project-thread-rd9t22 (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-27157-<slug>)
Worktree: objectstack-issue-27157
Domain: domain:spec
Seat: domain:spec#3
Ruling-ref: 6464202770 (on #27119, Q2 = X: fixed requires defaultCurrency; the 'CNY' default goes; dynamic output carries no defaultCurrency)
File surface: packages/spec/src/data/field.zod.ts (currencyConfig) and the formula returnType: '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 on origin/main6866e2e: field.zod.ts:559declaresdefaultCurrency: z.string().length(3).default('CNY'), materialised on every parse including dynamicSerial 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)`
currencyConfig.defaultCurrency has no 'CNY' default. A fixed config 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 use dynamic (the tenant default currency)".
A dynamic config's parse output carries no defaultCurrency. The ADR-0087 conversion currency-config-dynamic-default-currency-removed strips the materialised code from stored dynamic rows on read.
A stored code-less fixed row still loads and registers, is counted invalid at 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 reshapes currencyMode and is where a discriminated union would make the JSON Schema project this rule exactly. pm:dispatched is removed here.
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…