Cross-backend parity suite for the steward-revoke seam
(CellGrantRevokeAuthorize) on cell_grant_revoke.
Like the creation authorizer, the revoke hook adds no method, column, or wire
shape, so the schema-snapshot and action-manifest parity gates are blind to a
TS↔Rust divergence in it — the fence, the refusal shape, the audit stamp.
This behavioral case is the gate that catches one.
Both spines mount the same test policy (the TS spine binary via
test_cell_grant_steward_revoke_authorize, the Rust testing_spine_stub via
TestCellGrantStewardRevokeAuthorize): a scoped participant grant stewards
its scope. A cell owner shares a private cell with participant at a scope;
the suite asserts every spine agrees on:
- the scope's steward revokes — a non-manager holding
participant at
the grant's scope revokes it: {ok: true, still_admitted: false}, the grant
gone from the owner's list, and the cell_grant_revoke audit row stamped
steward: true. - another scope's steward gets the 404 mask —
cell_grant_not_found, the
same refusal as no hook, and the grant stays. - a scopeless role grant is fenced off — a caller holding
participant
globally *and* at a scope still gets the 404 on a grant naming no scope:
the spine never asks the hook, which would have admitted the global grant
had it been asked with a null scope.
Gated on capabilities.cell_relations (the grant verbs) and
capabilities.cell_gated_create (the reference spines' test cell policies,
which this one rides beside). The hook's in-process coverage, including the
manager, self-revoke, actor-shaped and deleted-cell fences, is
auth/cell_grant_actions.authz.db.test.ts.