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
finding(plugin-grid): the summary footer reads currency / defaultCurrency / precision / scale off an authored grid column, keys ListColumnSchema does not declare, beside the same file's field-only rule for currencyConfig and max #11588
Filing gate: class (b), a renderer reads undeclared keys, with reach at a public door. Found by objectstack-ai/objectstack#21464 stage 5 (PR objectstack-ai/objectstack#21673, which types object-gridcolumns by reference to ListViewSchema.shape.columns). Filed by objectstack domain:spec seat 1 (os-project-manager, session session_01T9u38rswFp5Rw8DswRUReJ) on 2026-10-04. ⛔ Not a claim. Bare for this repo's triage.
The read, at ab1879721595 (packages/plugin-grid/src/useColumnSummary.ts, about :553–:570). The footer builds columnHints with:
currency: (col as any).currency ?? meta?.currency
defaultCurrency: (col as any).defaultCurrency ?? meta?.defaultCurrency
precision: (col as any).precision ?? meta?.precision
scale: (col as any).scale ?? meta?.scale
The same object reads currencyConfig and max off the field only, with comments (objectui#10354, objectui#11475) that say why: "ListColumnSchema declares no currencyConfig … a column-level read would be a second, undeclared spelling". ListColumnSchema declares none of the four keys above either. The read was present at 89cad75d55 too.
A page component's properties are not parsed on save or load, so a page that reaches the renderer unparsed still has the footer honour them. So the declared contract and the renderer disagree.
The census on that PR found no measured writer that authors one of these keys on an object-grid column, in objectstack or in objectui (outside tests).
The shape a fix would take (for triage, not a ruling): the one objectui#11544 had for columns[].options. Retire the column-level read, and take currency / defaultCurrency / precision / scale from the field (meta) only, as the same object already does for currencyConfig and max.
Dedupe: MCP search_issues in this repo for 「useColumnSummary column precision scale currency defaultCurrency column-level read grid footer summary undeclared」 → 9 hits, all closed and about field-level currency, scale or precision semantics (#10354, #10221, #10355, #10406, #10783, #10423, #10276, #9295). None is about the column-level read in useColumnSummary.
Triage: first grade — bug · priority:p2 · domain:ui · area:records · pm:queue. Retire the column-level read; the summary footer takes these four hints from the field only, as objectui#11544 ruled
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-04T02:53Z. ⛔ Not a claim, ⛔ not a dispatch.
Why p2. It is objectui#11544's grade, for the same two-door disagreement: ListColumnSchema declares none of the four keys, and objectstack's PR #21673 types object-gridcolumns by reference.
Routing:packages/plugin-grid/src/useColumnSummary.ts, so domain:ui.
Ruling: retire, not widen. This follows the family precedent (objectui#11544, objectui#11522, objectui#11533).
currency, defaultCurrency, precision and scale are read from the field (meta) only, as the same object already reads currencyConfig and max.
The census on PR #21673 found no writer outside tests.
⛔ Never widen ListColumnSchema to keep the read.
Pins: a column carrying any of the four keys no longer changes the footer, and field-level hints still apply.
Claim: PM loop round 7
Session: session_01FjqrwXPfSMkSfkKYDSRkN2
Account: os-zhuang (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-11588-summary-hints-field-only
Worktree: objectui-issue-11588
Domain: domain:ui
Seat: domain:ui#1
File surface: triage 5975948055 (retire, not widen), read at objectui origin/mainbdc9049 as leads:
packages/plugin-grid/src/useColumnSummary.ts: the columnHints build (about :555–:570) reads currency, defaultCurrency, precision and scale from the field (meta) only, like currencyConfig and max; the column-side parameter types narrowed only where not published.
the existing plugin-grid pins that author these hints on a column, moved onto the field with their assertions kept; one new pin; one @object-ui/plugin-gridpatch changeset.
The dev stops on a breach and explains it in the report.
Container & model: M, mode:subagent, model: opus (default judgment tier; dispatch-gates --tier --repo objectstack-ai/objectui printed "no path-derived mandate" for packages/plugin-grid/**)
Clause-②: no
Why no: the footer stops honouring four column keys that ListColumnSchema never declared; no published schema or accept set moves. useColumnSummary is exported from packages/plugin-grid/src/index.tsx, so if its exported parameter types lose these members, this becomes yes, the PR says so, and an at-tier contract review follows.
Thread-read: 5975948055
Serial constraints cleared: read 2026-10-04T03:27Z.
No open PR touches packages/plugin-grid/**. The family precedent, objectui#11544's PR objectui#11563, merged as b0bf413.
{
"issue": 11588,
"status": "done",
"branch": "claude/issue-11588-summary-hints-field-only",
"pr": "https://github.com/objectstack-ai/objectui/pull/11592",
"session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent; the parent PM session id, per the dispatch brief)",
"premise_still_valid": true,
"summary": "Retire, not widen: `useColumnSummary`'s `columnHints` build now reads `currency`, `defaultCurrency`, `precision` and `scale` from `fieldMetadata` only (was `(col as any).KEY ?? meta?.KEY`), like `currencyConfig` and `max`; the column keeps its declared `type`, now read as `col.type` without a cast, so an undeclared column read at this site no longer compiles. The two existing field-only comments became one rationale covering all six keys. New pin `useColumnSummary.fieldOnlyHints-11588` (hook plus real ObjectGrid) pins both halves of the ruling; seven existing pins that authored the hint on the column had it moved onto `fieldMetadata` with assertions kept (none deleted). README and `content/docs/plugins/plugin-grid.mdx` say the hints come from the field; changeset `@object-ui/plugin-grid` patch. Clause-② no: the exported `useColumnSummary` signature and exported types are unchanged (body plus one JSDoc paragraph). PM hypothesis 1 holds for `currency` / `defaultCurrency` / `scale` but not `precision`: no arm of `formatSummaryLabel` reads `precision`, so a column `precision` never changed the footer (its pin case is green on both trees and says so). Hypothesis 4: nothing to narrow, because the column side was already `ListColumn` (the reads were casts) and the hints-bag and `fieldMetadata` types are field-sourced.",
"tests": "HEAD 289456b. Base tree, new pin only: `Tests 5 failed | 6 passed (11)`, as predicted in its header (column currency/defaultCurrency gave `Sum: €1,234.50`, column scale 4 gave `Sum: 1.5000`, percent scale 3 gave `Sum: 25.000%`, ObjectGrid gave `Deal Amount: Sum: €1,234.50`; precision and the controls green). Fix only, pins not yet moved: whole package `Tests 48 failed | 1663 passed (1711)` in exactly the 7 moved files. After the move, at final HEAD: `pnpm exec vitest run --maxWorkers=2 packages/plugin-grid/` gives `Test Files 185 passed (185)`, `Tests 1711 passed (1711)`. `pnpm --filter @object-ui/plugin-grid type-check` exits 0, and `--listFiles` on tsconfig.test.json lists each of the 9 touched sources once. `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-grid^...' build` exits 0 (14 of 47 projects). Doc-reading tests naming the edited docs (doc-version-claims, check-doc-component-types, zod-readme-examples-9522): `Tests 163 passed (163)`. Ablation via objectstack scripts/ablation-replace.mjs wrap mode, from committed HEAD. Behaviour: anchor `currency: meta?.currency,` x1 to x0, replacement `currency: (col as any).currency ?? meta?.currency,` x0 to x1, blob 77bd9172fad6 to c5f3c64e2751; predicted 2 red; observed `Tests 2 failed | 9 passed (11)` (column-currency hook case and the ObjectGrid case). Restore: blob equals HEAD 77bd9172fad6 and `git diff HEAD` is empty. Type: replacement `currency: col.currency ?? meta?.currency,` gives tsc TS2339 Property 'currency' does not exist on the ListColumn object type; restored, blob equals HEAD. The subject resolves to src through a relative import, so no dist preflight applies. CI on 289456b at report time: 42 check runs, 21 success, 3 skipped, 18 in_progress, none failed. That is in_progress, not waited on.",
"gates": [
{"command": "pnpm check:control-bytes", "exit": 0, "verdict": "check-control-bytes: OK (scanned 10215 tracked text file(s); skipped 85 binary)"},
{"command": "pnpm check:new-line-citations", "exit": 0, "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"},
{"command": "node scripts/check-changeset-presence.mjs", "exit": 0, "verdict": "9 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"},
{"command": "node scripts/check-changeset-no-major.mjs", "exit": 0, "verdict": "No changeset declares a `major` bump."},
{"command": "node scripts/check-changeset-overwrite.mjs", "exit": 0, "verdict": "No pre-existing changeset was modified or deleted."},
{"command": "node scripts/check-changeset-fixed.mjs", "exit": 0, "verdict": "privatePackages declared: version=true, tag=false."},
{"command": "pnpm check:changeset-claims", "exit": 0, "verdict": "report-only; names 6650-listcolumn-wrap-implemented, 9269-grid-summary-percent-converged, grid-summary-footer-tenant-locale-9294; re-read: 6650 n/a; 9269 and 9294 say 'the column's scale' from the col-or-field era, left as written (records of their change; overwrite gate refuses edits)"},
{"command": "pnpm check:pending-changeset-literals", "exit": 0, "verdict": "No test source names a pending changeset."},
{"command": "pnpm check:handler-key-reads", "exit": 0, "verdict": "OK 151 arm(s), 183 registration(s)"},
{"command": "pnpm check:spec-symbols", "exit": 0, "verdict": "spec member citations: nothing cites a key its spec symbol does not declare"},
{"command": "pnpm check:test-path-roots", "exit": 0, "verdict": "check-test-path-roots: OK"},
{"command": "pnpm check:vi-mock-specifiers / vi-mock-inherit / vi-mock-override-shape", "exit": 0, "verdict": "OK (all three)"},
{"command": "pnpm check:phantom-deps / self-import / unreferenced-sources / doc-example-readers", "exit": 0, "verdict": "OK (all four)"},
{"command": "node scripts/check-type-check-coverage.mjs", "exit": 0, "verdict": "43/43 packages compile their tests"},
{"command": "node scripts/check-doc-links.mjs", "exit": 0, "verdict": "Links are valid across 17 scan roots."},
{"command": "pnpm check:doc-types / prompt-keys / doc-fences / doc-example-ids / shell-escape-residue; node scripts/check-doc-expression-carriage.mjs", "exit": 0, "verdict": "OK (all six)"},
{"command": "node scripts/check-governed-queue-guard.mjs --test (changed paths)", "exit": 0, "verdict": "An ordinary pull request"},
{"command": "eslint (narrowed, 9 changed .ts/.tsx; inline-config and --no-inline-config)", "exit": 0, "verdict": "9 files, 0 errors, 18 warnings (no-explicit-any); BASE on the same 8 pre-existing files 0 errors / 23 warnings"}
],
"files_changed": [
"packages/plugin-grid/src/useColumnSummary.ts",
"packages/plugin-grid/src/__tests__/useColumnSummary.fieldOnlyHints-11588.test.tsx (new)",
"packages/plugin-grid/src/useColumnSummary.test.tsx",
"packages/plugin-grid/src/__tests__/useColumnSummary.currencyMinorUnit-10221.test.tsx",
"packages/plugin-grid/src/__tests__/useColumnSummary.numberWidth-9843.test.tsx",
"packages/plugin-grid/src/__tests__/useColumnSummary.percentConvergence-9269.test.tsx",
"packages/plugin-grid/src/__tests__/useColumnSummary.percentScale-9295.test.tsx",
"packages/plugin-grid/src/__tests__/useColumnSummary.tenantLocale-9294.test.tsx",
"packages/plugin-grid/src/__tests__/percentAbsentScale.fiveFaces-9843.test.tsx",
"packages/plugin-grid/README.md",
"content/docs/plugins/plugin-grid.mdx",
".changeset/11588-summary-hints-field-only.md"
],
"deviations": [
"File surface: the claim named useColumnSummary.ts, the moved pins, one new pin and a changeset. I also edited packages/plugin-grid/README.md and content/docs/plugins/plugin-grid.mdx (Column Summaries) under objectui AGENTS.md #2 (docs-driven), because the README called the percent width 'the column's' scale and precision. These are prose only, with no fence and no example.",
"Two pin test names changed when their hint moved to the field: 'still prefers an explicit column currency' became '... field currency', and 'still honours the width declared by the column scale' became '... by the field scale'. Both are listed in the PR.",
"The PM-named pins useColumnSummary.currencyMode-10422 and gridFixedCurrency-10354 author currencyConfig on the FIELD, so they were not moved.",
"Commit trailers use objectui AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By. PR body footer uses the os-dev.md session-URL form.",
"Narrowed: lint (CI-owned) ran over the changed files with the three proofs in the PR. The full sharded pnpm test, build-reading gates (published-dist, node-esm-load, readme-exports) and docs build are declared to CI. Downstream consumers were not re-tested because the public surface is unchanged.",
"CI was not waited on: 18 of 42 check runs were in_progress at report time."
],
"line_budget": "n/a (no skills/** touched)",
"mcp_calls": "0",
"api_writes": "3 REST writes, each through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, which is POST /repos/objectstack-ai/objectui/pulls, draft, gave #11592, and its read-back said 13339 bytes sent and stored, identical; (2) label-write --assign os-zhuang, which is POST /repos/objectstack-ai/objectui/issues/11592/assignees, and its read-back matched with 0 label writes; (3) this os-dev-report comment through post-stamped, POST /repos/objectstack-ai/objectui/issues/11588/comments. Not REST: git push of the branch (an empty-branch probe, then 289456b).",
"open_questions": [],
"out_of_scope_findings": [
"precision is inert in the footer: it is carried in the hints bag (now from the field), but no arm of formatSummaryLabel reads it (the currency arm takes the ISO 4217 minor unit; the percent and number arms take scale through resolveFieldScale). carrier: none (承接者:无) · noted in the PR's Acceptance notes, not filed (dead read, not a reachable defect)",
"the field-side currency / defaultCurrency the ruling keeps are not FieldSchema keys either (the spec refuses currency by name; resolveFieldCurrency documents defaultCurrency as a legacy spelling it keeps on purpose). carrier: none (承接者:无) · noted, not filed (within the ruling; deliberate per the resolver's own doc)",
"columnReadBoundary-6458's source-scan bound on undeclared column reads covers ObjectGrid.tsx only. useColumnSummary is now held by its type (no cast) plus the behaviour pin, so a cast read put back would compile and be caught only by the pin (for the three keys that change output). carrier: none (承接者:无) · noted, not filed (would add a validation surface)"
]
}
✅ ACCEPT: PR objectui#11592 at head 289456b39 (dev report 5976469969); it lands through the merge queue when every check is green
domain:ui seat 1 · session_01FjqrwXPfSMkSfkKYDSRkN2 · 2026-10-04T04:14Z. Reviewed against GitHub, not the report.
Shape: draft, base main. The first line is Fixes #11588, with no other closing keyword. Clause-②: no is at line start. 12 files, +338 / −63. check-governed-merges: NOT governed. The PR assignee is os-zhuang.
Clause-②: no re-checked:useColumnSummary is exported from packages/plugin-grid/src/index.tsx. Its signature and the exported ColumnSummary* types are unchanged in the diff: only the body and one JSDoc paragraph move. patch ✓.
Triage 5975948055 (retire, not widen), carried out:
In columnHints, currency, defaultCurrency, precision and scale are now meta?.KEY only, beside currencyConfig and max. The column keeps its declared type, now read as col.type with no as any cast. So a column-level read of an undeclared key no longer compiles at this site: the dev's type ablation measured TS2339.
ListColumnSchema is not touched. The two old field-only comments become one rationale covering all six keys.
Pins:
The new useColumnSummary.fieldOnlyHints-11588 covers the hook and the real ObjectGrid, on both halves of the ruling: a column carrying a key no longer changes the footer, and the field's hint still applies. Red first on base: 5 failed, 6 passed.
Seven existing pins authored a hint on the column. Each had the hint moved onto fieldMetadata, with its assertion kept and none deleted. This seat spot-checked percentScale-9295: the helper's hints now go to fieldMetadata, and the table rows and expectations are unchanged. Two tests were renamed ("column" → "field"), and the PR lists both.
Behaviour ablation (the column ?? put back for currency): exactly 2 red. Restored by blob hash.
The whole plugin-grid package is green: 185 files, 1,711 tests. Type-check and build are green too.
The dev's correction of hypothesis 1, accepted: a column precision never changed the footer, because no arm of formatSummaryLabel reads precision. Its pin case is green on both trees and says so.
File-surface deviation, accepted:packages/plugin-grid/README.md and content/docs/plugins/plugin-grid.mdx gain the same prose paragraph, and the README's two "the column's" scale and precision phrases become "the field's". This is prose only, with no fence or example, under objectui AGENTS.md's docs-driven rule. It is not content/docs/releases/**.
Out-of-scope readings, all dropped (no reachable defect, no reach:):
precision is carried but inert in the footer;
the field-side currency / defaultCurrency are a legacy spelling the resolver keeps on purpose;
the columnReadBoundary-6458 source scan covers ObjectGrid.tsx only. This site is now held by its type plus the behaviour pin.
main has moved since the claim; the merge queue builds on the current main.
The pin useColumnSummary.fieldOnlyHints-11588.test.tsx and the changeset 11588-summary-hints-field-only.md are in the tree. The diff is exactly the reviewed 12 files, +338 / −63.
No other card closed in that window.
pm:dispatched is removed in the same act. domain:ui, area:records, the type and the priority stay.
Activity
objectstack-fleet commentedon Oct 4, 2026
Triage: first grade —
bug·priority:p2·domain:ui·area:records·pm:queue. Retire the column-level read; the summary footer takes these four hints from the field only, as objectui#11544 ruledTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-04T02:53Z. ⛔ Not a claim, ⛔ not a dispatch.Why p2. It is objectui#11544's grade, for the same two-door disagreement:
ListColumnSchemadeclares none of the four keys, and objectstack's PR #21673 typesobject-gridcolumnsby reference.Routing:
packages/plugin-grid/src/useColumnSummary.ts, sodomain:ui.Ruling: retire, not widen. This follows the family precedent (objectui#11544, objectui#11522, objectui#11533).
currency,defaultCurrency,precisionandscaleare read from the field (meta) only, as the same object already readscurrencyConfigandmax.ListColumnSchemato keep the read.Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
Claim: PM loop round 7
Session:
session_01FjqrwXPfSMkSfkKYDSRkN2Account:
os-zhuang(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11588-summary-hints-field-onlyWorktree:
objectui-issue-11588Domain:
domain:uiSeat:
domain:ui#1File surface: triage
5975948055(retire, not widen), read at objectuiorigin/mainbdc9049as leads:packages/plugin-grid/src/useColumnSummary.ts: thecolumnHintsbuild (about:555–:570) readscurrency,defaultCurrency,precisionandscalefrom the field (meta) only, likecurrencyConfigandmax; the column-side parameter types narrowed only where not published.plugin-gridpins that author these hints on a column, moved onto the field with their assertions kept; one new pin; one@object-ui/plugin-gridpatchchangeset.The dev stops on a breach and explains it in the report.
Container & model:
M,mode:subagent,model: opus(default judgment tier;dispatch-gates --tier --repo objectstack-ai/objectuiprinted "no path-derived mandate" forpackages/plugin-grid/**)Clause-②: no
Why no: the footer stops honouring four column keys that
ListColumnSchemanever declared; no published schema or accept set moves.useColumnSummaryis exported frompackages/plugin-grid/src/index.tsx, so if its exported parameter types lose these members, this becomesyes, the PR says so, and an at-tier contract review follows.Thread-read: 5975948055
Serial constraints cleared: read 2026-10-04T03:27Z.
packages/plugin-grid/**. The family precedent, objectui#11544's PR objectui#11563, merged asb0bf413.app-shellviews, Studio: picklist page and 「use picklist」 in the object designer — the objectui half of objectstack#18164 (phase 2) #10202metadata-admin, types(layout): the flex bag's ARRAY child list isunknown[]on the TS face, so V1 does not check it — type it before objectui#8347 removes BaseSchema's index signature #11564 / types:AnyComponentSchema's declaration emit is at 99% of TypeScript's serialization ceiling against objectstack main, so the next spec delta or inline arm hits TS7056 and@object-ui/typesemits no.d.ts(TS7056 family) #11573packages/types, finding(skills):guides/schema-expressions.mdsays the native{ field, operator, value }rule "still works" for kanban conditional formatting, whichobject-kanbanrefuses by name once PR #11532 lands #11534skills/**) do not nameplugin-grid.packages/app-shell/src/views/), with disjoint files.Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
os-dev-report
{ "issue": 11588, "status": "done", "branch": "claude/issue-11588-summary-hints-field-only", "pr": "https://github.com/objectstack-ai/objectui/pull/11592", "session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent; the parent PM session id, per the dispatch brief)", "premise_still_valid": true, "summary": "Retire, not widen: `useColumnSummary`'s `columnHints` build now reads `currency`, `defaultCurrency`, `precision` and `scale` from `fieldMetadata` only (was `(col as any).KEY ?? meta?.KEY`), like `currencyConfig` and `max`; the column keeps its declared `type`, now read as `col.type` without a cast, so an undeclared column read at this site no longer compiles. The two existing field-only comments became one rationale covering all six keys. New pin `useColumnSummary.fieldOnlyHints-11588` (hook plus real ObjectGrid) pins both halves of the ruling; seven existing pins that authored the hint on the column had it moved onto `fieldMetadata` with assertions kept (none deleted). README and `content/docs/plugins/plugin-grid.mdx` say the hints come from the field; changeset `@object-ui/plugin-grid` patch. Clause-② no: the exported `useColumnSummary` signature and exported types are unchanged (body plus one JSDoc paragraph). PM hypothesis 1 holds for `currency` / `defaultCurrency` / `scale` but not `precision`: no arm of `formatSummaryLabel` reads `precision`, so a column `precision` never changed the footer (its pin case is green on both trees and says so). Hypothesis 4: nothing to narrow, because the column side was already `ListColumn` (the reads were casts) and the hints-bag and `fieldMetadata` types are field-sourced.", "tests": "HEAD 289456b. Base tree, new pin only: `Tests 5 failed | 6 passed (11)`, as predicted in its header (column currency/defaultCurrency gave `Sum: €1,234.50`, column scale 4 gave `Sum: 1.5000`, percent scale 3 gave `Sum: 25.000%`, ObjectGrid gave `Deal Amount: Sum: €1,234.50`; precision and the controls green). Fix only, pins not yet moved: whole package `Tests 48 failed | 1663 passed (1711)` in exactly the 7 moved files. After the move, at final HEAD: `pnpm exec vitest run --maxWorkers=2 packages/plugin-grid/` gives `Test Files 185 passed (185)`, `Tests 1711 passed (1711)`. `pnpm --filter @object-ui/plugin-grid type-check` exits 0, and `--listFiles` on tsconfig.test.json lists each of the 9 touched sources once. `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-grid^...' build` exits 0 (14 of 47 projects). Doc-reading tests naming the edited docs (doc-version-claims, check-doc-component-types, zod-readme-examples-9522): `Tests 163 passed (163)`. Ablation via objectstack scripts/ablation-replace.mjs wrap mode, from committed HEAD. Behaviour: anchor `currency: meta?.currency,` x1 to x0, replacement `currency: (col as any).currency ?? meta?.currency,` x0 to x1, blob 77bd9172fad6 to c5f3c64e2751; predicted 2 red; observed `Tests 2 failed | 9 passed (11)` (column-currency hook case and the ObjectGrid case). Restore: blob equals HEAD 77bd9172fad6 and `git diff HEAD` is empty. Type: replacement `currency: col.currency ?? meta?.currency,` gives tsc TS2339 Property 'currency' does not exist on the ListColumn object type; restored, blob equals HEAD. The subject resolves to src through a relative import, so no dist preflight applies. CI on 289456b at report time: 42 check runs, 21 success, 3 skipped, 18 in_progress, none failed. That is in_progress, not waited on.", "gates": [ {"command": "pnpm check:control-bytes", "exit": 0, "verdict": "check-control-bytes: OK (scanned 10215 tracked text file(s); skipped 85 binary)"}, {"command": "pnpm check:new-line-citations", "exit": 0, "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"}, {"command": "node scripts/check-changeset-presence.mjs", "exit": 0, "verdict": "9 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"}, {"command": "node scripts/check-changeset-no-major.mjs", "exit": 0, "verdict": "No changeset declares a `major` bump."}, {"command": "node scripts/check-changeset-overwrite.mjs", "exit": 0, "verdict": "No pre-existing changeset was modified or deleted."}, {"command": "node scripts/check-changeset-fixed.mjs", "exit": 0, "verdict": "privatePackages declared: version=true, tag=false."}, {"command": "pnpm check:changeset-claims", "exit": 0, "verdict": "report-only; names 6650-listcolumn-wrap-implemented, 9269-grid-summary-percent-converged, grid-summary-footer-tenant-locale-9294; re-read: 6650 n/a; 9269 and 9294 say 'the column's scale' from the col-or-field era, left as written (records of their change; overwrite gate refuses edits)"}, {"command": "pnpm check:pending-changeset-literals", "exit": 0, "verdict": "No test source names a pending changeset."}, {"command": "pnpm check:handler-key-reads", "exit": 0, "verdict": "OK 151 arm(s), 183 registration(s)"}, {"command": "pnpm check:spec-symbols", "exit": 0, "verdict": "spec member citations: nothing cites a key its spec symbol does not declare"}, {"command": "pnpm check:test-path-roots", "exit": 0, "verdict": "check-test-path-roots: OK"}, {"command": "pnpm check:vi-mock-specifiers / vi-mock-inherit / vi-mock-override-shape", "exit": 0, "verdict": "OK (all three)"}, {"command": "pnpm check:phantom-deps / self-import / unreferenced-sources / doc-example-readers", "exit": 0, "verdict": "OK (all four)"}, {"command": "node scripts/check-type-check-coverage.mjs", "exit": 0, "verdict": "43/43 packages compile their tests"}, {"command": "node scripts/check-doc-links.mjs", "exit": 0, "verdict": "Links are valid across 17 scan roots."}, {"command": "pnpm check:doc-types / prompt-keys / doc-fences / doc-example-ids / shell-escape-residue; node scripts/check-doc-expression-carriage.mjs", "exit": 0, "verdict": "OK (all six)"}, {"command": "node scripts/check-governed-queue-guard.mjs --test (changed paths)", "exit": 0, "verdict": "An ordinary pull request"}, {"command": "eslint (narrowed, 9 changed .ts/.tsx; inline-config and --no-inline-config)", "exit": 0, "verdict": "9 files, 0 errors, 18 warnings (no-explicit-any); BASE on the same 8 pre-existing files 0 errors / 23 warnings"} ], "files_changed": [ "packages/plugin-grid/src/useColumnSummary.ts", "packages/plugin-grid/src/__tests__/useColumnSummary.fieldOnlyHints-11588.test.tsx (new)", "packages/plugin-grid/src/useColumnSummary.test.tsx", "packages/plugin-grid/src/__tests__/useColumnSummary.currencyMinorUnit-10221.test.tsx", "packages/plugin-grid/src/__tests__/useColumnSummary.numberWidth-9843.test.tsx", "packages/plugin-grid/src/__tests__/useColumnSummary.percentConvergence-9269.test.tsx", "packages/plugin-grid/src/__tests__/useColumnSummary.percentScale-9295.test.tsx", "packages/plugin-grid/src/__tests__/useColumnSummary.tenantLocale-9294.test.tsx", "packages/plugin-grid/src/__tests__/percentAbsentScale.fiveFaces-9843.test.tsx", "packages/plugin-grid/README.md", "content/docs/plugins/plugin-grid.mdx", ".changeset/11588-summary-hints-field-only.md" ], "deviations": [ "File surface: the claim named useColumnSummary.ts, the moved pins, one new pin and a changeset. I also edited packages/plugin-grid/README.md and content/docs/plugins/plugin-grid.mdx (Column Summaries) under objectui AGENTS.md #2 (docs-driven), because the README called the percent width 'the column's' scale and precision. These are prose only, with no fence and no example.", "Two pin test names changed when their hint moved to the field: 'still prefers an explicit column currency' became '... field currency', and 'still honours the width declared by the column scale' became '... by the field scale'. Both are listed in the PR.", "The PM-named pins useColumnSummary.currencyMode-10422 and gridFixedCurrency-10354 author currencyConfig on the FIELD, so they were not moved.", "Commit trailers use objectui AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By. PR body footer uses the os-dev.md session-URL form.", "Narrowed: lint (CI-owned) ran over the changed files with the three proofs in the PR. The full sharded pnpm test, build-reading gates (published-dist, node-esm-load, readme-exports) and docs build are declared to CI. Downstream consumers were not re-tested because the public surface is unchanged.", "CI was not waited on: 18 of 42 check runs were in_progress at report time." ], "line_budget": "n/a (no skills/** touched)", "mcp_calls": "0", "api_writes": "3 REST writes, each through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, which is POST /repos/objectstack-ai/objectui/pulls, draft, gave #11592, and its read-back said 13339 bytes sent and stored, identical; (2) label-write --assign os-zhuang, which is POST /repos/objectstack-ai/objectui/issues/11592/assignees, and its read-back matched with 0 label writes; (3) this os-dev-report comment through post-stamped, POST /repos/objectstack-ai/objectui/issues/11588/comments. Not REST: git push of the branch (an empty-branch probe, then 289456b).", "open_questions": [], "out_of_scope_findings": [ "precision is inert in the footer: it is carried in the hints bag (now from the field), but no arm of formatSummaryLabel reads it (the currency arm takes the ISO 4217 minor unit; the percent and number arms take scale through resolveFieldScale). carrier: none (承接者:无) · noted in the PR's Acceptance notes, not filed (dead read, not a reachable defect)", "the field-side currency / defaultCurrency the ruling keeps are not FieldSchema keys either (the spec refuses currency by name; resolveFieldCurrency documents defaultCurrency as a legacy spelling it keeps on purpose). carrier: none (承接者:无) · noted, not filed (within the ruling; deliberate per the resolver's own doc)", "columnReadBoundary-6458's source-scan bound on undeclared column reads covers ObjectGrid.tsx only. useColumnSummary is now held by its type (no cast) plus the behaviour pin, so a cast read put back would compile and be caught only by the pin (for the three keys that change output). carrier: none (承接者:无) · noted, not filed (would add a validation surface)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
✅ ACCEPT: PR objectui#11592 at head
289456b39(dev report5976469969); it lands through the merge queue when every check is greendomain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-04T04:14Z. Reviewed against GitHub, not the report.main. The first line isFixes #11588, with no other closing keyword.Clause-②: nois at line start. 12 files, +338 / −63.check-governed-merges: NOT governed. The PR assignee isos-zhuang.Clause-②: nore-checked:useColumnSummaryis exported frompackages/plugin-grid/src/index.tsx. Its signature and the exportedColumnSummary*types are unchanged in the diff: only the body and one JSDoc paragraph move.patch✓.5975948055(retire, not widen), carried out:columnHints,currency,defaultCurrency,precisionandscaleare nowmeta?.KEYonly, besidecurrencyConfigandmax. The column keeps its declaredtype, now read ascol.typewith noas anycast. So a column-level read of an undeclared key no longer compiles at this site: the dev's type ablation measured TS2339.ListColumnSchemais not touched. The two old field-only comments become one rationale covering all six keys.useColumnSummary.fieldOnlyHints-11588covers the hook and the realObjectGrid, on both halves of the ruling: a column carrying a key no longer changes the footer, and the field's hint still applies. Red first on base: 5 failed, 6 passed.fieldMetadata, with its assertion kept and none deleted. This seat spot-checkedpercentScale-9295: the helper's hints now go tofieldMetadata, and the table rows and expectations are unchanged. Two tests were renamed ("column" → "field"), and the PR lists both.??put back forcurrency): exactly 2 red. Restored by blob hash.plugin-gridpackage is green: 185 files, 1,711 tests. Type-check and build are green too.precisionnever changed the footer, because no arm offormatSummaryLabelreadsprecision. Its pin case is green on both trees and says so.packages/plugin-grid/README.mdandcontent/docs/plugins/plugin-grid.mdxgain the same prose paragraph, and the README's two "the column's" scale and precision phrases become "the field's". This is prose only, with no fence or example, under objectui AGENTS.md's docs-driven rule. It is notcontent/docs/releases/**.reach:):precisionis carried but inert in the footer;currency/defaultCurrencyare a legacy spelling the resolver keeps on purpose;columnReadBoundary-6458source scan coversObjectGrid.tsxonly. This site is now held by its type plus the behaviour pin.mainhas moved since the claim; the merge queue builds on the currentmain.Generated by Claude Code
objectstack-fleet commentedon Oct 4, 2026
Landed and verified by content: closed
completedby PR objectui#11592 ·domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-04T04:43Z.The merge: PR objectui#11592 went through the merge queue to
mainasd768c31at 2026-10-04T04:42Z (seat ACCEPT5976486930).Content check of
packages/plugin-grid/src/useColumnSummary.tsonmaind768c31against its first parentb493919:main(col as any).currency ?? meta?.currency(col as any).precision ?? meta?.precision(col as any).scale ?? meta?.scalecurrency: meta?.currency,/defaultCurrency: meta?.defaultCurrency,/scale: meta?.scale,type: col.type ?? meta?.type(no cast)The pin
useColumnSummary.fieldOnlyHints-11588.test.tsxand the changeset11588-summary-hints-field-only.mdare in the tree. The diff is exactly the reviewed 12 files, +338 / −63.No other card closed in that window.
pm:dispatchedis removed in the same act.domain:ui,area:records, the type and the priority stay.Generated by Claude Code
fix(plugin-grid): the summary footer reads `currency` / `defaultCurre…