ADR-0086: ICN deployment profiles and public/private infrastructure boundary
Status
proposed — this record states the deployment decision for review. It does not
adopt itself, authorize a production deployment, or certify any profile as
production-ready.
implementation_status: partially implemented — repository paths exist for all
four profiles, but only the assembled Debian appliance has a current, retained
build-and-boot witness. Backup/restoration, artifact signing, reproducibility,
two-node institutional operation, and generic Kubernetes reconciliation remain
incomplete.
Context
ICN currently exposes several overlapping ways to run icnd: a Debian appliance
builder, multiple Docker Compose stacks, a generic OCI Dockerfile, two
Kubernetes trees, a Helm chart, and native Linux instructions. Until PR #2455,
the public repository also had a workflow that automatically deployed to a
specific private K3s homelab.
Those paths do not have the same purpose or evidence. Treating them as peers has made private cluster liveness look like product readiness, left developers with several conflicting Compose entry points, and obscured the custody boundary for institution-owned identity and durable state.
An exact integrated appliance witness at
67a6566e2335be108ca69bb5d60e0cfb761e63b5, which includes merged K3s-lane
retirement 75d157503f168fb534c34cd16edf9bf6b8721254, established a stronger
factual baseline:
- one Debian QCOW2 was built from repository code and a pinned base-image hash;
- its typed manifest re-hashed the image, base,
icnd, andicnctl; - a clean VM boot completed first-boot initialization, generated a per-instance
identity and secrets, started
icndunder systemd, and returned health; - a fixture organizer/member loop and its negative capability checks passed;
- the same retained overlay preserved node identity and a completion receipt
across
icndrestart and VM reboot; - the rehearsal workspace itself was process-local and did not survive restart;
- the artifact remained explicitly non-production, unsigned, mutable, and dependent on networked package installation during the build.
The decision must preserve those exact claim boundaries.
Decision
ICN has four deployment profiles with distinct purposes and no implied promotion between them.
Profile A: sovereign appliance node
The Debian appliance VM is the canonical ICN node artifact.
Its baseline is one role-neutral image running native systemd services. Each booted instance creates its own identity and secrets and owns its own durable state. Post-boot configuration may specialize that image as an institution node, member node, witness/archive node, domain host, or service host. Separate image forks are not created for each role unless verified technical evidence requires them.
The canonical appliance contract requires:
- a Debian-based QCOW2 or raw image;
- native systemd startup and restart behavior;
- per-instance identity and secret generation;
- institution-owned durable state;
- explicit genesis, activation, or enrollment;
- local backup and export;
- independent restoration, including the configuration secrets needed to open the restored keystore;
- manifest hashes and a release path that states signing and immutability honestly;
- no Kubernetes dependency.
Items 1–5 have partial runtime evidence. Item 6 exists as generic icnctl
backup tooling, but it writes a data-directory tar archive and is not yet an
encrypted appliance recovery contract. Item 7 is open: the current data backup
does not include /etc/icn/icnd.env, so restoring /var/lib/icn alone is not
an independently operable appliance recovery. Items 8–9 are only partially
met: manifests exist and Kubernetes is not required, but appliance artifacts
are not yet signed or reproducibly built.
Fixture/demo services are optional add-ons. Their state and claims are not the sovereign-node durability contract.
Profile B: disposable local development network
deploy/devnet/docker-compose.yml is the proposed canonical Compose entry point
for fast multi-node development, protocol and gossip tests, integration work,
and disposable demos.
This profile carries no institutional-custody, restoration, production, adoption, or federation claim. Other Compose files are compatibility or historical material until a separate cleanup maps or retires them; this ADR does not delete them.
Profile C: optional hosted cluster
Kubernetes or K3s is optional operator infrastructure. It is appropriate for hosted gateways, relays, monitoring, logging, registries, and operators that already require orchestration.
It is not the canonical sovereign-node path and is not required to run ICN. Generic Helm/manifests and generic validation may remain public. A Kubernetes deployment does not, by itself, prove institutional custody, correct authority, state restoration, peer enrollment, or federation.
The current generic entry points are deploy/kubernetes/ and
deploy/helm/icn/. The separate deploy/k8s/ tree contains legacy
homelab-specific defaults and is not a generic operator entry point. This ADR
does not migrate or execute that private material; it requires a later bounded
archive, genericization, or private-repository move.
Profile D: advanced native Linux
Direct Linux installation remains available for experienced operators. It must preserve the same identity, secret, authority, durable-state, backup, and restoration invariants as Profile A. It is an advanced installation form, not a second canonical artifact.
Public/private repository boundary
The public ICN repository owns generic product artifacts:
- appliance build, verification, and release logic;
- generic OCI image build and validation;
- generic Kubernetes examples and Helm material;
- disposable development environments;
- documentation and non-private test evidence.
A private infrastructure repository owns deployment-specific operations:
- private addresses, registries, SSH targets, node names, credentials, and storage topology;
- actual private-cluster rollout and rollback automation;
- private monitoring endpoints and operational schedules;
- the current state of any private deployment.
A merge to public main must not automatically SSH into, push to, restart, or
otherwise mutate private infrastructure. Private cluster health must not be a
product build signal. A private repository may invoke a future generic reusable
workflow, but supplies and protects all deployment-specific values itself.
Evidence and claim matrix
| Claim | Current evidence | Disposition |
|---|---|---|
| Appliance builds and boots | Exact assembled QCOW2 witness at integrated PR #2456 head 67a6566e |
Partially proven for local non-production use |
| Identity survives restart/reboot | Stable retained-overlay identity/config/genesis hashes | Proven for the witnessed bytes |
| Durable receipt survives restart/reboot | Exact completion receipt re-fetched after both transitions | Proven for the witnessed fixture receipt |
| Full demo workspace is durable | Read-only status became uninitialized after process restart | Not proven; currently false |
| Independent appliance restoration | Plain data-directory tar omits the secret-bearing environment file | Open blocker |
| Signed immutable appliance release | Manifest states signed: false, immutable: false |
Not implemented |
| Generic OCI image builds | Local cold build plus merged hosted workflow from PR #2455 | Build evidence only |
| Kubernetes production readiness | Conflicting/stale generic and homelab material | Not claimed |
| Two independent institutions operate | No two-appliance authority/enrollment witness | Not proven |
| Federation | No qualifying two-institution witness | Not proven |
Consequences
- Product proof centers on an artifact an institution can own, restart, back up, and eventually restore without a cluster.
- Developers retain a fast disposable multi-node environment without confusing it with institutional custody.
- Hosted operators retain Kubernetes/Helm options without making K3s mandatory.
- Private homelab failures stop presenting as public product failures.
- The repository must reconcile duplicate Compose and Kubernetes paths over time.
- Appliance recovery and signed distribution become explicit product blockers rather than undocumented operator assumptions.
- A later acceptance decision may adopt or amend this ADR only after review; the
current
proposedstatus is deliberate.
Alternatives considered
| Alternative | Disposition |
|---|---|
| K3s as the canonical node | Rejected: couples sovereign operation to cluster infrastructure and private liveness |
| OCI container as the only canonical artifact | Rejected for now: current image proves a build, not appliance-equivalent identity, systemd, backup, or restoration |
| Native Linux as the only canonical path | Rejected: increases operator variance and weakens artifact-level review evidence |
| Keep all deployment paths equal | Rejected: preserves contradictory purposes and unbounded readiness claims |
| Remove generic Kubernetes support | Rejected: hosted/operator use remains legitimate when kept optional and generic |
Non-goals
- No live cluster change and no private infrastructure migration.
- No adoption of this proposed decision without governance review.
- No production-readiness, pilot, institutional-adoption, or federation claim.
- No
COMMUNITY_TOPIC, composition-root, ledger, or B1/B2 architecture change. - No assertion that a fixture rehearsal proves institution-owned durable workflow state.