Repository navigation
test(cli): pin migrate meta's range rewrite on the --from 17 shape, now that the runtime is protocol 18 - #22539
Merged
objectstack-fleet[bot] merged 2 commits intoOct 9, 2026
Conversation
Adds the protocol-18 row to SHAPES in migrate-meta-protocol-range.test.ts: a ^17 manifest with a dashboard refreshInterval, which the protocol-18 step renames to refreshIntervalSeconds. The door cases (the control refusal, the dry run, --write, the reload, and the range-alone case) now run once per major migrated from. The two comments that said this row was still to come now say what the file pins. Claude-Session: https://claude.ai/code/session_01BmsuLyUeuG5CNpZFMH1jzS Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Oct 9, 2026
Contributor
Author
|
Generated by Claude Code |
Brings in the Temporal Conformance image-pull fix (ce78ff7) so CI runs the fixed ci.yml on this branch. Claude-Session: https://claude.ai/code/session_01BmsuLyUeuG5CNpZFMH1jzS Co-authored-by: Claude <noreply@anthropic.com>
objectstack-fleet
Bot
deleted the
claude/issue-22219-protocol-18-shapes-row
branch
October 9, 2026 23:37
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.
Fixes #22219
Clause-②: no
The diff adds one test row and publishes nothing.
What this adds
from: 17row ofSHAPESinpackages/cli/test/migrate-meta-protocol-range.test.ts, verbatim as the previous holder's dev quoted it (report comment 6056787854, lastout_of_scope_findingsentry). It is a'^17'manifest carryingdashboards: [{ name: 'ops', label: 'Ops', widgets: [], refreshInterval: 300 }], a key the protocol-18 step converts (dashboard-refresh-interval-to-refresh-interval-seconds).describe.each(SHAPES)) run for--from 17, the shape this card was filed on:--writerewrites'^17'to'^18'beside the rename, and only those bytes change;'^17'manifest with nothing to convert gets the range edit alone, and then loads.packages/cli/testis outside@objectstack/cli'sfiles, so this publishes nothing and carries no changeset (skip-changeset).Diff: 1 file, +7 / −4.
The row's three premises, measured first
All readings are at
1cbd8f728, which isorigin/main4e9fe9ff6plus this test edit.packages/spec/src/conversions/registry.ts:11495withtoMajor: 18andretiredFromLoadPath: true. It is listed inMAJOR_18_CONVERSIONSat:15041(order 24).packages/spec/src/ui/dashboard.zod.ts:1774declaresrefreshInterval: retiredKey(...), and its prescription namesos migrate meta --from 17.DashboardSchemafrom this worktree's build (PROTOCOL_VERSION18.0.0) refuses the member withinvalid_typeatrefreshInterval, carrying the tombstone text. The renamed shape parses.STACK_SCHEMA_INVALIDnamingmigrate meta --from 17.--write --jsonreportsappliedandwrittenas exactly that one conversion id.DashboardSchema.safeParsewas run against the published npm packages:@objectstack/spec@17.0.0and@17.3.0accept it. Both refuse the renamedrefreshIntervalSecondsas an unrecognized key.@17.7.0, stillPROTOCOL_VERSION17.0.0, refuses it at the tombstone, because the rename shipped inside the 17 line (retiredAfter: '17.3.0').name,label,widgets, the key), so nothing smaller is valid.Red, then green
1cbd8f728): the file reportsTest Files 1 passed (1)andTests 19 passed (19), which is the 14 earlier cases plus 5 for--from 17.planProtocolRangeneutralised. This was a one-off ablation from the committed state; no file was left behind.scripts/ablation-replace.mjs, wrapped in a bashtrap … EXIT INT TERMthat restores fromHEADon an absolute path and proves the restore.if (compat.status !== 'incompatible') return undefined;becameif (true as boolean) return undefined; // ABLATION-22219 …inpackages/cli/src/commands/migrate/meta.ts.f026976c→4bb72fea. A grep run inside the mutation window read marker 1 and anchor 0.meta.tsrelatively, so it loads fromsrc.Tests 15 failed | 4 passed (19). Every--from 17case went red except its control: the dry run,--write, the reload, and the nothing-to-convert case.--from 17reload answered this card's titled refusal:ProtocolIncompatibleErrorOS_PROTOCOL_INCOMPATIBLE422, "package 'com.example.range' targets protocol ^17 (engines.protocol) but this runtime is protocol 18.0.0. This is a major-version break. Run: objectstack migrate meta --from 17".f026976c08cc, equal to the blob atHEAD;git diff HEADwas empty and the porcelain was empty.Verification, all at
1cbd8f728pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2):Test Files 275 passed (275),Tests 4062 passed (4062),VERDICT command-exit 0.vitest list --project unit --filesOnlylists this file, and the integration list does not.pnpm --filter @objectstack/cli typecheck:VERDICT command-exit 0.check:test-typecheckreports OK at3 file(s) / 28 error(s) / 6 pinned signature(s), unchanged.tsconfig.test.json's program (--listFilesOnly: 1 hit) and has no debt-ledger row.isPathIgnoredis false, andcalculateConfigForFileapplies 5 rules.eslint --no-inline-config --format json: 1 file, 0 errors, 0 warnings, 0 fatal.parserOptionsis{ ecmaVersion, sourceType }, with noprojectand noprojectService, aseslint.config.mjsitself states. So an edit to one test file cannot move any other file's verdict.pnpm lintis declared to CI.dispatch-gates --commands, run with no paths, derived 50 commands, identical to the dispatched list.--ranreports50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN.check:dual-build-cjs-loadsfirst exited 3 (PREREQUISITE NOT MET: dists outside the CLI closure). I built those with turbo (68/68 cached) and re-ran it: exit 0.Acceptance notes
dispatch-gateswarns that the tree is behindorigin/main, and thatscripts/engine-double-contract.pinned.jsonmoved in that range. No commit in4e9fe9ff6..faf634850touches this file,packages/cli/src/commands/migrate/**, the dashboard schema, the conversion registry, the codemod, the config loader or the handshake. Somainwas not merged, per the claim's fence; CI runs on the merge ref.check:type-check-debt(--re-measure) rebuilds package dists in the worktree while it runs. A unit run alongside it hit module-not-found errors mid-rebuild, so I discarded that run and re-took it after the gates finished.refreshIntervalitself. This is an observation only.Generated by Claude Code