benchbook
↑↓ navigate↵ openDocs · Wiki · Contract
GitHub
DocsFoundationsPage Types

Page Types

Page Types

Every page declares a type in frontmatter. The type determines which template applies, which fields are required, and which folder it belongs in — all three are checked mechanically.

The four core types carry almost everything:

TypeWhat it isLives in
sourceWhat some external material saidsources/ (global)
entityA thing the material was aboutpeople/, <domain>/entities/, or knowledge/entities/
referenceA comparison or ranking across several entities<domain>/references/
projectSomething being built or trackedprojects/

Domains may add their own — the books domain, for example, added author, series and candidate types when the core four genuinely couldn’t hold them. That’s allowed, through proposal and approval, and it’s covered in 12 — Case Studies.


The entity-first principle

The most important convention here is which type you reach for by default.

Entities are the norm. References are the exception.

The tempting move, when a source compares five things, is to write one page comparing five things. It reads well once. Then a second source covers two of those five, and you either edit the comparison — losing the first source’s framing — or you create a second comparison page, and now the same claim exists in two places and will drift.

So the rule is:

Entities compose. References don’t. An entity page accumulates across every source that mentions it; a reference page is a snapshot that starts going stale the moment it’s written.

The live wiki has 268 entities against 59 references, and the references are being converted to entities lazily — whenever one is next touched, rather than in a big migration.


Frontmatter

Required on every page:

---
title: "Page Title"
type: source | entity | reference | project | ...
created: YYYY-MM-DD
domain: <domain> | null
publish: false
tags: []
sources: []
---

Conditionally required:

FieldWhen
statusentity (non-people) and project pages
subdomaindomains that use them; may be null only when genuinely cross-subdomain
tagsreference pages must carry exactly one “shape” tag — concept, comparison, ranking, buying-guide, or guide

Useful optional fields:

FieldPurpose
source_urlThe online original
raw_fileProvenance pointer to the local copy; the lint pass reads this for archival
repo_urlFor software entities — enables release tracking
channelOn source pages: the recurring origin. Drives the “third source from one origin” trigger for creating a channel entity
change_historyOpt-in, for entities whose state genuinely changes over time

publish: false is the default on every page. See 13 — Privacy.

The sources: array and the body’s relative links are two-way mirrors of each other: the entity records which sources contributed, the source body links to the entities it produced. One-directional links rot invisibly, which is why both directions are enforced.


The Entity Placement Rule

The single hardest recurring judgement call, so it gets an explicit rule:

The entity is…It goes in
A specific humanpeople/
Something you own or operate — a specific instance<domain>/entities/
A general concept, product, tool, or frameworkknowledge/entities/

The decision is made by what the thing is, not by how many domains reference it. Your particular server is a home entity; its operating system is a knowledge entity; the person who recommended it is a people entity. Cross-folder relations between all three are normal.

Two clarifications that resolve most of the remaining ambiguity:


Two entity patterns worth knowing

Generic entity pages — concepts, products, tools — use a light template: what it is, a relations table using a controlled vocabulary of predicates, discrete key facts, when to use it, what it compares to, and which sources contributed.

The relations table is worth one specific warning. If a fact doesn’t fit any predicate, it is almost always a discrete attribute and belongs in ## Key Facts instead. The tell is an object that is prose rather than a page — monitors | "5 backup units, 2 workflows, 3 timers" is not a triple however well the predicate reads, and forcing it in is how a queryable graph turns into a second, worse prose section.

Operational-instance entities — a specific machine or service you run — opt into two extra sections via change_history: true:

That split is the useful bit. “What is true now” and “how it got that way” are different questions asked at different times, and a page that interleaves them answers neither quickly.

Note the deliberate inconsistency: change history is newest-first, while the global log is newest-last. The page section is read top-down for “what changed recently”; the log is read as a timeline. Same data shape, opposite ordering, because they’re used differently.


Source pages embed their content

A source page carries the full transcript or text inline, under ## Content, not just a summary and a link.

This makes the wiki self-contained: the source survives the original URL going away, which it eventually will. There are documented exemptions — material that genuinely can’t be embedded, or where the summary already fully distils it — but they’re tagged explicitly, and the tag requires the page to say why in its own body rather than just carrying the marker.

That “self-documenting exemption” pattern is worth stealing generally: any escape hatch from a rule should require stating the reason on the page, or it becomes a rubber stamp within a month.


Next: 06 — Indexes.