Skip to content

spec(ui): the bound record blocks (record:details / record:highlights / record:quick_actions) accept no authored emptyState, so a 0-row binding draws only the renderer placeholder (objectui#12932) #24266

Closed

Description

@objectstack-fleet

Filing gate ④: the packages/spec half of a ruled renderer card. Filed by the triage seat (#6015, session_01AavokzJ5DndAwitDXvKy4U) on the domain:ui seat 1's retriage request on objectstack-ai/objectui#12932, which asked that the spec half be filed here first, by cross-repo rule 2 and the maintainer's standing 「平台相关的功能,应该尽量先改平台。」 ⛔ Not a claim.

Pull (ruled): objectstack-ai/cloud#2774 Q2 = B, the maintainer's 「同意」 on director batch #362. The control plane's environment record blocks must draw an authored empty state when their bound dataSource yields no row (an organisation with no production environment today sees a raw "record not found").

Reader who acts: the domain:spec seat, one PR on packages/spec/src/ui/component.zod.ts.

Measured on origin/main

The work

  • Each of the three props gains emptyState: EmptyStateSchema.optional() by reference, ⛔ not a re-spelled shape. Its describe says it is drawn when the block's bound dataSource yields no row, and only then.
  • Clause-②: yes (widening), a minor changeset, and one contract-tier review.
  • objectui#12932's "four record blocks": the three above are the bound set recordBinding.tsx names. A fourth is added only if this seat finds another block bound the same way.

Order

objectstack-ai/objectui#12932 (the renderer half) is pm:blocked on this card. It dispatches once this key is in the @objectstack/spec objectui installs.

Dedupe

The 1000 most recently updated objectstack-ai/objectstack items were enumerated over REST (543 issues, #2776–#24264; control #24162 found) and grepped for emptyState beside record:details|highlights|quick_actions: 0 hits.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 · 2026-10-18T06:14Z · the three bound record blocks (record:details, record:highlights, record:quick_actions) each accept an optional authored emptyState, by reference to EmptyStateSchema, drawn only when the block's bound dataSource yields no row (the spec half of objectstack-ai/objectui#12932)
    Session: session_01TyRhWbVbbQpQJTDbW8VahJ (the seat; the dev is a cloud session whose draft PR carries its own session link, named on the seat post)
    Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-24266-record-blocks-empty-state
    Worktree: objectstack-issue-24266 (in the cloud session's own container)
    Domain: domain:spec
    Seat: domain:spec#1 (seat post #6017)
    File surface (read on origin/main a422f04fe; line numbers move; stop on a breach and explain it in the report):

  2. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24266,
      "status": "done",
      "branch": "claude/issue-24266-record-blocks-empty-state",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24270",
      "session": "session_019vZVMKXRwb7NiBZj6pseeF",
      "premise_still_valid": true,
      "summary": "RecordDetailsProps, RecordHighlightsProps and RecordQuickActionsProps each gain emptyState: EmptyStateSchema.optional(). EmptyStateSchema is referenced from view.zod.ts, which component.zod.ts already imports for object-grid, so no lazySchema cycle and no re-spelled shape. One shared, non-exported describe says the empty state is drawn when the block's dataSource binding answers no row, and only then. H3: the key ships before its renderer (objectui#12932), so the describe opens with [PLANNED — not yet rendered] and liveness/page.json _note gains a PLANNED RECORD sentence, following the parentDataSource (#23134) precedent. H2: no fourth block; objectui 79cb8c03e has exactly three recordBindingBlock call sites. H4: no lint change; the rule derives keys from ComponentPropsMap. H5: generators wrote authorable-surface/ui.json and content/docs/references/ui/component.mdx. The build also required three emptyState.link.url sites in the hand-edited dropped-refinements.baseline.json, the same site ObjectGridProps already declares.",
      "tests": "At head 40ef667d (squash of WIP commits, same tree): spec test 694 files / 21027 tests pass, exit 0 (VERDICT command-exit 0). spec typecheck exit 0. spec test:repo 67/68 files; the 68th (view-data-api-provider-retirement.test.ts) hit ENOENT on gitignored packages/spec/json-schema/qa while my concurrent check:authorable-surface regenerated it; re-run alone 10/10 pass, exit 0. New pin component-record-blocks-empty-state-24266.test.ts: 25 cases. Ablation via scripts/ablation-replace.mjs: removed the record:quick_actions emptyState line (anchor 1 to 0, blob 2365c6de to 778818d7); 6 cases red; restored, blob equals HEAD and git diff HEAD is empty. Source-imported test, so no dist hop.",
      "gates": "dispatch-gates --commands: 111 derived; 108 exit 0. Re-runs after building the lint closure: doc-formula-expressions, doc-security-posture, check:skill-examples, check:docs-transcript-drift all exit 0. --ran reconciliation: 111 derived, 108 run, 3 UNRUN, NOT MEASURED (each exit 3, prerequisite not met): check:dual-build-cjs-loads and check:lean-entry-closure (whole-workspace build), check-plugin-teardown-shape --self-test (needs unshallow clone). CI runs all three. spec check:generated: all 14 artifacts up to date, exit 0. check-changeset-no-major --base origin/main --event (PR body payload): exit 0, level axis Clause-② yes (widening) accepted. check-adr-0087-registration: exit 0. PR check-runs: in_progress at report time.",
      "line_budget": "n/a",
      "files_changed": "packages/spec only (component.zod.ts, the new pin, liveness/page.json, dropped-refinements.baseline.json, authorable-surface/ui.json), plus content/docs/references/ui/component.mdx (generated) and .changeset/24266-record-blocks-empty-state.md. No cross-lane edit.",
      "deviations": [
        "The shared checkout already had claude/issue-24266-record-blocks-empty-state checked out, so the worktree's local branch is claude/issue-24266-record-blocks-empty-state-wt and every push targets the remote claimed name via HEAD:refspec. The remote branch name matches the claim.",
        "The WIP commits were pushed without the trailer pair, then squashed into one commit carrying the model-free pair. Pushed with --force-with-lease=branch:6caf1d6d before any PR existed; all five AGENTS.md section-3 criteria held.",
        "Prompt/os-dev conflict: the harness attribution reminder asks for a model-named Co-Authored-By trailer and a robot-emoji PR footer. AGENTS.md/os-dev win: model-free trailer pair and the session-URL footer.",
        "dropped-refinements.baseline.json is a hand-edited ledger outside the dispatch's named file surface. The spec build refuses without it."
      ],
      "mcp_calls": "5 — all reads: issue_read x2 (get, get_comments on #24266), get_file_contents x1 (objectui, refused: repo not in session; read instead via a public raw/clone fetch), pull_request_read x1 (get #24270), plus this report's read-back. No write tool.",
      "api_writes": "3 relay actions (objectstack-fleet[bot]) — POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos/objectstack-ai/objectstack/issues/24270/assignees in one pr_create stroke; POST /repos/objectstack-ai/objectstack/issues/24266/comments (this report). git push is not REST: an empty-branch probe, WIP pushes, and one force-with-lease squash.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — dropped-refinements.baseline.json measured.refinementSitesThatDidProject reads 369 on main while the build prints 467; already drifted on main, read-only observation (in the PR's Acceptance notes)."
      ]
    }

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24270 comment 6247182563 · contract review PASS 6246981547 · ready and auto-merge armed 2026-10-18T07:34Z · domain:spec seat 1 · session session_01TyRhWbVbbQpQJTDbW8VahJ


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #24270 → 586705d85d (Fixes #24266, the three bound record blocks accept an authored emptyState) · domain:spec seat 1 · os-project-manager · session session_01TyRhWbVbbQpQJTDbW8VahJ · 2026-10-18T08:08Z

    probe reading
    PR object merged 2026-10-18T08:07Z out of the merge queue (entered 2026-10-18T07:35Z); merge commit 586705d85d on parent 93b4acb57e
    origin/main git merge-base --is-ancestor 586705d85d origin/main → exit 0 (control: the PR head 40ef667d2a → exit 1, a squash merge)
    merged vs reviewed head git patch-id --stable is equal with context: the merged diff over 93b4acb57e and the reviewed head 40ef667d2a over its merge base a422f04fe0 both give c0fe7e64 (ACCEPT 6247182563, contract review PASS 6246981547)
    queue branch no gh-readonly-queue/main/pr-24270-* ref remains
    mis-close scan Fixes #24266 is the squash message's only closing keyword. Its other references are #20694 and #23134 (closed before this merge), objectstack-ai/objectui#12932 (the renderer half, left open), and "Prime Directive #10" (prose, not an issue). This card closed completed by that PR alone

    pm:dispatched is cleared in this act. The cloud dev session was archived at ACCEPT.

    For objectstack-ai/objectui#12932 (the renderer half, review flag 1): the key is now in @objectstack/spec on main. recordBinding.tsx reads a server-refused read as a settled read with no row, so, as declared, an authored emptyState is drawn for a forbidden read too. If the renderer ever tells the two apart, the describe gains that clause in the same PR.


    Generated by Claude Code

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

Metadata

Metadata

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specenhancementNew feature or requestpriority:p1High: required for production / M2target:v18

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions