# X_TENANT_WRITE_CROSSED

## Means

a call by one tenant changed another tenant's row

## 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), and a row seeded for A hashed differently after B's call, or was gone — by an id B chose, or by a statement no tenant predicate scopes. Never on a `tenant: 'none'` job handed none of A's ids: its run is the same whoever enqueues it. The finding names the table and the row's id

## Fix

`x exercise <name> --json` — then write the named row through the repository scoped to `ctx.actor`, never by the input id alone, nor by an unscoped statement

[Testing](/error-codes#testing)
