Orchestrata Ultimate › Gates › plugin-drift

Gate: plugin-drift

At a glance

Purpose Refuse a plugins/orchestrata mirror that differs from what claude/scripts/gen_plugin.py derives from its source trees.
Where it runs The scripts/gates.py battery (registered as plugin-drift); the "Plugin currency" process gate runs the same command.
Trigger A battery run whose fingerprint changed, or whose last cached verdict was not ok.
Exact command python claude/scripts/gen_plugin.py --check
Blocks Exit 1 on drift, 0 when the mirror is current.
Ruling / ADR ADR-0092 — the plugin is self-contained, pinned by a tag, installed by one verifying command; hook placement ADR-0070 / RUL-035.
Last recorded verdict ok: false in the primary checkout's .cache/gates.json (file last written 2026-09-22 10:01 local; the cause is not recorded there). wt-MAP-PRECOMMIT has no .cache/gates.json.

What it refuses

A hook, command, skill, agent, tool, or infra file added to (or removed from) the claude/ source trees without regenerating the plugins/orchestrata plugin — a stale delivery path shipping silently.

Why it exists

From claude/scripts/gen_plugin.py's docstring:

"Nobody hand-places a file into plugins/orchestrata/ — ever. Everything the plugin ships is DERIVED, on every run, from the claude/ tree that is already the source of truth for the deployed (non-plugin) install… There is deliberately no hand-maintained list of individual files anywhere in this module — every such list in this repo has drifted from the thing it described, which is the entire reason this script exists."

And from the gates.py registry comment:

"This gate is what makes that generation ENFORCED rather than available: a hook, command, skill, agent, or tool added to claude/ without regenerating fails the battery instead of silently shipping a stale plugin. Same failure class as settings.hooks.json (declared, read by nothing, drifted for months)."

The plugin also re-emits the repo's own .claude/settings.json guards, because "in a session launched anywhere else all 25 of them silently did not exist (measured 2026-08-23)" — and that registration list is "DERIVED, never retyped."

How it runs

Typical failures and how to fix them

Wiring