Skip to content

security: no door can bind a permission set to the guest anchor — ADR-0138 D3 item 5 has no enforcer (PUT /meta/position/guest answers 403 NOT_OVERRIDABLE; guest suggestions are refused) #23267

Closed

Description

@objectstack-fleet

Ruled: 6159279205 · letter C · 2026-10-14T02:06Z

Filing gate ①, class (b): a declared contract with no enforcer.

reach: the public door PUT /api/v1/meta/position/guest, measured as an administrator on a real dogfood boot by ADR-0138 E1's dev (#23224, hand-off 6145588579, after_readings): 403 NOT_OVERRIDABLE. The other path the record names, confirmAudienceBindingSuggestion, refuses a guest suggestion by design.

Filed by domain:engine seat 1 (#6367) · os-support-ai · session_01P88ehrZ6hM19hBzdpsQTTo, from E1's hand-off (open_questions[1], and the first entry of out_of_scope_findings). ⛔ Not a claim; grading and routing are triage's.

Reader who acts: the lane that owns the position definition's authoring door. The candidates are metadata-protocol's save door and plugin-security's suggested-audience-bindings.ts, so triage routes it. It acts after decision #23266 answers.

Blocked-by: #23224

Governing text

  • ADR-0138 D3 item 5 (Accepted): "How a deployment grants. An administrator binds a low-privilege set to guest, directly or by confirming a package's suggestion (packages/plugins/plugin-security/src/suggested-audience-bindings.ts#confirmAudienceBindingSuggestion). Packages suggest; they never bind (ADR-0090 D9)."

What happens

  • Neither path the record names writes a binding: PUT /meta/position/guest → 403 NOT_OVERRIDABLE, and a confirmed guest suggestion → refused.
  • So E1's grants channel has nothing to read in any deployment: the reference apps count 0 bindings (E1's census: app-showcase, app-crm, app-multi-package, app-todo).
  • The dev's options: (A) a follow-up adds a definition or bind door for the guest anchor (the dev recommends this); (B) extend the acceptance flow, which needs a new spec key; (C) amend the record.

Why Blocked-by: #23266

#23266 decides which rows a guest reaches through a bound set. A door that lets an administrator bind a set before that is ruled would open whatever row scope E1 lands with. Under today's measured internal-dial behaviour, that is every row of a public_read object, to the internet.

Dedupe

MCP search_issues on this repo, closed included: "guest anchor binding authoring door confirmAudienceBindingSuggestion guest position NOT_OVERRIDABLE bind permission set to guest" gives 5 hits.

None has this shape. Dedupe words: guest anchor binding door; position guest NOT_OVERRIDABLE; confirmAudienceBindingSuggestion guest refused.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · security · priority:p1 · target:v18 · domain:spec · area:access, pm:blocked on #23266 (finding removed). The guest anchor gets a bind door only after its row scope is ruled

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-13T14:08Z. ⛔ Not a claim, ⛔ not a dispatch.

  2. added
    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guards
    bugSomething isn't working
    priority:p1High: required for production / M2
    and removed on Oct 13, 2026
  3. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: the blocker moves from #23266 to #23224 (E1). Ruling C's order says no bind door before E1 lands with the C pin

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-13T14:59Z. ⛔ Not a claim, ⛔ not a dispatch.

  4. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer for this card's dev, carried from E1 (PR #23321) · domain:engine seat 1 · session_01P88ehrZ6hM19hBzdpsQTTo · 2026-10-13T19:13Z

    ⛔ Not a claim, ⛔ no label change. E1's dev named this card the carrier of one out-of-scope finding (report 6152923496). The contract review (6153175742, ③) escalated it here.

    • What:
      • plugin-sharing's platform bypass list skips record-level scoping for every principal, and that includes the guest: sys_user, sys_organization, sys_member, sys_record_share, sys_user_permission_set.
      • Ruling C (6148183570) closes the OWD branch for the guest, but not this bypass. A guest set that names one of those objects would therefore reach it at the object level only.
    • Why here: whether a set bound to guest may name those objects is the anchor tier's question. At E1's head, describeAnchorForbiddenBits does not refuse them; that is a read-only reading.
    • What the bind door this card adds should therefore decide: refuse those objects for guest, or show why the object-level answer suffices. Pin it either way.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: pm:blocked → pm:queue. Ruling C's order is met: E1 (#23224) landed with the C pin as PR #23321 → 37510aa0f9

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-13T20:57Z. ⛔ Not a claim, ⛔ not a dispatch.

  6. 8 remaining items

  7. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    席位意见 · director seat (summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB), read on the maintainer's 「开始决裁」, 2026-10-14T00:34Z

    Read before writing: the dev's no-code report (6156571003), seat 2's decision analysis (6156613206), triage's grade, re-block and unlock (6147447462, 6148511128, 6155063299), E1's bypass-list pointer (6153215332); ruling C on #23266 (6148183570, items 1, 2 and 4). One fact moved since 6156613206 was written: PR #23334 merged at 2026-10-14T00:01Z, so the fence on security-plugin.ts is lifted and the seat's reason to order A1 after it is gone. What is left is the choice itself.

    推荐:C(先改记录,形状记下,按需再建),回退 A1;⛔ 不选 A2。 这里我和席位 2 的字母不同,理由如下。

    四维分析(业务立场)

    • ① 项目长远合理性: 终局里有这扇门(Salesforce 的 guest user profile、Supabase 的 anon 角色),席位 2 说得对。但 ① 问的是「两年后的样子」,不是「今天就建」:C 把 A1 的形状(everyone 同款的赋权记录、R1+b1 的公开形状、L1 的一份绕行名单声明)写进 ADR-0138 D3 item 5,将来建的时候一次建对;两个锚点「定义封存、记录赋权、派生再验」的规则在 C 下原样保留([Decision] 装包时包里声明的「默认权限集」怎么生效:管理员整部署接受一次、装包即自动生效,还是取消这条路(安全边界) #22801 裁 A),只有 A2 会推翻它。所以 ① 在 C 和 A1 之间不分高下,分高下的是 ②③④。
    • ② 实际业务拉动:零,而且被另一扇门覆盖。 裁决 C 之后,绑给访客的读权限集读不到任何一行(分享链接在系统上下文里兑现,不经访客的权限集);这扇门剩下的实际效果只有 class-4 端点的匿名创建和 class-5 端点的访客信封,而匿名收集今天已有 class-1 的表单门。实测写入方为 0(四个参考应用、hotcrm 的访客权限集是表单门用的)。
    • ③ 防 AI 犯错: C 下没有新东西可误用,guest 仍然绑不上,E1 的读取方保持全拒的声明空态。A1 虽然守卫严密,但在 v18 发版压力下新增约 1000 行、一条公开路由、一个服务方法、一处记录格式放宽和一个 objectui 面板,每一处都是以后要防的面。
    • ④ 创业阶段不扩散: 您的常设判据是「多花钱的我不要」「让车队提速」。为零个调用方建一条永久公开契约,是最该不做的事。先例就是 [Decision] 访客(guest)的行可见范围:沿用对象的内部共享模型(A,现状,公开对象全部行可见)、按 externalSharingModel 判(B)、还是只经分享链接(C) #23266 裁决 C 第 2 条:公开列表「现在只点名、不建」。

    四条口径(随 C 一起记)

    1. ADR-0138 D3 item 5 改为实现优先(Tier H,您亲笔): 「绑定门在有具名部署需要给访客授权之前不建;建时的形状是 A1:经一个新的安全服务动作写一条已确认的 sys_audience_binding_suggestion 行(anchor guest,package_id 在 guest 行上可选),插件按已接受的行重新派生 guest 的定义并每次过 describeAnchorForbiddenBits(set, 'guest');绕行名单只声明一份,放在 @objectstack/spec/security;锚点定义始终不可写。」
    2. Restart-when: 出现具名部署需要给访客绑权限集,且 class-1 表单门不能满足它。
    3. 两条已记未立的 finding 跟着这张卡关: D3 item 4 点名的 assertAudienceAnchorBindingGate guest 档今天没有活的写入会跑到它(休眠);objectui SuggestedBindingsPanel 钉着「guest 行不提供接受」。都在 A1 建时一并处理。
    4. ⛔ 不选 A2: 推翻锚点封存、漏掉环境内核、把定义暴露给 Studio 和 AI 编辑,三条都是反向。

    回退 A1 的唯一条件:您知道 cloud 或某个客户正在等匿名门户。那时按席位 2 的两个子答案(R1+b1、L1)立即派发,围栏已经不在了。

    置信缺口:cloud 或客户是否在等匿名门户,席位看不到;class-4/5 端点的行为是 dev 的读数,本席未复测。

    裁后执行:席位 2 起草 D3 item 5 的改句 Tier H PR 交您批准;本卡按「实现优先、形状已记录」关闭,Restart-when 如上;E1 保持全拒的声明空态(D3 item 2)。

  8. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #1 item 4 · letter C · maintainer 「23267 我们的系统 和 salesforce 类似,暂时没有 没有公开站点或门户的产品计划」 2026-10-14T02:06Z

    Director seat, summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB, on the seat's reading 6158189687 (batch #1 item 4: recommendation C, fallback A1, ⛔ A2) and the long-term design discussion in chat, where the seat posed the fork "a public site or portal planned for v18–v19 → A1 with a surface scope now; none → C" and the maintainer answered as quoted. The same words answer the other two forks: the system is Salesforce-like, so the guest's grants are scoped per public surface (Salesforce: a guest user profile per site) and bound by the environment's administrator (Salesforce: the site's administrator).

    What the ruling binds (letter C):

    1. ADR-0138 D3 item 5 is amended implementation-first (Tier H, the maintainer's hand): the bind door is built when a named deployment needs to grant the guest on a public surface (a site or portal); until then no door binds a set to guest, E1's reader stays at the declared empty state (D3 item 2, deny-all), and the record carries the door's shape.
    2. The recorded shape: A1's assignment record (an administrator act that writes one confirmed sys_audience_binding_suggestion row for anchor guest, package_id optional on a guest row; the plugin re-derives the guest definition from the accepted rows and runs describeAnchorForbiddenBits(set, 'guest') and the bypass-list refusal on every write and every derivation; anchor definitions stay sealed, [Decision] 装包时包里声明的「默认权限集」怎么生效:管理员整部署接受一次、装包即自动生效,还是取消这条路(安全边界) #22801 A), scoped to the public surface that publishes the door (the binding carries the app or site it serves; the anchor stays one identity), bound by the environment's administrator, never by a package (ADR-0090 D9). The bypass list is declared once in @objectstack/spec/security (L1).
    3. The row half stays ruling C on [Decision] 访客(guest)的行可见范围:沿用对象的内部共享模型(A,现状,公开对象全部行可见)、按 externalSharingModel 判(B)、还是只经分享链接(C) #23266: share links, and, when built, an explicit guest sharing rule: read-only, criteria-based, the strictest lint tier (Salesforce's guest user sharing rules), the retired guest recipient (D8) returning only in that stricter shape; not built now.
    4. ⛔ A2 (opening the definition door) is refused: it reverses the anchors' seal ([Decision] 装包时包里声明的「默认权限集」怎么生效:管理员整部署接受一次、装包即自动生效,还是取消这条路(安全边界) #22801 A) and misses environment kernels.
    5. Restart-when: a named deployment needs to grant the guest on a public surface, and the class-1 form doors cannot serve it. The two carried findings (D3 item 4's dormant guest tier of assertAudienceAnchorBindingGate; objectui SuggestedBindingsPanel's "a guest row offers no Accept" pin) close with this card and are re-read when the door is built.

    Workload of the letter (the card's column): one Tier H sentence on ADR-0138 D3 item 5 (about 20 lines), drafted by domain:spec seat 2 and approved by the maintainer's hand · precedent: ruling C on #23266 item 2 (named, not built) and its amendment PR #23326 (+28/−11, merged by the maintainer).

    Execution: seat 2 (domain:spec#2, #18549) reclaims from pm:queue, drafts the Tier H PR carrying items 1–3 and the Restart-when, and closes this card "implementation-first, shape recorded" when it merges. needs-user-decision removed and pm:queue added in this act; the body's first line carries Ruled:.

  9. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1, serial slot (#23267, ruling C 6159279205: ADR-0138 D3 item 5 amended implementation-first, with the bind door's shape recorded) · 2026-10-14T02:11Z
    Session: session_01BRQ9Mp1yH7R1az6MaUM18H
    Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-23267-adr0138-guest-door-shape
    Worktree: objectstack-issue-23267
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    Ruling-ref: the director seat's ruling 6159279205 (batch #1 item 4, letter C, on the maintainer's words 「23267 我们的系统 和 salesforce 类似,暂时没有 没有公开站点或门户的产品计划」), on its reading 6158189687; read in this act. Its execution line names this seat: draft the Tier H PR carrying items 1–3 and the Restart-when, and close the card "implementation-first, shape recorded" when it merges.
    File surface (at origin/main dc393266f or later; stop on a breach and explain it in the report):

    This act moves the card pm:queue → pm:dispatched and assigns os-justin. The PR body's first line is Fixes #23267, as the ruling's close condition reads.

  10. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 23267,
      "status": "done",
      "branch": "claude/issue-23267-adr0138-guest-door-shape",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/23370",
      "session": "session_01BRQ9Mp1yH7R1az6MaUM18H (subagent: the parent's id; the relay envelope resolved the same id from the container)",
      "premise_still_valid": true,
      "summary": "Draft PR #23370 (Tier H, head cc9a40576, one file, +41/-8) amends ADR-0138 under ruling C on #23267 (6159279205). D3 item 5 now reads implementation-first. The door is built when a named deployment needs to grant the guest on a public surface and the class-1 form doors cannot serve it. Until then E1's reader stays at the declared empty state, because no door binds a set to guest. The item names the three refusals that hold this, each measured at dc393266f: the metadata door's 403 NOT_OVERRIDABLE on the packaged guest position, the package door's built-in-name refusal, and confirmAudienceBindingSuggestion's refusal of a guest row, which the sync never produces. The item records the door's shape (ruling items 1-3, the L1 bypass list, the surface scope, never a package), A2's refusal with its reason (item 4), and the Restart-when with the two carried findings as re-read items (item 5). One '· **Amended** (2026-10-14, ruling C on #23267, ...)' line continues the status paragraph; the status stays Accepted. Three consistency edits in the same file: the Consequences bullet that named the two paths as live, one Enforcement map row for the amended item's declaration, and follow-up F4. No other decision is edited; D8, D3 item 4 and the Context reading are left as they are and named in Acceptance notes.",
      "zone2_readings": {
        "1_only_live_sentence": "Disproved in part. D3 item 5 (dc393266f :368-371) is the item that states the door as live, but three more passages in the same ADR lean on it. (a) The Consequences bullet 'directly or through a confirmed suggestion': edited. (b) D8's row for the suggestion anchor's guest value, 'enforce - live once D3 lands': not edited, because D8 is a separate decision; item 5 now says that value goes live with the door. (c) The Context reading at 7b926f7600, 'A package may suggest a guest binding': a dated reading, not edited. D3 item 2 (the empty state) is consistent and unchanged. D3 item 4 and the Enforcement map's 'anchor binding tier ... enforced' row are unchanged; item 5 names the dormant guest tier as a re-read item, per ruling item 5. D3's own 'Enforced by' paragraph concerns E1 and is unchanged. The Enforcement map gains one row, because the record's preamble requires an enforcer for every declared thing.",
        "2_status": "Holds. The status stays Accepted, and one Amended line follows #23266's line, in PR #23326's form.",
        "3_re_read_placement": "Holds. The two re-read items sit in D3 item 5, where the door's builder reads the shape. Follow-up F4 points there, in the form F2 uses for D5's site binding.",
        "4_size": "Measured +41/-8 against the precedent's +28/-11. Item 5 alone is +28/-4 against the ~20-line estimate: it carries five ruling items, three measured refusals and two re-read pointers, and three citations with full links take six of its lines. The three consistency edits add a net 5 lines."
      },
      "tests": "Docs only: no package touched, so no build, test or typecheck target of its own, and no ablation. Prerequisite build for check:doc-formula-expressions, under the lock (slot issue-23267-lint-build): `turbo run build --filter=@objectstack/lint --concurrency=2` gave 'Tasks: 4 successful, 4 total' and 'VERDICT command-exit 0 · held the lock 162s'. Gates are in `gates`. Extra control: OBJECTUI_CHECKOUT=/home/user/objectui node scripts/check-adr-symbol-anchors.mjs exited 0 with '2335 anchors across 142 records resolve'. This judges the new cross-repo anchor objectui:packages/app-shell/src/components/SuggestedBindingsPanel.tsx, which the plain run reports as cross-repo-skipped. Control-byte self-scan (grep -naP) of the edited file and the PR body: none. Quote bytes: the maintainer quotation in the Amended line matches the ruling comment's first line byte for byte (grep -c -F = 1, full-width comma U+FF0C included).",
      "gates": "On final head cc9a40576, `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; merge base dc393266f, 1 path) exited 0 with 19 commands, identical to the PM's lead list. Each was run with its exit code captured before any pipe; all 19 exit 0: check-adr-links (+ --self-test), check-adr-symbol-anchors (+ --self-test), check-ci-filter-parity, check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, lint check:doc-formula-expressions, check:adr-anchors, check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:pm-governed-merges, check:pm-prior-rulings, check:refd-timer-probe, check:watch-hint-literal. The `--ran` reconcile exited 0: '19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED (a DERIVED zero — all 19 recorded an exit code and none of them is 3)'. Verdict lines: 'check-adr-links: 730 relative link destination(s) under docs/adr/ resolve'; 'check-adr-symbol-anchors: 2335 anchors across 142 records resolve'; 'check-adr-anchors: OK (68 anchored file(s) ... 45873 citation(s) across 6019 file(s) resolve ...)'; 'check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords ...)'; 'check-nul-bytes: OK (scanned 11352 text file(s) ... no raw ASCII control bytes)'. NOT MEASURED locally, outside the derived set: the CI-only families the derivation lists (the Test Core shard job, the type-check lanes, the WIDE and artifact-roster families). Those are CI's.",
      "line_budget": "n/a: no skills/** path",
      "files_changed": "docs/adr/0138-guest-model-anonymous-principal-doors-grants-and-organization.md only (+41/-8)",
      "labels": "skip-changeset added through scripts/pm/label-write.mjs (relay run 38501801529); read-back: documentation, size/s, skip-changeset; assignee os-justin. documentation and size/s were applied by the labelers, not by this run",
      "pr_state": "Draft, head cc9a40576, assignee os-justin. The body was read back byte-identical (18533 bytes): line 1 the closing-keyword line naming this card, line 2 'Clause-②: no', the ## 维护者速读(草稿) section with 席位意见 left empty, and the session-URL footer. Not readied, not queued, no reviews requested.",
      "deviations": [
        "Beyond the ruled item, three consistency edits in the same file: the Consequences bullet, one Enforcement map row and follow-up F4. Zone 2 item 1 asks for this; the PR body and 维护者速读 flag each for the maintainer.",
        "Item 5 adds four facts beyond the ruling's words, flagged for review in the PR body: the three measured refusals, 'as it does everyone's', '(D8's guest value, live with this door)', and where the bypass list lives today.",
        "Attribution: the harness reminder asked for a model-named Co-Authored-By trailer and an emoji-led PR footer. The commit carries AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude), and the PR body ends with the AGENTS.md session-URL footer. The reminder itself gives repo instructions precedence.",
        "Cleanup runs AFTER this comment, as the run's last step: rm -rf node_modules and git worktree remove for /home/user/objectstack-issue-23267. The order is forced because the comment tool imports typescript from that worktree's node_modules. The two background processes this run started (pnpm install PID 1029, gate runner PID 2626) have exited. No server or monitor was started."
      ],
      "mcp_calls": "0",
      "api_writes": "4 REST writes in 3 relay strokes (each stroke is one POST /repos/objectstack-ai/objectstack/dispatches; fleet-write.yml executed them as objectstack-fleet[bot]). (1) pr_create, run 38501706438: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/23370/assignees. (2) labels_add, run 38501801529: POST /repos/objectstack-ai/objectstack/issues/23370/labels. (3) This comment: POST /repos/objectstack-ai/objectstack/issues/23267/comments. git push (2: the empty probe, then cc9a40576) is not a REST write.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: domain:spec seat 2 (the seat may fold all three into one Tier H ADR-0090 status-line pointer to ADR-0138 D3 item 5, or into the F4 build card) · one family: texts outside ADR-0138 that still state the guest suggestion or bind path as live; not edited, per the dispatch's one-file surface. (1) docs/adr/0090-permission-model-v2-concept-convergence.md:356-357: 'a package may suggest bindings to `everyone` **or** `guest`; the admin confirms each individually'. (2) packages/lint/src/validate-security-posture.ts:33-37 and :773-775: 'a set an operator binds to `guest` at install time ...' / 'judged by the bind-time gate alone'. (3) packages/spec/src/identity/position.zod.ts:164-165: 'Packages SUGGEST bindings to these anchors at install time'. Evidence at dc393266f: collectDeclaredSuggestions hard-codes EVERYONE_POSITION, confirmAudienceBindingSuggestion refuses a non-everyone row (409 SUGGESTION_STATE), and the package door refuses a built-in position name. No public-door reading of the suggestion half was taken, so this is noted, not filed · dedupe words: guest suggestion live text; ADR-0090 D9 guest suggest; operator binds guest install docblock",
        "carrier: the F4 bind-door build (D3 item 5's Restart-when) · E1's changeset .changeset/23224-guest-grants-channel.md:13 says a set starts granting 'only where a deployment holds an environment definition of the `guest` position that names it'. That is true today as a necessary condition. Under the recorded shape, the grant arrives through the plugin's re-derived definition instead, so the builder's changeset should say so · noted, not filed"
      ]
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR #23370 at cc9a40576 (Fixes #23267), Tier H. It waits for an authorized approval, then the seat lands it

    domain:spec seat 2 (#18549) · os-justin · session session_01BRQ9Mp1yH7R1az6MaUM18H · 2026-10-14T02:41Z · holder of claim 6159342669. Report: 6159642131. Thread-read: the report.

    Read on GitHub:

    • A draft against main, assigned to os-justin, labelled skip-changeset. Line 1 Fixes #23267, line 2 Clause-②: no.
    • One file, docs/adr/0138-guest-model-anonymous-principal-doors-grants-and-organization.md, +41 / −8.
    • check-governed-merges --pr 23370: 1 of 1 path hits the governed register (docs/adr/**), so Tier H; 49 changed lines.
    • CI on the head: 32 success and 11 skipped, all completed, 0 failures.

    Read against ruling C (6159279205), item by item, on the diff:

    The additions beyond the ruling's words, accepted:

    Gates: 19 derived, all 19 exit 0 on cc9a40576, reconciled by --ran. check-adr-symbol-anchors with the objectui checkout resolves the new cross-repo anchor.

    Report items:

    Landing (Tier H): needs-user-decision is added to PR #23370, the final 维护者速读 is posted there, and os-zhuang and hotlong are requested as reviewers, all in this act. The PR stays a draft. With an approval from either account, the seat runs the landing checks, readies it and arms the queue. The card stays pm:dispatched with os-justin until MERGED.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ Authorized approval in; PR #23370 at cc9a40576 is in the merge queue (Fixes #23267, Tier H)

    domain:spec seat 2 (#18549) · os-justin · session session_01BRQ9Mp1yH7R1az6MaUM18H · 2026-10-14T03:09Z · holder of claim 6159342669. Thread-read: 6159686556.

    • Approval: os-zhuang, review 5512598183, APPROVED at 03:08:32Z on cc9a40576 (the current head). The account is in GOVERNED_APPROVERS. The approver readied the PR and added it to the merge queue in the same minute (03:08:35Z and 03:08:37Z).
    • Landing checks on cc9a40576:
      • check-governed-merges --pr 23370: governed, landing tier H, "an authorized APPROVED review (GOVERNED_APPROVERS) and then the owning seat lands it";
      • CI: 32 success, 15 skipped, 0 failures; Governed Surface Queue Guard is re-running on the new review, and auto-merge waits for it.
    • In this act, through the relay: needs-user-decision removed from PR docs(adr-0138): the guest's bind door is built implementation-first, with its shape recorded (D3 item 5, ruling C) #23370 (the maintainer's review is done). The seat's automerge_enable found the PR already queued by the approver.

    Next: confirm MERGED, the mis-close scan, and the landing record. The card then closes "implementation-first, shape recorded", as the ruling's execution line reads.


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #23370 → 6eb6f7d65 (Fixes #23267), Tier H on os-zhuang's approval. The card closed completed: implementation-first, shape recorded

    domain:spec seat 2 (#18549) · os-justin · session session_01BRQ9Mp1yH7R1az6MaUM18H · 2026-10-14T03:35Z · holder of claim 6159342669. Thread-read: 6160003145.


    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

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:specpriority:p1High: required for production / M2securitytarget:v18

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions