DunneFlow · The dashboard
Diagram and Shape
One compartment drawn as boxes and flows, and what one routine does, its loops, decisions and refusals nested as written.
Diagram#
Diagram view draws one compartment as a diagram. Where the graph draws everything, this draws a few dozen boxes and answers a different question: what is this part shaped like, and what flows through it.
A box is a class, a file's loose functions, or a kind of boundary. The dropdown lists every compartment with how many boxes it holds. The line under it describes exactly what is drawn, for example:
- 14 boxes over 88 routines: a fold, and what it folded.
- 23 flows within: arrows drawn inside this compartment.
- 42 crossing to 8 other compartments (not drawn): arrows that leave. They are always counted, but drawn only when you press show crossings, because drawn they connect everything to everything.
- entered from 1 way in: how the outside world gets here.
fit frames the whole drawing.
Where your selection went#
The line also says where your selection is: nothing at all, 3 boxes selected with a frame it button, or what you picked is not in this compartment. frame it moves the camera to your selection and everything an arrow joins it to. Nothing frames itself: picking a routine elsewhere marks the right boxes and leaves the camera alone, because a picture that moves under you is how you lose your place. The count is written in words because a marked box can be too small to see.
Opening boxes and arrows#
Double-click a box to open it: now the boxes are routines, and the line says which box you are inside. ‹ out goes back up.
Click an arrow to open the flow: every call site, with the arguments as written in the source, beside the callee's declared parameters. For an arrow into a boundary you get the SQL or network operations instead. Arguments are lined up with parameters only where the source settles it (a keyword argument always; a positional one only when the callee is resolved and the binding is unambiguous), and every argument that could not be bound says why.
Nothing is bounded silently#
Where a diagram leaves something out, it says what and how many, and the complete listing sits beside every bounded drawing. The listing is also the accessible path: a node graph stops being navigable with a screen reader well before a listing does.
Shape#
Every other view answers what a routine is connected to. Shape answers what it does.
DunneFlow leaves out internal computation, and control flow is shown only where something moves inside it. A loop that increments a counter is internal computation. A loop that issues one network call per item is a rate, and a rate is flow. A branch where one arm writes to a table and another does not is a decision about what leaves the program.
Reading the ribbon#
Shape is a nested outline with no arrows: structured code has no goto to draw, so boxes
are nested as the code is nested. Each line carries its line number, its kind, its header as
written, and a note on what DunneFlow judged about it:
| Kind | Meaning |
|---|---|
LOOP | With its iterable as written, and what moves inside it per pass. |
DECISION | With its test as written, and whether every way out moves the same things. |
GUARD | A refusal, such as a precondition that skips a pass, and how it leaves. |
HANDLER | A try, and whether anything moves while recovering. |
DATABASE, FILE, STDIO, … | Something actually leaving the program, with the operation. |
→ name | A call, clickable. |
Nothing is dropped for being quiet. A loop that moves nothing is still drawn and says so; the quiet loops are what make the others credible. Anything naming a table is a link to it.
The Algorithms page#
The navigator's Algorithms group shows the same facts across the whole program, in five lanes:
| Lane | Contents |
|---|---|
| A boundary, once per pass | Loops that reach out of the program every time round. |
| Decisions about what leaves | Branches whose arms differ in what they move. |
| Three or more ways out | Ladders. |
| Something moves while recovering | Handlers that do more than swallow an error. |
match statements | Counted whether or not there are any. |
Every lane states its denominator (for example 99 of 1,222 loops and comprehensions), and the quiet bands, such as loops that move nothing, are counted above the list.
What it cannot see#
- A decision is compared by its header as written.
x == 1andx==1are two different values here; DunneFlow records what the source says rather than inventing an equivalence. - A loop is labelled
LOOP, notfororwhile, because what is recorded is its iterable or test, not the keyword that opened it.
Something unclear or out of date? Tell us.