Brief

markdown source of this page

The page as a markdown file: index.md

+++
title = "Brief"
subtitle = "what wiki-builder is, who it is for, and what it refuses"
status = "approved"
goals = false
intent = """
The brief exists so that a reader arriving at wiki-builder, person or agent, learns in one screen what it
is, who it is for and what it refuses. It stays short and stable, and names nothing private.
"""

[[infobox]]
group = "Identity"
rows = [
  { label = "Name", value = "wiki-builder" },
  { label = "Author", value = "Timothy Marois" },
  { label = "Website", value = "marois.dev", link = "https://marois.dev" },
]

[[infobox]]
group = "Requirements"
rows = [
  { label = "Python", value = "3.11 or newer" },
  { label = "Parser", value = "mistune, pinned exactly" },
  { label = "Runner", value = "uv or pip" },
]
+++

## Purpose

wiki-builder renders markdown into a wiki a person can read, and then refuses the things that make
documentation rot. A project installs it rather than copying it in, and it knows nothing about what it
documents.

It has two halves, and the second is why it exists:

- **A generator.** Pages with TOML front matter become a static site with a sidebar, infobox, contents,
  citations, search and pictures, that works served or from disk.
- **A set of refusals.** A sentence or an infobox row that states something and cites nothing. A reference
  linking to a markdown document. A heading that asks a question or rates itself. A name or sentence that
  points instead of naming. A page too long to read. A page edited since its date was recorded. A picture whose subject
  has changed. An unreachable page.

## Reasoning

Documentation dies the same way every time: it grows faster than it is read, readers cannot tell which
sentences were checked, and by the time it is wrong it still looks authoritative. The wiki wiki-builder was
extracted from had grown to 75,000 words that its owner had stopped reading.

wiki-builder is for the case where **the wiki is read instead of the source.** There, an untraceable
sentence is worse than a missing one, because it looks exactly like a verified one. So every sentence is
cited to the code it came from, or marked as uncited.

Every rule was added after the failure it prevents happened. On the day the check against
question headings was written, it found nine, all written by the agent that had written the rule against
them.

## Users

- **A person who owns a system but no longer writes its code**, and needs to see how it behaves without
  reading it.
- **An agent writing or revising those pages**, which is why the skill ships with the tool rather than
  being left to each project to invent.

## Scope

- **Covers:** rendering; the checks; the skill; a local server that shows the site and the project's
  files; a published build with clean addresses; a user build with everything internal removed;
  carrying rule changes into a project; a GitHub Action for a project's CI; guides to installing and
  deploying a wiki.
- **Refuses:** knowing anything about the project it documents, which a test over the code and the skill
  enforces: no project name, no domain word, no assumption about its assets. Generating pages from the
  code they describe, since such a page agrees with the code whatever it does. Updating itself silently.
  Scaffolding, and anything a second project has not yet asked for.

## External systems

- `uv` (`https://docs.astral.sh/uv/`) runs a pinned version without installing anything: one install per
  machine, never per project.
- `mistune` is the markdown parser, pinned exactly so that a new version cannot turn every page red at
  once.
- Python 3.11 or newer, for `tomllib` in the standard library.
- GitHub Actions, for continuous integration.
Last updated 14 September 2026