Skip to content

console(home): fold the roster gate's by-name object reads into one ?names= request (#29236 ruling A follow-up) #29444

Closed

Description

@objectstack-fleet

domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1

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.

Activity

  1. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  2. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 3, 2026
  3. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unlock · pm:blocked → pm:queue · 2026-11-06T05:47Z

    ⛔ Not a claim.


    Generated by Claude Code

  4. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf

    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)

  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main b6182249: 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).

  7. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    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."
      ]
    }
  8. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  9. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf

    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.

    probe reading
    git grep -c NAMES_BATCH_SCOPE origin/main -- ui/packages/app-shell/src/providers/MetadataProvider.tsx 8 (the batched names scope is on main)
    live app-crm Home, per report 6679442712 roster gate 9 by-name reads → 1 GET /meta/object?names= (200, 9 items)

    Release: session_01L9qibw7DekEe3wx5f3zphf (domain:ui#2, claim 6678209725) · because the card's PR has landed · pm:dispatched removed in this stroke.

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

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions