The state vocabulary

Eleven components, graded by how loudly the product should say them rather than by what caused them. Almost nothing blocks. Nothing blames the reader. Nothing names the system. And every state above the quietest rung says what to do now — a state that only describes itself is unfinished.

Rung 0 · silent
1 · Cold start
The launch surface, held. The most-seen state in the product and the one exception to every rule on this page, because the shell does not exist yet — /splash is a real route.
Why nothing is on it

Not a spinner on it, not a progress bar under it, and no message. The product holds its own identity until there is something to replace it with. An earlier draft of the spec said the shell is always there and was contradicted by the first screen of every session.

Rung 2 · spoken
2 · Cold start, when the wait is abnormal
The only sentence this surface ever carries, and it says what is happening to them. Never what the system is retrying.
This is taking longer than it should. Nothing is wrong with your house. We are having trouble reaching it.
The register

Nothing is wrong with your house is doing the work. Sam is anxious and high-stake, and the first thing every one of Sam's states answers is am I alright. A sentence naming a network or a server answers a question nobody asked.

Rung 1 · quiet
3 · The as-of line
One grammar, three sources: a frozen link, an offline read, a lapsed account. Mechanically different, and identical to a reader — this is true, as of a moment.
Money
As of Tuesday evening, when Dave sent this.
Kitchen
Set aside$46,000
Come in over$3,400
Primary bath
Set aside$22,000
Left$6,800
The grammar

A human moment and what it means for you. “As of Tuesday evening”, never “Last updated 14:32” — the second is the system talking about itself, and it is the single most likely regression in this file.

Stated once

At the top of the thing that is stale, never per card. A stale screen that says so on every card is a screen of warnings. And stale content is never hidden: the alternative to showing old data is showing none, which is strictly worse in a house with no signal.

Rung 2 · spoken
4 · The same line, over an action
Identical sentence, one rung louder, because the surface under it has a button. Acting on a stale number is the only way staleness can hurt anybody.
Cabinet package
As of Tuesday evening. If Dave has repriced this since, you won't see it here until you are back online.
Reed Millwork
Quoted 14 May
$21,400 $3,400 over the allowance
Settle it
Why the rung moves

Looking at an old allowance costs nothing. Deciding against one does. This is the general rule that an action on the surface raises the rung, and it is why the ladder is a test rather than a lookup table.

Rung 1 · quiet
5 · The skeleton
The shape of what is coming, in its quiet state. Only for the known-slow — under about a second nothing is drawn at all and the screen simply arrives.
Plans & drawings
Sheets
No shimmer

A shimmer is an animation applied to a delay to make it feel shorter. It makes a slow screen look busy and a fast one flicker. Anything wearing this class is already known to be slow, and a slow screen does not need to sparkle.

And no count

3 of 12 loaded is a denominator and is banned for the same reason a money fill is. A loading state is the likeliest place for a progress readout to come back, which is why the ban is restated here rather than only where the money is.

Rung 1 · quiet
6 · The in-flight mark
Dave's phone, in a basement. Three photos of the island wall are taken, filed and shown as done. The rings say the copy on the server has not caught up.
The Hollis House
You are offline No signal here Photos, ticks and notes go in and send themselves when you are back. Deciding, signing and approving wait. Those touch somebody else's record.
This morning
Island wall, openKitchen · 7:52am
Boxes set, north runKitchen · 7:54am
Rough-in walked with Tony Alvarez8:10am
Show the result, not the process

An observation has no counterparty and cannot conflict — two people photographing the same wall both produce valid records, and a late-syncing photo is never wrong, only late. So it appears immediately, marked, rather than sitting in a queue with a status on it.

Not called pending

hc.css already spends .pending on the diagonal hatch meaning nobody has chosen this color, which is absence rather than waiting. Two states one word apart on the same screen is how a reader learns the wrong one.

Rung 1 · quiet
7 · Day one, and year two
The same zero, twice, with opposite meanings. An empty punch list on day one is we have not started. An empty punch list six months after move-in is the product working.
Day one: a shape
The punch list
Year two: a statement
Nothing is outstanding. The last item on your list was closed on 4 October. Anything new goes here.
They must not share a component

If they do, the good news reads as an unfinished screen for the rest of the product's life — and on a surface built for anxious people, an unfinished screen is read as something wrong with the house.

Why day one has no class of its own

Because it is a shape rather than a message: the section header stays, the rows do not, and nothing writes an encouraging sentence into the hole. 09-first-run settled this and it stands unchanged. Year two is the one that needed inventing.

Rung 1 · quiet
8 · The dated container
Neither of the two above. This one is not empty — it is not yet, and the date is the whole content.
The last mile
The punch list
Opens the week of 12 July Your list gets made on the final walk. Until then there's nothing to put in here. And nothing you need to do about it.
The warranty
Starts at closing One year on workmanship. The clock starts the day you get the keys, not today.
The rule

An empty container is removed. An empty container that will fill is kept and dated. It says when, not what. Writing nothing here yet in it collapses it into day one and throws away the one useful fact.

Why an outline

Because nothing here is an object. A hairline says this slot exists and will fill without claiming there is already something in it, which is exactly what a not-yet state means. The date line is the only amber thing on it, and it is a mark naming the kind rather than a panel the reader has to decode.

Rung 1, then 2
9 · The inert capability
Renee Boothe's team screen. She holds eleven of the thirteen capabilities; managing roles is one of the two she does not. The control is there, it is quiet, and it explains itself only when she reaches for it.
People
Dave Marsh Builders
Dave MarshOwner
Renee Boothe · youOffice manager
Change what someone can do
Dave is the only person who can change roles. You can invite somebody and set them up on a job. That part is yours.
Visible and inert, never absent

Absence teaches nothing and reads as broken — an admin who cannot find the role control concludes the app has lost it. Inert, with the reason, teaches the permission model once and never needs a settings page to explain it.

And it does not dim

An alpha over a whole control drops its label below AA and reads as a rendering fault rather than a decision. The ink moves to the muted tone and the control keeps its shape. Drawn here in its reached state; at rest the sentence is closed.

Rung 2 · spoken
10 · It did not send
The one state that carries a clock, and it is on Dave's phone because time is information to him. The same line on Sam's screen is anxiety with a timestamp on it.
Send
A clock is running Not sent since 9:14 The tile question to Ben Okonjo is still here. Nobody at Cedar Court has seen it.
Out
Primary bath floorSam and Nora · opened 6:41am Live
Framing invoice 2214Ana Duarte · Ridgeline Live
The one structural difference between the registers

Dave is not anxious, he is interrupted, and he is coordinating five people in the physical world. He needs the clock. Sam mostly does not. Everything else about the two registers is the same components saying the same things.

The action is the point

Send it now, not retry. An error that can retry itself already has; this one is waiting on him because it left his phone and never landed, and the sentence names who has not seen it rather than what failed.

Rung 2 · spoken
11 · Not found, and the cold cache
Two sentences that must never be confused. Same blank screen, opposite facts, and only one of them resolves itself.
Not found: it doesn't exist
Not here any more That's not here. This link points at something that has been removed. Nothing else about your house has changed.
Cold cache: it exists and you aren't connected
You are offline We don't have this one yet. You haven't opened Ridgeline on this phone, so there's nothing stored to show you. It will be here when you are back on signal.
The worst sentence in the vocabulary

Telling a homeowner with no signal that their house does not exist. That is what merging these two produces, and it is why not found is a state of its own rather than a variant of something broke — nothing broke.

Neither one blames anybody

Not you typed the wrong address, not you should have opened this earlier. Never blame the user, never name the system: the two rules that stop the ladder collapsing back into a cause taxonomy the first time something is urgent.

Rung 2 · spoken
12 · A dead link
One of seven, from one template. 30-the-link-states draws the whole set; this frame is here so the template is met beside its siblings.
DM
Dave Marsh Builders
The Hollis House
Replaced There's a newer version of this. Dave repriced the tile on Wednesday morning. The page you were sent has the old numbers on it.
This page was made on Tuesday evening and doesn't update.
Superseded and replaced are opposite

Superseded says this page is wrong — do not act on it, and there may be nothing to go to. Replaced says this page is out of date and always points forward. A reader who acts on a superseded page has done damage; one who acts on a replaced page has wasted a trip.

The sender is painted first

Before anything that has to be fetched. A stranger must be able to tell whose message this is while the rest is still arriving — they know Dave, they do not know us, and a page opening on our logo alone reads as smishing.

Rung 3 · blocking
13 · The lapsed account, first open
One of exactly three things in the product that block. They need to know once, properly — and then never like this again.
Everything is still here.
Your subscription ended on 30 June. Every job, every decision and every document stays readable for as long as you want it. Nothing gets deleted.
What stops is new work: no new decisions, no new change orders, and no new links out. The links already with your clients keep working until they are answered or they expire.
Start it again Keep looking around
And rung 1 forever after

One line, where it is true, never again. That escalation-then-silence is how no nag survives a state that persists indefinitely — a polite rung-2 banner on every screen for the rest of the account's life is a nag by duration.

It leads with what still works

The same move the offline bar makes. Everything is still here is the first sentence because it is the one the reader is afraid of, and because a lapsed builder's clients are holding live links he did not withdraw.

Rung 1 · quiet
14 · The lapsed account, every open after
The same fact, the quietest possible statement of it, and an as-of line because nothing new is going in.
Jobs
Read-only since 30 June. Everything here stays.
The Hollis HouseFixed price · Into the finishes
Cedar CourtCost plus 15% · Inside the walls
RidgelineGMP · Structure is going up
Start a decision
The inert capability again

A lapsed account is a permission model with one rule in it, so it reuses the component rather than inventing a disabled state. The button is where it always was, quiet, and says why when he reaches for it.

What is not on this page, and why each absence is a decision

There is no .error class, at any rung, and there is no way to spell a status code with this vocabulary. Cause never organizes anything and never surfaces — no sync failed, no exception text, no system voice. That is the rule that stops the ladder degenerating back into the cause taxonomy the first time something feels urgent.

There is no red rung. Volume is carried by layout — flat, versus interrupting, versus alone on the screen. --terracotta means a genuine clash and it is spent exactly once here, on superseded, which is the one state where the page in front of the reader contradicts the record. Coloring no signal as an error blames the reader for the building.

There is no spinner and no modal. Under about a second the screen arrives; above it, the shape of what is coming. A dialog stops the reader to say something they could have read while still looking at their house.

Rung 0 has no class and must not get one. The undecided kitchen renders gray because --r-wall is gray; an absent section is absent; a live link is just the page. If a page finds itself reaching for a .rung0, it has found a rung-1 state and mis-rated it.

How a new state gets a rung

Three questions, in order, and the first yes wins. Would proceeding without knowing this cause harm? → rung 3, and almost nothing qualifies. Does the reader need this to decide what to do next? → rung 2. Can the reader act on it at all? → if no, rung 1 — telling someone loudly about something they cannot change is anxiety with no payload. If none apply it is rung 0 and the data says it by itself.

Two corollaries the frames above draw. The same state takes different rungs by approach — a removed decision is rung 1 noticed in a list and rung 2 followed to directly. An action on the surface raises the rung, which is frames 3 and 4.

And a test for whether a candidate state is real at all: it is legitimate if it changes what the reader should do next. If it only changes what an engineer would investigate, it is a cause and it does not reach a screen. Connection reset, timeout and 500 all fail that test — the reader does the same thing in every case, so they are one state with three causes behind it.