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
Page: its own address State, dialog, section: lives inside a page and is designed anyway LATER: on the map, not in the MVP

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

0 to 8

Cluster level

46 nodes below
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

Cluster 0

Shell and navigation

global · 7 nodes · 7 MVP
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.

Cluster 1

Session

pages · 2 nodes · 2 MVP
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.

Cluster 2

Take the shift, expands A1

pages · 5 nodes · 5 MVP
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.

Cluster 3

Work the queue, expands B1 and B2

pages · 6 nodes · 6 MVP
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.

Cluster 4

Rule on the case, expands C1

pages · 10 nodes · 10 MVP
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.

Cluster 5

Answer for it later, expands D1

pages · 6 nodes · 6 MVP
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.

Cluster 6

Tell the client, expands E1

pages · 2 nodes · 0 MVP
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.

Cluster 7

Grant the rope, expands F1 and F2

pages · 3 nodes · 0 MVP
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.

Cluster 8

Systemic

global · 4 nodes · 4 MVP
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

SourceNodesWhat it means
The eight screens8Already on the concept map
States and dialogs inside them25Eight of these were already drawn in the flows at the base layer. They were routes then; they are nodes now
Discovered here, no parent screen12The 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
The number that matters for the next stage

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.