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: a packaged app's record route with no declared record page downloads the whole object registry (553 KB) #29681
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).
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.
{
"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"
]
}
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.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:uikept · 2026-11-03T01:06Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
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 sessionsession_01QsR2jRFuJz9QBZqPVHYVhJAccount:
zhuangjianguoBranch:
claude/project-thread-04g04g(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29681Domain:
domain:uiSeat:
domain:ui#2(own filing)File surface:
ui/packages/app-shell/src/console/appObjectScope.ts(the record arm andreadObjectRouteNamesonly),ui/packages/app-shell/src/providers/MetadataProvider.tsx/bundledReads.tsonly 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 changeContainer & model: S,
mode:thread,model: default tier (dispatch-gates --tier on the final file list),effort: highClause-②: 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 appsThread-read: none
Premise: the seat's measure at PR #29697's final head
3b62862c(crm_appInitechcrm_account: 24 requests, 1,580,091 B,/meta/object558,633 B). The os-dev re-measures per read onmainbefore 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.objectstack-fleet commentedon Nov 3, 2026
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" ] }objectstack-fleet commentedon Nov 3, 2026
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 head8d42b239(+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 oncrm_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 byFixes;pm:dispatchedis removed with this note.