Eleven surfaces, and the order they are specified in
Level 0 · one click in
A portal is a short list of surfaces, each holding a different record, in a fixed order. The directory is first; everything else is a view of it or a gate in front of it.
The order is the build order too: these tiles are a sequence, not a menu.
Indent is not decoration: it is the click count, drawn
Level 0 · one click in
Flush left means a reader arrives from the home page; one step in means the surface hangs off a flush-left one; two steps in, off that.
So the indent is arithmetic as well as shape: two steps in is three clicks, and three is the budget.
The directory is the spine the other surfaces hang off
Level 0 · one click in
An identifier is identity. A slug is an address. One is never allowed to do the other’s work.
An entry is the record of one listed thing, created once. Eight fields are fixed before another surface is drawn: identifier, registered name, display name, slug, category, post town, outward postcode, state.
An identifier is never reissued: tree, index and record all point at it. A slug may change, and the old one stays in the register pointing at the new.
Single writer. One account holds an entry. Everyone else proposes, and a proposal lands in a queue as one.
Four roles, and the grid that settles what each may change
Level 0 · one click in
- Readerno account at all
- Nothing. A published listing is readable without signing in.
- no row is written
- Holderone entry, exactly
- Its one entry, and the listing drawn from it.
- entry row, revision queue
- Moderatorqueue-facing
- A listing’s state and the reason code on the move. Never the copy it judges.
- moderation record
- Stewardtree and register
- The category tree and the slug register. No other role may.
- slug register, record
An account record holds an identifier, one address, one role, the entry it holds if any, and two stamps. A role change is itself a row.
Categories, and the depth budget that caps them
Level 1 · two clicks, via the directory
Breadth adds and depth multiplies, and that asymmetry decides the shape of a tree. Twelve more siblings is twelve more rows on a page; one more level under twelve categories, six children each, is several hundred nodes.
Every category sheet carries a three-click budget; the panel does that arithmetic before a level is agreed.
Slugs, reserved words, and the collisions a list hides
Level 2 · three clicks, via a category
Lossy on purpose
Slugging throws things away by design: capitals fold, accents come off, an ampersand expands, every other mark becomes a separator. That is what makes an address typable, and what makes two names collide.
Surfaces own words too, so a category may not take one. The panel names what it removed from each line, then flags what collided.
Decided once, written down. Every collision ends in a slug-register row: rename, qualify, or merge.
A listing’s five states, and the three queues that move it
Level 1 · two clicks, via the directory
A listing is a view of an entry written for a reader, not a second copy. Its state is the only field a non-holder can move.
- 1DraftThe holder writes. Nothing public, nothing queued.Holder
- 2SubmittedIt joins the submissions queue, in arrival order.Holder → queue
- 3PublishedAccepted by a moderator with a reason code, and only now indexed.Moderator
- 4RevisionAn edit opens a row beside the live one, which does not move.Revisions queue
- 5WithdrawnPulled by the holder, or removed on a report. The row stays.Reports queue
Each queue has its own order rule: a report against live copy cannot sit behind a fortnight of drafts. No row is edited or deleted — a correction is a new row naming the one it corrects.
Windows, drills, and the wall the sheets are pinned to
Level 0 · one click in
Changes go into a named window, so nobody meets a surface halfway through being replaced.
The backup set is the directory table, the category tree, the slug register, the moderation record and the account roles. A drill puts it on an empty instance and walks a reader’s route.
The sheets live on a wall in the unit at Sarisbury Green, one surface to a sheet, and nothing is signed off while its sheet is off the wall.
The index is a derivative of the directory, never a second store
Level 1 · two clicks, via the directory
Five things go into a token list: display name, registered name, category path, post town, outward postcode. The contact route does not, and neither does the state.
A · the write side
B · the read side
The middle box is the same box. One normaliser builds the index and reads the query, so a slug collision and two result rows nobody can separate are one defect seen twice. When the two disagree the index is wrong, and is rebuilt.