RUBRIC Dashboard (agent ops console)

Installed: 2026-08-05 (session, from RoboNuggets zip robonuggets-rubric.zip) URL: https://rubric.unlikely.systems (tailnet-only) · localhost:5050 Service: rubric-dashboard.service (systemd, User=claude, Node 22) Repo/location: /opt/rubric-dashboard (unzipped release, CC BY 4.0, v2.0.0 — no git remote; update = drop new zip + re-apply configs)

One-page ops cockpit from Jay E / RoboNuggets — the operations counterpart to the rubric-second-brain (knowledge map, port 5210 / sb.unlikely.systems). Do not merge them.

Architecture

  • Scaffold server (templates/scaffold/server.js, port 5050, binds 127.0.0.1) auto-detects sibling template folders as tabs: Agents, Flows, Skill Trees, Crons, Team (+ Welcome, Icons).
  • Caddy vhost mirrors the sb pattern: public DNS A record → tailnet IP 100.97.131.0, real LE cert via lego DNS-01 manual (expires ~2026-11-03, same renewal dance as sb), MANDATORY remote_ip 100.64.0.0/10 guard (verified: tailnet 200, public 403).
  • No external network calls in server code; no exec; 1MB body cap (audited at install).

Fleet roster (scaffold/config.json)

claude-code (Crown), kilroy (Phantom), friday (Spark), shepherd (Sentinel), auto-validation (Fortress), recon-scanner (Orb), doc-extraction (Drift).

Status feeds

  • claude-code: UserPromptSubmit (active) / Stop (idle) hooks in ~/.claude/settings.json POST to /api/agent-status. Sessions opened before the hook install don’t report.
  • Everything else: /opt/scripts/rubric-status-bridge.py, claude crontab */5. Detects activity from docker logs (scheduler/worker/api, 6-min window) and hermes file mtimes (agent.log/gateway.log/sessions.json only — mcp-stderr.log churns when idle and must stay excluded). Transition-only POSTs (repeated idle POSTs would pin agents in the amber “recent” state). Also clears claude-code ‘active’ stale >4h (dead session).

Crons tab feed

/opt/scripts/rubric-crons-export.py (claude crontab, daily 5:10 ET) runs gen-routines.py then converts rubric-brain’s routines.json → /opt/rubric-dashboard/data/crons.json. Handles three schedule dialects: raw cron+TZ, arq strings (“every 1h ET”, “6:30 wd ET”), bare Kilroy cron. Forces ET for crontab entries (gen-routines mislabels them UTC — bug flagged for fix at source).

Skill Trees / Team quirks

  • Skill scanner skips dot-directories and only decorates auto-detected workspaces, so the scan root is a symlink shim: SKILL_TREE_ROOT=/opt/rubric-dashboard/workspace with agents/claude-code/.claude/skills → ~/.claude/skills and agents/KILROY/skills → ~/.hermes/skills.
  • Team tab scans agents/{ID_UPPERCASE}/.claude/skills (hence the uppercase KILROY dir) from its own root /opt/rubric-dashboard/team-root (separate so skill-tree attribution stays clean; team’s “shared” skills = ~/.claude/skills shown on every member by template design).

rubric-second-brain · kilroy · pipeline-shepherd · unlikely-systems custom URL pattern (memory project_unlikely_systems_custom_urls, now 2 instances: sb, rubric)