.claude-plugin/marketplace.json carried an engine field since
#2116 as a hand-maintained, machine-readable install gate. claude plugin validate --strict
(CC 2.1.226+) says otherwise: CC never read it — engine: Unknown field. Claude Code
ignores it at load time. That makes --strict permanently red on this repo, and the
field's only real job — a CC-version floor — already has a proper owner:
shared/cc-support.json's supported_floor, the existing single source of truth
that scripts/stamp-cc-support.mjs propagates everywhere else. This PR deletes the redundant
copy, repoints its 6 readers/writer, and retires the hand-written assertions --strict now
makes redundant.
claude plugin validate --strict, before → after$ claude plugin validate .claude-plugin/marketplace.json --strict Validating marketplace manifest: .claude-plugin/marketplace.json ⚠ Found 1 warning: ❯ engine: Unknown field 'engine'. Claude Code ignores it at load time. ✘ Validation failed (--strict treats warnings as errors) exit=1 ← --strict can never pass on this repo while engine ships
$ claude plugin validate .claude-plugin/marketplace.json --strict Validating marketplace manifest: .claude-plugin/marketplace.json ✔ Validation passed exit=0 ← captured live against the installed CC 2.1.228 binary, not a mockup
Both panels are real claude plugin
validate stdout. The "before" run replays the field from git show HEAD: against a temp
copy; the "after" run is the working tree as this PR ships it. New script:
npm run verify:cc-plugin-validate joins the existing verify:cc-keys /
verify:cc-commands local-only family (CC binary isn't installed in ci.yml, per
#3307's caveat) so this stays runnable on demand without a CI dependency.
shared/cc-support.json's supported_floor
was already the single source of truth — the marketplace engine field was never anything
but a derived, auto-stamped copy of it (stamp-cc-support.mjs kept them in sync). So "moving the
floor declaration" here means exactly one thing: stop writing a copy CC ignores into a CC-owned file.
No new field was added to cc-support.json — there was nothing left to move.
The issue named 5 (the writer + 4 tests). Grepping the repo
for every literal "engine" / .engine reference outside plugins/ (the
build-generated copy) turned up a 6th: test-cc-version-floor.sh's section 5 also asserted
marketplace.json's engine matched the SoT — it would have gone red the
moment the field was deleted. Fixed alongside the other 5 so nothing was left silently broken.
| file | role | change |
|---|---|---|
.claude-plugin/marketplace.json | the file itself | engine line deleted |
scripts/stamp-cc-support.mjs | writer | marketplace.json stamp() call removed — auto-drops it from the derived
STAMP_TARGETS in the stamper's own integration test, no second edit needed |
tests/plugins/structure/test-plugin-structure-compliance.sh | reader | Test 8's engine sub-check removed (was pass-if-present / warn-if-absent; absence is now correct) |
tests/schemas/test-marketplace-schema.sh | reader | root-level engine format check removed; engine dropped from the valid-root-fields
allowlist. Plugin-entry checks (unrecognized keys inside plugins[], local git-subdir path
existence) stay — CC's own validator silently ignores unknown keys inside plugin entries
(proven #3340), so that coverage isn't duplicated |
tests/schemas/test-plugin-schema.sh | reader | stale comment fixed (engine is no longer "only allowed in marketplace.json root" —
it isn't allowed anywhere); the forbidden-in-plugin.json assertion itself is untouched, still a live
regression guard |
tests/manifests/test-cc-version-floor.sh | reader (6th, not in the issue's list of 5) | section 5 flipped from "engine matches SoT" to "engine field must not exist" |
--strict already catches better than the hand-written tests didThe milestone's governing rule: CC mechanism is the
substrate, ork's need is a layer on it. --strict is now that substrate for marketplace root-field
shape — it caught engine itself, something none of the 6 files above ever flagged despite
years of hand-maintenance. What it does not replace: field-shape checks inside a plugins[]
entry (proven silently ignored, #3340) and any check that needs local filesystem state
(--strict validates a schema, not whether a declared git-subdir path resolves on this checkout).
Those assertions were kept, not retired.
claude plugin validate .claude-plugin/marketplace.json --strict exit=0 (was exit=1) npm run build clean, plugins/ regenerated, no count drift npm run test:manifests all passed tests/manifests/test-cc-version-floor.sh 7 passed, 0 failed tests/schemas/test-marketplace-schema.sh passed, 0 errors tests/schemas/test-plugin-schema.sh passed (2 pre-existing unrelated warnings) tests/plugins/structure/test-plugin-structure-compliance.sh 29 passed, 0 failed tests/integration/test-cc-support-stamper.sh 10 passed, 0 failed tests/security/test-jq-injection.sh 4 passed, 0 failed (no stale allowlist entries) npm test (full suite) 24/25 categories passed — see PR body for the 1 pre-existing flake
Scope note. claude plugin validate --strict ./plugins/ork (the whole
plugin tree, not just marketplace.json) currently reports 2 pre-existing warnings unrelated to #3349 —
a root CLAUDE.md not loaded as project context, and agents/shared/status-protocol.md
missing YAML frontmatter. Both predate this PR and are out of scope here; "prove --strict passes" refers to
marketplace.json, the actual subject of #3349, which is clean.