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
console(home): fold the roster gate's by-name object reads into one ?names= request (#29236 ruling A follow-up) #29444
Source: ruling A on #29236 (6580261740), the workload's domain:ui follow-up. Blocked-by #29236 (the server PR) and #29441 (spec).
After #29121, Console Home reads each object the app roster requires by name, one request per name (8 on app-crm). Once GET /meta/:type?names=a,b,c ships, the roster gate makes one request for its requiresObject union. Remember that an unknown name is simply absent from the answer, so the gate must treat a missing item as it treats a 404 today.
Acceptance: Home outside an app makes one object metadata request for the roster gate, measured on app-crm.
Claim: PM loop round 2 · 2026-11-06T06:02Z
Session: session_01L9qibvowqEy7Lkj2dKGw2i (card thread, dev) · seat session_01L9qibw7DekEe3wx5f3zphf
Account: os-tesla
Branch: claude/project-thread-0xx2dj (a cloud card thread can push only its designated branch)
Worktree: objectstack-issue-29444
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/packages/app-shell/src/console/** (roster gate + Home), the data adapter only if a batch read is missing there, their tests, root .changeset/
Container & model: S/M, mode:thread, model: default tier, effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6677981869
Premise: holds (triage unlock 6677981869: #29236 and #29441 closed; ?names= served on main by PR #30709)
Serial constraints cleared: none (seat 3's #30206 / PR #30552 adds a Home checklist; if the diffs meet in Home, the later lander merges)
File surface: ui/packages/app-shell/src/hooks/useNavMemberGates.ts, ui/packages/app-shell/src/providers/MetadataProvider.tsx, their tests (hooks/__tests__, providers/__tests__), root .changeset/
Measured by the card thread on origin/mainb6182249: the roster gate is useNavMemberGates() (requiredObjectUnion + readObjectScope({ names, views: false }) outside an app), and the per-name reads are made in MetadataProvider.tsx (readObjectScope → fetchScopeName → readItem → adapter.getObjectSchema). appObjectScope.ts only supplies the names. No adapter change: client.meta.getItems('object', { names }) exists since PR #30709. Inside an app nothing changes. Clause-② stays no (package-local hand-off, no new export).
{
"issue": 29444,
"status": "done",
"branch": "claude/project-thread-0xx2dj",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30864",
"session": "session_01L9qibvowqEy7Lkj2dKGw2i",
"premise_still_valid": true,
"summary": "Outside an app (frame app with no name: Home), useNavMemberGates now reads the app list's requiresObject union with a package-local batch: true hand-off beside views: false. MetadataProvider.readObjectScope answers it from its own NAMES_BATCH_SCOPE entry (a symbol key) with ONE meta.getItems('object', { names }) per set of names not asked yet: a name in the answer is answered, a name left out is missing (as a by-name 404 was), a read with no answer fails every asked name (as a failed by-name read did), refresh re-asks in one request, and under the draft preview it falls back to the names-only scope. Inside an app nothing changes (by-name reads keep sharing the adapter cache, objectui#13044). Measured on app-crm: Home's roster gate went from 9 by-name requests to 1 ?names= request (200, 9 items).",
"tests": "homeObjectReads-29121.test.tsx 7/7 (gate one ?names= request with absent sys_cloud_only hidden; failed batch shows both entries and is not re-asked; refresh re-asks in one request); navGateUnionScope-12980.test.tsx 5-name union in one request, inside-app cases unchanged; with spec-symbol-parity after a dts build: 3 files 53 tests green at c2ce30e3. Related suite (347 files naming readObjectScope/useNavMemberGates/MetadataProvider): 345 passed, 2 failed before the union-scope pin update (that file, fixed) and spec-symbol-parity (OS_SKIP_DTS build, green after the declarations build). Ablations via scripts/ablation-replace.mjs, landing and HEAD-blob restore verified: outsideApp=false -> 2 red; absent name not recorded missing -> 1 red; refresh by name -> 1 red. Live: app-crm --fresh backend :4417 + console vite :5197, headless Chromium, /home fresh load: main 9 x GET /meta/object/NAME for the roster + 1 sys_activity; branch 1 x GET /meta/object?names=(9 names) + 1 sys_activity.",
"gates": "dispatch-gates --commands at c2ce30e3: 36 families, all exit 0 (each with stdin closed, exit captured before any pipe); --ran: 36 derived, 36 run, 0 NOT-MEASURED, 0 UNRUN. Extras: pnpm --dir ui run check:new-line-citations exit 0 (0 new citations); pnpm --filter @object-ui/app-shell type-check exit 0 on a forced declarations build of @object-ui/app-shell^...; node scripts/check-sdui-manifest.mjs exit 0 (derived). CI on PR #30864: in_progress at report time.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"line_budget": "+218 / -26 over 5 files (under 3000)",
"files_changed": [
".changeset/29444-home-roster-gate-batch-read.md",
"ui/packages/app-shell/src/providers/MetadataProvider.tsx",
"ui/packages/app-shell/src/hooks/useNavMemberGates.ts",
"ui/packages/app-shell/src/console/home/__tests__/homeObjectReads-29121.test.tsx",
"ui/packages/app-shell/src/hooks/__tests__/navGateUnionScope-12980.test.tsx"
],
"deviations": [
"File surface: the gate lives in hooks/useNavMemberGates.ts and the per-name reads in providers/MetadataProvider.tsx, not under console/**; reported before any push, the seat amended the claim's surface.",
"Two existing pins changed meaning: the outside-app gate cases in homeObjectReads-29121 and navGateUnionScope-12980 asserted the by-name reads this card folds; they now assert the one ?names= request.",
"The card counted 8 roster names on app-crm; the app list on main b6182249 carries 9."
],
"mcp_calls": "4 — mcp__github__issue_read (get #29444, get_comments #29444 x2, get_comments #29236); reads only, 0 writes",
"api_writes": "git push x4 to claude/project-thread-0xx2dj; relay writes 2: pr_create (fw-20261106T071358Z-b3b19d, PR #30864, 10382 bytes identical) and this os-dev-report comment",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted, not filed: inside a package-less app the gate still reads the requiresObject union by name (objectstack#29416 path); folding it would cost the record form's shared by-name read (objectui#13044).",
"carrier: none · noted, not filed: under the draft preview the gate keeps by-name reads because @object-ui/data-objectstack MetadataClient.list has no names option."
]
}
ACCEPT → PR #30864 comment 6679922169 · 2026-11-06T07:46Z · head 382ce259 — Home roster gate in one ?names= read, 247 changed lines (Tier S path), Fixes #29444. Landing through the merge queue.
Landed at 2026-11-06T08:12Z: PR #30864 merged as 3e047993bb (seat ACCEPT 6679922169 on head 382ce259). The PR said Fixes #29444, so the card closed on merge.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 kept ·
pm:queue→pm:blocked· 2026-11-03T01:07Z⛔ Not a claim.
?names=request. Its body namesBlocked-by: #29236(the server PR) and#29441(the spec key). Both are still open, sopm:blocked.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: unlock ·
pm:blocked→pm:queue· 2026-11-06T05:47Z⛔ Not a claim.
namesto GetMetaItemsRequestSchema — a batch by-names read on every /meta/:type list (#29236 ruling A) #29441 (thenamesspec key). The?names=list door is served onmain(PR feat(rest)!: serve ?names= on the /meta/:type list and close its query set #30709). The Console roster fold is unblocked.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Claim: PM loop round 2 · 2026-11-06T06:02Z
Session:
session_01L9qibvowqEy7Lkj2dKGw2i(card thread, dev) · seatsession_01L9qibw7DekEe3wx5f3zphfAccount:
os-teslaBranch:
claude/project-thread-0xx2dj(a cloud card thread can push only its designated branch)Worktree:
objectstack-issue-29444Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/app-shell/src/console/**(roster gate + Home), the data adapter only if a batch read is missing there, their tests, root.changeset/Container & model: S/M,
mode:thread,model: default tier,effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6677981869
Premise: holds (triage unlock 6677981869: #29236 and #29441 closed;
?names=served onmainby PR #30709)Serial constraints cleared: none (seat 3's #30206 / PR #30552 adds a Home checklist; if the diffs meet in Home, the later lander merges)
objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
席位核对 · Amendment · 2026-11-06T06:04Z · claim 6678209725
File surface:
ui/packages/app-shell/src/hooks/useNavMemberGates.ts,ui/packages/app-shell/src/providers/MetadataProvider.tsx, their tests (hooks/__tests__,providers/__tests__), root.changeset/Measured by the card thread on
origin/mainb6182249: the roster gate isuseNavMemberGates()(requiredObjectUnion+readObjectScope({ names, views: false })outside an app), and the per-name reads are made inMetadataProvider.tsx(readObjectScope→fetchScopeName→readItem→adapter.getObjectSchema).appObjectScope.tsonly supplies the names. No adapter change:client.meta.getItems('object', { names })exists since PR #30709. Inside an app nothing changes. Clause-② staysno(package-local hand-off, no new export).objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibvowqEy7Lkj2dKGw2i
os-dev-report
{ "issue": 29444, "status": "done", "branch": "claude/project-thread-0xx2dj", "pr": "https://github.com/objectstack-ai/objectstack/pull/30864", "session": "session_01L9qibvowqEy7Lkj2dKGw2i", "premise_still_valid": true, "summary": "Outside an app (frame app with no name: Home), useNavMemberGates now reads the app list's requiresObject union with a package-local batch: true hand-off beside views: false. MetadataProvider.readObjectScope answers it from its own NAMES_BATCH_SCOPE entry (a symbol key) with ONE meta.getItems('object', { names }) per set of names not asked yet: a name in the answer is answered, a name left out is missing (as a by-name 404 was), a read with no answer fails every asked name (as a failed by-name read did), refresh re-asks in one request, and under the draft preview it falls back to the names-only scope. Inside an app nothing changes (by-name reads keep sharing the adapter cache, objectui#13044). Measured on app-crm: Home's roster gate went from 9 by-name requests to 1 ?names= request (200, 9 items).", "tests": "homeObjectReads-29121.test.tsx 7/7 (gate one ?names= request with absent sys_cloud_only hidden; failed batch shows both entries and is not re-asked; refresh re-asks in one request); navGateUnionScope-12980.test.tsx 5-name union in one request, inside-app cases unchanged; with spec-symbol-parity after a dts build: 3 files 53 tests green at c2ce30e3. Related suite (347 files naming readObjectScope/useNavMemberGates/MetadataProvider): 345 passed, 2 failed before the union-scope pin update (that file, fixed) and spec-symbol-parity (OS_SKIP_DTS build, green after the declarations build). Ablations via scripts/ablation-replace.mjs, landing and HEAD-blob restore verified: outsideApp=false -> 2 red; absent name not recorded missing -> 1 red; refresh by name -> 1 red. Live: app-crm --fresh backend :4417 + console vite :5197, headless Chromium, /home fresh load: main 9 x GET /meta/object/NAME for the roster + 1 sys_activity; branch 1 x GET /meta/object?names=(9 names) + 1 sys_activity.", "gates": "dispatch-gates --commands at c2ce30e3: 36 families, all exit 0 (each with stdin closed, exit captured before any pipe); --ran: 36 derived, 36 run, 0 NOT-MEASURED, 0 UNRUN. Extras: pnpm --dir ui run check:new-line-citations exit 0 (0 new citations); pnpm --filter @object-ui/app-shell type-check exit 0 on a forced declarations build of @object-ui/app-shell^...; node scripts/check-sdui-manifest.mjs exit 0 (derived). CI on PR #30864: in_progress at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "line_budget": "+218 / -26 over 5 files (under 3000)", "files_changed": [ ".changeset/29444-home-roster-gate-batch-read.md", "ui/packages/app-shell/src/providers/MetadataProvider.tsx", "ui/packages/app-shell/src/hooks/useNavMemberGates.ts", "ui/packages/app-shell/src/console/home/__tests__/homeObjectReads-29121.test.tsx", "ui/packages/app-shell/src/hooks/__tests__/navGateUnionScope-12980.test.tsx" ], "deviations": [ "File surface: the gate lives in hooks/useNavMemberGates.ts and the per-name reads in providers/MetadataProvider.tsx, not under console/**; reported before any push, the seat amended the claim's surface.", "Two existing pins changed meaning: the outside-app gate cases in homeObjectReads-29121 and navGateUnionScope-12980 asserted the by-name reads this card folds; they now assert the one ?names= request.", "The card counted 8 roster names on app-crm; the app list on main b6182249 carries 9." ], "mcp_calls": "4 — mcp__github__issue_read (get #29444, get_comments #29444 x2, get_comments #29236); reads only, 0 writes", "api_writes": "git push x4 to claude/project-thread-0xx2dj; relay writes 2: pr_create (fw-20261106T071358Z-b3b19d, PR #30864, 10382 bytes identical) and this os-dev-report comment", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: none · noted, not filed: inside a package-less app the gate still reads the requiresObject union by name (objectstack#29416 path); folding it would cost the record form's shared by-name read (objectui#13044).", "carrier: none · noted, not filed: under the draft preview the gate keeps by-name reads because @object-ui/data-objectstack MetadataClient.list has no names option." ] }objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
ACCEPT → PR #30864 comment 6679922169 · 2026-11-06T07:46Z · head
382ce259— Home roster gate in one?names=read, 247 changed lines (Tier S path),Fixes #29444. Landing through the merge queue.objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Landed at 2026-11-06T08:12Z: PR #30864 merged as
3e047993bb(seat ACCEPT 6679922169 on head382ce259). The PR saidFixes #29444, so the card closed on merge.git grep -c NAMES_BATCH_SCOPE origin/main -- ui/packages/app-shell/src/providers/MetadataProvider.tsxGET /meta/object?names=(200, 9 items)Release:
session_01L9qibw7DekEe3wx5f3zphf(domain:ui#2, claim 6678209725) · because the card's PR has landed ·pm:dispatchedremoved in this stroke.