chore: enforce release readiness - #35
Draft
leoafarias wants to merge 4 commits into
Draft
Conversation
This was referenced Aug 8, 2026
leoafarias
force-pushed
the
agent/rockets-firestore-parity
branch
from
August 8, 2026 23:53
4b84dcd to
967b45b
Compare
leoafarias
force-pushed
the
agent/rockets-release-readiness
branch
from
August 8, 2026 23:53
f8dcfce to
bdb867e
Compare
leoafarias
force-pushed
the
agent/rockets-firestore-parity
branch
from
August 8, 2026 23:56
967b45b to
4c27233
Compare
leoafarias
force-pushed
the
agent/rockets-release-readiness
branch
from
August 8, 2026 23:56
bdb867e to
355efe1
Compare
This was referenced Aug 9, 2026
leoafarias
force-pushed
the
agent/rockets-firestore-parity
branch
from
August 9, 2026 16:14
4c27233 to
094e9e5
Compare
leoafarias
force-pushed
the
agent/rockets-release-readiness
branch
from
August 9, 2026 16:14
355efe1 to
0414fe5
Compare
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
Turn the 1.0 preview requirements into a gate that actually runs, and fix what running it exposed.
Before this PR,
release:checkproved the repository compiles and passes its own tests. It proved nothing about what gets published or consumed. Every one of the following was true and undetected:files/main/types/exports/binresolve to real built artifactsbinentries avoidts-node.tsAfter this PR,
release:checkruns: build → artifact verification (60 targets) → dry-run pack → typecheck → lint → unit → package e2e → real Firestore emulator → build all examples → e2e all examples.Stack: based on #37 (
agent/rockets-firestore-parity), the top of the four-PR stack. Review this diff againstagent/rockets-firestore-parity, notmain.What changed and why
1. Package artifacts are verified against the built tree
scripts/verify-package-artifacts.mjswalks every public@concepta/*package and fails on: afiles/main/types/exports/bintarget that doesn't exist, any target pointing intosrc/, a missingmainortypes,publishConfig.accessthat isn'tpublic,engines.nodebelow 20, and anybinscript that pulls ints-node/registeror reaches into../src/. Currently 60 targets across 6 packages.release:packagesruns it, then dry-run packs every publishable workspace.This is why
engines.node >= 20and the packaging fields are normalized in #34, #36, and #37 — those PRs carry the fixes; this PR adds the check that keeps them fixed.2. Firestore parity runs against a real Firestore
firestore-backend.emulator-spec.tsseeds four documents covering missing / null / number / string shapes, runs the same query through both the Admin backend and the in-memory backend, and asserts identical result ids. Wired throughfirebase.json,firestore.rules,vitest.firestore.config.mts, and atest:firestore-emulatorscript that runs the suite insidefirebase emulators:exec. The suite is excluded from the packagetsconfigso it never enters the published archive.This is the verification for #37, which lands two PRs below. See Review focus (2) for exactly how much of #37 it covers.
3. Vitest configs load natively
vitest.config.ts→.mts,vitest.shared.ts→.mts, and the three example e2e configs likewise.test:config-native(vitest list --configLoader native) asserts it, and runs on the Node 22 CI job — the loader path that would otherwise only break for a consumer.4. Examples are part of the gate, and stop shadowing the packages
samples:buildandsamples:test:e2enow includesample-code-review, and both run insiderelease:check. The three example-localdefine-typeorm-repository.tscopies are deleted in favor of the realdefineTypeOrmRepositorythat #34 moved into@concepta/rockets-repository-typeorm— so the examples now demonstrate the shipped API instead of a private fork of it.5. CI split across two Node versions
A new
release-readinessworkflow runs the full gate on Node 20 with Java 21 and a cached Firestore emulator. The existingci-pr-testjob stays on Node 22 and picks up the native config check. Node 20 is the floor the packages declare; Node 22 is where the native loader is exercised.6. Documentation and metadata for the final public surface
README.mdandCONFIGURATION.mdrewritten aroundcreateServer/defineAuthAdapter/defineTypeOrmRepository/defineRocketsAuth;MIGRATION-SUMMARY.mddeleted; the stale generatedswagger/swagger.jsonand the rootgenerate-swaggerscript removed (the generator itself is removed in #34 and #36); the broad rootpath-to-regexpresolution dropped, which the Firebase CLI requires in order to keep its Express-compatible dependency.Breaking changes & compatibility
enginesis now enforced by the release gate.path-to-regexpresolution removedfirebase-toolsto function.yarn generate-swaggerandswagger/swagger.jsonremoveddefineTypeOrmRepositoryfrom@concepta/rockets-repository-typeormNo package version bump is included — versioning stays a separate release decision.
Review focus
Ranked by blast radius. The first two are decisions rather than defects.
1.
firebase-toolsis a very large root devDependency —package.json,yarn.lockfirebase-tools@15.15.0adds 398 packages and ~3,250 lockfile lines, which is the bulk of this diff, to support one three-assertion parity suite. It also installs for every contributor who runsyarn install, not only for the job that needs it. Alternatives worth weighing before merge: install it only in therelease-readinessCI job, or isolate it in a dedicated non-published workspace. Flagging it explicitly so the cost is accepted rather than absorbed silently.2. The emulator suite covers three of #37's claims, not all of them
Verified against real Firestore: explicit-null vs. missing nested fields, cross-type range exclusion, and nested ordering with recursive timestamp normalization. Not covered by an emulator assertion: document-ID intersection inside
AND, branch filters applying on the ID-selected path (the widening bug #37 fixes), duplicate-create rejection, and thenin/betweenpost-filter changes. Those remain in-memory-only. Worth deciding whether the gap is acceptable for 1.0 or whether the suite grows before release.3. Deleting
swagger/swagger.jsonremoves a documented source of truth —.claude/rules/editing-guidelines.mdThat rule file still names
packages/rockets-server-auth/swagger/swagger.jsonas "Public API surface for auth package". The artifact was stale — it documented removed/oauth/*routes and the oldGET /recovery/passcode/{passcode}, and none of #36's four new recovery routes — so deleting it is right. But the rule needs to either point somewhere else or be removed; nothing in this stack updates it.4. Neither workflow runs while the stack is stacked
ci-pr-test.ymlandrelease-readiness.ymlboth trigger onpull_request: branches: ['main']. #36, #37, and #35 target their parent branches, so they currently report no checks — only #34 gets CI. This is intentional rather than broken: retargeting each PR tomainimmediately before merging is the documented merge process, and that is exactly when the gate should run. But it does mean GitHub shows no signal on this PR until it is retargeted — all gates below were run locally instead.5.
release:checkis now long and serialBuild → artifacts → dry-run pack → typecheck → lint → unit → package e2e → emulator → build 3 examples → e2e 3 examples. Fine for a release gate, painful as an inner-loop command. The narrower scripts (
test,test:e2e,release:packages) remain available individually.Type of Change
Verification
Full
release:checkscope, run locally at this branch's tip after rebasing the stack onto the current #34 and #36 heads:corepack yarn buildcorepack yarn typecheck:speccorepack yarn lint:allcorepack yarn release:packagescorepack yarn testcorepack yarn test:e2ecorepack yarn test:firestore-emulatorsample-servere2esample-server-authe2esample-code-reviewe2ecorepack yarn install --immutableTwo verification notes, in the interest of not overstating the result:
One e2e run in three failed with two rotating victims (
rockets-core.e2e-spec.tsandrockets-for-root-async.e2e-spec.ts). Both pass in isolation and the immediately following full run was clean at 33/33. This matches the environmental pattern documented atCHANGELOG.mdunder "Intermittent e2e failures". No assertion was weakened and no test was retried in-suite to hide it.GitHub shows no checks on this PR for the reason in Review focus (4). The results above are local.
Build succeeds
Unit tests pass
E2E tests pass
Lint passes
Checklist
Scope boundaries with the stack
This is the top of the stack (#34 → #36 → #37 → #35). Content that logically belongs to a release-readiness PR but is deliberately not here, because an earlier PR already owns the file:
engines.node >= 20and packaging-field fixes forrockets-core,rockets-server,rockets-repository-typeorm,rockets-adapter-firebaserockets-server-auth; removal of therockets-auth-swaggerbin andSWAGGER.mdrockets-repository-firestoreThe inverse also holds and is worth knowing while reviewing: this PR carries the verification for changes that land below it — the emulator contract proves #37, and the example rewrites exercise #34's
createServer/defineAuthAdapter/defineTypeOrmRepositoryand #36'sdefineRocketsAuthcontributions. Merging the stack out of order, or merging #37 alone, ships those changes without their proof.