Uh oh!
There was an error while loading. Please reload this page.
fix(spec): state the #7378 three-cell register ruling in the IMetadataService contract, conformance table and reference double - #8481
Conversation
…aService contract, table and reference double (#8350) The contract TSDoc stated the superseded 2026-08-11 option-(a) ruling as current, including a 'PARKED - do not implement' paragraph pointed at behaviour the 2026-08-12 ruling adopted and PR #8349 shipped. Now: - register/get TSDoc states the ruled contract (mismatch refused loudly, non-object/array data refused, type keys on the canonical fold) - METADATA_ROUNDTRIP_CASES gains a 'refused' expectation kind; the five ruled rows carry the ruled answers and are renamed to state them - the reference double refuses rows 1/3 and folds row 2, restating the @objectstack/core guard locally (spec is the dependency root) - objectql driver: RULED_CONTRACT_ANSWERS + wiring tests deleted; all four subjects held to the table directly (the handoff working) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
Uh oh!
There was an error while loading. Please reload this page.
Fixes#8350
The spec half of the #7378 three-cell register ruling (maintainer, 2026-08-12) — the transfer PR #8349 prescribed. Until now
packages/spec/src/contracts/metadata-service.tsstill stated the superseded 2026-08-11 option-(a) ruling as current, including a "(c) PARKED for v18 — do not implement" paragraph pointed at behaviour that is ruled and shipped: a live trap for the next reader of the contract.The three pieces, plus the handoff deletion
contracts/metadata-service.ts—register/getTSDoc now states the ruled contract and names the shared guard: adata.namedisagreeing with thenameargument is refused loudly (VALIDATION_ERROR, 400, locating message naming both spellings, nothing stored); a non-object or arraydatais refused, never accepted-and-dropped or coerced into storability; type stores key on the canonical fold (PLURAL_TO_SINGULAR, converged withcheck:meta-type-normalized). The option-(a) and "PARKED — do not implement" paragraphs are gone, replaced by one sentence recording what they said and when it was superseded.contracts/metadata-service-roundtrip-conformance.ts—MetadataRoundTripExpectationgains arefusedkind (ADR-0112 envelope:codeANDstatus, locating message, nothing stored — stated in the type's TSDoc so every future driver asserts the envelope, not the throw). The five ruled rows carry the ruled answers, and the misnomer ids now state the ruled propositions:key-is-the-name-argument-object/-nonobject→data-name-mismatch-refused-object/-nonobject,primitive-data-roundtrips→primitive-data-refused,array-data-roundtrips→array-data-refused,plural-objects-type-is-its-own-store→plural-type-folds-to-canonical-store(readablethrough the fold). The card flagged the plural rename; the other four are the same misnomer class (a row named "roundtrips" asserting a refusal), and nothing outside the two drivers keys on the ids (grepped repo-wide; the one other mention is a historical changeset, untouched).contracts/metadata-service-roundtrip-conformance.test.ts— the reference double refuses rows 1/3 and folds row 2. The semantics are restated locally with a comment cross-referencingassertMetadataRegisterContract/canonicalMetadataServiceType(@objectstack/core): the dependency direction was verified from package.json — spec declares no@objectstack/*dependency and core depends on spec, so spec cannot import the shared guard; the fold reads the samePLURAL_TO_SINGULARmap, which spec itself owns, so the map has one source.packages/objectql/src/metadata-service-roundtrip-conformance.test.ts—RULED_CONTRACT_ANSWERSand its two wiring tests are deleted in this same PR, as the handoff prescribed: the driver now holds all four subjects to the table directly, andrefusedrows route through the existingassertRefused. The driver-local pins (no-nameregisters, agreeingdata.nameregisters, [finding] MetadataFacade.get/list unwrapitem?.content ?? item, butcontentis a real authorable field — a doc registered through the facade reads back as its Markdown string, not the document #7519contentfidelity, reverse-direction fold) stay.Verification
See the os-dev report on #8350 for full per-package numbers. Highlights: the conformance file green across all four shipped subjects plus the reference double; full
@objectstack/spec,@objectstack/core,@objectstack/metadatasuites green; reverse verification with direction predicted before running.Generated by Claude Code