Skip to content

docs(adr-0018): dated note — http_request, http_call and webhook are reserved retired node names (F5-http of #23543) - #23955

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-23543-f5-http-adr-0018-note
Oct 17, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-23543-f5-http-adr-0018-note

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Part of #23543

The ADR-0018 half of family F5-http of ruling 6182001882 (item 6): "ADR-0018 gets a dated note naming the three reserved retired names (Tier H, the maintainer's merge)". The code half is PR #23954, landed on main as f901746ac8 (2026-10-16T16:56Z). This PR is branched from main and carries one file.

What

One dated addendum at the end of docs/adr/0018-unified-node-action-registry.md, in the ADR's own amendment format (## Addendum (date): … with a > Status of this addendum: line, as its 2026-05-31 connector_action addendum):

  • http_request, http_call and webhook, the three outbound callout names §4 unified into http, are reserved retired names inside the open node namespace §2 created.
  • Authoring refuses them as a node's type, naming http; the ADR-0087 D2 conversion flow-node-http-callout-rename leaves the load path at 18 and still runs at every data-at-rest seam, so stored flows keep loading as http.
  • AutomationEngine.registerNodeExecutor refuses an executor or descriptor under a reserved name, which retires the conversion's ADR-0078 conflict guard.
  • A wait node's waitEventConfig.eventType: 'webhook' is not affected.

Nothing else in the ADR changes: §2's open namespace and §4's table stand as written.

维护者速读(草稿)

  • 改了什么: 在 ADR-0018(统一节点/动作注册表)末尾加一段带日期的补记:流程节点的三个旧名字 http_request、http_call、webhook 从此是「保留的退役名」——作者写了会当场报错并被告知改成 http,插件也不能再用这三个名字注册自己的节点。
  • 为什么改: 这三个名字早在 11 版就合并成了 http,但节点类型是开放命名空间,一直没有任何地方拒绝它们,只是加载时悄悄改写。裁决 6182001882 第 6 项要求把它们正式保留,并在 ADR-0018 里留下记录,让后来的人知道这块开放命名空间里有三个名字是关着的。
  • 风险与代价(含回滚): 本 PR 只改文档,不改任何行为;行为变化在配套的代码 PR 里。回滚就是撤销这一段补记。已存数据不受影响:旧流程读取时仍会被改写成 http。通过元数据 API 新保存的流程,带这三个名字时也会被拒(feat(metadata-protocol)!: the flow save door refuses a retired spelling on a NEW flow; a stored flow keeps the full chain #23902 按裁定 6212082860 已落地)。
  • 席位意见: 建议合并。配套代码 PR feat(spec)!: reserve the retired callout node types http_request, http_call and webhook; flow-node-http-callout-rename leaves the load path (F5-http of #23543) #23954 已在 main 上(f901746ac8),补记里每一句都由已落地的代码兑现;契约复核 PASS(6217920402)。一处措辞可再精确:「every data-at-rest seam」指的是每个在静置时规范化 flow 的入口,读取路径按 ADR-0087 原样返回 flow(裁定 6216220018 第 3 项保持),不影响结论。
  • 你要做的: 审阅这段补记的措辞,同意后合并本 PR(docs/adr/** 属 Tier H,需维护者本人合并)。

Generated by Claude Code

…reserved retired node names

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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: d50a0fda89a48c0b1a379f3b694d13be8dd2b40f
Local-runs: none
Scope: docs/adr/0018-unified-node-action-registry.md + packages/spec/src/automation/flow-reserved-node-types.ts, packages/spec/src/automation/flow.zod.ts, packages/spec/src/automation/control-flow.zod.ts, packages/spec/src/conversions/registry.ts, packages/spec/src/conversions/stored.ts, packages/services/service-automation/src/engine.ts, packages/spec/src/automation/flow-reserved-node-types.test.ts, packages/services/service-automation/src/flow-load-conversion.test.ts, packages/spec/src/conversions/stored.test.ts (each read at PR #23954's head d55439273fabec83437df2cdcb639bf1a0625c9f, the code this note is judged against)

Inputs: card #23543 (body and all 36 comments), rulings 6212082860 (#23775) and 6216220018 (#23903) with PR #23902's body, this PR's body, file list and net diff against its merge-base 94114c1f with origin/main, PR #23954's diff, and the check-runs on this head. Read-only throughout.

Gates on this head. 43 check-runs, all completed, none red: Lint & Repo Gates (the governed-prose and ADR gates inside it), TypeScript Type Check, Test Core and its six shards, Governed Surface Queue Guard, Check Changeset and Check Documentation Links are green; Build Core, the dogfood and conformance jobs are skipped by the path filter, as a docs-only diff skips them.

① Derived judgments — each sentence of the addendum against PR #23954's code

  1. The status line, "ruled (ruling 6182001882 on spec(conversions): eight ADR-0087 D2 conversions stay on the 18 load path after #23487 — five families each need a ruling before they can retire #23543, item 6). It narrows §2 ("Open the protocol's node type") by exactly three names and closes §4's alias window, which 11.0 ended without a refusal." — true. §2 and §4 are those headings; §4 ("Consolidate the outbound verbs") declared the one-major deprecated-alias window for http_request / http_call / webhook, M3 shipped it through registerNodeAlias, and protocol 11's conversion replaced the aliases with a silent load-time rewrite, which this family ends. The format — an ## Addendum (date) heading with a Status of this addendum line — is the 2026-05-31 connector_action addendum's.
  2. "The node-type namespace stays open, with one closed exception: … reserved retired names. No flow may type a node with one, and no plugin may register an executor under one." — made true by the code: FlowNodeSchema.type keeps its open string with three pattern refusals; the FlowSchema superRefine reaches a region-body node, once per site; registerNodeExecutor is the engine's only registry write and refuses the executor's and the descriptor's type, an alias through it too; a stored flow is rewritten before anything parses it. With PR feat(metadata-protocol)!: the flow save door refuses a retired spelling on a NEW flow; a stored flow keeps the full chain #23902 on main (ruling 6212082860 letter B), a new flow saved through the metadata API meets the same parse refusal, so no authoring door is left that accepts one.
  3. "Authoring refuses them, naming http. The flow parse refuses each as a node's type (top level and inside a region body), with the prescription to rename the node to http." — true: the prescription reads "… Use type: 'http' …", at nodes.N.type for a top-level node and at the region path for a region-body node, pinned per name at both depths.
  4. "The ADR-0087 D2 conversion flow-node-http-callout-rename, which rewrote them at load through 17, leaves the load path at 18; it still runs at every data-at-rest seam, so a stored flow written with an old name keeps loading as http." — true: retiredFromLoadPath: true, retiredAfter: '17.7.0'; applyConversionsToStoredItem forces includeRetired: true, the engine's rehydration keeps the full chain, the artifact door replays inside its window, each pinned. A precision for the maintainer's read, not a falsity: the metadata-protocol read path serves a stored flow verbatim and canonicalizes flows at registerFlow instead (ADR-0087's 2026-08-01c addendum, kept by ruling 6216220018 item 3), so "every data-at-rest seam" reads as every seam that canonicalizes a flow at rest, and the consequence clause holds at each of them.
  5. "Registration refuses them too. AutomationEngine.registerNodeExecutor throws for an executor or descriptor typed with a reserved name: no node could ever reach it, because an authored node is refused and a stored one is rewritten first. This retires the conversion's ADR-0078 conflict guard, which existed only for a third-party executor under one of these names." — true: the throw names the canonical type and the reason; the guard is deleted from the entry, and no entry calls reportConflict any more (the channel's plumbing stays, producer-less, the seat's call in PR feat(spec)!: reserve the retired callout node types http_request, http_call and webhook; flow-node-http-callout-rename leaves the load path (F5-http of #23543) #23954's record).
  6. "Not affected: a wait node's waitEventConfig.eventType: 'webhook' is a different field and stays legal." — true, pinned.
  7. Nothing else in the ADR moves: §2's open namespace and §4's table stand as written, and the addendum is appended after the existing one under its own rule.

② Semver level

skip-changeset is right: one docs/adr/** file, nothing published from any released package. No Clause-② line is owed on a docs-only PR; the narrowing's declaration rides PR #23954 (Clause-②: yes (narrowing), a BREAKING minor on @objectstack/spec and @objectstack/service-automation), which is the review of record for the code.

③ Boundary flags

  1. Sequencing, the one flag that binds the landing: the note is true of PR feat(spec)!: reserve the retired callout node types http_request, http_call and webhook; flow-node-http-callout-rename leaves the load path (F5-http of #23543) #23954's code, not of main today. Landed first, the ADR would state a refusal main does not make. PR feat(spec)!: reserve the retired callout node types http_request, http_call and webhook; flow-node-http-callout-rename leaves the load path (F5-http of #23543) #23954's record on its head d5543927 is FAIL (two red required gates and a stale changeset paragraph), so this note waits for that PR's patched head to PASS and land, and then for the maintainer's hand; docs/adr/** is Tier H and no seat queues it.
  2. The PR body's maintainer speed-read says a flow newly saved through the metadata API still accepts the three names. That was true on the tree the dev measured; PR feat(metadata-protocol)!: the flow save door refuses a retired spelling on a NEW flow; a stored flow keeps the full chain #23902 landed on main afterwards and ruling 6212082860 decided it. The addendum itself does not say this, so the ADR text is unaffected; the seat may amend that body line (the dev writes the body once).
  3. Deviations: none beyond the claim — one file, branched from origin/main and not from PR feat(spec)!: reserve the retired callout node types http_request, http_call and webhook; flow-node-http-callout-rename leaves the load path (F5-http of #23543) #23954, no closing keyword, per claim 6214417833. Open questions: none on this PR; the code PR's two are answered or escalated in its own record.

Implemented-by: claude/issue-23543-f5-http-adr-0018-note
Reviewed-by: session_01HjR8RUwTPQ3TgbfKihmxp9

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · PR #23955 @ d50a0fda89 (#23543, F5-http PR B, the ADR-0018 note, Tier H) · domain:spec seat 1 · os-elon-musk · session session_01HjR8RUwTPQ3TgbfKihmxp9 · 2026-10-16T17:23Z

Reviewer of record. Every item below was checked against GitHub and the code, not against the report (6217001433 on #23543).

Handed to the approvers in this act: review requested from os-zhuang and hotlong, and needs-user-decision on this PR. After an approval this seat clears the label and lands it, unless the approver enqueues it first. When it lands, #23543 closes: F5-http was the last family.


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review October 17, 2026 00:27
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit be076da Oct 17, 2026
58 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-23543-f5-http-adr-0018-note branch October 17, 2026 00:36
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 size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants