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
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
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.
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.
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:
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/main42687baf20: none touches p1-spec-alignment.test.ts.
If another seat claims at the same time, the earliest live claim wins and this seat yields.
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"
]
}
✅ 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.
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
Activity
objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 15 (maintainer-directed exception to serial dispatch) —
domain:uiexecution seat 2Session:
session_014mXUNuFomfj24w7s1pZzhNBranch:
claude/issue-10987-spec-main-tabs-retiredWorktree:
objectui-issue-10987Domain:
domain:uiSeat:
domain:ui#2Provenance: 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 owntabskey; named presets arelistViewsentries objectstack#20357), so it is retired or re-pointed.packages/typesdeclarations that re-declaretabsby reference to the spec (tabs?: ListViewSchema['tabs']) follow the retirement the same way objectui handledpageName, the sibling tombstone already in the census's declared-inert bucket. The dispatch measures that against the objectui#7779 / docs(api):schema-reference.md'sobject-viewexample authorslistViews.NAME.default: true, a keyNamedListViewnever declared andObjectViewnever reads #7923 census pins.tabsauthoring on a list view in tests, docs or examples, found withgit grep.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:
packages/componentsonly. This card touchespackages/types, tests and docs.origin/main42687baf20: none touchesp1-spec-alignment.test.ts.objectstack-fleet commentedon Sep 28, 2026
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
tabsthat objectstack#20357 turned into a retiredKey() tombstone (input type never). A fixture for the protocol's prescription takes its place: each tab is a namedlistViewsentry on an ObjectViewSchema, anddefaultListViewnames the oneisDefaultpicked. 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 howpageNameis 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-checkin 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: typesandtestsare 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"
]
}
objectstack-fleet commentedon Sep 28, 2026
✅ ACCEPT: PR objectui#10992 (
Fixes) atfd91433c16; ready and auto-merge follow this ACCEPTdomain:uiseat #2,session_014mXUNuFomfj24w7s1pZzhN. This was taken on the maintainer's direct instruction as an exception to serial dispatch (claim5871115946), because the red required gate ejected every queued PR. I checked this against the diff and CI, not against the report's own account.p1-spec-alignment's "should accept tabs configuration" fixture is retired, because objectstack-ai/objectstack#20357 made the list view's owntabsinput typenever. A fixture for the protocol's prescription replaces it: namedlistViewsentries plusdefaultListView. Test-only, with an empty changesetpackages/typestype-check exits 2 at base against specmain(the two diagnostics), and 0 at head against both specmainand the pinned 17.4.0. CI'sSpec Main Shape Gateis green on this headNamedListView.tabsand the 7779 census rows forpageName/tabsmove at the spec pin bumpfd91433c16: every check final and green before readyFixes #10987test(types): retire the list-view tabs fixture objectstack#20357 made…