Skip to content

docs(spec): name a currency amount's decimal places as its CLDR fraction digits, not its ISO 4217 minor unit - #30755

Merged
objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/project-thread-437a6c
Nov 6, 2026
Merged

objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/project-thread-437a6c

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Sales · project thread

domain:spec#2 · os-sales · session_01L6bhgWFZUMBKFD9Lcwt4DU

Fixes #30648

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么: 把“币种金额的小数位 = ISO 4217 最小单位”这句话全部改成“= 币种的 CLDR 小数位”:spec 的两条 scale 拒收文案、currencyConfig 小数位提示、precision/scale 字段说明、升级指南条目、四个文档页,以及 ui 侧逐字镜像的拒收串、控制台警告和注释。
  • 为什么改: 平台实际用的是 CLDR(CURRENCY_FRACTION_DIGITS 和各显示面的 Intl),有 16 个币种与 ISO 4217 不同(如 IQD:CLDR 0 位,ISO 3 位)。旧文案让伊拉克第纳尔、匈牙利福林等币种的作者以为会显示小数,平台却按整数显示。
  • 风险与回滚: 只改文字,不改任何表值、拒收分支、规则 id 或路径;接受与拒收的集合不变。唯一可见变化是拒收消息的措辞,按旧原文匹配消息的检查会失配。回滚即撤销本 PR。
  • 先看: ① packages/spec/src/data/field.zod.ts 的 currency scale 拒收(L3161)与 INLINE_GRID_CURRENCY_SCALE_REFUSAL(L1084);② ui/packages/types/src/zod/form.zod.ts 的 CURRENCY_FIELD_SCALE_REFUSAL(L1089,与 spec 逐字相等);③ packages/spec/src/data/field-currency-scale-refused.test.ts 末尾新增的 describe(L258)。
  • 两分钟验证: pnpm --filter @objectstack/spec exec vitest run src/data/field-currency-scale-refused.test.ts,预期 13 条全过,其中新 pin 断言拒收消息含 “CLDR fraction digits”、不含 “ISO 4217 minor unit”。
  • 需要你做的: 无,席位落地。

What changes

The refusal sentence, FROM → TO (spec FieldSchema currency scale refusal, held word for word by ui CURRENCY_FIELD_SCALE_REFUSAL):

  • FROM: "…not a field setting: the currency's ISO 4217 minor unit (2 for USD, 0 for JPY, 3 for KWD) decides how the amount displays, and the field's write allowance stays unconstrained…"
  • TO: "…not a field setting: the currency's CLDR fraction digits (2 for USD, 0 for JPY, 3 for KWD) decide how the amount displays, and the field's write allowance stays unconstrained…"

The inline grid column refusal (INLINE_GRID_CURRENCY_SCALE_REFUSAL, and its console.warn copy in ui/packages/plugin-form/src/deriveMasterDetail.ts) moves the same way: "…the currency's CLDR fraction digits (2 for USD, 0 for JPY, 3 for KWD) decide how the cell displays the amount and the width a computed amount is rounded to." The first sentence and the remedy ("delete the key") are unchanged everywhere. The examples stay: USD 2, JPY 0 and KWD 3 are the same in both systems.

The wording follows PR #30644 (currency-fraction-digits.ts, currency.mdx): "CLDR fraction digits, not ISO 4217's minor units". Where a docs page explains the difference, it gives IQD (0 in CLDR, 3 in ISO 4217) as the example of the sixteen codes and links the currency page that lists them.

  • Spec runtime strings and describes (field.zod.ts): the currencyConfig decimal-places reason CURRENCY_DECIMAL_PLACES_ARE_THE_CURRENCYS (it feeds the precision tombstone and the decimals / scale prescriptions), the inline grid refusal, the field refusal, and the precision / scale / inline column scale describes. Comments in the same file at L504, L711, L3139, L3145 and L3171.
  • ADR-0087 entries (words only, no new entry): the conversion currency-config-precision-removed, the semantic entries currency-config-precision-retired, field-currency-scale-refused, inline-grid-column-currency-scale-refused, inline-grid-column-identity-only-currency-scale-refused, ui-object-master-detail-form-details-closed, ui-page-panel-children-cross-references-judged, ui-record-line-items-props-closed, and registry.ts.template. The generated upgrade guide (in memory and --out) now carries "CLDR fraction digits" 10 times; its only "ISO 4217 minor unit" left are the three quoted rulings.
  • Spec comments: field-scale.ts, field.form.ts, retired-keys/18.data__CurrencyConfig__precision.ts, liveness/field.json (the currencyConfig row's note).
  • Docs: data-modeling/field-types.mdx, data-modeling/validation-rules.mdx, protocol/objectql/schema.mdx, protocol/objectql/types.mdx. content/docs/references/** (field, object, migration, component) regenerated with gen:docs, not hand-edited.
  • objectql: the one comment in validation/record-validator.ts.
  • ui: CURRENCY_FIELD_SCALE_REFUSAL, the deriveMasterDetail warning, and the docblocks and comments in types/src/form.ts, fields/src/{currency.ts,index.tsx}, fields/src/widgets/{CurrencyField.tsx,GridField.tsx,PercentField.tsx,number-format.ts}, plugin-dashboard/src/ObjectMetricWidget.tsx, plugin-form/src/{MasterDetailForm.tsx,deriveMasterDetail.ts}, plugin-grid/src/useColumnSummary.ts, app-shell/.../ObjectFieldInspector.tsx, plus ui test docblocks and two test titles that repeated the sentence.
  • Changesets, all patch: @objectstack/spec, @object-ui/types, @object-ui/fields, @object-ui/plugin-form, one per package whose published bytes change (measured below). No changeset for @objectstack/objectql, @object-ui/plugin-grid and @object-ui/plugin-dashboard (comments only, absent from their built dist/) or @object-ui/app-shell (private).

The branch is the harness-assigned claude/project-thread-437a6c, not claude/issue-30648-*.

Hit census and dispositions

Base 4bf9a2d7. The card's one-line git grep -n -i "ISO 4217 minor unit" misses line-wrapped spellings, so the census is a multi-line search over every tracked file mentioning 4217 (CHANGELOGs, content/docs/releases/** and translation packs excluded): ISO, then 4217, then one of minor / decimal / fraction / width / digit, with whitespace, comment stars and string-concatenation characters allowed between them. 116 lines at base (13 of them in the generated content/docs/references/**), plus ui/packages/fields/src/currency.ts L41 ("fraction digits ISO 4217 gives") and the test title formatCurrency.minorUnits.test.tsx L85 ("as ISO 4217 says"), found by a second search for "ISO 4217 gives / says".

Every hit, with its disposition

Reworded (the file surface of claim 6671521736, widened by amendment 6671693654):

  • packages/spec/src/data/field.zod.ts L492, L504-505, L711-712, L1086-1087, L1159, L1463, L1488, L3139, L3145, L3162, L3171
  • packages/spec/src/data/field-scale.ts L107, L109 · field.form.ts L81 · conversions/entries/18/currency-config-precision-removed.ts L22, L53 · migrations/entries/retired-keys/18.data__CurrencyConfig__precision.ts L9 · migrations/registry.ts.template L1630 · liveness/field.json L432
  • Semantic entries: 18.currency-config-precision-retired L19, L29-30 · 18.field-currency-scale-refused L12, L21, L43 · 18.inline-grid-column-currency-scale-refused L14 · 18.inline-grid-column-identity-only-currency-scale-refused L22 · 18.ui-object-master-detail-form-details-closed L32 · 18.ui-page-panel-children-cross-references-judged L25 · 18.ui-record-line-items-props-closed L35
  • Spec pins: currency-precision-iso4217.test.ts L11-12, L60, L108, L227 · field-currency-scale-refused.test.ts L8, L52, L141 · inline-grid-column-currency-scale-refused.test.ts L63 · field-scale.test.ts L58
  • Docs: field-types.mdx L237, plus L250 and L598, which said a currency cell uses "the currency's minor unit" on the same page · validation-rules.mdx L160 · protocol/objectql/schema.mdx L293 · protocol/objectql/types.mdx L33, L343 · regenerated references/data/field.mdx (4), references/data/object.mdx (4), references/system/migration.mdx (4), references/ui/component.mdx (1)
  • packages/objectql/src/validation/record-validator.ts L1528
  • ui: types/src/zod/form.zod.ts L1091 · types/src/form.ts L2074 · plugin-form/src/deriveMasterDetail.ts L255, L301 · plugin-form/src/MasterDetailForm.tsx L490 · plugin-grid/src/useColumnSummary.ts L417 · plugin-dashboard/src/ObjectMetricWidget.tsx L605 · app-shell/.../ObjectFieldInspector.tsx L562 · fields/src/currency.ts L25, L41 · fields/src/index.tsx L582-583, L915-916 · fields/src/widgets/CurrencyField.tsx L22-23 · GridField.tsx L127-128, L327 · PercentField.tsx L90 · number-format.ts L105-106
  • ui tests (docblocks and two titles, no assertion): ObjectFieldInspector.currencyScale-10221 L9 · CurrencyField.minorUnits L16 · PercentCurrencyField.readonlyDisplay-11444 L26-27, L130 (title) · formatCurrency.centsDigit L29 · formatCurrency.minorUnits L10-11, L30-31, L85 (title) · GridField.currencyMinorUnit-10355 L11 · GridField.currencyScaleNotRead-10783 L10-11

Quoted ruling, kept as written (ruling 乙 「a currency's ISO 4217 minor unit decides its display」, quoted, not paraphrased): field.zod.ts L1077 · inline-grid-column-currency-scale-refused.test.ts L7 · 18.inline-grid-column-currency-scale-refused L19 · 18.ui-object-master-detail-form-details-closed L40 · 18.form-view-subform-columns-closed L29.

Already correct, not touched (they name CLDR and use ISO 4217 only as the contrast): currency-fraction-digits.ts (5) · content/docs/data-modeling/currency.mdx L303 · packages/spec/src/data/index.ts L199 · packages/objectql/src/home-amount-projection.ts L36 · ADR-0144 (4, a governed surface) · .changeset/30103-home-amount-rate-field-scale-floor.md (2).

Out of scope: ui/packages/i18n/src/__tests__/machineLocaleCensus-9909.test.ts L255 (open PR #30552 touches the file; see Acceptance notes) · every CHANGELOG.md.

After, at this PR's head: the same search answers 33 lines, and none of them says ISO 4217 is where a currency's decimal places come from:

  • 5 quoted rulings (listed above);
  • 14 already-correct lines (listed above);
  • 1 in machineLocaleCensus-9909.test.ts L255 (kept out, see Acceptance notes);
  • 13 written by this PR that name ISO 4217 only as the contrast: 5 in its changesets, 5 in the new pin (not.toContain('ISO 4217 minor unit') and its comment and titles), and 3 docs lines ("CLDR fraction digits (not ISO 4217's minor units)": field-types.mdx L238, validation-rules.mdx L160, types.mdx L343).

Tests

  • Pins moved to the new words: currency-precision-iso4217.test.ts (the precision tombstone and the decimals / scale prescriptions), field-currency-scale-refused.test.ts (the ruled-remedy helper and the scale describe), inline-grid-column-currency-scale-refused.test.ts (MINOR_UNIT_CLAUSE renamed FRACTION_DIGITS_CLAUSE), and the comment in field-scale.test.ts.
  • New pin (one top-level describe in the existing harness field-currency-scale-refused.test.ts): the FieldSchema refusal for scale on a currency field is code: 'custom', contains "CLDR fraction digits" and does not contain "ISO 4217 minor unit"; the scale describe says the same.
  • Parity pin unchanged and green: ui/packages/types/src/__tests__/strict-face-read-keys-11070.test.ts compares CURRENCY_FIELD_SCALE_REFUSAL with the spec's issue message for the same entry.

Acceptance notes

Verification

Gates (local subset, head b15d64c)

Exit codes captured before any pipe.

  • Review round 1 (seat contract review 6673665638, S1): b15d64c6 changes one comment only, the docblock above INLINE_GRID_CURRENCY_SCALE_REFUSAL in packages/spec/src/data/field.zod.ts (L1081), from "the same minor-unit clause" to "the same fraction-digits clause", the name the pin now uses (FRACTION_DIGITS_CLAUSE). At b15d64c6: pnpm --filter @objectstack/spec build 0; spec vitest run (all projects, a wider run than the package test script's --project local 817 files) 907/907 files, 27366 passed, 1 todo; spec tsc --noEmit 0; eslint --no-inline-config on field.zod.ts 0; rg -n -U -i "minor[\s*-]*unit[\s*]*clause" over field.zod.ts and the inline-grid pin finds nothing; the multi-line census still reads 33 lines, the same set as at fbb6e7fb. dispatch-gates --commands derives the same 112 families as at fbb6e7fb, all 112 exit 0; --ran: "112 derived famil(ies) accounted for — 112 run, 0 NOT-MEASURED (a DERIVED zero …)". No ablation re-run (comment only). The figures below are from fbb6e7fb.

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at fbb6e7fb: 112 derived families, all 112 exit 0. --ran (with :: exit N per line): "112 derived, 112 run, 0 NOT-MEASURED, 0 UNRUN … a DERIVED zero — all 112 recorded an exit code and none of them is 3".

  • The same 112 ran first at 82aa23e3 (before the main merge): 108 exit 0 and 4 exit 3 PREREQUISITE NOT MET on a fresh clone (check-plugin-teardown-shape --self-test needed its pinned fixture commit fetched; spec check:skill-examples, check:dual-build-cjs-loads and check:i18n needed unbuilt dists). After git fetch --depth=1 of the fixture and one turbo build of the 39 missing packages, all four re-ran exit 0; the run at fbb6e7fb needed no re-run.

  • pnpm --filter @objectstack/spec build 0; check:generated 0 ("All 14 generated artifacts are up to date"), after gen:docs regenerated the four reference pages; check:spec-changes 0, check:upgrade-guide 0, node scripts/check-adr-0087-registration.mjs --base origin/main 0 ("adds no declared-breaking changeset").

  • @objectstack/spec test: 817/817 files, 25827 passed, 1 todo (lock VERDICT command-exit 0, after the main merge; 25793 before it). typecheck 0.

  • @object-ui/types test 387/387 files (10464 tests); @object-ui/fields 298 passed, 1 skipped (4467 tests); @object-ui/plugin-form 223/223 (2454 tests); @object-ui/plugin-grid 278/278 (2392); @object-ui/plugin-dashboard 203/203 (1957); @object-ui/app-shell ObjectFieldInspector.currencyScale-10221.test.tsx 5/5. After the main merge: the parity file 94/94 and the app-shell file 5/5 again. The first ui run failed to resolve @objectstack/formula / @objectstack/client (unbuilt dists on a fresh clone, no test ran); the recorded numbers are the run after building them.

  • type-check 0 for @object-ui/types, fields, plugin-form, plugin-grid, plugin-dashboard (after building the ui dependency closure; before it, TS2307 on unbuilt @object-ui/* dists). @object-ui/app-shell type-check not run: its two files change comments only.

  • eslint --no-inline-config on the 37 changed .ts / .tsx files at fbb6e7fb: root config 0 errors, ui/ config 0 errors (279 warnings, all no-explicit-any on lines this PR does not touch).

  • Full dogfood battery: not owed (no ! in the title, no (narrowing) arm).

  • PR check-runs at fbb6e7fb: every check suite completed with none failed (check_suite.completed, 2026-11-06T01:10Z). At b15d64c6: not read at the time of writing.

Ablation: the old refusal clause back in the spec only

Run with node scripts/ablation-replace.mjs (run mode: mutate, run the leg, restore with proof) under os-verify-lock.sh, on committed head 82aa23e3. The anchor is the TO clause of the field refusal in packages/spec/src/data/field.zod.ts; the replacement is the FROM clause. Nothing under ui/ was changed.

ablation-replace: anchor   "the currency\\'s CLDR fraction digits (2 for ' +"  x1 (before)
ablation-replace: anchor   x1 -> x0
ablation-replace: replace  "the currency\\'s ISO 4217 minor unit (2 for ' +"  x0 -> x1
ablation-replace: ok mutation landed: anchor 1 -> 0, blob e7f40f2095c6 -> 1cf29ccb760c
spec build EXIT=0
ablation-dist-preflight: @objectstack/spec -- expecting "ISO 4217 minor unit (2 for " in packages/spec/dist
✓ dist/: marker present in 2 built files -- the ablation is live in the artifact the suite consumes.
spec field-currency-scale-refused.test.ts: Tests 4 failed | 9 passed (13)
   × the refusal and the `scale` describe say CLDR and no longer say "ISO 4217 minor unit"   (the new pin)
   × refuses the designer-produced shape … with the ruled remedy   (and two more ruled-remedy cases)
ui strict-face-read-keys-11070.test.ts: Tests 1 failed | 93 passed (94)
   × `scale` on a `currency` entry is refused AT `scale` on both faces, with the spec's own refusal (round 13)
     AssertionError: expected '`scale` is not valid on a `currency` …' to be '`scale` is not valid on a `currency` …' // Object.is equality
ablation-replace: ok restored: blob == HEAD (e7f40f2095c6) and `git diff HEAD` is empty

Restore leg: git diff HEAD on the file 0 bytes, blob e7f40f20… equals HEAD:packages/spec/src/data/field.zod.ts; spec rebuilt; ablation-dist-preflight.mjs … --absent exit 0 ("marker absent from all 592 built files", "working tree clean against HEAD"); the four spec pin files 59/59 and the ui parity file 94/94 green again; git status --porcelain empty.

Published bytes: which packages need a changeset

Each package built at this head, then grep over its dist/ for the new words, with a control.

Package New words in dist/ Control Changeset
@objectstack/spec refusal strings in dist/*.js; src/**/*.zod.ts ships too — patch
@object-ui/types dist/zod/form.zod.js, dist/zod/index.zod.js, dist/form.d.ts — patch
@object-ui/plugin-form dist/index.js, dist/index.umd.cjs (the warning) — patch
@object-ui/fields dist/currency.d.ts (the exported currencyFractionDigits docblock) — patch
@object-ui/plugin-grid none (comment inside a function) neighbouring comment words absent, runtime formatCurrency present none
@object-ui/plugin-dashboard none (comment inside a function) same control none
@objectstack/objectql none (comment inside a function) neighbouring comment words absent, runtime max_scale present in dist/core.js none
@object-ui/app-shell not measured private: true, publishes nothing none

The docs pages and content/docs/references/** are not a published package.


Generated by Claude Code

🤖 Generated with Claude Code

https://claude.ai/code/session_01L6bhgWFZUMBKFD9Lcwt4DU

…s a currency amount's decimal places

The currency `scale` refusal, the inline grid column refusal, the
`currencyConfig` decimal-places prescription, the `precision` and `scale`
describes, the semantic upgrade-guide entries, the docs pages and the ui
mirror strings and docblocks said a currency amount's decimal places are its
ISO 4217 minor unit. The platform's digit source is CLDR's fraction digits
(`CURRENCY_FRACTION_DIGITS`, and `Intl` on every display face), which
differ from ISO 4217 for sixteen codes (IQD 0 against 3, and fifteen codes 0
against 2). Words only: no table value, refusal arm, rule id or path moves.

Claude-Session: https://claude.ai/code/session_01L6bhgWFZUMBKFD9Lcwt4DU
Co-authored-by: Claude <[email protected]>
…s the currency's minor unit now say its CLDR fraction digits

Claude-Session: https://claude.ai/code/session_01L6bhgWFZUMBKFD9Lcwt4DU
Co-authored-by: Claude <[email protected]>
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation protocol:data tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 6, 2026
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/objectql, @objectstack/spec, touching 6 documentable anchor(s). ⚠️ 4 changed file(s) yielded no anchor (packages/spec/liveness/field.json, packages/spec/src/data/field-scale.ts, packages/spec/src/migrations/entries/retired-keys/18.data__CurrencyConfig__precision.ts, …), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/concepts/metadata-driven.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/data-modeling/external-datasources.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/data-modeling/field-types.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/data-modeling/validation-rules.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/deployment/troubleshooting.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/deployment/validating-metadata.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/getting-started/quick-reference.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/kernel/contracts/data-engine.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/protocol/backward-compatibility.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/protocol/objectql/types.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/protocol/objectui/concept.mdx (via FieldSchema (symbol, a top-level const))

⛔ 4 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v17/17-0.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/releases/v17/17-1.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/releases/v17/17-7.mdx (via InlineGridColumnSchema (symbol, a top-level const))
  • content/docs/releases/v18/18-3.mdx (via FieldSchema (symbol, a top-level const))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 4 changed file(s) yielded no anchor (packages/spec/liveness/field.json, packages/spec/src/data/field-scale.ts, packages/spec/src/migrations/entries/retired-keys/18.data__CurrencyConfig__precision.ts, …) — pages documenting those are invisible to this run
  • 4 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 63 of 221 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 103 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 172 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 3214615d7ac3b7b61cfabbae06fbc44de6819ed8 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 8a46f583a580ae312e3ee0521fda8851355061c2 — the merge of head b15d64c6539df5bfcc035c031b0a97771241befd into base 3214615d7ac3b7b61cfabbae06fbc44de6819ed8, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 8a46f583a580ae312e3ee0521fda8851355061c2 && git checkout 8a46f583a580ae312e3ee0521fda8851355061c2
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 3214615d7ac3b7b61cfabbae06fbc44de6819ed8 b15d64c6539df5bfcc035c031b0a97771241befd && git checkout -B drift-repro 3214615d7ac3b7b61cfabbae06fbc44de6819ed8 && git merge --no-ff b15d64c6539df5bfcc035c031b0a97771241befd

node scripts/docs-audit/affected-docs.mjs --json 3214615d7ac3b7b61cfabbae06fbc44de6819ed8

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 3214615d7ac3b7b61cfabbae06fbc44de6819ed8 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: fbb6e7fbcb8154af2f3b5060f00c592cc3cc4e5c
Local-runs: none
Scope: packages/spec/src/conversions/entries/18/currency-config-precision-removed.ts, packages/spec/src/data/field-scale.ts, packages/spec/src/data/field.form.ts, packages/spec/src/data/field.zod.ts, packages/spec/src/migrations/entries/retired-keys/18.data__CurrencyConfig__precision.ts, packages/spec/src/migrations/entries/semantic/18.currency-config-precision-retired.ts, packages/spec/src/migrations/entries/semantic/18.field-currency-scale-refused.ts, packages/spec/src/migrations/entries/semantic/18.inline-grid-column-currency-scale-refused.ts, packages/spec/src/migrations/entries/semantic/18.inline-grid-column-identity-only-currency-scale-refused.ts, packages/spec/src/migrations/entries/semantic/18.ui-object-master-detail-form-details-closed.ts, packages/spec/src/migrations/entries/semantic/18.ui-page-panel-children-cross-references-judged.ts, packages/spec/src/migrations/entries/semantic/18.ui-record-line-items-props-closed.ts, packages/spec/src/migrations/registry.ts.template + packages/spec/src/data/currency-fraction-digits.ts, ui/packages/fields/src/currency.ts, ui/packages/types/src/zod/form.zod.ts, ui/packages/types/src/tests/strict-face-read-keys-11070.test.ts, ui/packages/plugin-form/src/deriveMasterDetail.ts, packages/spec/src/data/field-currency-scale-refused.test.ts, packages/spec/src/data/inline-grid-column-currency-scale-refused.test.ts, packages/spec/src/data/currency-precision-iso4217.test.ts, packages/spec/src/data/field-scale.test.ts, packages/spec/scripts/build-migration-registry.ts, content/docs/data-modeling/currency.mdx, content/docs/references/** (regenerated, read)

Inputs: card #30648 (body; comments 6669128063, 6670054953, 6670528106, 6671521736, 6671610302, 6671693654, 6673544989), PR #30755 (body, 51-file list, net diff origin/main...fbb6e7fb), and the head's check-runs, read at 2026-11-06T00:54Z: 22 completed green (Check Changeset, Governed Surface Queue Guard, PR-body guards, Lint · docs & code guards, Lint · PM dispatch-gates, Lint · ESLint, Lint · CI, release & engine gates, Lint · repo & tooling gates, Lint · scoped · query-options erasure, Lint · scoped · tooling self-tests, Type Check · source gates, Type Check · debt ledger, Spec property liveness, Dogfood Regression Gate, Build Docs, Build UI Deps, Check Documentation Links, Check PR Size, Flag docs affected, Plan Test Core shards, Auto Label, filter), 7 skipped (opt-in or gated families), 0 failed; still running at that reading: Test Core 1-8, Test UI 1-16, Type Check · workspace, Type Check · consumer gates, Type Check UI, Lint UI, Lint · scoped · slot lookup & corpus, Build Core, Build & E2E UI, Live E2E UI. The verdict below is rendered on the completed set; a red among the running families is a new reading of this head and re-judges it.

① Derived judgments

Accept set — unchanged, judged on the tree, each named RIGHT:

  • FieldSchema currency scale refusal (field.zod.ts L3156-3167): the arm field.type === 'currency' && field.scale !== undefined, code: 'custom', path: ['scale'] are byte-identical to main; only the message's second sentence moves ("ISO 4217 minor unit … decides" → "CLDR fraction digits … decide"). First sentence and remedy ("delete the key") unchanged. RIGHT.
  • InlineGridColumnSchema refusal (field.zod.ts L1084-1088, fired at L1177): same — arm, code, path unchanged; INLINE_GRID_CURRENCY_SCALE_REFUSAL reworded the same way. RIGHT.
  • CURRENCY_DECIMAL_PLACES_ARE_THE_CURRENCYS (L491-496) feeds the three CURRENCY_CONFIG_DECIMAL_PLACES_GUIDANCE prescriptions (precision tombstone, decimals, scale, L522-537): the key set and the "Delete the key" remedy are unchanged; words only. RIGHT.
  • .describe() of precision (L1463), scale (L1488) and the inline column scale (L1159): the describes are published text (rendered into content/docs/references/data/field.mdx, object.mdx, ui/component.mdx); the word-diff of the regenerated references is exactly 13 substitutions of the same clause and nothing else. RIGHT, and the regeneration is complete (Lint · docs & code guards green on the head).
  • ADR-0087 entries: the conversion currency-config-precision-removed keeps its id, surface and convert; only summary moves. The seven semantic entries keep id, surface, since and their replacement / reason / verify structure; words only. No entry is added, so no ADR-0087 registration is owed (check-adr-0087-registration is in the Lint · PM dispatch-gates family, green). RIGHT.
  • registry.ts.template L1630: the change is inside the STEP18_RATIONALE string literal; the generated registry.ts is gitignored (.gitignore L65-69) and rebuilt by scripts/build-migration-registry.ts on install/build, so nothing checked in is stale. The upgrade guide is generated in memory (build-upgrade-guide.ts --check), nothing checked in. RIGHT.
  • field-scale.ts L107-109, field.form.ts L81, retired-keys/18.data__CurrencyConfig__precision.ts L9: comments only; resolveFieldScale and the form's visibleWhen / helpText are unchanged. RIGHT.

Public-surface changes implied — named:

  • The refusal messages are a published surface in two senses the claim's "no refusal arm … changes" does not cover and the changeset does: @objectstack/spec ships them in dist/*.js, and ui/packages/types/src/zod/form.zod.ts L1089-1095 holds CURRENCY_FIELD_SCALE_REFUSAL which strict-face-read-keys-11070.test.ts L325-335 pins toBe(specIssue.message). Both strings move in this PR, word for word; the ui parity pin stays green (the PR's own ablation shows it red when only the spec side moves). RIGHT — and it is the reason triage 6670528106 ordered one PR.
  • The console.warn copy in deriveMasterDetail.ts L298-303 repeats the inline-column refusal; moved the same way. No test asserts that text (full-tree grep at the head finds no pin on the old clause outside the four spec pin files, all of which the PR moves). RIGHT.
  • Consumers matching the old text: the changeset for @objectstack/spec says so ("A check that matches the old text … no longer matches"). Correct disclosure for a patch.

Truth of the wording, read against the two sources the card names:

  • packages/spec/src/data/currency-fraction-digits.ts L1-90: a CLDR 48.0 currencyData snapshot (ICU 78.2), explicitly "NOT ISO 4217 minor units", listing the sixteen differing codes. Values at the head: USD: 2, JPY: 0, KWD: 3, IQD: 0, HUF: 0, COP: 0. The three examples kept in every reworded string (2 USD, 0 JPY, 3 KWD) hold in both systems.
  • ui/packages/fields/src/currency.ts currencyFractionDigits reads new Intl.NumberFormat(undefined, { style: 'currency', currency }).resolvedOptions().maximumFractionDigits (ICU = CLDR currencyData), with a 2-digit fallback only for invalid codes; number-format.ts currencyDisplayWidth and GridField.tsx currencyWidth route through it. "The currency's CLDR fraction digits decide how the amount displays" is true of every display face.
  • 18.currency-config-precision-retired.ts L29-30 now says the old Contract question: should publish-time validation reject a declared currency precision that contradicts the currency's ISO 4217 digits? #7918 check judged "a fixed field whose code has a known CLDR fraction-digit count": true — the table's own TSDoc (L34-36) records that the snapshot was generated FOR that check, so what it compared against was CLDR's count, even though the check was named an "ISO 4217" check. The lines that keep that name (registry.ts.template L1629 "declared and validated against ISO 4217", currency-config-precision-removed.ts L23/L54, field.zod.ts L510, retired-keys L5-6) name the retired check, not the digit source; leaving them is right.
  • Quoted ruling 乙 「a currency's ISO 4217 minor unit decides its display」 is kept verbatim at field.zod.ts L1077, 18.inline-grid-column-currency-scale-refused.ts L19, 18.ui-object-master-detail-form-details-closed.ts L40, 18.form-view-subform-columns-closed.ts L29 and the inline-grid test L7, as the card's ⛔ requires. RIGHT.
  • Residue at the head (full-tree git grep for "minor unit" / "4217 + digit|decimal|fraction|width", CHANGELOGs and content/docs/releases/** excluded): every remaining line either quotes the ruling, names CLDR with ISO 4217 as the contrast, names the retired check, uses the bare generic "minor unit", or is ui/packages/i18n/src/__tests__/machineLocaleCensus-9909.test.ts L255 (kept out by amendment 6671693654; open PR feat(console): an administrator's first-run checklist on Home replaces the currency and time zone dialog #30552). The census in the PR body matches the tree.

② Semver level

  • Four patch changesets (@objectstack/spec, @object-ui/types, @object-ui/fields, @object-ui/plugin-form), each carrying Clause-②: no and Metadata-protocol: none; the PR body carries the same two lines. Check Changeset green.
  • Level: RIGHT. Nothing an author can write changes (the same keys are accepted and refused at the same paths with the same codes), so Metadata-protocol: none ⇒ patch per AGENTS.md §3. Clause-②: no is right: no accept-set widening or narrowing anywhere in the diff, no (narrowing) arm owed.
  • Package set: RIGHT against the tree. @objectstack/spec (refusal strings, describes, entries in dist/), @object-ui/types (CURRENCY_FIELD_SCALE_REFUSAL in dist/zod/form.zod.js, the form.ts docblock in form.d.ts), @object-ui/plugin-form (the console.warn), @object-ui/fields (the exported currencyFractionDigits docblock ships in currency.d.ts). @objectstack/objectql, @object-ui/plugin-grid, @object-ui/plugin-dashboard change comments inside function bodies only; @object-ui/app-shell is private. No changeset owed there; skip-changeset not used.

③ Boundary flags

④ Design judgment

Each hits file read against the two digit sources (CURRENCY_FRACTION_DIGITS, currencyFractionDigits), ruling 乙's point (the currency decides, not a setting) and the pins that hold the text.

  • field.zod.ts — HOLDS. The four runtime strings (L491 constant, L1084 inline refusal, L1159 inline describe, L3159 field refusal) and the two describes (L1463, L1488) say CLDR; the two refusals keep the shared first sentence and the shared clause the inline-grid pin's FRACTION_DIGITS_CLAUSE holds, so the parity pin at inline-grid-column-currency-scale-refused.test.ts L172-185 and the spec↔ui pin at strict-face-read-keys-11070.test.ts L325-335 are both satisfied by the tree. Tried to break it: a consumer that matched the old clause — none in the tree outside the moved pins; a describe consumer — content/docs/references/** regenerated; the inline column path — ctx.addIssue at L1177 unchanged.
    • S1 (should-fix) packages/spec/src/data/field.zod.ts:1081 — the docblock over INLINE_GRID_CURRENCY_SCALE_REFUSAL still says the test "holds the two refusals to the same first sentence and the same minor-unit clause". The PR renamed that pin's constant MINOR_UNIT_CLAUSE → FRACTION_DIGITS_CLAUSE and reworded the test's own docblock to "fraction-digits clause" (test L24), so this comment now names a clause the pin no longer calls that. Comment only; one word pair. Not a FAIL.
  • field-scale.ts L104-109 — HOLDS. The TSDoc paraphrases ruling 乙's remedy and then states the digit source; the quote marks are not used, so rewording the paraphrase does not touch a quoted ruling. resolveFieldScale still answers undefined for currency (pinned at field-scale.test.ts L57-61).
  • field.form.ts L78-82 — HOLDS. Comment only; the precision row's helpText: 'Total digits' and the scale row's visibleWhen: number are unchanged, so the designer still offers no decimal-places setting on currency (pinned at field-currency-scale-refused.test.ts "no registered metadata form OFFERS scale").
  • conversions/entries/18/currency-config-precision-removed.ts — HOLDS. summary is the text os migrate meta prints; id, surface, convert unchanged. L23/L54 keep "ISO 4217 contradiction check" as the retired check's name, next to the corrected digit source — the two sentences are consistent, not contradictory.
  • retired-keys/18.data__CurrencyConfig__precision.ts L9 — HOLDS. Header comment only; the tombstone's prescription comes from CURRENCY_CONFIG_DECIMAL_PLACES_GUIDANCE, which is reworded in field.zod.ts and pinned at currency-precision-iso4217.test.ts L58-62 and L108.
  • semantic/18.currency-config-precision-retired.ts L19, L29-30 — HOLDS (see ① for the L29-30 truth claim).
  • semantic/18.field-currency-scale-refused.ts L12, L21-22, L43 — HOLDS. replacement matches the refusal's new words; verify ("renders the currency's CLDR fraction digits, as before") is what currencyFractionDigits does. L21-22 "fraction digits come from the currency's CLDR fraction-digit count" is tautological but true; not flagged.
  • semantic/18.inline-grid-column-currency-scale-refused.ts L14 — HOLDS; L19 keeps the quoted ruling.
  • semantic/18.inline-grid-column-identity-only-currency-scale-refused.ts L22 — HOLDS; the identity-only column still takes its width from the child field's currency at render time (GridField.tsx currencyWidth).
  • semantic/18.ui-object-master-detail-form-details-closed.ts L32 — HOLDS; L40 keeps the quoted ruling.
  • semantic/18.ui-page-panel-children-cross-references-judged.ts L25 — HOLDS.
  • semantic/18.ui-record-line-items-props-closed.ts L35 — HOLDS.
  • migrations/registry.ts.template L1630 — HOLDS. String literal only; the template's consumer (build-migration-registry.ts) interpolates entries, not this text, and step18-rationale-merge.test.ts pins no ISO 4217 wording.

Must-fix: none. Should-fix: S1.

Not reviewed here, the lane seat's ACCEPT at TIER_DEFAULT: the four changesets, liveness/field.json (note only), the hand-written docs pages, the regenerated references, packages/objectql comment, the ui docblocks and test titles.

Implemented-by: claude/project-thread-437a6c
Reviewed-by: session_01L6bhgVugtCCwBs98FeR27P

VERDICT: PASS


Generated by Claude Code

…ion-digits clause

The docblock above INLINE_GRID_CURRENCY_SCALE_REFUSAL still said the pin
holds the two refusals to "the same minor-unit clause"; the pin's constant
is FRACTION_DIGITS_CLAUSE now and its own docblock says "fraction-digits
clause". Comment only.

Claude-Session: https://claude.ai/code/session_01L6bhgWFZUMBKFD9Lcwt4DU
Co-authored-by: Claude <[email protected]>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b15d64c6539df5bfcc035c031b0a97771241befd
Local-runs: none
Scope: packages/spec/src/conversions/entries/18/currency-config-precision-removed.ts, packages/spec/src/data/field-scale.ts, packages/spec/src/data/field.form.ts, packages/spec/src/data/field.zod.ts, packages/spec/src/migrations/entries/retired-keys/18.data__CurrencyConfig__precision.ts, packages/spec/src/migrations/entries/semantic/18.currency-config-precision-retired.ts, packages/spec/src/migrations/entries/semantic/18.field-currency-scale-refused.ts, packages/spec/src/migrations/entries/semantic/18.inline-grid-column-currency-scale-refused.ts, packages/spec/src/migrations/entries/semantic/18.inline-grid-column-identity-only-currency-scale-refused.ts, packages/spec/src/migrations/entries/semantic/18.ui-object-master-detail-form-details-closed.ts, packages/spec/src/migrations/entries/semantic/18.ui-page-panel-children-cross-references-judged.ts, packages/spec/src/migrations/entries/semantic/18.ui-record-line-items-props-closed.ts, packages/spec/src/migrations/registry.ts.template + packages/spec/src/data/inline-grid-column-currency-scale-refused.test.ts (the pin the delta's comment names), and for the carried rest the files round 1 listed

Delta review over round 1 (record 6673665638, PASS on fbb6e7fb). Inputs: git diff fbb6e7fb b15d64c6, the dev report 6674306507 on #30648, the PR head (b15d64c6 is the PR's head), and the check-runs on b15d64c6, read at 2026-11-06T01:33Z: 11 completed green (Check Changeset, Governed Surface Queue Guard, PR-body guards, Spec property liveness, Dogfood Regression Gate, Plan Test Core shards, Check Documentation Links, Check PR Size, Flag docs affected, Auto Label, filter), 7 skipped (opt-in or gated families), 0 failed; still running at that reading: every Lint · family, every Type Check · family, Test Core 1-8, Build Core, Build Docs, Build UI Deps, Live E2E UI. On fbb6e7fb the same families all completed green with none failing, and the delta is one comment line pair. A red among the running families is a new reading of this head and re-judges it.

① Derived judgments

  • The delta is exactly one commit (b15d64c6 "docs(spec): call the inline-grid parity pin's shared clause the fraction-digits clause"), one file, +2/-2: the docblock over INLINE_GRID_CURRENCY_SCALE_REFUSAL at packages/spec/src/data/field.zod.ts L1081-1082 now says the pin holds the two refusals "to the same first sentence and the same fraction-digits clause". The word it names is the pin's own: inline-grid-column-currency-scale-refused.test.ts L63 FRACTION_DIGITS_CLAUSE and its docblock L24 "fraction-digits clause". RIGHT.
  • Nothing else moved: git diff fbb6e7fb b15d64c6 touches no string literal, no schema member, no test, no changeset, no generated artifact. The net diff against main is the same 51 files as round 1 (+2 lines on the one file). No accept-set or public-surface change is implied by the delta.
  • Round 1's ① judgments carry unchanged for every other hits file and the cited code.

② Semver level

  • Unchanged from round 1: four patch changesets, Clause-②: no, Metadata-protocol: none; the delta is a comment inside @objectstack/spec and is covered by the existing @objectstack/spec patch changeset. No new changeset owed. RIGHT. Check Changeset green on this head.

③ Boundary flags

④ Design judgment

  • field.zod.ts L1081-1082 — HOLDS. The comment now names the clause by the name the pin uses, so a reader who follows it to the test finds FRACTION_DIGITS_CLAUSE. The refusal strings it describes (L1084-1088, L3159-3166) and the pin that holds them (inline-grid-column-currency-scale-refused.test.ts L172-185) are byte-identical to fbb6e7fb. S1 of round 1 is closed.
  • Every other hits file: unchanged since fbb6e7fb; round 1's ④ carries.

Must-fix: none. Should-fix: none open (S1 closed).

Implemented-by: claude/project-thread-437a6c
Reviewed-by: session_01L6bhgVugtCCwBs98FeR27P

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

维护者速读

  • 改了什么:货币金额的小数位,以前在 spec 的两条 scale 拒收句、precision / scale 的 describe、升级指南的语义条目、四个文档页和 ui 的镜像里都写成「ISO 4217 minor unit」,现在统一写成「CLDR fraction digits」,与 CURRENCY_FRACTION_DIGITS 和 PR feat(spec)!: refuse a homeAmount rateField declaring scale below 12; document CURRENCY_FRACTION_DIGITS as CLDR fraction digits #30644 改过的 currency.mdx 一个说法。
  • 为什么改:平台的位数来源一直是 CLDR(表是 CLDR currencyData 快照,界面问 Intl),有 16 种货币两边不同,比如 IQD 在 CLDR 是 0 位、ISO 4217 是 3 位。旧说法会让作者照 ISO 去查,查到的位数和平台显示的对不上。
  • 风险与回滚:只改文字。拒收的条目、code、path、补救(删掉 scale)都没变,表里的数一个没动;按旧句子原文去匹配报错信息的检查会匹配不上。四个 patch changeset。回滚即 revert 本 PR。
  • 先看:packages/spec/src/data/field.zod.ts 的两条拒收句 → ui/packages/types/src/zod/form.zod.ts 的镜像和对等 pin → field-currency-scale-refused.test.ts 的新 pin。
  • 两分钟验证:pnpm --filter @objectstack/spec exec vitest run src/data/field-currency-scale-refused.test.ts,预期全过;把旧句子放回 spec,新 pin 和 ui 对等 pin 转红。
  • 需要你做的:无,席位落地。
  • 席位意见:接受。首轮契约复核 PASS(6673665638,Head-sha fbb6e7fb),一条 should-fix(field.zod.ts L1081 注释还说 minor-unit clause),席位采纳;补丁轮 delta 复核 PASS(6674350753,Head-sha b15d64c6),没有新发现。

席位核对

ACCEPT · head b15d64c6539df5bfcc035c031b0a97771241befd · 2026-11-06T01:58Z

  1. 形态:
    • draft,base main,正文 Fixes #30648,全文只有这一个闭合关键词。
    • 51 个文件都在认领 6671521736 的文件面内,加上修订 6671693654 放进来的折行拼写那几处。
    • 没碰任何 CHANGELOG.md;引用裁决乙原话的五行照原样留着(field.zod.ts L1077、inline-grid pin L7、三个语义条目),正文逐条列了去向。
    • skills/**、docs/adr/**、.claude/**、AGENTS.md 都没碰。
  2. 前提实测:认领时在 origin/main 788715ef 上读到 field.zod.ts 七处、ui form.zod.ts L1091 都写着「ISO 4217 minor unit」,strict-face-read-keys-11070.test.ts L325-326 把 ui 拒收句和 spec 的钉成相等。复核在 head 上对过 CURRENCY_FRACTION_DIGITS(CLDR 48.0:USD 2、JPY 0、KWD 3、IQD 0、HUF 0)和 ui 的 currencyFractionDigits(Intl.NumberFormat(...).resolvedOptions().maximumFractionDigits),新说法属实。
  3. 门禁 check-runs:
    • head b15d64c6 共 69 条 check-run,60 success、9 skipped、0 failure,全部跑完:Test Core 8 个分片、Test UI 16 个分片、Build Core、Type Check 各族、Check Changeset、PR-body guards、Governed Surface Queue Guard 都在其中。上一个 head fbb6e7fb 也是全部跑完、没有失败。
    • 首轮复核 6673665638 和 delta 复核 6674350753 都在 Served-tier: CONTRACT_REVIEW_TIER 下 PASS,覆盖 hits 的 13 个 spec 源文件:field.zod.ts、field-scale.ts、field.form.ts、conversion 条目、retired-key 条目、7 个语义条目、registry.ts.template。delta 只动了 field.zod.ts L1081-1082 两行注释,其余沿用首轮判断。
    • dev 本地:fbb6e7fb 上 spec 817 / 25827、ui types、fields、plugin-form、plugin-grid、plugin-dashboard 测试和 type-check 都过;112 条派生门禁全 exit 0,--ran 0 NOT-MEASURED。b15d64c6 上 spec build 0、全项目 vitest 907 个文件 / 27366 条、tsc 0、eslint 0,112 条派生门禁再跑一遍全 exit 0,--ran 0 NOT-MEASURED。
    • 消融:只在 spec 里把拒收句放回旧句子,spec pin 4 条、ui 对等 pin 1 条转红;还原后 blob 等于 HEAD,dist 无标记。补丁轮只动注释,没有重跑,席位接受。
  4. 席位自读(TIER_DEFAULT,hits 之外的部分):
    • ui:CURRENCY_FIELD_SCALE_REFUSAL 与 spec 拒收句逐字一致;deriveMasterDetail.ts 的警告句跟 spec 的 inline-grid 拒收句一致;其余 ui 改动是文档注释和测试注释,没有断言变化。
    • 文档页:field-types.mdx、validation-rules.mdx、schema.mdx、types.mdx 换的是同一个分句;content/docs/references/** 是重新生成的,复核做过逐词对照,只有这一个分句的 13 处替换。
    • changeset 逐句核过:@objectstack/spec、@object-ui/types、@object-ui/fields、@object-ui/plugin-form 各一条 patch,Clause-②: no / Metadata-protocol: none,与认领一致。objectql、plugin-grid、plugin-dashboard 只改了注释,dev 实测这些注释不进 dist,不出 changeset;app-shell 是私有包,也不出。
  5. 接受的偏差:
  6. 范围外去向和 Skills-docs::Clause-②: no,没有 Skills-docs: 行要求。第 5 项第一条记在 spec 席 2 席位帖上,等 feat(console): an administrator's first-run checklist on Home replaces the currency and time zone dialog #30552 落地后处理,不另开卡。
  7. 落地条款:check-governed-merges.mjs --pr objectstack-ai/objectstack#30755 已在本 head 读过:51 个路径 0 个命中 governed 登记,298 行(+183 / -115)≤ 3000,走普通合并队列;落地前再读一次。CI 全绿后经 relay pr_ready + automerge_enable,跟到 MERGED,同一动作里摘 pm:dispatched。

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 6, 2026 02:00
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge November 6, 2026 02:00
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit 5268f50 Nov 6, 2026
70 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-437a6c branch November 6, 2026 02:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Published currency text says decimal places are the ISO 4217 minor unit; the platform uses CLDR fraction digits (16 codes differ, e.g. IQD 0 not 3)

1 participant