Repository navigation
docs(adr-0043,skill-automation): open-time notification is approval.requested; one-tap links stay remind()-only (#22631, Tier H half) - #22652
Conversation
…equested; one-tap links stay remind()-only ADR-0043's Issue bullet said open-time notification remained the flow author's notify node. Since openNodeRequest publishes approval.requested to each concrete approver on the slate the request opens on, that sentence is false. The Status line carries the dated amendment marker and the parenthesis carries the correction; the token table and every decision are unchanged. The automation skill's best practice 5 keeps the decision half (notify the submitter of the outcome from the approve/reject edges), drops "the node does not send", and names the double-notify trap: the opening already tells each resolved approver, so no notify node for the opening. The reference file sits at its token ceiling; the duplicated approval_revise comment (it restated the "no config, no signal" sentence above it) pays for the new text. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RdnZdPZH9ByduzPRWuH9tN
Contract reviewServed-tier: Skills seat 1 (seat post #7623), ① Derived judgments
② Semver levelNothing publishes from a package ( ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)skills 席 1(#7623)· 改了什么:两份治理文本各改一处,共 +10/−8。ADR-0043 的 Status 行加「Amended(2026-10-10)」标记,机制段里那句「开请求时的通知仍靠流程作者自己放 为什么改:PR #22625 落地后这两段话与代码相反;技能是 AI 作者读的,照旧文会把 changeset 让作者删掉的那个 风险与代价(含回滚):纯文档,不碰运行时;回滚 revert 本 PR。非受管的 QA 清单半边在姊妹 PR #22656,走队列,不需要你批。 席位意见:建议批准。席位核了主题名、通知名单、链接只在 remind 发三点;两处改动与分诊方向一致,token 决定未动;删除的注释内容在同文件 你要做的:在本 PR 上 Approve(Tier H 治理面)。 |
Part of #22631
Clause-②: no
Two governed texts said the opposite of what
openNodeRequestdoes since PR #22625 (e8c6666870): opening an approval request publishesapproval.requestedto each concrete approver on the slate the request opens on, through the singlenotify()ingress, and one-tap links are still minted byremind()only. This PR carries items 1 and 2 of #22631 (Tier H:docs/adr/**,skills/**). Item 3 and the token-door item ride the sibling PR onclaude/issue-22631-qa-checklist-approval-requested. #22631 remains open until both PRs land.Dispatched by the
domain:skillsseat PM, sessionsession_01RdnZdPZH9ByduzPRWuH9tN. Claim6095805515, triage6095381775.Measured first
origin/main3d0eeefa(86da194919plus five later commits;git diff --stat 86da194919 3d0eeefaover the three card paths is empty, so none of them moved).:40–:42read "(Open-time notification remains the flow author'snotifynode; templates there can adopt the same links later.)": 1 hit with a wrap-tolerant grep; positive controlsys_approval_token: 2 hits.approve: 48 hits.packages/plugins/plugin-approvals/src/approval-service.ts: the literal is'approval.requested'(:3349, insideopenNodeRequest, declared at:2999). The fan-out loops overopenedOn, the slate after OOO delegation and after anonEmptyApprovers: 'fallback'replacement, minustype:valueliterals and OOO delegates, onethis.notify()per approver.issueActionTokenshas exactly one caller,:4815insideremind()(declared at:4763), so one-tap links are minted byremind()only. feat(plugin-approvals): ApprovalService.handleActionPage serves the ADR-0043 action page from a Request (segment 4 of #22438) #22641 (3d0eeefa) shifted these lines by 15 and changed none of it.skills/objectstack-automation/evals/**) asserts nothing about the dropped half: grepsend mail itself|node does not send|node to send|downstream nodes|notify nodegives 0 hits in both files; controlapprovalgives 4 and 13 hits. Nothing moves there.What changed
docs/adr/0043-actionable-approval-links.md(two one-line touches)**Status**line takes the corpus form of a dated status amendment,· **Amended** (2026-10-10, #22631 — …), as ADR-0029, ADR-0030 and ADR-0044 carry theirs: open-time notification is the approvals service's ownapproval.requestedtopic, not a flow-authorednotifynode; one-tap links stayremind()-only; the token table and every decision below are unchanged.openNodeRequestto each concrete approver on the slate the request opens on (PR feat(plugin-approvals): opening an approval step tells each resolved approver (approval.requested) #22625), carrying no links, with one-tap links remainingremind()-only.skills/objectstack-automation/references/state-machines-and-approvals.mdapprove/rejectedges), drops "rather than expecting the node to send mail itself", and names the trap: the opening already tells each resolved approver (approval.requested), so nonotifynode for the opening, or they are told twice.check-skills-token-ratchetaccepts only deletion in the same file as payment. The deleted text is the two-line code comment at:183–:184("No config and nowaitEventConfig: the window ends on the submitter's explicit resubmit, not on a signal or a timer."), which restated the prose at:167("The node takes no config — there is no signal to wait on."). No fact leaves the file.Readings (
skills/**, per the line budget)3d0eeefa)af35cd5be)references/state-machines-and-approvals.md, linesreferences/state-machines-and-approvals.md, tokens (ceil(bytes/4), the ratchet's unit)skills/objectstack-automation/)node scripts/check-skills-token-ratchet.mjsprints "state-machines-and-approvals.md is 5562 tokens (ceiling 5569; headroom 7)". No ceiling moved.Verification (all at
af35cd5be)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; the change set is taken from the merge base) derived 30 commands. All 30 ran in the foreground, each exit captured before any pipe;--ranreconciliation: "30 derived, 30 run, 0 NOT-MEASURED, 0 UNRUN".check:doc-formula-expressionsfirst answered exit 3 (PREREQUISITE NOT MET: nodist/for@objectstack/formulaand@objectstack/lint); after that build through the verify lock (4 of 4 tasks cached) it measured exit 0 ("22 record-scoped formula example(s) across 471 files / 1387 TS blocks judged clean").check-adr-links,check-adr-symbol-anchors,check:adr-anchors,check-skills-token-ratchet(each with its--self-test),check:skill-refs,check:skill-compatibility,check:skill-frame-sync,check:skill-identifier-liveness,check:role-word,check:corpus-claim-drift,check:pm-prior-rulings,check:pm-governed-merges,check:doc-authoring,check:nul-bytes: all exit 0.pnpm lint(CI's; this diff touches no lintable source) and package test suites (no package is touched).Changeset
Docs-only, nothing published:
docs/adr/**andskills/**ship in no package'sfiles[].skip-changesetis applied throughlabel-write.Landing
Tier H (
docs/adr/**,skills/**): draft until an authorized APPROVED review. No seat merges, queues or arms auto-merge on it.维护者速读(草稿)
改了什么: 两处文字。ADR-0043 的 Status 行加一条 2026-10-10 的修订记号;机制段里那句「开单通知仍由流程作者的
notify节点负责」改为:开单通知现在是审批服务自己的approval.requested主题,发给这次开单落到的每个具体审批人(PR #22625);一键链接仍只在催办(remind())时签发。自动化技能的最佳实践第 5 条保留「结果由 approve/reject 边上的下游节点通知提交人」,删掉「节点自己不发邮件」,并写明:开单已经通知了每个审批人,⛔ 不要再为开单加notify节点,否则重复通知。为什么改: 自 PR #22625 起这两句是假的;技能那句正把 AI 作者引向变更集要求删掉的那个
notify节点(重复通知陷阱)。风险与代价(含回滚): 纯文档,无代码、无发布面;ADR-0043 的令牌表与各项决策不动,不新开 ADR。技能文件处在 token 上限,新增文字用同一文件里一段重复的代码注释抵付(该事实上一行散文已经写了),行数净增 0。回滚即 revert 本 PR。
席位意见:
你要做的: 批准本 PR(Tier H,需你的 APPROVED review);落地由席位执行。
Generated by Claude Code