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
Package-draft batch publish (Studio "publish whole app") still answers success with no sign when an object's storage sync is refused #30693
Filing gate: ① a public door's wrong answer with a named producer: publishPackageDrafts in packages/metadata-protocol/src/protocol.ts (the POST /api/v1/packages/:id/publish-drafts door, Studio's "publish whole app"). Found by the #30635 dev (PR #30691, out of its surface, stopped there by order), read by the seat on the PR head 9c02a3e7. ⛔ Not a claim. Suggested grade: p3 (the same family as #30635, on the third door).
Dedupe: publishPackageDrafts storage, storageRefused, object-storage-sync-refused — no open card; nearest #30635 (the save and single-item publish doors, PR #30691). New.
Reader: domain:server (metadata-protocol). Serial: after PR #30691 lands; protocol.ts is a hot file (#29985 codemod, #30020), so the seat checks the serial queue before dispatch.
What happens
After PR #30691, a save in publish mode and POST /meta/:type/:name/publish answer a refused object storage sync with one warning advisory (rule object-storage-sync-refused) on their existing advisories. The batch door runs the same sync through runPublishSideEffects (protocol.ts, the per-item loop of publishPackageDrafts, ~L12469 on 9c02a3e7) and gets the same storageRefused back, but drops it: the published[] element for that object is pushed BEFORE the side effects run, and nothing reads eff.storageRefused. So "publish whole app" still answers success with no sign that an object's table was not created or altered; only the server log says so (#22985).
Expected
The batch answer tells the caller, on the existing per-element published[].advisories (already declared on the batch response; omitted when empty), the same object-storage-sync-refused warning the single-item doors give. No new key, status unchanged, the publish not failed.
Pins through the door: a refused sync on one object of a batch → that element carries the advisory, the others do not; a clean batch → no advisories added.
If the element cannot carry it without a spec change, stop and report: that is a spec-lane change.
Claim: PM loop round 1 · 2026-11-05T23:49Z
Session: session_016WV4czvZykUqhYxYXSSDt4
Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
Branch: the card thread's designated claude/project-thread-* branch, named in a claim amendment once the thread reports it
Worktree: objectstack-issue-30693
Domain: domain:server
Seat: domain:server#4
File surface: the per-item loop of publishPackageDrafts (packages/metadata-protocol/src/protocol.ts, or the facet it lives in on origin/main when the dev starts) and the advisory builder PR #30691 added for object-storage-sync-refused (reused, not copied), the batch door's tests (protocol-publish-drafts-advisories.test.ts beside its siblings), one root .changeset/ file. ⛔ packages/spec/** (the per-element published[].advisories is already declared; if it cannot carry it, stop and report) (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: publishPackageDrafts in packages/metadata-protocol (gets storageRefused back from runPublishSideEffects and drops it; the published[] element is pushed before the side effects run) | none (the single-item doors answer it since PR #30691; only the log says so here) | anyone using Studio's "publish whole app" (POST /api/v1/packages/:id/publish-drafts); read by the filing seat on PR #30691's head
Thread-read: 6671647346
Premise: holds per the card; its serial gate (PR #30691) merged; the dev re-reads the loop on origin/main first
Serial constraints cleared: PR #30691 merged. protocol.ts is in three open drafts (#30687 codemod --members moving door bodies into facets for #30518, #30709, #30713); none is a single-claim path, so it is ordinary concurrency: the dev reads #30687's diff for publishPackageDrafts before writing, merges main before opening, and whichever lands second merges again
Branch: claude/project-thread-dx78mn
Dev session: session_016WV4czAsRaaqvLX3Tkidba (the card thread this seat opened; worktree objectstack-issue-30693, base origin/main4564d6fa)
{
"issue": 30693,
"status": "done",
"branch": "claude/project-thread-dx78mn",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30754",
"session": "session_016WV4czAsRaaqvLX3Tkidba",
"premise_still_valid": true,
"summary": "publishPackageDrafts (still in protocol.ts on origin/main; #30687 does not move it) now appends eff.storageRefused from runPublishSideEffects, the object-storage-sync-refused warning built by #30691's objectStorageSyncRefusedNotice, to that object's published[] element advisories, after the gate's findings. Element order, status and every other key unchanged; a clean sync adds no key. No spec change: published[].advisories is already declared. ensureObjectStorage's docblock names the batch door.",
"tests": "head 5a6e0a90: pnpm --filter @objectstack/metadata-protocol test + typecheck under os-verify-lock, VERDICT command-exit 0, Test Files 319 passed | 4 skipped (323), Tests 22480 passed | 26 skipped (22506). New describe in protocol-publish-drafts-advisories.test.ts: 4 cases (one refused object of three → only its element carries the warning; declared 409 quoted; gate advisory + sync refusal on separate elements; CONTROL clean batch, no advisories key). Ablation on 8d702f83 via scripts/ablation-replace.mjs (anchor 'if (eff.storageRefused) {' → 'if (false && eff.storageRefused) {', anchor 1 → 0, blob f0989bf52081 → f277d0449f42): Tests 3 failed | 5 passed (8), CONTROL green; restored blob == HEAD, git diff HEAD empty. Tests import src, no dist leg.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on 5a6e0a90: 60 families, all exit 0 (check:dual-build-cjs-loads and check:lean-entry-closure exit 3 first, exit 0 after whole-tree turbo build 119/119). --ran: 60 derived, 60 run, 0 NOT-MEASURED, 0 UNRUN. check-nul-bytes exit 0. CI check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls → #30754, no assignees, no labels); relay comment (POST /repos/objectstack-ai/objectstack/issues/30693/comments, this report). Plus one git push.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:server· 2026-11-05T22:53Z⛔ Not a claim.
publishPackageDrafts(POST /api/v1/packages/:id/publish-drafts, Studio's "publish whole app") answers success with no sign when an object's storage sync is refused. It is the batch door of Object save answers success when the schema sync behind it is refused: the caller never learns the table was not created or adopted #30635 and gets the same grade.findingis removed.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Claim: PM loop round 1 · 2026-11-05T23:49Z
Session:
session_016WV4czvZykUqhYxYXSSDt4Account:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch: the card thread's designated
claude/project-thread-*branch, named in a claim amendment once the thread reports itWorktree:
objectstack-issue-30693Domain:
domain:serverSeat:
domain:server#4File surface: the per-item loop of
publishPackageDrafts(packages/metadata-protocol/src/protocol.ts, or the facet it lives in onorigin/mainwhen the dev starts) and the advisory builder PR #30691 added forobject-storage-sync-refused(reused, not copied), the batch door's tests (protocol-publish-drafts-advisories.test.tsbeside its siblings), one root.changeset/file. ⛔packages/spec/**(the per-elementpublished[].advisoriesis already declared; if it cannot carry it, stop and report) (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
publishPackageDraftsinpackages/metadata-protocol(getsstorageRefusedback fromrunPublishSideEffectsand drops it; thepublished[]element is pushed before the side effects run) | none (the single-item doors answer it since PR #30691; only the log says so here) | anyone using Studio's "publish whole app" (POST /api/v1/packages/:id/publish-drafts); read by the filing seat on PR #30691's headThread-read: 6671647346
Premise: holds per the card; its serial gate (PR #30691) merged; the dev re-reads the loop on
origin/mainfirstSerial constraints cleared: PR #30691 merged.
protocol.tsis in three open drafts (#30687 codemod--membersmoving door bodies into facets for #30518, #30709, #30713); none is a single-claim path, so it is ordinary concurrency: the dev reads #30687's diff forpublishPackageDraftsbefore writing, mergesmainbefore opening, and whichever lands second merges againobjectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Claim amendment · claim 6672619391 · 2026-11-05T23:52Z
Branch:
claude/project-thread-dx78mnDev session:
session_016WV4czAsRaaqvLX3Tkidba(the card thread this seat opened; worktreeobjectstack-issue-30693, baseorigin/main4564d6fa)Everything else in claim 6672619391 stands.
objectstack-fleet commentedon Nov 6, 2026
domain:server#4 · os-elon-musk · session_016WV4czAsRaaqvLX3Tkidba
os-dev-report
{ "issue": 30693, "status": "done", "branch": "claude/project-thread-dx78mn", "pr": "https://github.com/objectstack-ai/objectstack/pull/30754", "session": "session_016WV4czAsRaaqvLX3Tkidba", "premise_still_valid": true, "summary": "publishPackageDrafts (still in protocol.ts on origin/main; #30687 does not move it) now appends eff.storageRefused from runPublishSideEffects, the object-storage-sync-refused warning built by #30691's objectStorageSyncRefusedNotice, to that object's published[] element advisories, after the gate's findings. Element order, status and every other key unchanged; a clean sync adds no key. No spec change: published[].advisories is already declared. ensureObjectStorage's docblock names the batch door.", "tests": "head 5a6e0a90: pnpm --filter @objectstack/metadata-protocol test + typecheck under os-verify-lock, VERDICT command-exit 0, Test Files 319 passed | 4 skipped (323), Tests 22480 passed | 26 skipped (22506). New describe in protocol-publish-drafts-advisories.test.ts: 4 cases (one refused object of three → only its element carries the warning; declared 409 quoted; gate advisory + sync refusal on separate elements; CONTROL clean batch, no advisories key). Ablation on 8d702f83 via scripts/ablation-replace.mjs (anchor 'if (eff.storageRefused) {' → 'if (false && eff.storageRefused) {', anchor 1 → 0, blob f0989bf52081 → f277d0449f42): Tests 3 failed | 5 passed (8), CONTROL green; restored blob == HEAD, git diff HEAD empty. Tests import src, no dist leg.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on 5a6e0a90: 60 families, all exit 0 (check:dual-build-cjs-loads and check:lean-entry-closure exit 3 first, exit 0 after whole-tree turbo build 119/119). --ran: 60 derived, 60 run, 0 NOT-MEASURED, 0 UNRUN. check-nul-bytes exit 0. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls → #30754, no assignees, no labels); relay comment (POST /repos/objectstack-ai/objectstack/issues/30693/comments, this report). Plus one git push.", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code