Skip to content

main red: Dogfood Regression Gate (2/3) fails permission-set-clone-door after PR #30222 (member_default grants sys_comment) #30255

Open

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

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).

维护者速读

PR #30222(#30108,让 member_default 授予 sys_comment / sys_activity)合入后,main 上 CI 连续两次红在 Dogfood Regression Gate (2/3):6f095b9c 和 797f9257。红的是同一个用例:permission-set-clone-door.dogfood.test.ts 把平台权限集克隆进出货包的定制包时,被 spec 校验拒绝,原因是被克隆的集合现在授权了 sys_comment,而这个对象不在该包的对象里。合并队列跳过 dogfood 分片,所以没拦住(同 #29991、#30198)。⛔ 不能跳过或放宽这个测试;也不能为了过测试撤销 #30108 的裁决,修法在克隆门或校验对平台对象的处理上。

Measured

  • CI on main:
  • 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

Graded p0: main is red (main-red rule ①).


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    priority:p0Critical: blocker, must ship before MVP
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

    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).

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

    Bleed stopped · 2026-11-05T05:09Z

    Reading Value
    Revert PR #30262 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.

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p0Critical: blocker, must ship before MVP

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions