Skip to content

console: a packaged app's record route with no declared record page downloads the whole object registry (553 KB) #29681

Closed

Description

@objectstack-fleet

domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ

Filing gate: ② out-of-scope finding, class a (perf observation, measured), from #29552 leg 1 (claim amendment 6592122772, which keeps packaged apps untouched). Filed by domain:ui#2. ⛔ Not a claim. No grade: triage sets it.

Business reason. Opening a record in a packaged app downloads the whole object registry whenever the record's object has no declared record page. That is most objects in most apps, on every record open.

Observed (measured). Production Console at 98b5aa1d, app-crm, packaged crm_app, Initech crm_account record, no declared record page: 24 requests, 1,569,536 B, including GET /meta/object 553,397 B. The initiator is AppContent's readsWholeRegistry read: readAppObjectScope's record arm answers scope: null when declaredRecordPage returns null (ui/packages/app-shell/src/console/appObjectScope.ts, ~L502). The synthesized page needs the registry only for deriveRelatedLists (children that reference the object). Data: /mnt/project-files/issue-29552/leg1/measure/after2-98b5aa1d/.

Wanted. The same rule #29552 leg 1 builds for package-less apps, for packaged apps: when the app bundle answered and its navigation reaches the object, scope the route to the object, its lookup targets, the bundle's objects that reference it, and the app's required objects; otherwise the registry, as today. Related lists drawn stay the same set and order.

Tests. Over the real MetadataProvider with a recording adapter: a packaged app's record route with no declared record page asks no unscoped /meta/object; CONTROL with a declared page unchanged; the related lists' set and order unchanged; ablation goes red. Before/after bytes on a production Console.

Landing site: ui/packages/app-shell/src/console/appObjectScope.ts (record arm). Serialize after #29552 leg 1's PR and the bundle-order server card filed beside this one.

Dedupe: is:issue record route meta/object registry, is:issue readsWholeRegistry (only #29552).

Links back: #29552, PR #29614.

Activity

  1. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:ui kept · 2026-11-03T01:06Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ

    Claim: PM loop round 14 · 2026-11-03T06:06Z
    Session: session_01QsR2jStt5LFpRDtMbVaQyh (card thread, os-dev); dispatched by seat session session_01QsR2jRFuJz9QBZqPVHYVhJ
    Account: zhuangjianguo
    Branch: claude/project-thread-04g04g (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29681
    Domain: domain:ui
    Seat: domain:ui#2 (own filing)
    File surface: ui/packages/app-shell/src/console/appObjectScope.ts (the record arm and readObjectRouteNames only), ui/packages/app-shell/src/providers/MetadataProvider.tsx / bundledReads.ts only if the packaged case needs it, tests, one changeset. Design report to the seat before code. Stop on breach and explain in the report, above all a server change
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier on the final file list), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: a packaged app's record route with no declared record page downloads the whole object registry for its related lists | about 559 KB of a 1.58 MB record open on app-crm, on most record opens | everyone opening records in packaged apps
    Thread-read: none
    Premise: the seat's measure at PR #29697's final head 3b62862c (crm_app Initech crm_account: 24 requests, 1,580,091 B, /meta/object 558,633 B). The os-dev re-measures per read on main before code.
    Serial constraints cleared: #29552 leg 1 (PR #29697) landed as be6b15c7, and the bundle-order server card #29680 landed via PR #29752. #29728 (this seat) follows this card on the same files.

  3. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jStt5LFpRDtMbVaQyh
    os-dev-report

    {
      "issue": 29681,
      "status": "done",
      "branch": "claude/project-thread-04g04g",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29846",
      "head": "8d42b2395c2369df4c7f50d30bbd48dbc55ae881",
      "session": "session_01QsR2jStt5LFpRDtMbVaQyh",
      "premise_still_valid": true,
      "summary": "A packaged app's record route with no declared record page now reads its package scope (package list, then by name the lookup targets and any pointing object of another package, bundle-first) instead of the whole object registry: appObjectScope.ts record arm !page branch drops the packageId gate and hands packageId to readObjectRouteNames, the design the seat approved at step 1. Live on crm_app Initech crm_account with a cross-package ops_visit: 1,584,710 -> 1,075,729 B; the registry (561,247) and /meta/view (7,014) are gone; ?package= 32,008 and sys_organization/sys_business_unit/sys_comment_reaction by name come in. Related tabs and page text identical, Visits in the same overflow place; drawer unchanged (24 requests, registry); sidebar fills in one step before and after.",
      "tests": "Harness AppContent.packagelessRecordRelated-29552.test.tsx: new top-level describe (7) for the packaged route, old packaged CONTROL flipped (removed), 17/17 at daaec33a. Ablations via ablation-replace, restored blob==HEAD and git diff HEAD empty: A1 package gate back -> 2 red at daaec33a (3 at ad4df191, before the drawer pin was narrowed); A2 drop inRelatedOrder -> 2 red. Sweep at ad4df191: 135 app-shell files naming AppContent/appObjectScope/bundledReads + provider tests, 1,118 passed. app-shell type-check (both programs) exit 0 at ad4df191 and f440eb5c (after rebuilding the stale @object-ui/mobile dist). ESLint 0 errors on changed files.",
      "gates": "dispatch-gates --commands at ad4df191/daaec33a: 35 derived; 34 run in a loop at daaec33a, all exit 0, plus pnpm --dir ui exec vitest run scripts/ exit 0 (170 files, at ad4df191); --ran reconciliation: 35 run, 0 NOT-MEASURED, 0 UNRUN. Body gates on the final body: check-changeset-no-major 0, check-adr-0087-registration 0, check-closing-keyword-parity 0, check-partof-closing-keyword 0. check-sdui-manifest 0 and --self-test 0 (in the loop). CI check-runs: in_progress at report time. Final head merges main again (42ff86f6), no incoming commit touches the changed files.",
      "line_budget": "3 files, +140/-25 vs origin/main (under the 3000 human-merge threshold)",
      "files_changed": [
        ".changeset/29681-packaged-record-route-related-objects.md",
        "ui/packages/app-shell/src/console/appObjectScope.ts",
        "ui/packages/app-shell/src/console/__tests__/AppContent.packagelessRecordRelated-29552.test.tsx"
      ],
      "deviations": [
        "Harness now reads its object set and page list from server.objects/server.pages (reset in beforeEach) so the packaged describe can add ops_visit; package-less assertions unchanged.",
        "Record drawer pin first asserted a ?package= call that only the harness makes; live the drawer reads only the registry (same 24 requests as main), so the pin was narrowed to the registry read (daaec33a)."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — mcp__github__issue_read (get, get_comments), reads only",
      "api_writes": "1 so far — fleet-write pr_create (#29846); this report comment is the 2nd (post-stamped); git push is not a REST write",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · GET /api/v1/packages is 676,423 B on this record route before and after; not this card's read, noted only"
      ]
    }
  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ

    Landed · 2026-11-03T08:00Z · PR #29846 merged through the queue as a9322700. The merge commit carries all 3 files of the accepted head 8d42b239 (+140/−25). Delivered in full: a record route in a packaged app with no declared record page reads the objects pointing at the record through the app's package scope (the package list, then by name), not the whole registry. Measured on crm_app: 1,584,710 → 1,075,729 B per record open, with the same related lists in the same order and no sidebar flash. An object outside the navigation, no bundle, draft preview and a record drawer still read the registry. The card closed by Fixes; pm:dispatched is removed with this note.

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