Skip to content

Set down the decision record shape and land the records for the container, the table, the tokens and the prose - #103

Merged
iderex merged 2 commits into
mainfrom
decisions-index-and-0002-0004-0007-0010
Aug 9, 2026
Merged

Set down the decision record shape and land the records for the container, the table, the tokens and the prose#103
iderex merged 2 commits into
mainfrom
decisions-index-and-0002-0004-0007-0010

Conversation

@iderex

@iderex iderex commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

The decision directory gets its shape, and four of the questions the rest of the
plan walks into get answers written down before the code that would assume them.

File Issue
decisions/README.md, decisions/0000-template.md #1
decisions/0002-what-docker-is-for.md #3
decisions/0004-one-table-two-places.md #5
decisions/0007-where-the-design-tokens-live.md #65
decisions/0010-where-the-plugin-page-prose-comes-from.md #79

Closes #1, closes #3, closes #5, closes #65, closes #79.

The evidence

Every measurement quoted in a record was re-run at this commit against the
published references rather than copied from the issue that asked for it. All of
them reproduce.

gh api repos/Flowfin/hub/pages --jq '{cname,html_url,https_enforced,source}'
{"cname":"flowfin.dev","html_url":"https://flowfin.dev/","https_enforced":true,"source":{"branch":"main","path":"/docs"}}

gh api repos/Flowfin/.github/contents/profile/README.md --jq '.content' \
  | base64 -d | grep -c '^| \['
12

gh api 'repos/Flowfin/hub/git/trees/HEAD?recursive=1' --jq '[.tree[].path|select(startswith("docs/"))]'
["docs/CNAME","docs/design-system.html","docs/index.html"]

curl -s https://flowfin.dev/design-system.html | grep -o -- '--[a-z0-9-]*:' | sort -u | wc -l
16

All four run 2026-08-09.

The index makes a claim about its own directory and carries the command that
decides it, run at this commit:

for h in "## Why" "## What the alternatives cost"; do
  for f in decisions/0[0-9][0-9][0-9]-*.md; do grep -qx "$h" "$f" || echo "$h  $f"; done
done
## Why  decisions/0005-the-speed-budget.md
## Why  decisions/0011-what-this-site-will-never-do.md
## Why  decisions/0012-the-browser-in-the-gate.md
## What the alternatives cost  decisions/0005-the-speed-budget.md
## What the alternatives cost  decisions/0011-what-this-site-will-never-do.md
## What the alternatives cost  decisions/0012-the-browser-in-the-gate.md

The four records added here carry all four headings, which is why they are not
in that output. Nothing reads these headings and no check refuses a record that
omits one, so the index says so in place rather than presenting the shape as
enforced.

The means

Markdown files in the tree. A record has to be readable by somebody who was not
there, diffable, and reachable from the work that assumes it without a tool to
render it. Nothing here needs a runtime and nothing is added that the tree does
not already carry. The template is a file rather than a section of the index for
the same reason: copying something already right beats reading a description and
approximating it.

Scope

Only decisions/:

git diff --name-only origin/main...HEAD
decisions/0000-template.md
decisions/0002-what-docker-is-for.md
decisions/0004-one-table-two-places.md
decisions/0007-where-the-design-tokens-live.md
decisions/0010-where-the-plugin-page-prose-comes-from.md
decisions/README.md

Size

Over the 400-line guidance at 416 added lines:

git diff --shortstat origin/main...HEAD
 6 files changed, 416 insertions(+)

The property that holds across every changed byte is that each file stands
alone: one record answering one question, plus the index and the template that
describe the directory those records sit in. No file is read by any other, so
the diff is six independent reads rather than one long one. Splitting it into
five landings would have moved the mainline under each of the others for no
reading benefit.

Review

There is no second reader for this change. That is stated rather than worked
around, and the evidence above stands in place of one: the commands are in the
records, they were run at this commit, and a reader can re-run every one of
them.

iderex added 2 commits August 9, 2026 10:57
Eight records landed before anything said what a record is. The next one
written against no template is written against whichever of the eight its
author happened to open, and the shape drifts one record at a time until
a reader has to work out the convention from the corpus rather than read
it. The directory that exists to be readable a year later is the last
place that can afford that.

Adds the index and the template. The index states the numbering and why
a landed number is fixed, the file naming and why the slug names the
question rather than the answer, the required sections, and the
supersede rule that keeps a landed record from being edited into a
different past. The template carries the four headings so a new record
starts from something already right instead of from a description of it.

The index measures its own directory rather than asserting conformance:
three of the records answer two of the four questions under headings of
their own, and the command that finds them is in the file. Nothing reads
these headings and no check refuses a record that omits one, so the
shape is a convention a reader holds and the three named records are
what a convention is worth on its own.

Refs #1

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
Four questions the rest of the plan walks into, each of which gets
answered silently by the first change that needs an answer if nothing
writes it down first. What a Dockerfile is for, which of the site and
the profile table is derived from the other, which repository holds the
design tokens, and where the words on a plugin page come from.

0002 makes the container the build environment and not the serving one,
leaves the static host as the origin, and names the three things the
container may not become: it does not serve, it does not publish, and it
holds no credential.

0004 makes the roster the source and the profile table a rendering of
it. The check reads across the repository boundary, reports the
difference and writes nothing, because prose edited by hand is an input
format that breaks on the first reflowed cell and a job that repaired
another tree would need a credential reaching it.

0007 puts the machine-readable token file with the machine-readable
data, with a pinned copy consumed here the way the roster is, and takes
the numbers a client has to meet along with it for the same reason. The
page and the stylesheet are both generated from that copy so the single
definition is checkable rather than intended.

0010 puts per-plugin prose in this tree, keyed by roster identifier,
with the roster keeping its one sentence and gaining no prose field. A
row without prose and prose without a row are both refused, because the
two failures have opposite causes and only one of them is visible.

Every measurement quoted was re-run at this commit against the published
references rather than copied from the issue that asked for it.

Refs #3, refs #5, refs #65, refs #79

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
@iderex iderex added documentation Improvements or additions to documentation planning labels Aug 9, 2026
@iderex iderex self-assigned this Aug 9, 2026
@iderex iderex added this to the Decisions of record milestone Aug 9, 2026
@iderex
iderex merged commit 2ae7c3d into main Aug 9, 2026
6 checks passed
@iderex
iderex deleted the decisions-index-and-0002-0004-0007-0010 branch August 9, 2026 09:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment