Skip to content

docs(adr-0138): the guest reaches rows through share links only, never the object's sharing model (D3 item 6, ruling C) - #23326

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-23266-adr-0138-guest-row-scope
Oct 14, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-23266-adr-0138-guest-row-scope

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #23266
Clause-②: no

This executes item 3 of the maintainer's ruling C on #23266 (comment 6148183570, 「同意」, on the director seat's reading 6148041259). ADR-0138 D3 item 6 drops "through the object's declared sharing model and". It now says the guest reaches rows through share links (and, when it exists, an explicit guest sharing rule), never through the object's sharing model. ADR-0090 D9 and D11 are unchanged. The PR has no code path: E1's code is PR #23321.

Widened before approval. On the seat's answer 6153761503 (option A), two more passages of the same record now match ruling C as well: the Consequences bullet and item 3 of "What the ruling did not settle" (sections 4 and 5 below). This lets the one Tier H approval cover a record that does not contradict itself.

Tier H (docs/adr/**). This PR stays a draft until the maintainer approves it. Before that approval no seat readies it, queues it or arms auto-merge.

Drafted by the os-dev agent that domain:engine seat 1 dispatched (session_01P88ehrZ6hM19hBzdpsQTTo), on the claim 6153293163.

The change: one file, +28 / −11

docs/adr/0138-guest-model-anonymous-principal-doors-grants-and-organization.md changes in four places:

  • D3 item 6 (sections 1 and 2);
  • one new line continuing the status line (section 3);
  • the Consequences bullet "The guest is one principal on one pipeline." (section 4);
  • item 3 of "What the ruling did not settle" (section 5).

Nothing else in the file changes. The "Decided by" block is left as it is, and ADR-0090 is untouched.

D3 item 6, exact before and after

Before:

6. **Row scope: one pipeline.** The guest's grant is evaluated by the same row-level pipeline as
   every caller, with no guest special case. The guest owns nothing (D1), so it reaches rows only
   through the object's declared sharing model and through share links — ADR-0090 D9's division of
   labour (the guest position answers which object classes are reachable at all, share links answer
   which records), and D11's statement that the guest is not an OWD audience. Card E1 pins the
   guest's row scope for each sharing model before it lands; a result that departs from that
   division of labour is that card's finding to raise, not a choice to make silently.

After:

6. **Row scope: one pipeline.** The guest's grant is evaluated by the same row-level pipeline as
   every caller, except that the guest never takes the pipeline's sharing-model (OWD) branch:
   neither `sharingModel` nor `externalSharingModel`. The guest owns nothing (D1), so it reaches
   rows only through share links (and, when it exists, an explicit guest sharing rule), never
   through the object's sharing model — ADR-0090 D9's division of labour (the guest position
   answers which object classes are reachable at all, share links answer which records), and D11's
   statement that the guest is not an OWD audience. Card E1 pins the guest's row scope for each
   sharing model before it lands: with a bound read set and no share link, `private`,
   `public_read`, `public_read_write` and `controlled_by_parent` each read zero rows. This scope is
   the maintainer's ruling C on [#23266](https://github.com/objectstack-ai/objectstack/issues/23266)
   ([`6148183570`](https://github.com/objectstack-ai/objectstack/issues/23266#issuecomment-6148183570)),
   which answered the finding E1 raised under this item; the explicit guest sharing rule is named
   by that ruling and not built.

1. The ruled sentence (ruling item 3)

Before:

The guest owns nothing (D1), so it reaches rows only through the object's declared sharing model and through share links — ADR-0090 D9's division of labour (…), and D11's statement that the guest is not an OWD audience.

After:

The guest owns nothing (D1), so it reaches rows only through share links (and, when it exists, an explicit guest sharing rule), never through the object's sharing model — ADR-0090 D9's division of labour (…), and D11's statement that the guest is not an OWD audience.

2. Consistency with ruling C, beyond the ruled sentence (both inside D3 item 6)

2a. The first sentence of item 6. Under C, "with no guest special case" is no longer true. E1's implementation (PR #23321, SharingService.buildReadFilter in plugin-sharing) returns deny-all for the guest before the sharing-model branch, so the row-level evaluator now has a guest branch. The new wording takes ruling item 1's words ("the guest does not take the OWD branch (neither sharingModel nor externalSharingModel)").

Before:

The guest's grant is evaluated by the same row-level pipeline as every caller, with no guest special case.

After:

The guest's grant is evaluated by the same row-level pipeline as every caller, except that the guest never takes the pipeline's sharing-model (OWD) branch: neither sharingModel nor externalSharingModel.

2b. The last sentence of item 6. It told E1 to raise any departure from the division of labour. E1 raised one, and ruling C answered it. The pin now states what ruling item 1 states, and the sentence records which ruling set the scope.

Before:

Card E1 pins the guest's row scope for each sharing model before it lands; a result that departs from that division of labour is that card's finding to raise, not a choice to make silently.

After:

Card E1 pins the guest's row scope for each sharing model before it lands: with a bound read set and no share link, private, public_read, public_read_write and controlled_by_parent each read zero rows. This scope is the maintainer's ruling C on #23266 (6148183570), which answered the finding E1 raised under this item; the explicit guest sharing rule is named by that ruling and not built.

3. The amendment record (ADR convention, outside item 6)

When a later ruling amends an accepted record, the repository records it as a dated · **Amended** (DATE, ruling …) — … line continuing the record's status line. ADR-0087 and ADR-0043 show the form for a ruling on the record itself, and ADR-0090's line 4 shows it for an amendment by another record. Prime Directive #13 names "an amended status line on the old one" as the way a recorded decision changes. One line follows ADR-0138's Status paragraph:

· Amended (2026-10-13, ruling C on #23266, 6148183570, maintainer 「同意」) — D3 item 6: the guest reaches rows only through share links (and, when it exists, an explicit guest sharing rule), never through the object's sharing model; ADR-0090 D9 and D11 are unchanged.

4. Consistency with ruling C: the Consequences bullet (seat answer 6153761503)

The bullet said that no guest special case enters the row-level evaluator. Under C, E1's row-level evaluator has exactly one: the deny-all ahead of the sharing-model branch in SharingService.buildReadFilter. The edit names that one case and keeps the bullet's CRUD-gate and masker claims word for word.

Before:

- **The guest is one principal on one pipeline.** No guest special case enters the row-level
  evaluator, the CRUD gate or the masker; what differs for the guest is what it holds (D3) and where
  it acts (D4), both resolved before any gate runs.

After:

- **The guest is one principal on one pipeline.** The row-level evaluator carries one guest special
  case: the guest never takes its sharing-model (OWD) branch, so it reaches rows only through share
  links (and, when it exists, an explicit guest sharing rule; D3 item 6). No guest special case
  enters the CRUD gate or the masker; what differs for the guest there is what it holds (D3) and
  where it acts (D4), both resolved before any gate runs.

What was checked, against E1 at 1d394b81c3 (PR #23321's head at this read; diff taken from its merge base 01d503432b):

  • Row-level evaluator. The one guest branch is in packages/plugins/plugin-sharing/src/sharing-service.ts: isGuestPrincipal(context) returns deny-all in buildReadFilter, ahead of effectiveSharingModel. That is the case the new sentence names.
  • Masker: kept, true. E1 does not touch packages/plugins/plugin-security/src/field-masker.ts, and that file has zero mentions of guest or principalKind.
  • CRUD gate: kept, under the bullet's own reading. The permission evaluation has no guest branch: once the sets are resolved, the guest is judged like any caller. E1 does add two guest-specific steps to the gate's prologue in security-plugin.ts, and both are the bullet's "what it holds (D3) and where it acts (D4)":
    • resolvePermissionSetsForContextUnmemoized leaves the guest's position out of the set request. This is D3 item 3: the position-name fold never reaches the guest.
    • refuseGuestWithoutOrganization raises D4's located refusal for a guest that carries no organization.
    • One nuance, left as is because it is not ruling C's matter. E1 derives the organization at the guest entry (resolveAuthzContext), before any gate runs. When none was derived, the refusal is raised in the CRUD gate's prologue: the gate asks the same step again (resolveGuestOrganization). So "both resolved before any gate runs" holds for the derivation, and the refusal surfaces at the gate. This is named for E1's review and not edited here.

5. Consistency with ruling C: "What the ruling did not settle", item 3 (seat answer 6153761503)

The item listed the row scope as open ("one pipeline, no special case"). Ruling C has settled it, so the item now points at ruling C and E1's pin. The item keeps its number, and the section's other two items are unchanged.

Before:

3. **The guest's row scope** is stated as a contract (one pipeline, no special case, ADR-0090 D9's
   division of labour); its measured outcome per sharing model is E1's pin.

After:

3. **The guest's row scope** is no longer open: ruling C on
   [#23266](https://github.com/objectstack-ai/objectstack/issues/23266)
   ([`6148183570`](https://github.com/objectstack-ai/objectstack/issues/23266#issuecomment-6148183570))
   settled it as share links only, never the object's sharing model (D3 item 6), and E1 pins it: with
   a bound read set and no share link, `private`, `public_read`, `public_read_write` and
   `controlled_by_parent` each read zero rows.

Verification (head 58464a201a)

  • Docs only. The diff touches no package, so there is no build, test or typecheck target.
  • Base. origin/main moved to 4d4040ccb6 but left this ADR unchanged, so no merge was made. The branch is still based on 87e902dcbb.
  • Gate derivation. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, run on this branch's diff (1 path, +28/−11), derives 19 commands, the same set as at dispatch.
  • Gate results. All 19 exit 0 on 58464a201a. The --ran reconciliation reads: "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)".
    • check:doc-formula-expressions needs @objectstack/formula and @objectstack/lint built. They were built first under the verify lock (turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, VERDICT command-exit 0).
    • Verdict lines:
      • check-adr-links: 730 relative link destination(s) under docs/adr/ resolve
      • check-adr-symbol-anchors: 2334 anchors across 142 records resolve
      • check-adr-anchors: OK (68 anchored file(s), every governing ADR still referenced; … 45590 citation(s) across 5976 file(s) resolve …): one fewer citation than at 86e71fdc39, because the old item 3's "ADR-0090 D9's" is gone.
      • check-closing-keyword-parity: OK (3 parsers agree …)
      • check-nul-bytes: OK (… no raw ASCII control bytes)
      • the doc-authoring guard: ✓
  • Anchors. No anchor under scripts/adr-anchors/ quotes any edited passage, and this diff adds or removes no path#symbol anchor.
  • Control bytes. A self-scan of the edited file finds no control bytes.
  • Changeset. None, because nothing publishes:
    • The ADR path is in no published package's files[]. Of 71 non-private manifests, 0 have an entry under docs/. The positive control is packages/spec, which lists dist.
    • The root package is private.
    • No package build copies docs/adr.
    • skip-changeset applies.

Acceptance notes

These were checked and do not conflict with ruling C, so they are left as they are:

维护者速读(草稿)

  • 改了什么: 只改 ADR-0138 一个文件,共四处文字修改。

    1. D3 第 6 项,裁决原句:访客只经分享链接触达行;将来有了显式的访客分享规则,也可经它;永不经对象的共享模型。同一项的首句和末句随之对齐(上文 2a、2b)。
    2. 状态行下加一条带日期的修订记录,写明裁决 C 和评论号(上文第 3 节)。
    3. 「Consequences」一节「访客是一条管线上的一个主体」:原文说行级评估器不进访客特例,现改为写明行级评估器唯一的访客特例,即访客不走共享模型(OWD)分支,只经分享链接触达行;关于 CRUD 闸门和字段掩码的说法原样保留,已对 E1 代码逐一核对(上文第 4 节)。
    4. 「What the ruling did not settle」第 3 条:不再把访客行范围列为未定事项,改为指向裁决 C 和 E1 的钉:绑定了读集合、没有分享链接时,四种共享模型都是 0 行(上文第 5 节)。

    以上每处都有逐字前后对照。ADR-0090 的 D9、D11 一字未动,「Decided by」一段未动,本 PR 不含任何代码。

  • 为什么改: 你在 [Decision] 访客(guest)的行可见范围:沿用对象的内部共享模型(A,现状,公开对象全部行可见)、按 externalSharingModel 判(B)、还是只经分享链接(C) #23266 上回了「同意」(裁决 C):访客的行范围只经分享链接,不经共享模型。记录第 6 项原文写的是「经对象声明的共享模型和分享链接」,与裁决相反。同一记录里另有两处也与裁决相抵,席位答复 A:本 PR 一并修订,让一次批准覆盖一份不自相矛盾的记录。按 AGENTS.md 第 13 条,改变已接受记录的决定,要改原文并留修订行。实现代码在 PR feat(security): the guest's grants channel, with a share-links-only row scope (ADR-0138 E1, ruling C) #23321,改了原文,它才有记录可依。

  • 风险与代价(含回滚):

    • 纯文档:不发布任何包,不改运行时行为。
    • 第 1 处里的 2a、2b 以及第 2 至第 4 处,都超出裁决原句,属于与裁决对齐的措辞修改,请过目。
    • 有一处细节留给 E1 评审,本 PR 不改:E1 把「组织无法确定」的拒绝放在 CRUD 闸门入口处抛出(上文第 4 节)。
    • 回滚:revert 本 PR,原文即恢复。
  • 席位意见:

  • 你要做的:

    1. 看第 1 处里的 2a、2b 以及第 2 至第 4 处这些超出裁决原句的对齐修改,确认同意。
    2. 同意就批准本 PR(Tier H,需你本人批准)。

Generated by Claude Code

…r the object's sharing model (D3 item 6, ruling C)

D3 item 6 drops "through the object's declared sharing model and": the
guest reaches rows only through share links (and, when it exists, an
explicit guest sharing rule), never through the object's sharing model.
Item 6's first and last sentences are brought into line with the same
ruling: the guest takes no OWD branch (neither sharingModel nor
externalSharingModel), and E1's pin is zero rows for every sharing model
with no link. The status line records the amendment. ADR-0090 D9 and D11
are unchanged.

Claude-Session: https://claude.ai/code/session_01P88ehrZ6hM19hBzdpsQTTo
Co-authored-by: Claude <noreply@anthropic.com>
…ngs list in line with ruling C

The Consequences bullet "The guest is one principal on one pipeline" now
names the row-level evaluator's one guest special case: the guest never
takes its sharing-model (OWD) branch and reaches rows only through share
links (and, when it exists, an explicit guest sharing rule). Its CRUD
gate and masker claims are unchanged. "What the ruling did not settle"
item 3 no longer lists the row scope as open: ruling C settled it, and
E1 pins zero rows for every sharing model with no link.

Claude-Session: https://claude.ai/code/session_01P88ehrZ6hM19hBzdpsQTTo
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 58464a201a3aa6629e6b24afbe59cf109e22b8e8
Local-runs: none

Inputs: card #23266 (body; comments 6148041259, 6148183570, 6149341777, 6153293163, 6153735234, 6153761503, 6154066791); PR #23326 (body, file list, net diff: one file, docs/adr/0138-guest-model-anonymous-principal-doors-grants-and-organization.md, +28/−11, byte-identical whether taken from the merge-base 87e902dcbb or from origin/main 37510aa0f9, which has not touched the file); the 46 check-runs on the head (39 names, latest per name); the rules (contract-review.md, pm-dispatch SKILL.md 〈路径分叉〉, AGENTS.md Prime Directives #13 and #14); and the code the text cites, read at E1's head 1d394b81c3 (PR #23321, squash-merged to main as 37510aa0f9 at 2026-10-13T20:02Z, after this head was pushed). Tier H (docs/adr/**): this record is the contract-tier review the governed text owes; the landing is the maintainer's approval.

① Derived judgments

Accept-set and public-surface changes implied by the diff: none. One governed-text file; no package, schema, export, changeset or scripts/adr-anchors/ entry moves (no anchor file names ADR-0138; the ADR's path#symbol anchors are untouched, and check-adr-anchors / check-adr-symbol-anchors are green on the head).

Each text change, against ruling C (6148183570) and the code it cites:

  1. D3 item 6, the ruled sentence — right. "through the object's declared sharing model and" is gone, as item 3 of the ruling orders; the sentence now reads "reaches rows only through share links (and, when it exists, an explicit guest sharing rule), never through the object's sharing model", the ruling's own wording. The retained citations are accurate: ADR-0090 D9 (lines 350–351 at the head: the guest position answers which object classes, share links which records) and D11 (lines 477–478: guest is deliberately not an OWD audience). ADR-0090 is untouched by the diff, as the ruling requires.
  2. D3 item 6, first sentence ("except that the guest never takes the pipeline's sharing-model (OWD) branch: neither sharingModel nor externalSharingModel") — right. Ruling item 1's words. True against E1: packages/plugins/plugin-sharing/src/sharing-service.ts at 1d394b81c3 line 480 returns { id: '__deny_all__' } for isGuestPrincipal(context) ahead of the effectiveSharingModel branch at line 481; externalSharingModel has no reader in that filter (the code comment says so; card premise 2 agrees). Same line on origin/main after the squash.
  3. D3 item 6, the pin and provenance sentences — right. The pin (bound read set, no link: private, public_read, public_read_write, controlled_by_parent each read zero rows) is ruling item 1 in substance, and it is the test at E1: packages/qa/dogfood/test/guest-grants-channel.dogfood.test.ts lines 371–388 assert toHaveLength(0) for private, public_read, public_read with externalSharingModel: 'public_read', public_read_write, the public_read parent and its controlled_by_parent child; lines 398–427 keep the share-link control green. "the explicit guest sharing rule is named by that ruling and not built" is ruling item 2.
  4. Status-line continuation · **Amended** (2026-10-13, ruling C on #23266, 6148183570, maintainer 「同意」) — … — right, and owed. Prime Directive [WIP] Add Chinese version of the documentation #13 requires an amended status line on the old record; the form is the one ADR-0056 line 4 and ADR-0090 line 4 carry (and the one ADR-0138's own criterion 4 specifies). Its content restates ruling item 3 and nothing else; the maintainer's word is quoted verbatim.
  5. Consequences bullet "The guest is one principal on one pipeline." — right. "The row-level evaluator carries one guest special case" is exactly E1's diff on sharing-service.ts: one isGuestPrincipal function and one branch in buildReadFilter; the !context.userId denies in checkEdit / checkDelete pre-date E1 (lines 778 and 860 at 01d503432b) and key on the absent user, not on the guest. The masker clause is true: E1's 15-file list does not include field-masker.ts, which has zero guest / principalKind mentions. The CRUD-gate clause is pre-existing wording the PR carries unchanged; the nuance E1 adds to it is under ③. The bullet says nothing beyond ruling items 1–2 and D3 item 6.
  6. "What the ruling did not settle" item 3 — right. It names ruling C and the pin; the same test backs it. The ruled scope is settled, so listing it as open would contradict item 6.

Scope versus "one record sentence". The diff edits five places where the ruling names one. No edit carries content the ruling does not: items 2, 3, 5 and 6 restate ruling items 1–2, and item 4 is the convention #13 demands. Each is needed for the record not to contradict its own ruled sentence (the old "with no guest special case", "No guest special case enters the row-level evaluator" and "row scope … E1's pin" readings all describe the pre-C pipeline). The quick-read draft names every beyond-the-sentence edit for the maintainer's eye, and the Tier H approval is on the whole text. Judged right.

Any other passage of ADR-0138 left contradicting the ruling: none. Read whole at the head. The TL;DR D3 row, D3's enforcement note, D8's "Why removal" (D11: position plus share links only), the enforcement map and the E1 execution-plan row ("the guest's row scope for each sharing model" is the pin's dimension, not a channel) all read with C. One line is stale rather than contradictory and is noted under ③.

Checks on the head: 29 success, 10 skipped, 0 failed, 0 in progress. Every skipped name (Auto Label, Build Core, Build Docs, Check Changeset, Check PR Size, Console Pin Gate, Dogfood Regression Gate (${{ matrix.shard }}/3), Dogfood Verify CLI, Packed-tarball smoke (opt-in), Temporal Conformance (live PG + MySQL)) is on the check-expected-skips.mjs roster; the never-skip set (Lint & Repo Gates, TypeScript Type Check, Test Core, Dogfood Regression Gate, Governed Surface Queue Guard, the three claim guards) is green. Gate verdicts are taken from these runs; nothing was run here.

② Semver level

Clause-②: no is correct, and skip-changeset is right: the diff publishes nothing. One path under docs/adr/; of 71 non-private package manifests, none lists a docs/ entry in files[] (positive control: packages/spec lists dist, json-schema, …); the root package is private. No accept set widens or narrows, so no (widening) / (narrowing) arm and no ADR-0087 marker is owed. The Check Changeset skip is the label's expected mechanism.

③ Boundary flags

Dev flags (reports 6153735234 and 6154066791) and the seat's answer 6153761503, each answered here:

  • open_questions[0] (round 1): widen to the two passages outside item 6. Answered A by the seat and executed in 58464a201a; judged right above (①, scope). Closed.
  • CRUD-gate nuance (round 2, out-of-scope finding 1; deviation 3). E1 raises D4's located refusal in the CRUD gate's prologue (SecurityPlugin.refuseGuestWithoutOrganization, called at security-plugin.ts line 8706, keyed on principalKind === 'guest'), and resolvePermissionSetsForContextUnmemoized drops the guest's position from the set request (line 6489). The bullet's retained "No guest special case enters the CRUD gate … both resolved before any gate runs" is the record's pre-existing reading, under which these two steps are D3's and D4's inputs; the record itself already places the refusal "at the CRUD gate" (the Consequences bullet above it, D4's enforcement row), so the sentence contradicts neither ruling C nor the record. The exactness of "resolved before any gate runs" against "raised at the gate" is an E1-record wording question outside ruling C. Escalated, not blocking: it is named in the PR's quick-read draft under 风险 for the maintainer's Tier H read, and a changed word there belongs to ADR-0138 E1: the grants channel — the guest entry resolves D4's organization, then the guest anchor's bindings (D3, D4) #23224's record keeping.
  • "Decided by" block does not list ruling C (both rounds). No edit owed: the status-line continuation is where ADR-0056 and ADR-0090 record their 2026-10-13 amendments too, and criterion 4 of this record specifies that form.
  • Deviation 1 (status line outside item 6). Owed by Prime Directive [WIP] Add Chinese version of the documentation #13; not a deviation from the ruling.
  • Deviation 2 (trailer form) and round 1's deviation 3 (tag v0.1.0 auto-followed into the shared object store). Not contract matters; recorded, nothing to judge.

Flags this review adds:

Implemented-by: claude/issue-23266-adr-0138-guest-row-scope
Reviewed-by: session_01P88ehrZ6hM19hBzdpsQTTo

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读 · PR #23326(#23266 裁决 C 第 3 条)· domain:engine 席位 1 · 2026-10-13T20:12Z

  • 改了什么: 只改了 ADR-0138 这一个文件,共四处文字,没有任何代码。

    1. D3 第 6 项:按裁决原句改为访客只经分享链接触达行,将来有了显式的访客分享规则也可经它,永不经对象的共享模型。同一项的首句和末句随之对齐:首句写明唯一的访客特例是不走共享模型分支;末句写明 E1 的钉,即没有链接时四种共享模型都是 0 行。
    2. 状态行:加一条带日期的「Amended」修订记录,注明裁决 C 和评论号。
    3. 「后果」一节:原文说「行级评估器不进访客特例」,改为写明它唯一的访客特例,就是不走共享模型分支。
    4. 「裁决未定事项」第 3 条:改为已由裁决 C 定案。

    ADR-0090 的 D9、D11 一字未动。

  • 为什么改: 你在 [Decision] 访客(guest)的行可见范围:沿用对象的内部共享模型(A,现状,公开对象全部行可见)、按 externalSharingModel 判(B)、还是只经分享链接(C) #23266 上对裁决 C 回了「同意」。记录原文写的是「经对象声明的共享模型和分享链接」,与裁决正相反。实现(E1,PR feat(security): the guest's grants channel, with a share-links-only row scope (ADR-0138 E1, ruling C) #23321)今天已合入 main(37510aa0f9),所以现在只差记录文字没跟上。第 2 到第 4 处超出了裁决那一句,但不改这三处,同一份记录会自相矛盾。席位选的是一次改齐。

  • 风险与代价(含回滚):

    • 纯文档,不发布任何包,不改运行时行为。
    • 回滚只需 revert 本 PR。
    • 有一处旧措辞留着没改:「后果」里说访客的组织「在任何闸门之前解析」,而 E1 实际是在 CRUD 闸门入口处抛出「组织无法确定」的拒绝。契约复核判定这不与裁决 C 或记录矛盾,只是措辞精度问题,不在本裁决范围内。
  • 席位意见: 建议批准。

    • 契约复审档复核结论为 PASS(6154231483):逐条核对过,四处文字都与裁决 C 一致,也与已合入的 E1 代码一致;ADR-0138 其余段落没有与裁决矛盾的地方。
    • CI 全绿。
    • 这是受管面的 Tier H PR,只能由你批准后落地。
  • 你要做的: 批准 PR docs(adr-0138): the guest reaches rows through share links only, never the object's sharing model (D3 item 6, ruling C) #23326。批准后席位负责落地。


Generated by Claude Code

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

Labels

documentation Improvements or additions to documentation needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants