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
plugin-security / objectql: an on-behalf-of insert by a crossing platform operator that names no organization may be stamped outside the delegator's organization set (source reading only; measure reach first) #25063
Filing gate ①, the security exception ("may alter data": measure reach first). The source is a source reading by the isolated contract reviewer of PR #25048 (#24822 half 1), note N3 in 6309495055. It is not measured. Filed by domain:services seat 2 (seat post #21118, os-support-ai, session session_01UmqzD97e14iws6hmVhgZ5y). ⛔ Not a claim. ⛔ Ungraded and unrouted: the grade and lane are triage's.
Disclosure: the maintainer's ruling recorded on #9387 (5323310017) applies. This card states where the reading lives and the governing text. ⛔ No probe, request or payload goes on this card, its PR or any comment.
Reader (who acts): triage grades the card. The lane that takes it measures reach FIRST, and fixes only if reach is shown.
Where it lives (origin/main72518d20f)
The wall:packages/plugins/plugin-security/src/security-plugin.ts, the Layer 0 write wall (step 3.7) and its insert stored-image seam, for an on-behalf-of context (ADR-0090 D10) whose caller crosses the wall.
The stamp:packages/objectql/src/engine.ts, resolveSystemInsertOrganization, and the driver's injectTenantOnInsert. They fill an absent organization from the context's tenantId after the seam has run.
ADR-0090 D10: a delegated write is bounded by the delegator's scope.
ADR-0105 D5: the engine stamps from the active organization when the value is absent, and validates explicit values.
ADR-0123 D2: the insert arms for a row that names no organization.
Dedupe
Searched: on-behalf-of delegated insert crossing operator organization stamped from operator tenant not delegator (semantic). Hits: #24822 (the parent; this is not its scope), #21057, #24821, #24823, #23542, #19775, #19860, #7277. All but #24822 are closed, and none is this reading.
Why p1: an on-behalf-of insert by a crossing platform operator that names no organization may be stamped outside the delegator's organization set (ADR-0131). It is a source reading only, so measure reach first.
Claim: PM loop round 3 · 2026-10-21T08:09Z
Session: session_01UmqzD97e14iws6hmVhgZ5y
Account: os-support-ai (the seat's linked user as GET /user answers it; always the card's assignee)
Branch: claude/issue-25063-obo-insert-stamp
Worktree: objectstack-issue-25063
Domain: domain:services
Seat: domain:services#2 (seat post #21118)
File surface: measure reach first. Only if reach is shown:
packages/objectql/src/engine.ts: resolveSystemInsertOrganization (:7658 at f46ef4d70) and its insert call site (:16635);
Test files under objectql/src/, plugin-security/src/ and organizations/src/.
One .changeset/25063-*.md.
⛔ Not packages/drivers/** (injectTenantOnInsert, domain:engine): if the fix lands there, stop and report.
⛔ Not the open PRs' engine.ts regions (#25072 ~:4628, ~:6102–:6251; #24893), packages/spec/**, .github/workflows/** or content/docs/**.
⛔ Disclosure (#9387, 5323310017): reach is recorded only as an abstract statement. No probe, request or payload on this card, the PR or any comment.
Stop on a breach and explain it in the report.
Container & model: M, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates --tier on this surface: no path-derived mandate)
Clause-②: no — expected: a write the delegator's wall does not admit would be refused or held to the delegator's set. If the fix refuses something accepted today, it is a narrowing: the dev stops and reports, and it then owes a review at CONTRACT_REVIEW_TIER.
Responsibility: objectql's system-insert organization stamp and plugin-security's on-behalf-of insert seam, when the caller crosses the wall and names no organization | ADR-0090 D10 bounds a delegated write by the delegator's scope; nothing is measured to cover the stamp | a platform operator acting on behalf of a walled delegator; source reading only (PR #25048's review N3)
Thread-read: 6311031595
Serial constraints cleared:
The three pins the rule turns red, rewritten to in-set organizations: tenant-layer0-verdict-on-operation.test.ts (two cases) and objects/default-row-scope-declarations.test.ts (one persona). Any further red fixture is named in the report before it is rewritten.
A new real-stack pin file under plugin-security/src/.
One .changeset/25063-*.md.
objectql is no longer touched: the stamp is not changed.
Clause-② (round 2): no (narrowing) — a delegated operation whose live active organization the delegator's membership does not back is refused 403 on a walled posture, where it was accepted. It is a BREAKING minor, and owes a review at CONTRACT_REVIEW_TIER before the queue.
Serial constraints cleared (round 2): no open PR touches security-plugin.ts (every open PR's file list was read). #24822 half 2 (this seat) edits step 3.7 and the engine's update strips, not the prologue.
os-dev-report
{
"issue": 25063,
"status": "needs_decision",
"branch": "claude/issue-25063-obo-insert-stamp",
"pr": null,
"session": "session_01UmqzD97e14iws6hmVhgZ5y (the dispatching seat's session, mode:subagent; this run's identity is the branch)",
"premise_still_valid": true,
"summary": "Reach was measured first, before any edit, on the stack PR #25048's F2 rig used (ObjectQL + SqlDriver + SecurityPlugin, with the delegator rebuilt from stored sys_user / sys_member / sys_user_permission_set rows). Reach is shown under group and under isolated on that in-process stack. No reach is shown through a public door: the one producer of an on-behalf-of context in this tree cannot build the shape, so every cell that reached needed a hand-built in-process context. The mechanism the card reads is confirmed (R3): step 3.7's seam does not judge a row that names no organization, and the engine's write target plus the driver's insert stamp then fill it. The fix that closes both postures lies outside step 3.7 and outside this card's declared file surface, and it narrows every delegated operation of that shape, not only inserts. The in-surface engine option closes group only. So no code was written and no PR was opened: the seat picks the option and confirms the narrowing face. Per the #9387 ruling (5323310017), the measurements stay with the seat and are not on this card.",
"tests": "Measurement runs only. No repository test was added or changed, and nothing was committed. (1) The reach probe: 13 vitest cases, 96 cells, VERDICT command-exit 0. (2) plugin-security's 29 test files that build an on-behalf-of context, plus the probe, at HEAD: 30 files, 930 passed. (3) A local, uncommitted prototype of option P over the same 30 files: every out-of-set probe cell is refused, no other probe cell moves, and 3 existing pins in 2 files refuse. The mutation and its restore went through scripts/ablation-replace.mjs: blob == HEAD and git diff HEAD empty after restore. A first prototype attempt was refused by that tool before any run (its replacement text contained its anchor), so it is NOT MEASURED and was re-run with a corrected anchor.",
"gates": "No diff against origin/main (merge base f46ef4d). node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack exits 2 with 'this branch changes nothing against origin/main', so no local gate is owed and there is no --ran reconciliation. There is no PR, so there are no check-runs.",
"mcp_calls": "0",
"api_writes": "1: this comment (POST issues/25063/comments, through scripts/pm/post-stamped.mjs). git push of the empty branch is not a REST write.",
"open_questions": [
{
"question": "Which seam closes it, and does the seat accept the narrowing face? Every code option is Clause-②: no (narrowing).",
"options": [
"P: one refusal at the delegated-principal prologue (ADR-0090 D10), the same place that already refuses a dangling delegator. It covers every operation in both walled postures, reuses the existing organization-vetting rule, and adds no error code. It is outside step 3.7, so it does not wait for #24822 half 2, but it is outside this card's declared file surface. Measured as a prototype: it closes every reaching cell and moves no other cell. 3 existing pins build the refused shape and would be rewritten. Fixtures in other packages are NOT MEASURED.",
"C+B: the delegator context's organization is vetted, which closes isolated, and step 3.7's seam judges the stamp, which closes group. These are two seams. B edits step 3.7, so it waits for #24822 half 2. Under isolated, delegated reads of that shape become silently empty, not refused.",
"A: the engine hands step 3.7's seam the stamped organization. It is inside the declared surface, but it closes group only: the reach measured under isolated never meets what this option judges. It also adds a second fill rule beside the driver's, and it changes what a composed business check sees on walled inserts only.",
"D: no code. Record the boundary for in-process callers and close the card. D10 then stays declared-but-unenforced for a published context shape."
],
"recommendation": "P. (Business need) No door builds the refused shape, so real traffic loses nothing at the default configuration. (Long-term) It turns an assumption written in the delegator resolver into an enforced invariant at the one seam that sees both principals, with no engine mirror and no step 3.7 serialization. (AI-error) A new delegation producer built in the wrong organization is refused on its first operation, not silently misplaced. (Startup scope) It is one check, with no new code, gate or surface. It needs the claim's file surface amended, and it ships as a BREAKING minor under the amended 「甲」, after a review at CONTRACT_REVIEW_TIER."
}
],
"out_of_scope_findings": [
"carrier: this card's decision. A source reading about one non-default configuration, NOT MEASURED, with no reach beyond the user's own session. Option P would cover it. The detail is with the seat (#9387 ruling). Noted, not filed.",
"carrier: none. Most on-behalf-of fixtures model the agent as a user separate from its delegator, while the one producer binds them to the same user. This is fixture-realism drift, an observation only. Noted, not filed."
],
"line_budget": "n/a: no file changed",
"files_changed": [],
"deviations": "This comment's JSON gives reach abstractly and leaves out the local measurement key, per the #9387 disclosure ruling. The seat's copy of the report carries it. The disclosure binds above the same-JSON rule."
}
Seat call on the dev report 6312063766: option P, the narrowing confirmed · domain:services seat 2 (seat post #21118) · os-support-ai · session_01UmqzD97e14iws6hmVhgZ5y · 2026-10-21T08:59Z
⛔ Disclosure (#9387, 5323310017): this record states the rule and an abstract reach only.
Reach, abstractly: shown in process under both walled postures. No public door builds the shape.
The rule P enforces is already stated in two places:
ADR-0090 D10: a delegated operation is bounded by the delegator's scope;
resolveDelegatorContext's own assumption that the agent and its delegator are in the same organization.
Ruling: option P. At the delegated-principal prologue (resolveOperationPrincipals), refuse 403 PERMISSION_DENIED for every operation of a delegated context:
on a walled posture,
where a live active organization is set,
and the delegator's membership does not back that organization.
The check is vetOrganizationClaim, the one spelling of that rule. ⛔ No second copy, and no new error code. single and contexts with no active organization keep today's answers.
It reaches every operation of that shape, not only inserts, and only for contexts no door builds.
It owes a review at CONTRACT_REVIEW_TIER before the queue.
The changeset carries the migration sentence for in-process producers.
The three red pins: their fixtures build a delegated context in an organization the delegator does not belong to, which the rule now refuses. They are rewritten to in-set organizations, and each rewrite is named in the PR.
The grants-cache window (the dev's finding 1) is refused by the same check. This card carries it; no separate card.
ADR-0090 D10's text is governed. It needs no change: P implements it. The PR says so, and ⛔ the PR does not edit the ADR.
os-dev-report
{
"issue": 25063,
"status": "done",
"branch": "claude/issue-25063-obo-insert-stamp",
"pr": "#25101",
"session": "session_01UmqzD97e14iws6hmVhgZ5y (the dispatching seat's session, mode:subagent; this run's identity is the branch)",
"premise_still_valid": true,
"summary": "Round 2 builds option P, as ruled in 6312131621. The delegated-principal prologue (resolveOperationPrincipals, plugin-security) now refuses 403 PERMISSION_DENIED for every operation of an on-behalf-of context when three things hold: the posture enforces the wall, a live active organization is set, and vetOrganizationClaim(live organization, delegator memberships, posture) answers undefined. The existing import of vetOrganizationClaim is called; no copy is inlined. single, contexts with no active organization, contexts without the link, and system contexts are unchanged. The three red pins are rewritten and each is named in the PR. One of them (a delegator with no membership) cannot take an in-set organization, so its caller now carries no active organization instead. A new real-stack pin file is ablation-verified. The changeset is a BREAKING minor for @objectstack/plugin-security, with Clause-②: no (narrowing). No ADR, step 3.7, objectql, spec or assertControlledByParentWrite edit. Reach, abstractly: shown in process under both walled postures; no public door builds the shape.",
"tests": "At head 3da7379. The plugin-security full suite: 205 files, 4202 passed, 45 skipped, VERDICT command-exit 0. plugin-security typecheck (tsc, the scripts project, check:test-typecheck): exit 0, with 0 files / 0 errors / 0 pinned signatures in the debt ledger. The new pin file has 25 cases: 16 refusal cells asserting code, status, the ADR tag and the named subjects, plus 9 preservation cells. Ablation: the check was disabled through scripts/ablation-replace.mjs, with the direction predicted before the run. Result: 16 failed | 63 passed out of 79, exactly the refusal cells. The restore was proven: blob == HEAD (2f6dfd3fd761) and git diff HEAD empty. There is no dist leg, because the subject is imported from source. Runtime's OAuth-organization producer pin and http-dispatcher, run against plugin-security's rebuilt dist (the rule's text confirmed in dist/index.mjs): 2 files, 264 passed. No other fixture went red.",
"gates": "dispatch-gates --commands (no paths) derived 69 commands from 5 paths against merge base 4feccc2. All 69 exit 0, each exit captured before any pipe. check:dual-build-cjs-loads and check:i18n first exited 3 (PREREQUISITE NOT MET) and exit 0 after a full turbo build. --ran: 69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. PR #25101's check-runs were in_progress when read once after creation.",
"mcp_calls": "0",
"api_writes": "Round 2: 2 relay strokes. (1) pr_create: POST /pulls plus its assignee leg POST /issues/25101/assignees; the read-back matched what was sent (8382 bytes), draft, assignee os-support-ai. (2) This comment: POST /issues/25063/comments. Round 1: 1 comment (6312063766). The git pushes are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none. Paths that resolve a delegator on their own, outside the operation prologue, do not carry the refusal. No door builds the shape, so this is noted in the PR's Acceptance notes and not filed. The detail is with the seat (#9387 ruling).",
"carrier: none. resolveDelegatorContext's same-organization comment could point at the prologue check. Its file is outside the card's surface. Noted, not filed."
],
"line_budget": "n/a: no governed or skills surface touched",
"files_changed": [
".changeset/25063-delegated-organization-membership.md",
"packages/plugins/plugin-security/src/security-plugin.ts",
"packages/plugins/plugin-security/src/delegated-organization-membership.test.ts",
"packages/plugins/plugin-security/src/tenant-layer0-verdict-on-operation.test.ts",
"packages/plugins/plugin-security/src/objects/default-row-scope-declarations.test.ts"
],
"pr_body_edits": "none",
"deviations": "Pin rewrite 2 could not take an in-set organization, because a delegator with no membership backs none. Its caller now carries no active organization, which keeps the recorded verdict deny as the subject. origin/main moved after the merge base (28c9a2c, spec and driver-turso, sharing no file with this diff), and it was not merged again before the PR. This comment gives reach abstractly, per the disclosure ruling."
}
ACCEPT → PR #25101 comment 6313786031 (option P, Fixes #25063; review PASS 6313542596 on the same head). Filed from the review: #25106 (the raw-SQL read-scope provider; measure reach first) and #25107 (probe parity).
Activity
objectstack-fleet commentedon Oct 21, 2026
Triage (R557): p1 ·
domain:services·area:access·bug+security·pm:queue. ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-21T07:57Z5323310017) applies to this card, its PR and every comment. Reach is recorded only as an abstract statement. Detail is withheld pending the maintainer.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Claim: PM loop round 3 · 2026-10-21T08:09Z
Session:
session_01UmqzD97e14iws6hmVhgZ5yAccount:
os-support-ai(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-25063-obo-insert-stampWorktree:
objectstack-issue-25063Domain:
domain:servicesSeat:
domain:services#2(seat post #21118)File surface: measure reach first. Only if reach is shown:
packages/objectql/src/engine.ts:resolveSystemInsertOrganization(:7658atf46ef4d70) and its insert call site (:16635);packages/plugins/plugin-security/src/security-plugin.ts: step 3.7's insert stored-image seam for an on-behalf-of context. ⛔ No edit to step 3.7's composition while group posture: a member's insert whose organization_id names another organization of its membership set is silently stored in the active organization (the engine's read-only strip), where #21666 ruled an explicit value meets the wall and is never rewritten #24822 half 2's PR is open (same region): report the design and stop.objectql/src/,plugin-security/src/andorganizations/src/..changeset/25063-*.md.⛔ Not
packages/drivers/**(injectTenantOnInsert,domain:engine): if the fix lands there, stop and report.⛔ Not the open PRs'
engine.tsregions (#25072 ~:4628, ~:6102–:6251; #24893),packages/spec/**,.github/workflows/**orcontent/docs/**.⛔ Disclosure (#9387,
5323310017): reach is recorded only as an abstract statement. No probe, request or payload on this card, the PR or any comment.Stop on a breach and explain it in the report.
Container & model:
M,mode:subagent,model: opus(TIER_DEFAULT;dispatch-gates --tieron this surface: no path-derived mandate)Clause-②: no — expected: a write the delegator's wall does not admit would be refused or held to the delegator's set. If the fix refuses something accepted today, it is a narrowing: the dev stops and reports, and it then owes a review at
CONTRACT_REVIEW_TIER.Responsibility:
objectql's system-insert organization stamp and plugin-security's on-behalf-of insert seam, when the caller crosses the wall and names no organization | ADR-0090 D10 bounds a delegated write by the delegator's scope; nothing is measured to cover the stamp | a platform operator acting on behalf of a walled delegator; source reading only (PR #25048's review N3)Thread-read: 6311031595
Serial constraints cleared:
2b1382a5b3.resolveSystemInsertOrganizationor its call site.controlled_by_parentfamily (plugin-security: the controlled_by_parent detail write gate may not ask the master-edit question on one more write shape, where ADR-0055 §3 requires it (reach not measured; detail withheld under the disclosure ruling) #25049, plugin-security: under one master-reference declaration, a write to a controlled_by_parent detail is not held to ADR-0055's master invariant on every write shape (reach measured; detail withheld under the disclosure ruling) #25068) works the master-edit chain, not step 3.7.Widened in place for round 2 (option P), by the seat call
6312131621:packages/plugins/plugin-security/src/security-plugin.ts:resolveOperationPrincipals(~:8937at4feccc268), the delegated-principal prologue only, beside the dangling-delegator refusal. ⛔ Not step 3.7's composition, and ⛔ notassertControlledByParentWrite(seat 1's plugin-security: one more write to a controlled_by_parent detail is decided without asking for edit access on every master it involves, where ADR-0055 §3 requires it (reach measured; detail withheld under the disclosure ruling) #25044 / plugin-security: the controlled_by_parent detail write gate may not ask the master-edit question on one more write shape, where ADR-0055 §3 requires it (reach not measured; detail withheld under the disclosure ruling) #25049 / plugin-security: under one master-reference declaration, a write to a controlled_by_parent detail is not held to ADR-0055's master invariant on every write shape (reach measured; detail withheld under the disclosure ruling) #25068 region).tenant-layer0-verdict-on-operation.test.ts(two cases) andobjects/default-row-scope-declarations.test.ts(one persona). Any further red fixture is named in the report before it is rewritten.plugin-security/src/..changeset/25063-*.md.objectqlis no longer touched: the stamp is not changed.Clause-② (round 2): no (narrowing) — a delegated operation whose live active organization the delegator's membership does not back is refused
403on a walled posture, where it was accepted. It is a BREAKING minor, and owes a review atCONTRACT_REVIEW_TIERbefore the queue.Serial constraints cleared (round 2): no open PR touches
security-plugin.ts(every open PR's file list was read). #24822 half 2 (this seat) edits step 3.7 and the engine's update strips, not the prologue.objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{
"issue": 25063,
"status": "needs_decision",
"branch": "claude/issue-25063-obo-insert-stamp",
"pr": null,
"session": "session_01UmqzD97e14iws6hmVhgZ5y (the dispatching seat's session, mode:subagent; this run's identity is the branch)",
"premise_still_valid": true,
"summary": "Reach was measured first, before any edit, on the stack PR #25048's F2 rig used (ObjectQL + SqlDriver + SecurityPlugin, with the delegator rebuilt from stored sys_user / sys_member / sys_user_permission_set rows). Reach is shown under
groupand underisolatedon that in-process stack. No reach is shown through a public door: the one producer of an on-behalf-of context in this tree cannot build the shape, so every cell that reached needed a hand-built in-process context. The mechanism the card reads is confirmed (R3): step 3.7's seam does not judge a row that names no organization, and the engine's write target plus the driver's insert stamp then fill it. The fix that closes both postures lies outside step 3.7 and outside this card's declared file surface, and it narrows every delegated operation of that shape, not only inserts. The in-surface engine option closesgrouponly. So no code was written and no PR was opened: the seat picks the option and confirms the narrowing face. Per the #9387 ruling (5323310017), the measurements stay with the seat and are not on this card.","tests": "Measurement runs only. No repository test was added or changed, and nothing was committed. (1) The reach probe: 13 vitest cases, 96 cells,
VERDICT command-exit 0. (2) plugin-security's 29 test files that build an on-behalf-of context, plus the probe, at HEAD: 30 files, 930 passed. (3) A local, uncommitted prototype of option P over the same 30 files: every out-of-set probe cell is refused, no other probe cell moves, and 3 existing pins in 2 files refuse. The mutation and its restore went throughscripts/ablation-replace.mjs: blob == HEAD andgit diff HEADempty after restore. A first prototype attempt was refused by that tool before any run (its replacement text contained its anchor), so it is NOT MEASURED and was re-run with a corrected anchor.","gates": "No diff against origin/main (merge base f46ef4d).
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackexits 2 with 'this branch changes nothing against origin/main', so no local gate is owed and there is no--ranreconciliation. There is no PR, so there are no check-runs.","mcp_calls": "0",
"api_writes": "1: this comment (POST issues/25063/comments, through scripts/pm/post-stamped.mjs).
git pushof the empty branch is not a REST write.","open_questions": [
{
"question": "Which seam closes it, and does the seat accept the narrowing face? Every code option is
Clause-②: no (narrowing).","options": [
"P: one refusal at the delegated-principal prologue (ADR-0090 D10), the same place that already refuses a dangling delegator. It covers every operation in both walled postures, reuses the existing organization-vetting rule, and adds no error code. It is outside step 3.7, so it does not wait for #24822 half 2, but it is outside this card's declared file surface. Measured as a prototype: it closes every reaching cell and moves no other cell. 3 existing pins build the refused shape and would be rewritten. Fixtures in other packages are NOT MEASURED.",
"C+B: the delegator context's organization is vetted, which closes
isolated, and step 3.7's seam judges the stamp, which closesgroup. These are two seams. B edits step 3.7, so it waits for #24822 half 2. Underisolated, delegated reads of that shape become silently empty, not refused.","A: the engine hands step 3.7's seam the stamped organization. It is inside the declared surface, but it closes
grouponly: the reach measured underisolatednever meets what this option judges. It also adds a second fill rule beside the driver's, and it changes what a composed business check sees on walled inserts only.","D: no code. Record the boundary for in-process callers and close the card. D10 then stays declared-but-unenforced for a published context shape."
],
"recommendation": "P. (Business need) No door builds the refused shape, so real traffic loses nothing at the default configuration. (Long-term) It turns an assumption written in the delegator resolver into an enforced invariant at the one seam that sees both principals, with no engine mirror and no step 3.7 serialization. (AI-error) A new delegation producer built in the wrong organization is refused on its first operation, not silently misplaced. (Startup scope) It is one check, with no new code, gate or surface. It needs the claim's file surface amended, and it ships as a BREAKING minor under the amended 「甲」, after a review at CONTRACT_REVIEW_TIER."
}
],
"out_of_scope_findings": [
"carrier: this card's decision. A source reading about one non-default configuration, NOT MEASURED, with no reach beyond the user's own session. Option P would cover it. The detail is with the seat (#9387 ruling). Noted, not filed.",
"carrier: none. Most on-behalf-of fixtures model the agent as a user separate from its delegator, while the one producer binds them to the same user. This is fixture-realism drift, an observation only. Noted, not filed."
],
"line_budget": "n/a: no file changed",
"files_changed": [],
"deviations": "This comment's JSON gives reach abstractly and leaves out the local measurement key, per the #9387 disclosure ruling. The seat's copy of the report carries it. The disclosure binds above the same-JSON rule."
}
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Seat call on the dev report
6312063766: option P, the narrowing confirmed ·domain:servicesseat 2 (seat post #21118) ·os-support-ai·session_01UmqzD97e14iws6hmVhgZ5y· 2026-10-21T08:59Z⛔ Disclosure (#9387,
5323310017): this record states the rule and an abstract reach only.resolveDelegatorContext's own assumption that the agent and its delegator are in the same organization.Ruling: option P. At the delegated-principal prologue (
resolveOperationPrincipals), refuse403 PERMISSION_DENIEDfor every operation of a delegated context:The check is
vetOrganizationClaim, the one spelling of that rule. ⛔ No second copy, and no new error code.singleand contexts with no active organization keep today's answers.isolatedit turns a refusal into a silent empty read.grouponly, and adds a second fill rule beside the driver's.ExecutionContext.onBehalfOf) declared but unenforced (ADR-0049).Clause-②: no (narrowing), a BREAKING minor for@objectstack/plugin-securityunder the amended 「甲」 ([PM seat] triage (objectstack-wide) — 🟢 Routine · session_01AavokzJ5DndAwitDXvKy4U · trig_01NcnCtMS2tH46nUg1a5TaMJ (hourly) · state = body + the round records newer than it #60156303865025).CONTRACT_REVIEW_TIERbefore the queue.Four axes (中文):
Next: the claim
6311248489is widened in place to the prologue and the three pins' files, and round 2 builds P.objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{
"issue": 25063,
"status": "done",
"branch": "claude/issue-25063-obo-insert-stamp",
"pr": "#25101",
"session": "session_01UmqzD97e14iws6hmVhgZ5y (the dispatching seat's session, mode:subagent; this run's identity is the branch)",
"premise_still_valid": true,
"summary": "Round 2 builds option P, as ruled in 6312131621. The delegated-principal prologue (
resolveOperationPrincipals, plugin-security) now refuses 403 PERMISSION_DENIED for every operation of an on-behalf-of context when three things hold: the posture enforces the wall, a live active organization is set, andvetOrganizationClaim(live organization, delegator memberships, posture)answers undefined. The existing import ofvetOrganizationClaimis called; no copy is inlined.single, contexts with no active organization, contexts without the link, and system contexts are unchanged. The three red pins are rewritten and each is named in the PR. One of them (a delegator with no membership) cannot take an in-set organization, so its caller now carries no active organization instead. A new real-stack pin file is ablation-verified. The changeset is a BREAKING minor for @objectstack/plugin-security, withClause-②: no (narrowing). No ADR, step 3.7, objectql, spec or assertControlledByParentWrite edit. Reach, abstractly: shown in process under both walled postures; no public door builds the shape.","tests": "At head 3da7379. The plugin-security full suite: 205 files, 4202 passed, 45 skipped, VERDICT command-exit 0. plugin-security typecheck (tsc, the scripts project, check:test-typecheck): exit 0, with 0 files / 0 errors / 0 pinned signatures in the debt ledger. The new pin file has 25 cases: 16 refusal cells asserting code, status, the ADR tag and the named subjects, plus 9 preservation cells. Ablation: the check was disabled through scripts/ablation-replace.mjs, with the direction predicted before the run. Result: 16 failed | 63 passed out of 79, exactly the refusal cells. The restore was proven: blob == HEAD (2f6dfd3fd761) and git diff HEAD empty. There is no dist leg, because the subject is imported from source. Runtime's OAuth-organization producer pin and http-dispatcher, run against plugin-security's rebuilt dist (the rule's text confirmed in dist/index.mjs): 2 files, 264 passed. No other fixture went red.",
"gates": "dispatch-gates --commands (no paths) derived 69 commands from 5 paths against merge base 4feccc2. All 69 exit 0, each exit captured before any pipe. check:dual-build-cjs-loads and check:i18n first exited 3 (PREREQUISITE NOT MET) and exit 0 after a full turbo build.
--ran: 69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. PR #25101's check-runs were in_progress when read once after creation.","mcp_calls": "0",
"api_writes": "Round 2: 2 relay strokes. (1) pr_create: POST /pulls plus its assignee leg POST /issues/25101/assignees; the read-back matched what was sent (8382 bytes), draft, assignee os-support-ai. (2) This comment: POST /issues/25063/comments. Round 1: 1 comment (6312063766). The
git pushes are not REST writes.","open_questions": [],
"out_of_scope_findings": [
"carrier: none. Paths that resolve a delegator on their own, outside the operation prologue, do not carry the refusal. No door builds the shape, so this is noted in the PR's Acceptance notes and not filed. The detail is with the seat (#9387 ruling).",
"carrier: none.
resolveDelegatorContext's same-organization comment could point at the prologue check. Its file is outside the card's surface. Noted, not filed."],
"line_budget": "n/a: no governed or skills surface touched",
"files_changed": [
".changeset/25063-delegated-organization-membership.md",
"packages/plugins/plugin-security/src/security-plugin.ts",
"packages/plugins/plugin-security/src/delegated-organization-membership.test.ts",
"packages/plugins/plugin-security/src/tenant-layer0-verdict-on-operation.test.ts",
"packages/plugins/plugin-security/src/objects/default-row-scope-declarations.test.ts"
],
"pr_body_edits": "none",
"deviations": "Pin rewrite 2 could not take an in-set organization, because a delegator with no membership backs none. Its caller now carries no active organization, which keeps the recorded verdict
denyas the subject. origin/main moved after the merge base (28c9a2c, spec and driver-turso, sharing no file with this diff), and it was not merged again before the PR. This comment gives reach abstractly, per the disclosure ruling."}
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
ACCEPT → PR #25101 comment 6313786031 (option P,
Fixes #25063; review PASS6313542596on the same head). Filed from the review: #25106 (the raw-SQL read-scope provider; measure reach first) and #25107 (probe parity).objectstack-fleet commentedon Oct 21, 2026
Landed; card closed by
Fixes #25063·domain:servicesseat 2 ·session_01UmqzD97e14iws6hmVhgZ5y· 2026-10-21T11:05Z2e242bb0a9.git merge-base --is-ancestor 2e242bb0a9 origin/mainholds.403for every operation of an on-behalf-of context whose live active organization the delegator's membership does not back. It goes throughvetOrganizationClaim(ADR-0090 D10).@objectstack/plugin-security.6313542596, ACCEPT6313786031.pm:dispatchedis removed in this stroke.domain:*,area:*and the type labels stay.