Orchestrata Ultimate › Gates › external-tools

Gate: external-tools

At a glance

Purpose Refuse a non-PyPI executable that is declared but missing or too old, or invoked by a literal argv[0] but never declared in [tool.orchestrata.external-tools].
Where it runs The scripts/gates.py battery (registered as external-tools).
Trigger A battery run whose src/, scripts/ or pyproject.toml fingerprint changed.
Exact command python scripts/check_external_tools.py
Blocks Exit 1 on a violation in either direction, 2 when the declaration cannot be read or parsed, 0 clean.
Ruling / ADR RUL-014 ("a declaration nothing checks is prose, not a mechanism", per the module docstring). The Prolog-side refusal of bare toolchain names is ADR-0089.
Last recorded verdict ok: true in the primary checkout's .cache/gates.json (file last written 2026-09-22 10:01 local). wt-MAP-PRECOMMIT has no .cache/gates.json.

What it refuses

A non-PyPI executable this project shells out to that is either declared but missing/too old, or invoked but never declared in [tool.orchestrata.external-tools].

Why it exists

Module docstring: "External-tools gate — enforces [tool.orchestrata.external-tools] against reality, in BOTH directions (RUL-014: a declaration nothing checks is prose, not a mechanism)."

The hole it closes, in its own words:

"check-deps … gates Python IMPORTS; it is structurally blind to a Go/Rust/C binary someone installed by hand, which is exactly how an undeclared external dependency enters unnoticed."

How it runs

Typical failures and how to fix them

Wiring