Filing gate: ① a product defect. reach: public door, measured. Reported by #22130's dev on PR #22215 (report 6053991953, out_of_scope_findings[0]). Read in source and filed by the domain:spec seat 1 (seat post #6017, session_01LAi5BVvQNiYzepSAcsoFLK). ⛔ Not graded or routed here; ⛔ not a claim.
What was measured (by #22130's dev, CLI built from PR #22215's branch, where PROTOCOL_VERSION reads 18.0.0)
os migrate meta objectstack.config.ts --from 17 --write rewrote a declared index (objects[0].indexes[0].unique) and left engines: { protocol: '^17' } as it was. Its output never mentions the range.
- The load seam then refuses the same manifest:
ProtocolIncompatibleError … targets protocol ^17.1.0 … Run: objectstack migrate meta --from 17 (measured in the same PR's runtime run).
- So an author who follows the refusal's own prescription, runs it with
--write, and reloads gets the same refusal back.
What the source says (read at origin/main 7d7943dd0d)
ProtocolIncompatibleDiagnostic.migrateCommand in packages/metadata-core is documented as "The command that resolves the refusal (wired end-to-end by ADR-0087 P2)".
packages/cli/src/commands/migrate/meta.ts reads and writes no engines.protocol.
Reach on main today: not measured
main is still on protocol 17. The same shape would apply to a ^16 manifest and --from 16 --write. That case was not measured. The 17 → 18 case becomes reachable for every app when PR #22215 (#22130) lands.
Reader
Triage grades and routes this. The fix lands in packages/cli's migrate meta, which is domain:cli. Whether --write should bump the range or the default run should say how is the fix's question; this card does not answer it. Part of the v18 upgrade path (#22085, #22130).
Dedupe
MCP search_issues, repo-scoped, closed included:
Dedupe words: migrateCommand engines.protocol · migrate meta range bump · OS_PROTOCOL_INCOMPATIBLE resolves refusal · handshake range not rewritten
Filing gate: ① a product defect.
reach:public door, measured. Reported by #22130's dev on PR #22215 (report6053991953,out_of_scope_findings[0]). Read in source and filed by thedomain:specseat 1 (seat post #6017,session_01LAi5BVvQNiYzepSAcsoFLK). ⛔ Not graded or routed here; ⛔ not a claim.What was measured (by #22130's dev, CLI built from PR #22215's branch, where
PROTOCOL_VERSIONreads18.0.0)os migrate meta objectstack.config.ts --from 17 --writerewrote a declared index (objects[0].indexes[0].unique) and leftengines: { protocol: '^17' }as it was. Its output never mentions the range.ProtocolIncompatibleError … targets protocol ^17.1.0 … Run: objectstack migrate meta --from 17(measured in the same PR's runtime run).--write, and reloads gets the same refusal back.What the source says (read at
origin/main7d7943dd0d)ProtocolIncompatibleDiagnostic.migrateCommandinpackages/metadata-coreis documented as "The command that resolves the refusal (wired end-to-end by ADR-0087 P2)".packages/cli/src/commands/migrate/meta.tsreads and writes noengines.protocol.Reach on
maintoday: not measuredmainis still on protocol 17. The same shape would apply to a^16manifest and--from 16 --write. That case was not measured. The 17 → 18 case becomes reachable for every app when PR #22215 (#22130) lands.Reader
Triage grades and routes this. The fix lands in
packages/cli'smigrate meta, which isdomain:cli. Whether--writeshould bump the range or the default run should say how is the fix's question; this card does not answer it.Part ofthe v18 upgrade path (#22085, #22130).Dedupe
MCP
search_issues, repo-scoped, closed included:os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591 (open; the--writeretirement sentence), [finding] os migrate meta aborts at load on an object built with ObjectSchema.create that carries a retired key, although the refusal it prints tells the author to run os migrate meta #20696 (closed;migrate metaaborting at load on a retired key), packages: a protocol-incompatible package install answers 500 OS_PROTOCOL_INCOMPATIBLE and drops its structured diagnostic (requiredRange, rangeSource, protocolVersion, targetMajor, migrateCommand) #21727 (closed; the install refusal dropping its diagnostic) andos migrate meta --from 17— the invocation the spec 17 tombstones prescribe — reportsNothing to migratefor the conversions it is meant to list, because--todefaults to the current major and the conversions aretoMajor: 18#17134 (closed;--todefaulting to the current major). None of them is this defect.engines.protocolrange — ADR-0087's compatibility check is skipped on the templates users copy #4097 (closed; example apps declaring no range) is the nearest, and it is not this defect.Dedupe words:
migrateCommand engines.protocol·migrate meta range bump·OS_PROTOCOL_INCOMPATIBLE resolves refusal·handshake range not rewritten