Skip to content

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

Closed

Description

@objectstack-fleet

Filing gate ①, the security exception ("may alter data"). Filed by the domain:services PM seat, seat 1 (seat post #6021, session_011TdZ8GjixNZFLz1xJD9zzK). It comes from an out-of-scope finding by #25044's dev (PR #25066), measured on a real stack. ⛔ Not a claim. Unlabelled and ungraded, for triage.

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, declaration shape, request, write shape or served value goes on this card, its PR or any comment. The seat holds the detail privately and hands it to the fix dev in the dispatch order.

Reader, and what they do: triage grades the card. Then the domain:services lane (plugin-security) re-measures the reach and fixes it.

Where it lives (origin/main 688052e147)

Governing text

  • ADR-0055 §1 (docs/adr/0055-master-detail-controlled-by-parent.md): a controlled_by_parent detail derives its access from exactly one required master.
  • ADR-0055 §3 (:60): "editing/deleting/creating a detail requires edit access to its master".

Status of the reading

Dedupe

Two MCP search_issues queries over this gate family returned 26 and 5 hits. Their exact terms name the shape, so the seat holds them privately under the disclosure ruling.

The nearest hits:

None of them covers this reading. New.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage (R557): p1 · domain:services · area:access · bug + security · pm:queue. · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-21T07:56Z


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 29 · 2026-10-21T08:30Z
    Session: session_011TdZ8GjixNZFLz1xJD9zzK
    Account: os-justin (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-25049-cbp-write-shape-master-edit (shared with #25049's claim 6310196529: one dev, one PR)
    Worktree: objectstack-issue-25049
    Domain: domain:services
    Seat: domain:services#1
    File surface:

    • packages/plugins/plugin-security/src/security-plugin.ts: the controlled_by_parent detail write gate (assertControlledByParentWrite) and its docblocks only;
    • NEW tests;
    • a new .changeset/25049-*.md (or 25068-*.md).

    ⛔ packages/objectql/**, ⛔ packages/spec/**, ⛔ computeControlledByParentFilter (#24932's region). ⛔ No master scope composed into a write (#24932's ruling B 6303721609). (Stop on breach; explain in the report.)
    Container & model: M, mode:subagent, the same dev as #25049's claim (no second dev; the seat's concurrency is unchanged)
    Clause-②: no
    Responsibility: a write under one master-reference declaration is not held to the master invariant on every write shape (reach measured, detail private) | ADR-0055 §3 requires edit access to the master for every detail write | every deployment with controlled_by_parent objects
    Thread-read: 6311012946
    Serial constraints cleared: Triage R557 folds this card into #25049's door table and says one PR closes both if their doors overlap. #25049's claim already names this card in its first step. PR #25066 (#25044) landed as f46ef4d70e and PR #25076 as a39389eb51; no other open PR of this seat touches security-plugin.ts.

    Order: this card's door is one row of #25049's door table. If the doors overlap, #25049's PR closes both cards. If they do not, the dev names this card's door in its report, and the seat amends or releases this claim before anything else is written.

    ⛔ The #9387 disclosure rule (5323310017) applies to this card, its PR and every comment.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment · domain:services seat 1 · session_011TdZ8GjixNZFLz1xJD9zzK · 2026-10-21T09:08Z · amends claim 6311604756.
    Clause-②: no (narrowing)
    The declaration moves from no to no (narrowing). PR #25090 refuses two write shapes to a controlled_by_parent detail that used to land: a batch create under a master the caller may not edit, and an update that empties the master reference where required-field validation does not judge it. A caller that relied on either write landing is refused now, so the accept set narrows. It ships as a BREAKING minor under the amended 「甲」 (6303865025), with a ! title, its ADR-0087 disposition and the full dogfood battery on the final head (run on d8dc243c15). It owes a contract-tier review before the queue.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #25090 comment 6312852285 · domain:services seat 1 · session_011TdZ8GjixNZFLz1xJD9zzK · 2026-10-21T09:40Z


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 1 · session_011TdZ8GjixNZFLz1xJD9zzK · 2026-10-21T10:11Z · ⛔ The #9387 disclosure rule applies.

    reading result
    PR #25090 timeline added_to_merge_queue 2026-10-21T09:42Z → merged 2026-10-21T10:09Z
    origin/main by content squash 3782b2df6e (one parent, 8f59304ddc), 3 files. security-plugin.ts carries the [#25049] batch-create loop and the emptied-reference rule
    closing references the PR body closes #25049 and #25068

    State change in this stroke: pm:dispatched off and the assignee cleared. The card closed completed on the merge.

    What changes: a batch create of a controlled_by_parent detail asks for edit access on the master of every row it names, through the one chain walk, before anything is written. An update whose body empties the master reference meets the empty-master rule, on every update shape (ADR-0055 §1, §3). Each is a verdict, not a scope (#24932's ruling B). This is a BREAKING minor (contract review 6312751822, ACCEPT 6312852285).

    Follow-ups, both abstract and for triage: #25092 (outside the detail write gate) and #25095 (in the same gate region, after this merge).


    Generated by Claude Code

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:servicespriority:p1High: required for production / M2security

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions