Stage 03b · Information architecture, detail layer
Everything the product is made of
Eight screens expand into forty six nodes, because a dialog you have to design and a state you have to survive cost the same as a screen. This is the tree. What each node contains lives on its own page, reachable from Structure.
- Nodes
- 45 from eight screens
- In the MVP
- 39 six deferred
- Clusters
- 9 two of them global
- States and dialogs
- 25 counted as nodes, not notes
This is not the flow diagram. Flows answers whether a route reaches the goal and colours dead ends. This answers what exists and what contains what. The two disagree on purpose: a node that is a dead end in a flow is still a node that has to be designed.
01 · Overview
Nine clusters, and how a shift moves through them
Cluster level
flowchart LR
C1["1 Session"] --> C0["0 Shell and navigation"]
C0 --> C2["2 Take the shift"]
C0 --> C3["3 Work the queue"]
C2 --> C3
C2 --> C4["4 Rule on the case"]
C3 --> C4
C4 --> C5["5 Answer for it later"]
C4 --> C6["6 Tell the client"]
C3 --> C7["7 Grant the rope"]
C7 --> C5
C8["8 Systemic"] -.-> C3
classDef pg fill:#ffffff,stroke:#16181a,stroke-width:2px,color:#16181a;
classDef lt fill:#f4f4f4,stroke:#9aa0a6,stroke-dasharray:4 3,color:#6a6f76;
class C0,C1,C2,C3,C4,C5,C8 pg;
class C6,C7 lt;Two arrows carry the argument. Cluster 2 reaches cluster 4 without passing through cluster 3, which is the two-tap start-of-shift path: the brief points straight into a case. And cluster 7 feeds cluster 5, because moving a tenant's latitude is a logged action rather than a setting.
02 · The tree
Cluster by cluster, every node
Shell and navigation
flowchart LR
n01["0.1 Console shell
page"] --> n02["0.2 Global navigation
section"]
n01 --> n03["0.3 Tenant autonomy annunciator
section"]
n01 --> n04["0.4 Live connection status
state"]
n01 --> n05["0.5 Keyboard map
dialog"]
n06["0.6 Action class taxonomy
data"] -.-> n03
n07["0.7 Rejection reason taxonomy
data"] -.-> n01
classDef pg fill:#ffffff,stroke:#16181a,stroke-width:2px,color:#16181a;
classDef st fill:#ffffff,stroke:#c9ccce,color:#16181a;
class n01 pg; class n02,n03,n04,n05,n06,n07 st;0.3 is the differentiator in one element. An annunciator rather than a menu item: latitude read from a fixed place, the way armed and active are read on a Flight Mode Annunciator. In the MVP it is readable and not settable, and that gap is deliberate.
Session
flowchart LR
n11["1.1 Sign in
page"] --> n21["2.1 Shift brief"]
n11 --> n31["3.1 Case Queue"]
n12["1.2 Session expired
dialog"] --> n11
classDef pg fill:#ffffff,stroke:#16181a,stroke-width:2px,color:#16181a;
classDef st fill:#ffffff,stroke:#c9ccce,color:#16181a;
classDef ex fill:#fafafa,stroke:#e3e4e6,color:#6a6f76;
class n11 pg; class n12 st; class n21,n31 ex;1.1 is the only public URL this product has. Everything below it is behind authentication, noindex, no schema. That is why this layer settles addressing and permission rather than search.
Take the shift, expands A1
flowchart LR
n21["2.1 Shift brief
page"] --> n22["2.2 Assembling
loading"]
n21 --> n23["2.3 Nothing carried over
empty"]
n21 --> n24["2.4 Closed by the outgoing analyst
state"]
n24 --> n25["2.5 Close failed
error"]
n21 --> n41["4.1 Case File, by a pointer"]
classDef pg fill:#ffffff,stroke:#16181a,stroke-width:2px,color:#16181a;
classDef st fill:#ffffff,stroke:#c9ccce,color:#16181a;
classDef ex fill:#fafafa,stroke:#e3e4e6,color:#6a6f76;
class n21 pg; class n22,n23,n24,n25 st; class n41 ex;One screen in two roles, not two screens. The incoming analyst reads it, the outgoing one closes it, and closing is a state. 2.5 warns both analysts rather than one, because a brief that fails to close silently is the failure mode the interviews described.
Work the queue, expands B1 and B2
flowchart LR
n31["3.1 Case Queue
page"] --> n32["3.2 Streaming in
loading"]
n31 --> n33["3.3 Queue stale
error"]
n31 --> n34["3.4 Nothing waiting
empty"]
n31 --> n36["3.6 Scope and filters
section"]
n34 --> n35["3.5 Fleet, resting state of the pane
section"]
n31 --> n35
n31 --> n41["4.1 Case File in the pane"]
classDef pg fill:#ffffff,stroke:#16181a,stroke-width:2px,color:#16181a;
classDef st fill:#ffffff,stroke:#c9ccce,color:#16181a;
classDef ex fill:#fafafa,stroke:#e3e4e6,color:#6a6f76;
class n31 pg; class n32,n33,n34,n35,n36 st; class n41 ex;3.5 has two parents and no route. It is what the pane shows when nothing is selected, so it is reached from the landing state and from a deselection, never from a menu. The price was named at the base layer: if 3.4 reads as "this is empty" rather than "this is the fleet", the decision to keep the fleet out of the menu has failed.
Rule on the case, expands C1
flowchart LR
n41["4.1 Case File in the detail pane
page"] --> n43["4.3 Clerk still investigating
loading"]
n41 --> n48["4.8 No baseline for this tenant
empty"]
n41 --> n47["4.7 Evidence expired
error"]
n41 --> n44["4.4 Reject with a reason
dialog"]
n41 --> n45["4.5 Amend the narrative
state"]
n47 --> n46["4.6 Escalate
dialog"]
n41 --> n46
n41 --> n49["4.9 Verdict did not write
error"]
n49 --> n410["4.10 Held locally, unrecorded
state"]
n42["4.2 Case File, standalone route
page"] --> n46
classDef pg fill:#ffffff,stroke:#16181a,stroke-width:2px,color:#16181a;
classDef st fill:#ffffff,stroke:#c9ccce,color:#16181a;
class n41,n42 pg; class n43,n44,n45,n46,n47,n48,n49,n410 st;Two renderings of one screen, and they are separate nodes. 4.1 lives in the split pane and never leaves it, 4.2 is the permalink and the only rendering at 360. They differ in navigation, in what surrounds them and in what they have to survive, so one node with a footnote would have hidden that.
Answer for it later, expands D1
flowchart LR
n51["5.1 Decision log
page"] --> n52["5.2 Narrowing
loading"]
n51 --> n53["5.3 Case not findable
empty"]
n51 --> n54["5.4 Log entry, as-of
page"]
n54 --> n55["5.5 Snapshot did not survive
error"]
n51 --> n56["5.6 History of one case
state"]
n54 --> n42["4.2 the live case"]
classDef pg fill:#ffffff,stroke:#16181a,stroke-width:2px,color:#16181a;
classDef st fill:#ffffff,stroke:#c9ccce,color:#16181a;
classDef ex fill:#fafafa,stroke:#e3e4e6,color:#6a6f76;
class n51,n54 pg; class n52,n53,n55,n56 st; class n42 ex;The addressing decision of this layer sits on 5.4. An evidence snapshot is reachable by URL as it stood, which turns "show what was known at the time" into an address rather than a feature. It also means the unchosen retention window bounds this cluster arithmetically, which is the gap the base layer found in the research.
Tell the client, expands E1
flowchart LR
n61["6.1 Client summary draft
page"] --> n62["6.2 Editing and sending
state"]
n62 --> n51["5.1 Decision log"]
classDef lt fill:#f4f4f4,stroke:#9aa0a6,stroke-dasharray:4 3,color:#6a6f76;
classDef ex fill:#fafafa,stroke:#e3e4e6,color:#6a6f76;
class n61,n62 lt; class n51 ex;Deferred with a debt attached. Cluster 6 and cluster 7 have no flows, because drawing a route for a deferred screen implies it is being built. When they come off the backlog they arrive with no empty, error or loading states defined, and whichever stage picks them up owes that work first.
Grant the rope, expands F1 and F2
flowchart LR
n71["7.1 Tenant detail
page"] --> n72["7.2 Autonomy grants
page"]
n72 --> n73["7.3 Grant change
dialog"]
n73 --> n51["5.1 Decision log"]
classDef lt fill:#f4f4f4,stroke:#9aa0a6,stroke-dasharray:4 3,color:#6a6f76;
classDef ex fill:#fafafa,stroke:#e3e4e6,color:#6a6f76;
class n71,n72,n73 lt; class n51 ex;The fleet ships as a view before it ships as a control. 0.3 and 3.5 are in the MVP, 7.2 is not. That is what is left of the differentiator after the competitor pass: per-tenant autonomy as configuration already exists on the market, and ours has to be a view where the analyst works.
Systemic
flowchart LR
n81["8.1 Not found
state"] --> n31["3.1 Case Queue"]
n82["8.2 Service unavailable
state"] --> n31
n83["8.3 Permission denied
state · LATER"] --> n31
n84["8.4 Toast stack
section"]
classDef st fill:#ffffff,stroke:#c9ccce,color:#16181a;
classDef ex fill:#fafafa,stroke:#e3e4e6,color:#6a6f76;
class n81,n82,n83,n84 st; class n31 ex;8.3 was corrected at the stage 08 audit and is now LATER. This cluster used to route a tenant that is not this analyst's to 8.3. That is exactly what 8.1 forbids: if out of scope renders differently from not found, the address bar distinguishes "this client is somebody's" from "no such client". Out of scope now renders 8.1. What is left for 8.3 is a refusal by role, and the first one arrives with cluster 7. No node in this cluster is a dead end.
03 · What the expansion cost
Where the thirty seven extra nodes came from
| Source | Nodes | What it means |
|---|---|---|
| The eight screens | 8 | Already on the concept map |
| States and dialogs inside them | 25 | Eight of these were already drawn in the flows at the base layer. They were routes then; they are nodes now |
| Discovered here, no parent screen | 12 | The whole shell, the session, the systemic cluster, and two canonical taxonomies found at the gate that closed the global elements. Scope set here rather than inherited. Eleven MVP; 8.3 became LATER at the stage 08 audit |
Thirty nine MVP nodes is the honest cost of this product, not the five screens the base layer counted. The estimate at step 6 decides how many get a black and white mockup and how many stay a written specification. That decision is deliberately not made here, because a map that trims itself to fit the budget stops being a map.