Skip to content
Nautilo Documentation
Build on NautiloConceptsEntity modelRelationship matrix

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.tsgetUserMemberships, 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.