Repository navigation
docs(adr): ADR-0139 reads Accepted, and D2 names the executor boundary as the composition seam (record half of the ruling on #22861) - #23035
Conversation
…y as the composition seam The status line reads Accepted (2026-10-11), accepted by the merge that landed the record on main, with an Amended note for D2. D2's position sentence now names the executor boundary: on the final AST, after the middleware chain and the before-hooks, immediately before each driver call of find, findOne, count and aggregate. The seam it named before (where lowerRelationConditions runs) precedes the middleware chain that D4's emitters write into, so no D4 leaf could reach it. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Read-only review of the one-file diff ① Derived judgmentsThe diff. One file, D2's amended sentence says what the ruling orders. The ruling's letter A: "compose once on the final AST, at the executor boundary", composing "immediately before each driver call, after the middleware chain and the before-hooks" on It names the real seam. Read on The rest of D2 is unchanged. Steps 1 to 3 (lines 138 to 147), the composed form No contradiction with D1, D4 or D5. D1 (lines 128 to 129) keeps the leaf legal on the same four verbs and refused on a write verb, in a The status line is true. PR #22707 carries one review: os-zhuang, APPROVED, on 2026-10-11 at 06:02 UTC, on its head The Amended note is accurate and its link is right. "Amended (2026-10-12)": the ruling comment The two tense changes are faithful. "becomes Accepted" to "became Accepted", and "stays in the ruling's letter D state" to "stayed": both sit in the paragraph the E0 row covers, both describe the pre-acceptance period as past, neither moves a decision. One residual reading: "Until then the platform stayed in the letter D state" can be read as the platform having left letter D at acceptance, which it has not (E2 onward are unlanded); that reading is inherited from the original "Until then", the next clause keeps letter C as the present interim, and the ruling's "E0's status line may ride in it" covers the paragraph. Not a defect of this diff. Nothing else moves. Two hunks only; the head is one commit over the merge-base; ② Semver levelDocs only, under ③ Boundary flags
Implemented-by: VERDICT: PASS Adopted by |
维护者速读改了什么: ADR-0139 里两处文字,只改文档,不动代码:
为什么改: 原文把组合点放在中间件链之前,可它自己点名的六个使用方(活动流、审计、评论等)都在中间件链里才写入叶子,原文自相矛盾。你已裁 A,代码按新位置实现,这份 ADR 要跟上,否则以后读 ADR 的 agent 会照旧位置写错。 风险与代价(含回滚): 纯文字,不影响运行时。契约复核 PASS:新句逐项对上裁决,其余段落一字未动,全文不再有把组合点放在旧位置的句子。回滚就是 revert 这一个文档提交。 席位意见: 建议批准。它只把你已裁的结论和早已成立的接受状态写进记录,没有新增任何决定。 你要做的: 在 PR #23035 上点 Approve。批准后席位负责落地。 |
Part of #22861
Clause-②: no
Tier H, draft only. The diff touches
docs/adr/**, a governed surface (Prime Directive #14). This PR lands only on an APPROVED review by an account inGOVERNED_APPROVERS. ⛔ No seat readies it, queues it or arms auto-merge on it.This is the record half of the ruling
6121741984on #22861 (letter A, maintainer 「22861 objectui#12191 同意。」). It is docs only, one file:docs/adr/0139-engine-internal-semi-join-leaf-readable-parent-ids.md, +14 / -7. E2's code PR does not wait for this text, and this text does not wait for the code.What changes
mainnamed the seam "wherelowerRelationConditionsruns today, after ingress parsing and the comparand doors". Per the ruling, it now names the executor boundary: on the final AST, after ingress parsing, the comparand doors, the middleware chain (packages/objectql/src/engine.ts#executeWithMiddleware) and the before-hooks, immediately before each driver call offind,findOne,countandaggregate. The rest of D2 is unchanged: steps 1 to 3, the composed form, and the uncomposed refusal at the driver.main(docs(adr): ADR-0139 — one engine-internal semi-join leaf, "the ids of object X this caller may read" (ruling A on #22590 item 3) #22707)", in the words of the E0 row on ADR-0139 execution: the engine-internal semi-join leaf across spec, engine, drivers and consumers (E0–E7 coordination) #22788. The approving review on that PR was submitted 2026-10-11T06:02Z, and the merge followed at 06:38Z (a2e94c2a05). One Amended (2026-10-12) note names the D2 change and the ruling. Two verbs in the same paragraph move to the past tense ("becomes" to "became", "stays" to "stayed"), because the paragraph described the time before acceptance.Nothing else in the record moves.
Why
The old position ran before the middleware chain. All six D4 consumers write their leaf inside that chain (object-scoped middlewares writing
ctx.ast.where), andbeforeFindhooks rewrite the AST inside the executor. So a seam at the old position could never see a D4 leaf. The previous dev measured this on246edf5b39(os-dev-report6119740461). The director seat re-read it on74c4b3435e4dfor the ruling. On9432bac077the positions are unchanged:findcallsresolveWhereTokensatengine.tsline 13160, the chain at 13162,beforeFindat 13174 anddriver.findat 13178.Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 19 families on this diff, and all 19 were run atd43e9a99ed. Exit codes were captured before any pipe.check-adr-links(and--self-test),check-adr-symbol-anchors(and--self-test; its verdict line reads "2317 anchors across 142 records resolve"),check-ci-filter-parity,check-closing-keyword-parity(and--self-test),check-comment-mask-corpus,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-probeandcheck:watch-hint-literal.@objectstack/lint check:doc-formula-expressions: the first run exited 3 (PREREQUISITE NOT MET, lint was not built), so it measured nothing. Afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lint(underos-verify-lock, VERDICT command-exit 0), the rerun exited 0.dispatch-gates --ranreports "19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED (a DERIVED zero)".Changeset: none.
docs/adr/**publishes nothing from any package. The dispatch forbids label writes, soskip-changesetis not applied here. The seat applies it, orCheck Changesetstays red; it is not one of the seven required contexts.维护者速读(草稿)
改了什么: 只改一份 ADR(ADR-0139,「只返回你能读的父记录」)里的两处文字,不动任何代码。
为什么改: 你在 #22861 上已经裁了 A。原文的位置看不见六个使用方自己写入的条件(活动流、审计、评论、回复、附件、字段隐藏),因为它们都在中间件链里写入。照原文实现,这些条件会原样漏到数据库。这次只是把已裁的结论写进记录。状态行是之前就欠下的 E0。
风险与代价(含回滚): 纯文档,没有运行时影响,也不发布任何包。回滚就是撤回这一个 PR。代码 PR(E2)不等这份文字,这份文字也不等代码。
席位意见:
你要做的: 看过这两处改动后,在本 PR 上点 APPROVE。
Generated by Claude Code