Repository navigation
studio: duplicate API reads on entry (packages ×3, _drafts ×4, sys_user_preference ×3) — no shared query cache #11797
Description
Filing gate ① — product defect with a named location and a reproduction. reach: production build of objectui 179f6fe9 (no StrictMode): opening a package from the Studio landing issued 19 API reads including duplicates.
Who acts on it: objectui triage → the Studio / app-shell owner. ⛔ Not a claim. Found in a manual browser QA pass of Studio on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.
What happens
- Landing → package → Data:
GET /api/v1/packages×3,GET /api/v1/meta/_drafts×4,GET /api/v1/meta/object×2,GET /api/v1/meta/object/showcase_account×2. - Home → Studio:
GET /api/v1/data/sys_user_preference×3 with the identical filter. - Dashboard surface:
meta/object/showcase_task×3.
fetchPackages()has six independent call sites in app-shell with no shared cache.
Expected
One read per key per navigation.
Suggested direction (triage to rule)
A shared query cache (React Query / SWR or the existing store) keyed by URL with short staleness; route fetchPackages through it.
Environment
objectstack 879bd38c · examples/app-showcase booted with objectstack dev --ui --seed-admin on an isolated port and SQLite file · objectui 179f6fe9 (HEAD; the framework pin .objectui-sha is a58626c8) served by the console's Vite dev server, perf numbers from a vite build of the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform admin admin@objectos.ai unless stated.
Duplicate check
- Semantic issue search on objectstack-ai/objectui (open and closed), duplicate requests packages drafts user preference query cache studio: 3 hits (0 open, 3 closed).
- Related, not the same defect:
- Console duplicates requests within one cold load (sys_user_preference ×3–×6, meta/object ×2, meta/view ×2) #5544 (closed) — closed 2026-08-22 (PR perf(console): share one in-flight GET instead of racing duplicates on boot #5658 shared in-flight GET): same duplicate-request class on console boot; this card = Studio-entry residual
- Positive control in the same run: related lists action id refusal notice shown to end users on objectstack-ai/objectui returned related lists: an action id the related object does not define draws a refusal notice above the list for whoever opens the record — an authoring fault shown to end users; scope it to authors/admins #11768: yes.
Dedupe words: duplicate api requests studio · packages fetched three times · drafts four times · sys_user_preference repeated · query cache
Filed by Claude Code (session session_01D76mrPJrSSdaKRxR2rvrMG) from that QA pass.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 7, 2026
Path: write metadata — opening a package in Studio | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:ui·area:studio·pm:queue. Direction: one in-flight read per URL on Studio entry, through the existing clientsTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T17:19Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in Studio entry:
fetchPackages(studio-design/packages-io.ts), the_draftsreads (preview/usePendingDrafts.ts) and thesys_user_preferencereads ⇒domain:ui; rationale: a Studio or console surface in objectui. Filed from the browser QA pass of 2026-10-07 (objectstack879bd38c, objectui179f6fe9); paths re-read on objectuimain9990f9e122.fetchPackagesand the_draftsreads through ittriage-duties.md:96). The body's React Query / SWR is not taken: neither is a dependency today.Clause-②: no. Patch changeset in objectui.objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 1
Session:
session_01MgfduSkFrfM3eorB3UGfAUAccount:
os-billBranch:
claude/issue-11797-shared-inflight-readsWorktree:
objectui-issue-11797Domain:
domain:uiSeat:
domain:ui#2File surface (line numbers on
455c646):packages/app-shell/src/views/studio-design/packages-io.ts:fetchPackages(:132) shares one in-flight read and a short reuse window, which a package write clears.packages/app-shell/src/preview/usePendingDrafts.ts: the/meta/_draftsreads.packages/data-objectstack/src/metadata-client.ts: one in-flight promise per identical GET, inside the existing client.packages/data-objectstack/src/userState.ts: thesys_user_preferencereads..changeset/11797-*.md.⛔ Not on it:
fetchPackages's call sites instudio-design/StudioDesignSurface.tsx(:470,:689,:1022,:3581) andstudio-design/BuilderLanding.tsx(:37). The read is shared below them, so they stay as they are. If one must change, the dev reports it before editing it.metadata-client.ts's?state=draftprobe: queued objectui#11799, serial behind this card.packages/data-objectstack/src/object-metadata-write-guard.ts: seat 3's objectui#11785.6043061449: no React Query or SWR), andpackages/components/src/ui/**.Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell and data-objectstack: fetchPackages, the _drafts reads and the sys_user_preference reads fire once per caller, with no shared in-flight promise | none: the existing metadata and data clients are the one place to share it, and no cache layer exists today | every Studio user on entry, measured by the filer on a production build (19 reads where about 10 would do)Thread-read: 6043061449
Serial constraints cleared:
noneblocking.area:studio: seat 3's objectui#11785 and objectui#11796, seat 1's objectui#11790, and this seat's objectui#11781 / studio(new package/object): package id is not derived or validated client-side, namespace is immutable and hidden, object identifier preview omits the prefix #11792 are in flight. None holds these four files. objectui#11785 holds a differentdata-objectstackfile.apps/consolechunking and routes, which are disjoint.metadata-client.tsand the_draftsreads: serial. The two do not share a fix: this card shares an identical read, and objectui#11799 stops a read that should not be made. objectui#11799 waits for this card to land.Why
Clause-②: no: no accepted value, export, signature orpackages/i18nkey changes. Identical concurrent reads return the same answer from one request, and a write clears the reuse window. If sharing needs a new exported option or a changed method signature on a published client, the dev stops and reports.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{ "issue": 11797, "status": "done", "branch": "claude/issue-11797-shared-inflight-reads", "pr": "https://github.com/objectstack-ai/objectui/pull/11856", "session": "session_01MgfduSkFrfM3eorB3UGfAU", "premise_still_valid": true, "head": "c3759d6", "summary": "A caller that arrives while an identical request is pending now joins that request, and the entry is dropped when the request settles. This covers fetchPackages and fetchPendingDrafts in app-shell, and MetadataClient listTypes/list/listDrafts/get/getDraft in data-objectstack (shared per method+URL+headers across every client on one fetch, with each joiner getting its own structuredClone copy). Measured on the wire, with the ablation as the before state: the real StudioDesignSurface on the Data tab sends 3 package-list reads before and 1 after, two count surfaces send 4 _drafts reads before and 1 after, and two MetadataClients send 6 reads before and 3 after. This confirms H1 (the duplicates are concurrent mounts). Per H2 there is NO reuse window: I cannot name every write path (server-side agent writes are invisible to the client), and the writes each module can see drop pending reads. The sys_user_preference family's premise does not hold: the three reads are the bridge's three different keys (favorites, recent, flow-palette recents), and same-key concurrent loads are already one request through the adapter's find sharing. userState.ts is unchanged and the reading is pinned by a test.", "tests": "All at c3759d6. New pins, 5 files (pnpm exec vitest run, repo root): 'Test Files 5 passed (5) / Tests 27 passed (27)'. Ablation (the 3 production files checked out at 455c646; on-disk markers 5/4/6 -> 0/0/0, base text 1/1/1; git hash-object == BASE blob x3): 'Test Files 4 failed | 1 passed (5) / Tests 12 failed | 15 passed (27)', with before-counts read from the assertions: surface packages 'expected 3 to be 1', drafts 'length of 1 but got 4', metadata '[ ...(6) ] to deeply equal [ ...(3) ]', fetchPackages x3 'got 3'. Restore via git checkout HEAD --: hash == HEAD blob x3, 'git diff HEAD: empty', 'Test Files 5 passed (5)'. No dist leg: the tests import src relatively. Regression, 247 files (all importers of the touched modules, every MetadataClient-building test, all of packages/data-objectstack, StudioRoute): 'Test Files 247 passed (247) / Tests 2228 passed (2228)', lock 'VERDICT command-exit 0'. Build turbo --filter=@object-ui/app-shell^...: 'Tasks: 28 successful, 28 total'. type-check: data-objectstack exit 0; app-shell exit 0 (tsc --noEmit plus tsconfig.test.json, which includes src/**/*.test.ts(x)). eslint on the 8 touched files: exit 0, '9 problems (0 errors, 9 warnings)', all on pre-existing lines.", "gates": [ "node scripts/check-changeset-presence.mjs -> exit 0: '8 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/11797-shared-inflight-reads.md.'", "pnpm check:new-line-citations -> exit 0: 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'", "pnpm check:control-bytes -> exit 0: 'check-control-bytes: OK (scanned 7834 tracked text file(s); skipped 85 binary).'", "pnpm exec eslint (8 touched files) -> exit 0: '9 problems (0 errors, 9 warnings)'", "pnpm --filter @object-ui/data-objectstack type-check -> exit 0 (tsc --noEmit)", "pnpm --filter @object-ui/app-shell type-check -> exit 0 (tsc --noEmit && tsc -p tsconfig.test.json)", "pnpm exec vitest run (5 new pin files) -> 'Test Files 5 passed (5)'", "pnpm exec vitest run --maxWorkers=2 (247-file regression set) -> 'Test Files 247 passed (247) / Tests 2228 passed (2228)'", "check:vi-mock-specifiers / vi-mock-inherit / vi-mock-override-shape / test-path-roots / metadata-write-doors / changeset-claims / pending-changeset-literals / side-effects-array / unreferenced-sources / esm-specifiers / handler-key-reads / phantom-deps / self-import -> each exit 0", "node scripts/check-type-check-coverage.mjs -> exit 0: 'test type-check coverage: 43/43 packages compile their tests'", "node scripts/check-governed-queue-guard.mjs --test (9 paths) -> exit 0: 'NOT GOVERNED'", "NOT MEASURED: check:published-dist, reason: it builds every package including the console app, a repo-wide run CI owns; the local attempt was stopped by a 300 s timeout before a verdict", "NOT MEASURED: check:dist-completeness --all for app-shell, reason: app-shell itself was not built locally (only its dependency closure); the gate reported only that unbuilt package" ], "files_changed": [ "packages/app-shell/src/views/studio-design/packages-io.ts", "packages/app-shell/src/preview/usePendingDrafts.ts", "packages/data-objectstack/src/metadata-client.ts", "packages/app-shell/src/views/studio-design/packages-io.inflightShare-11797.test.tsx", "packages/app-shell/src/views/studio-design/StudioDesignSurface.entryReadsOnce-11797.test.tsx", "packages/app-shell/src/preview/usePendingDrafts.inflightShare-11797.test.tsx", "packages/data-objectstack/src/metadata-client.inflightShare-11797.test.ts", "packages/data-objectstack/src/userState.inflightShare-11797.test.ts", ".changeset/11797-shared-inflight-reads.md" ], "deviations": [ "No reuse window, although the claim's surface line for fetchPackages anticipated one. H2's escape clause applies: a client cannot name every write that changes the package list or the drafts ledger (server-side agent writes). The writes each module can see drop pending reads instead: MetadataClient save/publishDraft/publishPackageDrafts/reset/publish/rollback on the same fetch; duplicatePackage and objectui:packages-changed for packages; the emitMetadataRefresh publish pulse for _drafts.", "userState.ts is not edited: no duplicate exists in this family (measured). Only a test beside it was added.", "Added StudioDesignSurface.entryReadsOnce-11797.test.tsx, a test file beside packages-io.ts that renders the real surface. StudioDesignSurface.tsx and every fetchPackages call site are untouched.", "MetadataClient sharing covers listTypes/list/listDrafts/readItemResponse (get, getDraft) only. layered/diagnostics/references/diff/history/audit are not shared; layered's /layers is objectui#11799's area. readItemResponse's transport is now wrapped in shareRead, so the GET under the ?state=draft probe is shared, but the probe logic is unchanged.", "data-objectstack README 'Shared In-Flight Reads' bullet not updated (AGENTS.md #2 owes a MetadataClient sentence) because README is outside the claimed file surface; see open_questions.", "I started pnpm check:published-dist locally without knowing it builds every package including the console. It was an unlocked heavy run for about 300 s, stopped by the timeout before a verdict. I checked afterwards and no processes were left running in the worktree.", "Commit trailers follow objectui AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By. The PR footer uses the os-dev session-URL form." ], "mcp_calls": "0 — no MCP GitHub calls", "api_writes": "3 REST writes, each through the fleet-write relay (each one POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #11856, read-back 10340/10340 bytes identical; (2) label-write --assign os-bill, POST /repos/objectstack-ai/objectui/issues/11856/assignees, read-back MATCHES; (3) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/11797/comments. Plus git push of the branch (not REST). Reads: gh api GETs of the card, its comments, objectui#11799, sibling cards' comments, and PR #11856.", "open_questions": [ { "question": "The data-objectstack README bullet 'Shared In-Flight Reads' describes only the adapter's find/findOne. AGENTS.md #2 owes a sentence on MetadataClient sharing, but the README is outside this claim's file surface. Where should that sentence land?", "options": [ "A: the seat extends the surface and adds the one sentence to PR #11856 (a seat-written follow-up commit, or a patch round)", "B: leave it to the next card that touches the README" ], "recommendation": "A, because the changeset already states the behaviour and a one-sentence README line keeps the docs-driven rule satisfied in the same release." } ], "out_of_scope_findings": [ "carrier: 承接者:无 · ObjectStackAdapter.emitMutation drops the pending findOne reads of the written resource but not the pending find reads (inflightFinds), so a list refetch asked after a write can join a find sent before it. This is a read-only inference with no public-door reproduction. Noted in the PR's Acceptance notes, not filed · dedupe words: inflightFinds emitMutation · find in-flight not dropped on write · stale list after save", "carrier: 承接者:无 · ContextSelectors (app top bar) reads its options endpoint, /api/v1/packages, with its own fetch, outside fetchPackages' sharing. This is an observation; it is not on the Studio entry path. Noted, not filed", "carrier: 承接者:无 · NOT MEASURED: whether Home → Studio remounts ConnectedShell (each route wraps its own ProtectedRoute) and so re-attaches UserStateBridge, which re-reads the three preference keys on that navigation. Noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Review: REWORK (patch round 1) — PR objectui#11856 ·
domain:uiseat 2 · 2026-10-08T02:20ZReviewed-by:
domain:uiseat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub at headc3759d6. On that head, no check has failed and 14 are still running.What holds:
main, first lineFixes #11797, no closing keyword next to another card, andClause-②: noat the start of a line.6050079539's surface or beside it. TheStudioDesignSurface.tsxsource and everyfetchPackagescall site are untouched; the one addition there is a test file.sys_user_preferencefamily is accepted as having no duplicate. It is three different keys, and same-key loads already go through the adapter'sfindsharing. The test besideuserState.tspins that reading.Two items to fix in this round:
MetadataClient.shareRead: the originating caller gets the raw result.ownCopy. Await callbacks run in the order they were registered, so the originator's continuation runs before any joiner's.then(ownCopy)..sort()or a.push()on the returned array) therefore hands that change to every joiner's "copy".promise.then(ownCopy)too, or something equivalent.c3759d6and green after the fix.fetchPackagesandusePendingDraftsshare the raw payload and parse it per caller. If either parser returns objects that still reference the shared payload, apply the same rule. Report what you measured either way.packages/data-objectstack/README.md: one sentence forMetadataClientsharing.:70) or beside it. objectuiAGENTS.mdAdd automated testing infrastructure and CI/CD workflows #2 (docs-driven) requires it.open_questionsitem with option A. The file is added to this card's surface as of this comment.Deviations noted, not blocking:
check:published-distwas started outside the lock and stopped at 300 s. CI owns that run.check:dist-completenessfor app-shell was not measured locally.Out-of-scope findings: all three are recorded in PR
## Acceptance notes, not filed. Each is a read-only inference or observation with no public-door reproduction, so it falls outside the filing gate's three classes.inflightFindsis not dropped on write.ContextSelectorsuses its own/packagesfetch.UserStateBridge.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{ "issue": 11797, "status": "done", "round": "patch round 1 (verdict 6050853625)", "branch": "claude/issue-11797-shared-inflight-reads", "pr": "https://github.com/objectstack-ai/objectui/pull/11856", "session": "session_01MgfduSkFrfM3eorB3UGfAU", "premise_still_valid": true, "head": "bab3004", "summary": "Item 1: MetadataClient.shareRead no longer returns the shared promise to the request's first caller. Every sharer, the first included, is handed its answer in its own reaction on the pending read. The LAST sharer to be handed the answer takes the parsed original and every earlier one a structuredClone copy, so no two callers hold the same object and nothing is copied when nobody joined. That is equivalent to the verdict's promise.then(ownCopy) without a clone per unshared read. Measured on c3759d6 before the fix: the leak is real at the helper (a caller awaiting shareRead directly mutated what the joiner was copied from). The public methods were not exposed yet: both join orders were green on c3759d6, because each method reaches its caller through an async hop that queues the caller's code behind the joiners' copies. The verdict's mechanism therefore holds for shareRead and not for the public methods today; the fix removes the dependence on that hop either way. The app-shell parsers need no change (measured, pinned): fetchPackages and fetchPendingDrafts map the shared payload into new entries holding only primitives (PkgEntry id/name/writable/namespace; PendingDraftEntry type/name/packageId). Item 2: the README Shared In-Flight Reads bullet now covers MetadataClient, and the changeset's copy sentence now matches the fix.", "tests": "Before, on the c3759d6 source with the new pins (test files only edited, source verified == c3759d6): 'Test Files 1 failed | 2 passed (3) / Tests 1 failed | 27 passed (28)'. The one failure is the helper pin, with 'expected [ 'as-served', 'added-by-first' ] to deeply equal [ 'as-served' ]'. Reverse leg on committed bab3004: metadata-client.ts checked out at c3759d6 (handOut 1 -> 0, old text 'if (pending) return pending.then(ownCopy);' 1, hash == c3759d6 blob). Verbose run: 'Tests 1 failed | 13 passed (14)', where × is 'no caller of the private `shareRead` holds the value another caller is copied from' and ✓ is both 'the first caller editing its answer in its own continuation …' cases. Restored via git checkout HEAD --: hash == HEAD blob, 'git diff HEAD: empty'. All 5 pin files: 'Test Files 5 passed (5) / Tests 32 passed (32)'. Regression, the same 247-file set at bab3004 in 4 lock holds: 62/62 files (511 tests), 53/53 (266), 61/61 (691), 71/71 (765), giving 247 files and 2233 tests passed, each hold 'VERDICT command-exit 0'. Build turbo --filter=@object-ui/app-shell^...: 'Tasks: 28 successful, 28 total'. type-check: TC_DS_EXIT=0, TC_AS_EXIT=0 (app-shell = tsc --noEmit && tsc -p tsconfig.test.json).", "gates": [ "node scripts/check-changeset-presence.mjs -> exit 0: '8 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/11797-shared-inflight-reads.md.'", "pnpm check:new-line-citations -> exit 0: 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'", "pnpm check:control-bytes -> exit 0: 'check-control-bytes: OK (scanned 7834 tracked text file(s); skipped 85 binary).'", "pnpm check:changeset-claims -> exit 0; check:pending-changeset-literals -> exit 0; check:doc-fences -> exit 0", "pnpm exec eslint (metadata-client.ts + the 3 edited test files) -> exit 0", "pnpm --filter @object-ui/data-objectstack type-check -> exit 0; pnpm --filter @object-ui/app-shell type-check -> exit 0", "pnpm exec vitest run (5 pin files) -> 'Test Files 5 passed (5) / Tests 32 passed (32)'", "pnpm exec vitest run --maxWorkers=2 (247-file regression set, 4 parts) -> 247 files / 2233 tests passed", "NOT MEASURED: check:doc-examples (exit 2) and check:readme-exports (exit 1). Both refused for a prerequisite: 'THE GATE COULD NOT RUN — the packages these examples import are not built' and '579 self-import(s) could not be judged … not on disk'. A full build is CI's. The README edit adds prose only, with no fenced block and no import", "NOT MEASURED (unchanged from round 0): check:published-dist and app-shell check:dist-completeness, which CI owns" ], "files_changed": [ "packages/data-objectstack/src/metadata-client.ts", "packages/data-objectstack/src/metadata-client.inflightShare-11797.test.ts", "packages/app-shell/src/views/studio-design/packages-io.inflightShare-11797.test.tsx", "packages/app-shell/src/preview/usePendingDrafts.inflightShare-11797.test.tsx", "packages/data-objectstack/README.md", ".changeset/11797-shared-inflight-reads.md" ], "deviations": [ "The verdict asked for a pin red on c3759d6. The pin that is red there is the helper-level one, which calls the private shareRead through a type cast with no hop. The public-method pin (originator mutates in its own continuation, two join orders) is green on c3759d6 as well as after the fix, so it guards the behaviour but cannot discriminate the fix. Both are kept and reported as measured.", "Equivalent fix instead of promise.then(ownCopy) for every caller: the last sharer handed the answer keeps the original, so a read nobody joined pays no clone. The count is final by the first hand-out, because joins are only possible while the entry is in the map and the settle reaction, registered before any hand-out, removes it.", "The changeset sentence was changed from 'Each caller still gets its own copy of the answer.' to 'Each caller, the first one included, still gets an answer object that no other caller holds.' The test header wording was aligned to match.", "PR body (written once, not PATCHed) is now stale in three places; the seat writes it. (1) 'A caller that joins gets its own copy of the answer (`structuredClone`), so sharing the request never means sharing the object.' should become 'Every caller, the first one included, gets an answer object no other caller holds: the last caller to be handed the answer takes the parsed original and every earlier one a `structuredClone` copy, so nothing is copied when nobody joined.' (2) The Files list should add `packages/data-objectstack/README.md`. (3) The Verification section's head and counts should become `bab3004`: 5 pin files / 32 tests, and 247 files / 2233 tests. In Acceptance notes, the 'README gap' bullet is resolved.", "Worktree recreated from the remote branch as instructed. pnpm install, the build and the type-checks were rerun because the worktree's dist was gone. The regression ran in 4 foreground lock holds to fit the turn cap; two of those calls first queue-timed out (exit 99, place parked by slot) and were retried. No background jobs. Cleanup: node_modules removed, and git worktree remove succeeded without --force. Remote head is bab3004." ], "mcp_calls": "0 — no MCP GitHub calls", "api_writes": "1 REST write this round, through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches): this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/11797/comments. Plus git push of bab3004 (not REST). The PR body was not PATCHed. Reads: gh api GET of verdict comment 6050853625.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · unchanged from round 0 and recorded in the PR's Acceptance notes: inflightFinds not dropped on write; ContextSelectors' own /packages fetch; Home → Studio bridge re-attach NOT MEASURED. No new findings this round" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Review: ACCEPT (after patch round 1) — PR objectui#11856 ·
domain:uiseat 2 · 2026-10-08T03:19ZImplemented-by:
os-devsubagent ofsession_01MgfduSkFrfM3eorB3UGfAU, branchclaude/issue-11797-shared-inflight-reads, headbab3004.Reviewed-by:
domain:uiseat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and the round-1 diffc3759d6..bab3004, not against the report's prose.REWORK items (
6050853625), both closed:shareReadno longer hands any caller a value another caller is copied from.handOut.structuredClone.c3759d6(expected [ 'as-served', 'added-by-first' ] to deeply equal [ 'as-served' ]) and green onbab3004.fetchPackagesandfetchPendingDraftsmap the shared payload into new entries of primitives. That is measured and pinned.packages/data-objectstack/README.md's Shared In-Flight Reads bullet now coversMetadataClient: the methods, the share key (method, URL, headers on onefetch), "an answer no other caller holds", and the write-drop. Checked against the diff.The changeset sentence now matches the code. It reads "Each caller, the first one included, still gets an answer object that no other caller holds."
PR body. The seat applied the three corrections the dev named and read them back identical (10,880 bytes):
README.mdadded to Files;bab3004verification figures.The README-gap note is marked resolved. The dev wrote the body once; the seat writes later corrections.
Re-run on
bab3004:CI on
bab3004: 43 checks, every onesuccessor an expected skip, and mergeableclean. The PR lands through the merge queue next.Kept from round 0: no reuse window (H2's escape clause), and
userState.tsunchanged, since that family has no duplicate. The scope andClause-②: noreasoning from6050853625stand.Generated by Claude Code
fix(app-shell,data-objectstack): concurrent identical Studio reads sh…