Skip to content

plugin-security: the raw-SQL read-scope provider (getReadFilter) does not apply the delegated organization-membership rule PR #25101 enforces at the operation prologue; measure reach first (detail withheld) #25106

Open

Description

@objectstack-fleet

Filing gate ①, the security exception ("may expose data": measure reach first). The source is the isolated contract review of PR #25101 (#25063), boundary flag 1 of 6313542596, which escalated this to the seat as a data path, not probe parity. It is a source reading; reach 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 records only:

  • that the reading exists, and where it lives;
  • the governing text.

⛔ No probe, context shape, request or served value goes on this card, its PR or any comment.

Reader (who acts): triage grades the card. Then the lane that takes it measures reach FIRST, and fixes only if reach is shown.

Where it lives (origin/main at filing)

Governing text

  • ADR-0090 D10: a delegated operation is bounded by the delegator's scope.
  • ADR-0021 D-C: the raw-SQL read scope is the find path's scope.
  • The provider's own lock-step doc.

Dedupe

Searched (semantic): getReadFilter computeDelegatedReadFilter delegated organization membership raw SQL read scope analytics. Hits: #20733, #24164, #21177, #21417, #21080, #20933, #20001, #5815, all closed. None is this reading. #5815 (getReadFilter missing the controlled_by_parent half) is the nearest: same provider, different rule.

Dedupe words: getReadFilter delegated organization not backed · raw SQL read scope on-behalf-of vetOrganizationClaim · computeDelegatedReadFilter prologue parity.

Activity

  1. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Serial after #24932 · domain:services seat 2 (seat post #21118) · session_01UmqzD97e14iws6hmVhgZ5y · 2026-10-21T13:55Z. ⛔ Not a claim, no label change.

  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (re-seated term) · 2026-10-21T14:53Z · p2, domain:services, reach-first under the disclosure ruling (#9387 5323310017)
    Session: session_01UmqzD97e14iws6hmVhgZ5y (the dispatching seat; the dev is a mode:subagent run of this session, told apart by its branch)
    Account: os-support-ai (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-25106-read-scope-org-vet
    Worktree: objectstack-issue-25106
    Domain: domain:services
    Seat: domain:services#2
    File surface: measure reach first. Only if reach is shown: packages/plugins/plugin-security/src/security-plugin.ts, the delegated prologue of getReadFilter / computeDelegatedReadFilter (:5969 / :6092 at edcc8ceae) and nothing else in that file, plus the plugin's tests and .changeset/. ⛔ Not the engine middleware's prologue (resolveOperationPrincipals, which PR #25101 already changed). ⛔ Not service-analytics.
    Container & model: M, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates --tier on this surface: "no path-derived mandate")
    Clause-②: no — expected: if reach is shown, the provider answers the deny sentinel where the operation prologue now refuses. That is a narrowing of a runtime read scope, not a published accept set. If the fix lands, it owes a review at CONTRACT_REVIEW_TIER before the queue, as #25063's did.
    Responsibility: plugin-security's computeDelegatedReadFilter (this lane's code) mirrors the middleware's layers but not the delegated prologue PR #25101 added | the operation prologue resolveOperationPrincipals → vetOrganizationClaim already refuses on the find path; the raw-SQL provider is the one door that does not mirror it | reach not measured: the review called it in-process only, with no door that builds the shape; the dev measures it first
    Thread-read: 6317847384
    Serial constraints cleared: supersedes this seat's note 6317847384. #24932 is no longer in flight: it is in needs-user-decision (6318800595), with no branch commits. So this card goes first in getReadFilter / computeDelegatedReadFilter. #24932's switch, when it is re-dispatched, merges main and reads this change (its dev already priced it: 6318648840 deferred_card_repricing). In flight in this lane: #25096 / PR #25109 (plugin-auth), which is disjoint. Seat 1's queued #25095 is a different region (the detail write gate). No open PR touches security-plugin.ts.

  3. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    pm:dispatched → pm:queue, released before any measurement · domain:services seat 2 (seat post #21118) · session_01UmqzD97e14iws6hmVhgZ5y · 2026-10-21T14:59Z · Thread-read: 6319041191

    Release: session_01UmqzD97e14iws6hmVhgZ5y · Cause: the maintainer's word in this session's chat, verbatim: 「你可以下班了」 and then 「当前任务不用开发了」 (sign off now; the current task is not to be developed). The seat stopped its dev run · Goes to: pm:queue; this write clears the assignee.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:servicespm:queuepriority:p2Medium: important, M3security

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions