workspace-ralph-orchestrator — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited workspace-ralph-orchestrator (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Orchestrate Ralph automation loops via tmux sessions with full control from Claude Code.
| Command | Description |
|---|---|
ralph start <spec_dir> | Start Ralph loop (parallel batches enabled by default) |
ralph --no-parallel <spec_dir> | Run sequentially (disable parallel batches) |
ralph stop | Hard kill Ralph processes |
ralph stop --graceful | Graceful stop after current task |
ralph status <spec_dir> | Show current progress |
ralph context <spec_dir> --simple --loop | Live dashboard (recommended) |
ralph --worktree <spec_dir> | Run in isolated worktree |
Stop Ralph after the current task completes, preserving state:
# Create stop file - Ralph checks this between tasks
touch <spec_dir>/.ralph/.stop
# Example:
touch specs/001-my-feature/.ralph/.stopRalph will:
From Claude Code, use this pattern:
# Graceful stop
SPEC_DIR="specs/001-my-feature"
touch "$SPEC_DIR/.ralph/.stop"
echo "Stop file created - Ralph will stop after current task"When you need to stop immediately:
# Kill specific session
tmux kill-session -t ralph-001 2>/dev/null
# Kill all Ralph processes
pkill -f "ralph.sh"
pkill -f "timeout.*claude"
# Kill Playwright tests (if running)
pkill -f "playwright"
pkill -f "npx.*playwright"
# Nuclear option - kills ALL tmux
tmux kill-serverComplete cleanup script:
# Stop everything Ralph-related
tmux kill-session -t ralph-001 2>/dev/null
pkill -f "ralph.sh"
pkill -f "timeout.*claude"
pkill -f "playwright"
pkill -f "npx.*playwright"Important: After hard stop, manually update progress.json to document state.
Ralph spawns a Claude Code session for each task. Use the included helper script for a complete overview.
# Live dashboard with auto-refresh (recommended)
.claude/skills/workspace-ralph-orchestrator/ralph-context.sh <spec_dir> --simple --loop
# Single snapshot
.claude/skills/workspace-ralph-orchestrator/ralph-context.sh <spec_dir>
# Example:
.claude/skills/workspace-ralph-orchestrator/ralph-context.sh specs/001-my-feature --simple --loopThis shows:
If you need more detail:
# Find most recently modified session files for your current project
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
CLAUDE_PROJECT_PATH="$HOME/.claude/projects/-$(echo "$PROJECT_ROOT" | tr '/' '-' | sed 's/^-//')"
ls -lt "$CLAUDE_PROJECT_PATH"/*.jsonl | head -5
# Check which Claude processes are running
ps aux | grep claude | grep -v grep# Get recent assistant messages (what Claude said/did)
SESSION_FILE="<path_to_session>.jsonl"
tail -50 "$SESSION_FILE" | jq -r '
select(.type == "assistant") |
.message.content[] |
select(.type == "text") |
.text' 2>/dev/null | tail -30Ralph's Claude often uses TodoWrite to track subtasks:
# Find the todo file for the session
SESSION_ID="<session-id>"
cat ~/.claude/todos/${SESSION_ID}-agent-${SESSION_ID}.json 2>/dev/null | jq -r '.[] |
if .status == "completed" then "✅ \(.content)"
elif .status == "in_progress" then "🔄 \(.content)"
else "⬚ \(.content)"
end'# Get last 20 tool calls and responses
SESSION_FILE="<path>.jsonl"
tail -100 "$SESSION_FILE" | jq -r '
if .type == "assistant" then
if .message.content[0].text then "CLAUDE: " + .message.content[0].text[:200]
elif .message.content[0].type == "tool_use" then "TOOL: " + .message.content[0].name
else empty
end
else empty
end' 2>/dev/null | tail -20Start Ralph in a tmux session:
# Kill any existing session
tmux kill-session -t ralph 2>/dev/null
# Start new session with spec name
SPEC_NAME="010-feature"
tmux new-session -d -s "ralph-$SPEC_NAME" -c <project_root>
# Run Ralph
tmux send-keys -t "ralph-$SPEC_NAME" '<ralph_path>/ralph.sh start specs/<spec_name>/' EnterExample:
tmux kill-session -t ralph-001 2>/dev/null
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
tmux new-session -d -s ralph-001 -c "$PROJECT_ROOT"
tmux send-keys -t ralph-001 './ralph start specs/001-my-feature/' EnterWhen starting Ralph, automatically open the context viewer in a separate Warp tab for real-time monitoring. This is enabled by default but can be disabled.
Complete start with context viewer:
# Set variables
SPEC_DIR="specs/001-my-feature"
SPEC_NAME="010"
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
SKILL_PATH="$PROJECT_ROOT/.claude/skills/workspace-ralph-orchestrator"
# Start Ralph in tmux
tmux kill-session -t ralph-$SPEC_NAME 2>/dev/null
tmux new-session -d -s ralph-$SPEC_NAME -c "$PROJECT_ROOT"
tmux send-keys -t ralph-$SPEC_NAME "./ralph start $SPEC_DIR/" Enter
# Auto-open context viewer in new Warp tab (default: on)
OPEN_CONTEXT_VIEWER=${OPEN_CONTEXT_VIEWER:-true}
if [[ "$OPEN_CONTEXT_VIEWER" == "true" ]]; then
osascript -e 'tell application "Warp" to activate' \
-e 'delay 0.5' \
-e 'tell application "System Events" to tell process "Warp" to keystroke "t" using command down' \
-e 'delay 0.3' \
-e "tell application \"System Events\" to tell process \"Warp\" to keystroke \"watch -n5 '$SKILL_PATH/ralph-context.sh' '$SPEC_DIR'\"" \
-e 'tell application "System Events" to tell process "Warp" to key code 36'
fiTo disable auto-open:
OPEN_CONTEXT_VIEWER=false # Set before starting RalphProgress terminal (recommended):
# Simple single-column layout with auto-refresh (default)
.claude/skills/workspace-ralph-orchestrator/ralph-context.sh <spec_dir> --simple --loop
# Example:
.claude/skills/workspace-ralph-orchestrator/ralph-context.sh specs/001-my-feature --simple --loopAvailable flags:
| Flag | Description |
|---|---|
--loop | Auto-refresh (default 1s; override with RALPH_CONTEXT_REFRESH_SECS) |
--simple | Single-column layout (less visual noise) |
--width=N | Force specific terminal width |
What the context viewer shows:
Tasks marked with [P] are automatically batched and executed in parallel using Claude Code subagents:
## Phase 5: Theming Fixes
- [ ] T085 [P] Fix light mode for IconPickerField
- [ ] T086 [P] Fix light mode for URLField
- [ ] T087 [P] Fix Section overlay colorsWhen Ralph detects consecutive [P] tasks:
MAX_PARALLEL_TASKS, default: 5)Configuration (`ralph.config`):
PARALLEL_ENABLED=true # Auto-detect [P] tasks (default: true)
MAX_PARALLEL_TASKS=5 # Max tasks per batch
PARALLEL_TIMEOUT=14400 # Batch timeout (4 hours)Dashboard shows batch progress:
Recent actions show subagents:
→ T085: Fix light mode... (purple arrow) - Subagent spawned> Read (blue) - Direct tool callsRun multiple Ralph loops on different features simultaneously:
# Loop 1: Feature A (main repo, branch 010)
tmux new-session -d -s ralph-001 -c /path/to/project
tmux send-keys -t ralph-001 './ralph.sh start specs/010-feature-a/' Enter
# Loop 2: Feature B (worktree, branch 012)
tmux new-session -d -s ralph-002 -c /path/to/project
tmux send-keys -t ralph-002 './ralph.sh --worktree start specs/012-feature-b/' EnterEach loop runs in isolation:
ralph-001, ralph-002)# Auto-create worktree based on spec name
./ralph.sh --worktree start specs/012-feature/
# Specify worktree location
./ralph.sh --worktree-base ~/worktrees start specs/012-feature/
# Specify branch name
./ralph.sh --worktree --branch feature-branch start specs/012-feature/.specify/ralph/config.sh)# Enable worktrees for all specs
WORKTREE_ENABLED=true
WORKTREE_BASE="../worktrees"
# Context settings (0 = full, N = truncate to N lines)
RALPH_SPEC_LINES=0 # Include full spec.md
RALPH_PLAN_LINES=0 # Include full plan.md
# Retries and notifications
MAX_RETRIES=3
SLACK_ENABLED=true<spec_dir>/ralph.config)# Override branch for this spec
FEATURE_BRANCH="010-schedule-improvements"
MAX_RETRIES=5Ralph injects prompts at two levels:
| File | Scope | Purpose |
|---|---|---|
.specify/ralph/ralph-global.md | Workspace-global | All specs - project-wide skill mappings |
<spec_dir>/ralph-spec.md | Spec-specific | One feature - patterns for this spec |
Example `ralph-global.md`:
# MANDATORY: Skill Usage
| When Task Involves | YOU MUST USE |
|--------------------|--------------|
| Starting servers | `Skill(skill="hf-app-docker-dev-server")` |
| Running E2E tests | `Skill(skill="hf-app-playwright-runner")` |Example `ralph-spec.md`:
## Feature-Specific Context
This is a frontend-only feature. Focus on:
- React components in `components/schedule/`
- Run Playwright tests after UI changes
Do NOT modify backend code.# Progress JSON
cat <spec_dir>/.ralph/progress.json | jq .
# Session log
tail -20 <spec_dir>/.ralph/session.log
# Git commits from Ralph
git log --oneline -10 | grep "Ralph:"
# Built-in status command
./ralph.sh status specs/010-feature/# Read current tmux output
tmux capture-pane -t ralph-001 -p | tail -20
# Extended history (last 500 lines)
tmux capture-pane -t ralph-001 -p -S -500 | tail -100
# List all Ralph sessions
tmux list-sessions | grep ralphRalph's Claude may run commands in background. Check output files:
# List recent task outputs
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
CLAUDE_TMP_PATH="/private/tmp/claude/-$(echo "$PROJECT_ROOT" | tr '/' '-' | sed 's/^-//')/tasks"
ls -lt "$CLAUDE_TMP_PATH"/*.output | head -5
# Tail active output
tail -f "$CLAUDE_TMP_PATH"/<task_id>.outputOpen tmux in Warp:
osascript -e 'tell application "Warp" to activate' \
-e 'delay 0.5' \
-e 'tell application "System Events" to tell process "Warp" to keystroke "t" using command down' \
-e 'delay 0.3' \
-e 'tell application "System Events" to tell process "Warp" to keystroke "tmux attach -t ralph-001"' \
-e 'tell application "System Events" to tell process "Warp" to key code 36' git checkout 010-feature-branch
tmux new-session -d -s ralph-001 -c /path/to/project
tmux send-keys -t ralph-001 './ralph.sh start specs/010-feature/' Enter tmux new-session -d -s ralph-002 -c /path/to/project
tmux send-keys -t ralph-002 './ralph.sh --worktree start specs/012-feature/' Enter # Terminal 1
tmux attach -t ralph-001
# Terminal 2
tmux attach -t ralph-002 # Each loop creates a PR when finished
gh pr create --base main --head 010-feature-branch
gh pr create --base main --head 012-feature-branch ps aux | grep claude | grep -v grep PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
CLAUDE_PROJECT_PATH="$HOME/.claude/projects/-$(echo "$PROJECT_ROOT" | tr '/' '-' | sed 's/^-//')"
find "$CLAUDE_PROJECT_PATH" -name "*.jsonl" -mmin -5 touch <spec_dir>/.ralph/.stop
# Wait for stop, then:
./ralph.sh --resume start <spec_dir>Claude may be waiting for:
--dangerously-skip-permissions)Check background task output files in /private/tmp/claude/.
Ralph's Claude often needs running servers. If tests fail:
docker compose -f docker-compose.local.yml down
docker compose -f docker-compose.local.yml up -d --buildIf scrolling with trackpad in tmux creates escape sequences like ^[OA^[OA^[[A:
# Enable mouse mode (allows trackpad scrolling)
tmux set -g mouse on
# Make it permanent
echo "set -g mouse on" >> ~/.tmux.confThis fixes trackpad scrolling in attached tmux sessions.
lib/ralph.sh - Main orchestratorlib/context-builder.sh - Prompt assemblylib/task-parser.sh - Parse tasks.mdlib/progress-tracker.sh - State management.specify/ralph/config.sh - Global config.specify/ralph/ralph-global.md - Workspace-global prompt (skill mappings)<spec>/ralph.config - Per-spec config<spec>/ralph-spec.md - Spec-specific prompt (feature patterns)<spec>/.ralph/progress.json - Task progress state<spec>/.ralph/session.log - Execution log<spec>/.ralph/.stop - Graceful stop trigger file.claude/skills/workspace-ralph-orchestrator/SKILL.md - This documentation.claude/skills/workspace-ralph-orchestrator/ralph-context.sh - Context helper scripttee to show Claude output in terminal while capturingralph-context.sh).ralph/.stop)[P] tasks via Claude subagents~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.