The Knowledge Graph Build Standard
How to turn your documents and records into a map of connected facts an assistant can rely on. Each piece of information is stored in one place. Nothing goes in unless a person approves it. Throw out a document and every answer that came from it goes too. Written so you can build it yourself.
Used by
- AI Officer
- Knowledge Manager
- Compliance Officer
- Systems Analyst
13 min read · Published by AI Pathway
Using Claude? This standard installs as a skill. Guides for ServiceM8, Xero and Simpro.
How to get this live in your business
Build it for mePick a time and we scope the key contract and the change feed on your own corpus.What this is
A free, open recipe for turning your policies, manuals, price lists and contracts into a graph: a map where every fact is a dot and every line says how two dots relate. The other standards on this site answer questions from that map.
The core rule
A fact is one small piece of information, like “the site office opens at 7am”. It is written in one place and everything else points there. If the same sentence lives in three places, you have three places for it to go wrong.
What it does not do
It does not answer questions; that is Cited Answer. It does not write the file; that is Advice File. A person approves every document before anything from it goes live.
The hard part
Not getting the facts in. It is the week page 14 of the PDF is replaced, and every fact that came from page 14 has to be updated or removed. Ordinary search cannot tell you which answers used page 14. This can.
A folder of PDFs is a pile. A vector store is a pile with better search. A graph is a set of typed nodes, typed edges, and a change you can find. Embed the pile if you want. Do not call it the graph until a fact lives once and retiring a source takes its answers with it.
One source, end to end
- A source arrives.
- Register it as an instrument: title, issuer, edition, jurisdiction, effective dates and a checksum. A drive link with no edition is a pile entry, not a source.
- A named person accepts the source into the library. Ingestion is not production.
- Cut passages with locators you can replay, and propose nodes onto the key contract: clause, concept, entity or fact. Anything else stays in the passage.
- Does the node have a named acceptance and a replayable locator? If no, it stays proposed and no answer can see it.
- If yes, it is live: scoped by an edge, dated, and the only place that fact lives.
- Is the source checksum unchanged? If yes, an answer can be built from the node with a source card. If no, every node built from the source is change pending until a person accepts the delta, then it comes back through the same gate.
Take the spec to Claude, ChatGPT or Copilot. The sentence to paste is one click away.
1. What this standard covers
Any body of material a business will later ask an assistant to speak from, where being wrong has a cost somebody else carries. Lender panels, tenancy legislation, a trade price book, safe work method statements and codes of practice, a franchisor operations manual, the credit policy a licensee issued.
It does not cover a personal notes database, a marketing content lake, or a chat log treated as training data. Client interviews become an advice file, not nodes in this graph, until a person promotes a claim into the library. “We do not lend on this product in Western Australia” is a policy node. “This client said they are comfortable” is not.
The failure this prevents is specific. It is the answer that cites “the knowledge base” the way a student cites “the internet”. Retrieval appeared to work. Nothing in the system can show which clause, which edition, which date, or which other node will break when that file is replaced.
The phase before this one. Check 2 registers a source as an instrument as if the source were to hand. For most businesses it is in somebody’s email. The Knowledge Base standard is that phase: one register with an owner per source, on the Microsoft 365 or Workspace tenant the business already runs, and a watch that notices a changed edition. The graph takes its sources from that register, never from a fresh upload. It is the long, foundational part, and it is measured in weeks for a network.
What this is not. Pointing a copilot at a document library. Fine-tuning on “all our data” and naming the weights. A wiki with backlinks. An ontology slide in a deck. Those can sit beside a graph. They are not one.
2. Pile, index, graph
Three layers. Only the third is this standard. The first two are allowed as plumbing.
| Layer | What it holds | What it can prove | What it cannot |
|---|---|---|---|
| Pile | Files in a drive, as dropped | That a file existed on a day | Which fact it contained |
| Index | Chunks, embeddings, full text | That a passage was similar to a query | That two passages are the same fact, or that a retired file cannot answer |
| Graph | Typed nodes, typed edges, effective dates | That a fact lives once, who accepted it, what it supersedes, what breaks if it moves | Nothing it was not given. Decline is the correct empty result |
An implementation may use the index to propose nodes. The graph is what production reads. Cited Answer retrieves clauses, not chunks. Advice File writes field keys, not summaries. If production reads the index, you have not implemented this.
3. The key contract
The same shape as the Multi-Site Conformance standard. A small set of types, named once, versioned. Departments may add types. They may not rename or fork the shared ones. An unwritten convention about “what we usually link” is a fork.
Node types, a closed list at version 1
| Type | What it is | Required fields |
|---|---|---|
| Source | The artefact as issued | id, title, kind, issuer, jurisdiction, edition, url or file, retrieved_at, effective_from, effective_to, checksum |
| Passage | A contiguous span inside a source | id, source_id, locator (page, section or timestamp), text, hash |
| Clause | A citable rule extracted from a passage | id, source_id, passage_id, reference, text, jurisdiction, effective_from, effective_to |
| Concept | A thing the business names once | id, key (from the contract), label, definition, closed_list_id (nullable) |
| Entity | A real-world thing already in a system of record | id, system, external_id, kind (client, lender, product, site, person, asset) |
| Fact | A dated claim the graph is willing to stand behind | id, subject_node_id, predicate, object_node_id_or_value, valid_from, valid_to, source_ids[] |
| Change | A detected move in a source | id, source_id, detected_on, summary, status, decided_by, decided_on |
Edge types, a closed list at version 1
| Type | From, to | Meaning |
|---|---|---|
| CONTAINS | Source to Passage | This span lives in this artefact |
| EXTRACTS | Passage to Clause, Fact or Concept | This node was cut from that span |
| SUPERSEDES | Clause to Clause, Fact to Fact, Source to Source | New node retires old. Old cannot answer |
| DEFINES | Source or Clause to Concept | The definition in force |
| APPLIES_TO | Clause or Fact to Entity or Concept | Scope. Missing scope is not “applies to everyone” |
| SAME_AS | Node to Node | Two identifiers, one thing. Required when the CRM and the PDF name the same lender |
| CONFLICTS | Clause to Clause, Fact to Fact | Two live nodes answer the same question differently. Never resolved by the model |
| DERIVES | Fact to Fact | Computed from. If the parent moves, the child is stale until recomputed |
Add types by bumping the contract version. Do not silently invent a RELATED_TO edge. That edge is how a pile sneaks back in.
4. The objects, and what is in them
Nine objects the build actually stores. The acceptance and the supersession are the two most retrieval builds leave out, because search appears to function without them.
For your developer. Show the fields
KeyContract
- version, effective_from
- node_types[], edge_types[], required_fields per type
- closed_lists (predicate, kind, jurisdiction, queue)
- extension_rule: add freely, never rename or fork
Source # plus the fields in the node table
- queue (proposed | accepted | retired | rejected)
- accepted_by, accepted_on # required before any child can answer
- checksum, previous_source_id
Passage
- locator must be replayable: page and section, offsets in a stable
file version, or start and end seconds. "Chunk 47" is not a locator.
Node # Clause, Concept, Entity, Fact are subtypes
- type, key, body
- valid_from, valid_to (null while live)
- provenance { source_ids[], passage_ids[], extract_run_id }
- accepted_by, accepted_on
- queue (proposed | live | conflict | change_pending | retired)
Edge
- type (from the contract), from_id, to_id
- valid_from, valid_to
- accepted_by, when the edge can change who an answer may name
ExtractRun
- id, source_id, started_at, finished_at
- method (rules | model | person), model_id, prompt_hash
- proposed_node_ids[], proposed_edge_ids[]
- accepted_count, rejected_count
Conflict
- id, node_ids[], detected_on, reason
- status (open | accepted_as_scoped | resolved)
- decided_by, decided_on # never "the model picked one"
QueryRecord # written when something READS the graph
- id, asked_on, asked_about_date, jurisdiction
- hit_node_ids[], missed (bool)
- consumer (cited_answer | advice_file | pack | other)
ChangeDelta
- id, source_id, old_checksum, new_checksum
- affected_node_ids[] # computed, not guessed
- status (pending | accepted | rejected), decided_by, decided_onA Node with queue live and empty provenance is the defect, and it should not be writable. A Source with queue accepted and no checksum is the same defect on the next replacement.
5. The checks, in order
The order is the claim. Chunk, then embed, then hope is a different order, and it fails the pass test.
- The key contract is written and versioned before the first extract. Node types, edge types, predicates and required fields are a closed list at each version. An extract that invents a type has forked the graph and is refused.
- Every source is registered as an instrument, not a file path. Title, issuer, edition, jurisdiction, effective dates, checksum and retrieved_at. A drive link with no edition is a pile entry, not a Source.
- No node is live without a named acceptance and a replayable locator. Ingestion is not production. A node reaches live only when a named person accepts it, and only when its provenance names a passage with a locator that can be opened and highlighted.
- Production reads live nodes, and a card names a node, never a file. Cited Answer and Advice File attach source cards from live nodes. An answer that cites a passage hash, a chunk id or a filename has not used the graph.
- Entity identity comes from a system of record, or SAME_AS is an accepted edge. A lender, a product, a site or a person carries the id the CRM, the panel or the register already uses. Two labels that look alike are two things until a person accepts SAME_AS. An embedding that thinks they match is not identity.
- Scope is an APPLIES_TO edge, and an unscoped clause cannot answer a scoped question. A clause with no jurisdiction, product, work type or entity on it can decline or sit in conflict. It cannot answer a question asked about one state or one product.
- Supersession and conflict are written edges, and the model never picks a winner. A new node retires the old through SUPERSEDES and the old cannot answer. Two live nodes that disagree get a CONFLICTS edge and a named person, never an average and never a confidence score.
- Replacing a source produces a delta with a computed list of affected nodes. When the checksum moves, the graph lists every node built from that source and every historic answer that used them. If you cannot produce that list, you have an index.
- Proposed, live, conflict, change_pending and retired are states, not labels. A retired node must not appear on a new source card. It must remain findable for the answers that used it.
- The index can propose and rank. Emptying it does not empty the graph and does not invent an answer. Detach the vector index and the model weights. The live nodes are unchanged. A question the graph covers still answers from the same node; a question it does not cover declines.
- Customer files and interviews are not sources unless a person promotes a claim. A claim from an interview becomes a Fact only when a named person promotes it, and the Fact still needs provenance. A crawler finding it in the same drive does not make it policy.
- It survives the builder. Someone other than the builder can explain what it does, and it runs on an account the business owns.
- The pass test passes. Load, ask, move, identity, the forbidden path and one-fact-two-places, on a corpus the business controls with at least one system-of-record id, as the pass test describes.
6. The four queues for a node
| Queue | What it holds | The rule |
|---|---|---|
| Proposed | Extracted, not accepted | Invisible to Cited Answer and Advice File |
| Live | Accepted, in date, scoped | May appear on a source card |
| Conflict or change pending | Two lives collide, or the source moved | Cannot answer until a person acts |
| Retired | Superseded, or the source rejected | Must not appear as live. Must remain findable for the answers that used it |
Declining to extract is a success. A run that forces a fact out of a passage that is only colour commentary has polluted the graph. Rejected proposals stay on the extract run so you can see the model getting keen.
7. What the index is allowed to do
The index is a proposer and a finder. It is not the store.
Allowed: propose passages from a new source; propose SAME_AS candidates for a person to accept; find candidate clauses for a query, which the graph then filters by date, jurisdiction and queue; embed node bodies to rank live hits.
Not allowed: answer; be the only copy of the text; hold a type the contract does not name; survive as the production path when the graph is empty.
If a vendor’s architecture diagram reads embeddings, then model, then answer, with the graph as a side box, they have not implemented this. The arrow goes embeddings, to proposed nodes, to a person, to the live graph, to a source card.
8. What stays with a person
- Accepting a source into the library.
- Accepting a proposed node or edge as live.
- Resolving a conflict between two live nodes.
- Accepting a change delta so affected nodes may answer again.
- Declaring two entities the same thing when the systems disagree.
- Any statement that the graph is complete, compliant, or approved for client use.
The extractor may propose. It may not occupy accepted_by or decided_by. Client material does not become a source because it was sitting in the same drive. Promoting an interview claim into a fact is a person, and the fact still needs provenance.
9. Provider: what to stub, and what not to hand-roll
Three steps not to hand-roll, and they are the same three the Rejected Pack standard already named in other words. Extraction, embedding, the interface and the first cut of types, an agent can build against the stub in an afternoon.
For your developer. Show the provider config
provider:
stub: local.mock_graph
production: none # no hosted step; runs on your own systems
do not hand-roll
- identity. Entity nodes take their id from the system of record:
the accounting contact, the CRM lender id, the ABN, the product
code on the panel. A second identifier invented by the extractor
is a shadow register.
- the change. Replacing a file without a checksum diff, an
affected-node list and a person on the delta is how last year's
rule keeps answering. This is the binding layer.
- acceptance. A nightly job that promotes proposed to live because
the model was confident is how a wrong PDF becomes policy.
accepted_by is a person, always.
storage is not the standard
- lists, Postgres, or a graph database. The objects are the standard.There is no hosted product for this standard. The production check runs over the business's own corpus, its own register ids and the library a named person accepted. A vendor selling the embedding and the chat is selling the plumbing, and is usually silent about who accepts a replaced edition. Ask them that first.
The pass test. Stage it on a corpus you control, with at least one system-of-record id. Load two sources, a lender policy with a dated edition and a one-page internal rule that cites it: two Source records with checksums, passages with replayable locators, proposed clauses and at least one APPLIES_TO, and nothing live until a named person accepts the sources and the nodes. Ask a question the clause covers with an asked-about date inside the edition: the hit is a node id, not a chunk id, and a card can be built from it. Detach the vector index and ask again: the same node, or a decline, never a new paragraph from memory. Replace the PDF with an edition that drops the clause: the delta lists the old clause, the old node leaves live, the queries that used it are findable, and the new extract is proposed rather than silently live. Name the lender two ways, in the PDF and in the CRM: SAME_AS accepted by a person, or two nodes and a conflict. Drop the same PDF into a folder, embed it, and answer without writing a Source: the build cannot call that path production. Then edit the internal rule so it restates the lender clause and change the lender clause: the restated fact goes change pending with its parent, or the fact lived twice and the standard is not implemented.
10. Conformance checklist
Hold a DIY build or a vendor to this. If a box is empty, it is not in production.
- 1. The key contract is written and versioned before the first extract. Node types, edge types, predicates and required fields are a closed list at each version. An extract that invents a type has forked the graph and is refused.
- 2. Every source is registered as an instrument, not a file path. Title, issuer, edition, jurisdiction, effective dates, checksum and retrieved_at. A drive link with no edition is a pile entry, not a Source.
- 3. No node is live without a named acceptance and a replayable locator. Ingestion is not production. A node reaches live only when a named person accepts it, and only when its provenance names a passage with a locator that can be opened and highlighted.
- 4. Production reads live nodes, and a card names a node, never a file. Cited Answer and Advice File attach source cards from live nodes. An answer that cites a passage hash, a chunk id or a filename has not used the graph.
- 5. Entity identity comes from a system of record, or SAME_AS is an accepted edge. A lender, a product, a site or a person carries the id the CRM, the panel or the register already uses. Two labels that look alike are two things until a person accepts SAME_AS. An embedding that thinks they match is not identity.
- 6. Scope is an APPLIES_TO edge, and an unscoped clause cannot answer a scoped question. A clause with no jurisdiction, product, work type or entity on it can decline or sit in conflict. It cannot answer a question asked about one state or one product.
- 7. Supersession and conflict are written edges, and the model never picks a winner. A new node retires the old through SUPERSEDES and the old cannot answer. Two live nodes that disagree get a CONFLICTS edge and a named person, never an average and never a confidence score.
- 8. Replacing a source produces a delta with a computed list of affected nodes. When the checksum moves, the graph lists every node built from that source and every historic answer that used them. If you cannot produce that list, you have an index.
- 9. Proposed, live, conflict, change_pending and retired are states, not labels. A retired node must not appear on a new source card. It must remain findable for the answers that used it.
- 10. The index can propose and rank. Emptying it does not empty the graph and does not invent an answer. Detach the vector index and the model weights. The live nodes are unchanged. A question the graph covers still answers from the same node; a question it does not cover declines.
- 11. Customer files and interviews are not sources unless a person promotes a claim. A claim from an interview becomes a Fact only when a named person promotes it, and the Fact still needs provenance. A crawler finding it in the same drive does not make it policy.
- 12. It survives the builder. Someone other than the builder can explain what it does, and it runs on an account the business owns.
- 13. The pass test passes. Load, ask, move, identity, the forbidden path and one-fact-two-places, on a corpus the business controls with at least one system-of-record id, as the pass test describes.
- 1
Hold the build to the checklist
The checks in this standard are what a working build looks like. Implement it yourself, hand it to a developer, or hand the page to an AI with the button below.
- 2
Do not hand-roll
There is no product for this step. Highest option: none. Checklist plus a build.
- 3
If you are stuck
Exceptions, three systems, a team that will not maintain a Zap, or an owner who wants it done. We implement when it has to survive the business.
Related reading
- The Knowledge Base Build Standard, the phase before this one
- Combining the build standards: from the shared drive to the advice file
- The Cited Answer Build Standard, which reads this graph
- The Advice File Build Standard, which attaches cards from it
- The Rejected Pack Build Standard: one graph, a fact lives once
- The Multi-Site Conformance Build Standard: the key contract
Want the whole thing by email?
This paper, plus the rest of the library. One click to stop them.