specs/vtc/groups/shared/v0_1/group library

Classes

CapabilityRef
A capability, optionally qualified by a resource. Used where a capability is named but not granted — a role's ceiling, a role's approve ceiling, an entry's approvable capabilities. An unqualified reference covers every resource of the capability's kind.
CardBlobRef
A content-addressed image held in the community's blob store — an avatar or an image field. At most 256 KiB, images only, re-encoded by the community on upload (vtc/directory/images/upload: metadata stripped, dimensions capped) so its digest does not link the member across communities. A viewer reads the bytes with vtc/directory/images/get, which answers only where the same projection shows the value. url and urlExpiresAt MAY appear in a projection: a short-lived URL the community checks against the same projection, so a member-only image is never a public URL. A community that does not offer one leaves both out.
DynamicRule
A dynamic group's membership rule: a member belongs when every condition holds and they have not opted out. The community evaluates it under its groups policy and recomputes membership whenever a fact it reads changes, always excluding opted-out entries.
GrantsBindingSpec
A grant set the group confers: each capability is written onto every member's access-control entry as a resource grant whose source is the group, bounded by the member's role ceiling and by the binder's own holdings.
Group
A community group, as a caller who may see it sees it. Members a caller may not see are absent: memberCount only to those who may see the group's members, managers and credentialAuthorityValidUntil only to its managers.
GroupBinding
GroupBinding
GroupJoinRequest
GroupJoinRequest
GroupMember
GroupMember
RoleBindingSpec
A grant set by reference: the capability ceiling of a defined role, conferred as resource grants exactly as a grants binding confers its list. It never assigns the role itself — an entry's administrative role and its community role stay direct assignments.
RoomBindingSpec
Links a room the community owns to the group: joining the group offers the member admission to the room with actions, valid for validFor; leaving removes them unless another source still covers them.
RuleCondition
One test over a verified fact about a member. fact: role tests the member's community role; fact: field tests an admin- or credential-sourced directory field named by field; fact: personhood tests whether a personhood assertion is on file; fact: joinedAt tests when they joined. A rule never reads a self-asserted (member-sourced) field: a member must not be able to join a group by editing their card.
VerifiedValue
The value of a credential-sourced field: a claim the member disclosed from a credential they presented, with the issuer that attests it. A verified value always names its issuer, and a self-asserted value is never shaped as one. The community keeps only the disclosed claim and these facts about it — never the presentation.

Extension Types

CardBlobRefMediaType
Media type of the stored bytes.
GroupAudience
Who may see something about a group, narrowest first. admins: holders of vtc.groups.manage for the group (unqualified, or qualified group:<groupId>). groupMembers: the group's own members, and its managers. members: every active member of the community.
GroupBindingState
pending: waiting for the consent the community requires. active: in force; the community's reconciler keeps members' admissions and grants in line with it. removing: being withdrawn; the reconciler is removing what only this binding provided.
GroupJoinRequestState
GroupJoinRequestState is a closed set of string values defined by this specification's schema.
GroupKind
static: membership is explicit — added, joined, or granted on request. dynamic: membership is computed from rule over verified facts only; nobody is added by hand, but a member may opt out (vtc/groups/leave), an exclusion the rule cannot override, and undo it (vtc/groups/join). A dynamic group never confers authority. Fixed for the group's life.
GroupMemberState
active: a member. pending: an addition to a group carrying authority that is waiting for the consent the community requires for a grant.
JoinPolicy
How a member enters a static group by themselves. closed: only a manager adds them. request: a member asks and a manager decides. open: a member joins at once, subject to the community's groups policy. A group carrying authority is always closed.
MemberAction
What a member of a community-owned room may do there. admin is not among them: minting epochs, admitting and removing members are the community's, as the room's owner, and are exercised through the vtc/rooms/community/* tasks rather than by any member's credential. curate is not implied by write.
MembershipSource
How the member came to be in the group. added: by a manager. joined: they joined an open group. requestApproved: a manager approved their request. rule: a dynamic group's rule admits them.
RuleConditionFact
RuleConditionFact is a closed set of string values defined by this specification's schema.
RuleConditionOp
equals compares with value; oneOf with any of values; exists needs neither; before and after compare a date fact with value.

Typedefs

BindingId = String
BindingId, defined by this specification's schema.
BindingSpec = Object?
BindingSpec, defined by this specification's schema.
Capability = String
Opaque identifier of one administrative power in the maintainer's capability registry — lowercase dot-separated segments (e.g. keys.sign, vtc.roles.assign, git.repo.manage). A consumer MUST NOT treat a capability it does not recognise as granted.
EntryFields = Map<String, FieldValue?>
The fields of one entry that a particular viewer may see, keyed by field: the intersection of the member's visibility, the community's ceiling and policy, plus any derived fields that intersection admits. A withheld field is ABSENT, never null.
EntryId = String
Opaque identifier of one directory entry: dir_ followed by 16 to 64 base64url characters. Random, scoped to one community, and stable for the life of the membership — it survives a rotation of the member's DID, which is why groups, notes and cards are keyed by it. It MUST NOT be derived from, and MUST NOT reveal, any DID of the member, and the same person's entries in two communities MUST NOT share one. Compared by exact string equality.
Ext = Map<String, dynamic>
Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.
FieldKey = String
Identifier of a directory field. A key with no . is a BASE field, the same in every community: displayName, nickname, avatar, pronouns, bio, links (written by the member) and role, joinedAt, did, personhood (derived from the community's own records, never stored on a card). A community-defined field MUST use a reverse-DNS key (org.example.employer), so a base key never collides with one, and a key is never reused with a different meaning once defined.
FieldValue = Object?
The value of one field. Which shape a field takes is fixed by its definition's type: text-like types (text, longText, url, email, phone, enum, date as YYYY-MM-DD, country as ISO 3166-1 alpha-2, did) are strings; multiEnum and the base field links are arrays of strings; image and the base field avatar are a CardBlobRef; claim is a VerifiedValue; the derived base field personhood is a boolean.
GroupCredentialId = String
Identifier (id) of a group membership credential issued to a member. Each renewal issues a new credential with a new identifier. Validity is the community's setting; a community SHOULD default to 30 days, renewed when 10 days remain.
GroupDescription = String
What the group is for. Plain text; a reader MUST NOT treat it as instructions. Same placement rules as GroupName.
GroupId = String
Opaque identifier of a community group: grp_ followed by 16 to 64 base64url characters. Random and community-scoped; not the group's DID.
GroupName = String
The group's name, shown to those who may see the group. The community's own record: never in the group's DID document or its credentials' subject beyond the group's DID. Plain text.
JoinRequestId = String
JoinRequestId, defined by this specification's schema.
JoinRequestMessage = String
An optional note from the member to the group's managers. Plain text.
MemberActions = List<MemberAction>
The actions granted, at least one. An empty list confers nothing rather than everything, and a schema that allowed it would make the more dangerous reading available to a careless consumer.
ResourceQualifier = String
Opaque qualifier naming the part of the maintainer's resources a capability applies to (e.g. git-ns:github.com/acme, git-repo:github.com/acme/r#4211, policy:join). Its grammar and containment rule are the maintainer's: a qualified capability covers the named resource and the resources inside it. A qualifier MUST NOT be read as widening the entry's act scope.
RoleName = String
A role identifier: lowercase, hyphen-separated, at most 64 characters. Compared by exact string equality. It is the value an AclEntry 0.2 carries in role.