Institutional Structure + Event Model — Design Spec
Status: DRAFT Date: 2026-04-14 Supersedes: the prior Committee-as-Community pattern from the earlier NYCN institutional design draft (superseded by the layered ontology).
Problem
ICN models sovereign institutions (Cooperative, Community, Federation) but has no way to represent the internal operating structures that real institutions use daily — committees, working groups, roles — or the time-bounded activities they produce — events, projects, programs.
NYCN exposed this gap: its 4 committees and annual summit were being modeled as Community entities, which is a category error. Committees are not sovereign. The summit is not an institution. Both need representation without polluting the entity graph.
Decision
ICN's institutional model has three layers. Each layer has distinct sovereignty, lifecycle, and attachment rules.
Layer A: Sovereign Entities
Person | Cooperative | Community | Federation
Properties:
- Hold identity (DID)
- Own governance domains
- Own treasury accounts
- Join federations
- Persist independently
- Have charter/constitution
These exist today in icn-entity. No changes needed to this layer.
Layer B: Internal Structures
Committee | WorkingGroup | Team | Office
Properties:
- Exist only inside a parent entity
- Authority is delegated, not sovereign
- Cannot join federations independently
- Cannot hold independent treasury (spend through parent's treasury with scoped authority)
- Dissolving the parent dissolves them
- Created and dissolved by governance decisions of the parent entity
Layer C: Activities
Event | Program | Project | Initiative
Properties:
- Time-bounded or purpose-bounded
- Owned by an entity (or co-owned by entity + structure)
- Gather meetings, documents, budgets, tasks, registrations
- Not sovereign — no independent governance or federation membership
- Have lifecycle: Planned -> Active -> Completed/Cancelled
Object Definitions
Structure
pub struct Structure {
pub id: StructureId,
pub parent_entity_id: EntityId,
pub kind: StructureKind,
pub name: String,
pub mandate: Option<String>, // what this structure is authorized to do
pub scope: Vec<String>, // delegated authority scopes
pub status: StructureStatus,
pub created_at: Timestamp,
pub created_by_decision: Option<ProposalId>, // provenance
pub updated_at: Timestamp,
}
pub enum StructureKind {
Committee,
WorkingGroup,
Team,
Office,
}
pub enum StructureStatus {
Active,
Suspended,
Dissolved,
}
RoleAssignment
pub struct RoleAssignment {
pub id: RoleAssignmentId,
pub structure_id: StructureId,
pub person_did: Did,
pub role: String, // e.g., "coordinator", "member", "secretary"
pub authority_scope: Vec<String>, // what this role can do
pub start_date: Timestamp,
pub end_date: Option<Timestamp>,
pub assigned_by_decision: Option<ProposalId>,
}
Activity
pub struct Activity {
pub id: ActivityId,
pub parent_entity_id: EntityId,
pub kind: ActivityKind,
pub name: String,
pub description: Option<String>,
pub status: ActivityStatus,
pub start_date: Option<Timestamp>,
pub end_date: Option<Timestamp>,
pub linked_structures: Vec<StructureId>, // committees contributing to this activity
pub created_at: Timestamp,
pub created_by_decision: Option<ProposalId>,
}
pub enum ActivityKind {
Event,
Program,
Project,
Initiative,
}
pub enum ActivityStatus {
Planned,
Active,
Completed,
Cancelled,
}
Parent-Aware Attachment
All operational objects (Meeting, ActionItem, Document, Proposal) gain a polymorphic parent reference:
pub enum InstitutionalParent {
Entity(EntityId),
Structure(StructureId),
Activity(ActivityId),
}
This replaces the current pattern where action items have domain_id as their only scope. A meeting can belong to a committee. A document can belong to a summit event. A proposal can be scoped to a federation.
Invariants
- Sovereignty boundary: Structures and Activities NEVER appear in federation membership lists. Only Entities join federations.
- Delegation, not independence: A Structure's authority derives entirely from its parent entity. Revoking the parent's charter dissolves all structures.
- Provenance chain: Structure creation, mandate changes, and role assignments are traceable to governance decisions when proposal-backed.
- Treasury scoping: Structures spend through the parent entity's treasury with scoped authority. They do not hold independent accounts.
- Activity lifecycle: Activities have bounded lifecycle. They transition to Completed or Cancelled, never persist as zombie entities.
NYCN Concrete Example
Sovereign layer
entity:nycn— Federationentity:nycn-organizers— Cooperative (child of nycn)entity:greenstar— Cooperative (federation member)entity:cooperation-buffalo— Cooperative (federation member)
Internal structure layer
structure:nycn-steering— Committee in nycn-organizersstructure:nycn-content— Committee in nycn-organizersstructure:nycn-logistics— Committee in nycn-organizersstructure:nycn-finance— Committee in nycn-organizers
Activity layer
activity:ny-cooperative-summit-2026— Event owned by nycn-organizers
Artifact attachment
- Finance committee meeting → parent:
structure:nycn-finance - Summit venue contract → parent:
activity:ny-cooperative-summit-2026 - Federation membership proposal → parent:
entity:nycn - Sponsor outreach task → parent:
structure:nycn-marketing, linked to summit activity
API Shape (REST)
Structures
POST /gov/entities/{entity_id}/structures
GET /gov/entities/{entity_id}/structures
GET /gov/structures/{structure_id}
PUT /gov/structures/{structure_id}
DELETE /gov/structures/{structure_id}
POST /gov/structures/{structure_id}/roles
GET /gov/structures/{structure_id}/roles
DELETE /gov/structures/{structure_id}/roles/{role_id}
Activities
POST /gov/entities/{entity_id}/activities
GET /gov/entities/{entity_id}/activities
GET /gov/activities/{activity_id}
PUT /gov/activities/{activity_id}
Attachment
Existing endpoints (meetings, action items, documents) gain optional query parameter or body field:
POST /gov/domains/{domain_id}/action-items
{ ..., "parent": { "type": "structure", "id": "nycn-finance" } }
GET /gov/structures/{structure_id}/meetings
GET /gov/activities/{activity_id}/documents
Where This Lives in the Codebase
| Concern | Crate | Rationale |
|---|---|---|
| Structure, Activity types | icn-governance |
Governance-scoped institutional objects |
| StructureStore, ActivityStore | icn-governance + apps/governance |
Same pattern as ActionItemStore |
| REST endpoints | apps/governance/src/http/ |
Extends existing governance HTTP layer |
| Entity↔Structure relationship | icn-entity (optional ref) |
Entities may list their structures |
| Gossip replication | governance:{domain_id}:structures topic |
Same pattern as existing governance gossip |
Build Order
- Types + store traits in
icn-governance(~200 lines) - Sled store backend in
apps/governance/src/manager.rs - HTTP endpoints for structures and activities
- Parent-aware attachment on ActionItem, Meeting, Document
- Governance hooks — proposal-backed structure creation/dissolution
- Charter update — correct NYCN charter draft to use structures
What This Does NOT Include
- UI rendering (separate tranche)
- Notifications/digests for structures (Phase 4 from original plan)
- Document storage (Phase 5 from original plan)
- Trust thresholds for structure roles (future)
- CCL enforcement of delegation scopes (future — currently advisory)
Relationship to Existing Plan
This tranche replaces the Meeting Management phase (Phase 3) from the original sprint plan. Meetings still get built, but they attach to structures and activities rather than being standalone institutional objects. The meeting types themselves are unchanged — what changes is their parent scope.
The Decision-to-Action bridge (Phase 1, PR #1532) and Consent mode (Phase 1, PR #1533) remain as-is. They are prerequisites — structures will eventually be created by accepted proposals through the action bridge.