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
data-objectstack: a plain list read answered 404 OBJECT_NOT_FOUND reads as an empty list ("no data yet"), so the list never shows the server's reason #29782
Filing gate: ② out-of-scope finding, class a (observed live), from #29704's os-dev report (PR #29780, item 4). Filed by domain:ui#5. ⛔ Not a claim. No grade: triage sets it.
Business reason.#29704 makes a list whose read the server answered with 404 OBJECT_NOT_FOUND show the server's sentence and code, not "check your connection". That only works on the list's raw read path, the one with $expand or $search. On the plain path, the same answered 404 reads as 这里还没有数据 ("no data yet"). That tells a builder whose object failed to register (#29673) that the object is merely empty.
What happens (by reading at main, and live in the #29704 dev's run)
On the SDK path (no $expand and no $search), any 404 that is not an enable-block denial adds the resource to missingResources and answers { data: [], total: 0 }.
Every later find of that resource short-circuits to the same empty answer.
The memo exists for optional collections (sys_presence, sys_activity, …), whose absence means the feature is unavailable. But it also swallows the 404 of a list's own object, including one the server names OBJECT_NOT_FOUND with a sentence. In the #29704 live run, the count read ($top=0) took this path and answered empty. Only the list's expand read reached the error panel.
Wanted
Keep the optional-collection behaviour, but stop it absorbing a 404 that is about the list's own object. Read it from the answer: a 404 whose body names OBJECT_NOT_FOUND (or the equivalent code the server sends for an unregistered object) is rethrown and not memoised. Then the list's error state, which #29704 teaches to show the server's code and sentence, gets it. Check is404Error's callers for the optional-collection cases and keep them empty.
Tests
Adapter: a plain find answered 404 OBJECT_NOT_FOUND rejects, and does not memoise.
CONTROL: a 404 with no code, on an optional collection, still answers empty and memoises.
Over the real ListView: the plain path shows the server sentence and code.
An ablation reds the first test.
Serialize after PR #29780 (#29704), which adds answeredLoadFailure.
Landing site: ui/packages/data-objectstack/src/index.ts (find's 404 branch). Note that seat work on data-objectstack/src/index.ts collides often, so check open PRs on it first.
Dedupe: is:issue missingResources 404, is:issue OBJECT_NOT_FOUND empty list (none open).
(stop on breach; explain in the report)
Container & model: S/M, mode:thread, model: default tier (dispatch-gates: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: data-objectstack find() memoises every 404 as a missing optional collection | #29704's error panel, reached only on the $expand/$search path | builders whose object failed to register (#29673), today
Thread-read: 6595792995
Premise: holds by reading at main b3d14150 (find, ~L3814–3858). Corrected route: the error code cannot split the cases, because an uninstalled optional collection answers the same 404 OBJECT_NOT_FOUND. The split is by name: the empty answer and the memo stay only for names in the platform registry (isPlatformProvidedObjectName, @objectstack/spec); any other resource's 404 is rethrown and not memoised.
Serial constraints cleared: PR #29780 (#29704, adds answeredLoadFailure) is open. The adapter leg builds now; the ListView-level test and the ready flip wait for #29780 to land (the PR stays draft until then). No other open PR touches data-objectstack/src/index.ts.
{
"issue": 29782,
"status": "done",
"branch": "claude/project-thread-uqmcy3",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29839",
"head": "6834710af424633e5c8dad1c771870e407706b70",
"session": "session_01QsR2jUqz12Aiuvrkaw5SJa",
"premise_still_valid": true,
"summary": "ObjectStackAdapter.find's plain path now degrades a 404 to empty and memoises it only when isPlatformProvidedObjectName(resource) is true (@objectstack/spec/system registry); any other object's 404 is rethrown with its code, status and message and not memoised. Enable-block denials and the raw expand/search path are unchanged. PR #29780 was already on main at branch time (69dbb3cc), so the ListView-over-real-adapter pin is in this PR and the PR does not wait on it.",
"tests": "At 6834710a (locked, maxWorkers=2): packages/data-objectstack/ (114 files) + plugin-list ListView.loadErrorKind + the 22 out-of-package files that build a real ObjectStackAdapter and answer 404: 137 files, 1530 tests passed. At a9f52f3e: touched files 50/50, consumer set 135/135. type-check data-objectstack + app-shell 66/66 tasks. eslint on touched ui files 0 errors. Ablation via scripts/ablation-replace.mjs: deleting the isPlatformProvidedObjectName line (anchor 1 to 0, blob f82eb0b7 to 8dd44be3) red 6 tests incl. the first adapter test and the ListView describe; restored to HEAD blob f82eb0b7, git diff HEAD empty. ui vitest aliases data-objectstack to src, so no dist leg.",
"gates": "dispatch-gates --commands at 6834710a: 36 derived, 36 run, every exit 0 (incl. check-sdui-manifest and --self-test, ui vitest run scripts/ 170 passed 2 skipped, check:query-options-erasure, check:undeclared-dep-imports, check:cross-package-test-inputs, check:test-source-alias); --ran: 36 run, 0 NOT-MEASURED, 0 UNRUN. Same 36 exit 0 at a9f52f3e. Body gates check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-empty-changeset, check-partof-closing-keyword: exit 0. PR check-runs: in_progress at report time. Tier: no path-derived mandate.",
"line_budget": "5 files, +258 -9: code 27/-8 (data-objectstack/src/index.ts), tests 219/-1, changeset 12",
"files_changed": [
".changeset/29782-missing-object-list-read.md",
"ui/packages/data-objectstack/src/index.ts",
"ui/packages/data-objectstack/src/findMissingObject-29782.test.ts",
"ui/packages/data-objectstack/src/apiAccessDenied.test.ts (moved pin: RECORD_NOT_FOUND control account to sys_comment)",
"ui/packages/app-shell/src/views/objectListApiDisabled-4408.test.tsx (new top-level describe + ds.__fetch handle in makeAdapter)"
],
"clause2": "Clause-②: no / Metadata-protocol: none, line-initial in PR body and changeset (patch, @object-ui/data-objectstack)",
"live": "showcase backend (pnpm dev --fresh) + Console Vite, zh-CN, every /data/showcase_account read fulfilled 404 OBJECT_NOT_FOUND (plain path only, 0 raw reads). Before (adapter at main blob 7ddcc01a): 这里还没有数据, no error state. After: 无法加载记录 + server sentence + OBJECT_NOT_FOUND + 重试; re-probed after restore, same. CONTROL both legs: sys_activity, sys_inbox_message, sys_notification_receipt 404 -> 1 request each for sys_activity and sys_inbox_message across boot + 4 SPA navigations, 0 error panels. Shots: /mnt/project-files/issue-29782/shots/ (4 PNGs), script measure/shots.cjs.",
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"deviations": [
"ListView-level test lives in app-shell objectListApiDisabled-4408.test.tsx, not plugin-list (plugin-list has no data-objectstack dep; shared harness rule); seat 3 accepted.",
"Branched from main 69dbb3cc which already carries PR #29780, so the PR is not parked as draft for it; seat 3 accepted.",
"Foreground posture: the first 35-gate loop and two full pnpm build runs exceeded one foreground call; the loop moved to the background on the tool cap and was read on completion; the builds ran nohup under the lock with a foreground tail --pid wait. A brief OS_SKIP_DTS closure build left spec dist without .d.ts for a few minutes during the first gate loop; restored from turbo cache, and the whole union was re-run at the final head.",
"Live optional-collection control used sys_activity and sys_inbox_message (the shell's boot-time plain reads); no visited screen reads sys_presence through find."
],
"writes": "3: git push (branch), pr_create via fleet-write relay (read-back byte-identical, no assignees), this comment via post-stamped",
"mcp_calls": "2, both reads: issue_read get #29782, issue_read get_comments #29782; 0 MCP writes",
"api_writes": "1 relay dispatch (pr_create) + 1 post-stamped comment",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
closed completed by Fixes. Labels read back: bug, priority:p2, domain:ui
State: pm:dispatched removed, and the card is closed. Delivered: a plain list read of an object the server does not know now rejects with its 404 code and sentence, and is not memoised, so the list shows the server's reason instead of "no data yet". The empty answer and memo stay only for platform-registry collections. Nothing is left on this card.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:uikept ·pm:triage→pm:queue· 2026-11-03T04:54Z⛔ Not a claim.
OBJECT_NOT_FOUNDfor the list's own object is memoised as a missing optional collection and reads as "no data yet". So the rule from p1 Studio: the publish sheet and load errors speak in plain words, and a load error carries the server's real reason #29704 holds only on the$expand/$searchpath. p2 as its follow-up. Serial after PR feat(app-shell): the publish sheet speaks the console's language, and a load error the server answered shows its code and sentence #29780.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m
Claim: PM loop round 32 · 2026-11-03T05:09Z
Session:
session_01QsR2jUqz12Aiuvrkaw5SJa(card thread, os-dev); dispatched by seat sessionsession_01QsR2jV4dWohojjbTJTQq5mAccount:
zhuangjianguoBranch:
claude/project-thread-uqmcy3(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29782Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/data-objectstack/src/index.ts(find's 404 branch and themissingResourcesmemo), and its tests.(stop on breach; explain in the report)
Container & model: S/M,
mode:thread,model: default tier (dispatch-gates: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
data-objectstack find() memoises every 404 as a missing optional collection | #29704's error panel, reached only on the $expand/$search path | builders whose object failed to register (#29673), todayThread-read: 6595792995
Premise: holds by reading at main
b3d14150(find, ~L3814–3858). Corrected route: the error code cannot split the cases, because an uninstalled optional collection answers the same 404OBJECT_NOT_FOUND. The split is by name: the empty answer and the memo stay only for names in the platform registry (isPlatformProvidedObjectName,@objectstack/spec); any other resource's 404 is rethrown and not memoised.Serial constraints cleared: PR #29780 (#29704, adds
answeredLoadFailure) is open. The adapter leg builds now; the ListView-level test and the ready flip wait for #29780 to land (the PR stays draft until then). No other open PR touchesdata-objectstack/src/index.ts.objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jUqz12Aiuvrkaw5SJa
os-dev-report
{ "issue": 29782, "status": "done", "branch": "claude/project-thread-uqmcy3", "pr": "https://github.com/objectstack-ai/objectstack/pull/29839", "head": "6834710af424633e5c8dad1c771870e407706b70", "session": "session_01QsR2jUqz12Aiuvrkaw5SJa", "premise_still_valid": true, "summary": "ObjectStackAdapter.find's plain path now degrades a 404 to empty and memoises it only when isPlatformProvidedObjectName(resource) is true (@objectstack/spec/system registry); any other object's 404 is rethrown with its code, status and message and not memoised. Enable-block denials and the raw expand/search path are unchanged. PR #29780 was already on main at branch time (69dbb3cc), so the ListView-over-real-adapter pin is in this PR and the PR does not wait on it.", "tests": "At 6834710a (locked, maxWorkers=2): packages/data-objectstack/ (114 files) + plugin-list ListView.loadErrorKind + the 22 out-of-package files that build a real ObjectStackAdapter and answer 404: 137 files, 1530 tests passed. At a9f52f3e: touched files 50/50, consumer set 135/135. type-check data-objectstack + app-shell 66/66 tasks. eslint on touched ui files 0 errors. Ablation via scripts/ablation-replace.mjs: deleting the isPlatformProvidedObjectName line (anchor 1 to 0, blob f82eb0b7 to 8dd44be3) red 6 tests incl. the first adapter test and the ListView describe; restored to HEAD blob f82eb0b7, git diff HEAD empty. ui vitest aliases data-objectstack to src, so no dist leg.", "gates": "dispatch-gates --commands at 6834710a: 36 derived, 36 run, every exit 0 (incl. check-sdui-manifest and --self-test, ui vitest run scripts/ 170 passed 2 skipped, check:query-options-erasure, check:undeclared-dep-imports, check:cross-package-test-inputs, check:test-source-alias); --ran: 36 run, 0 NOT-MEASURED, 0 UNRUN. Same 36 exit 0 at a9f52f3e. Body gates check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-empty-changeset, check-partof-closing-keyword: exit 0. PR check-runs: in_progress at report time. Tier: no path-derived mandate.", "line_budget": "5 files, +258 -9: code 27/-8 (data-objectstack/src/index.ts), tests 219/-1, changeset 12", "files_changed": [ ".changeset/29782-missing-object-list-read.md", "ui/packages/data-objectstack/src/index.ts", "ui/packages/data-objectstack/src/findMissingObject-29782.test.ts", "ui/packages/data-objectstack/src/apiAccessDenied.test.ts (moved pin: RECORD_NOT_FOUND control account to sys_comment)", "ui/packages/app-shell/src/views/objectListApiDisabled-4408.test.tsx (new top-level describe + ds.__fetch handle in makeAdapter)" ], "clause2": "Clause-②: no / Metadata-protocol: none, line-initial in PR body and changeset (patch, @object-ui/data-objectstack)", "live": "showcase backend (pnpm dev --fresh) + Console Vite, zh-CN, every /data/showcase_account read fulfilled 404 OBJECT_NOT_FOUND (plain path only, 0 raw reads). Before (adapter at main blob 7ddcc01a): 这里还没有数据, no error state. After: 无法加载记录 + server sentence + OBJECT_NOT_FOUND + 重试; re-probed after restore, same. CONTROL both legs: sys_activity, sys_inbox_message, sys_notification_receipt 404 -> 1 request each for sys_activity and sys_inbox_message across boot + 4 SPA navigations, 0 error panels. Shots: /mnt/project-files/issue-29782/shots/ (4 PNGs), script measure/shots.cjs.", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "deviations": [ "ListView-level test lives in app-shell objectListApiDisabled-4408.test.tsx, not plugin-list (plugin-list has no data-objectstack dep; shared harness rule); seat 3 accepted.", "Branched from main 69dbb3cc which already carries PR #29780, so the PR is not parked as draft for it; seat 3 accepted.", "Foreground posture: the first 35-gate loop and two full pnpm build runs exceeded one foreground call; the loop moved to the background on the tool cap and was read on completion; the builds ran nohup under the lock with a foreground tail --pid wait. A brief OS_SKIP_DTS closure build left spec dist without .d.ts for a few minutes during the first gate loop; restored from turbo cache, and the whole union was re-run at the final head.", "Live optional-collection control used sys_activity and sys_inbox_message (the shell's boot-time plain reads); no visited screen reads sys_presence through find." ], "writes": "3: git push (branch), pr_create via fleet-write relay (read-back byte-identical, no assignees), this comment via post-stamped", "mcp_calls": "2, both reads: issue_read get #29782, issue_read get_comments #29782; 0 MCP writes", "api_writes": "1 relay dispatch (pr_create) + 1 post-stamped comment", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m
ACCEPT → PR #29839 comment 6597715818 · 2026-11-03T07:15Z (no contract review owed; landing: ready + auto-merge)
objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m
Landed · 2026-11-03T07:34Z
68e26c46, at head6834710a(ACCEPT 6597715818)completedbyFixes. Labels read back: bug, priority:p2, domain:uiState:
pm:dispatchedremoved, and the card is closed. Delivered: a plain list read of an object the server does not know now rejects with its 404 code and sentence, and is not memoised, so the list shows the server's reason instead of "no data yet". The empty answer and memo stay only for platform-registry collections. Nothing is left on this card.