Principles
dealwithdata writes about governed data, so dealwithdata is governed data. Every rule below is something the content teaches, applied to the content itself. If a principle here isn't enforced by the build, it's a wish, not a principle. Each one names its enforcement.
1. One canonical model, many projections
The Markdown files in content/ are the system of record. The website, the
JSON API, the glossary in SKOS, the lineage graph, the change-event log,
llms.txt, the Atom feed and the MCP server are all generated from them.
Nobody hand-edits a projection.
Enforced by: scripts/build.py is the only writer of dist/; dist/ is
not committed.
2. Stable identity, separate from names
Every item has an id (dwd_ + 8 random base32 characters) that never
changes. The slug is a human-friendly name and may change; old slugs go in
aliases so links don't break.
Enforced by: schema pattern on id, uniqueness check across all items,
scripts/new.py mints IDs.
3. Data contracts on content
Every item's frontmatter must satisfy schema/item.schema.json. A pull
request that breaks the contract does not merge.
Enforced by: schema validation in the build, which runs on every PR.
4. Legible state: draft, reviewed, verified
Status is shown everywhere the item appears, including the API and MCP.
- draft: written, not yet reviewed by someone other than the author.
- reviewed: a maintainer has checked it for accuracy and clarity.
- verified: the claims or code have been tested against a real
implementation, and
verified_bysays how.
Nothing is hidden for being a draft. It is labeled.
Enforced by: required status field; verified requires verified_by.
5. Provenance: who and what made it
authors are the humans accountable for an item. assisted_by records any
AI that drafted or edited it. An AI is never an author; a human owns every
published word.
Enforced by: authors required and non-empty; assisted_by is shown on
the page and in every export.
6. Lineage: every claim traces to a source
sources lists what an item draws on, each with a URL and the date it was
accessed. Fast-moving topics carry an as_of date. related links items to
each other by ID, and terms links them to glossary entries.
Enforced by: referential-integrity check (every related and terms ID
must exist); lineage.json is generated from these links.
7. Active, not passive
Every change to content becomes an event (CloudEvents 1.0) in
api/events.jsonl, derived from Git history. Subscribe to it, poll it, or
diff it. Metadata that nobody can subscribe to goes stale.
Enforced by: the build derives events from git log; the deploy fetches
full history.
8. Classification before publication
Every item declares classification: public. Anything else is refused by
the build. A sensitivity lint checks content against a private deny-list
(employer names, internal system names, real volumes) that is never
committed.
Enforced by: schema enum; check_sensitive step reads .denylist locally
or the DWD_DENYLIST secret in CI.
9. One concept, three scales
Wherever it makes sense, a concept is shown at personal, business and enterprise scale. Governance isn't only a bank problem; it's everyone's problem at different sizes.
Enforced by: scales field (at least one), used for filtering everywhere.
10. Consumable by machines as well as people
If a human can read it, an agent can query it: same content, same IDs, same status, same lineage. No channel gets a different truth.
Enforced by: all channels are built from one in-memory catalog in a single build pass.