Skip to content

Dashboard: loads under a busy tmux; one-pass links; lesson buttons' loading state; hub badges match the Inbox - #107

Merged
hhff merged 3 commits into
mainfrom
dashboard-load
Nov 5, 2026
Merged

hhff merged 3 commits into
mainfrom
dashboard-load

Conversation

@hhff

@hhff hhff commented Nov 5, 2026

Copy link
Copy Markdown
Member

Five problems the owner hit in the hub tonight.

What

  • scripts/devteam.mjs resolvePane: reads one tmux list-panes -s table per session, kept for 5 s, instead of list-windows plus display-message for every pane.
  • scripts/devteam.mjs, the dashboard's /api/data:
    • one dashboard-data run at a time, shared by every page waiting on it;
    • killed after 2 minutes;
    • a failed or timed-out run serves the last good data with x-devteam-stale: true.
  • dashboard/index.html linkify: one pass over the escaped text, so a link's own href and text are never scanned again.
  • dashboard/index.html, lesson cards: Keep it / Retire it show the busy spinner and disable both buttons. The card goes once the answer is saved; on failure the buttons come back.
  • scripts/devteam.mjs hello, dashboard/hub.html: the hub's badge counts the Inbox exactly as the dashboard's nav does (open questions not let go, plus lessons waiting to be kept). It refreshes every 10 s and takes the nav count's style: 11 px, red, tabular figures, no pill.

Why

  • stacksbot's dashboard never loaded. dashboard-data took 143 s of wall time on 0.6 s of CPU, waiting on tmux. With six busy agent panes, each tmux call took 1.4 to 8 s, and a refresh made two calls per window. Every refresh then started another run on top, so they piled up, and one Stacks run had been going for an hour.
  • A lesson card's evidence rendered as plan-world-model">m-20261105-…: linkify had written a planner link inside the message link's href.
  • Keep it gave no sign it was working.
  • The tab badges disagreed with the dashboards' Inbox counts, because they counted questions only, every 30 s.

Checked

  • In stacksbot's checkout, an instrumented dashboard-data logged every tmux call over 1 s: list-windows calls of up to 8 s, capture-pane 5 s, display-message 3.5–4.3 s. Total 41 s on a quiet run, 143 s under load.
  • hello on stacksbot gives the dashboard's count.

Migration

None. Restart the dashboard after the sync.

🤖 Generated with Claude Code

hhff and others added 2 commits November 5, 2026 00:13
…ass links; lesson buttons show they're working; hub badges count the Inbox as the dashboard does

- A dashboard refresh asked tmux two calls per window (list-windows for every pane, then
  display-message); with a busy tmux server each took seconds, so stacksbot's dashboard-data took
  up to 143s and the page never loaded. resolvePane now reads one list-panes table per session,
  kept 5s.
- The dashboard runs one dashboard-data at a time, shared by every page waiting, killed after 2
  minutes; a failed or timed-out run serves the last good data, marked stale. Before, every
  refresh started another run, and they piled up (one ran for an hour).
- linkify made one replacement after another over the same HTML, so an id holding a planner's
  name (m-…-plan-x) had a link written inside its own href. It is one pass now.
- Keep it / Retire it show a spinner, disable both, and the card goes once saved.
- hello counts the Inbox as the dashboard does (open questions not let go, plus lessons waiting to
  be kept), every 10s; the hub's badge takes the nav count's look.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hhff

hhff commented Nov 5, 2026

Copy link
Copy Markdown
Member Author

Merging (upstream loop). Review: author's own PR; the authority reasoning is in the body. Tested in the combined branch (main + #100 + #103 + #104 + #107 + #113): local Node 24.14.1, 20.19.6 and 18.20.4 each 90/90. CI 18/20/22/24 green at this head, with main (#100) merged in.

@hhff
hhff merged commit 11c3fb8 into main Nov 5, 2026
4 checks passed
hhff added a commit that referenced this pull request Nov 6, 2026
Conflicts resolved keeping main's rules: ownerAnswer (matched, #113),
question_hash (#116), owner_rules (#115), per-entry link binding and
links in home only (#108), one-pass linkify (#107).

Review fixes:
- merge: each changed owner settings class needs its own settling; an
  owner_only class only by the owner's own answer in it (never chat) or
  their standing rule; --approved takes several answers. A ladder-class
  answer (monitor-change) never covers an owner_only key or a kit file.
- merge: a decision is carried out once; settings acts name what settled
  them (answer, rule, decision or rung), and an act a merge logged is
  never a pending landing for a later merge.
- monitors: name set last from the key, a name field refused; credentials
  in a monitor url refused (validate, check-pr/merge); userinfo and query
  never shown (status, alerts, observations, findings, dashboard,
  settings); 2xx only is up; state seeded from the log only when
  state.json is missing; a dead poll's lock is stale at once; no SNI for
  IP hosts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant