From citadel
Displays real-time observability dashboard for harness state from campaigns, fleet sessions, telemetry, costs, and queues. Use /dashboard or phrases like 'what's happening'.
npx claudepluginhub sethgammon/citadel --plugin citadelThis skill uses the workspace's default tool permissions.
- "What's happening?" / "Status?" / "What's going on?"
Displays Citadel telemetry hub with session costs, daily/all-time spend, hook activity, trust level, command directory. Toggles telemetry on/off and tunes thresholds via /telemetry.
Renders AgentOps workflow dashboard showing ratchet/task status, epics/beads, knowledge flywheel, git state, recent activity, inbox, and session signals. Use /status for quick overview.
Session state: !`source "${CLAUDE_PLUGIN_ROOT}/scripts/state.sh" && get_current_session 2>/dev/null || echo "No active session"`
Share bugs, ideas, or general feedback.
/dashboardNone required. Works with whatever state exists on disk.
Read the following sources. Each is optional — if a file or directory doesn't exist, treat it as empty. Never crash on missing state.
Campaigns:
.planning/campaigns/*.mdStatus: fieldDirection: field (truncate to 60 chars)Phase N of M or ## Phase headings)- [ from the Decision LogCost Data (two sources, prefer real):
node scripts/session-tokens.js --today and --all — reads Claude Code's native session JSONL for exact token counts.planning/telemetry/session-costs.jsonl; cost priority real_cost > override_cost > estimated_cost; group by campaign_slug, sum cost/agents/minutes, compute grand total.planning/telemetry/cost-tracker-state.json for burn rateFleet Sessions:
.planning/fleet/session-*.mdstatus: fieldwave: or wave numberagents: or agent countRecent Telemetry:
.planning/telemetry/hook-timing.jsonl (if it exists).planning/telemetry/audit.jsonl (if it exists)ts (or timestamp), hook (or event), and a
short description field. Format as relative time.Recent Hook Activity (separate from general telemetry):
.planning/telemetry/hook-timing.jsonlevent: "timing" entries: extract hook, duration_ms, timestamp (relative), and outcome (pass if no matching error in hook-errors.jsonl within 1s; block if a block entry exists)event: "counter" entries: extract metric name as the "event" column with count contextPending Queues:
.planning/telemetry/doc-sync-queue.jsonl (or 0 if missing).planning/telemetry/merge-check-queue.jsonl (or 0 if missing).planning/intake/ (or 0 if missing)Hook Value Data (for HOOKS VALUE section):
.planning/telemetry/hook-errors.jsonl (if it exists, last 200 lines)
hook = "protect-files" (blocked file access)hook = "external-action-gate" (gated external actions)hook = "quality-gate" (quality violations).planning/telemetry/hook-timing.jsonl (if it exists, last 200 lines)
hook = "circuit-breaker" and metric = "trips".planning/telemetry/audit.jsonl (if it exists, last 200 lines)
Health:
.planning/telemetry/audit.jsonl written todayhooks array of .claude/hooks-template.json (or
.claude/hooks.json if template not present); use 0 if neither exists.claude/harness.json → trust object:
sessions_completed, campaigns_completed counterstrust.override is set, use that and note "(override)"Convert ISO timestamps: <60s → "just now" | <60min → "{N} min ago" | <24h → "{N} hr ago" | else → "{N} days ago". Display unparseable timestamps as-is.
Output verbatim, substituting real values. Always show section headers even when content is "(none active)".
=== Citadel Dashboard ===
As of: {relative timestamp of most recent event, or "now"}
CAMPAIGNS
{slug}: Phase {N}/{total} — {direction, max 60 chars, ellipsis if truncated}
Last event: {most recent telemetry entry for this campaign, or "no telemetry"}
(none active)
COSTS
This session: ${cost} | {duration} min | ${rate}/min | {messages} msgs | {agents} agents
Today: ${today_total} across {today_sessions} sessions
All time: ${all_time_total} across {all_time_sessions} sessions ({data_source})
By campaign:
{slug}: ${total_cost} across {sessions} sessions ({agents} agents, {minutes} min)
_unattached: ${total_cost} across {sessions} sessions
(no cost data recorded yet)
HOOKS VALUE
Circuit breaker: {N} trips (prevented token spirals)
Quality gate: {N} violations caught pre-commit
Protect-files: {N} blocks (path traversal, secrets)
External gate: {N} actions gated
Total hook fires today: {N}
(raw facts only -- no inflated savings claims)
FLEET SESSIONS
{slug}: Wave {N} — {agent count} agents — {status}
(none active)
RECENT ACTIVITY (last 10 events)
{relative time} | {hook/event name} | {description}
(no telemetry recorded yet)
HOOK ACTIVITY (last 10 hook fires)
{relative time} | {hook name} | {duration_ms}ms | {outcome: pass/block/warn}
(no hook timing recorded yet — set CITADEL_DEBUG=true in settings.json for verbose output)
PENDING
Doc sync: {N} items queued
Merge reviews: {N} items queued
Intake items: {N} in .planning/intake/
HEALTH
Circuit breaker trips this session: {N}
Audit entries today: {N}
Hooks installed: {N}
Trust level: {novice | familiar | trusted} ({N} sessions, {N} campaigns)
QUICK COMMANDS
/do continue — resume active campaign
/do rollback — restore last checkpoint
/telemetry — cost breakdown, hook activity, telemetry settings
/triage prs — review open PRs
/pr-watch — watch PR CI
/learn — extract patterns from last completed campaign
.planning/ missing: All zeros, "(none active)"; add "Run /do setup to initialize."
harness.json missing or malformed: Show "not configured" for hooks count; do not crash.
Malformed campaign file: Skip it; note (N campaign file(s) skipped — malformed).
Large telemetry files: Read last 50 lines only.
Missing timestamps: Fall back to file modification time; display entry without timestamp if unavailable.
All campaigns completed: Note "No active campaigns" at top of CAMPAIGNS section.
All fleet sessions idle: Note "No active fleet sessions" under FLEET SESSIONS.
Mixed state: Proceed with whatever state exists; note each missing directory inline.
Disclosure: "Displaying harness dashboard. No files modified." Reversibility: green — read-only; no files modified Trust gates:
/dashboard does not produce a HANDOFF block. It is a read-only observability tool. After displaying the dashboard, wait for the next user command.