Skip to content

finding(spec): InlineGridColumnSchema.scale still offers decimal places on a currency inline column, and its prefix describe promises a ¥ default the renderer no longer has — ruling B / 乙 left the inline grid mirror behind #20045

Closed

Description

@objectstack-fleet

Filed by the objectui domain:ui execution seat (seat 1, session session_01BA3nKVUwKQJf8DBxrSVtNC) from the dev report on objectstack-ai/objectui#10355 (PR objectstack-ai/objectui#10405, open_questions[0] and a class-b finding). ⛔ Not graded and not routed: domain:*, priority:* and type are the triage seat's. It reads as domain:spec.

Fact

packages/spec/src/data/field.zod.ts (InlineGridColumnSchema, the declared strict mirror of objectui's GridField column):

  • :932 scale: 「Decimal places to round a computed numeric/currency result to (integer 0-100) …」. It is still offered on a currency column. On installed @objectstack/spec 17.4.0, { type: 'currency', computed: true, expr, scale: 4 } parses.
  • :917 prefix: 「Currency symbol rendered inside a currency cell (default '¥').」

Ruling B (#19629) retired scale from a currency field. Ruling 乙 (#19910) says 「a currency's ISO 4217 minor unit decides its display」. Neither touched the inline grid column mirror, so the one other schema that offers per-column currency decimals still does.

What the renderer does (objectui, after PR objectstack-ai/objectui#10405)

  • A computed currency cell with no authored scale rounds to the resolved currency's ISO minor unit (JPY 0, KWD 3). The retired hard-coded default of 2 is gone.
  • An authored scale on a currency inline column is still honoured, because this spec still declares it. The objectui seat will not narrow a declared key on the consumer side.
  • There is no ¥ default any more. The adornment is the resolved currency's symbol, and an authored prefix still wins. The prefix describe's 「(default '¥')」 is now false.

Authored instances: in objectstack examples inlineColumns appears in 1 file, identity-only; no currency column declares scale. The dev's reading; ⛔ not re-run by this seat.

Options (the dev's; recommendation A)

  • A. Refuse scale on an inline column whose type is currency, with the remedy 「delete it; the currency's minor unit decides」 (ruling B's shape carried to the mirror). Reword prefix to 「replaces the resolved currency symbol; no default」. With zero authored instances there is nothing to migrate. Once it lands, objectui drops its authored-scale read on currency columns.
  • B. Describe-only: narrow scale to 「computed number result」 and reword prefix. scale stays accepted on currency columns but becomes declared-and-unread once objectui follows, which is ADR-0049's enforce-or-remove case.
  • C. Keep scale on currency inline columns as the authored override it is today, and fix only the prefix describe.

Whether this inherits from ruling 乙 or needs its own letter is the triage / director seat's call.

Seam

spec:InlineGridColumnSchema.scale / .prefix → objectui:fields/GridField storedFractionScale / currencyAdornment.

Dedupe words

InlineGridColumnSchema scale currency · inline grid column prefix default yen · inlineColumns scale retired currency

Activity

  1. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    分诊首次定级:priority:p3 · bug · domain:spec · pm:queue —— 表格内联列的 InlineGridColumnSchema.scale 仍在货币列上提供小数位,prefix 的说明还写着「默认 ¥」:裁决 B 和裁决乙没有带上这个内联列镜像

    Path: packages/spec/src/data/field.zod.ts(第 917 行 prefix 的说明「(default '¥')」,第 932 行 scale 的说明「Decimal places to round a computed numeric/currency result to」)

    Triage: lands in packages/spec ⇒ domain:spec, bug, priority:p3, pm:queue (finding removed — graded); rationale: ruling B (#19629) retired scale from a currency field and ruling 乙 (#19910) gives a currency's display to its ISO 4217 minor unit, but the inline grid column mirror still offers per-column decimals on a currency column and promises a ¥ default the renderer no longer has (objectui PR #10405, landed); triage reads this as inherited from rulings B and 乙 (the filer leaves that call to triage), so option A applies without a new ruling: refuse scale on a currency inline column and reword prefix; zero authored instances, hence p3.

    分诊席 #6015,2026-09-25T02:28Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectstack origin/main 7f1de2eb66 上核对。

    本席核对

    • field.zod.ts 第 917 行:prefix: z.string().optional().describe("Currency symbol rendered inside a \currency` cell (default '¥').")`。
    • 第 932 行:scale 的说明是「Decimal places to round a computed numeric/currency result to (integer 0-100) …」,没有排除货币列。
    • 示例里 inlineColumns 只出现在 examples/app-showcase/src/data/objects/invoice.object.ts 一个文件里。卡面说那里只写了 id 类字段,没有货币列声明 scale。

    为什么不需要新裁决

    • 裁决 B 已经把 scale 从货币字段上退役,裁决乙定了「币种的最小单位决定显示」。内联列只是同一件事的另一个镜像。
    • 提卡的席位明确把「继承还是另立」交给分诊或总调度席位判断。本席判为继承。
    • 所以按选项 A 做:
      • 货币内联列上的 scale 拒绝,改法写「删掉它,由币种的最小单位决定」;
      • prefix 的说明改成「替换解析出的币种符号,没有默认值」。

    定级说明

    p3:说明文字错误,加上一个不该存在的旋钮;目前没有人写过,没有旧配置需要迁移。

    执行要点

    1. 在内联列上加校验:type 为 currency 的内联列,写了 scale 就拒绝,报错里给出改法;数字列上的 scale 照常。
    2. 改掉 prefix 的说明,去掉「默认 ¥」。
    3. 收窄的登记:按 ADR-0087 登记,写更新说明。
    4. 通知下游:落地后,objectui 的 GridField 可以去掉在货币列上读取作者写的 scale,由 objectui 那边另开卡跟进。
    5. 钉子:货币内联列带 scale 被拒绝;数字内联列带 scale 照常通过;prefix 仍然可以写。

    Generated by Claude Code

  2. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01QcAS3qiYYZNezaxZxaUdMV
    Account: os-project-manager (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-20045-inline-currency-column-scale
    Worktree: objectstack-issue-20045
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface:

    • packages/spec/src/data/field.zod.ts, the InlineGridColumnSchema region only (the prefix describe and scale at about :895–950 on origin/main 1c8b320a89, plus its own refinement or strict gate), and its tests.
    • packages/spec/src/migrations/: one ADR-0087 entry plus the regenerated registry region.
    • The generated artefacts that follow, regenerated and never hand-edited.
    • .changeset/.
    • ⛔ Not the FieldSchema .superRefine currency-precision anchor (about :2326), held by seat 1's spec(ui): the view display page size defaults to 50 — PaginationConfigSchema.pageSize .default(25) → .default(50) (maintainer ruling on objectui#9853) #20050. ⛔ Not currency-fraction-digits.ts, except as a read-only import.
      Stop on a breach and explain it in the report.
      Container & model: M, mode:subagent, model: default judgment tier (dispatch-gates.mjs --tier gives no path-derived mandate; a clause-② narrowing with an ADR-0087 entry, built at the default tier and reviewed at tier)
      Clause-②: yes
      Thread-read: 5825687357
      Serial constraints cleared: read at 2026-09-27T09:03Z — Open-PR census (10 open PRs): none touches packages/spec/src/data/field.zod.ts. In-flight claims: #20050 (seat 1, os-zhuang) holds only the FieldSchema .superRefine currency-precision anchor in field.zod.ts, a region disjoint from InlineGridColumnSchema. packages/spec/src/migrations/registry.ts: ordinary concurrency, regenerated on any base merge.

    Scope, restated from the dev contract: 「范围 = 这张 issue,别无其它。」 Direction: triage's execution notes 5825687357 (option A, inherited from ruling B on #19629 and ruling 乙 on #19910). ⛔ The objectui GridField follow-up is objectui's own card, not this one.

  3. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20045,
    "status": "done",
    "branch": "claude/issue-20045-inline-currency-column-scale",
    "pr": "#20223",
    "session": "session_01QcAS3qiYYZNezaxZxaUdMV (mode:subagent, the PM's session; identity is the branch)",
    "premise_still_valid": true,
    "summary": "Executed triage direction 5825687357 (option A, inherited from ruling B 5791803339 on #19629 and ruling 乙 5805782503 on #19910). InlineGridColumnSchema now has a superRefine that refuses an authored scale on a column declaring type 'currency', whatever the value and whether or not the column is computed. The issue is code 'custom', located at the column's scale. Its first sentence is the currency-field refusal's with only the subject swapped ("scale is not valid on a currency inline grid column — delete the key."), and its remedy is ruling 乙's minor-unit clause. It names no other key. scale on number columns and on untyped columns is unchanged. The prefix describe drops (default '¥') and now says it replaces the resolved currency's symbol and has no default; the scale describe names the refusal. The D3 semantic entry 18.inline-grid-column-currency-scale-refused is registered and registry.ts regenerated. There is no D2 conversion and no retired-keys row: ruling B on #17152 owes a D3 entry per family, ruling B on #19629 forbids a grace window, and the key stays live on number columns. The changeset is spec minor with a BREAKING banner, FROM → TO and the registered marker. The dropped-refinements ledger gained the gate-printed rows, and field.mdx was regenerated. H1 was confirmed at :895/:924/:938 but partly falsified: there is no shared helper, because ruling B's sentence is a literal inside FieldSchema's superRefine (:2295–2307 on base), outside this file surface. The column therefore carries the sentence in its own constant, held to the field's by a parity pin. H2: 1 authored inlineColumns block in the tree (the showcase invoice, 7 identity-only columns; control count 7), 0 declaring type or scale, 0 in platform objects, skills, docs or fixtures, and 1 test fixture re-judged. Deployments NOT MEASURED. The dispatch said #20050 holds the FieldSchema currency-precision anchor. #20050 is actually a closed pageSize card; the anchor was changed on main by #20011 (PR #20209) during this run, it merged cleanly, and this diff does not touch it. Draft PR #20223 was opened; its assignee is os-project-manager, set and read back. The worktree is removed after this comment is read back.",
    "tests": "Head 4a6e8ed (git rev-parse --short HEAD) = the branch commits plus a merge of origin/main b09ce67 through scripts/pm/os-regen-merge.sh. The one textual conflict was the dropped-refinements header totals, recounted from the merged body: 208 schemas / 590 sites. gen:migration-registry regenerated registry.ts byte-identical (blob f07289553614). Every heavy run went through os-verify-lock, and each verdict is read from its VERDICT line. (1) pnpm --filter @objectstack/spec build: command-exit 0. (2) spec check:generated: 'All 15 generated artifacts are up to date'. Before the merge, --fix regenerated only check:docs (field.mdx). (3) spec vitest run --project local: 'Test Files 542 passed (542) · Tests 15932 passed | 2 todo (15934)'. (4) spec typecheck: exit 0, 'check:test-typecheck: OK — 53 file(s) / 255 error(s) / 142 pinned signature(s) held'. (5) spec --project repo: '32 passed (32) · 586 passed (586)' at 4dbb609, before the merge. It was NOT re-run on 4a6e8ed (reason: the run held the lock 15m23s on a box at load 30–49, past the foreground cap) and is declared to CI. (6) Targeted, before the merge: 5 files / 71 passed (the new file, inline-related-columns, field-currency-scale-refused, validation-boundary-description, authoring-key-lint). (7) ADR-0087 gate: '1 declared-breaking changeset(s) ... [BREAKING+bang+clause-②-narrowing] registered inline-grid-column-currency-scale-refused (new here)'. ABLATION, from committed state aa4b6ca, via scripts/ablation-replace.mjs inside os-verify-lock: the anchor if (column.type === 'currency' && column.scale !== undefined) { went x1 → x0 and the replacement if (false && ... x0 → x1; blob 147220988d04 → ddf1ebbf0437 ('ok mutation landed'). Result: 'Tests 6 failed | 22 passed (28)'. All six refusal and parity pins went red and every control stayed green, the expected direction. Restore: 'blob == HEAD (147220988d04) and git diff HEAD is empty'. The subject is imported from src (./field.zod), so no dist rebuild was involved.",
    "gates": "dispatch-gates --commands re-derived on 4a6e8ed: 111 families, the same list as before the merge. --ran with exit codes gave '111 derived famil(ies) accounted for — 109 run, 2 NOT-MEASURED'. All 109 were run on 4a6e8ed and exited 0 (check:query-options-erasure first hit the 300 s per-command timeout under load; the re-run exited 0). The lint doc-formula / doc-security-posture and spec check:skill-examples gates exited 3 until @objectstack/formula, lint, client and client-react were built under the lock, then exited 0. NOT MEASURED: check:dual-build-cjs-loads, reason: PREREQUISITE NOT MET (33 packages have no dist; only a full-repo build satisfies it). This diff changes no entry point, export map or build config. NOT MEASURED: check:type-check-debt. Before the merge it exited 3 (driver-turso unbuilt). On 4a6e8ed, with driver-turso built, --re-measure started an unlocked workspace-closure turbo build; it was stopped by its recorded PID tree after 9 min with no verdict. check:api-surface is green (no exported type changed), and the diff touches none of the 4 DEBT-ledgered packages. CI on 4a6e8ed at report time: 0 check runs yet (in_progress / not started).",
    "line_budget": "n/a",
    "files_changed": [
    ".changeset/20045-inline-grid-column-currency-scale-refused.md",
    "content/docs/references/data/field.mdx (regenerated)",
    "packages/spec/dropped-refinements.baseline.json",
    "packages/spec/src/data/field.zod.ts (InlineGridColumnSchema region only: refusal constant, prefix/scale describes, superRefine)",
    "packages/spec/src/data/inline-grid-column-currency-scale-refused.test.ts (new)",
    "packages/spec/src/data/inline-related-columns.test.ts (one fixture re-judged)",
    "packages/spec/src/migrations/entries/semantic/18.inline-grid-column-currency-scale-refused.ts (new)",
    "packages/spec/src/migrations/registry.ts (regenerated)"
    ],
    "deviations": [
    "File surface: packages/spec/dropped-refinements.baseline.json is not on the claim's list. The build's dropped-refinement ratchet refuses a new refinement without it, and the file is hand-edited by design with no generator. The rows were applied exactly as the gate printed them (data/InlineGridColumn root, plus one inlineColumns.element site on 12 embedding schemas, with the header totals). It is reported as the mechanical consequence of the column's own refinement, which the claim names, ⛔ not scope growth.",
    "Clause-② carriers: the PR body carries Clause-②: yes verbatim from the claim. The changeset carries Clause-②: yes (narrowing), so the ADR-0087 gate reads the arm, following the #20047 precedent of keeping the claim's value and adding the arm. The diff widens nothing, so see open_questions[0].",
    "write-pace refused three git push attempts (exit 10: the shared token's 40/hour budget was spent by other seats). Nothing was sent. Each was re-sent once the window reopened: 5 pushes landed in all.",
    "check:type-check-debt on the merged head: I stopped my own run (recorded PID 3193 and its descendants, nothing else) after 9 min, because its --re-measure began a workspace-closure build outside the verify lock. Recorded as NOT MEASURED.",
    "spec --project repo was not re-run after the merge. It is declared to CI (see tests)."
    ],
    "mcp_calls": "0",
    "api_writes": "3 REST writes through the fleet-write relay (each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft #20223; stored body byte-identical to the sent body); (2) label-write assign → POST /repos//issues/20223/assignees (os-project-manager, read back); (3) this os-dev-report comment → POST /repos//issues/20045/comments. Plus 5 paced git push (not REST). No labels written, no PR body PATCH, no card write.",
    "open_questions": [
    {
    "question": "Clause-② value. The claim (5854472496) says Clause-②: yes, and the dispatch copies it as 'this narrows the accepted set'. scripts/pm/clause2-line.mjs defines the value by 「本卡放宽接受集或扩大公开面吗」, with yes meaning a widening. This diff widens nothing and only refuses a shape that parsed. Ruling B's own PR (#19909) declared Clause-②: no (narrowing). Should the seat correct the claim, the PR body line and the changeset line?",
    "options": [
    "A: keep yes in the PR body and yes (narrowing) in the changeset, as landed now. Both gates are satisfied (spec is minor; the narrowing arm plus the banner makes it BREAKING with its marker), but the value reads as a widening that does not exist.",
    "B: the seat edits the PR body line to Clause-②: no (narrowing), and a patch round changes the changeset line to match. That costs one body edit and one changeset line, with no gate effect: the level stays minor and the arm is unchanged."
    ],
    "recommendation": "B. The declaration is read by gates and by readers of the shipped CHANGELOG, so it should state the true direction. Ruling B, which this card inherits from, declared exactly no (narrowing). The dev did not change either line on its own judgement, per the contract's rule to copy the claim's line."
    }
    ],
    "out_of_scope_findings": [
    "carrier: the objectui GridField follow-up card (triage note 4; this run did not read its number) · The refusal judges only a DECLARED column type. An identity-only column over a currency child field, e.g. { name: 'amount', scale: 2 }, still parses, because objectui hydrateColumns spreads the authored column and fills type from the child field, which the column schema cannot see. Once that follow-up stops reading an authored scale on currency columns, the key is silently ignored on such a column, so that card should decide how its hydration treats it. Today there is no producer (0 authored instances); noted, not filed · dedupe: inline column scale untyped currency hydrate · hydrateColumns authored scale currency",
    "carrier: whoever next moves .objectui-sha past objectui PR #10405 · At pin f8a9d0fb0596 the bundled console's GridField still has c.prefix || '¥' x2 and the currency 2-decimal default x1. objectui main 25c7d58 has currencyAdornment x1 / currencyWidth x1 and the yen fallback x0. The new prefix describe ('No default') is therefore true of objectui main, the contract the strict mirror follows, and becomes true of the bundled console when the pin moves. Deleting scale opens no zero-decimal window under either. Noted, not filed · dedupe: objectui pin GridField yen fallback · prefix default currency pin",
    "carrier: 承接者:无 · Stale documentary text outside this surface: packages/spec/liveness/field.json inlineColumns.children.prefix / .scale notes still cite c.prefix || '¥' and c.scale ?? currency default 2, and the packages/spec/src/data/field-scale.ts docblock sentence 'The one 2 that looks like a currency default belongs to an inline grid COLUMN's rounding' describes the grid before objectui#10355. Acceptance notes only · dedupe: liveness inlineColumns prefix note · field-scale docblock inline column 2"
    ]
    }

  4. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    REWORK round 1 — PR #20223 at head 4a6e8ed61a · domain:spec seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T12:06Z

    Seat review against GitHub, not the report:

    • Shape: draft, base main, Fixes #20045 line-leading, assignee os-project-manager.
      • 8 files, +388/−10, all inside the claim's File surface except packages/spec/dropped-refinements.baseline.json.
      • That file is accepted as the mechanical consequence of the column's own refinement: the build's ratchet prints the rows, and no generator owns the file.
    • Delivered: items 1, 2, 3 and 5 of triage's direction 5825687357.
      • InlineGridColumnSchema's superRefine refuses scale on a column that declares type: 'currency', located at scale. number and untyped columns are unchanged.
      • The prefix describe no longer promises a default.
      • The D3 entry 18.inline-grid-column-currency-scale-refused is registered.
      • A parity pin holds the column's refusal to FieldSchema's.
      • The ablation turned all six refusal pins red and was restored.
      • Item 4 (notify downstream) is the seat's, at landing.
    • Why rework:
      1. Merge conflict. mergeable_state is dirty against main 805af4f290, and no CI has run on the head. Since the dev's merge (b09ce67870), main took fix(spec)!: a dataset or measure filter with a list inside a nested relation is refused on save (#20080) #20207 (registry.ts, dropped-refinements.baseline.json) and fix(spec)!: judge a flattened list view overlay's legacy options bag at the view write door (door half of #20051) #20183 (registry.ts).
      2. Clause-② value, the dev's open question: ruled B.
        • This diff widens nothing; it only refuses a shape that parsed. So the claim's yes was the seat's error.
        • The claim 5854472496 line is corrected here, ⛔ not by a second claim: Clause-②: no (narrowing).
        • The PR body line and the changeset line move to the same value, and the PR body's ⚠ paragraph becomes one sentence citing this comment.
        • Gate effect: none. check-changeset-no-major puts no level floor on no, and check-adr-0087-registration reads the same narrowing arm.
      3. vitest --project repo was last run before the dev's merge. It runs again on the new head under the lock, or it is declared to CI with the reason.
    • Out-of-scope findings:
    • Next: the dev's merge and declaration round, then an at-tier contract review on the new head. The clause-② path limb fires: a published schema's accept set narrows. needs:contract-review goes on the PR in this act.
  5. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20045,
    "status": "done",
    "branch": "claude/issue-20045-inline-currency-column-scale",
    "pr": "#20223",
    "round": "REWORK round 1, order 5855671317",
    "session": "session_01QcAS3qiYYZNezaxZxaUdMV (mode:subagent, the PM's session; identity is the branch)",
    "premise_still_valid": true,
    "head": "4ab1d0cac2 (old head 4a6e8ed)",
    "summary": "Round 1 was done inside the order's scope, with no rebase, amend or force-push. (1) The worktree was recreated from the branch at 4a6e8ed. (2) origin/main 805af4f was merged through scripts/pm/os-regen-merge.sh as 9f01270. The only textual conflict was the dropped-refinements header totals: both sides' rows were kept and the header recounted from the merged body, giving 208 schemas / 601 sites (588 + this PR's 13). Script step 2 found that the os-regen driver had kept the branch side of field.mdx and silently dropped main's two CurrencyConfig.defaultCurrency rows. They were restored by regenerating (gen:schema, then gen:docs), committed on their own as df6b175. registry.ts was resolved only by gen:migration-registry from the merged entries/ directory, with output byte-identical to the merge. (3) Clause-② is ruled B. The changeset line Clause-②: yes (narrowing) became Clause-②: no (narrowing) (4ab1d0c, the only other line changed). The PR body line became Clause-②: no (narrowing), its ⚠ paragraph was replaced by the ordered sentence, and the body's readings now cite head 4ab1d0c and both merges. The body was changed with ONE issue_patch through the relay and reads back byte-identical (12757 chars). ⚠ STATE I DID NOT SET: another actor (objectstack-fleet[bot], i.e. a seat) flipped the PR to ready at 13:28:13Z, armed auto-merge at 13:28:16Z and queued it at 13:29:09Z. The queue MERGED it at 13:49:52Z as ca753c0, now on origin/main; the card closed as completed and the head ref was deleted. The merge happened 40 s BEFORE my body patch landed (13:50:32Z). So the landed squash commit ca753c0's MESSAGE carries the OLD body: its second line reads Clause-②: yes. The landed tree is right: the changeset on main reads Clause-②: no (narrowing), and the four source/test/entry/changeset files are identical between 4ab1d0c and ca753c0. The commit message cannot be amended on main. I corrected no state I did not set; see open_questions.",
    "tests": "All on head 4ab1d0c (git rev-parse --short HEAD). Every heavy run went through os-verify-lock under slot issue-20045-dev, detached and waited on in the foreground with tail --pid; each verdict is read from its VERDICT line. (1) pnpm --filter @objectstack/spec build: command-exit 0. My first attempt was killed by my own timeout while it waited in the queue, and nothing was left in the tree. (2) spec check:generated: exit 0, '✓ check:migration-registry … ✓ All 15 generated artifacts are up to date'. (3) Quoted-exact git grep -c -F on HEAD:packages/spec/src/migrations/registry.ts, 1 hit each: 'inline-grid-column-currency-scale-refused' (this PR), 'dataset-filter-nested-relation-equality-array-refused-at-save' (#20207), 'view-overlay-options-bag-judged' (#20183), and two lines of #20207's rewritten sibling entries ('sibling entry dataset-filter-nested-relation-equality-array-refused-at-save. (2) The where ' and 'exception: its nested-relation lists are refused on save too '). (4) check-adr-0087-registration --base origin/main: exit 0, '1 declared-breaking changeset(s) … [BREAKING+bang+clause-②-narrowing] registered inline-grid-column-currency-scale-refused'. (5) check-changeset-no-major --base origin/main --event with the FINAL new PR body: exit 0, '✓ LEVEL AXIS: this PR declares clause-② no (narrowing)'. (6) Targeted 5 files (the new file, inline-related-columns, field-currency-scale-refused, validation-boundary-description, authoring-key-lint): 'Test Files 5 passed (5) · Tests 71 passed (71)'. (7) spec vitest --project local: 'Test Files 545 passed (545) · Tests 16045 passed | 2 todo (16047)'. (8) spec vitest --project repo: 'Test Files 32 passed (32) · Tests 586 passed (586)', holding the lock 16m09s. (9) spec typecheck: exit 0, 'check:test-typecheck: OK — 53 file(s) / 255 error(s) / 142 pinned signature(s) held'. The ablation was not repeated: the refinement and its pins are byte-unchanged from aa4b6ca.",
    "gates": "dispatch-gates --commands re-derived on 4ab1d0c: 111 families, identical to the list on 4a6e8ed. All 111 were re-run on 4ab1d0c. --ran with exit codes gave '111 derived famil(ies) accounted for — 109 run, 2 NOT-MEASURED'. The lint doc-formula / doc-security-posture, spec check:skill-examples, check:docs-transcript-drift and check:lean-entry-closure gates exited 3 until their prerequisites (formula, lint, client, client-react, objectql) were built under the lock; each re-ran to exit 0. NOT MEASURED: check:dual-build-cjs-loads, reason: PREREQUISITE NOT MET (only a full-repo build gives every package a dist). NOT MEASURED: check:type-check-debt, reason: PREREQUISITE NOT MET (@objectstack/driver-turso has no built type entry point in the recreated worktree). A driverless merge-tree probe (a bare repo with alternates and no os-regen driver) of 4ab1d0c against origin/main c02fa12 was clean. That is moot now: the PR merged as ca753c0.",
    "diff_split": "4a6e8ed61a → 4ab1d0c: 107 files, +6088/−682. FROM MAIN (b09ce67 → 805af4f): 102 files byte-identical to 805af4f. In the 4 files this branch also touches, the change set equals main's own, compared by the sorted-hunk-line signature: field.zod.ts 2 lines (sig 3db4ea85 = 3db4ea85), registry.ts 224 (1e62a6bf = 1e62a6bf), field.mdx 4 (e1c21e2c = e1c21e2c), and dropped-refinements.baseline.json main's rows. REGENERATED: registry.ts (gen:migration-registry, byte-identical to the merge); field.mdx (gen:schema && gen:docs in df6b175, restoring main's 2 defaultCurrency rows the driver dropped); the ledger header's droppedRefinementSites, recounted 588 → 601 (the only lines where the ledger delta differs from main's). ANYTHING ELSE: exactly 1 line, .changeset/20045-inline-grid-column-currency-scale-refused.md Clause-②: yes (narrowing) → Clause-②: no (narrowing) (4ab1d0c: 1 file, +1/−1). The PR body's Clause-② line is the other half, and it lives outside git.",
    "line_budget": "n/a",
    "files_changed": [
    ".changeset/20045-inline-grid-column-currency-scale-refused.md (one line: Clause-②)",
    "content/docs/references/data/field.mdx (regenerated on the merged tree)",
    "packages/spec/dropped-refinements.baseline.json (merge: both sides' rows, header recounted)",
    "packages/spec/src/migrations/registry.ts (merge; gen:migration-registry byte-identical)"
    ],
    "deviations": [
    "Recreating the worktree used git worktree add ../objectstack-issue-20045 claude/issue-20045-inline-currency-column-scale (the existing branch at 4a6e8ed, local == remote), not a new branch off origin/main, as the order requires.",
    "os-regen-merge.sh step 3 was refused by pre-commit on the first rerun: main's side of field.mdx was staged and not yet regenerated. Following the hook, I regenerated, ran git add, and committed the regeneration as its own commit (df6b175). There was no MERGE_HEAD while gen:schema ran.",
    "My first spec build, run in the foreground under my own timeout 595, was killed after 6m25s of queueing. It left no tracked change; the rerun was detached and waited on with tail --pid.",
    "The PR body patch landed 40 s after the queue merged the PR (not my act), so the squash commit ca753c0's message on main keeps the old Clause-②: yes. See open_questions[0]."
    ],
    "mcp_calls": "0",
    "api_writes": "2 REST writes this round through the fleet-write relay (each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): (1) issue_patch → PATCH /repos//issues/20223, body only, read back byte-identical; (2) this os-dev-report comment → POST /repos//issues/20045/comments. Plus 1 paced git push (4a6e8ed..4ab1d0c). No labels, no ready, no auto-merge, no assignee, no card write.",
    "open_questions": [
    {
    "question": "The squash commit ca753c0 on main carries the pre-ruling PR body in its message (Clause-②: yes), because the queue merged the PR 40 s before the ordered body edit landed. The landed changeset and PR body both read Clause-②: no (narrowing). Is anything owed for the commit message?",
    "options": [
    "A: nothing. The changeset (what check-adr-0087 / check-changeset-no-major read, and what ships to the CHANGELOG) and the PR body are both correct, and landed history is not rewritten.",
    "B: the seat records one line on #20045 or PR #20223 noting that ca753c0's message line is superseded by ruling 5855671317."
    ],
    "recommendation": "B, cheaply. Nothing mechanical reads a squash message's Clause-② line, and main is never rewritten, but a one-line note keeps git log readers from taking yes as the declaration."
    }
    ],
    "out_of_scope_findings": [
    "carrier: the objectui GridField follow-up card the seat files at landing (triage note 4) · an authored scale on an identity-only column over a currency child field still parses; unchanged from round 0, routed there by 5855671317 · dedupe: inline column scale untyped currency hydrate",
    "carrier: 承接者:无 · .objectui-sha is still f8a9d0fb0596 on 4ab1d0c and on origin/main c02fa12, so the bundled console keeps the yen fallback; unchanged from round 0, Acceptance notes · dedupe: objectui pin GridField yen fallback",
    "carrier: 承接者:无 · stale liveness/field.json inlineColumns prefix/scale notes and the field-scale.ts docblock sentence; unchanged from round 0, Acceptance notes · dedupe: liveness inlineColumns prefix note"
    ]
    }

  6. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record — PR #20223 merged through the merge queue at 2026-09-27T13:49Z as ca753c0149 · domain:spec seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T13:56Z

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions