Run the core#52 conformance fixtures in CI; bump dependencies - #65
Merged
Conversation
Issue #32's last open work item was importing and running @haverstack/conformance-fixtures as the acceptance gate for the sync batch — PR #64 adopted the package as a devDependency but only used it for reference, leaving the fixtures themselves unexercised. tests/conformance.test.ts iterates the fixture arrays (discovery, records CRUD, query envelope, patch/delete/undelete, associations, permissions, the version/restore/migrate lifecycle, and error responses) against this server's real HTTP surface, asserting the documented status codes and contract-relevant fields rather than deep-equating server-generated ids/timestamps/cursors against the fixtures' illustrative placeholders. Each describe block's coverage test fails if core adds or renames a fixture this file hasn't been told about, so new fixtures can't go silently unexercised. A few fixtures needing scaffolding this harness doesn't build (attachment carve-out reconveyance, a corrupted stored snapshot, a query-timeout bound the server doesn't implement) are named in per-block SKIPPED sets with reasons instead of being silently dropped. Running the fixtures surfaced a real gap: POST /types called adapter.saveType() directly, bypassing the schema-drift check that only lives in Stack.defineType(). Fixed by routing through defineType() instead, so redefining an existing type non-additively now correctly returns 409 schema_drift. Also bumped @haverstack/conformance-fixtures to the now-published 0.2.0 and updated the rest of the dependency tree within existing major versions (hono, @hono/node-server, pino, pino-pretty, eslint, typescript-eslint, prettier, tsx, @types/node) — no major-version jumps. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QejGigAtq61ZKuwq3738t2
This was referenced Aug 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes the last open item on #32. PR #64 adopted
@haverstack/conformance-fixturesas a devDependency but only read the fixture data by hand ("the tests here are hand-written... rather than a generic fixture-iterating harness").#32's work item was to actually import and run the fixtures in CI as the acceptance gate for the sync batch — this PR does that.tests/conformance.test.tsiterates the shared fixture arrays (discovery, create/query/patch/delete/undelete, associations, permissions, the version/restore/migrate lifecycle, and error responses) against this server's real HTTP surface — not a mocked transport. Server-generated values (ids, timestamps, opaque pagination cursors) are never deep-equated against the fixtures' illustrative placeholders; assertions target the documented status code and the contract-relevant fields, the same granularity@haverstack/adapter-api's own consumption of these fixtures uses on the other side of the wire.SKIPPEDset with a reason. A handful are skipped — the attachment carve-out/reconveyance scenarios (exercised by hand intests/routes/attachments.test.tsinstead), a corrupted stored snapshot (can't be produced through the ordinary write API), and a query-timeout bound this server doesn't implement (a real, separately-tracked gap). Everything else is dispatched. This is what makes it an acceptance gate rather than a snapshot of today's fixture list: bump the package and any new/renamed fixture fails loudly until someone decides how to handle it.Found and fixed along the way:
POST /typescalledadapter.saveType()directly, bypassing the schema-drift check that only lives inStack.defineType()— so redefining an existing type non-additively silently succeeded instead of returning409 schema_drift. Routed the handler throughdefineType()instead; existing/typestests still pass unchanged.Dependencies
Bumped
@haverstack/conformance-fixturesto the now-published0.2.0, and updated the rest of the tree within existing major versions only — no major-version jumps (several are available:@hono/node-server1→2,eslint9→10,typescript5→7,vitest2→4,pino9→10,@types/node22→26 — left alone as a separate, larger decision):@haverstack/conformance-fixtureshono@hono/node-serverpinopino-prettyeslint@eslint/jseslint-config-prettiertypescript-eslintprettiertsx@types/nodeTest plan
pnpm typecheckpnpm lintpnpm format:checkpnpm test— 215/215 passing (48 new conformance tests, no regressions)Generated by Claude Code