instar 1.3.488 → 1.3.489

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.
@@ -4493,7 +4493,13 @@
4493
4493
  if (!r.ok) return;
4494
4494
  const j = await r.json();
4495
4495
  selfMachineNickname = (j.pool && j.pool.selfMachineNickname) || null;
4496
- remoteSessions = (j.sessions || []).filter(s => s.remote === true);
4496
+ // LIVE remote sessions only: a peer's plain /sessions returns its FULL
4497
+ // registry (completed/killed records included), while the local sidebar
4498
+ // is built from listRunningSessions(). Without this status filter,
4499
+ // long-dead peer sessions render as live "click to stream" tiles
4500
+ // (2026-06-11: five closed Mac Mini sessions reappeared on the laptop
4501
+ // dashboard hours after they were closed).
4502
+ remoteSessions = (j.sessions || []).filter(s => s.remote === true && (s.status === 'running' || s.status === 'starting'));
4497
4503
  renderSessionList();
4498
4504
  } catch { /* best-effort — peers may be offline; next tick retries */ }
4499
4505
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.488",
3
+ "version": "1.3.489",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-06-12T04:35:58.435Z",
5
- "instarVersion": "1.3.488",
4
+ "generatedAt": "2026-06-12T05:13:07.681Z",
5
+ "instarVersion": "1.3.489",
6
6
  "entryCount": 201,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -0,0 +1,23 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ The dashboard's pool poll rendered EVERY record a peer's `GET /sessions` returned — including completed/killed registry records — as live "click to stream" tiles, while local tiles come from `listRunningSessions()` (2026-06-11: five closed Mac Mini sessions reappeared on the laptop dashboard hours after closure). The remote merge in `dashboard/index.html` now filters to `running`/`starting`, matching the local sidebar's definition of live. API unchanged (the pool response remains a faithful full-registry view). Complements the registry-side ghost-record supersession fix — together: records stop claiming to be running, and the dashboard only draws records that claim to be running.
9
+
10
+ ## What to Tell Your User
11
+
12
+ - "The dashboard now only shows sessions that are actually running on each machine — closed sessions on another machine no longer reappear as clickable tiles."
13
+
14
+ ## Summary of New Capabilities
15
+
16
+ | Capability | How to Use |
17
+ |-----------|-----------|
18
+ | Truthful remote session tiles | Automatic |
19
+
20
+ ## Evidence
21
+
22
+ - New source-assert test `tests/unit/dashboard-poolTileStatusFilter.test.ts` (established at-rest inspection pattern), proven failing on the unfixed HTML first (2/2 fail → 2/2 pass).
23
+ - Side-effects artifact: `upgrades/side-effects/pool-tile-status-filter.md`.
@@ -0,0 +1,46 @@
1
+ # Side-Effects Review — Pool dashboard tiles: filter remote sessions to live statuses
2
+
3
+ **Version / slug:** `pool-tile-status-filter`
4
+ **Date:** `2026-06-11`
5
+ **Author:** `echo (instar-dev agent)`
6
+ **Second-pass reviewer:** `not required` (one-line client-side display filter; no lifecycle, no gates, no messaging surface)
7
+
8
+ ## Summary of the change
9
+
10
+ The dashboard's pool poll fed `renderSessionList` every record a peer's plain `GET /sessions` returned — and that endpoint returns the peer's FULL registry, completed/killed records included — while local tiles are built from `listRunningSessions()` (running only). Result, observed live 2026-06-11 (topic 13481): five Mac Mini sessions closed hours earlier reappeared on the laptop dashboard as live "click to stream" tiles. One-line fix in `dashboard/index.html`: the remote merge now filters to `status === 'running' || status === 'starting'`, matching the local sidebar's definition of "live". New source-assert test (`tests/unit/dashboard-poolTileStatusFilter.test.ts`, following the established `dashboard-sessionMachineBadge.test.ts` at-rest inspection pattern) proven failing on the unfixed HTML first.
11
+
12
+ ## Decision-point inventory
13
+
14
+ No decision points. A client-side display filter; the API response is unchanged and remains faithful (full registry, accurate statuses).
15
+
16
+ ---
17
+
18
+ ## 1. Over-block
19
+ A peer session in a transient status other than running/starting would be hidden — the only other statuses are terminal (`completed`/`failed`/`killed`), which is exactly what should be hidden. No issue identified.
20
+
21
+ ## 2. Under-block
22
+ A peer whose registry wrongly marks a dead session `running` still renders a tile — that is the upstream ghost-record problem, fixed separately at the registry funnel (PR #1067); the two fixes are complementary layers, not overlap.
23
+
24
+ ## 3. Level-of-abstraction fit
25
+ Correct layer: the SERVER's pool response stays a faithful full-registry view (other consumers may legitimately want terminal records, e.g. forensics); "which records are live tiles" is a display decision, made where display happens, identically to how local tiles already decide it.
26
+
27
+ ## 4. Signal vs authority compliance
28
+ - [x] No — this change has no block/allow surface. (Display filtering only.)
29
+
30
+ ## 5. Interactions
31
+ The remote-tile click path, machine badges, row namespacing, and stream subscriptions all operate on the filtered set — strictly fewer dead tiles to mis-click. The 15s pool poll cadence is unchanged. No shadowing/double-fire/races (pure pure-function filter on a fetch result).
32
+
33
+ ## 6. External surfaces
34
+ `dashboard/index.html` ships in the npm package and replaces wholesale on update; no API change, no config, no migration. Mixed-version: an updated dashboard against any peer version works (the filter only reads fields every version already returns).
35
+
36
+ ## 7. Rollback cost
37
+ Revert the one line, ship a patch. No state, no migration. Symptom during rollback window: dead peer tiles reappear (cosmetic).
38
+
39
+ ---
40
+
41
+ ## Conclusion
42
+
43
+ Minimal display-truthfulness fix; the registry-side ghost cleanup (PR #1067) and this filter together close both layers of the "dead sessions on the dashboard" symptom: records that should not say running, and tiles that should not render non-running records. Clear to ship.
44
+
45
+ **Phase 1 principle check (recorded):** no decision point — display filter.
46
+ **Phase 2 plan (recorded):** fresh worktree `.worktrees/fix-pool-tile-status-filter` off `JKHeadley/main` @ `e6c21fa8e` (v1.3.487), agent identity set, canonical remote verified. Rollback: revert (above).