87 lines
4.4 KiB
Markdown
87 lines
4.4 KiB
Markdown
# Phase 0.2 Existing Graph Baseline
|
|
|
|
Date: 2026-06-18
|
|
Branch: `codex/large-graph-performance-experience`
|
|
Task: `0.2`
|
|
|
|
## Scope
|
|
|
|
This report captures the current graph behavior and performance baseline before changing graph behavior for the large-graph performance plan.
|
|
|
|
## Verification
|
|
|
|
| Check | Result | Evidence |
|
|
|---|---:|---|
|
|
| Graph engine test | Pass | `npm run test --workspace=@llm-wiki/graph-engine`: 274 tests, 58 suites, 0 failures |
|
|
| Graph engine typecheck | Pass | `npm run typecheck --workspace=@llm-wiki/graph-engine` |
|
|
| Graph engine build | Pass | `npm run build --workspace=@llm-wiki/graph-engine` |
|
|
| Workbench web test | Pass | `npm run test --workspace=@llm-wiki-agent/web`: 29 tests, 12 suites, 0 failures |
|
|
| Workbench web typecheck | Pass | `npm run typecheck --workspace=@llm-wiki-agent/web` |
|
|
| Stage 4.5 offline browser regression | Pass | `GRAPH_STAGE_4_5_CHROME_EXECUTABLE=<Playwright Chromium> bash tests/graph-browser-stage-4-5.regression-1.sh --target offline` |
|
|
|
|
## Browser Artifact
|
|
|
|
Dense wheel artifact:
|
|
|
|
- JSON: `docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json`
|
|
- Screenshot: `docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png`
|
|
- Navigation screenshot: `docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png`
|
|
|
|
Recorded sample:
|
|
|
|
| Viewport | Duration | Frames | Idle FPS | Wheel FPS | Minimum FPS | Transform changed |
|
|
|---|---:|---:|---:|---:|---:|---|
|
|
| 1440x960 | 3004 ms | 157 | 13.6 | 52.3 | 12.0 | true |
|
|
|
|
Important limitation: the current dense fixture has 200 nodes and 231 edges. This is useful as a regression baseline, but it does not prove 1000, 5000, or 10000 node smoothness.
|
|
|
|
## Current Rendering Behavior
|
|
|
|
- The current graph renderer is DOM/SVG.
|
|
- Nodes are DOM `button` elements in a node layer.
|
|
- Edges are SVG `path` elements in an edge layer.
|
|
- Community washes are SVG ellipses.
|
|
- Pan and zoom are applied through one content-layer transform.
|
|
- Motion frames update node positions, edge paths, community wash geometry, and minimap points.
|
|
- Search, type filters, community hover, node selection, reader state, and selection panels are all currently coupled to the same DOM/SVG renderer path.
|
|
|
|
## Current Interaction Semantics
|
|
|
|
The current behavior remains the pre-new-design behavior:
|
|
|
|
- Plain node click opens the reader-style node detail state.
|
|
- Shift-click builds a multi-node selection.
|
|
- Community legend click selects/focuses community nodes.
|
|
- Blank double-click fits the graph.
|
|
- Escape closes reader/selection state and clears graph highlights.
|
|
- Offline graph uses an in-graph reader panel; workbench graph opens the right drawer.
|
|
|
|
This is intentionally recorded as baseline behavior, not as the desired final interaction model.
|
|
|
|
## Baseline Bottleneck Class
|
|
|
|
The obvious large-graph risk is DOM/SVG update volume.
|
|
|
|
Reasons:
|
|
|
|
- Every visible node is a live DOM element.
|
|
- Every visible edge is a live SVG path.
|
|
- Rebuild/paint replaces the graph root and remounts controls.
|
|
- Motion frames recompute renderable graph state and update many DOM/SVG attributes.
|
|
- Hover, search, filter, community emphasis, and selection use DOM state/class updates across visible graph elements.
|
|
|
|
For small and medium scoped views, this is still appropriate. For 5000+ or 10000+ global views, the likely bottleneck is not one single function; it is the total cost of DOM node count, SVG path count, repeated attribute/class writes, and full repaint/remount paths.
|
|
|
|
## Test Harness Note
|
|
|
|
The first run of `tests/graph-browser-stage-4-5.regression-1.sh --target offline` exposed two harness issues:
|
|
|
|
- Playwright's normal click waited indefinitely for the offline theme button to become stable even though the button was visible, stationary, and not covered.
|
|
- The script's default system Chrome path failed in this environment during launch/cleanup. Installing Playwright Chromium and setting `GRAPH_STAGE_4_5_CHROME_EXECUTABLE` to the Playwright browser path produced a passing run.
|
|
|
|
The theme-button step was adjusted in the test harness to use forced click for this specific control. Product behavior was not changed.
|
|
|
|
## Next Baseline Gap
|
|
|
|
Phase 1 must add deterministic 1000, 5000, 10000, oversized-community, many-small-communities, many-search-hits, and many-Pin fixtures. Until those measurements exist, this report should be treated as the current small/dense-fixture baseline only.
|