diff --git a/docs/adr/0078-no-silently-inert-metadata.md b/docs/adr/0078-no-silently-inert-metadata.md index ff1c41b8d40..9e0c883d2e6 100644 --- a/docs/adr/0078-no-silently-inert-metadata.md +++ b/docs/adr/0078-no-silently-inert-metadata.md @@ -1,6 +1,7 @@ # ADR-0078: A Zod-valid metadata instance that is functionally incomplete must fail loudly at author time, uniformly across surfaces (the completeness gate) **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. +**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. **Deciders**: ObjectStack Protocol Architects **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) **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. diff --git a/docs/adr/0087-metadata-protocol-upgrade-contract.md b/docs/adr/0087-metadata-protocol-upgrade-contract.md index 5c2e851ea61..e7ee77e9a88 100644 --- a/docs/adr/0087-metadata-protocol-upgrade-contract.md +++ b/docs/adr/0087-metadata-protocol-upgrade-contract.md @@ -710,6 +710,8 @@ re-entering `saveMetaItem` with already-canonical bodies pay nothing. Reads still skip flows, and now the loop is closed from the other side: a served legacy body is healed the moment it is saved back. +> **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. + ## Addendum (2026-08-13) — the changeset disposition vocabulary, and its fifth category (#8299) Everything above is about the ledger itself. This addendum records the **question