Federation & Dogfooding¶
A single manifest is easy. One team, one knowledge.yaml, a handful of governed
units — you can hold the whole thing in your head. The problem starts when a
second team wants to reuse your scoring models, and a third wants to layer their
own domain knowledge on top without forking yours. At that point you either
copy-paste manifests (and watch them drift apart within a fortnight) or you
federate. This page covers both halves of the discipline: composing manifests
across teams with parent includes and signed sub-manifests, and the harder,
more honest test — publishing this guide itself as KCP units so an agent can
navigate it the same way it navigates Lodestar's scoring models.
If you have not read Manifest Basics and Declaring Governed Units, start there. Federation assumes you already know what a governed unit is.
Parent includes¶
Federation in KCP is a parent manifest that includes child manifests. The
root manifest owns nothing but coordination: it names the children, records the
hash each child was pinned at, and re-exports the union of their units under one
namespace. A child manifest is an ordinary manifest — it does not know it is
being federated, which is what lets a team publish once and be consumed many
times.
kind: manifest
metadata:
name: lodestar-root
version: 3.2.0
domain: regulated-professional-services
description: Federated root for Lodestar scoring, GTM, and this field guide
temporal:
valid_from: 2026-01-15
refresh_interval: 30d
includes:
- manifest: scoring/knowledge.yaml
pin: sha256:9f2c…a1 # the child hash this root was built against
signature: scoring.sig
- manifest: gtm/knowledge.yaml
pin: sha256:41be…7d
signature: gtm.sig
- manifest: fieldguide/knowledge.yaml
pin: sha256:c07a…e9
signature: fieldguide.sig
units: [] # the root re-exports children; it declares none of its own
kcp_validate walks the include tree, resolves every child, and checks that the
pin in the parent matches the child's actual content hash. A drifted child —
someone edited scoring/knowledge.yaml without re-pinning the root — fails
validation loudly. This is the same fail-closed instinct the whole stack runs
on; see Fail-Closed Policy.
The root does not silently accept the newer child. It stops.
Signing sub-manifests¶
A pin proves the child has not changed since the root was built. A signature proves who built the child. These answer different questions and you want both. The pin is integrity; the signature is provenance. When team A consumes team B's scoring manifest, the signature is how A's harness attests that the units it loaded came from B and not from an attacker who slipped a manifest into the search path.
# child team signs its manifest hash with its own key
kcp-agent sign scoring/knowledge.yaml \
--key ~/.kcp/keys/scoring-team.ed25519 \
--out scoring.sig
# consuming harness verifies before any unit is loadable
kcp-agent kcp_validate --manifest lodestar-root/knowledge.yaml --verify-signatures
The harness maps each governance.domains[].manifest in harness.yaml to a
signature it will accept. If a sub-manifest's signature does not verify against a trusted key, the
domain is not mounted and kcp_plan/kcp_load return nothing for it — the
governed operation then fails closed rather than scoring against unattested
knowledge. This is the manifest-level counterpart to
Trust & Attestation;
the wiring into the agent runtime is covered in
Wiring KCP, Agent & MCP.
Honest limit¶
A signature attests authorship, not correctness. A perfectly signed, perfectly
pinned scoring model can still weight signal-freshness wrong. Federation makes
the supply chain reproducible and attributable; it does not make the units
right. That remains the job of reproducibility
and the review discipline around variable design.
Determinism guarantees process, not truth — the whole stack rests on that line.
Dogfooding: this guide as KCP units¶
Here is the part that keeps us honest. This field guide is not just prose about governed knowledge — it is governed knowledge. Every page you are reading is declared as a KCP unit in its own child manifest, federated under the same root as Lodestar's scoring models. If we could not model our own documentation as navigable units, we would have no business telling you to model yours.
kind: manifest
metadata:
name: defendable-agents-fieldguide
version: 1.4.0
domain: documentation
description: The Defendable Agents field guide, published as governed units
temporal:
valid_from: 2026-06-01
refresh_interval: 90d
units:
- id: kcp.federation-and-dogfood
path: topics/defendable-agents/kcp/federation-and-dogfood.md
tags: [kcp, federation, signing, dogfood]
description: Federating manifests across teams and publishing this guide as units
depends_on:
- kcp.manifest-basics
- kcp.declaring-governed-units
- id: kcp.manifest-basics
path: topics/defendable-agents/kcp/manifest-basics/index.md
tags: [kcp, manifest]
description: The shape of a KCP manifest and its temporal block
The depends_on edges are not decoration. They are the same dependency graph an
agent uses to plan a load. When kcp_plan is asked for kcp.federation-and-dogfood,
it resolves the two dependencies first, so an agent answering a question about
federation arrives with manifest basics already in context — bounded by the
session's context_budget, the same 200000-token ceiling that governs a scoring
run.
How an agent discovers it¶
Discovery is the payoff. An agent never hard-codes a path to this page. It asks the root manifest.
- The harness mounts the federated root and verifies every sub-manifest signature.
kcp_planreceives a query — say, "how do I sign a sub-manifest?" — and ranks units by tag and description across all federated children, guide and scoring alike.- The winning unit's
depends_onclosure is resolved into a load order. kcp_loadreturns the units' content within the context budget, and the agent answers with the guide's own text as grounding.
The same machinery that lets an agent select the correct scoring model
deterministically — never silently swapping buyer-scoring for a stale
version — lets it select the correct page of this guide. Documentation and
domain knowledge sit in one graph, discovered by one mechanism, governed by one
harness. That is what "practising what you preach" reduces to in code: no
special case for the docs.
Where this fits¶
Federation is where KCP stops being a per-team convenience and becomes shared infrastructure. Read it alongside the architecture overview for how the harness mounts domains, and the Lodestar case study for how a real federated root behaved in production. The broader protocol lives at Knowledge Context Protocol.
One caution before you federate everything in sight: a federated root is maintenance, not a monument. Every child that re-pins forces the root to re-pin and re-sign, and a root with forty children and stale pins is worse than no federation at all — it looks governed and is not. Federate what is genuinely shared. Leave the rest local.