Skip to content

Commit 6a38a41

Browse files
committed
docs(adr): ADR-0078 and ADR-0087 record the conversion-conflict channel's retirement
Claude-Session: https://claude.ai/code/session_01WdZxJadrrYettvjrqiWeAV Co-authored-by: Claude <noreply@anthropic.com>
1 parent fd9664f commit 6a38a41

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
@@ -710,6 +710,8 @@ re-entering `saveMetaItem` with already-canonical bodies pay nothing.
710710
Reads still skip flows, and now the loop is closed from the other side: a
711711
served legacy body is healed the moment it is saved back.
712712

713+
> **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.
714+
713715
## Addendum (2026-08-13) — the changeset disposition vocabulary, and its fifth category (#8299)
714716

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

0 commit comments

Comments
 (0)