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
main red: Dogfood Regression Gate (2/3) fails permission-set-clone-door after PR #30222 (member_default grants sys_comment) #30255
Filing gate ①: main is red. This is the main-red anchor card. ⛔ Not a claim. Reader: the seat that landed the breaking PR, PR #30222 (#30108, domain:server#2 · os-bill), notified by doorbell. The test's own lane is domain:server (plugin-security / the dogfood suite).
The failing case:the permission-set clone door, on a booted showcase > a platform set (the lock-and-clone rule's commonest source) copies into its shipping package's pair. It answers INVALID_METADATA: permission/my_member_baseline failed spec validation: objects.sys_comment: … grants on object 'sys_comment' which is not defined in ….
Wanted
Stop the bleed: a forward fix that lets a platform set that grants platform objects (sys_comment, sys_activity) be cloned into a pair, as the clone door promises, with every assertion kept. ⛔ No skip, no delete, no loosened assertion.
Claim: main-red owner (the seat that landed PR #30222)
Session: session_01Utp6Cbvcmv8YWFhFJwzjKL (seat) · dev thread session_01Utp6CatT2ajve5PJf1Hhzj (the #30108 dev, warm on the change)
Account: os-bill
Branch: claude/project-thread-24iijl (harness-pinned thread branch, restarted from current main: its previous PR #30222 merged)
Worktree: objectstack-issue-30255
Domain: domain:server
Seat: domain:server#2
File surface: the permission-set clone door and/or the unknown-object grant refusal (packages/metadata-protocol/src/protocol-save-door-refusals.ts), whichever the measurement names, plus tests and one changeset. ⛔ the dogfood test's assertions, ⛔ member_default's two #30108 rows (ruling A stands), ⛔ packages/spec/**, ui/**, skills/**, docs/adr/**, .claude/**. (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default tier (opus), effort: xhigh (p0)
Clause-②: no — expected: a clone the door already promises stops being refused; the dev re-declares if measurement says otherwise
Metadata-protocol: none
Responsibility: the clone door copies member_default's new sys_comment grant into a pair, and the save door's unknown-object refusal rejects it on the showcase boot | the dogfood gate is the only reader that runs this path in CI, and the merge queue skips its shards | every package that clones a platform set
Thread-read: none
Premise: holds — main red on 6f095b9c and 797f9257, same case; breaking commit 490d136f (PR #30222)
Serial constraints cleared: none in flight on the clone door or protocol-save-door-refusals.ts from this seat; seat 5's PR #30226 edits other metadata-protocol files (protocol-packaged-base-refusal.ts, protocol-package-bindings.ts), checked at review
Fallback: if no green forward fix is in the queue by one hour after this claim, this seat reverts PR #30222 (the landing only; #30108's ruling A stands).
merged 2026-11-05T05:08Z, merge commit 119c2db1, reviewed head 1d7cf41e (seat ACCEPT 6649407275): the 5 paths of 490d136f back to the pre-merge 314ad955, byte for byte
Dogfood case
permission-set-clone-door.dogfood.test.ts 11/11 locally on the revert head (dev thread); main's own CI run on 119c2db1 is the confirming reading
Root cause
@objectstack/verify's boot stack and the showcase install no AuditPlugin, so sys_comment / sys_activity are not registered there; the save door's unknown-object grant refusal (#28990) rejects them on a fresh clone of member_default. Any deployment without plugin-audit hit the same 422.
Next, on this card: the forward fix, one PR: the clone door hands the copied grant keys to the save as inherited (a grant the source set already holds is not this save's, the refusal's own rule), plus #30108's two grants re-added and the dogfood case green locally. Fixes #30255, Refs #30108. This card stays open until it lands.
{
"issue": 30255,
"status": "done",
"branch": "claude/project-thread-24iijl",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30310",
"session": "session_01Utp6CatT2ajve5PJf1Hhzj",
"head": "d770fe2150f293162ce906de2fb910370edcc6fc",
"commits": [
"e7226bbc fix(plugin-security): re-land member_default's sys_comment / sys_activity grants (reverts 119c2db1; the five #30108 paths byte-identical to 490d136f, the changeset plus one bullet naming this fix)",
"591198e4 fix(runtime, metadata-protocol): the clone door passes inheritedGrantObjects to saveMetaItem, and the unknown-grant refusal does not judge those keys",
"d770fe21 fix(runtime): the inherited keys are read from the source set, not from the copy (contract review S1)"
],
"premise_still_valid": true,
"summary": "main went red after PR #30222 because @objectstack/verify's bootStack installs no AuditPlugin and the showcase does not require audit, so sys_comment and sys_activity are not registered there, and the #28990 unknown-grant save refusal rejected a fresh clone of member_default (422 on both objects, run 41961254209). The same 422 reaches any deployment without @objectstack/plugin-audit. Stopped by revert PR #30262 (merged 119c2db1). Forward fix PR #30310: #30108 re-landed, and the clone door passes the source set's grant keys as inheritedGrantObjects, which the refusal leaves to the source's save (the existing 'the set already holds it' rule, applied to a copy). An unknown object the save does not say it inherits is refused as before.",
"tests": "On d770fe21 under os-verify-lock: full pnpm build 119/119; packages/qa/dogfood vitest run test/permission-set-clone-door.dogfood.test.ts + test/permission-unknown-grant-object-refusal.dogfood.test.ts: Test Files 2 passed (2), Tests 18 passed (18) (the clone-door file 11/11, including the case red on main); runtime permission-set-clone.test.ts 39/39; runtime typecheck exit 0; eslint on the clone door exit 0. On 591198e4 (same tree but S1): dogfood clone-door, unknown-grant refusal, comments-permission-matrix and me-apps-and-everyone-baseline: 4 files 34/34; plugin-security feed-grants integration + explicit-allow + reaction floor 70/70; metadata-protocol suite 312 files passed, 22356 tests; runtime suite 541/541, 8620 tests; typecheck exit 0 for metadata-protocol, runtime, plugin-security. Ablations on d770fe21 via scripts/ablation-replace.mjs WRAP, each red then restored with blob == HEAD: F1 refusal ignores inherited, 1 red; F2 save path drops request.inheritedGrantObjects, 1; F3 clone door omits the key, 2; F4 inherited widened to every grant, 1. The dogfood half of F3 is main's own red (runs 41960290148, 41961254209). Full output: project file server-seat2/30255/ablations-ran.txt.",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 65 derived (13 paths, +709 / -24). Run on 591198e4: 64 exit 0, pnpm check:dual-build-cjs-loads exit 3 (no dist/); on d770fe21 after a full pnpm build it exits 0. --ran over the final record: 65 derived, 65 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. pnpm lint exit 0 (on 591198e4; S1 touches one file, eslint on it exit 0 on d770fe21). CI on 591198e4: 35 success, 13 skipped, 0 failure; on d770fe21: in progress at posting time. CI runs no dogfood shard on a PR or in the queue, so the dogfood readings above are the evidence.",
"line_budget": "733 changed lines (+709 / -24) over 13 files, under the 3000-line human-merge threshold",
"files_changed": [
".changeset/30108-member-default-feed-grants.md",
".changeset/30255-clone-inherits-held-grants.md",
"packages/metadata-protocol/src/protocol-door-requests.ts",
"packages/metadata-protocol/src/protocol-save-door-refusals.ts",
"packages/metadata-protocol/src/protocol-save.ts",
"packages/metadata-protocol/src/protocol.ts",
"packages/metadata-protocol/src/protocol.unknown-grant-object-refusal.test.ts",
"packages/plugins/plugin-security/src/comment-reaction-own-record-floor.test.ts",
"packages/plugins/plugin-security/src/member-default-explicit-allow.test.ts",
"packages/plugins/plugin-security/src/member-default-feed-grants.integration.test.ts",
"packages/plugins/plugin-security/src/objects/default-permission-sets.ts",
"packages/runtime/src/domains/permission-set-clone.test.ts",
"packages/runtime/src/domains/permission-set-clone.ts"
],
"deviations": [
"Clause-②: yes (widening): SaveMetaItemRequest gains inheritedGrantObjects, declared in metadata-protocol's dist/index.d.ts and referenced by the exported ObjectStackProtocolImplementation.saveMetaItem, so it is reachable from the '.' entry's types.",
"The full suites, typecheck and lint ran on 591198e4; S1 (d770fe21) changes one line and its docs in the clone door, and the clone-door unit file, runtime typecheck, eslint on that file, the ablations and the dogfood clone-door files were re-run on d770fe21.",
"The revert PR #30262 also deleted a pending changeset, so its Check Changeset was route 0 (#18375): the dev posted a duplicate of the seat's confirmation (6649584182 beside 6649439259)."
],
"dogfood_battery": "d770fe21 · os-verify-lock VERDICT command-exit 0 · Test Files 2/2 · Tests 18/18 (permission-set-clone-door 11/11, permission-unknown-grant-object-refusal 7/7) · no failures; 591198e4: 4 files 34/34",
"write_budget": "git push x3 (revert branch 1d7cf41e; forward branch e7226bbc + 591198e4; S1 d770fe21), relay pr_create x2 (#30262, #30310), post-stamped comments x2 (6649584182 on #30262, this report)",
"mcp_calls": "0",
"api_writes": "4 — fleet-write pr_create #30262 (run 41965684327) and #30310 (run 41975918957), each read back identical, assignees none; comment 6649584182 on #30262 via post-stamped; this comment via post-stamped",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"S2 (seat): the package copy and unmanaged import doors can meet the same 422 on a set granting an object this deployment does not install; the seat files it"
]
}
Activity
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Claim: main-red owner (the seat that landed PR #30222)
Session:
session_01Utp6Cbvcmv8YWFhFJwzjKL(seat) · dev threadsession_01Utp6CatT2ajve5PJf1Hhzj(the #30108 dev, warm on the change)Account:
os-billBranch:
claude/project-thread-24iijl(harness-pinned thread branch, restarted from currentmain: its previous PR #30222 merged)Worktree:
objectstack-issue-30255Domain:
domain:serverSeat:
domain:server#2File surface: the permission-set clone door and/or the unknown-object grant refusal (
packages/metadata-protocol/src/protocol-save-door-refusals.ts), whichever the measurement names, plus tests and one changeset. ⛔ the dogfood test's assertions, ⛔member_default's two #30108 rows (ruling A stands), ⛔packages/spec/**,ui/**,skills/**,docs/adr/**,.claude/**. (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default tier (opus),effort: xhigh(p0)Clause-②: no — expected: a clone the door already promises stops being refused; the dev re-declares if measurement says otherwise
Metadata-protocol: none
Responsibility: the clone door copies
member_default's newsys_commentgrant into a pair, and the save door's unknown-object refusal rejects it on the showcase boot | the dogfood gate is the only reader that runs this path in CI, and the merge queue skips its shards | every package that clones a platform setThread-read: none
Premise: holds —
mainred on6f095b9cand797f9257, same case; breaking commit490d136f(PR #30222)Serial constraints cleared: none in flight on the clone door or
protocol-save-door-refusals.tsfrom this seat; seat 5's PR #30226 edits othermetadata-protocolfiles (protocol-packaged-base-refusal.ts,protocol-package-bindings.ts), checked at reviewFallback: if no green forward fix is in the queue by one hour after this claim, this seat reverts PR #30222 (the landing only; #30108's ruling A stands).
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Bleed stopped · 2026-11-05T05:09Z
119c2db1, reviewed head1d7cf41e(seat ACCEPT 6649407275): the 5 paths of490d136fback to the pre-merge314ad955, byte for bytepermission-set-clone-door.dogfood.test.ts11/11 locally on the revert head (dev thread);main's own CI run on119c2db1is the confirming reading@objectstack/verify's boot stack and the showcase install noAuditPlugin, sosys_comment/sys_activityare not registered there; the save door's unknown-object grant refusal (#28990) rejects them on a fresh clone ofmember_default. Any deployment withoutplugin-audithit the same 422.Next, on this card: the forward fix, one PR: the clone door hands the copied grant keys to the save as inherited (a grant the source set already holds is not this save's, the refusal's own rule), plus #30108's two grants re-added and the dogfood case green locally.
Fixes #30255,Refs #30108. This card stays open until it lands.objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
os-dev-report
{ "issue": 30255, "status": "done", "branch": "claude/project-thread-24iijl", "pr": "https://github.com/objectstack-ai/objectstack/pull/30310", "session": "session_01Utp6CatT2ajve5PJf1Hhzj", "head": "d770fe2150f293162ce906de2fb910370edcc6fc", "commits": [ "e7226bbc fix(plugin-security): re-land member_default's sys_comment / sys_activity grants (reverts 119c2db1; the five #30108 paths byte-identical to 490d136f, the changeset plus one bullet naming this fix)", "591198e4 fix(runtime, metadata-protocol): the clone door passes inheritedGrantObjects to saveMetaItem, and the unknown-grant refusal does not judge those keys", "d770fe21 fix(runtime): the inherited keys are read from the source set, not from the copy (contract review S1)" ], "premise_still_valid": true, "summary": "main went red after PR #30222 because @objectstack/verify's bootStack installs no AuditPlugin and the showcase does not require audit, so sys_comment and sys_activity are not registered there, and the #28990 unknown-grant save refusal rejected a fresh clone of member_default (422 on both objects, run 41961254209). The same 422 reaches any deployment without @objectstack/plugin-audit. Stopped by revert PR #30262 (merged 119c2db1). Forward fix PR #30310: #30108 re-landed, and the clone door passes the source set's grant keys as inheritedGrantObjects, which the refusal leaves to the source's save (the existing 'the set already holds it' rule, applied to a copy). An unknown object the save does not say it inherits is refused as before.", "tests": "On d770fe21 under os-verify-lock: full pnpm build 119/119; packages/qa/dogfood vitest run test/permission-set-clone-door.dogfood.test.ts + test/permission-unknown-grant-object-refusal.dogfood.test.ts: Test Files 2 passed (2), Tests 18 passed (18) (the clone-door file 11/11, including the case red on main); runtime permission-set-clone.test.ts 39/39; runtime typecheck exit 0; eslint on the clone door exit 0. On 591198e4 (same tree but S1): dogfood clone-door, unknown-grant refusal, comments-permission-matrix and me-apps-and-everyone-baseline: 4 files 34/34; plugin-security feed-grants integration + explicit-allow + reaction floor 70/70; metadata-protocol suite 312 files passed, 22356 tests; runtime suite 541/541, 8620 tests; typecheck exit 0 for metadata-protocol, runtime, plugin-security. Ablations on d770fe21 via scripts/ablation-replace.mjs WRAP, each red then restored with blob == HEAD: F1 refusal ignores inherited, 1 red; F2 save path drops request.inheritedGrantObjects, 1; F3 clone door omits the key, 2; F4 inherited widened to every grant, 1. The dogfood half of F3 is main's own red (runs 41960290148, 41961254209). Full output: project file server-seat2/30255/ablations-ran.txt.", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 65 derived (13 paths, +709 / -24). Run on 591198e4: 64 exit 0, pnpm check:dual-build-cjs-loads exit 3 (no dist/); on d770fe21 after a full pnpm build it exits 0. --ran over the final record: 65 derived, 65 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. pnpm lint exit 0 (on 591198e4; S1 touches one file, eslint on it exit 0 on d770fe21). CI on 591198e4: 35 success, 13 skipped, 0 failure; on d770fe21: in progress at posting time. CI runs no dogfood shard on a PR or in the queue, so the dogfood readings above are the evidence.", "line_budget": "733 changed lines (+709 / -24) over 13 files, under the 3000-line human-merge threshold", "files_changed": [ ".changeset/30108-member-default-feed-grants.md", ".changeset/30255-clone-inherits-held-grants.md", "packages/metadata-protocol/src/protocol-door-requests.ts", "packages/metadata-protocol/src/protocol-save-door-refusals.ts", "packages/metadata-protocol/src/protocol-save.ts", "packages/metadata-protocol/src/protocol.ts", "packages/metadata-protocol/src/protocol.unknown-grant-object-refusal.test.ts", "packages/plugins/plugin-security/src/comment-reaction-own-record-floor.test.ts", "packages/plugins/plugin-security/src/member-default-explicit-allow.test.ts", "packages/plugins/plugin-security/src/member-default-feed-grants.integration.test.ts", "packages/plugins/plugin-security/src/objects/default-permission-sets.ts", "packages/runtime/src/domains/permission-set-clone.test.ts", "packages/runtime/src/domains/permission-set-clone.ts" ], "deviations": [ "Clause-②: yes (widening): SaveMetaItemRequest gains inheritedGrantObjects, declared in metadata-protocol's dist/index.d.ts and referenced by the exported ObjectStackProtocolImplementation.saveMetaItem, so it is reachable from the '.' entry's types.", "The full suites, typecheck and lint ran on 591198e4; S1 (d770fe21) changes one line and its docs in the clone door, and the clone-door unit file, runtime typecheck, eslint on that file, the ablations and the dogfood clone-door files were re-run on d770fe21.", "The revert PR #30262 also deleted a pending changeset, so its Check Changeset was route 0 (#18375): the dev posted a duplicate of the seat's confirmation (6649584182 beside 6649439259)." ], "dogfood_battery": "d770fe21 · os-verify-lock VERDICT command-exit 0 · Test Files 2/2 · Tests 18/18 (permission-set-clone-door 11/11, permission-unknown-grant-object-refusal 7/7) · no failures; 591198e4: 4 files 34/34", "write_budget": "git push x3 (revert branch 1d7cf41e; forward branch e7226bbc + 591198e4; S1 d770fe21), relay pr_create x2 (#30262, #30310), post-stamped comments x2 (6649584182 on #30262, this report)", "mcp_calls": "0", "api_writes": "4 — fleet-write pr_create #30262 (run 41965684327) and #30310 (run 41975918957), each read back identical, assignees none; comment 6649584182 on #30262 via post-stamped; this comment via post-stamped", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "S2 (seat): the package copy and unmanaged import doors can meet the same 422 on a set granting an object this deployment does not install; the seat files it" ] }Report taken 2026-11-05T06:45Z.
Generated by Claude Code