Skip to content

finding(types): the Spec Main Shape Gate is red in the merge queue: objectstack#20357 retired the list view's tabs key, and p1-spec-alignment.test.ts still authors tabs #10987

Description

@objectstack-fleet

Filing-gate category: ① a required gate red on every merge-queue run, with a named landing site. Reader: triage first (grade and route). Filed by domain:ui seat 2, session_014mXUNuFomfj24w7s1pZzhN, after the merge queue ejected PR #10983 (objectui#10963) for CI_FAILURE at 13:39Z. ⛔ Not graded here.

What fails

  • The Spec Main Shape Gate compiles packages/types against @objectstack/spec built from objectstack main. On the queue commit 2bfe567c50 for PR objectui#10983, against objectstack 6e3e5462c6, pnpm run type-check exits 2:
    • packages/types/src/__tests__/p1-spec-alignment.test.ts line 154: TS2322 … is not assignable to type 'undefined';
    • the same file, line 164: TS2339: Property 'isDefault' does not exist on type 'never'.
  • The test is "should accept tabs configuration". It authors tabs: [{ name: 'all', label: 'All Records', isDefault: true }, …] on a ListViewSchema.

Why

  • feat(spec)!: retire the list view's own tabs key; named presets are listViews entries objectstack#20357 (6e3e5462c6, merged 12:49Z, feat(spec)!) retires ListViewSchema.tabs, and the same key on ObjectListViewSchema, as a retiredKey() tombstone: "authoring it is a tsc error (input type never)". The prescription is to move each tab to a named listViews entry. The D2 conversion view-list-tabs-removed strips it from stored views.
  • objectui declares tabs by reference to the spec type (tabs?: ListViewSchema['tabs']). Its own docblock records that no objectui renderer reads it: "the only tabs read in packages/plugin-list is UserFilters' config.tabs". So on spec main the fixture no longer compiles.
  • The gate is in the merge queue's required set. So every queued PR is ejected until this is fixed, whatever it changes. PR objectui#10962 is in the queue now.

Direction (for triage to grade)

  • Follow the spec's retirement in objectui, so packages/types compiles against both the pinned 17.4.0 (which still accepts tabs) and spec main.
  • At minimum, retire the "should accept tabs configuration" fixture. The protocol now refuses what it authors.
  • Whether objectui also tombstones its own tabs re-declaration now, or at the pin bump, is for the dispatch to measure against the census pins. The objectui#7779 / docs(api): schema-reference.md's object-view example authors listViews.NAME.default: true, a key NamedListView never declared and ObjectView never reads #7923 "objectui declares every LIVE protocol key" rows care which one.
  • Grep for other tabs authoring on a list view: tests, docs, examples.
  • Precedent for this class: objectui#10916 / PR objectui#10934 (objectstack#20369 typed JoinedReportBlockSchema).

Dedupe

A search of objectui issues ("Spec Main Shape Gate", tabs, p1-spec-alignment, objectstack 20357) found only the closed precedents objectui#10916, #10287 and #10229.

domain:ui seat 2 · finding · 2026-09-28

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 15 (maintainer-directed exception to serial dispatch) — domain:ui execution seat 2
    Session: session_014mXUNuFomfj24w7s1pZzhN
    Branch: claude/issue-10987-spec-main-tabs-retired
    Worktree: objectui-issue-10987
    Domain: domain:ui
    Seat: domain:ui#2
    Provenance: the maintainer, in this seat's session chat on 2026-09-28 at 13:4xZ, chose "Take it now" for this card, beside the serial card objectui#10951, because the red required gate ejects every seat's queued PR. The card is not yet triaged. Triage's grade is welcome and binds the priority; this claim only takes the execution.
    File surface:

    • packages/types/src/__tests__/p1-spec-alignment.test.ts: the "should accept tabs configuration" fixture authors a key the protocol now refuses (feat(spec)!: retire the list view's own tabs key; named presets are listViews entries objectstack#20357), so it is retired or re-pointed.
    • packages/types declarations that re-declare tabs by reference to the spec (tabs?: ListViewSchema['tabs']) follow the retirement the same way objectui handled pageName, the sibling tombstone already in the census's declared-inert bucket. The dispatch measures that against the objectui#7779 / docs(api): schema-reference.md's object-view example authors listViews.NAME.default: true, a key NamedListView never declared and ObjectView never reads #7923 census pins.
    • Any other tabs authoring on a list view in tests, docs or examples, found with git grep.
    • A changeset only if a gate asks for one.
      Container & model: S, mode:subagent, model: opus (default judgment tier)
      Clause-②: no
      Why no: the protocol retired the key upstream. objectui follows it with no renderer behaviour change (no objectui renderer reads this tabs), and the dispatch re-rules this line if a published objectui type narrows before the pin bump.
      Thread-read: none
      Serial constraints cleared:
    • The serial card objectui#10951 touches packages/components only. This card touches packages/types, tests and docs.
    • I read the open-PR file lists at 2026-09-28T13:4xZ, at objectui origin/main 42687baf20: none touches p1-spec-alignment.test.ts.
    • If another seat claims at the same time, the earliest live claim wins and this seat yields.
  2. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 28, 2026
  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 10987,
    "status": "done",
    "branch": "claude/issue-10987-spec-main-tabs-retired",
    "pr": "#10992",
    "session": "session_014mXUNuFomfj24w7s1pZzhN — the dispatching seat's id (mode:subagent, so the parent's), as stamped in the Claude-Session commit trailer",
    "premise_still_valid": true,
    "summary": "Draft PR #10992 (head fd91433, 2 commits) retires the p1-spec-alignment fixture "should accept tabs configuration", which authored the list view's own tabs that objectstack#20357 turned into a retiredKey() tombstone (input type never). A fixture for the protocol's prescription takes its place: each tab is a named listViews entry on an ObjectViewSchema, and defaultListView names the one isDefault picked. The PR also adds the empty-frontmatter changeset the presence gate asked for. packages/types type-check reproduces the gate's two diagnostics at base against spec built from objectstack 7fa3e3e07cc6 (exit 2), and exits 0 at head against both that build and the pinned 17.4.0. No published type moves: NamedListView.tabs?: ListViewSchema['tabs'] and the census pins compile on both specs and are left for the pin bump, which is how pageName is carried. The card assignee os-elon-musk was PM-set and left untouched; the PR assignee is set to os-elon-musk.",
    "tests": [
    "GATE REPRO (the gate's procedure: spec built from objectstack 7fa3e3e07cc6 in a detached worktree, npm pack --ignore-scripts, scripts/spec-main-shape-gate.mjs inject into a separate objectui worktree with marker .spec-main-shape-gate.json present and zod re-pointed to 4.6.1; each leg is pnpm run type-check in packages/types, three tsc programs including tsconfig.test.json, under os-verify-lock).",
    "spec main @ base 42687ba: "VERDICT command-exit 2", 2 errors: p1-spec-alignment.test.ts TS2322 "... is not assignable to type 'undefined'." and TS2339 "Property 'isDefault' does not exist on type 'never'." The gate report step exits 1 with both rows attributed "against objectstack-ai/objectstack@7fa3e3e".",
    "spec main @ head fd91433: "VERDICT command-exit 0", 0 errors. The gate report step exits 0: "objectui type-checks against @objectstack/spec at that commit."",
    "installed 17.4.0 @ head fd91433 (marker absent): "VERDICT command-exit 0", 0 errors.",
    "CENSUS (object-view-unmirrored-keys-7779, schema-reference-named-list-view-keys-7923, list-view-spec-parity, plus p1-spec-alignment; pnpm exec vitest run from the repo root). Installed @ head: "Test Files 4 passed (4)", "Tests 296 passed (296)". Spec main @ head: "Test Files 1 failed | 3 passed (4)", "Tests 3 failed | 293 passed (296)". Spec main @ base: the identical 3 failures.",
    "The 3 census failures are all in 7779's describe "... derived against the installed protocol": the tombstone list received adds pageName and tabs; the live-key count expected 45 and got 43; bucket ① expected [pageName, tabs] and got []. These are runtime pins, and the gate runs no tests. They are red on base too, so this diff does not change them. They are pin-bump items.",
    "pnpm exec vitest run packages/types/ (installed, @ fd91433): "Test Files 271 passed (271)", "Tests 5984 passed (5984)".",
    "LINT, narrowed and proved: eslint --no-inline-config --format json on the one edited .ts file reports 1 file, 0 errors, 0 warnings. Population: the root eslint.config.js (packages/types has no own config), whose **/*.{ts,tsx} and test-file blocks cover the file. Invariance: no parserOptions.project or projectService, so no type-aware linting, so no untouched file's verdict moves.",
    "NO NEW PIN: the replacement fixture is a type-level accept fixture, not a pin. The red-then-green evidence is the gate reproduction above. No ablation was needed."
    ],
    "gates": [
    "check-changeset-presence @ fd91433: exit 0, "1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/10987-retire-list-view-tabs-fixture.md." (It was exit 1 before the changeset was added.)",
    "check:pending-changeset-literals @ fd91433: exit 0, "No test source names a pending changeset."",
    "check:new-line-citations @ fd91433: exit 0, "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"",
    "check:control-bytes @ fd91433: exit 0, "check-control-bytes: OK (scanned 9273 tracked text file(s); skipped 85 binary)."",
    "check-changeset-no-major: exit 0. check-changeset-overwrite: exit 0, "No pre-existing changeset was modified or deleted."",
    "git merge-tree --write-tree against a fresh origin/main 42687ba (still the branch base): exit 0, tree e5e70ce20c.",
    "CI on #10992: NOT MEASURED — not read at report time and not waited on, per the role file; the gate verdict on this head belongs to the PM read."
    ],
    "files_changed": [
    "packages/types/src/tests/p1-spec-alignment.test.ts (the fixture is retired and a listViews prescription fixture replaces it; ObjectViewSchema type import added)",
    ".changeset/10987-retire-list-view-tabs-fixture.md (empty frontmatter)"
    ],
    "deviations": [
    "Narrowed: locally, only @object-ui/types was compiled against spec main. The gate runs turbo type-check --continue over every package, and that full farm is the gate's own run on this head.",
    "objectstack main moved from 7fa3e3e07cc6 to 8cdbe0c6e5 after the spec build. The one commit in that range touches nothing under packages/spec (the git log for that range, limited to packages/spec, is empty), so the build was not redone.",
    "The first spec-main and installed type-check legs and the census legs were taken at dc70c7a. The only difference from head is one .changeset file. All of them were re-run at the final head fd91433, and the figures quoted here are from those runs.",
    "Instruction conflict: the harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. The order and the role file govern here: the commits carry the model-free pair, and the PR body ends with the session-URL footer.",
    "Cleanup: the branch worktree and the two measurement worktrees (objectui-issue-10987-specmain, objectstack-specmain-10987) were removed after their node_modules were deleted. The branch worktree was removed only after its HEAD was confirmed equal to the remote branch and its status was clean."
    ],
    "pr_body_replacement": null,
    "mcp_calls": "0",
    "api_writes": "3 REST writes through the fleet-write relay, each carried by one POST /repos/objectstack-ai/objectstack/dispatches. (1) pr_create: POST /repos/objectstack-ai/objectui/pulls, draft, relay run 36433668031. The stored body was read back byte-identical to what was sent (9335 chars, no differing byte). (2) label-write --assign: POST /repos//issues/10992/assignees os-elon-musk, relay run 36433782769; the read-back MATCHES, and the labeler's package: types and tests are untouched. (3) This os-dev-report comment: POST /repos//issues/10987/comments via post-stamped.mjs. Plus 3 git pushes: the empty-branch probe, the fix, and the changeset.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: the @objectstack/spec pin-bump PR (no card named) · NamedListView.tabs?: ListViewSchema['tabs'] in packages/types objectql.ts resolves to undefined on spec main, and its docblock plus the objectui#8980 measurement text go false at the bump · noted in the PR's Acceptance notes, not filed",
    "carrier: the same pin-bump PR · the object-view-unmirrored-keys-7779 census (BUCKET_DECLARED_INERT, NAMED_LIST_VIEW_UNREAD, PROTOCOL_RETIRED_KEYS, the live-key count) fails 3 rows on spec main, identically at base, for pageName and tabs together · noted, not filed",
    "carrier: none (承接者:无) · plugin-list TabBar, the only component that could draw the list view's own tabs, has zero production mounts per objectstack#20357's measurement; not re-measured here · Acceptance notes only"
    ]
    }

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#10992 (Fixes) at fd91433c16; ready and auto-merge follow this ACCEPT

    domain:ui seat #2, session_014mXUNuFomfj24w7s1pZzhN. This was taken on the maintainer's direct instruction as an exception to serial dispatch (claim 5871115946), because the red required gate ejected every queued PR. I checked this against the diff and CI, not against the report's own account.

    Implemented-by:  claude/issue-10987-spec-main-tabs-retired
    Reviewed-by:     session_014mXUNuFomfj24w7s1pZzhN
    
    item reading
    the change p1-spec-alignment's "should accept tabs configuration" fixture is retired, because objectstack-ai/objectstack#20357 made the list view's own tabs input type never. A fixture for the protocol's prescription replaces it: named listViews entries plus defaultListView. Test-only, with an empty changeset
    proof the gate's own procedure, run by the dev: packages/types type-check exits 2 at base against spec main (the two diagnostics), and 0 at head against both spec main and the pinned 17.4.0. CI's Spec Main Shape Gate is green on this head
    review in-seat record PASS (posted with this landing)
    carried NamedListView.tabs and the 7779 census rows for pageName / tabs move at the spec pin bump
    CI head fd91433c16: every check final and green before ready
    closing keywords Fixes #10987
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions