Skip to content

Commit 08b66bf

Browse files
montfortclaude
andauthored
fix(loom): loom-0.4.1 — stop no-op rebuild storm that swallowed panel clicks (#247)
Re-saving a watched .md without changing its content (editor save, formatter, touch, cloud-sync) made the parse cache re-parse, rebuild an identical graph, and still broadcast a delta. Each delta re-rendered the side panels (innerHTML rewrite), destroying their per-button click handlers — so dangling-reference links, community buttons and stats sections felt dead under filesystem churn, persisting across reload with no console errors. - Server: the watcher diffs the rebuilt graph and only broadcasts on a real change. Added GraphDelta::is_noop + to_event; derived PartialEq on core::graph::Edge and the Loom ApiEdge to compare edge sets. - Client: the stats and legend panels use event delegation on their stable containers instead of per-button listeners, so clicks survive the innerHTML rewrites under any update frequency. Verified: rewriting identical content 5× → 10 no-op deltas before, 0 after; a real change still broadcasts. core 42/42, loom 9/9. See AILOG-2026-06-13-003. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 6a8bcce commit 08b66bf

18 files changed

Lines changed: 205 additions & 55 deletions

CHANGELOG.md

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

88
---
99

10+
## Loom 0.4.1 — fix: panel click responsiveness under filesystem churn
11+
12+
### Fixed (Loom)
13+
14+
- The watcher no longer broadcasts a WebSocket update when a rebuild yields an identical graph
15+
(a file's mtime moved but its content did not — an editor save, formatter, `touch`, or
16+
cloud-sync rewrite). These no-op broadcasts re-rendered open clients' side panels
17+
continuously and swallowed clicks on dangling-reference links, community buttons and stats
18+
sections.
19+
- The stats and legend panels use event delegation on their stable containers instead of
20+
per-button listeners, so clicks survive the panels' innerHTML rewrites under frequent updates.
21+
22+
---
23+
1024
## Loom 0.4.0 — connectivity: reference normalization + entity nodes
1125

1226
Closes the Loom connectivity follow-ups (R1 + R2). On the Sentinel corpus, 330 of 395

Cargo.lock

Lines changed: 2 additions & 2 deletions
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.0` | The `straymark-loom` visualization server, downloaded on demand by `straymark loom serve` |
282+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | The `straymark-loom` visualization server, downloaded on demand by `straymark loom serve` |
283283

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

cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ name = "straymark"
1717
path = "src/main.rs"
1818

1919
[dependencies]
20-
straymark-core = { version = "0.4.0", path = "../core" }
20+
straymark-core = { version = "0.4.1", path = "../core" }
2121
clap = { version = "4", features = ["derive"] }
2222
reqwest = { version = "0.12", features = ["blocking", "rustls-tls", "json"] }
2323
serde = { version = "1", features = ["derive"] }

core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "straymark-core"
3-
version = "0.4.0"
3+
version = "0.4.1"
44
edition = "2021"
55
description = "Shared document model and knowledge graph for StrayMark — parses governance documents and builds their typed traceability graph"
66
license = "MIT"

core/src/graph.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl Node {
7979
/// A directed, typed edge. `source`/`target` are node ids; an edge whose
8080
/// target id is not present in the corpus is kept with `resolved: false`
8181
/// (a dangling reference — a first-class signal, never silently dropped).
82-
#[derive(Debug, Clone, Serialize)]
82+
#[derive(Debug, Clone, PartialEq, Serialize)]
8383
pub struct Edge {
8484
pub source: String,
8585
pub target: String,

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.0` | The `straymark-loom` visualization server, downloaded on demand by `straymark loom serve` |
52+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | 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.0 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1412-
✔ Loom 0.4.0 cached at ~/.straymark/bin/straymark-loom
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
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.0` | El servidor de visualización `straymark-loom`, descargado bajo demanda por `straymark loom serve` |
245+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | 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.0` | El servidor de visualización `straymark-loom`, descargado bajo demanda por `straymark loom serve` |
52+
| Loom (EXPERIMENTAL) | `loom-` | `loom-0.4.1` | 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.0 (x86_64-unknown-linux-gnu) — first use is opt-in by download
1102-
✔ Loom 0.4.0 cached at ~/.straymark/bin/straymark-loom
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
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.0` | `straymark-loom` 可视化服务器,由 `straymark loom serve` 按需下载 |
263+
| Loom(实验性) | `loom-` | `loom-0.4.1` | `straymark-loom` 可视化服务器,由 `straymark loom serve` 按需下载 |
264264

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

0 commit comments

Comments
 (0)