plugins/legacy/skills/god/SKILL.md
Cross-project omniscient status view — like `top` for Catalyst work streams. **ALWAYS use when** the user says '/god', 'what's happening across projects', 'what's running', 'show me all active work', 'what orchestrators are active', 'what sessions are running', or asks a free-form question about cross-project Catalyst state (e.g. 'what PRs are open?', 'which workers are stuck?', 'what happened in the last hour?'). Shows orchestrators with wave/worker progress, active PM and oneshot sessions with recency, and recent event activity (last 30 min) from the event log. Encodes all data-source locations and naming conventions as skill knowledge.
npx skillsauth add coalesce-labs/catalyst godInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Combines static state (where things are) with the live event log (how they got there and what's happening right now). Default invocation produces a full dashboard; args narrow the scope or switch interaction mode.
/god — full multi-project status dashboard
/god <project> — filter to one project (e.g., adva, catalyst)
/god <orch-name> — deep-dive into one orchestrator
/god restart — list crashed/interrupted sessions with restart commands
free-form question — "what PRs are open?", "which workers are stuck?",
"what happened in the last hour?"
| Source | Path / Command | What it gives |
|---|---|---|
| Global orchestrator state | ~/catalyst/state.json | All orchestrators, progress, worker map |
| Per-run state | ~/catalyst/runs/<orch-id>/state.json | Wave breakdown, queue, current wave |
| Worker signal files | ~/catalyst/runs/<orch-id>/workers/*.json | Phase, PR, heartbeat, needsAttention |
| Session database | catalyst-session.sh list --active --json | Active Claude sessions |
| Worktree inventory | ls ~/catalyst/wt/ | Projects and their worktrees |
| Claude session recency | ls -lt ~/.claude/projects/ | Which sessions were recently active (by mtime) |
| Event log | ~/catalyst/events/YYYY-MM.jsonl | Last 30–60 min of activity |
| Orchestrator dashboard | ~/catalyst/runs/<orch-id>/DASHBOARD.md | Human-readable orch summary |
| Rollup fragments | ~/catalyst/runs/<orch-id>/workers/<TICKET>-rollup.md | Post-completion summaries |
~/catalyst/wt/<project>/ — top-level project directories (e.g., adva/, catalyst-workspace/)orch-<slug> — orchestrator leader worktree (no ticket suffix)orch-<slug>-<TICKET> — orchestrator worker worktreePM / pm — persistent PM session worktree<TICKET> (e.g., ADV-454) — standalone oneshot worktree~/catalyst/runs/<orch-id>/ — orchestrator run state dir (matches orch-<slug> above)~/.claude/projects/-Users-ryan-catalyst-wt-<project>-<worktree>/ — Claude Code session dataDetermine mode from the argument:
ls ~/catalyst/wt/) → project filterorch- → orchestrator deep-diverestart → restart modeThe helper script collects all state in one pass and outputs JSON:
# Resolve the shared catalyst-dev scripts dir (skills live in catalyst-legacy; scripts stay in
# catalyst-dev). Fail fast with an actionable message if catalyst-dev is not installed.
source "${CLAUDE_PLUGIN_ROOT:-plugins/legacy}/scripts/require-catalyst-dev.sh" \
"${CLAUDE_PLUGIN_ROOT:-plugins/legacy}" || exit 1
"${CATALYST_DEV_SCRIPTS}/god-gather.sh" 2>/dev/null
The script returns a JSON object with keys: ts, projects, sessions, recentEvents,
global. Parse it with jq for the sections you need.
If the helper is unavailable or errors, fall back to gathering data directly (see Manual fallback commands below).
Format the output using the Dashboard format section below. Use the gathered JSON.
For project-filter mode, skip all sections not matching the requested project. For orchestrator deep-dive, show the full worker table and the DASHBOARD.md contents. For restart mode, follow the Restart mode section. For free-form questions, answer naturally using the gathered data as context.
Use Unicode box-drawing characters for section headers. Present in this order:
[as of 2026-05-07T11:44:00Z]
═══ ADVA (2 orchestrators, 1 PM, 1 oneshot) ═══
ORCH orch-deal-to-opportunity-2026-04-24 Wave 2/7 active
├── ADV-462 pr-created PR #291 ✅ CI passing
├── ADV-474 implementing (no PR yet)
└── ADV-475 implementing (no PR yet)
ORCH orch-industry-packs-2026-04-24 Wave 1/2 active
├── ADV-480 pr-created PR #293 ❌ CI failing
├── ADV-481 researching
├── ADV-482 queued
└── ADV-483 queued
PM ~/catalyst/wt/adva/PM last active: 2 min ago
SHOT ADV-454 (design tokens in docs) last active: 8 min ago
═══ CATALYST (1 orchestrator, 1 PM) ═══
ORCH orch-ctl-275-2026-05-07 Wave 1/2 active
├── CTL-280 done PR #465 ✅ merged
└── CTL-193 implementing (no PR yet)
PM ~/catalyst/wt/catalyst-workspace/PM last active: 3 min ago
─── Recent activity (last 30 min) ─────────────────────────────
ADV-480: implementing → pr-created [PR #293, CI pending]
CTL-280: pr-created → done [PR #465 merged]
github: 3× check_suite completed (2 passing, 1 failing)
Linear: ADV-474 state → In Review
| CI state | Icon | |---|---| | passing / merged | ✅ | | pending / in-progress | ⏳ | | failing | ❌ | | no PR yet / unknown | (omit icon) |
Map signal-file status to display text:
dispatched → queuedresearching → researchingplanning → planningimplementing → implementingvalidating → validatingshipping → shippingpr-created → pr-created (append PR info)done → donefailed → ❌ failedstalled → ⚠️ stalleddeploy-failed → ❌ deploy-failedWorkers with needsAttention: true get a ⚠️ prefix regardless of status.
/god <orch-name>)When the arg matches an orchestrator name, show:
state.json:
Wave 1/2 ✅ done (CTL-275, CTL-276, CTL-277, CTL-278, CTL-279)
Wave 2/2 🔵 active (CTL-280, CTL-193)
~/catalyst/runs/<orch-id>/DASHBOARD.md (verbatim, truncated to 60 lines).orchestrator == "<orch-id>")/god restart)Show sessions that appear interrupted (were active but have no running process):
# Find worker signal files with non-terminal status but stale heartbeat
find ~/catalyst/runs -name "*.json" -path "*/workers/*.json" 2>/dev/null | while read f; do
jq -r --arg f "$f" \
'select(.status != "done" and .status != "failed" and .status != null) |
"\(.status) \(.lastHeartbeat // "unknown") \(.pid // "?") \(.ticket // .workerName) \($f)"' \
"$f" 2>/dev/null
done
For each candidate:
kill -0 <pid> 2>/dev/null && echo "running" || echo "dead"For each crashed session, show the restart command:
⚠️ CTL-193 (implementing) — last heartbeat 42 min ago, PID 81220 dead
Worktree: ~/catalyst/wt/catalyst-workspace/orch-ctl-275-2026-05-07-CTL-193
Resume: cd ~/catalyst/wt/catalyst-workspace/orch-ctl-275-2026-05-07-CTL-193
claude --resume
⚠️ ADV-474 (planning) — last heartbeat 23 min ago, PID 79441 dead
Resume: cd ~/catalyst/wt/adva/orch-deal-to-opportunity-2026-04-24-ADV-474
claude --resume
If no crashed sessions: print ✅ All active sessions appear healthy.
When the input is a question, gather the relevant data and answer naturally:
| Question type | Data to gather |
|---|---|
| "what PRs are open?" | gh pr list --repo <each-repo> or parse pr field from worker signal files |
| "which workers are stuck?" | Worker signal files where needsAttention: true or status == "stalled" |
| "what happened in the last hour?" | Event log tail, last 60 min |
| "which orchestrators are done?" | state.json orchestrators where status == "completed" |
| "how much did the last orch cost?" | state.json .orchestrators[<orch-id>].usage.costUSD |
| "what's the CI status of PR #N?" | gh api repos/<repo>/pulls/<N> |
Always gather the specific data first, then answer. Do not speculate from memory.
If god-gather.sh is unavailable:
# Global orchestrator state
cat ~/catalyst/state.json 2>/dev/null | jq '.orchestrators | to_entries[] | {
id: .key,
status: .value.status,
projectKey: .value.projectKey,
progress: .value.progress,
worktreeDir: .value.worktreeDir
}' 2>/dev/null
# Worktree inventory
for project in $(ls ~/catalyst/wt/ 2>/dev/null); do
echo "=== $project ==="; ls ~/catalyst/wt/"$project"/ 2>/dev/null
done
# Active sessions (if catalyst-session.sh is available)
SESS=$(ls ~/.claude/plugins/cache/catalyst/catalyst-dev/*/scripts/catalyst-session.sh 2>/dev/null | sort -V | tail -1)
[ -x "$SESS" ] && "$SESS" list --active --json 2>/dev/null | jq '.' || echo "session tracking unavailable"
# Recent Claude session activity (mtime of project dirs)
ls -lt ~/.claude/projects/ 2>/dev/null | grep "catalyst-wt" | head -15
# Recent events (last 30 min)
EVENTS_FILE=~/catalyst/events/$(date +%Y-%m).jsonl
if [ -f "$EVENTS_FILE" ]; then
TOTAL=$(wc -l < "$EVENTS_FILE" | tr -d ' ')
SINCE=$(( TOTAL > 2000 ? TOTAL - 2000 : 0 ))
CUTOFF=$(date -u -v-30M +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || \
date -u --date='30 minutes ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null)
tail -n +"$((SINCE + 1))" "$EVENTS_FILE" 2>/dev/null | jq -c \
--arg cutoff "$CUTOFF" '
select(.ts >= $cutoff) | select(
(.event | startswith("worker-")) or
(.event | startswith("filter.wake")) or
.event == "github.pr.merged" or
.event == "github.check_suite.completed" or
.event == "attention-raised" or
.event == "linear.issue.state_changed" or
(.event == "comms.message.posted" and (.detail.type // "") == "attention")
)' 2>/dev/null
fi
# Per-run state (waves and worker list)
for STATE in $(find ~/catalyst/runs -name "state.json" -maxdepth 2 2>/dev/null); do
jq '{run: .orchestrator, currentWave: .currentWave, totalWaves: .totalWaves, waves: [.waves[] | {wave: .wave, status: .status, tickets: .tickets}]}' "$STATE" 2>/dev/null
done
# Worker signal files for active orchestrators
find ~/catalyst/runs -name "*.json" -path "*/workers/*.json" -not -name "*-rollup.md" 2>/dev/null | \
xargs jq -c '{ticket: .ticket, status: .status, phase: .phase, pr: .pr, needsAttention: .needsAttention, lastHeartbeat: .lastHeartbeat, pid: .pid}' 2>/dev/null
orchestrate — launches multi-ticket orchestrators whose state /god readsoneshot — launches standalone workers whose state /god tracksteardown — archives completed orchestrators (moves them out of ~/catalyst/runs/)attention posts surface in /god restartCTL-282 — HUD-panel / 30-minute briefing variant of this skill (child ticket)CTL-192 — session state tracking and crash-resilient restart (related)testing
Phase-agent that fixes a failing verify verdict so the pipeline self-heals instead of stalling to needs-human (CTL-653). Reads `${ORCH_DIR}/workers/<ticket>/verify.json`, fixes the `findings[]` (every severity:"high" plus the regression_risk drivers) directly via Edit/Write, commits the remediation, and emits `phase.remediate.complete.<ticket>`. The scheduler's router then re-dispatches `verify` to re-check (the verify⇄remediate cycle, cap 3). Dispatched as a `claude --bg` job by `phase-agent-dispatch`, which invokes it via slash command — hence `user-invocable: true`.
tools
--- name: phase-triage description: Phase agent that triages a Linear ticket — expands acronyms, classifies (feature/bug/docs/refactor/chore), identifies genuine blockers (a semantic second-pass over the backlog — NOT a prose scrape; CTL-838), estimates scope, writes triage.json, and posts a triage analysis comment to Linear. Triage completion is signaled by that comment plus the local triage.json — there is no `triaged` label. Emits phase.triage.complete.<TICKET> on success and phase.triage.fai
tools
Phase agent for the research step of the 9-phase orchestrator pipeline (CTL-450). Wraps /catalyst-dev:research-codebase and produces thoughts/shared/research/<date>-<ticket>.md, then emits phase.research.complete.<ticket>. Reads triage.json from the worker dir as its prior-phase artifact. Spawned via plugins/dev/scripts/phase-agent-dispatch, which invokes it via slash command — hence `user-invocable: true`.
development
Phase-agent wrapper that opens the pull request after implementation completes (CTL-449 Initiative 1 Phase 3). Delegates to `/catalyst-dev:create-pr` (which already auto-runs `describe-pr` and transitions Linear to `inReview`), then writes the PR number + URL into the phase signal file so the downstream `phase-monitor-merge` agent can read it without re-querying GitHub. Dispatched as a `claude --bg` job by `phase-agent-dispatch`, which invokes it via slash command — hence `user-invocable: true`.