Files
member-console/docs
cgalo5758 6034b033ad Open every transaction through the runner, and lock the ladder reorder's rows in order
First of two changes for #186. golangci-lint now refuses BeginTx and
(*sql.DB).Begin outside internal/db, tests and the test kit, with a
message naming the runner (db.InTx, db.Begin). Tests stay outside the
rule because they open raw transactions to hold a lock while the code
under test waits; go-static-analysis records that exclusion.

Five hand-opened transactions now open through the runner: the domain
registry's, whose advisory lock becomes the first statement of a kind
of its own; the Discourse sweep's and the System tenant's boot step,
through db.InTx; and the Stripe product sync's and the invoice
reconcile's, through db.Begin, which keeps their own commit. Nothing
they write changes; a failed begin or commit in the first three reads
without the label that named its step. MakeDefaultPrice,
ReorderPlanLadders and CreateWorkspace stay pinned exceptions that name
#221, which moves their transactions out of the handlers.

The ladder reorder now runs at READ COMMITTED, whatever the server's
default, and locks every ladder row in ascending id order with FOR NO
KEY UPDATE (LockPlanLadderOrder) before it reads or writes. Two
reorders in opposite orders at once no longer deadlock: the second
waits, reads the order the first committed and writes its whole
submitted order, where before it could skip a ladder whose stale
position happened to match. A conferral's foreign-key share lock on a
ladder is not blocked. The tests run the reorder at the default and at
a REPEATABLE READ default.

docs/database-locks.md, docs/go-conventions.md and docs/testing.md say
what the code does. No user-visible string changes; the deploy changes
no data.

Break list: 12 records, 12 CAUGHT. Named without a record: the error
labels three conversions drop (log text no test or caller compares),
the two conversions that change no behaviour, and one comment. Full
suite on reset databases: 5656 passed, 16 skipped, none failed.
2026-10-31 02:24:08 -05:00
..
2026-09-07 21:32:14 -05:00

title, audience, summary
title audience summary
Documentation index
developer
admin
user
Index of member-console documentation, grouped by audience, plus the front-matter convention every doc follows.

Documentation

Every document in this directory carries YAML front matter declaring its audience, so readers can find what's for them and contributors know who they're writing for.

Front-matter convention

Start each doc with a front-matter block:

---
title: "Human-readable title"
audience: [admin, developer]   # one or more of: developer, admin, user (primary first)
summary: "One sentence describing what the doc covers."
---

The three audiences:

  • developer — contributing to or understanding the codebase: architecture, design decisions, dev setup, testing, UX research and conventions, the provider-extension contract.
  • admin — hosting and operating an instance: installing, configuring an identity provider, building the image, generating secrets, running the service.
  • user — the general public or a member using a running service. (None yet — the tag is reserved for member-facing docs.)

List the primary audience first; a doc may name more than one.

For administrators — hosting & operating

For developers — contributing & internals

  • Database Management — goose migrations and sqlc.
  • Database Locks — every advisory and serializing row lock, how each key is built, and the order each path takes them in.
  • Design System — UI conventions.
  • Domain Model Cards — the model catalog: one card per domain model with invariants, dimensions, and traps.
  • FedWiki Integration — provisioning via the FarmManager API.
  • Go Conventions — where a rule and an act live, transactions and locks, services that answer after the listener opens, output order, error handling, and dead code.
  • HTMX Setup — HTMX under a strict CSP.
  • Identifiers — IDs, names, and keys: which entities carry a key, its grammar and scope, and how seeds and lookups use it.
  • Operator Information Architecture — the operator panel's IA contract.
  • Operator UX Conventions — form and action conventions.
  • First-Contact UX Walk Process — the repeatable method for walking the console as a stranger.
  • First-Contact UX Rubric — the instrument that method scores with: the A–G question bank, the walker protocol, and the screen coverage checklist.
  • Agent Runner — how an agent from another model family reviews or ideates on the code inside a disposable copy: what contains it, how a task is shaped, and what a finding must carry before it counts.
  • Operator UI Accessibility Baseline — what operator-UI changes are diffed against.
  • Building an Integration — adding a new integration.
  • Testing — the test taxonomy and how to run each kind, plus the gates: make lint (page-anatomy rules and the Go static checks) and make screens (contact sheets at two widths).

For users

No member-facing documentation yet.

One page per rule

A rule is written on the one page that owns it. Another page that needs the rule links to that page instead of restating it, because two copies of a rule are edited separately and drift apart.

Where things are not

Research, drafts, audits, walkthrough evidence, and other records of how a decision was reached are not documentation; they stay in a local notebook that git ignores, so a clone never carries them. When a decision lands, whatever a reader still needs is written into this directory, which holds the result without the history. The rule for every kind of file is in status/MAINTAINING.md.