instar 1.3.258 → 1.3.260

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,59 @@
1
+ # Side-Effects Review — Notification UX Coherence (PR1: the calm Agent-Health lane)
2
+
3
+ ## What changed (mechanically)
4
+
5
+ A new opt-in routing lane in the messaging layer. An attention item may now carry
6
+ `lane:'agent-health'` (+ optional `healthKey`). When set, `createAttentionItem`
7
+ routes it into ONE persistently-named "🩺 Agent Health" forum topic BEFORE (and
8
+ bypassing) the topic-flood guard, suppression-dedups same-`healthKey` re-escalations
9
+ within a window, and never spawns a per-item topic. `StaleSessionBackstop` now emits
10
+ its "looks stuck" escalation into that lane at `NORMAL` (was `HIGH`), with a
11
+ topic-name-resolved, next-step-bearing, reply-able message. The `/attention` route
12
+ carries `lane`/`healthKey` through and lets lane items skip the per-topic outbound
13
+ tone-gate.
14
+
15
+ ## Blast radius / who is affected
16
+
17
+ - **Items WITHOUT `lane`**: byte-for-byte unchanged — same guard, same topics, same
18
+ tone-gate. The only caller that sets the lane today is `StaleSessionBackstop`.
19
+ - **The flood guard**: untouched logic; lane items simply never reach it.
20
+ - **The tone-gate**: still runs for every non-lane item; lane items bypass it because
21
+ they don't spawn a per-item topic and are named+CTA-bearing by construction.
22
+
23
+ ## Failure modes considered
24
+
25
+ - **Telegram unavailable**: `routeToAgentHealthLane` returns null on topic-create
26
+ failure; the item is still recorded in the attention store (never dropped). Best-
27
+ effort send is `@silent-fallback-ok` (a transient send failure must not crash the
28
+ attention path) — consistent with the existing flood-notice path.
29
+ - **Lane topic deleted out from under us**: the cached `agentHealthTopicId` is cleared
30
+ on send failure so it's recreated next time (same pattern as `floodNoticeByBucket`).
31
+ - **Concurrent first-escalations**: a single in-flight creation promise
32
+ (`agentHealthPending`) prevents a double-create race (covered by integration test).
33
+ - **Unbounded memory**: the dedup ring is hard-capped at `maxTrackedKeys` (default 256),
34
+ oldest-evicted.
35
+ - **A genuinely-stuck session now NORMAL not HIGH**: it still surfaces (in the calm lane
36
+ + the attention store + the dashboard); it is no longer a per-topic interrupt. The
37
+ global "tmux control plane unreachable" item stays HIGH. PR2 will reduce the
38
+ false-positive RATE; PR1 only changes delivery.
39
+
40
+ ## What this does NOT do (explicit non-goals)
41
+
42
+ - Does NOT gate, block, drop, delay, or rewrite any message — pure delivery-shaper.
43
+ - Does NOT change the StaleSessionBackstop's detection logic (PR2).
44
+ - Does NOT touch the "went quiet" / "can't reach…routing" SentinelNotifier paths
45
+ (tracked as fast-follow; they were the older floods).
46
+
47
+ ## Reversibility
48
+
49
+ `messaging[].config.agentHealthLane.enabled:false` restores the prior per-item-topic
50
+ behavior for self-health items. No schema migration, no data migration, no on-disk
51
+ format change. Additive type fields only.
52
+
53
+ ## Tests
54
+
55
+ Unit (StaleSessionBackstop: lane/healthKey/NORMAL/named-title/next-step + name
56
+ resolution), integration (real TelegramAdapter: N notices → 1 topic, HIGH→lane,
57
+ suppression-dedup + audit, non-lane unaffected), E2E (HTTP /attention: lane+healthKey
58
+ passthrough, tone-gate bypass for lane, no regression for non-lane). 95 related tests
59
+ green; tsc clean.