You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec(ui): record:details hideEmpty: false — in read-only mode an all-empty section renders its heading plus one "N empty fields · Show" fold row; say so in the describe() text (ruling C on objectui#13386, Metadata-protocol: semantic) #25511
Filing gate ③ a task the maintainer set: ruling batch #7 item 4, letter C, 「objectui 三个都同意」 2026-10-23T16:08:53Z, recorded on objectstack-ai/objectui#13386. Filed by the triage seat (session_01AavokzJ5DndAwitDXvKy4U), per that ruling's workload note. ⛔ Not a claim.
Grade: p1 (a metadata-protocol semantic change, handled directly in 18.x), domain:spec, area:records. Size: XS.
The change
packages/spec/src/ui/component.zod.ts (~L1440 on main05cc3ee), the record:details section key hideEmpty. Today its describe() says: "Set false to render empty rows, keeping the section's label skeleton on an all-empty record". The new text keeps the default as it is: the key is on, and an all-empty section renders nothing. For false it says that in read-only mode an all-empty section renders its heading and one fold row ("N empty fields · Show", the same fold mixed sections use). Edit mode renders every row, editable.
Regenerate the artefacts the describe text feeds (the repo's own generators). There is no key, shape or default change.
The changeset declares Metadata-protocol: semantic.
Order
objectstack-ai/objectui#13386 (the DetailSection.tsx renderer change) carries Blocked-by: this card. HotCRM's 14 hideEmpty: false sections need no change.
Done when
The describe() text says what false renders in read-only mode and in edit mode, and the generated artefacts are regenerated.
The changeset says Metadata-protocol: semantic.
Dedupe
The open objectstack-ai/objectstack issues matched on hideEmpty: none open. New.
Claim: PM loop round 1
Session: session_01PC4NPXPgPmpDRG9DdDnyXT
Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-25511-hide-empty-describe
Worktree: objectstack-issue-25511
Domain: domain:spec
Seat: domain:spec#2 (seat post #18549)
File surface: packages/spec/src/ui/component.zod.ts (the record:details section key hideEmpty: its describe() text and, if it restates the same rendering, the adjacent docblock), the artefacts the repo's own generators regenerate from it (packages/specui shards, content/docs/references/ui/*.mdx), and one changeset .changeset/25511-hide-empty-describe.md (stop on breach; explain in the report)
Container & model: S (describe text; the judgment is in the wording), mode:subagent, model: default (TIER_DEFAULT; dispatch-gates --tier for this surface: no path-derived mandate), effort: xhigh (p1)
Clause-②: no
Metadata-protocol: semantic
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: none — no open PR touches component.zod.ts (13 open PRs' file lists read 2026-10-24T08:14Z); none of the 13 open pm:dispatched cards in other lanes declares a packages/spec file; no other domain:spec card is in flight.
Premise: holds on origin/main8801f2bb37 — component.zod.ts:1440 still says "Set false to render empty rows, keeping the section's label skeleton on an all-empty record"; the ruling is C on objectstack-ai/objectui#13386 (open, pm:blocked on this card).
Release in progress: the maintainer's word in this session, 「正在发版本,你可以派发但是不要合并。」 This card is dispatched; nothing of it is readied, enqueued or merged until that is lifted.
{
"issue": 25511,
"status": "done",
"branch": "claude/issue-25511-hide-empty-describe",
"pr": "https://github.com/objectstack-ai/objectstack/pull/25612",
"session": "session_01PC4NPXPgPmpDRG9DdDnyXT",
"premise_still_valid": true,
"summary": "Rewrote the describe() text of the record:details section key hideEmpty (packages/spec/src/ui/component.zod.ts, the producer the card named; no other producer of the text exists). It implements ruling C on objectstack-ai/objectui#13386. The default is unchanged: an all-empty section renders nothing at all. With false, read-only mode renders the heading plus one fold row that counts the empty fields and reveals them on request, the same fold a partly-filled section uses; edit mode renders every field as an editable row. I added one docblock paragraph above the key recording the re-ruled false rendering, regenerated content/docs/references/ui/component.mdx with gen:docs (the only artifact check:generated named stale), and added .changeset/25511-hide-empty-describe.md (@objectstack/spec minor, Clause-②: no, Metadata-protocol: semantic). No key, shape or default changed. Two wording calls, both explained in the PR body. (1) The fold label is not quoted: the card writes \"N empty fields · Show\", but objectui's label for the mixed-section fold the ruling names is \"Show {{count}} empty fields\" (detail.showEmptyFields, objectui en.ts at 7981384), so the text says what the row does instead of pinning a label the spec does not own. (2) The lead changed from \"Hide this section's empty fields\" to \"Whether this section disappears when ALL its fields are empty\": under C both values hide an all-empty section's empty rows in read-only mode, and the key never governed partly-filled sections (objectui#7129 Q2-C). files_changed: packages/spec/src/ui/component.zod.ts (+12/-1), content/docs/references/ui/component.mdx (+1/-1), .changeset/25511-hide-empty-describe.md (+17). All three are within the claim's declared file surface. deviations: (a) origin/main moved during the run (e649c2d91e, chore: version packages #25606), so I merged it before opening the PR via scripts/pm/os-regen-merge.sh (merge commit 0ed74f8840, no conflict; the branch delta against origin/main is exactly the three files), then reinstalled, rebuilt, and re-ran the tests and all gates on that head. (b) git fetch --unshallow origin main on the shared clone, which the check-plugin-teardown-shape self-test prescribed (additive to the shared .git). (c) A stray 6-byte file /build2.pid (it holds a PID) was left at the filesystem root: a shell variable was scoped into a backgrounded subshell, so the pid redirect wrote to /. Its removal was refused by the built-in safety check, so it is left for a human to delete. (d) Declared narrowing: targeted builds only (spec, plus the lint, objectql, client, client-react and formula closures). Because of that, pnpm check:dual-build-cjs-loads and the local-only check:dev-prereqs scan are NOT MEASURED (both need all 70 workspace packages built; 33 untouched packages have no dist). (e) The harness attribution reminder asked for a model-named Co-Authored-By trailer and an emoji PR footer. Per AGENTS.md I used the model-free trailer pair and the session-URL PR footer instead. (f) test:repo was not run locally (CI Test Core owns it; the diff does not touch that project). The card assignee (sunhaolin) was never written; the PR assignee is sunhaolin via pr_create. The PR is draft: never readied, armed or queued (release in progress). CI was in_progress when this report was written.",
"tests": "All on final head 0ed74f8840 (re-run after the merge; the pre-merge head 0e6e092f gave the same numbers). pnpm --filter @objectstack/spec build (under os-verify-lock): VERDICT command-exit 0; no tracked file changed (authorable-surface.base.json untouched); the shipped json-schema/ui/RecordDetailsProps.json carries the new text (grep count 1). pnpm --filter @objectstack/spec check:generated, before regeneration: exit 1, 'x 1 of 14 artifact(s) stale: content/docs/references/**'. After gen:docs (exit 0, '1 file changed, 1 insertion(+), 1 deletion(-)'): 'All 14 generated artifacts are up to date' (declaration stamp match 6c2ad8208e06). pnpm --filter @objectstack/spec test: 'Test Files 714 passed (714)', 'Tests 21687 passed | 1 todo (21688)'. pnpm --filter @objectstack/spec typecheck (tsc --noEmit, check:scripts-typecheck, check:test-typecheck: 'OK ... 52 file(s) / 242 error(s) / 132 pinned signature(s) held'): lock VERDICT command-exit 0 (one lock call ran test then typecheck, joined by &&). No ablation or reverse verification: the diff changes describe text and generated docs only, no test pins that text, and no behaviour changed in this repo (the renderer change is objectui's).",
"gates": "Derived on head 0ed74f8840 with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (merge base e649c2d91, 3 paths, 107 commands; the list is identical to the pre-merge derivation at 0e6e092f). Each was run sequentially, its exit code captured to a TSV before any pipe: 106 exited 0. 1 exited 3: pnpm check:dual-build-cjs-loads, 'PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/', NOT MEASURED (declared narrowing; CI Lint & Repo Gates runs it). An earlier sweep at 0e6e092f had six more exit-3 prerequisite refusals: check-plugin-teardown-shape --self-test (shallow clone), lint check:doc-formula-expressions, check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift, check:lean-entry-closure. All exit 0 at the final head after the unshallow and the closure builds. --ran reconciliation (exit-annotated record): 'dispatch-gates --ran: 107 derived famil(ies) accounted for — 106 run, 1 NOT-MEASURED (0 DERIVED from a recorded exit 3, 1 claimed).' Verdict lines: check:generated 'All 14 generated artifacts are up to date'; check:docs '227 generated files in sync with packages/spec'; check:api-surface 'public API surface + factory signatures unchanged'; check:authorable-surface exit 0; check:doc-authoring clean (9559 describe strings read); check:nul-bytes 'OK (scanned 11862 text file(s) ... no raw ASCII control bytes)'; check-adr-0087-registration 'this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)'; check-empty-changeset 'No empty-frontmatter changeset introduced by this diff'. Local-only check:dev-prereqs: self-test passes; the scan exits 1, 'The workspace is not built — 1 unmet precondition' (33 of 70 packages without dist), NOT MEASURED. The spec dist is current per its build stamp. check:skill-frame-freshness not run (no four-axis framework file touched). check-platform-checklist not run (no export renamed or removed). CI check-runs on 0ed74f8840 at report time: 25 runs. 'No other open PR may claim the same issue' success; '18.x upgrade harness (opt-in)' and 'Packed-tarball smoke (opt-in)' skipped; all others in_progress, including Check Changeset, Governed Surface Queue Guard, Lint (ESLint, PM dispatch-gates, docs & code guards, repo & tooling gates, CI release & engine gates), Type Check (workspace, source gates, consumer gates, debt ledger), Spec property liveness and The card this PR closes must claim this branch. Not awaited, per the role contract.",
"dogfood_battery": "n/a — no `!` in the PR title and Clause-②: no carries no (narrowing) arm",
"line_budget": "n/a — no skills/** or ratcheted ledger touched",
"mcp_calls": "0 — no MCP GitHub tool called, read or write",
"api_writes": "2 relay strokes, both through scripts/pm as objectstack-fleet[bot]: (1) fleet-write/dispatch.mjs pr_create = POST /repos/objectstack-ai/objectstack/dispatches, which the relay executed as POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/25612/assignees (read-back: 7257 bytes sent, 7257 stored, identical; assignees sunhaolin); (2) post-stamped.mjs --comment=25511 for this os-dev-report comment = POST /repos/objectstack-ai/objectstack/issues/25511/comments. No labels written (none named by the dispatch; skip-changeset does not apply because the diff publishes). git push is not counted.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed · the renderer lags the new text until objectstack-ai/objectui#13386 lands: a false all-empty section still renders empty rows in read-only mode. The ruling orders it this way (spec text first, renderer second)",
"carrier: none · noted, not filed · the default in edit mode: objectui renders every row of an all-empty section in edit mode for the default too (hideAllEmptySection requires !isEditing, DetailSection.tsx at objectui 7981384). The describe's default sentence keeps the card's 'renders nothing at all' with no mode qualifier. Benign; no author writes wrong metadata because of it",
"carrier: none · noted, not filed · packages/spec/src/ui/component.test.ts about line 636: a test comment still calls false 'the only spelling that keeps a section's label skeleton on an all-empty record'. Outside the claim's file surface; no assertion reads it"
]
}
ACCEPT → PR #25612 comment 6382491996 · domain:spec seat 2 · 2026-10-24T09:22Z · head 0ed74f8840. Landing waits for every check green on the head; the seat then readies it and arms auto-merge.
MERGED through the queue at 2026-10-24T10:42:01Z; merge commit 2af790ffaa; ACCEPT 6382491996, contract review PASS 6382891476 on head 0ed74f8840
queue branch gh-readonly-queue/main/pr-25612-*
gone (git ls-remote: 0 refs)
origin/main
carries 2af790ffaa (ancestor of 481ac62116); component.zod.ts holds the new hideEmpty describe (1 hit on "Whether this section disappears when ALL its fields are empty")
State: the card closed completed on the merge; pm:dispatched is removed in this stroke. objectstack-ai/objectui#13386 (the renderer half, pm:blocked on this card) is released by triage's unlock scan.
Activity
objectstack-fleet commentedon Oct 24, 2026
Claim: PM loop round 1
Session:
session_01PC4NPXPgPmpDRG9DdDnyXTAccount:
sunhaolin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-25511-hide-empty-describeWorktree:
objectstack-issue-25511Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface:
packages/spec/src/ui/component.zod.ts(therecord:detailssection keyhideEmpty: itsdescribe()text and, if it restates the same rendering, the adjacent docblock), the artefacts the repo's own generators regenerate from it (packages/specuishards,content/docs/references/ui/*.mdx), and one changeset.changeset/25511-hide-empty-describe.md(stop on breach; explain in the report)Container & model:
S (describe text; the judgment is in the wording),mode:subagent,model: default (TIER_DEFAULT; dispatch-gates --tier for this surface: no path-derived mandate),effort: xhigh(p1)Clause-②: no
Metadata-protocol: semantic
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: none — no open PR touches
component.zod.ts(13 open PRs' file lists read 2026-10-24T08:14Z); none of the 13 openpm:dispatchedcards in other lanes declares apackages/specfile; no otherdomain:speccard is in flight.Premise: holds on
origin/main8801f2bb37—component.zod.ts:1440still says "Setfalseto render empty rows, keeping the section's label skeleton on an all-empty record"; the ruling is C on objectstack-ai/objectui#13386 (open,pm:blockedon this card).Release in progress: the maintainer's word in this session, 「正在发版本,你可以派发但是不要合并。」 This card is dispatched; nothing of it is readied, enqueued or merged until that is lifted.
Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
os-dev-report
{ "issue": 25511, "status": "done", "branch": "claude/issue-25511-hide-empty-describe", "pr": "https://github.com/objectstack-ai/objectstack/pull/25612", "session": "session_01PC4NPXPgPmpDRG9DdDnyXT", "premise_still_valid": true, "summary": "Rewrote the describe() text of the record:details section key hideEmpty (packages/spec/src/ui/component.zod.ts, the producer the card named; no other producer of the text exists). It implements ruling C on objectstack-ai/objectui#13386. The default is unchanged: an all-empty section renders nothing at all. With false, read-only mode renders the heading plus one fold row that counts the empty fields and reveals them on request, the same fold a partly-filled section uses; edit mode renders every field as an editable row. I added one docblock paragraph above the key recording the re-ruled false rendering, regenerated content/docs/references/ui/component.mdx with gen:docs (the only artifact check:generated named stale), and added .changeset/25511-hide-empty-describe.md (@objectstack/spec minor, Clause-②: no, Metadata-protocol: semantic). No key, shape or default changed. Two wording calls, both explained in the PR body. (1) The fold label is not quoted: the card writes \"N empty fields · Show\", but objectui's label for the mixed-section fold the ruling names is \"Show {{count}} empty fields\" (detail.showEmptyFields, objectui en.ts at 7981384), so the text says what the row does instead of pinning a label the spec does not own. (2) The lead changed from \"Hide this section's empty fields\" to \"Whether this section disappears when ALL its fields are empty\": under C both values hide an all-empty section's empty rows in read-only mode, and the key never governed partly-filled sections (objectui#7129 Q2-C). files_changed: packages/spec/src/ui/component.zod.ts (+12/-1), content/docs/references/ui/component.mdx (+1/-1), .changeset/25511-hide-empty-describe.md (+17). All three are within the claim's declared file surface. deviations: (a) origin/main moved during the run (e649c2d91e, chore: version packages #25606), so I merged it before opening the PR via scripts/pm/os-regen-merge.sh (merge commit 0ed74f8840, no conflict; the branch delta against origin/main is exactly the three files), then reinstalled, rebuilt, and re-ran the tests and all gates on that head. (b) git fetch --unshallow origin main on the shared clone, which the check-plugin-teardown-shape self-test prescribed (additive to the shared .git). (c) A stray 6-byte file /build2.pid (it holds a PID) was left at the filesystem root: a shell variable was scoped into a backgrounded subshell, so the pid redirect wrote to /. Its removal was refused by the built-in safety check, so it is left for a human to delete. (d) Declared narrowing: targeted builds only (spec, plus the lint, objectql, client, client-react and formula closures). Because of that, pnpm check:dual-build-cjs-loads and the local-only check:dev-prereqs scan are NOT MEASURED (both need all 70 workspace packages built; 33 untouched packages have no dist). (e) The harness attribution reminder asked for a model-named Co-Authored-By trailer and an emoji PR footer. Per AGENTS.md I used the model-free trailer pair and the session-URL PR footer instead. (f) test:repo was not run locally (CI Test Core owns it; the diff does not touch that project). The card assignee (sunhaolin) was never written; the PR assignee is sunhaolin via pr_create. The PR is draft: never readied, armed or queued (release in progress). CI was in_progress when this report was written.", "tests": "All on final head 0ed74f8840 (re-run after the merge; the pre-merge head 0e6e092f gave the same numbers). pnpm --filter @objectstack/spec build (under os-verify-lock): VERDICT command-exit 0; no tracked file changed (authorable-surface.base.json untouched); the shipped json-schema/ui/RecordDetailsProps.json carries the new text (grep count 1). pnpm --filter @objectstack/spec check:generated, before regeneration: exit 1, 'x 1 of 14 artifact(s) stale: content/docs/references/**'. After gen:docs (exit 0, '1 file changed, 1 insertion(+), 1 deletion(-)'): 'All 14 generated artifacts are up to date' (declaration stamp match 6c2ad8208e06). pnpm --filter @objectstack/spec test: 'Test Files 714 passed (714)', 'Tests 21687 passed | 1 todo (21688)'. pnpm --filter @objectstack/spec typecheck (tsc --noEmit, check:scripts-typecheck, check:test-typecheck: 'OK ... 52 file(s) / 242 error(s) / 132 pinned signature(s) held'): lock VERDICT command-exit 0 (one lock call ran test then typecheck, joined by &&). No ablation or reverse verification: the diff changes describe text and generated docs only, no test pins that text, and no behaviour changed in this repo (the renderer change is objectui's).", "gates": "Derived on head 0ed74f8840 with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (merge base e649c2d91, 3 paths, 107 commands; the list is identical to the pre-merge derivation at 0e6e092f). Each was run sequentially, its exit code captured to a TSV before any pipe: 106 exited 0. 1 exited 3: pnpm check:dual-build-cjs-loads, 'PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/', NOT MEASURED (declared narrowing; CI Lint & Repo Gates runs it). An earlier sweep at 0e6e092f had six more exit-3 prerequisite refusals: check-plugin-teardown-shape --self-test (shallow clone), lint check:doc-formula-expressions, check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift, check:lean-entry-closure. All exit 0 at the final head after the unshallow and the closure builds. --ran reconciliation (exit-annotated record): 'dispatch-gates --ran: 107 derived famil(ies) accounted for — 106 run, 1 NOT-MEASURED (0 DERIVED from a recorded exit 3, 1 claimed).' Verdict lines: check:generated 'All 14 generated artifacts are up to date'; check:docs '227 generated files in sync with packages/spec'; check:api-surface 'public API surface + factory signatures unchanged'; check:authorable-surface exit 0; check:doc-authoring clean (9559 describe strings read); check:nul-bytes 'OK (scanned 11862 text file(s) ... no raw ASCII control bytes)'; check-adr-0087-registration 'this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)'; check-empty-changeset 'No empty-frontmatter changeset introduced by this diff'. Local-only check:dev-prereqs: self-test passes; the scan exits 1, 'The workspace is not built — 1 unmet precondition' (33 of 70 packages without dist), NOT MEASURED. The spec dist is current per its build stamp. check:skill-frame-freshness not run (no four-axis framework file touched). check-platform-checklist not run (no export renamed or removed). CI check-runs on 0ed74f8840 at report time: 25 runs. 'No other open PR may claim the same issue' success; '18.x upgrade harness (opt-in)' and 'Packed-tarball smoke (opt-in)' skipped; all others in_progress, including Check Changeset, Governed Surface Queue Guard, Lint (ESLint, PM dispatch-gates, docs & code guards, repo & tooling gates, CI release & engine gates), Type Check (workspace, source gates, consumer gates, debt ledger), Spec property liveness and The card this PR closes must claim this branch. Not awaited, per the role contract.", "dogfood_battery": "n/a — no `!` in the PR title and Clause-②: no carries no (narrowing) arm", "line_budget": "n/a — no skills/** or ratcheted ledger touched", "mcp_calls": "0 — no MCP GitHub tool called, read or write", "api_writes": "2 relay strokes, both through scripts/pm as objectstack-fleet[bot]: (1) fleet-write/dispatch.mjs pr_create = POST /repos/objectstack-ai/objectstack/dispatches, which the relay executed as POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/25612/assignees (read-back: 7257 bytes sent, 7257 stored, identical; assignees sunhaolin); (2) post-stamped.mjs --comment=25511 for this os-dev-report comment = POST /repos/objectstack-ai/objectstack/issues/25511/comments. No labels written (none named by the dispatch; skip-changeset does not apply because the diff publishes). git push is not counted.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed · the renderer lags the new text until objectstack-ai/objectui#13386 lands: a false all-empty section still renders empty rows in read-only mode. The ruling orders it this way (spec text first, renderer second)", "carrier: none · noted, not filed · the default in edit mode: objectui renders every row of an all-empty section in edit mode for the default too (hideAllEmptySection requires !isEditing, DetailSection.tsx at objectui 7981384). The describe's default sentence keeps the card's 'renders nothing at all' with no mode qualifier. Benign; no author writes wrong metadata because of it", "carrier: none · noted, not filed · packages/spec/src/ui/component.test.ts about line 636: a test comment still calls false 'the only spelling that keeps a section's label skeleton on an all-empty record'. Outside the claim's file surface; no assertion reads it" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
ACCEPT → PR #25612 comment 6382491996 ·
domain:specseat 2 · 2026-10-24T09:22Z · head0ed74f8840. Landing waits for every check green on the head; the seat then readies it and arms auto-merge.Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
Landed ·
domain:specseat 2 (seat post #18549) ·sunhaolin· sessionsession_01PC4NPXPgPmpDRG9DdDnyXT· 2026-10-24T10:42Z2af790ffaa; ACCEPT6382491996, contract review PASS6382891476on head0ed74f8840gh-readonly-queue/main/pr-25612-*git ls-remote: 0 refs)origin/main2af790ffaa(ancestor of481ac62116);component.zod.tsholds the newhideEmptydescribe (1 hit on "Whether this section disappears when ALL its fields are empty")State: the card closed
completedon the merge;pm:dispatchedis removed in this stroke. objectstack-ai/objectui#13386 (the renderer half,pm:blockedon this card) is released by triage's unlock scan.Generated by Claude Code