Files

332 lines
24 KiB
Markdown

# Graph Report - sedona_editor (2026-09-20)
## Corpus Check
- 18 files · ~55,766 words
- Verdict: corpus is large enough that graph structure adds value.
- Unclassified: 3 file(s) not represented in the graph (top: (none) 1, .properties 1, .sax 1)
## Summary
- 1033 nodes · 2000 edges · 59 communities (52 shown, 7 thin omitted)
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 50 edges (avg confidence: 0.87)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
- SOX Client Protocol
- Link View Rendering
- Kit Palette & Manifests
- App State & File IO
- SAX File Kit Management
- Live Device Hooks
- Property Value Logic
- DOM & Undo Core
- Kit Manager Panel
- Connection Dialogs
- Module Imports & Config
- README Documentation
- Main UI & Zoom
- Properties Panel State
- SOX Message Codec
- DASP Send Window
- Main Panel Management
- DASP & SOX Imports
- Wiresheet Layout Engine
- Schema Kit Resolution
- Wire Route Pathfinding
- DASP Session Transport
- Device Session Manager
- Link Dialog & Slots
- Context Menu & Navigation
- DASP Socket Layer
- View History Navigation
- Schema Registry & Facets
- Properties Header & Filter
- Link Context Menu
- Properties Row Building
- Tree Selection Restore
- Wiresheet Box Drawing
- Preferences Dialog
- Wiresheet Box Sizing
- Schema Slot Inheritance
- Device Connect & Load
- Tree Scrollbar & Palette
- Device DOM Builder
- Canvas Click & Link Select
- Canvas Drag & Redraw
- Meta Property Editor
- Wire Knob & Anchor
- DASP Receive Window
- Component Deletion
- File Save Pipeline
- Zoom Fit & Bounds
- Slot Value Undo
- Bool & Null Display
- Sheet Zoom & Grid
- Tooltip Widget
- SOX Connection & Receiver
- Add Component Undo
- Add Link Undo
- Delete Component Undo
- Delete Link Undo
- Schema Compilation
- Property Label Humanise
- Run Entry Point
## God Nodes (most connected - your core abstractions)
1. `SoxClient` - 51 edges
2. `PropertiesPanel` - 37 edges
3. `LinkViewPanel` - 32 edges
4. `set_status()` - 30 edges
5. `SoxMsg` - 27 edges
6. `DeviceSession` - 25 edges
7. `add_component()` - 22 edges
8. `DaspSocket` - 20 edges
9. `KitsPanel` - 20 edges
10. `_prepare_request()` - 19 edges
## Surprising Connections (you probably didn't know these)
- `DiscoverDialog` --uses--> `DaspSocket` [INFERRED]
connect_dialog.py → dasp.py
- `_SoxReceiver` --uses--> `DaspException` [INFERRED]
sox.py → dasp.py
- `SoxClient` --uses--> `DaspSocket` [INFERRED]
sox.py → dasp.py
- `DeviceSession` --uses--> `SoxClient` [INFERRED]
device_session.py → sox.py
- `verify_startup_configurations()` --calls--> `save_preferences()` [EXTRACTED]
main.py → app_state.py
## Import Cycles
- None detected.
## Communities (59 total, 7 thin omitted)
### Community 0 - "SOX Client Protocol"
Cohesion: 0.07
Nodes (14): decode_value(), encode_value(), KitPart, Link, _make_subscribe_req(), _make_unsubscribe_req(), _make_update_req(), _prepare_request() (+6 more)
### Community 1 - "Link View Rendering"
Cohesion: 0.06
Nodes (26): build_link_view_panel(), column_gap(), group_by_peer(), LinkViewPanel, Collapses the entries of one side onto one box per peer. A component wired…, Where a peer belongs in its column: the first focus slot its links land on. A…, One component's links, drawn around it on a canvas of this view's own. Built…, Moves a scrollbar's thumb, and hides the bar when it spans the whole. (+18 more)
### Community 2 - "Kit Palette & Manifests"
Cohesion: 0.07
Nodes (44): action_options(), collect_rows(), column_label(), Every kit worth listing, as row dicts in the order they should appear. A row…, How a build is named in the Installed and Latest columns, which are narrow., The Action dropdown for one kit: (label, checksum to apply) pairs, no-op first.…, _find_type(), invalidate() (+36 more)
### Community 3 - "App State & File IO"
Cohesion: 0.09
Nodes (40): base_window_title(), clear_status(), mark_clean(), The window title with no file context, which handlers extend with their own…, Posts a one-line note to the status bar. A no-op before the UI exists., Empties the status bar, for when the note no longer describes anything on…, Clears the unsaved-state marker after a successful save or a fresh load., set_status() (+32 more)
### Community 4 - "SAX File Kit Management"
Cohesion: 0.08
Nodes (37): _coerce_value(), The value a slot holds when neither the file nor the manifest names one., type_zero(), Copies an element's children and leading text, so it can be put back wholesale.…, snapshot_children(), add_component(), allocate_component_id(), _build_config_values() (+29 more)
### Community 5 - "Live Device Hooks"
Cohesion: 0.10
Nodes (34): mark_dirty(), Nudges whatever shows 'there is something unwritten'. A no-op before the UI…, Single funnel for 'the document changed', including the unsaved-state tint., refresh_dirty_display(), _comp_id(), _find_slot(), is_live(), _kit_id() (+26 more)
### Community 6 - "Property Value Logic"
Cohesion: 0.09
Nodes (30): allows_null(), bool_texts(), build_properties_panel(), display_text(), effective_value(), enum_range(), is_editable(), null_text() (+22 more)
### Community 7 - "DOM & Undo Core"
Cohesion: 0.10
Nodes (21): copy, on_canvas_release(), find_parent_element(), Document-level helpers for a Sedona app: the packed 'meta' property and…, Rewrites only meta's four user-group bits, leaving the packed position alone.…, Traverses the XML DOM tree recursively to find the parent element of a given…, Drops a component's <prop>, for undoing a value that the file never carried., Parses 32-bit meta property integer fields via structured byte extraction rules. (+13 more)
### Community 8 - "Kit Manager Panel"
Cohesion: 0.13
Nodes (11): build_kits_panel(), build_label(), describe_changes(), KitsPanel, commit(), make_checkbox_image(), The applied-changes report, one kit per line, old build to new., The kit table, built as an embedded panel in the editor pane. (+3 more)
### Community 9 - "Connection Dialogs"
Cohesion: 0.11
Nodes (11): ConnectDialog, _cleanup(), _CredentialsDialog, DiscoverDialog, _load_last_connection(), Modal dialog that broadcasts DASP DISCOVER, lists responding devices, and lets…, Modal dialog for entering device connection parameters., Small modal that asks for username and password, then connects. (+3 more)
### Community 10 - "Module Imports & Config"
Cohesion: 0.10
Nodes (22): base_window_title_live(), load_preferences(), Shared configuration, runtime state and widget handles. Every other module…, Loads application configurations from editor.properties or initializes defaults., Writes the current preference values back to editor.properties., Window title for live mode., save_preferences(), configparser (+14 more)
### Community 11 - "README Documentation"
Cohesion: 0.10
Nodes (26): app_state.py Module, Back/Forward Navigation History, Dirty State Display Logic, Editor Pane Three-View Architecture, Link Routing and Wire Layout, link_view.py Module, Link View Design, main.py Module (+18 more)
### Community 12 - "Main UI & Zoom"
Cohesion: 0.11
Nodes (22): clamp_left_pane_split(), _destroy_drag_ghost(), do_tidy_layout(), do_zoom_in(), do_zoom_out(), do_zoom_reset(), on_canvas_wheel_zoom(), on_palette_press() (+14 more)
### Community 13 - "Properties Panel State"
Cohesion: 0.12
Nodes (12): PropertiesPanel, Writes the edited rows back, as one undoable step. Nothing is written until…, An undo can take the component out of the document while this is on screen., Asks before pending edits are thrown away. True means it is safe to leave.…, Hands back to whoever put this on screen, once pending edits are settled.…, Tears the panel's widgets down, for a caller that is done with it., One component's slots, in a scrolling list of rows, with Save, Refresh and…, Whether any row has moved away from what was last loaded or saved. Read from… (+4 more)
### Community 14 - "SOX Message Codec"
Cohesion: 0.11
Nodes (3): setter, Big-endian binary buffer with cursor, mirroring sedona.Buf., SoxMsg
### Community 15 - "DASP Send Window"
Cohesion: 0.14
Nodes (5): _Packet, Monotonic time in seconds (float)., Manages the outgoing datagram queue with reliable delivery., SendWindow, _ticks()
### Community 16 - "Main Panel Management"
Cohesion: 0.12
Nodes (22): anything_unwritten(), close_editor_panel(), dismiss_kits(), dismiss_properties(), _give_editor_pane_back(), on_tree_filled(), Whether there is a change no one has written yet, in the document or in a…, Puts the file name on the tree's root row in red, or back to its usual colour.… (+14 more)
### Community 17 - "DASP & SOX Imports"
Cohesion: 0.14
Nodes (14): DaspMsg, _put_bytes(), _put_str(), _put_u2(), DASP (Datagram Authenticated Session Protocol) transport layer. Ported from…, Binary encoder/decoder for DASP messages., hashlib, random (+6 more)
### Community 18 - "Wiresheet Layout Engine"
Cohesion: 0.13
Nodes (20): Rebuilds tree and canvas from the DOM. Registered as undo/redo's view refresh., refresh_all_views(), build_layout_items(), build_linked_slot_index(), plan_columns(), print_sheet(), Repaints whichever sheet is open, re-reading children from the DOM. Undo of a…, Walks the columns at `scale` px per meta step, without touching the DOM.… (+12 more)
### Community 19 - "Schema Kit Resolution"
Cohesion: 0.13
Nodes (17): Puts back what snapshot_children captured, whitespace and all., restore_children(), apply_kit_selections(), abandon(), Takes a <kit> entry out of the block, leaving its line breaks tidy. Whitespace…, Types placed in the app that the current registry cannot describe, sorted.…, Repins, adds and drops <kit> entries in one go. ``selections`` is an iterable…, remove_kit_element() (+9 more)
### Community 20 - "Wire Route Pathfinding"
Cohesion: 0.13
Nodes (20): channel_candidates(), free_lane(), free_rows(), hug_lane(), path_is_clear(), True if an axis-aligned segment overlaps any box rectangle., Smallest horizontal distance from the vertical run at cx to any box it passes.…, Vertical channel positions to try, best first. A run hugs the box it leaves or… (+12 more)
### Community 21 - "DASP Session Transport"
Cohesion: 0.22
Nodes (4): DaspException, DaspSession, Exception, Client endpoint of a DASP session. Handles the handshake, keepalive, reliable…
### Community 22 - "Device Session Manager"
Cohesion: 0.12
Nodes (7): DeviceSession, Unsubscribe from previously subscribed components., Subscribes a newly added component and reads its initial values., Removes a deleted component (and its descendants) from the subscription set., Adds <link> elements under a <links> container, matching .sax structure., High-level session manager for a live Sedona device connection., Drains the event queue. Returns list of (comp_id, what_char) tuples.
### Community 23 - "Link Dialog & Slots"
Cohesion: 0.17
Nodes (18): collect_links(), Every link with an end on `comp`, in the order the file lists them. Each entry…, open_link_dialog(), on_ok(), _on_src_change(), on_swap(), _on_tgt_change(), populate_panel() (+10 more)
### Community 24 - "Context Menu & Navigation"
Cohesion: 0.13
Nodes (18): dismiss_link_view(), fill_component_popup(), on_tree_right_click(), open_link_from_link_view(), Fills a popup with the actions that apply to one component. Shared by the…, Adds a freshly opened view to the history, dropping anything ahead of it. Every…, Hides the sheet so a panel can have the pane. The canvas is only unpacked,…, Puts one component's slots in the editor pane, in place of the wiresheet. (+10 more)
### Community 25 - "DASP Socket Layer"
Cohesion: 0.14
Nodes (4): DaspSocket, Manages a UDP socket shared by DASP sessions. Provides receiver and…, Send DASP DISCOVER broadcast and collect responding devices. Returns a list of…, _trace()
### Community 26 - "View History Navigation"
Cohesion: 0.15
Nodes (17): _component_in_document(), _entry_is_reachable(), go_back(), go_forward(), _prune_view_history(), The tree item whose sheet is this element's children, or None if it is gone. A…, Whether a history entry still names something that could be shown. A sheet…, Drops entries that can no longer be shown, keeping the position on screen. (+9 more)
### Community 27 - "Schema Registry & Facets"
Cohesion: 0.15
Nodes (14): DeviceSession — bridges SoxClient to the editor's ET.Element-based UI. Handles…, queue, find_manifest(), find_manifest_path(), get_all_slots_for_type(), get_full_slots_for_type(), Kit manifest loading, slot inheritance, and which slots are worth showing., The manifest file describing a kit, or None when Sedona home holds none. A… (+6 more)
### Community 28 - "Properties Header & Filter"
Cohesion: 0.15
Nodes (7): is_hidden(), Re-reads every value from the DOM, discarding edits that were not saved. In…, Reads fresh config+runtime values from the device into the DOM element., The '@hidden' facet: a slot a kit keeps for itself. niagara.html puts it…, Takes hidden rows out of the grid, or puts them back. grid_remove keeps each…, The checkbox: remember the answer for the session, then re-filter the rows., The component's absolute path, as <link> references write it.
### Community 29 - "Link Context Menu"
Cohesion: 0.16
Nodes (14): What to call the wiresheet an element sits on. A folder is named by itself; the…, sheet_display_name(), go_to_link_sheet(), go_to_sheet_with_link(), link_endpoint_components(), link_target_sheet(), Rebuilds the link popup, naming the sheet the far end of the link is on. A link…, The two components a link joins, resolved from its from/to references. (+6 more)
### Community 30 - "Properties Row Building"
Cohesion: 0.18
Nodes (8): qualified_type(), Moves a scrollbar's thumb, and hides the bar entirely when it spans the whole., int' -> 'sys::int', the way a slot sheet names it. A manifest writes the…, Registers a widget to follow the tint, and hands it straight back., A canvas-scrolled frame; ttk has no scrollable container of its own. The rows…, Names the columns. Deliberately quiet -- the same size as the rows, in grey,…, The small ring each row is tagged with, drawn rather than set in a glyph font., meta is one integer holding a position and four group bits, so it gets its own…
### Community 31 - "Tree Selection Restore"
Cohesion: 0.17
Nodes (13): _clear_restoring_flag(), _bg(), _ui(), on_tree_select(), Puts the tree back on the sheet that is actually showing, after a refused…, Triggered when a branch node is clicked in the Navigation view., Scrolls the sheet so the tagged items sit in the middle of the view., Selects whichever wire or knob now stands for this link, and scrolls it into… (+5 more)
### Community 32 - "Wiresheet Box Drawing"
Cohesion: 0.18
Nodes (12): math, sys, tkinter_font, column_gap_for(), create_round_rectangle(), draw_component_box(), fit_text(), Canvas painting: the grid, component boxes, and the routed link wires. (+4 more)
### Community 33 - "Preferences Dialog"
Cohesion: 0.17
Nodes (11): apply_left_column_visibility(), apply_left_pane_width(), open_preferences_dialog(), apply_preferences(), Pins the tree/palette column to the configured width. Setting the sash before…, Shows or hides the tree/palette column to match the View menu's checkbutton.…, Keyboard route to the same toggle. The menu flips the variable for itself., Update the toggle button icon to reflect the pane state. (+3 more)
### Community 34 - "Wiresheet Box Sizing"
Cohesion: 0.17
Nodes (12): Checks for configuration gaps, triggers an alert, and opens setup if empty., verify_startup_configurations(), get_slots_for_type(), Returns the slots worth painting for a given type, prefixed with double-digit…, measure_box(), ontrolControl::HvacControl' -> 'HvacControl'. The kit prefix alone cost ~40px., Works out a component's box without drawing it. Returns (width, height,…, Smallest multiple of grid_size that is >= value; grid lines sit on multiples.… (+4 more)
### Community 35 - "Schema Slot Inheritance"
Cohesion: 0.17
Nodes (11): get_slots_with_inheritance(), MissingManifestError, Exception, A kit the file needs has no manifest under the Sedona home folder. Raised…, Reads a slot's '@readonly' facet. Absent means writable., Recursively resolves the slots for a given type by traversing its base chain., Reads a slot's '@summary' facet. Absent means summary, matching manifest…, Every facet on a slot, as {name: value} with each one typed by its own tag. The… (+3 more)
### Community 36 - "Device Connect & Load"
Cohesion: 0.18
Nodes (5): Extracts base slots from sys::Component that all types inherit., Loads direct children of a component (cache-aware). Returns list of…, Full wiresheet load: children, links, remote comps, config+runtime, subscribe.…, DASP connect → read schema → load root. Called from background thread., Builds slot_registry from kit manifests for the device's schema.
### Community 37 - "Tree Scrollbar & Palette"
Cohesion: 0.20
Nodes (10): attach_tree_scrollbars(), _on_tree_open(), fit_tree_column(), measure(), _live_tree_expand(), populate_palette_types(), Sizes a Treeview's tree column to its widest visible row. ttk derives the…, Puts a Treeview in its container with scrollbars that show only when they help.… (+2 more)
### Community 38 - "Device DOM Builder"
Cohesion: 0.22
Nodes (6): _fmt_float(), Format a float for display with *precision* decimal places (default 2)., Looks up the precision facet for a slot, returning 2 as the default., Builds an ET.Element tree from cached SoxComponents, for the editor UI. Only…, Updates a single comp element in the DOM from cached SoxComponent values., _slot_precision()
### Community 39 - "Canvas Click & Link Select"
Cohesion: 0.28
Nodes (9): on_canvas_click(), on_canvas_right_click(), Detects right-clicks on nodes to instantly show context-sensitive action…, deselect_link(), Pulls both ends of a knob-to-knob line back to the knob rims. Drawn centre to…, Highlights a link in red, remembering what each of its items looked like. The…, Puts the selected link back exactly as it was drawn., select_link() (+1 more)
### Community 40 - "Canvas Drag & Redraw"
Cohesion: 0.22
Nodes (9): on_canvas_drag(), get_box_origin(), layout_margin(), Brings the cached knob-to-knob ends onto the painted scale. They are recorded…, Re-routes the wires of a sheet that is already painted, at whatever zoom it is…, The top/left edge offset a box may not encroach on, snapped onto the grid., Exact (left, top) of a component's box, or None if it is not on the canvas., redraw_links() (+1 more)
### Community 41 - "Meta Property Editor"
Cohesion: 0.25
Nodes (7): group_label(), meta_summary(), apply_meta(), read_coordinate(), The 'Group [1,3]' text, from the four user-group bits in order., meta unpacked into what its row and its editor need: (label, groups, (x, y))., The two things meta actually holds, side by side: the groups and the position.…
### Community 42 - "Wire Knob & Anchor"
Cohesion: 0.25
Nodes (8): draw_knob(), draw_links(), get_box_bounds(), The rectangle a component's box was actually drawn at, valid after drags.…, Returns (box_bounds, y) for a slot row, centring on the box when the row is…, Marks a slot whose links cannot be shown as a visible wire. Painted in the wire…, Paints wires between slots on this sheet and knobs for links leaving it., resolve_slot_anchor()
### Community 43 - "DASP Receive Window"
Cohesion: 0.25
Nodes (3): Manages incoming message sequence numbers and acknowledgements., ReceiveWindow, _to_ack_more()
### Community 44 - "Component Deletion"
Cohesion: 0.25
Nodes (8): delete_component(), delete_selected_component(), delete_selected_link(), editor_panel_showing(), Deletes a component, taking a view of it down with it if one is showing. Every…, Whether something other than the wiresheet has the editor pane., Removes the currently selected link from the DOM and repaints., Deletes the highlighted canvas component (or selected link) and all its…
### Community 45 - "File Save Pipeline"
Cohesion: 0.25
Nodes (8): do_download_to_sax(), do_save(), In live mode, saves the current device DOM snapshot as a .sax file., Internal helper to clean up deleted elements and sync coordinates into the root…, Writes the current DOM to a .sax file at the given path., sync_live_metadata_to_dom(), sync_and_prune_tree(), write_sax_to_path()
### Community 46 - "Zoom Fit & Bounds"
Cohesion: 0.29
Nodes (8): do_zoom_fit(), Puts the painted scale on the toolbar as a percentage., Zoom so the whole sheet is visible, and scroll it into view. The fitted scale…, update_zoom_label(), fit_zoom_level(), The 1:1 rectangle the painted sheet occupies, or None if nothing is painted.…, The scale at which the whole painted sheet fits the visible canvas, or None.…, sheet_content_bounds()
### Community 47 - "Slot Value Undo"
Cohesion: 0.32
Nodes (4): Writes a component's <prop>, creating it in the block the other props sit in. A…, set_prop_value(), One Save from the Properties dialog: every slot it changed, as one undoable…, SlotValueCommand
### Community 48 - "Bool & Null Display"
Cohesion: 0.33
Nodes (5): bool_state(), is_null(), Which of the three a value is in: 'true', 'false' or 'null'., Whether a value is Sedona's null, as an absent prop or as the literal it writes., The fill a row's field takes: a bool's state, or its editability.
### Community 49 - "Sheet Zoom & Grid"
Cohesion: 0.33
Nodes (6): apply_sheet_zoom(), draw_grid(), Repaints the open sheet at this scale. Returns the level actually applied., Draws a grid onto the Canvas based on the scrollable region. Drawn at the…, Scales the finished sheet to app_state.zoom and sizes the canvas to match.…, set_zoom()
### Community 56 - "Schema Compilation"
Cohesion: 0.50
Nodes (4): _load_live_schema(), Loads schema kits from the device's schema parts into the editor registry., compile_schema_registry(), Loads and maps types across multiple kit files, ensuring all dependencies exist.
### Community 57 - "Property Label Humanise"
Cohesion: 0.50
Nodes (3): humanise(), controlSignalForMin_1' -> 'Control Signal For Min _1', the label style the rows…, 14. Proportional Band' — the manifest slot id, so rows match the box's…
## Knowledge Gaps
- **3 isolated node(s):** `run.py Entry Point`, `SAX File Format`, `Tkinter GUI Framework`
These have ≤1 connection - possible missing edges or undocumented components. (Counts symbols only; 441 node(s) total have ≤1 connection when file, concept and rationale nodes are included.)
- **7 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `LinkViewPanel` connect `Link View Rendering` to `Module Imports & Config`?**
_High betweenness centrality (0.109) - this node is a cross-community bridge._
- **Why does `PropertiesPanel` connect `Properties Panel State` to `Property Value Logic`, `Meta Property Editor`, `Bool & Null Display`, `Property Label Humanise`, `Properties Header & Filter`, `Properties Row Building`?**
_High betweenness centrality (0.085) - this node is a cross-community bridge._
- **Why does `SoxClient` connect `SOX Client Protocol` to `Device Connect & Load`, `DASP & SOX Imports`, `SOX Connection & Receiver`, `Device Session Manager`, `DASP Socket Layer`, `Schema Registry & Facets`?**
_High betweenness centrality (0.078) - this node is a cross-community bridge._
- **Are the 2 inferred relationships involving `SoxClient` (e.g. with `DeviceSession` and `DaspSocket`) actually correct?**
_`SoxClient` has 2 INFERRED edges - model-reasoned connections that need verification._
- **What connects `run.py Entry Point`, `SAX File Format`, `Tkinter GUI Framework` to the rest of the system?**
_3 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `SOX Client Protocol` be split into smaller, more focused modules?**
_Cohesion score 0.07067307692307692 - nodes in this community are weakly interconnected._
- **Should `Link View Rendering` be split into smaller, more focused modules?**
_Cohesion score 0.05519480519480519 - nodes in this community are weakly interconnected._