Skip to content

Commit 051aea6

Browse files
docs(adr): ADR-0078 and ADR-0087 note the conversion-conflict channel's retirement (#24046)
Part of #24001 — the governed half (Tier H). The code half is the companion draft PR #24045 on `claude/issue-24001-conversion-conflict-retire`, which carries `Fixes #24001`; this PR closes nothing. ## What this changes Three lines under `docs/adr/`, nothing else: - `docs/adr/0078-no-silently-inert-metadata.md` — one `Amended 2026-10-16 (#24001), a citation retired — no decision changes` line under **Status**: the ADR-0087 conversion layer's conflict channel, which cited this ADR's "never silent" rule for a flow-node rename refused over a live executor name, is retired with its last producer. Protocol 18 reserves the old callout node types (`FLOW_RESERVED_NODE_TYPES`), so the engine refuses such an executor at registration — this ADR's rule applied one step earlier. The completeness gate and every decision are unchanged. - `docs/adr/0087-metadata-protocol-upgrade-contract.md` — one dated note closing the 2026-08-02 addendum: the conflict guard that addendum and the 2026-07-31 / 2026-08-01 ones describe is gone, and with it `reservedNodeTypes` / `onConflict`, `ConversionConflictNotice` / `ConversionConflictDetail`, the `conflicts` arrays and `409 FLOW_CONVERSION_CONFLICT` (D3 entry `conversion-conflict-channel-removed`). The historical text above it is left as recorded, per this repo's note-not-rewrite convention for ADRs. Why separate: the claim keeps every `docs/adr/**` line out of the code PR, because one governed path makes the whole PR Tier H. The ADR-0087 registries (D2 conversions, D3 entries) live in code (`packages/spec/src/conversions/`, `packages/spec/src/migrations/entries/`), so the D3 entry rides the code PR. Placement note: PR #23986 (#23903) also adds a dated note to ADR-0087, after the 2026-10-16 #23775 note (~line 575). This note sits at the end of the 2026-08-02 addendum (~line 711), a different gap, so the two merge clean in either order. `node scripts/check-adr-anchors.mjs` on this branch: exit 0. ## 维护者速读(草稿) **改了什么**:只在两份 ADR 里各加了一条带日期的注记。ADR-0078 状态行下加一行"引用退役、决策不变";ADR-0087 在 2026-08-02 附录末尾加一条注记,说明"转换冲突通道"已整体退役。没有改动任何已有的决策文字。 **为什么改**:#24001 的代码 PR 删除了"转换冲突"这一整套已发布接口(冲突通知类型、两个转换选项、`conflicts` 数组和 409 错误码 `FLOW_CONVERSION_CONFLICT`)。它唯一的触发来源——旧 HTTP 节点类型被第三方执行器占用时拒绝改名——在 #23543 F5-http 把三个旧名保留后已不可能发生。ADR 里仍描述着这条通道,读者(包括 AI)会以为它还存在,所以要留一条注记让文档跟上实现。 **风险与代价(含回滚)**:纯文档,无运行时影响。回滚即删除这三行。唯一需要留意的是与 PR #23986 同改 ADR-0087,但插入位置不相邻,任一先合都不冲突。 **席位意见**: **你要做的**:代码 PR 通过合同复核后,批准本 PR(Tier H 需授权人工批准);若希望注记措辞或位置调整,直接在评论里指出即可。 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01WdZxJadrrYettvjrqiWeAV --- _Generated by [Claude Code](https://claude.ai/code/session_01WdZxJadrrYettvjrqiWeAV)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent b04f7d1 commit 051aea6

2 files changed

Lines changed: 3 additions & 0 deletions

File tree

‎docs/adr/0078-no-silently-inert-metadata.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# ADR-0078: A Zod-valid metadata instance that is functionally incomplete must fail loudly at author time, uniformly across surfaces (the completeness gate)
22

33
**Status**: Accepted — framework implemented; the cloud half of §2/§3 pending (cloud) (proposed 2026-06-28 · calibrated 2026-08-03). The core mechanism this ADR was written to build **exists and runs**: the shared per-type predicate is `packages/spec/src/kernel/functional-completeness.ts`, the author-time gate is `packages/lint/src/validate-functional-completeness.ts` (registered `gating` in `authoring-rules.ts`, so `os build` / `os validate` / `os lint` enforce it), and the registration-time twin is in `packages/objectql/src/registry.ts`. Landed as Phase 1 (#4547), Phase 3 (#4565), Phase 4 (#4599) and the framework half of Phase 2 (#4577); tracked by #4544, calibrated by #4787. **Not** everything is done — §2's graph-lint re-homing and §3's cloud materialization fix are cloud-owned and unverified from this repo, and two Tier-B candidates are deliberately unshipped. Per-phase detail in [Phasing](#phasing). This supersedes the 2026-07-16 audit reading, which predates every PR above.
4+
**Amended 2026-10-16 ([#24001](https://github.com/objectstack-ai/objectstack/issues/24001)), a citation retired — no decision changes**: the ADR-0087 conversion layer's conflict channel, which cited this ADR's "never silent" rule for a flow-node rename refused over a live executor name (`reservedNodeTypes` / `onConflict`, `ConversionConflictNotice`, the `conflicts` arrays and `409 FLOW_CONVERSION_CONFLICT`), is retired with its last producer: protocol 18 reserves the old callout node types (`FLOW_RESERVED_NODE_TYPES`), so the automation engine refuses such an executor at registration — loudly, which is this ADR's rule applied one step earlier — and no conversion can collide with a live name. The completeness gate and every decision below are unchanged.
45
**Deciders**: ObjectStack Protocol Architects
56
**Builds on**: [ADR-0049](./0049-no-unenforced-security-properties.md) (enforce-or-remove gate — *property* level), [ADR-0054](./0054-runtime-proof-for-authorable-surface.md) (prove-it-runs gate — *integration* level), [ADR-0038](./0038-build-verification-loop.md) (build → verify → self-correct), [ADR-0032](./0032-unified-expression-layer.md) (validate-by-default, no silent failure), [ADR-0072](./0072-reference-scope-and-resolvability.md) (reference resolvability — the reference-side sibling of completeness)
67
**Sibling**: [ADR-0077](./0077-authoring-surface-boundary-hook-flow-validation.md) — 0077 makes *surface-selection* traps loud (a before-flow can't veto); this ADR makes *instance-completeness* traps loud (a bare summary computes nothing). Same "loud-not-silent, AI-is-the-author" family; orthogonal axis.

‎docs/adr/0087-metadata-protocol-upgrade-contract.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,8 @@ re-entering `saveMetaItem` with already-canonical bodies pay nothing.
712712
Reads still skip flows, and now the loop is closed from the other side: a
713713
served legacy body is healed the moment it is saved back.
714714

715+
> **2026-10-16 note** (#24001) — the conflict guard this addendum, the 2026-08-01 one and the 2026-07-31 one describe is retired, and with it the conversion-conflict channel: protocol 18 reserved the old callout node types (`FLOW_RESERVED_NODE_TYPES`, #23543 F5-http), so the engine refuses an executor under one, the guard inside `flow-node-http-callout-rename` went, and with no producer left the `reservedNodeTypes` / `onConflict` options, `ConversionConflictNotice` / `ConversionConflictDetail`, the `conflicts` arrays and `409 FLOW_CONVERSION_CONFLICT` left the published surface (D3 entry `conversion-conflict-channel-removed`). No save, duplication, import or stored-pass row refuses a rename any more. Flows still canonicalize at the engine rather than at the generic metadata seams, now because the engine's registration checks judge a plugin node against the live registry.
716+
715717
## Addendum (2026-08-13) — the changeset disposition vocabulary, and its fifth category (#8299)
716718

717719
Everything above is about the ledger itself. This addendum records the **question

0 commit comments

Comments
 (0)