Guard / foldkit-guard

When a rule refuses

CauseServerClient
A row's Read refusednot returned, not settlednot found; a tombstone
A member's Read refused (omit)the field settled, unreadthat field Unavailable
A member's Read refused (redact)the replacement valueReady with it, by design indistinguishable
A relation's Read refusedwithheld, as a member'sunavailable
A write refusedForbidden, a 403 over JSONData.mutation is Failed with _tag: 'Forbidden', reason from an explain
A write moved a row out of its writer's sightanswered in deletedtombstoned; it leaves every list
A delete of a row its writer cannot seenothing deleted; answered gonetombstoned
A Sync edit refusedrejected by its id, with its reasonthe replica drops it, with the reason
An agent's capability refused—AgentAuthorizationError before dispatch, its message an explain's; not offered while available says no
A Source left unguardedGuardServer.validate throws at startup—

A refusal says why only through Guards.explain: a plain one is forbidden, so a probing caller learns only "no", and a row a principal may not read is not found rather than forbidden, so its existence does not leak.