You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(gpu): apply identical Z-axis disc projection in bad-frame fallback
The bad-frame fallback re-projected last-good positions with a divergent
Y-axis separation, so a rejected frame would briefly re-orient or collapse
the two discs. Route the fallback through project_node_xy with the same
per-population centroids and fixed DISC_RIM_RADIUS rim-clamp as the healthy
path and ForceFullBroadcast, keeping all three projection call sites in sync.
Reconcile the architecture diagrams with the landed code: decoupled rim
radius (DISC_RIM_RADIUS=2600, not sep*0.85), single PUT/broadcast write
path, population SSOT via metadata["type"], and reader-vs-writer ownership
in the analytics wire.
Co-Authored-By: jjohare <github@thedreamlab.uk>
Copy file name to clipboardExpand all lines: docs/architecture/diagrams/01-settings-flow.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,7 +52,7 @@ sequenceDiagram
52
52
Note over SQLite: settings_routes.rs:405 — persisted after<br/>in-memory update succeeds
53
53
REST_PUT-->>SApi: 200 OK {new PhysicsSettings}
54
54
55
-
Note over ZS,SApi: PARALLEL PATH (also triggered by updatePhysics):<br/>physicsSlice.ts:130 — notifyPhysicsUpdate fires<br/>settingsApi.updatePhysics()DIRECTLY,<br/>bypassing autoSaveManager entirely
55
+
Note over ZS,SApi: SINGLE PUT PATH (T2 resolved 2026-06-03):<br/>physicsSlice.ts:129-139 — notifyPhysicsUpdate is now a NO-OP<br/>for persistence. It used to fire settingsApi.updatePhysics()<br/>DIRECTLY (a 2nd PUT per commit / double warmup reset).<br/>Persistence is owned solely by the debounced autoSaveManager<br/>path, so each change reaches the backend exactly once.
Note over Handlers: Single send per throttle tick (T2 resolved 2026-06-03):<br/>JSON "nodeDragUpdate" only. The legacy binary frame<br/>(sendNodePositionUpdates) was removed —<br/>useGraphEventHandlers.ts:60-68 — it sent a redundant<br/>SECOND frame per drag move.
ASM->>API: updateSettingsByPaths([{path, value}])<br/>→ routes to updatePhysics if path contains .physics.
214
+
API->>Server: PUT /api/settings/physics
215
215
216
-
Note over API,Server: Both paths call PUT /api/settings/physics<br/>physicsSlice.notifyPhysicsUpdate fires immediately (no debounce)<br/>autoSaveManager fires after debounce (~500ms)<br/>→ DOUBLE PUT for every slider move
216
+
Note over API,Server: SINGLE PUT per slider move (T2 resolved 2026-06-03):<br/>notifyPhysicsUpdate no longer fires an immediate PUT.<br/>Only the debounced autoSaveManager path (~500ms) persists,<br/>so the change reaches the backend exactly once.
AD ->> MAP: write entry.anomaly (LOF/z-score, 0.0–1.0)
105
+
Note over PR,AD: GPU kernel results read back to CPU.<br/>WRITE OWNERSHIP: each analytics actor is the sole writer of its OWN<br/>field(s) into node_analytics. ClusteringActor owns cluster_id +<br/>community_id (ADR-031 D3 single writer, write_cluster_id_from_assignments);<br/>PageRankActor owns centrality; AnomalyDetectionActor owns anomaly.<br/>ClientCoordinatorActor does NOT write — it only reads at broadcast time.
106
+
PR ->> MAP: write entry.centrality = normalised_pagerank<br/>(sole writer of centrality, resets stale nodes to 0.0)
0 commit comments