REL-GRP-HUM: Group ↔ Human
Implemented Group ↔ Human relationship or deliberate no-direct-edge invariant.
Stable ID: REL-GRP-HUM
Entities: GRP (Group) ↔ HUM (Human)
Relationship status: implemented
Audited relationship
Human group membership is current.
Design
Canonical membership edge. Humans — and only Humans — join Groups. Cardinality: M:N — one Human joins many Groups (e.g. owners and members simultaneously, receiving the union of both Role bundles); one Group has many Human members (e.g. multiple Humans in members). Agents do not join Groups; permissions ride with the Human, not the (Human, Agent) pair.
Implementation
Canonical schema: group_members.user_id → users.id, composite PK (group_id, user_id). The actor_id column is gone, along with the runtime kind='user' check — an agent-actor uuid cannot be inserted as a member because users.id never contains it (locked by the FK invariant test in packages/trust/tests/integration/personal-policy-resolver.test.ts).
Queries in packages/trust/src/queries.ts — getUserMemberships, getUserCapabilities, findUsersWithCapability, findUserHighestRoleSlug — key on users.id directly. Effective Capabilities = union across every Group the Human is in; no per-Agent narrowing.
group_members.granted_by retains its actors.id FK for polymorphic audit attribution. Membership itself remains Human-keyed.
Verification state
This article remains at the original relationship granularity for AI and
maintainer use. Its current-versus-target classification was reconciled before
migration; public code-anchor verification remains in progress against
Nautilo 4b3ea604.