What this tool is for
Build one decision tree per workstream. Annotate every decision point with its pros, cons and outcome, flag anything that blocks progress, then mark the route that was actually chosen. Press Complete to produce a summary table of the chosen route, and export it to Excel with a picture of the tree.
Roots and nodes
- A root is a workstream. Add as many as you need with + Root in the left rail.
- Any node, including a root, can have as many children as you need. Select a node and press + Child.
- A tree may be at most 200 levels deep, counting the root as level 1. That is far beyond any real decision tree and is the point past which the diagram could no longer be drawn reliably. If you reach it, + Child declines with an explanation rather than failing, and a workbook that describes a deeper tree is refused on import with the same explanation. There is no limit on how wide a tree may be.
- Delete removes the node and its whole subtree after a confirmation.
Node attributes
- Select a node and press Details to edit its title, pros, cons, outcome and cost.
- Once a field has text the node shows a coloured dot: green pros, amber cons, blue outcome, black cost. Click a dot to expand the text in place, click it again to collapse it.
- Cost is a plain number with no currency symbol and no unit. Anything that is not a number is refused: the box turns red, an explanation appears under it and the stored cost is left exactly as it was. An empty cost box means the block has no cost, which is deliberately not the same as a cost of zero, so the black dot appears only once a cost has actually been entered.
- Supported precision and range. A cost may carry at most 6 decimal places and its magnitude may be at most 9007199254.740991. A value outside either limit is refused, on typing and on import, rather than being quietly rounded or truncated: for example 0.0000004 has seven decimal places and is declined, because accepting it and then showing two of them as 0.000001 would report a materially different number from the one you entered. Totals are added up exactly, so a figure on screen is precisely the sum of the figures that went into it, never a rounded neighbour of it and never Infinity. In the very unlikely event that a total leaves the supported range it says so in words instead of printing a wrong number.
- The small padlock on a node toggles the blocker flag. A blocked node takes a subtle translucent red wash and is highlighted in the summary table.
Deliverables
A deliverable is something the work has to produce. Deliverables are session-wide and common to every workstream: there is one list, and every block in every root is offered the same one.
- The list is managed from the Deliverables section of the left rail, in the same way as the goals: + Deliverable adds one, and each row carries its own Rename and Delete buttons.
- Four are seeded with the dinner example and visible from the first load: Everyone fed, Dietary needs covered, Drinks for every guest, and Within budget. Every one of them can be renamed or deleted, and you can add as many more as you like.
- Deleting a deliverable removes it cleanly from every block that referenced it. The number beside each row says how many blocks currently tick it, so you can see what a delete will affect before you confirm it.
- In a block's Details panel the whole list is shown with a tick box each. Tick the ones that block delivers. The same deliverable may be delivered by any number of blocks. Final goals are the exception: a goal neither claims nor delivers deliverables, so no tick list is offered on one.
The diagram badge
Where the child count has always been shown, a node now reports its children and its deliverables together:
- +2 (3) two direct children and three deliverables ticked.
- (3) no children and three deliverables ticked.
- +2 children but no deliverables. No empty brackets are ever drawn.
- Nothing at all when the block has neither.
The badge follows the orientation, the zoom and the collapsed branches, and it is drawn into the exported picture as well as onto the screen. A collapsed parent keeps its separate blue "hidden" badge alongside it. A final goal has no children and no deliverables, so it carries no badge at all.
How the chosen path works
Each root workstream stores exactly one chosen path. Select any node in that tree and press Choose path. That node becomes the end of the chosen path, and the tool automatically includes every ancestor from the root down to it. The whole path is highlighted with a green border and tint, and the end node carries a thicker border.
Pressing Choose path on a different node in the same tree simply moves the end point. Clear path removes the choice for that root. Only nodes on the chosen path appear in the summary table, in root-to-leaf order. If a root has no chosen path the summary says so explicitly rather than dropping the workstream.
Final goal blocks
A final goal is the destination a chosen path arrives at. Add one with + Goal in the left rail, then select any node in a workstream and press Goal... in the toolbar to say which goal that workstream feeds.
- Assignment is completely flexible and every shape can be in play at once: one goal shared by all roots, one goal per root, one goal shared by some of the roots, and roots with no goal at all.
- A goal carries some of the attributes of an ordinary block, but deliberately not all of them. Its outcome and its blocker flag are its own and you edit them normally.
- Its pros and cons are inherited. They are aggregated from every block along the chosen path or paths that feed the goal, and each line names the workstream and the block it came from. They are derived, so they are shown hatched and read only in the detail editor and cannot be typed into. To change them, change the blocks they came from.
- Its cost is inherited and nothing else. A goal has no cost of its own and the editable Cost box is not offered on one at all. The single figure a goal shows is the read-only derived total: the sum of the costs of every block on the chosen path or paths that feed it, computed on demand exactly like the pros and cons. It is shown in its own hatched box in the detail editor and on the goal's black dot on the diagram.
- A goal carries no deliverables. It neither claims nor delivers them, no tick list is offered on one, and a goal never contributes to the deliverable coverage strip. Coverage is aggregated from the nodes on the chosen paths only.
- Because a goal has no children and no deliverables it carries no badge on the diagram.
- A goal is drawn on the diagram from the moment you create it, including one that no root has been assigned to yet. An unassigned goal is placed in a row of its own, ahead of the assigned ones, so that adding a goal visibly does something and you can see what is still waiting to be wired up. Assign it to a workstream with Goal... and it moves to sit past the roots it serves.
- A goal sits past the deepest level of the roots it serves: at the bottom in the top-down layout and at the right in the left-right layout. A goal shared by several roots is drawn larger and is centred so that it aligns across all of them.
- Goals are staggered in depth so that two of them can never overlap. A goal serving more roots is always placed strictly deeper than one serving fewer, so a wide goal can never collide with a narrow one. Two goals serving the same number of roots are then separated by a collision check, which puts each on the shallowest free depth level whose existing goals do not intersect its span.
- A goal is not connected to anything until you press Complete. Until then it is outlined with a dashed border and labelled "not linked". Complete links the terminating node of each chosen path to its goal with a dashed green connector. A goal link is routed around whatever lies between its source and the goal, so a path that ends high up in a deep tree never has its connector run through the blocks below it; where the direct route is already clear it is left exactly as it is. The links belong to the decision, not to the results panel: hiding the results leaves them on screen. They are removed only when something makes them wrong, that is when a chosen path belonging to a root that has a goal is changed or cleared, when a node on such a path is deleted, when a linked goal is deleted, or when a root is moved to a different goal. Changing the path of a root with no goal assigned leaves every other link alone. You are told when links are cleared, and pressing Complete links them again.
- Select a goal from the rail or from the diagram to rename or delete it. Deleting a goal releases every root that fed it; the roots themselves are untouched.
Move blocks
Blocks are rearranged with the mouse. Press on a block and drag it; once the pointer has travelled a few pixels the block turns translucent, a small label follows the cursor, and the drop target is highlighted as you pass over it. A short press with no movement still simply selects the block.
- Drop a block onto another block to make it the last child of that block.
- Drop it between two blocks, that is on the leading or trailing edge of a block, to insert it there as a sibling. A thin green line shows exactly where it will land, and the sibling order in the diagram changes accordingly.
- Drop it on empty canvas to turn it into a new root workstream, which then appears in the left rail.
- A move takes the whole subtree with it, and moves across different roots and between different levels are both allowed.
- A move that would put a block inside its own subtree, a move that would take the tree past the maximum depth, and a move that would change nothing at all are refused with a message, and nothing is changed.
- A block promoted to a new root starts with no chosen path and no goal. A chosen path that ran into the block you moved is cleared for the roots it affected, and you are told when goal links go with it.
- Final goals cannot be moved and cannot be made a child of anything. They are destinations, not steps.
- Press Escape while dragging to cancel the move with no change at all. Once a move has been made, the Undo control in the node toolbar, or Ctrl+Z, reverses it, but only until your next edit. For a way back after that, export the workbook first.
Undo
- Undo covers block moves and block deletions, and nothing else. It holds exactly one step: the most recent move or delete.
- Pressing it restores the tree as it was, and the control then reads Redo, so pressing it again puts the change back.
- Undo and Redo last only until your next change. Anything else that edits the tree, such as adding, renaming, deleting a goal, editing details, ticking a deliverable, changing a chosen path or collapsing a branch, clears the step. So do Import xlsx, a failed import, and Clear all. The control then greys out and says there is nothing to undo.
- So undo the move or delete before you do anything else. The one exception is selecting a different block, which is safe and leaves the step in place.
- The whole structure comes back together: parents and sibling order, chosen paths, goal assignments and goal links, collapsed branches, the selected block and the results panel with its coverage strip.
- Ctrl+Z is deliberately ignored while you are typing in any field, so the browser's own text undo keeps working while you rename a block or edit its details.
The results panel
- Complete builds the summary table underneath the tree and stamps it with the time it was generated. It also links every goal to the paths that feed it.
- The results open with a deliverable coverage strip: one rectangle per deliverable, labelled with its name. Green means the deliverable is delivered by at least one node on a chosen path; grey means no chosen path covers it. Coverage is aggregated across all chosen paths, because deliverables are common to every workstream, and it is aggregated from the nodes on those paths only, never from a goal. A headline states the count, for example "3 of 4 deliverables covered". The strip wraps onto as many lines as it needs.
- The summary table carries a Cost column and a Deliverables column for every step, and each workstream with costed steps gets a path total row. A workstream section has no goal row.
- The detail editor, the pan hint and the summary are pinned to the bottom of the window in that fixed order. The diagram scrolls inside its own region above them, so however large the tree grows the panels never move and never cover the + and - collapse controls.
- Hide results dismisses the panel so you can carry on working with the full height of the diagram. It dismisses the table only. The goal links stay on the diagram, so you can review the tree with its links and without the table.
- Pressing Complete again always rebuilds the table from the tree as it stands at that moment. Hidden results are thrown away rather than parked, so the panel can never show you an out of date summary and pass it off as current.
- Below every workstream result the report ends with a single dedicated Final goals table. Every goal is listed exactly once, whatever number of roots it serves, with the roots it serves, its aggregated pros and cons, its own outcome, its blocker state and its derived cost total. A goal used to be repeated as a row inside each workstream that fed it, which printed a shared goal several times over. A blocked goal is highlighted exactly like a blocked step. A goal that no chosen path feeds is still listed and says so on its row rather than being dropped.
- Whether you last left the panel hidden is remembered, but the results themselves are never remembered. After a page reload the panel is always empty until you press Complete.
Layout and orientation
The tree lays itself out automatically for the current content and window size. As the diagram gets busier the nodes shrink and their title text shrinks with them, on a steeper curve than the dots and badges, so that whole words still fit inside a small block instead of being clipped. The labels therefore stay proportionate at every size, and zooming in magnifies those compact labels so they read clearly without changing the layout. The layout recomputes on any structural change and on window resize. Edges are drawn as SVG orthogonal connectors routed through the gap between levels so that they do not cross node rectangles, and a goal link that would otherwise have to cross an occupied level is routed around it instead. Trees are supported up to 200 levels deep and to any width.
- The Layout button switches between top-down and left-right.
- Top-down runs the levels down the page and spreads sibling subtrees across it. It suits a deep, narrow tree.
- Left-right runs the levels across the page and stacks sibling subtrees down it. It suits a wide, shallow tree, because the many leaves simply scroll vertically while the few levels fit the available width.
- The auto-shrink follows the orientation. Top-down fits the leaf columns to the available width; left-right fits the depth to it instead. Either way the node and its title text shrink together, and the exported picture uses exactly the same proportions.
- Your choice is remembered in this browser and the diagram is laid out again immediately when you switch.
Collapsing branches
- Every node that has children carries a small round - control at the midpoint of the connector below it, or to its right in the left-right orientation.
- Clicking it collapses that one branch. The control becomes a +, the parent is outlined with a dashed border, and a blue badge on the parent states how many descendants are hidden.
- A collapsed subtree is removed from the layout entirely, so the remaining nodes get the space back and the diagram genuinely becomes simpler rather than merely emptier.
- Expand all in the toolbar restores every collapsed branch at once. It is disabled when nothing is collapsed.
- Collapse all next to it collapses every branch that has children, including branches nested inside a subtree that is already hidden, so a later Expand all reveals a forest in which every branch really was collapsed. It is disabled once every branch that has children is already collapsed. The status bar shows how many branches are currently collapsed.
- Collapsing is a view only. It never changes the tree data and never changes the chosen path. If a chosen path runs through a collapsed branch the Complete table still reports every step of it, including the hidden ones and any blockers on them.
- If the selected node is hidden by a collapse, the selection moves up to the collapsed parent so that the keyboard always has a visible node to work with.
- Which branches you left collapsed lasts for as long as the page is open.
Zoom and pan
- Zoom + and Zoom - magnify the diagram between 25 and 300 percent. + and - do the same from the keyboard.
- 100% resets the zoom and scrolls back to the origin, shortcut 0. Fit scales the whole tree to the visible area, shortcut f.
- Pan by dragging the empty canvas. The cursor shows an open hand, and a closed hand while you drag. To drag from anywhere, including from on top of a node, hold Space or use the middle mouse button.
- Ctrl or Cmd with the mouse wheel zooms around the pointer. A plain wheel scrolls, as it does everywhere else.
- Zoom is pure magnification. The layout is always calculated at 100 percent, so zooming never disturbs the auto-shrink, the connector routing or the collapse controls, and the exported picture is a clean render of the whole tree at a fixed size no matter what the zoom level or scroll position happens to be.
- The zoom level is remembered in this browser.
Keyboard
- Tab and Shift+Tab move between nodes and controls, with a visible focus ring.
- Enter or Space on a node selects it.
- Arrow keys move within the tree: Up to the parent, Down to the first child, Left and Right between siblings.
- Shift+Enter opens the detail editor for the selected node.
- Insert adds a child to the selected node. Delete removes it after confirmation.
- Ctrl+Z, or Cmd+Z, undoes the last block move or delete, and reverses again to redo it. It lasts only until your next change. It is ignored while you are typing, so text fields keep their own undo.
- These node commands act on the selected node rather than on whatever happens to hold the browser focus, so they keep working after the diagram redraws itself.
- + and - zoom, 0 resets the zoom, f fits the tree to the screen. Holding Space lets you pan by dragging from anywhere.
- Escape closes the help panel, the detail editor or an expanded attribute.
Theme
The tool opens in the light theme the first time you use it. Once you pick a theme the choice is remembered in this browser and is used on every later visit.
- d switches to the dark theme.
- l switches to the light theme.
- The Dark theme / Light theme button in the top bar does the same thing.
- These single-letter shortcuts are deliberately ignored while you are typing in the title, pros, cons, outcome or cost fields, and while any of Ctrl, Alt or Cmd is held, so they can never interfere with entering text.
Saving and resuming: export and import
Export xlsx writes a real workbook with three sheets, generated entirely in the browser with no libraries and with nothing uploaded.
- Summary has one block per root workstream with the pros, cons, outcomes, costs and deliverables of the chosen path, the path cost total, and blocked phases highlighted in red. Below all of them it carries the single Final goals table, each goal listed once, and it ends with the deliverable coverage strip and its headline count.
- Decision tree embeds a PNG picture of the whole diagram, goals included, with the same dots and the same +2 (3) badges the screen shows.
- Raw data for Import is the machine-readable save format. It carries every block with its identifier, parent, root, ordering, title, pros, cons, outcome, cost, deliverable ticks, blocker flag, collapsed state, chosen-path membership and goal assignment, plus a row per deliverable definition, plus a schema version so a change can be detected. It is a complete description of the tree, not a summary of it. Adding cost and deliverables took the schema to version 2; taking cost and deliverables away from goals took it to version 3; tightening what the importer will vouch for took it to version 4, which is what this page reads and writes.
Import xlsx reads a workbook you exported earlier and rebuilds the entire tree, with every attribute, every cost, every deliverable and its ticks, every chosen path, every goal and every assignment exactly as it was. It reads a file you have re-saved in Excel just as happily as the one this tool wrote.
- Every part of the file is first checked against the checksum the workbook itself records for it. A single altered byte anywhere in the file is detected and named, and the import stops there. Without that check a flipped byte simply decodes as different text and quietly corrupts the tree, which for a decision record is the worst possible outcome.
- The import is all or nothing, and that is enforced rather than merely intended. Almost everything that can be wrong is caught during validation, before a single field of the live tree has been touched. Should anything go wrong while the replacement is being drawn, the previous tree is put back exactly as it was and the message says so. The tool never tells you the tree is untouched unless it genuinely is.
- The sheet has to agree with itself. Identifiers must be well formed (node-, goal- or deliverable- followed by a positive whole number, matching the kind of the row); SiblingIndex must be a plain whole number; RootIdentifier must name the root that the parent links actually lead to; and OnChosenPath must match the chosen path rebuilt from the sheet. A sheet that contradicts itself is refused with a message naming the row and the contradiction, rather than being half-believed.
- An import is also refused if the raw data sheet is missing, if any row is malformed, if a block claims a deliverable the sheet does not define, if a goal row carries a cost or a deliverable it is not allowed to have, if a cost is outside the supported precision or range, or if the tree is deeper than the supported maximum of 200 levels.
- A workbook whose schema version this page cannot read is named as such: the message says whether the file is an older format, and which one, a newer format than this page understands, or not a version number at all.
- If you have done any real work, you are asked to confirm before it is replaced.
- The picture is rendered from its own layout pass at a fixed generous width, not captured from the screen, so it is always a clean render of the whole tree regardless of the current zoom level, scroll position or window size. It follows the current orientation and the current collapsed branches. The summary table itself always reports the full chosen path, including any part of it inside a collapsed branch.
Storage
The decision tree is never saved. Every time you open this page you get the same clean seeded state, so there is no hidden previous session waiting to reappear and no need to press Clear all and refresh to get a predictable starting point. Export xlsx and Import xlsx are the way to save and resume work, and they save it somewhere you can see, keep and share.
Only lightweight view preferences are kept in this browser's localStorage: the theme, the orientation, the zoom level and whether the results panel was hidden. None of them says anything about a particular tree. Collapsed branches are keyed to node identifiers and so last only for as long as the page is open. There is no server and no network traffic.