{
  "uid": "cogitave.learn.project-products-into-core.how-content-projects-into-core",
  "kind": "moduleUnit",
  "href": "/modules/project-products-into-core/how-content-projects-into-core/",
  "title": "How content projects into Core",
  "summary": "",
  "type": null,
  "products": [],
  "roles": [],
  "levels": [],
  "subjects": [],
  "headings": [
    "The node it becomes",
    "Two identifiers, two jobs",
    "The edges that link it in",
    "The pipeline: ACQUIRE to PUBLISH",
    "Served identically to humans and agents"
  ],
  "source": "\"Projects into Core\" is not a metaphor. It names a specific pipeline, a\nspecific identity scheme, and a specific set of edges. This unit walks all\nthree, from the [Core architecture spec](../../../../core/docs/architecture.md).\n\n## The node it becomes\n\nContent lands as one of Core's typed nodes: a `Doc` (a Diataxis-typed docs\npage), an `Article`, a `Standard`, an `ADR`, or - for this very platform - a\n`Unit`, `Module`, or `LearningPath`. Each type has its own JSON Schema, but all\nshare one base schema and one identity rule, so a standard and a learning unit\nare queried the exact same way.\n\n## Two identifiers, two jobs\n\nEvery node carries two orthogonal identifiers. The **`uid`** is identity: an\nimmutable, dotted, globally unique name (`cogitave.core.architecture`) in one\nflat namespace across the whole estate, so a URL can change under it without\nbreaking a single link. The **`contentHash`** is version: a content-addressed\ndigest of the canonicalized payload, the same Merkle-DAG idea Git and IPFS use\n- a changed leaf changes only the hashes on the path back to the root, and two\nbyte-identical nodes are stored once. (Vector embeddings are deliberately\nexcluded from `contentHash`, so swapping an embedding model never looks like a\ncontent edit.)\n\n## The edges that link it in\n\nA node alone is inert; a **closed set of eleven edge types** is what makes it\npart of the graph. Content-authoring hits four most: `xref` (a citation,\n`<xref:uid>` or `@uid`, traversed both ways), `partOf` (composition - a `Unit`\nis `partOf` a `Module`, which is `partOf` a `LearningPath`; this module's own\nfive units are wired this way), `appliesTo` (a `Standard` governs a `Repo`), and\n`teachesSkill` (a `Unit` teaches a `Skill`). The vocabulary is closed on\npurpose: a fixed set of labels keeps traversal and faceting stable as the\nestate grows.\n\n## The pipeline: ACQUIRE to PUBLISH\n\nA source blob becomes a node through **ACQUIRE → PARSE → ENRICH → INDEX → EMIT\n→ PUBLISH**. Each acquired blob is hashed; an unchanged blob short-circuits, and\na changed one recomputes its node's `contentHash` and marks only the\n*transitively affected* nodes dirty via the `xref`/`include` edge DAG - the same\non-demand, memoized recompute discipline as `salsa` and Adapton. Schema\nvalidation and broken-xref/link checks are a **blocking** gate: if it doesn't\nvalidate, it doesn't publish. On a green merge, three materializations rebuild\nas pure functions of the graph - a UID-keyed catalog, a graph store for\ntraversal, and a hybrid search index - swapped in atomically behind a new\ncontent root.\n\n## Served identically to humans and agents\n\nOnce published, every node is an MCP **resource**, addressed as\n`cogitave://{type}/{id}` (for example `cogitave://doc/cogitave.core.architecture`).\n`docs_fetch` returns the node's `uid`, `type`, `title`, rendered content, and its\n`contentHash` and `lastModified` - the same [MCP interface](../../../../core/docs/mcp-interface.md)\na human's search box calls underneath. `describe_schema` lets an agent read the\nclosed vocabulary before it queries, and `resources/subscribe` plus\n`notifications/resources/updated` mean a client learns about a changed node\ninstead of polling for it.\n\n> [!TIP]\n> \"How does a doc become a queryable node\" now has a precise answer: it is\n> hashed, typed, given a stable UID, linked in through the closed edge set, and\n> served through `docs_fetch`/`resources/read` - the same path whether the\n> caller is a person's browser or an agent's MCP client.\n",
  "partOf": "cogitave.learn.project-products-into-core",
  "durationInMinutes": 7,
  "quiz": null
}