The eight words

Most products have three vocabularies: one in the code, one in the product spec, and one in the marketing. Ours has one. The words below are the type names in the domain package, the nouns in the API contract, and the nouns on this website — and where a page here says “resource” it is because the code says Resource, not because a writer liked the sound of it.

That is not tidiness for its own sake. It means an engineer, a support lead and somebody in a sales call can describe the same behaviour without anybody translating, and it means a question like “what happens when a Jira ticket already in our context gets edited?” has one answer rather than three.

Resource

One item of knowledge, at a path in your knowledge tree. Its content is the text itself. A GitHub issue is a resource; so is a pull request review, a doc, a release note.

Not “document”, not “file”, not “item”. A resource is the unit the whole system is addressed in.

Origin

Where a resource came from: which source (GitHub, Jira, Slack), the external id there, the URL, the author who wrote it, and when.

Origin travels with the resource permanently. It is the reason a citation is possible three months and four hundred changes later.

Change

Recording a resource is a change: what changed, by which author, when, and a message saying why. Changes are append-only — there is no edit-in-place path, for anyone.

Changes are also idempotent by content. Recording what a path already says records nothing, so a connector can re-sync as often as it likes without inflating the history.

Revision

Every change produces a new revision — a point in history you can read at. “What did we know last Tuesday” is a read at an older revision. “What moved this answer” is a diff of two of them.

Proposal

One or more proposed changes with a message, waiting on a decision. Members and agents never write shared context directly; they open a proposal.

Approved, its changes join the history as ordinary changes on the same straight line. Rejected, it vanishes without a trace — no draft state, no residue. A proposal is decided once, and only while it is pending.

Provenance

Where an answer came from: the revision it was read at, the resource it came from, and the origin URL at the source.

Origin is where the resource came from; provenance is where the answer came from, and it ends at the origin. If you only remember one sentence from this page, it is that every answer cites its source.

Subscription

How an author follows the shared context without holding it. It remembers the last revision they have seen; the feed is every change after that bookmark, and catching up empties it.

Content never travels — only the news that it changed. Your agent reads the news, not the whole newspaper.

Context

The shared context is the sequence of changes. It is deliberately not a code object: there is no Context type to instantiate, because the context is not a thing the system holds — it is what the history adds up to.

Not “knowledge base”. A knowledge base is a place you put things; a shared context is what your team has established.

Two roles, at the boundary

Owner and member are roles, and they live at the authorization boundary rather than in the domain. Members propose; owners decide. Who counts as an owner is enforced where a request arrives, which is why custom roles are a roadmap question and not a change to the model.


The full story told in these words — a narrative and a three-way conversation between product, engineering and marketing — lives in the repository as docs/domain/speaking-the-domain.md.