Institution Package Bootstrap Contract
Status: draft reference
This document defines the generic bootstrap contract for institution packages inside the ICN monorepo. It is intentionally generic: it describes how package-owned manifests are loaded and planned without introducing institution-specific semantics into ICN core.
Entry Point
Each package exposes a top-level bootstrap.yaml manifest.
Required fields:
manifest_version: v0
package_id: nycn
package_kind: institution
charter:
path: charter/nycn-federation.charter.yaml
seeds:
- order: 0
kind: entity-seed
path: seed/00-nycn-federation.seed.yaml
Loading Semantics
- Load
bootstrap.yaml. - Resolve the package-owned charter path relative to the package root.
- Parse and validate the charter as a CCL document.
- Load seed manifests in strictly increasing
order. - Verify each seed file's internal
kindmatches thebootstrap.yamlentry. - Build a generic bootstrap operation plan from the loaded seeds.
Supported Seed Kinds
entity-seedgovernance-domain-seedstructure-seedactivity-program-seedmilestone-template-seedrole-assignment-seed
Ordering Contract
The current stable bootstrap order is:
- federation/entity seed
- organizer cooperative seed
- governance-domain seed
- structures/committees seed
- activity/program seed
- milestone seed
- role-assignment seed
This order exists to preserve generic dependencies:
- structures need parent entities
- governance domains must be declared before program writes can target them
- activities/programs need parent entities and linked structures
- milestones need target programs
- role assignments need target structures and, for live application, real DIDs
Current Executor Reality
Today the platform provides:
- generic manifest and seed types in
icn-governance::bootstrap - package loading, charter validation, ordering checks, and plan emission through
icnctl institution bootstrap validate|plan - a first generic live executor through
icnctl institution bootstrap apply
Live Apply Semantics
icnctl institution bootstrap apply is intentionally honest about platform gaps.
It currently does:
- validate the package-owned charter locally before any live writes
- create entities through the generic entity gateway API
- provision governance domains through the generic governance API when domain seeds provide usable member DIDs
- create structures through the generic governance gateway API when the seed does not require fields the current write API cannot persist
- create programs through the generic governance gateway API only when the target governance domain already exists and the authenticated caller is allowed to write there
- create activities through the generic governance gateway API including
linked_structureswhen referenced structures are live-resolvable - create milestones through the generic governance gateway API only when the target program already exists as a live program ID
- apply role assignments when a real
person_didexists and the target structure exists as a live structure ID - defer role assignments that still have no
person_did
It does not yet do:
- register or activate package-owned CCL charters through a generic live charter sink
- persist structure
scopefields through the current generic structure create API - preserve package-local aliases as runtime IDs for structures, activities, programs, or milestones
governance-domain-seed records use the same generic shape as POST /v1/gov/domains:
idnameprofilequorum_percentapproval_percentvoting_period_daysmembers- optional
decision_mode - optional
max_objections
For bootstrap convenience, members may include the explicit placeholder
$bootstrap_subject_did, which resolves to the DID used for gateway bootstrap authentication at apply time.
The apply report therefore separates:
completed: real writes that succeededdeferred: intentionally skipped writes such as role assignments without DIDsunsupported: plan steps whose current generic runtime surfaces cannot faithfully persist the package manifest shapefailed: a concrete live write failed and apply stopped
NYCN Reality
With the current NYCN package and current platform surfaces:
- entities can be created live
- governance domains can be provisioned live from package seeds
- committee structures can be created live
- the summit program is no longer blocked on out-of-band domain provisioning
- the summit activity is no longer blocked by
linked_structurescontract mismatch - milestones can proceed when summit program and activity writes succeed
- charter registration/activation remains validation-only
That means NYCN is now partially live-applicable, but not yet fully bootstrappable end-to-end.