ADR 0024: Institution Package Manifest Schema
Status
Proposed (2026-04-26). Names the forward direction. Back-fills the partial reality (BootstrapSeedManifest covers entity/structure/role primitives) and identifies the gap (no formal schema for institution-specific extensions like indicators, signal rules, allocation templates). Modifiable.
Context
ADR-0020 named the activation chain from manifest-on-disk to a member-facing standing surface and locked the contract surface ICN owns at each step. Step 1 is "package manifest schema." Today, BootstrapSeedManifest covers the four primitive seeds (entity, structure, activity, role) and a person-directory overlay shape, with operating_purpose: Option<String> as the sanctioned home for institution-specific taxonomy.
What does not exist today is a formal schema for the broader institution-package contract:
- Indicator definitions (what does this institution count and how?)
- Signal rules (what observations trigger what attention?)
- Allocation templates (what shape does a fresh allocation request take here?)
- Locale and accessibility metadata (which languages, which assistive defaults?)
- Package-level operating intent and stewardship metadata.
Without a schema, packages extend ad-hoc. Different packages develop different shapes for the same concept; the boundary contract erodes.
Decision (proposed)
Institution packages declare a package.yaml manifest validated against a stable schema with the following sections:
- Identity. Package name, version, ICN-runtime-version-target, package authority chain.
- Bootstrap seeds. Entity, structure, activity, role records as today (
BootstrapSeedManifest). - Person-directory overlay reference. Pointer to the private overlay file (real-DID binding, never in public package).
- Indicator definitions. Named indicators with kind (count, ratio, presence), source (which records to count), schedule (how often to recompute).
- Signal rules. Named rules with trigger condition, attention target, escalation policy.
- Allocation templates. Default shapes for allocation requests (fields, validators, default authority requirements).
- Process catalog (forward). References to CCL process definitions (ADR-0023) the package activates.
- Locale and accessibility metadata. Declared languages; assistive defaults; deadline-justice profile.
- Action card templates (forward). Template references for
/me/action-cards(ADR-0027).
Schema validation rejects unknown extension shapes by default. Packages may declare extensions: { ... } blocks under explicit opt-in for ICN-future-version fields.
Boundary rules
- ICN owns the manifest schema and the four primitive seed kinds. Packages do not redefine them.
- Packages own the content of every section (which entities, which indicators, which signal rules). ICN does not learn institution-specific nouns.
operating_purposestrings remain opaque to ICN; the manifest schema validates that they are present where required, not what they mean.- Indicator and signal rule content is package-side; the shape (count vs ratio, threshold vs duration) is ICN-side.
Consequences
- Packages become validatable: a package either matches the schema or does not. Drift becomes mechanically detectable.
- Cross-package learning becomes possible: shared indicator and signal-rule patterns can be lifted into the schema as new kinds.
- Trade-off: schema growth has a cost. Each new section is a future migration burden if the substrate evolves.
- Trade-off: validation has to be lenient enough that real institutions can express what they need. Over-strict validation produces packages that satisfy ICN but do not satisfy their institutions.
Implementation status
Partial.
- Implemented: Bootstrap seeds, person-directory overlay binding,
operating_purposefield. See icn/crates/icn-governance/src/bootstrap.rs. - Not implemented: Indicator definitions, signal rules, allocation templates, process catalog, locale metadata, action-card templates as schema sections. Reference institution packages currently express these informally outside the validated manifest.
To call this implemented would require:
- Schema definition for each new section in a Rust type or JSON-Schema artifact under
icn-governanceor a newicn-packagecrate. - Validator integration in the bootstrap-apply CLI path.
- Migration story for existing packages that don't declare these sections (the schema must be additive).
Alternatives Considered
| Alternative | Why rejected |
|---|---|
| Keep extensions ad-hoc per package | Erodes the boundary contract; every package becomes its own bespoke shape; cross-package patterns are unobservable. |
| Define one giant rigid schema covering every conceivable institution | Different institutions are differently shaped. Over-rigid schemas produce false friction at the boundary; institutions either fork or work around. |
| Use a generic config schema (JSON-Schema, OpenAPI) without ICN-specific structure | The point is not to validate YAML; it is to validate institutional shape. ICN owns the shape vocabulary. |
| Defer until a second institution package is in production | Two packages without a schema cement two different shapes. The schema work is cheaper before the second package than after. |