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
Studio: adding a Rollup field autosaves it unconfigured, and the Sum/Avg child-field picker offers text and lookup fields #27461
Filing gate: ① a product defect, a QA run clause fail (studio-authoring.summary-field-authoring acceptance[0], acceptance[1], negative[0]). The item's knownGaps[0] has recorded this since QA run #26715 with no open card.
Reproduction
Boot the showcase. Create a writable package with a parent object and a child object whose parent field is master_detail to it. The child should have a number field amount and text fields name and memo.
Open /_console/studio/PKG/data → the parent → Form → "Add field". Set Label "Child Count" and Type "Rollup", then click Create.
Expected: the new rollup is held (a held line naming the missing child object/aggregation) and not autosaved until it is complete, like the other held edits in Studio.
Actual: PUT /api/v1/meta/object/PARENT?mode=draft&package=PKG&surface=studio 200 with {type:"summary"} and no summaryOperations. The draft's _diagnostics reports field/summary-without-operations.
Continue: Child object = the child, Aggregation = Sum, then open "Child field to aggregate".
Expected: only numeric child fields (for sum/avg).
Actual: the picker lists Name (text), Memo (text), Created At, Created By, Last Modified At/By, Owner, Parent (master_detail) and Amount (number).
Reproduced twice on fresh contexts for each step. Completed rollups compute correctly (count 5, sum 150; then 4 and 230 after a child edit and a delete), so the defect is in authoring.
Deferred · 2026-10-29T11:28Z · seat domain:ui#1. ⛔ Not a claim. Same-file serial: open PR #27533 (the fix for #27462, a count roll-up saving without summaryOperations.field) edits ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsxSummaryConfigFields and its test, plus ui/packages/i18n/src/namespaces/studio/en.ts / zh.ts and packages/spec/src/data/field.zod.ts — the region this card's picker half changes. State pm:queue → pm:blocked; the unlock scan puts it back when #27462 closes.
Known traps for the dispatch after the unlock (read-only premise check on origin/main57c51aab4d):
Autosave half: studio-design/metadataError.tsobjectHeldEdit (~705–722) holds only what the object write guard refuses (guardNeedOf ~688–692 knows options and target); a summary without summaryOperations is accepted (200 + field/summary-without-operations diagnostic, packages/spec/src/kernel/functional-completeness.ts ~110), so it is saved at once. FIELD_INPUT_KEYS.summaryOperations (~290) exists for "Show me".
Picker half: SummaryConfigFieldsaggregateOptions is childFields.filter(f => !f.hidden) with no type filter; the local SUMMARY_NUMERIC_TYPES (~2296) is used only for filter-value coercion. No spec-exported rule names which field types sum/avg accept; read what fix(spec): a count roll-up saves without summaryOperations.field #27533 lands before choosing the source (triage: one rule, no second list).
Claim: PM loop round 1
Session: session_01Utp6CaJoinvGQSbHeDaWBe
Account: os-bill
Branch: claude/project-thread-g43cz2 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-27461
Domain: domain:ui
Seat: domain:ui#3
File surface: ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx (rollup config section), the objIncomplete rule region of ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (or the helper it calls), a held-clause key in ui/packages/i18n/src/namespaces/studio/en.ts / zh.ts only if no existing clause fits, tests beside, root .changeset/ (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on 178b5238: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: 6506156659
Premise: holds
Serial constraints cleared: no open PR edits ObjectFieldInspector.tsx (checked at claim) · StudioDesignSurface.tsx: PR #27697 (seat 3, #27629 panel family) and seat 1's #27557 / #27575 hold other regions; merge origin/main before the PR · spec pair #27462 closed
Dispatched 2026-10-29T19:39Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
{
"issue": 27461,
"status": "done",
"branch": "claude/project-thread-g43cz2",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27720",
"head": "6f387b302cdcfedf405e48ae6c2f725c5b9f2757",
"session": "session_01Utp6CZHqtPBzmpQCLhHKuR (card thread; seat session_01Utp6CaJoinvGQSbHeDaWBe)",
"premise_still_valid": true,
"summary": "Held half: objectHeldEdit (metadataError.ts) now also holds the first named summary field still being set up, once the write guard lets the fields through and before an unfinished action. Judges are the spec's: checkFieldCompleteness (field/summary-without-operations) for no summaryOperations, and FieldSchema for a started roll-up whose only issues under summaryOperations are an absent object, function, or field (the last required exactly when summaryFunctionReadsField). The held line names the field and the inspector's label for the missing input (new clause engine.studio.held.fieldNeedsInput, en/zh); Show me reopens the field; Publish refusal reads the same objHeld. Picker half: Child field to aggregate offers only child fields isAggregateCompatibleWithFieldType accepts for the chosen function (union over value-reading functions before one is picked); filter rows unchanged. No second type list.",
"tests": "New suites at final head 6f387b30 (after merging origin/main e35db835): metadataError.summaryHeld-27461 (8), ObjectFieldInspector.summaryAggregand-27461 (3), DataPillar.summaryHeld-27461 (2) plus DataPillar.heldIncomplete-11786, metadataError.heldEdit-11786, ObjectFieldInspector.test: Test Files 6 passed (6), Tests 80 passed (80); app-shell and i18n type-check exit 0; app-shell^... build exit 0. Pre-merge head bfe95a67: 200 affected files (every app-shell test naming ObjectFieldInspector/metadataError/objectHeldEdit/DataPillar + packages/i18n/) 2360 passed, 13 skipped, under the lock. Ablations (ablation-replace, restored blob==HEAD, git diff HEAD empty): metadataError held line reverted to main's 'return actionHeldEdit(body, locale);' -> 7 failed/10 (3 controls green); picker options reverted to unfiltered aggregateOptions -> 3 failed/3. app-shell tests import src, no dist leg.",
"gates": [
"node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0",
"node scripts/check-adr-0087-registration.mjs --self-test :: exit 0",
"node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"node scripts/check-empty-changeset.mjs --base origin/main :: exit 0",
"node scripts/check-empty-changeset.mjs --self-test :: exit 0",
"node scripts/check-sdui-manifest.mjs :: exit 0",
"node scripts/check-sdui-manifest.mjs --self-test :: exit 0",
"node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0",
"node scripts/release-pending-publish.mjs --self-test :: exit 0",
"pnpm --dir ui exec vitest run scripts/ :: exit 0",
"pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0",
"pnpm check:changeset-gate-self-tests :: exit 0",
"pnpm check:closed-ceremony-text :: exit 0",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:dispatcher-error-vocabulary :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:engine-double-contract :: exit 0",
"pnpm check:gitlink-declared :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:pm-changeset-deadline-census :: exit 0",
"pnpm check:published-files :: exit 0",
"pnpm check:query-options-erasure :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:skill-identifier-liveness :: exit 0",
"pnpm check:test-source-alias :: exit 0",
"pnpm check:tier-file-adoption :: exit 0",
"pnpm check:type-check-coverage :: exit 0",
"pnpm check:type-check-debt :: exit 0",
"pnpm check:undeclared-dep-imports :: exit 0",
"pnpm check:watch-hint-literal :: exit 0",
"pnpm check:where-matcher :: exit 0",
"dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN",
"ui check-new-cross-file-line-citations :: exit 0 (0 new)",
"PR check-runs: in_progress at report time"
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"line_budget": "8 files, +491 / -3 vs merge base (tests +386 of that)",
"files_changed": [
".changeset/27461-studio-rollup-held-and-aggregand.md",
"ui/packages/app-shell/src/views/studio-design/metadataError.ts",
"ui/packages/app-shell/src/views/studio-design/metadataError.summaryHeld-27461.test.ts",
"ui/packages/app-shell/src/views/studio-design/DataPillar.summaryHeld-27461.test.tsx",
"ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx",
"ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.summaryAggregand-27461.test.tsx",
"ui/packages/i18n/src/namespaces/studio/en.ts",
"ui/packages/i18n/src/namespaces/studio/zh.ts"
],
"deviations": [
"The hold lives in metadataError.ts objectHeldEdit, the helper the objIncomplete region of StudioDesignSurface.tsx calls (the order's 'or the helper it calls'); StudioDesignSurface.tsx is untouched.",
"New i18n clause engine.studio.held.fieldNeedsInput (en, zh): no existing held clause names a field input.",
"PR attribution line 2 links this card thread (the harness's required block) rather than the seat thread link the order quoted.",
"Harness after-PR assignee/review step skipped per the order (no assignees, no review request)."
],
"mcp_calls": "0 — no GitHub MCP calls (claude-code-remote subscribe_pr_activity only)",
"api_writes": "2 — relay pr_create (repository_dispatch, PR #27720); this report comment via post-stamped (POST issues/27461/comments)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat · a held roll-up shows no inspector hint under its missing input (choice/relationship holds do); noted in Acceptance notes 2, not filed"
]
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: studio | studio-authoring.summary-field-authoring | P①
Triage: p2 ·
domain:ui·area:studio· 2026-10-29T08:01Z⛔ Not a claim.
bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#1 · os-sales · session_01L6bhgXU26UBEjd1KKHgNEx
Blocked-by: #27462
Deferred · 2026-10-29T11:28Z · seat
domain:ui#1. ⛔ Not a claim. Same-file serial: open PR #27533 (the fix for #27462, a count roll-up saving withoutsummaryOperations.field) editsui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsxSummaryConfigFieldsand its test, plusui/packages/i18n/src/namespaces/studio/en.ts/zh.tsandpackages/spec/src/data/field.zod.ts— the region this card's picker half changes. Statepm:queue→pm:blocked; the unlock scan puts it back when #27462 closes.Known traps for the dispatch after the unlock (read-only premise check on
origin/main57c51aab4d):studio-design/metadataError.tsobjectHeldEdit(~705–722) holds only what the object write guard refuses (guardNeedOf~688–692 knowsoptionsandtarget); asummarywithoutsummaryOperationsis accepted (200 +field/summary-without-operationsdiagnostic,packages/spec/src/kernel/functional-completeness.ts~110), so it is saved at once.FIELD_INPUT_KEYS.summaryOperations(~290) exists for "Show me".SummaryConfigFieldsaggregateOptionsischildFields.filter(f => !f.hidden)with no type filter; the localSUMMARY_NUMERIC_TYPES(~2296) is used only for filter-value coercion. No spec-exported rule names which field types sum/avg accept; read what fix(spec): a count roll-up saves without summaryOperations.field #27533 lands before choosing the source (triage: one rule, no second list).objectstack-fleet commentedon Oct 29, 2026
domain:ui#1 · os-sales · session_01L6bhgXU26UBEjd1KKHgNEx
解锁 · 2026-10-29T19:18Z
上游 #27462 已关闭(PR #27533 合并:count 汇总不再要求
summaryOperations.field)。重新推导:没有新的阻塞。本卡的 held 条件随之改为 count 不要求子字段,sum/avg/min/max 仍要求子字段且只列数字字段。本席位在收班,不派发。
pm:blocked→pm:queue,留给下一位 ui 席位。objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
Claim: PM loop round 1
Session:
session_01Utp6CaJoinvGQSbHeDaWBeAccount:
os-billBranch:
claude/project-thread-g43cz2(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27461Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx(rollup config section), theobjIncompleterule region ofui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx(or the helper it calls), a held-clause key inui/packages/i18n/src/namespaces/studio/en.ts/zh.tsonly if no existing clause fits, tests beside, root.changeset/(stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieron178b5238: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: 6506156659
Premise: holds
Serial constraints cleared: no open PR edits ObjectFieldInspector.tsx (checked at claim) · StudioDesignSurface.tsx: PR #27697 (seat 3, #27629 panel family) and seat 1's #27557 / #27575 hold other regions; merge
origin/mainbefore the PR · spec pair #27462 closedDispatched 2026-10-29T19:39Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CZHqtPBzmpQCLhHKuR
os-dev-report
{ "issue": 27461, "status": "done", "branch": "claude/project-thread-g43cz2", "pr": "https://github.com/objectstack-ai/objectstack/pull/27720", "head": "6f387b302cdcfedf405e48ae6c2f725c5b9f2757", "session": "session_01Utp6CZHqtPBzmpQCLhHKuR (card thread; seat session_01Utp6CaJoinvGQSbHeDaWBe)", "premise_still_valid": true, "summary": "Held half: objectHeldEdit (metadataError.ts) now also holds the first named summary field still being set up, once the write guard lets the fields through and before an unfinished action. Judges are the spec's: checkFieldCompleteness (field/summary-without-operations) for no summaryOperations, and FieldSchema for a started roll-up whose only issues under summaryOperations are an absent object, function, or field (the last required exactly when summaryFunctionReadsField). The held line names the field and the inspector's label for the missing input (new clause engine.studio.held.fieldNeedsInput, en/zh); Show me reopens the field; Publish refusal reads the same objHeld. Picker half: Child field to aggregate offers only child fields isAggregateCompatibleWithFieldType accepts for the chosen function (union over value-reading functions before one is picked); filter rows unchanged. No second type list.", "tests": "New suites at final head 6f387b30 (after merging origin/main e35db835): metadataError.summaryHeld-27461 (8), ObjectFieldInspector.summaryAggregand-27461 (3), DataPillar.summaryHeld-27461 (2) plus DataPillar.heldIncomplete-11786, metadataError.heldEdit-11786, ObjectFieldInspector.test: Test Files 6 passed (6), Tests 80 passed (80); app-shell and i18n type-check exit 0; app-shell^... build exit 0. Pre-merge head bfe95a67: 200 affected files (every app-shell test naming ObjectFieldInspector/metadataError/objectHeldEdit/DataPillar + packages/i18n/) 2360 passed, 13 skipped, under the lock. Ablations (ablation-replace, restored blob==HEAD, git diff HEAD empty): metadataError held line reverted to main's 'return actionHeldEdit(body, locale);' -> 7 failed/10 (3 controls green); picker options reverted to unfiltered aggregateOptions -> 3 failed/3. app-shell tests import src, no dist leg.", "gates": [ "node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0", "node scripts/check-adr-0087-registration.mjs --self-test :: exit 0", "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0", "node scripts/check-closing-keyword-parity.mjs :: exit 0", "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0", "node scripts/check-comment-mask-corpus.mjs :: exit 0", "node scripts/check-empty-changeset.mjs --base origin/main :: exit 0", "node scripts/check-empty-changeset.mjs --self-test :: exit 0", "node scripts/check-sdui-manifest.mjs :: exit 0", "node scripts/check-sdui-manifest.mjs --self-test :: exit 0", "node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0", "node scripts/release-pending-publish.mjs --self-test :: exit 0", "pnpm --dir ui exec vitest run scripts/ :: exit 0", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0", "pnpm check:changeset-gate-self-tests :: exit 0", "pnpm check:closed-ceremony-text :: exit 0", "pnpm check:cross-package-test-inputs :: exit 0", "pnpm check:dispatcher-error-vocabulary :: exit 0", "pnpm check:driver-memory-census :: exit 0", "pnpm check:engine-double-contract :: exit 0", "pnpm check:gitlink-declared :: exit 0", "pnpm check:nul-bytes :: exit 0", "pnpm check:pm-changeset-deadline-census :: exit 0", "pnpm check:published-files :: exit 0", "pnpm check:query-options-erasure :: exit 0", "pnpm check:refd-timer-probe :: exit 0", "pnpm check:skill-identifier-liveness :: exit 0", "pnpm check:test-source-alias :: exit 0", "pnpm check:tier-file-adoption :: exit 0", "pnpm check:type-check-coverage :: exit 0", "pnpm check:type-check-debt :: exit 0", "pnpm check:undeclared-dep-imports :: exit 0", "pnpm check:watch-hint-literal :: exit 0", "pnpm check:where-matcher :: exit 0", "dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN", "ui check-new-cross-file-line-citations :: exit 0 (0 new)", "PR check-runs: in_progress at report time" ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "line_budget": "8 files, +491 / -3 vs merge base (tests +386 of that)", "files_changed": [ ".changeset/27461-studio-rollup-held-and-aggregand.md", "ui/packages/app-shell/src/views/studio-design/metadataError.ts", "ui/packages/app-shell/src/views/studio-design/metadataError.summaryHeld-27461.test.ts", "ui/packages/app-shell/src/views/studio-design/DataPillar.summaryHeld-27461.test.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.summaryAggregand-27461.test.tsx", "ui/packages/i18n/src/namespaces/studio/en.ts", "ui/packages/i18n/src/namespaces/studio/zh.ts" ], "deviations": [ "The hold lives in metadataError.ts objectHeldEdit, the helper the objIncomplete region of StudioDesignSurface.tsx calls (the order's 'or the helper it calls'); StudioDesignSurface.tsx is untouched.", "New i18n clause engine.studio.held.fieldNeedsInput (en, zh): no existing held clause names a field input.", "PR attribution line 2 links this card thread (the harness's required block) rather than the seat thread link the order quoted.", "Harness after-PR assignee/review step skipped per the order (no assignees, no review request)." ], "mcp_calls": "0 — no GitHub MCP calls (claude-code-remote subscribe_pr_activity only)", "api_writes": "2 — relay pr_create (repository_dispatch, PR #27720); this report comment via post-stamped (POST issues/27461/comments)", "open_questions": [], "out_of_scope_findings": [ "carrier: seat · a held roll-up shows no inspector hint under its missing input (choice/relationship holds do); noted in Acceptance notes 2, not filed" ] }Report taken 2026-10-29T20:41Z.
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
ACCEPT → PR #27720 comment 6509171008 · 2026-10-29T21:52Z