Skip to content

Commit b860fc7

Browse files
montfortclaude
andauthored
feat(loom): loom-0.4.2 — R3: legibility at 100+ nodes (label density + hide isolated) (#248)
* feat(loom): loom-0.4.2 — R3: legibility at 100+ nodes (label density + hide isolated) After R2 the Sentinel graph reached ~195 nodes and got noisy. Addresses the two operator-chosen pains, frontend-only: - Label density cap: Sigma labelDensity/labelGridCellSize + a higher size threshold, so only the most prominent node per screen region is labeled (centrality sizing keeps these meaningful); zoom reveals more, and the hovered/selected node always shows its full label (forceLabel). - "Labels" header toggle (default on) for a pure-structure view. - "Hide isolated" header toggle (default off): a precomputed isolated set (degree 0) drives a nodeReducer branch returning {hidden:true}, removing singletons/orphans from the canvas and from label consideration; shows the hidden count. - i18n (view.labels, view.hideIsolated) en/es/zh-CN; listeners wired once. No backend/core change (straymark-core stays 0.4.1). See AILOG-2026-06-14-001. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(loom): add on-screen zoom/fit controls + gentler trackpad pinch (R3, loom-0.4.2) Operator feedback (Magic Trackpad on Fedora/GNOME): pinch zoom felt over-accelerated, and on-screen controls would help. - Bottom-right zoom controls: zoom in / zoom out (camera.animatedZoom / animatedUnzoom with an explicit step) and fit-to-view (animatedReset), styled to the dark scheme; z-index above the selection panel so they stay clickable. SVG icons, i18n tooltips (zoom.in/out/reset, en/es/zh-CN). - Lower Sigma zoomingRatio 1.7 → 1.4 so wheel/trackpad-pinch zoom is gentler; buttons use their own explicit step so they stay snappy. Folded into the R3 PR (#248) as part of loom-0.4.2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 08b66bf commit b860fc7

15 files changed

Lines changed: 232 additions & 19 deletions

File tree

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,24 @@ and this project uses [independent versioning](README.md#versioning) for Framewo
77

88
---
99

10+
## Loom 0.4.2 — R3: legibility at 100+ nodes
11+
12+
### Added (Loom)
13+
14+
- "Hide isolated" header toggle: hides nodes with no resolved edges (singletons, orphans) so
15+
the connected graph stands out; shows the hidden count.
16+
- "Labels" header toggle: turn node labels off for a pure-structure view.
17+
- On-screen zoom / fit-to-view controls (bottom-right) for precise navigation; trackpad/wheel
18+
pinch zoom is also gentler (lower `zoomingRatio`).
19+
20+
### Changed (Loom)
21+
22+
- Node-label density is capped so 100+ node graphs stay legible — only the most prominent node
23+
per screen region is labeled (centrality sizing keeps these meaningful), zooming reveals
24+
more, and the hovered/selected node always shows its full label.
25+
26+
---
27+
1028
## Loom 0.4.1 — fix: panel click responsiveness under filesystem churn
1129

1230
### Fixed (Loom)

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ StrayMark uses independent version tags for each component:
279279
| --- | --- | --- | --- |
280280
| Framework | `fw-` | `fw-4.26.0` | Templates (12 types), governance, directives, Charter template + schema |
281281
| CLI | `cli-` | `cli-3.24.0` | The `straymark` binary |
282-
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | The `straymark-loom` visualization server, downloaded on demand by `straymark loom serve` |
282+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.2` | The `straymark-loom` visualization server, downloaded on demand by `straymark loom serve` |
283283

284284
Check installed versions with `straymark status` or `straymark about`.
285285

docs/adopters/CLI-REFERENCE.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ StrayMark uses **independent version tags** for each component:
4949
|-----------|-----------|---------|------------------|
5050
| Framework | `fw-` | `fw-4.26.0` | Templates (12 types), governance docs, directives, Charter template + schema |
5151
| CLI | `cli-` | `cli-3.24.0` | The `straymark` binary |
52-
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | The `straymark-loom` visualization server, downloaded on demand by `straymark loom serve` |
52+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.2` | The `straymark-loom` visualization server, downloaded on demand by `straymark loom serve` |
5353

5454
Framework and CLI are released independently. A framework update does not require a CLI update, and vice versa.
5555

@@ -1408,8 +1408,8 @@ $ straymark loom serve
14081408
Unstable: API, CLI surface, and on-disk layout may change or be
14091409
removed without a deprecation cycle. Loopback-only. Read-only.
14101410

1411-
ℹ Downloading Loom 0.4.1 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1412-
✔ Loom 0.4.1 cached at ~/.straymark/bin/straymark-loom
1411+
ℹ Downloading Loom 0.4.2 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1412+
✔ Loom 0.4.2 cached at ~/.straymark/bin/straymark-loom
14131413
loom: watching /project/.straymark (142 docs, 318 links)
14141414
loom: serving http://127.0.0.1:7700
14151415
```

docs/i18n/es/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ StrayMark usa tags de versión independientes para cada componente:
242242
|------------|---------------|---------|---------|
243243
| Framework | `fw-` | `fw-4.26.0` | Plantillas (12 tipos), gobernanza, directivas, plantilla + schema de Charter |
244244
| CLI | `cli-` | `cli-3.24.0` | El binario `straymark` |
245-
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | El servidor de visualización `straymark-loom`, descargado bajo demanda por `straymark loom serve` |
245+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.2` | El servidor de visualización `straymark-loom`, descargado bajo demanda por `straymark loom serve` |
246246

247247
Verifica las versiones instaladas con `straymark status` o `straymark about`.
248248

docs/i18n/es/adopters/CLI-REFERENCE.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ StrayMark usa **tags de versión independientes** para cada componente:
4949
|------------|---------------|---------|-------------|
5050
| Framework | `fw-` | `fw-4.26.0` | Plantillas (12 tipos), docs de gobernanza, directivas |
5151
| CLI | `cli-` | `cli-3.24.0` | El binario `straymark` |
52-
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | El servidor de visualización `straymark-loom`, descargado bajo demanda por `straymark loom serve` |
52+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.2` | El servidor de visualización `straymark-loom`, descargado bajo demanda por `straymark loom serve` |
5353

5454
Framework y CLI se publican de forma independiente. Una actualización del framework no requiere actualización del CLI, y viceversa.
5555

@@ -1098,8 +1098,8 @@ $ straymark loom serve
10981098
Unstable: API, CLI surface, and on-disk layout may change or be
10991099
removed without a deprecation cycle. Loopback-only. Read-only.
11001100

1101-
ℹ Downloading Loom 0.4.1 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1102-
✔ Loom 0.4.1 cached at ~/.straymark/bin/straymark-loom
1101+
ℹ Downloading Loom 0.4.2 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1102+
✔ Loom 0.4.2 cached at ~/.straymark/bin/straymark-loom
11031103
loom: watching /project/.straymark (142 docs, 318 links)
11041104
loom: serving http://127.0.0.1:7700
11051105
```

docs/i18n/zh-CN/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ StrayMark 为每个组件使用独立的版本标签:
260260
|------|----------|------|----------|
261261
| Framework | `fw-` | `fw-4.26.0` | 模板(12 种类型)、治理文档、指令、Charter 模板 + schema |
262262
| CLI | `cli-` | `cli-3.24.0` | `straymark` 二进制文件 |
263-
| Loom(实验性) | `loom-` | `loom-0.4.1` | `straymark-loom` 可视化服务器,由 `straymark loom serve` 按需下载 |
263+
| Loom(实验性) | `loom-` | `loom-0.4.2` | `straymark-loom` 可视化服务器,由 `straymark loom serve` 按需下载 |
264264

265265
使用 `straymark status` 或 `straymark about` 查看已安装的版本。
266266

docs/i18n/zh-CN/adopters/CLI-REFERENCE.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ StrayMark 为每个组件使用**独立的版本标签**:
4949
|------|----------|------|----------|
5050
| Framework | `fw-` | `fw-4.26.0` | 模板(12 种类型)、治理文档、指令 |
5151
| CLI | `cli-` | `cli-3.24.0` | `straymark` 二进制文件 |
52-
| Loom(实验性) | `loom-` | `loom-0.4.1` | `straymark-loom` 可视化服务器,由 `straymark loom serve` 按需下载 |
52+
| Loom(实验性) | `loom-` | `loom-0.4.2` | `straymark-loom` 可视化服务器,由 `straymark loom serve` 按需下载 |
5353

5454
Framework 和 CLI 独立发布。Framework 更新不需要 CLI 更新,反之亦然。
5555

@@ -1231,8 +1231,8 @@ $ straymark loom serve
12311231
Unstable: API, CLI surface, and on-disk layout may change or be
12321232
removed without a deprecation cycle. Loopback-only. Read-only.
12331233
1234-
ℹ Downloading Loom 0.4.1 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1235-
✔ Loom 0.4.1 cached at ~/.straymark/bin/straymark-loom
1234+
ℹ Downloading Loom 0.4.2 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1235+
✔ Loom 0.4.2 cached at ~/.straymark/bin/straymark-loom
12361236
loom: watching /project/.straymark (142 docs, 318 links)
12371237
loom: serving http://127.0.0.1:7700
12381238
```
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
---
2+
id: AILOG-2026-06-14-001
3+
title: Loom R3 — legibility at 100+ nodes (label density + hide isolated)
4+
status: accepted
5+
created: 2026-06-14
6+
agent: claude-fable-5
7+
confidence: high
8+
review_required: true
9+
risk_level: low
10+
eu_ai_act_risk: not_applicable
11+
nist_genai_risks: []
12+
iso_42001_clause: []
13+
lines_changed: 140
14+
files_modified: [CHANGELOG.md, Cargo.lock, README.md, docs/adopters/CLI-REFERENCE.md, docs/i18n/es/README.md, docs/i18n/es/adopters/CLI-REFERENCE.md, docs/i18n/zh-CN/README.md, docs/i18n/zh-CN/adopters/CLI-REFERENCE.md, experimento/CHANGELOG.md, experimento/Cargo.toml, experimento/web/index.html, experimento/web/package.json, experimento/web/src/i18n.ts, experimento/web/src/main.ts]
15+
observability_scope: none
16+
tags: [loom, ui, density, labels, knowledge-graph]
17+
related: [AILOG-2026-06-13-002, AILOG-2026-06-12-002]
18+
---
19+
20+
# AILOG: Loom R3 — legibility at 100+ nodes
21+
22+
## Summary
23+
24+
Closes the last Loom UX follow-up (R3). After R2 the Sentinel graph reached ~195 nodes and the
25+
visualization got noisy. The operator picked the two pain points to address: **noisy labels**
26+
and **isolated nodes cluttering the canvas**. Frontend-only; ships as `loom-0.4.2`.
27+
28+
## Actions Performed
29+
30+
1. **Label density cap.** Added Sigma `labelDensity: 0.6` / `labelGridCellSize: 180` and raised
31+
`labelRenderedSizeThreshold` to 10. Sigma labels the highest-`size` node per screen-grid
32+
cell; since nodes are sized by centrality (`applySizing`, default betweenness), the surviving
33+
labels are the important ones. Zooming in reveals more. The hovered/selected node gets
34+
`forceLabel: true` so its full label always shows.
35+
2. **"Labels" toggle** (header checkbox, default on): `renderer.setSetting('renderLabels', …)`
36+
for a pure-structure view.
37+
3. **"Hide isolated" toggle** (header checkbox, default off): a precomputed `isolated` set
38+
(`graph.degree(id) === 0`, recomputed per rebuild) drives an early `nodeReducer` branch that
39+
returns `{ hidden: true }`, removing singleton/orphan nodes from the canvas and from label
40+
consideration. The toggle shows the hidden count.
41+
4. **i18n** for the two controls (`view.labels`, `view.hideIsolated`) in en/es/zh-CN; listeners
42+
wired once (consistent with the 0.4.1 delegation fix).
43+
5. **On-screen zoom / fit controls** (bottom-right): zoom-in / zoom-out (`camera.animatedZoom`
44+
/`animatedUnzoom` with an explicit step) and fit-to-view (`animatedReset`). Also lowered the
45+
wheel/pinch `zoomingRatio` (1.7 → 1.4) — operator feedback that trackpad pinch zoom felt
46+
over-accelerated on a multitouch (Magic Trackpad) device. i18n tooltips `zoom.in/out/reset`.
47+
48+
## Decisions Made
49+
50+
- **Tuned defaults over a manual density slider.** Centrality sizing already ranks nodes, so
51+
Sigma's per-cell label heuristic needed only coarser grid settings — no new ranking code.
52+
- **Hide isolated via the reducer, not by dropping nodes.** Keeps the data/graph intact (stats
53+
and the legend's isolated count stay accurate); only the render hides them.
54+
- **Did not touch the force layout or edges.** The operator did not flag a hairball; R3 stays
55+
scoped to labels + isolated nodes.
56+
57+
## Impact
58+
59+
- **Functionality:** additive view controls; default render is less cluttered at scale. No API,
60+
backend or core change (`straymark-core` stays 0.4.1).
61+
- **Security/perf:** unchanged; the isolated set is precomputed per rebuild, not per frame.
62+
63+
## Verification
64+
65+
- [x] `npm run build` — tsc + vite pass (Sigma settings, `forceLabel`/`hidden`/`setSetting`
66+
types valid).
67+
- [x] Served HTML exposes both toggles; `/api/stats` healthy (197 nodes on Sentinel); forged
68+
`Host` → 403.
69+
- [ ] Visual acceptance (operator): fewer/important labels by default, zoom reveals more,
70+
Labels-off hides them, Hide-isolated removes the loose nodes.
71+
72+
## Follow-ups
73+
74+
- Loom's Knowledge-Graph track (M0–M3) and all connectivity/UX follow-ups (R1–R3) are now done.
75+
The next frontier is the Architecture track (A1/A2, Spec 002) and graduation (N=2).
76+
77+
---
78+
79+
<!-- Template: StrayMark | https://strangedays.tech -->

experimento/CHANGELOG.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,24 @@ project adheres to [Semantic Versioning](https://semver.org/).
2020
overlay, layer toggle, component panel, and cross-linking with the Knowledge Graph.
2121
- A3 (north star): axonometric/BIM exploded-layers view.
2222

23+
## [0.4.2] — 2026-06-14 (R3: legibility at 100+ nodes)
24+
25+
### Added
26+
27+
- **"Hide isolated" toggle** (header): hides nodes with no resolved edges (singletons,
28+
orphans) so the connected graph stands out; shows the hidden count.
29+
- **"Labels" toggle** (header): turn node labels off for a pure-structure view, on to restore.
30+
- **On-screen zoom / fit controls** (bottom-right): zoom in, zoom out, and fit-to-view buttons
31+
for precise navigation. Trackpad/wheel pinch zoom is also gentler (lower `zoomingRatio`),
32+
which felt over-accelerated on multitouch trackpads.
33+
34+
### Changed
35+
36+
- **Label density is capped** so 100+ node graphs stay legible: only the most prominent node
37+
per screen region is labeled (nodes are sized by centrality, so the surviving labels are the
38+
important ones); zooming in reveals more, and the hovered/selected node always shows its full
39+
label (`labelDensity` / `labelGridCellSize` / `labelRenderedSizeThreshold` + `forceLabel`).
40+
2341
## [0.4.1] — 2026-06-13 (fix: panel click responsiveness under filesystem churn)
2442

2543
### Fixed
@@ -148,7 +166,8 @@ corpus, where 330 of 395 references were dangling. All changes are in the shared
148166
(PR #239) together with the component's intention docs (README, SpecKit sets 001/002,
149167
`CHARTER-01-loom-server`, ADR-2026-06-02-001/-002).
150168

151-
[Unreleased]: https://github.com/StrangeDaysTech/straymark/compare/loom-0.4.1...HEAD
169+
[Unreleased]: https://github.com/StrangeDaysTech/straymark/compare/loom-0.4.2...HEAD
170+
[0.4.2]: https://github.com/StrangeDaysTech/straymark/releases/tag/loom-0.4.2
152171
[0.4.1]: https://github.com/StrangeDaysTech/straymark/releases/tag/loom-0.4.1
153172
[0.4.0]: https://github.com/StrangeDaysTech/straymark/releases/tag/loom-0.4.0
154173
[0.3.0]: https://github.com/StrangeDaysTech/straymark/releases/tag/loom-0.3.0

0 commit comments

Comments
 (0)