manager / planner / developer / qa ์์จ ์์ด์ ํธ ๋ฃจํ CLI
ralph ๋ฃจํ๋ ๋ด๋ถ์ ์ผ๋ก codex exec๋ฅผ ์ฌ์ฉํฉ๋๋ค.
codex --version
codex login status๋ก๊ทธ์ธ์ด ์ ๋์ด ์์ผ๋ฉด:
codex loginAPI ํค ๋ก๊ทธ์ธ:
printenv OPENAI_API_KEY | codex login --with-api-keymacOS / Ubuntu:
curl -fsSL https://raw.githubusercontent.com/emperorhan/codex-ralph/main/scripts/install-ralphctl.sh | bash์ค์น ํ์ธ:
ralphctl --help- ๊ธฐ๋ณธ control dir:
~/.ralph-control - ์ฒซ ์คํ ์ ํ์ํ ๊ธฐ๋ณธ plugin/registry๊ฐ ์๋ ์ค๋น๋ฉ๋๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์์:
ralphctl --project-dir "$PWD" bootstrap์ดํ:
./ralph์คํ ํฌํผ๊ฐ ์์ฑ๋ฉ๋๋ค.- ๋ก์ปฌ Git ์ ์ฅ์๊ฐ ์์ผ๋ฉด ์๋ ์ด๊ธฐํ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ ์ค์ ํ์ผ:
.ralph/profile.yaml.ralph/profile.local.yaml
- ์์ ์ฑ ๊ธฐ๋ณธ๊ฐ(timeout/retry/watchdog/primary daemon restart)์ด ์ ์ฉ๋ฉ๋๋ค.
- ์๋ฃ(
done)๋ ์ด์ ๋จ์๋ก ์๋ ์ปค๋ฐ์ด ๋์ ๋ฉ๋๋ค(์์/๋ฐํ์ ํ์ผ ์ ์ธ). - canonical runtime์
Ralph Runtime(.ralph-runtime) ์ ๋๋ค.
ralphctl --project-dir "$PWD" doctor
ralphctl --project-dir "$PWD" status
ralphctl --project-dir "$PWD" work
ralphctl --project-dir "$PWD" eval๋ฌธ์ ๊ฐ ์์ผ๋ฉด:
ralphctl --project-dir "$PWD" doctor --repair
ralphctl --project-dir "$PWD" cp recover
ralphctl --project-dir "$PWD" retry-blocked --reason codex_failed_afterpublic ์ฌ์ฉ์๋ ์๋ happy path๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ํ๋ฉด ๋ฉ๋๋ค.
ralphctl --project-dir "$PWD" bootstrap
ralphctl --project-dir "$PWD" intake "ํฌ์ค์ฒดํฌ ์๋ํฌ์ธํธ ์ถ๊ฐํ๊ณ ํ
์คํธ๊น์ง ๋ง๋ฌด๋ฆฌํด์ค"
ralphctl --project-dir "$PWD" intake status
ralphctl --project-dir "$PWD" intake revise "๋ฐ๋์ ๋๋์ผ ํ๋ ๊ฒฐ๊ณผ๋ /health ์๋ํฌ์ธํธ์ ๊ด๋ จ ํ
์คํธ ํต๊ณผ์
๋๋ค."
ralphctl --project-dir "$PWD" intake status
ralphctl --project-dir "$PWD" intake approve
ralphctl --project-dir "$PWD" status์ง์ ํ๊ฒฝ:
- macOS / Linux
- ๋ก์ปฌ Git ํ๋ก์ ํธ
codex exec์ฌ์ฉ ๊ฐ๋ฅ ํ๊ฒฝ
์ฐธ๊ณ ๋ฌธ์:
- public-launch-readiness.md
- public-known-limitations.md
- public-release-notes-template.md
- public-ship-audit.md
- fresh-machine-smoke-runbook.md
- telegram-public-smoke-runbook.md
- public-troubleshooting.md
- public-release-checklist.md
bash scripts/run-public-release-gate.sh "$PWD"bash scripts/collect-fresh-machine-smoke-record.shbash scripts/collect-telegram-smoke-record.sh
์๋ ์ด์ ์์ฑ:
ralphctl --project-dir "$PWD" intake issue developer "health endpoint ๊ตฌํ"
ralphctl --project-dir "$PWD" intake issue --priority 10 --story-id US-001 developer "๊ฒฐ์ API ์๋ฌ ์ฒ๋ฆฌ ๊ฐ์ "PRD JSON ์ผ๊ด ์์ฑ:
ralphctl --project-dir "$PWD" intake prd --file prd.json --default-role developer์์ฐ์ด ์์ฒญ์์ ์ด์ ์์ฑ:
ralphctl --project-dir "$PWD" intake request "๊ฒฐ์ API ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๊ณ ํ
์คํธ๊น์ง ์ถ๊ฐํด์ค"
ralphctl --project-dir "$PWD" intake "ํฌ์ค์ฒดํฌ ์๋ํฌ์ธํธ ์ถ๊ฐํ๊ณ ๋ฌธ์๋ ์
๋ฐ์ดํธํด์ค"intent session ์ ๊ฒ/์น์ธ:
ralphctl --project-dir "$PWD" intake status
ralphctl --project-dir "$PWD" intake brief
ralphctl --project-dir "$PWD" intake approve
ralphctl --project-dir "$PWD" intake revise "์ฑ๊ณต ๊ธฐ์ค์ smoke test ํต๊ณผ"
ralphctl --project-dir "$PWD" intake abortintake approve ์ดํ์๋ workload๋ณ auto-run ์ ์ฑ
์ด ์ ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์์๋ terminal verify ์ ๊น์ง๋ง ์๋ ์คํํ๊ณ , status์ Telegram /task status๋ summary / situation / next_action ํ์์ operator cockpit ๋ฌธ๊ตฌ๋ก ํ์ฌ ๊ฒฝ๊ณ์ ์ฌ๊ฐ ํฌ์ธํธ๋ฅผ ๋ณด์ฌ์ค๋๋ค. public-safe ๊ธฐ๋ณธ๊ฐ์ ๋ฒ์ด๋๋ฉด public_guardrail ๊ฒฝ๊ณ ์ emergency_action ์๋ด๊ฐ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
์ด์ ./ralph start, ./ralph run, ralphctl supervise ๊ธฐ๋ฐ loop ๊ฒฝ๋ก๋ ์ ๊ฑฐ๋์์ต๋๋ค. ํ์ฌ ๊ถ์ฅ ์คํ ๊ฒฝ๋ก๋ Ralph Runtime + session orchestration ์
๋๋ค.
ralphctl --project-dir "$PWD" work
ralphctl --project-dir "$PWD" status
ralphctl --project-dir "$PWD" eval
ralphctl --project-dir "$PWD" cp doctor --repair --strict๋๋ถ๋ถ์ ์ฌ์ฉ์๋ bootstrap, intake, work, status, eval, doctor๋ง ์ฐ๋ฉด ๋ฉ๋๋ค. cp๋ low-level control-plane ops/debug namespace๋ก ๋จ๊ฒจ๋ advanced ๋ช
๋ น๊ตฐ์
๋๋ค.
์ฃผ์ ์ฐ์ถ๋ฌผ:
.ralph/done/: ์๋ฃ ์ด์.ralph/blocked/: ์คํจ/๊ฒํ ํ์ ์ด์.ralph/logs/: ์คํ ๋ก๊ทธ
legacy blocked ์ด์ ์ฌ์๋:
ralphctl --project-dir "$PWD" retry-blocked
ralphctl --project-dir "$PWD" retry-blocked --reason codex_failed_after
ralphctl --project-dir "$PWD" retry-blocked --reason codex_permission_denied --limit 1์ด ์น์
์ ์ด์/๋๋ฒ๊น
์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ์ง์ ์ฐ๋ advanced cp ๋ช
๋ น๋ค์
๋๋ค.
ralphctl --project-dir "$PWD" cp init
ralphctl --project-dir "$PWD" cp import-intent --file intent.json
ralphctl --project-dir "$PWD" cp plan --intent-id <intent-id># ๊ธฐ๋ณธ ์คํ (verify ์ค์ฌ)
ralphctl --project-dir "$PWD" cp run --max-workers 1
# Codex ์คํ + verify
ralphctl --project-dir "$PWD" cp run --max-workers 1 --execute-with-codex
# blocked ๋ณต๊ตฌ (policy ์กด์ค: retry budget/backoff/circuit)
ralphctl --project-dir "$PWD" cp recover
# ์ฆ์ ๊ฐ์ ๋ณต๊ตฌ (cooldown/circuit ์ฐํ)
ralphctl --project-dir "$PWD" cp recover --force
ralphctl --project-dir "$PWD" cp status --json
ralphctl --project-dir "$PWD" cp metrics --json
ralphctl --project-dir "$PWD" cp metrics --with-baseline --json
ralphctl --project-dir "$PWD" cp doctor --repair --repair-recover-limit 10 --strict
# cooldown/circuit ์ฐํ๊ฐ ํ์ํ ๋
ralphctl --project-dir "$PWD" cp doctor --repair --repair-force-recover --strict
# blocked circuit/์ฌ์๋ ์์ฐ์ ์๋ ์ด๊ธฐํํ ๋
ralphctl --project-dir "$PWD" cp doctor --repair --repair-reset-circuit --repair-reset-retry-budget --strict
# fault injection (์ ๋ขฐ์ฑ ํ
์คํธ)
ralphctl --project-dir "$PWD" cp fault-inject --task-id task-1 --mode lease-expire
ralphctl --project-dir "$PWD" cp fault-inject --task-id task-1 --mode verify-fail
ralphctl --project-dir "$PWD" cp fault-inject --task-id task-1 --mode execute-fail
ralphctl --project-dir "$PWD" cp fault-inject --task-id task-1 --mode permission-deniedadvanced cp doctor ํต์ฌ data integrity ์ฒดํฌ:
task_json_consistencyevent_journal_consistencylearning_journal_consistencyevent_ledger_consistencylearning_ledger_consistency
๊ฒ์ฆ ์ ์ฑ
์์ง(unit|integration|lint|custom) ์ฌ์ฉ ์์:
{
"verify_cmd": "lint: golangci-lint run\nunit: go test ./...\ncustom: ./scripts/verify_extra.sh"
}์ ๋์ด๊ฐ ์์ผ๋ฉด custom์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
readiness eval์ Ralph Runtime + session harness์ ๋ณํฉ ๊ฐ๋ฅ์ฑ์ ์ ์ํ์ ์๋๋ฆฌ์ค ๊ฒฐ๊ณผ๋ก ํ์ธํ๋ ๋ช
๋ น์
๋๋ค.
ralphctl --project-dir "$PWD" eval์คํํ๋ฉด ํ ์คํธ ์์ฝ๊ณผ ํจ๊ป ์๋ ์ํฐํฉํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
.ralph-runtime/reports/eval/latest.json.ralph-runtime/reports/eval/latest.md.ralph-runtime/reports/eval/runs/<timestamp>/scorecard.json.ralph-runtime/reports/eval/runs/<timestamp>/scenarios.json.ralph-runtime/reports/eval/runs/<timestamp>/summary.md
์ถ๋ ฅ์๋ ready, hard_gate_passed, soft_gate_passed, total_score์ ์๋๋ฆฌ์ค๋ณ pass/fail ์์ฝ์ด ํฌํจ๋ฉ๋๋ค.
Ready: hard gate๋ฅผ ํต๊ณผํ๊ณ ์ด์ ๊ธฐ์ค๋ ์ถฉ์กฑํ ์ํNot Ready: hard gate๊ฐ ํ๋๋ผ๋ ์คํจํ ์ํhard gate: task execution, memory safety, operational resilience ๊ฐ์ ํ์ ์ถ์ ์ต์ ํต๊ณผ ์กฐ๊ฑดsoft gate: ๋ณํฉ์ ๊ฐ๋ฅํ์ง๋ง ํ์ ๊ฐ์ ์ด ํ์ํ ๋ณด์กฐ ์กฐ๊ฑด
intent eval์ ์ต์ intent session๊ณผ execution brief์ ๋ช ํ๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ฒํ๋ ๋ช ๋ น์ ๋๋ค.
ralphctl --project-dir "$PWD" cp intent-eval์คํํ๋ฉด ์๋ ์ํฐํฉํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
.ralph-runtime/reports/intent-eval/latest.json.ralph-runtime/reports/intent-eval/latest.md.ralph-runtime/reports/intent-eval/runs/<timestamp>/report.json.ralph-runtime/reports/intent-eval/runs/<timestamp>/summary.md
competitive eval์ internal benchmark/experiment surface์ ๋๋ค. ์ผ๋ฐ ์ฌ์ฉ์ ๊ธฐ๋ฅ์ด ์๋๋ผ, ํ๋ค์ค ํ์ง๊ณผ operator ๊ฒฝํ์ ๋ด๋ถ์ ์ผ๋ก ๋น๊ต ์ ๊ฒํ๊ธฐ ์ํ ํ๊ฐ ํ๋ฉด์ ๋๋ค.
ralphctl --project-dir "$PWD" cp competitive-evalbaseline mode๋ ํ์ฌ์ฒ๋ผ codex-ralph๋ฅผ ์ง์ ์คํํด ์ ์ํํฉ๋๋ค.
ralphctl --project-dir "$PWD" cp competitive-evalmanual adapter path๋ ์ธ๋ถ ํ๋ค์ค๋ฅผ ์ง์ ์คํํ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ, internal benchmark ์คํ์ ์ํ guide/evidence ํ๋ฉด์ ๋๋ค.
bundle emit:
ralphctl --project-dir "$PWD" cp competitive-eval \
--emit-manual-bundle \
--harness <internal-benchmark-harness> \
--scenario <scenario>manual parse:
ralphctl --project-dir "$PWD" cp competitive-eval \
--parse-manual-bundle .ralph-runtime/reports/competitive-eval/manual-bundles/<internal-benchmark-harness>/<scenario>์คํํ๋ฉด ์๋ ์ํฐํฉํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
.ralph-runtime/reports/competitive-eval/latest.json.ralph-runtime/reports/competitive-eval/latest.md.ralph-runtime/reports/competitive-eval/runs/<timestamp>/result.json.ralph-runtime/reports/competitive-eval/runs/<timestamp>/summary.md.ralph-runtime/reports/competitive-eval/manual-bundles/<harness>/<scenario>/scenario.json.ralph-runtime/reports/competitive-eval/manual-bundles/<harness>/<scenario>/instructions.md.ralph-runtime/reports/competitive-eval/manual-bundles/<harness>/<scenario>/evidence-template.json
manual bundle๊ณผ parse ๊ฒฝ๋ก๋ internal benchmark harness๋ฅผ ์์ ํ๋ฉฐ, ์ผ๋ฐ ์ ํ ๊ธฐ๋ฅ์ผ๋ก ๋ฌธ์ํํ์ง ์์ต๋๋ค.
ํ์ฌ semantics๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- baseline mode
run_mode=baselineharness_kind=command-driven
- manual parse mode
run_mode=manual-parseharness_kind=manual
- manual interpreted mode
run_mode=manual-parsemeasurement_mode=manual-interpreted- harness-specific parser๊ฐ competitor ๊ฒฐ๊ณผ๋ฅผ ํด์ํ ์ํ
manual parse๋ generic parser ๋จ๊ณ์์๋ competitor ์ฑ๊ณต/์คํจ๋ฅผ ์ต์ข ํ์ ํ์ง ์๊ณ , evidence bundle์ neutral provenance๋ก ์ ๋ฆฌํฉ๋๋ค. ์ดํ harness-specific parser/adapter๊ฐ ๋ถ์ผ๋ฉด ๊ฐ์ report ํ์ดํ๋ผ์ธ ์์์ scorecard ํด์์ ๋ ์ ๊ตํ๊ฒ ์ฌ๋ฆด ์ ์์ต๋๋ค.
1์ฐจ scenario pack:
one_line_featureblocked_then_resumetelegram_control_roundtripintegration_boundary_change
operator playbook:
- pre-run
- clean workspace ํ์ธ
- ๊ฐ์ scenario contract์ success ๊ธฐ์ค ํ์ธ
- during-run
- clarification, blocked, remote control ๊ฐ์
์ง์ ์
notes.txt์ ๊ธฐ๋ก - competitor-specific deviation์ด ์์ผ๋ฉด ํจ๊ป ๋จ๊น
- clarification, blocked, remote control ๊ฐ์
์ง์ ์
- post-run
stdout.log,stderr.log,notes.txt์ ๋ฆฌ- ๊ฐ๋ฅํ๋ฉด
summary.json์timing,operator_count๋ฅผ ํจ๊ป ๋จ๊น - listed artifact๋ฅผ bundle์ ๊ฐ์ด ๋ณด๊ด
evidence discipline:
- ํ์
notes.txt- transcript์ ์คํ๋ text evidence
- ๊ถ์ฅ
summary.json- harness-specific artifact
- ์์น
- generic parser๋ evidence๋ฅผ neutral provenance๋ก๋ง ์ฝ์
- scorecard interpretation์ harness-specific parser๊ฐ ๋ถ์ ๋ ์ฌ๋ฆผ
intent-driven autonomous loop์ ์์ฑ๋๋ ์๋ targeted regression ๋ฌถ์์ผ๋ก ์ ๊ฒํฉ๋๋ค.
env GOCACHE=/tmp/ralph-gocache CGO_ENABLED=0 go test ./internal/ralph -run 'Test(Intent(FeatureFlowAutoRunsUntilValidateBoundary|IntegrationFlowAutoRunsUntilFinalVerifyBoundary|OpsFlowAutoRunsUntilHealthVerifyBoundary)|RunCompetitiveEvalBaselineProducesStableMetrics|WriteCompetitiveEvalReportsWritesLatestAndTimestampedRuns)' -count=1
env GOCACHE=/tmp/ralph-gocache CGO_ENABLED=0 go test ./cmd/ralphctl -run 'Test(TelegramBlocked(ReplyRefreshesGraphAndAutoRuns|SummaryExplainsResumePoint)|RunControlPlaneCompetitiveEval(ShowsBaselineSummary|JSONMatchesReport)|PrintIntakeSessionStatusShowsCockpitSummary|TelegramTaskStatusIncludesCockpitNarrative)' -count=1์ ๋ ๋ช ๋ น์ ๋ค์์ ํจ๊ป ๊ฒ์ฆํฉ๋๋ค.
- workload๋ณ autonomous halt semantics
- Telegram blocked -> reply -> refreshed graph -> auto-run resume
- competitive baseline metrics/report consistency
- operator cockpit summary์ CLI/Telegram surface
advanced cp run --execute-with-codex๋ ์ด์ ๋จ์ํ one-shot codex exec ํธ์ถ์ด ์๋๋ผ, Ralph Runtime ์์ ์นํ session harness๋ฅผ ํตํด ์คํ๋ฉ๋๋ค.
ํต์ฌ ๊ตฌ์กฐ:
control plane: lease, heartbeat, recover, metrics, retry budgetagent harness: coordinator-owned worker session orchestrationworker session: ๊ฐ์ task์ ๋ํด start/continue turn์ ๊ฐ์ง ์ ์๋ ์คํ ๋จ์verification: worker ์๋ฃ ์ ์ธ๊ณผ ๋ถ๋ฆฌ๋ ๋ ๋ฆฝ ๊ฒ์ฆ ๋จ๊ณ
ํ์ฌ continuity๋ persistent transport๊ฐ ์๋๋ผ codex exec replay ๋ฐฉ์์ผ๋ก ์ ์ง๋ฉ๋๋ค.
- ์ธ๋ถ ๊ณ์ฝ์ sessionful
- ๋ด๋ถ transport๋ ์ฌ์ ํ
codex exec - turn continuity๋
TaskMemory์ฌ๊ตฌ์ฑ์ผ๋ก ์ ์ง - raw transcript ์ ์ฒด๋ฅผ ์ฌ์ฃผ์ ํ์ง ์์
--execute-with-codex ๊ฒฝ๋ก๋ ์ฅ๊ธฐ ์คํ์์ drift๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค.
TaskMemory: ํ์ฌ task์ canonical memoryaccepted_factsopen_questionsartifactsnext_ask
ExecutionJournal: recover/audit์ฉ ์คํ ๊ธฐ๋กProjectMemory:.ralph/project-memory/MEMORY.md+ topic filesUserMemory:.ralph/user-memory/MEMORY.md+ topic files
์์น:
- memory๋ truth store๊ฐ ์๋๋ผ skeptical hint layer์ ๋๋ค.
- coordinator๊ฐ ์น์ธํ ์ฌ์ค๋ง
TaskMemory์ ์ฅ๊ธฐ memory๋ก ์น๊ฒฉํฉ๋๋ค. - raw transcript๋ ์ฅ๊ธฐ memory๋ก ๋ณต์ ํ์ง ์์ต๋๋ค.
ExecutionJournal์ prompt ๊ธฐ๋ณธ payload๊ฐ ์๋๋ผ ํ์ ์ ์กฐํ์ฉ์ ๋๋ค.
ํ์ฌ harness๋ coordinator-owned continuation ๋ชจ๋ธ์ ๋ฐ๋ฆ
๋๋ค.
- coordinator๋ง ๊ฐ์ worker session์ ํ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
- worker ๊ฒฐ๊ณผ๋ structured result๋ก ์์ง๋ฉ๋๋ค.
- structured result๋ ๊ธฐ์กด handoff schema๋ก bridge ๋ฉ๋๋ค.
- handoff validator์ role-specific schema๋ ์ ์ง๋ฉ๋๋ค.
์ฆ, manager/planner/developer/qa ์ญํ ์ฒด๊ณ๋ ๊ทธ๋๋ก ์ ์งํ๋ฉด์๋, ์ค์ Codex ์คํ์ session -> continuation -> verify ํ๋ฆ์ผ๋ก ์ด์๋ฉ๋๋ค.
์ด๋ฒ ๋จ๊ณ์ ๋ช ์์ ๋น๋ชฉํ:
- persistent Codex session transport ๋์
- ๊ธฐ์กด loop ๊ฒฝ๋ก ์ฌ๋์
- long-term memory๋ฅผ SQLite๋ก ์ด์
execute_cmd์ ์ฉ task ๊ฒฝ๋ก ์ฌ์์ฑ
ralphctl --project-dir "$PWD" eval
ralphctl --project-dir "$PWD" cp intent-eval
ralphctl --project-dir "$PWD" cp competitive-eval
ralphctl --project-dir "$PWD" cp doctor --repair์ฃผ์ ์ฐ์ถ๋ฌผ์ .ralph-runtime/reports/ ์๋์ ์ ์ฅ๋ฉ๋๋ค.
.ralph-runtime/reports/eval/latest.json.ralph-runtime/reports/eval/latest.md.ralph-runtime/reports/competitive-eval/latest.json.ralph-runtime/reports/competitive-eval/latest.md.ralph-runtime/autonomous-depth/
๋ ๊ฑฐ์ dual-runtime helper script๋ ์ ๊ฑฐ๋์์ต๋๋ค. Runtime ์ด์์ bootstrap, intake, work, status, eval, doctor ์ค์ฌ์ผ๋ก ์งํํฉ๋๋ค.
์ฐธ๊ณ :
- ledger(
cp_event_ledger,cp_learning_ledger)๊ฐ ๋น์ด ์๊ณ ๊ธฐ์กดcp_events/cp_learnings๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด, ์คํค๋ง ๋ณด์ฅ ๋จ๊ณ์์ ์๋ backfill ๋ฉ๋๋ค.
์ํ ์กฐํ API ์๋ฒ:
ralphctl --project-dir "$PWD" cp api --listen 127.0.0.1:8787
curl -s http://127.0.0.1:8787/health
curl -s http://127.0.0.1:8787/runtime/status
curl -s http://127.0.0.1:8787/runtime/metrics
curl -s "http://127.0.0.1:8787/runtime/metrics?with_baseline=true"
curl -s http://127.0.0.1:8787/runtime/metrics/summary
curl -s http://127.0.0.1:8787/runtime/doctor
curl -s "http://127.0.0.1:8787/runtime/events?limit=50"
curl -N http://127.0.0.1:8787/runtime/events/stream์๋น์ค ๋ฑ๋ก(systemd/launchd):
ralphctl --project-dir "$PWD" service install --start
ralphctl --project-dir "$PWD" service status
ralphctl --project-dir "$PWD" service uninstall๋ํํ(๊ถ์ฅ):
ralphctl fleet๋ช ๋ นํ ์์:
ralphctl fleet register --id wallet --project-dir <wallet-project-dir> --plugin universal-default --prd PRD.md
ralphctl fleet start --all
ralphctl fleet status --all
ralphctl fleet stop --allํ ๋ ๊ทธ๋จ์ ํ์ ์ค์ ์ด ์๋๋๋ค.
ํ์ํ ๊ฐ:
bot tokenchat-idsuser-ids(ํนํ ๊ทธ๋ฃน ์ ์ด ์ ๊ถ์ฅ/ํ์)
๊ฐ ์์ง ๋ฐฉ๋ฒ (์น):
@BotFather์์ ๋ด ์์ฑ ํ ํ ํฐ ๋ฐ๊ธ (/newbot).- ๋ด์ ์ฌ์ฉํ ๋ํ๋ฐฉ์ ์ถ๊ฐํ๊ณ ๋ฉ์์ง 1๊ฐ ์ ์ก.
- ๋ธ๋ผ์ฐ์ ์์ ์๋ URL ์ด๊ธฐ:
https://api.telegram.org/bot<bot-token>/getUpdatesJSON์์ ๋ค์ ๊ฐ์ ๋ณต์ฌ:
message.chat.id->chat-idsmessage.from.id->user-ids- ๊ทธ๋ฃน/์ํผ๊ทธ๋ฃน
chat.id๋ ์์(๋ณดํต-100...) - ๊ฒฐ๊ณผ๊ฐ ๋น์ด ์์ผ๋ฉด ๋ด/๊ทธ๋ฃน์ ๋ฉ์์ง๋ฅผ ํ ๋ฒ ๋ ๋ณด๋ด๊ณ ์๋ก๊ณ ์นจ
์๊ฒฉ ๋จธ์ ์ธํ ์์๋ ๋ก์ปฌ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ํ์ธํ ๋ค, ์๋ฒ์์ ์๋์ฒ๋ผ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค:
ralphctl --project-dir "$PWD" telegram setup --non-interactive \
--token "<bot-token>" \
--chat-ids "<chat-id>" \
--user-ids "<user-id>" \
--allow-control=false \
--notify=true \
--notify-scope auto \
--command-timeout-sec 300 \
--command-concurrency 4๊ถ์ฅ:
ralphctl --project-dir "$PWD" telegram setup
ralphctl --project-dir "$PWD" telegram run
ralphctl --project-dir "$PWD" telegram status
ralphctl --project-dir "$PWD" telegram tail
ralphctl --project-dir "$PWD" telegram stoptelegram run์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ daemon์ผ๋ก ์คํ๋ฉ๋๋ค.- ํฐ๋ฏธ๋์ ์ข ๋ฃํด๋ ๊ณ์ ๋์ํฉ๋๋ค.
- ํฌ๊ทธ๋ผ์ด๋๋ก ์คํํ๋ ค๋ฉด
telegram run --foreground๋ฅผ ์ฌ์ฉํ์ธ์.
๋น๋ํํ:
ralphctl --project-dir "$PWD" telegram setup --non-interactive \
--token "<bot-token>" \
--chat-ids "<allowed-chat-id-1>,<allowed-chat-id-2>" \
--user-ids "<allowed-user-id-1>,<allowed-user-id-2>" \
--allow-control=false \
--notify=true \
--notify-scope auto \
--command-timeout-sec 300 \
--command-concurrency 4๋ณด์ ๊ท์น:
allow-control=true+ ๊ทธ๋ฃน/์ํผ๊ทธ๋ฃน chat id(์์) ์กฐํฉ์์๋user-ids๊ฐ ํ์์ ๋๋ค.- ์ ์ด ๋ช
๋ น์ ์ด ๋๋
user-ids์ค์ ์ ๊ถ์ฅํฉ๋๋ค. - ๊ธฐ๋ณธ ์ ์ฑ
์
1 bot = 1 project์ ๋๋ค. ๊ฐ์ bot token์ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์คํํ๋ฉด ์ฐจ๋จ๋ฉ๋๋ค. - bot token์ ๋ค๋ฅธ ํ๋ก์ ํธ๋ก ์ด๋ํ๋ ค๋ฉด:
telegram run --rebind-bot - telegram offset์ ํ๋ก์ ํธ๋ณ๋ก ์๋ ๋ถ๋ฆฌ๋์ด
~/.ralph-control/telegram-offsets/*.offset์ ์ ์ฅ๋ฉ๋๋ค.
์ฃผ์ ๋ช ๋ น:
/status [all|<project_id>]/doctor [all|<project_id>]/fleet [all|<project_id>]- ํ๋ฌธ ๋ฉ์์ง: ํ๋ก์ ํธ ์ปจํ
์คํธ Codex ๋ํ (์:
๊ฒฐ์ PRD ์ด์ ๋ง๋ค์ด์ค) /chat <message>: Codex ๋ํ๋ฅผ ๋ช ์์ ์ผ๋ก ์คํ/chat status,/chat reset: Codex ๋ํ ์ปจํ ์คํธ ํ์ธ/์ด๊ธฐํ- (
--allow-control์ผ ๋)/start|/stop|/restart|/doctor_repair|/recover|/retry_blocked [all|<project_id>] /doctor_repair๋ ํ์ฌ ํ๋ก์ ํธ ๊ธฐ์ค์ผ๋กrepair + recover + codex blocked ์ฌํ์ + ํ์ ์ circuit reset + daemon ์๋ ์์๊น์ง ํ ๋ฒ์ ์ํํฉ๋๋ค.- (
--allow-control์ผ ๋)/new [manager|planner|developer|qa] <title>(quick issue create, role ์๋ต ์ developer) - (
--allow-control์ผ ๋)/task <์์ฐ์ด ์์ฒญ>(canonical intake request; Codex๊ฐ role/title/objective/acceptance๋ฅผ ๊ตฌ์กฐํํด ์ด์ ์์ฑ) - (
--allow-control์ผ ๋)/prd help(๋ํํ PRD wizard + clarity refine)
PRD wizard ๋น ๋ฅธ ํ๋ฆ:
/prd start/prd refine(๋ถ์กฑํ ์ปจํ ์คํธ๋ฅผ ์ง๋ฌธ์ผ๋ก ์ฑ์)- ์คํ ๋ฆฌ ์
๋ ฅ:
title -> description -> role -> priority /prd score๋๋/prd preview/prd apply(์ ์ ๋ฏธ๋ฌ์ด๋ฉด/prd refine์ ๋)
๋ํํ ์ ๋ ฅ ํ:
- refine ์ค์ ์ง๋ฌธํ ์
๋ ฅ(
ํฌํจ ๋ฒ์๊ฐ ๋ญ์ผ?)์ ๋ณด๋ด๋ฉด ๋จ๊ณ๋ฅผ ์ ์งํ ์ฑ ์ค๋ช ์ ๋ฐํํฉ๋๋ค. - ์ถ์ฒ ์์ฒญ(
์ ์ธ ๋ฒ์ ์ถ์ฒํด์ค)์ ๋ณด๋ด๋ฉด ํ์ฌ ๋จ๊ณ ๊ธฐ์ค ์ถ์ฒ์์ ๋ฐํํฉ๋๋ค. - refine ์
๋ ฅ ์๋(
๋ต๋ณ/์ค๋ช /์ถ์ฒ)๋ Codex๊ฐ ์ฐ์ ํ๋จํฉ๋๋ค. /prd score,/prd apply์ ๊ฒ์ดํธ ์ ์๋ Codex ์ ์๋ฅผ ์ฐ์ ์ฌ์ฉํฉ๋๋ค(๋ถ๊ฐ ์ heuristic ํด๋ฐฑ).- PRD ์ธ์
์ด ํ์ฑํ๋ ์ฑํ
์์๋ ํ๋ฌธ ์
๋ ฅ์ด ์ฐ์
/prd์ธ์ ์ ๋ ฅ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
profile.local.yaml์ ์์ ํ๋ฉด ์คํ ์ค์ธ ๋ฃจํ๊ฐ ์๋์ผ๋ก ์ฌ๋ก๋ฉํฉ๋๋ค(๋ค์ loop๋ถํฐ ๋ฐ์).
์์ฃผ ์ฐ๋ ๊ฐ:
codex_model: auto
codex_home: .codex-home
codex_exec_timeout_sec: 900
codex_retry_max_attempts: 3
codex_retry_backoff_sec: 10
codex_require_exit_signal: true
codex_exit_signal: "EXIT_SIGNAL: DONE"
codex_context_summary_enabled: true
codex_context_summary_lines: 8
codex_circuit_breaker_enabled: true
codex_circuit_breaker_failures: 3
codex_circuit_breaker_cooldown_sec: 120
idle_sleep_sec: 20
inprogress_watchdog_enabled: true
inprogress_watchdog_stale_sec: 1800
inprogress_watchdog_scan_loops: 1codex_home ๊ธฐ๋ณธ๊ฐ์ ํ๋ก์ ํธ ๋ก์ปฌ ./.codex-home์
๋๋ค.
๋ก๊ทธ์ธ/์ค์ ํ์ผ(auth.json, config.toml)์ ํ์ ์ ์๋ ์๋๋ฉ๋๋ค.
๋ฐ์ ํ์ธ:
./ralph statuslast_profile_reload_at, profile_reload_count๊ฐ ์
๋ฐ์ดํธ๋ฉ๋๋ค.
Codex ๋คํธ์ํฌ ๋ฌธ์ ๊ฐ ์์ฌ๋๋ฉด:
./ralph doctornetwork:dns:chatgpt.com, network:codex-api, codex-home ์ฒดํฌ๋ฅผ ํ์ธํ์ธ์.
์ฃผ์:
supervisor_enabled,supervisor_restart_delay_sec๋ legacy compatibility ์ค์ ์ด๋ฉฐ, ๋ณ๊ฒฝ ์ primary daemon ์ฌ์์ ํ ๋ฐ์๋ฉ๋๋ค.
์ ralphctl ๋ฐ์ด๋๋ฆฌ ์ค์น ํ:
ralphctl reload- ์ฐ๊ฒฐ๋ ํ๋ก์ ํธ(ํ์ฌ ํ๋ก์ ํธ + fleet ๋ฑ๋ก ํ๋ก์ ํธ)์
./ralphwrapper๋ฅผ ์ ๋ฐ์ด๋๋ฆฌ๋ก ๊ฐฑ์ - ๊ธฐ์กด์ ์คํ ์ค์ด๋ primary daemon/telegram daemon๋ง ์๋ ์ฌ์์
- ํ์ฌ ํ๋ก์ ํธ๋ง ๋ฐ์ํ๋ ค๋ฉด:
ralphctl reload --current-only
MIT (LICENSE)
