Surface 3 of 9 · before any bespoke screen

The state family

Correctness features, not decoration. Designed once and applied everywhere, and designed before any bespoke screen, because every screen needs them. Two sibling products shipped with no error state anywhere and rendered failures as empty lists; this page exists so that cannot happen a third time.

The eight, on the floor

Each carries the axis it belongs to — the whole surface, one set, the link, or one machine.

Loading

transient
PC-01
PC-02
PC-03

The room keeps its shape. Band header, tile count, positions and machine names are all present before any state arrives, so the counter's eye lands where it will land. Only the facts are missing, and the bars sit exactly where the facts will be.

Never confusable with stale. Loading has no age and no data; stale has both. A skeleton never shows a number.

Stale

whole surface
PC-01
94min
PC-02
06:42
PC-03
Free

PC-03 may already be free, or may have been taken forty seconds ago.

Never confusable with live. The clocks stop, the cyan drops out of every tile, and the age counts up. A stopped watch, not a blank face — because a stale export is a wrong export that looks right.

Error

whole surface
Cannot load the floor

The floor service did not answer. The queue below is local and still correct, and every visit already open is still billing on the server — this screen just cannot see them. Nothing has been lost.

Last attempt 21:04:12 · retrying by itself every 10s

Never confusable with empty. Empty is quiet and carries no rule. This is a filled panel with a coloured edge, readable at ten metres — which is the requirement, because a counter reads the floor from across the room.

Empty

a set
Nothing on the VIP floor yet.No machines have been added to this room. Adding one puts a tile here immediately, before any agent is installed — the registry comes first and that is expected, not a gap.

Owner and technician only. On a counter this button is absent rather than disabled — it is not their errand.

Never confusable with no-match. This is a room waiting to be furnished, so it offers the thing that fills it. A set behind a filter gets the filter back instead.

No match

a set
VIP room paid by card before 18:00
No visits match these three filters.There are 4,318 visits in history and none of them is all three of those. The widest single filter is the time window.

It never says "no results". That sentence blames the data for a choice the user made. It names the filters back and offers the one most likely to be the mistake.

Capped

a set

Both numbers, always in that order. A count that shows only what is loaded is how two screens end up disagreeing about one set.

Scope-limited

the principal

It affirms that what is shown is whole. A scoped total with nothing said about it reads as the truth, and that is what separates a scoped view from a broken one. Never a spinner, never a blur — both make it look like it is still loading.

Offline · queued

the link
PC-01
94min
PC-02
31min
not yet synced
PC-03
Free

Still allowed. Offline is a mode, not an error — the work continues and queues. Only reconciliation waits.

Never confusable with a machine being down. That is a corner rule on one tile; this is a banner across the top. Different place, different sentence.

Two axes that can both be true

My link to the server, and that machine's link to us. The pair a counter must never confuse.

"I cannot reach the server" and "the server cannot reach PC-12" are different facts about different machines. One is true of the whole surface, so it is a banner in the chrome. The other is true of one object, so it is a mark on one tile. Place and shape keep them apart, not wording.

machine online
agent answering
machine offline
seen, now gone
machine unknown
never reported
link up
server reachable
Normal. Nothing is marked anywhere.
One tile carries the corner rule. The floor is otherwise trustworthy.
Launch-day normal. A dashed tile that claims nothing about the hardware.
link down
writes queued
A banner names the age and the queue depth. Tiles are unmarked — the machines are fine, we are not.
Both marks visible at once, in different places. This is the pair that must never merge.
We cannot reach the server and it never knew this machine. Seating here is a guess, and the tile says so.
link down
a write rejected
The rejected write names itself. The rest of the floor is still live.
Resolve the conflict first; the machine question is a separate errand.
The write is gone and the machine was never known. This is the cell the whole screen below exists for.

Sent is not done

A command in flight, and the one word that is the whole state.

Queued sent 21:04:31
PC-12 is still on.

The power-off was sent and the agent has not answered. Omar Nabil is still in his visit and it is still billing.

Sent byMostafa · 21:04:31
Agent last seen4m 12s ago
Command expires in2m 48s
His visitopen, still billing

The tone is warning, never success. No tick, no green, no past tense. Sent and done are different words and the difference is the entire state.

The tile carries the same mark. A second counter who did not send the command can still see one is in flight, so they do not send another.

The command expires. An agent that never answers would otherwise leave a stale instruction to fire an hour later, when a different customer is sitting there. It has a stated lifetime and it counts down here.

Cancelling is itself a history row. "Mostafa sent a power-off and withdrew it" is a thing a shift handover needs to know.

Conflict — the only state that needs a whole screen

Offline is only credible if the surface can say which write did not survive, and why.

1 of 3 queued writes failed
PC-12 was already taken when your visit reached the server.

You seated Hossam at 21:03 while offline. The second counter seated Omar at 21:01, which the server already had. Two visits cannot hold one machine, so yours was not applied. Nothing has been billed to either of them yet.

Yours · not applied · queued 21:03
MachinePC-12
CustomerHossam Fathy
Started21:03 local
Rate stampedStandard · 40.00/h
Billed so far0.00
On the server · live now · accepted 21:01
MachinePC-12
CustomerOmar Nabil
Started21:01 server
Rate stampedStandard · 40.00/h
Billed so far1.20
What will be true after each choice

His visit is re-applied to PC-04, which is free, starting from 21:03 — so he is not charged for the two minutes he stood at the desk. Omar keeps PC-12. The queue loses one entry.

The queued write is dropped and Hossam goes back to the head of the line with his original waiting-since time intact. Nothing was billed, so nothing is refunded.

Neither option is destructive, so neither gets a gate. Nothing here asks whether you are sure. Both buttons state what becomes true, and Hossam is standing at PC-12 either way.

Six invariants, written as pairs

Because that is how they fail — never alone, always as one state mistaken for another.

#The pairKept apart by
S1Loading / StaleLoading has no numbers and no age; stale has both, frozen, with the age counting up. A skeleton never shows a figure.
S2Empty / ErrorEmpty is quiet with no coloured edge and offers what would fill it. Error is a filled panel with a danger rule, legible from ten metres.
S3Nothing yet / Nothing matchesThe first offers an action that creates something. The second names the filters back and offers to loosen one.
S4My link is down / That machine is downPlace and shape. The link is a banner in the chrome, true of the surface. The machine is a corner rule on one tile, true of one object.
S5Queued / DoneA queued write keeps the warning tone and the words "not yet synced" on the tile it changed. A confirmed write loses all marking — normal is silent.
S6Scope-limited / BrokenWithheld rows keep their labels, name who can see them, and the surface affirms that the visible figures are complete rather than partial.