Repository navigation
docs(adr-0104): a write references only a file its writer may read - #25971
Conversation
Amends ADR-0104 D3 wave 2: claim and copy-on-claim run only for a file the writing caller may read, by the download door's own verdict. Adds the 2026-10-26 addendum, a Status bullet, and a note under the 2026-07-27 worst-case row for exclusive ownership. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016DTRymn12to8YSGMcTzS7h
Contract reviewServed-tier: Face: rules ( ① Derived judgments
② Semver levelDocs-only diff, one file under ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
The 2026-10-26 addendum's quiet answer is scoped to the write door, says what a kept id gives a reader and how step 5 classifies it, and names #26043. The no-caller exemption names the runAs defaults of flows and hooks and the API-key caller. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016DTRymn12to8YSGMcTzS7h
Contract reviewServed-tier: Face: rules ( ① Derived judgments"At the write door" (the qualifier). Right. The quiet answer is given in the lifecycle's "Unless the record already owned the file, the kept id gives no reader anything through it." Right. On hydration ( "A reader refused "The download door judges the file by its own rule, never by this record." Right. "A slot holding a file it does not own is a state that step 5's "#26043 tracks replacing this answer with a field-level refusal." Right. #26043 is open, asks for exactly that (a "Everything else has a caller." Right. "A flow runs as "A hook's data operations take the context of the write that fired them by default ( "An API-key caller is judged as the key's user." Right. "Only a declared Disclosure. The new text states mechanism only: what a kept id yields on read and at the door, which identities count as callers, and a public follow-up card. Nothing in it goes beyond the merged code's own comments, the shipped changeset, and the public text of #26043. Omissions, non-blocking. The prior record's two precision points stand unchanged (where the No new sentence is false of the merged code. ② Semver levelDocs-only diff, one file under ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Elon · project thread
Follow-up to #25692, which #25951 fixed (merge commit
3761710927). This PR changes no code.维护者速读
改了什么:给 ADR-0104 D3 补一条修订,记明记录写入时的「认领」和「复制认领」只对写入者能读的文件发生,判断用的就是下载接口那一套规则。具体有三处:Status 加一条修订记录;在 2026-07-27 增补的最坏情况表下加注;末尾新增 2026-10-26 增补。按你在设计审阅后的选择(先改措辞再批),增补又补了三处准确性说明:保留的 ID 通过这条记录对任何读者都不可用,后续由 #26043 改成明确报错;流程和钩子按各自的 runAs 身份判断,只有系统身份免检;「分不清无权和不存在」只在保存这一步成立。
为什么改:#25951 已经把这条规则写进代码。但 ADR 里「独占加复制认领,最坏只是多存一份字节」这一行,隐含了一个前提:复制的人本来就能读原文件。代码之前没有检查这个前提,所以决策记录不完整。把前提写进 ADR,以后改这块的人搜 copy-on-claim 就能读到这条规则。
风险与代价(含回滚):只改文档,不动代码和数据。回滚就是 revert 这个 PR,对运行时没有影响。
席位意见:建议批准。增补只把 #25951 已经落地的规则写进决策记录,没有新增或放宽任何行为,措辞只写机制,符合本卡的披露要求。逐句核对增补与合入代码是否一致,交给契约复审(
CONTRACT_REVIEW_TIER)记录,记录会贴在本 PR 上,批准前请先看它的结论(措辞修改后的 head 会重新复审)。有一个相邻的问题由席位在线下另行转告维护者,不写在这里。你要做的:审阅并批准这个 PR。它改的是受管面
docs/adr/**,需要你本人批准才能落地。What changes
3761710927).Per the card's disclosure rule, the text states the mechanism only.
Gates
Run on head
13d9a1ad(3d14f9aeplus one wording commit), whose base is main3761710927.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 20 gates. All 20 exit 0, and--ranreconciles them: 20 derived, 20 run, 0 NOT-MEASURED.pnpm check:pm-governed-prose: exit 0.check:commit-card-trailers --range origin/main..HEAD: the 1 commit passes.skip-changeset).Acceptance notes
docs/adr/**): this lands only on an approval by a governed approver.Generated by Claude Code