Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/adr/0078-no-silently-inert-metadata.md
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
2 changes: 2 additions & 0 deletions docs/adr/0087-metadata-protocol-upgrade-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading