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/10guard (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.jsononly —mcp-stderr.logchurns 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).
Related
rubric-second-brain · kilroy · pipeline-shepherd · unlikely-systems custom URL
pattern (memory project_unlikely_systems_custom_urls, now 2 instances: sb, rubric)