X_TENANT_LEAK
Means
another tenant's row reached a call's output or effect
Typical cause
the exercise pass called a primitive as tenant B with A's own input (A's ids bound in, where it takes any), before A's own call or after it, and a canary seeded into A's rows, or an id of A's that B was not handed, came back in its output or an effect (a mail, an outbound body, an enqueued job's input) — by an id B chose, or by a statement no tenant predicate scopes. The finding names the path
Fix
x exercise <name> --json — then read the row behind the named path through the repository scoped to ctx.actor, never by the input id alone, nor by an unscoped statement