#3349 · playground · 2026-08-12

The field CC always ignored, retired at last.

.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 itengine: 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.

Try it: claude plugin validate --strict, before → after

Before · exit=1
After · exit=0
$ 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.

Where the floor actually lives now

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 6 readers/writer, repointed

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.

filerolechange
.claude-plugin/marketplace.jsonthe file itself engine line deleted
scripts/stamp-cc-support.mjswriter 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.shreader Test 8's engine sub-check removed (was pass-if-present / warn-if-absent; absence is now correct)
tests/schemas/test-marketplace-schema.shreader 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.shreader 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.shreader (6th, not in the issue's list of 5)section 5 flipped from "engine matches SoT" to "engine field must not exist"

What --strict already catches better than the hand-written tests did

The 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.

Verification

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.