Skip to content

The blank template declares two protocol versions that disagree by eleven majors — specVersion: "^6.0.0" in the manifest, engines.protocol: '^17' in the config, and only the second is synced #9264

Description

@os-steve

Found while implementing #9152 (scaffolding the Support Desk fixture from the blank template to re-derive a transcript). Out of that card's scope — docs-only. Filed unassigned.

Measured on origin/main

The one shipped template declares its protocol compatibility in two places, and they disagree:

filekeyvalue
packages/create-objectstack/src/templates/blank/objectstack.manifest.jsonspecVersion^6.0.0
packages/create-objectstack/src/templates/blank/objectstack.config.tsengines.protocol^17

packages/spec is at 17.0.0.

Why they drifted

scripts/sync-template-versions.mjs re-stamps exactly one of them. It rewrites the config:

/engines:\s*\{\s*protocol:\s*'[^']*'\s*\}/ → `engines: { protocol: '^${major}' }`

and hard-fails if that stamp is missing:

✗ sync-template-versions: template objectstack.config.ts has no engines.protocol stamp to sync

It never reads objectstack.manifest.json. So engines.protocol has tracked every major bump and specVersion has sat at ^6.0.0 — the value it presumably held when the sync script was written to cover the other key.

Why this is not cosmetic

The two keys are load-bearing in different places — engines.protocol is the runtime compatibility range ADR-0087 D1 uses to refuse a package at the boundary, and specVersion is part of the template-manifest contract ($schema: template-manifest.json) that the template registry reads. A registry consumer trusting specVersion is being told this template targets a protocol eleven majors retired.

It is also a silent class: the sync script's own failure mode is loud for the key it covers and mute for the key it does not, so a green sync-template-versions run has never been evidence about specVersion.

For triage


Generated by Claude Code

Metadata

Metadata

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions