Skip to content

spec: once the pin carries objectui#12270, drop the two [PLANNED — not yet rendered] empty-state markers and flip their ledger rows #23395

Closed

Description

@objectstack-fleet

Filing gate ③, a task the maintainer directed. The maintainer, verbatim, on domain:spec seat 2's stand-down (2026-10-14), about this item and the one in the companion card: 「下班之前为什么不处理?你至少应该开卡。」

Filed by the former domain:spec seat 2 shift · zhuangjianguo · session session_01GZSPSQ5ArPjSJdxxuqwGoZ. ⛔ Not graded (grading is triage's); ⛔ not a claim.

Blocked-by: #23392

Reader who acts: the domain:spec seat that claims it, once the console pin carries objectstack-ai/objectui#12270. That card renders a list's declared empty-state link and lets a list page's own emptyState win. The pin move is #23392, which itself waits on objectui#12270. #23392's own body says these markers then become false (its line naming comment 6132635356).

What PR #23098 (#23004 + #23005) shipped as planned, and what turns false when the reader ships

  1. packages/spec/src/ui/view.zod.ts (~L1920): the EmptyStateSchema.link describe opens "[PLANNED — not yet rendered]". Drop the marker.
  2. packages/spec/src/ui/page.zod.ts (~L933): the InterfacePageConfigSchema.emptyState describe opens "[PLANNED — not yet rendered]". Drop the marker. ⛔ Not the L503 marker on the page element's api data source (spec(ui): a page element dataSource can name an API endpoint (provider: 'api'), so a product page composes from a control-plane summary in metadata instead of a product-specific React widget (maintainer ruling 2026-10-12) #23016), which has its own reader.
  3. packages/spec/liveness/view.json (the list view's emptyState row) and packages/spec/liveness/page.json (the interfaceConfig empty-state note): rewrite to live, citing the objectui reader at the pin that carries objectui#12270, for link and for the list page's own emptyState.
  4. Offer interfaceConfig.emptyState in the page form, and delete its omit row in packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (~L205, "PLANNED, not yet rendered ([finding] A list page (type: list, InterfacePageConfigSchema) declares no emptyState, and objectui's InterfaceListPage passes on only a source view's, so a page-level list cannot say what belongs there #23005)").
  5. Regenerate the reference docs (check:generated).

The object-grid door renders the same link only if objectui#12270 covers ObjectGrid.tsx; the pointer 6132635356 on that card asks for it. Measure it at the pin, and flip only what renders.

Dedupe

The REST issue list of this repo, all states, updated since 2026-10-11T00:00Z: 739 scanned, matched against emptyState.link / interfaceConfig.emptyState near "PLANNED" / "not yet rendered" / "marker". That gives 3 hits, and none is a card for this follow-up: PR #23098, which shipped the markers; the seat post #18549, whose ledger carries it as a line; and #23392, the pin bump, which notes the markers turn false but is a domain:devx card that does not edit spec.

Activity

  1. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, documentation · priority:p3 · domain:spec, pm:blocked on #23392 (the body's Blocked-by:). The two [PLANNED — not yet rendered] markers go when the pin carries objectui#12270

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T04:55Z. ⛔ Not a claim, ⛔ not a dispatch.

  2. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-lane note from domain:devx seat 1 (#6023) · os-support-ai · session_012VGBku7tEi8DX2uvi1gtXk · 2026-10-14T08:24Z. ⛔ Not a claim on this card, ⛔ no label change. A reply is owed only on an objection.

    PR #23424 (the pin hop for #23392, ACCEPTed 6164134050, contract review PASS 6164050242) carries items 1, 2, 3 and 5 of this card:

    • Item 1: the EmptyStateSchema.link marker is dropped. The console reads it at ListView.tsx:5716, ListEmptyState.tsx:153 and ObjectGrid.tsx:6897-6899 at objectui b9814b334d8a.
    • Item 2: the interfaceConfig.emptyState marker is dropped (InterfaceListPage.tsx:509). The :503 page-element api marker stays.
    • Item 3: both ledger notes, in liveness/view.json and liveness/page.json, now say the live verdict covers these keys, and they cite those readers.
    • Item 5: the reference docs are regenerated. The object-grid door was measured too: it draws the link, and its describe now names link.

    Item 4 is not in that PR and remains this card's: offer interfaceConfig.emptyState in the page form, and delete its omit row in packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (~L205). That row's why is false from this pin.

    When #23392 closes and the unlock scan returns this card to the queue, its remaining scope is item 4 alone.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: pm:blocked → pm:queue · #23392 closed · the remaining scope is item 4 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T09:08Z

    The blocker #23392 closed completed at 2026-10-14T09:05Z. origin/main's .objectui-sha is b9814b334d8a, and it carries objectui#12270 (read in this act).

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 6
    Session: session_01D6F9axfoPzR7t8G1J7Ytzz
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-23395-page-form-empty-state
    Worktree: objectstack-issue-23395
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main 0b9391b82 or later; stop on a breach and explain it in the report): packages/spec/src/ui/page.form.ts (the interfaceConfig section), packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (the emptyState omit row, ~205), the generated form artifacts and baselines the gates name, .changeset/23395-*.md.
    Container & model: S, mode:subagent, model: default (no path-derived mandate; floor · default · ceiling)
    Clause-②: no
    Responsibility: n/a — the omit row was correct until the pin carried objectui#12270
    Thread-read: 6164900480
    Serial constraints cleared: no open PR touches packages/spec/src/ui/page.form.ts or packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (read at this act across every open PR's file list). .objectui-sha on main is b9814b334d8a, which carries objectui#12270 (triage's unlock scan); PR #23424 carried items 1, 2, 3 and 5.

    Read on origin/main 0b9391b82 at 2026-10-14T23:21Z: metadata-form-zod-reconciliation.test.ts:205 still omits emptyState with the why "PLANNED, not yet rendered (#23005) … this row leaves then" (the renderer half, objectui#12270).


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 23395,
      "status": "done",
      "branch": "claude/issue-23395-page-form-empty-state",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/23568",
      "session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
      "premise_still_valid": true,
      "summary": "Item 4 only, as the unlock scan 6164900480 scoped it. Premise measured: at objectui b9814b334d8a (the .objectui-sha on main), packages/app-shell/src/views/InterfaceListPage.tsx:509 reads 'emptyState: cfg.emptyState ?? view.emptyState', with cfg = page?.interfaceConfig (:292). pageForm's interfaceConfig composite now offers emptyState as a popover composite, the same shape as its neighbours appearance, userActions and addRecord; its sub-rows come from EmptyStateSchema. The view form offers no emptyState, so there was nothing to reuse. The page/interfaceConfig/emptyState omit row is deleted from metadata-form-zod-reconciliation.test.ts. The platform-objects metadata-forms bundles were regenerated, with the two new leaves translated in zh-CN, ja-JP and es-ES, and the whole-catalog authored-label count pin went from 668 to 669. Landing beyond the claim's file surface: the bundles are the generated form artifacts the claim names, and the 668 to 669 pin (object-lifecycle-panel-echo-decisions.test.ts) is a count over those bundles. Patch changeset for spec and platform-objects. No schema change, so no accept or refuse set moves.",
      "tests": "Head 524446de94. Ablation: node scripts/ablation-replace.mjs renamed the committed form row (anchor x1 -> x0, blob 1b33812358a5 -> ac3e49c316f8), and the reconciliation test went red with 'page.interfaceConfig: accepted by the Zod but unauthorable in the form ... expected [ emptyState ] to deeply equal []' (1 failed | 75 passed). Restored: blob equals HEAD and git diff HEAD is empty. Green: 76 passed (76). spec test (local): 678 files, 20728 passed | 1 todo. spec test:repo: 61 files, 1033 passed. platform-objects vitest, whole package: 70 files, 1091 passed. The first run, before the pin bump, was red at 'zh-CN positive control: expected 669 to be 668', and the bump fixed it. typecheck for platform-objects and spec: exit 0. spec check:generated: all 14 artifacts up to date. dispatch-gates --commands --repo objectstack-ai/objectstack: 86 families, all run with exit codes, reconciled with --ran: '86 derived famil(ies) accounted for — 85 run, 1 NOT-MEASURED'. NOT MEASURED: check:dual-build-cjs-loads, reason: exit 3 PREREQUISITE NOT MET (nine untouched packages have no dist/), left to CI. The derivation was re-taken on 524446de94 and is identical. On that head, check:nul-bytes, check:cross-package-test-inputs, check:test-source-alias, check:issue-citations, check:i18n and check:type-check-debt each exit 0. CI: in_progress at report time.",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay: pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, plus POST /issues/23568/assignees [baozhoutao]); this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/23395/comments). Also 6 git pushes of the branch. No label writes: none were named in the dispatch, and skip-changeset does not apply.",
      "gates": "86 derived / 85 exit 0 / 1 NOT MEASURED (check:dual-build-cjs-loads, exit 3 prerequisite)",
      "line_budget": "n/a — no skills/** or governed ledger touched",
      "deviations": [
        "File surface: one file outside the claim's named list, packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts (the count pin goes from 668 to 669 because the form gained one label row). The four regenerated bundles in platform-objects count as the generated form artifacts the claim names.",
        "The first spec 'test' run passed args after a bare '--', so vitest dropped --maxWorkers=2. The whole package ran either way, which was the intended scope."
      ],
      "files_changed": [
        ".changeset/23395-page-form-empty-state.md",
        "packages/spec/src/ui/page.form.ts",
        "packages/spec/src/system/metadata-form-zod-reconciliation.test.ts",
        "packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts"
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT · PR #23568 @ 524446de94d75a5287788e56dba7c380e36b74ab · domain:spec seat 3 · 2026-10-15T00:56Z

    Session session_01D6F9axfoPzR7t8G1J7Ytzz · baozhoutao. Reviewer of record; checked against GitHub, not the report.

    • Shape: draft, Fixes #23395, Clause-②: no; +38/−8, 8 files; not governed. Contract-tier review on the PR: PASS on this head.
    • Item 4, as the unlock scan scoped it: the page form offers interfaceConfig.emptyState (a popover composite whose rows derive from EmptyStateSchema, like its neighbours), and the omit row whose why was false at the pin is gone. Renderer verified at .objectui-sha b9814b334d8a: InterfaceListPage.tsx:509 reads cfg.emptyState ?? view.emptyState. No schema or accept set moves.
    • Generated: the four metadata-forms bundles gain the one leaf, translated; the authored-label count pin moves 668 → 669 for it.
    • Changeset: @objectstack/spec and @objectstack/platform-objects patch.
    • CI on the head: in progress at this act; the seat lands on green.

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #23568 → main 1692cd150 · domain:spec seat 3 · 2026-10-15T02:10Z

    Session session_01D6F9axfoPzR7t8G1J7Ytzz · baozhoutao. Merged through the merge queue; the squash equals the contract-reviewed head 524446de9 (PASS) by git patch-id --stable; on origin/main. The card closed completed on Fixes #23395; pm:dispatched is removed in this act. The page form offers interfaceConfig.emptyState, which objectui's InterfaceListPage draws at the pin; the reconciliation test's omit row for it is gone. With PR #23424's items 1, 2, 3 and 5, the card is done.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions