취소 스킬 (Cancel Skill)
활성화된 OMC 모드를 감지하고 취소하는 지능형 취소 기능입니다.
취소 스킬은 모든 OMC 모드를 완료하고 종료하는 표준 방법입니다.
중지 훅(stop hook)이 작업 완료를 감지하면 LLM이 이 스킬을 호출하여
상태를 적절히 정리하도록 지시합니다. 취소가 실패하거나 중단되면
--force 플래그로 재시도하거나, 최후의 수단으로 2시간 스테일니스 타임아웃을
기다리세요.
기능 설명
어떤 모드가 활성화되어 있는지 자동으로 감지하여 취소합니다:
- 오토파일럿 (Autopilot): 워크플로를 중단하고, 재개를 위해 진행 상황을 보존합니다.
- Ralph: 지속 루프(persistence loop)를 중단합니다.
- 레거시 Ultrawork 상태: 업그레이드된 설치 환경에서만 정리용으로 제거합니다. 활성 워크플로가 아닙니다.
- UltraQA (폐기됨): 남아있는 활성 워크플로가 없습니다. 5.0.0 이전의
ultraqa-state.json이 있으면 제거합니다. - Ultragoal: 세션 범위의 ultragoal 런타임 가드(
.omc/state/.../ultragoal-state.json)를 지워서 PreToolUse/goal적용 및 Stop 강화를 해제합니다. 영구적인.omc/ultragoal/계획/원장 아티팩트는 보존됩니다. - Swarm: 조정된 에이전트 스웜을 중단하고, 할당된 작업을 해제합니다.
- Ultrapilot: 병렬 오토파일럿 워커를 중단합니다.
- Pipeline: 순차 에이전트 파이프라인을 중단합니다.
- Team: 활성 팀/대화 표면을 통해 모든 팀원에게 종료를 요청하고, 응답/타임아웃을 기다린 후 OMC 팀 상태를 지우고, 연결된 ralph가 있으면 함께 지웁니다. Claude Code 2.1.178+에는 TeamDelete가 없습니다.
- Team+Ralph (연결됨): 먼저 팀을 취소(정상 종료)한 후 ralph 상태를 지웁니다. ralph를 취소할 때도 연결된 경우 먼저 팀을 취소합니다.
사용법
/oh-my-claudecode:cancel
또는 말로: "cancelomc", "stopomc"
중요: 지연 도구 처리 (Deferred Tool Handling)
상태 관리 도구(state_clear, state_read, state_write, state_list_active,
state_get_status)는 Claude Code에 의해 **지연 도구(deferred tools)**로 등록될 수 있습니다.
어떤 상태 도구를 호출하기 전에, 반드시 ToolSearch를 통해 먼저 모든 도구를 로드해야 합니다:
ToolSearch(query="select:mcp__plugin_oh-my-claudecode_t__state_clear,mcp__plugin_oh-my-claudecode_t__state_read,mcp__plugin_oh-my-claudecode_t__state_write,mcp__plugin_oh-my-claudecode_t__state_list_active,mcp__plugin_oh-my-claudecode_t__state_get_status")
state_clear를 사용할 수 없거나 실패하면, 다음 bash 대체 명령어를 중지 훅 루프에서 비상 탈출용으로 사용하세요. 이는 취소 흐름을 완전히 대체하는 것이 아닙니다. 단지 상태 파일을 제거하여 세션 차단을 해제하는 것뿐입니다. 연결된 활성 모드(예: autopilot→ralph)는 각 모드마다 대체 명령어를 한 번씩 실행하여 별도로 지워야 합니다.
MODE를 특정 모드(예: ralplan, ralph, ultrawork, ultragoal)로 바꾸세요.
경고: autopilot 또는 omc-teams에는 이 대체 명령어를 사용하지 마십시오. 오토파일럿은 재개 데이터를 보존하기 위해 state_write(active=false)가 필요합니다. omc-teams는 파일 삭제만으로는 처리할 수 없는 tmux 세션 정리가 필요합니다.
# 대체 명령어: state_clear MCP 도구를 사용할 수 없을 때 직접 파일 제거
SESSION_ID="${CLAUDE_SESSION_ID:-${CLAUDECODE_SESSION_ID:-}}"
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || { d="$PWD"; while [ "$d" != "/" ] && [ ! -d "$d/.omc" ]; do d="$(dirname "$d")"; done; echo "$d"; })"
# 크로스 플랫폼 SHA-256 (macOS: shasum, Linux: sha256sum)
sha256portable() { printf '%s' "$1" | (sha256sum 2>/dev/null || shasum -a 256) | cut -c1-16; }
# 상태 디렉토리 확인 (OMC_STATE_DIR 중앙 저장소 지원)
if [ -n "${OMC_STATE_DIR:-}" ]; then
# worktree-paths.ts의 getProjectIdentifier() 미러링
SOURCE="$(git remote get-url origin 2>/dev/null || echo "$REPO_ROOT")"
HASH="$(sha256portable "$SOURCE")"
DIR_NAME="$(basename "$REPO_ROOT" | sed 's/[^a-zA-Z0-9_-]/_/g')"
OMC_STATE="$OMC_STATE_DIR/${DIR_NAME}-${HASH}/state"
[ ! -d "$OMC_STATE" ] && { echo "ERROR: State dir not found at $OMC_STATE" >&2; exit 1; }
elif [ "$REPO_ROOT" != "/" ] && [ -d "$REPO_ROOT/.omc" ]; then
OMC_STATE="$REPO_ROOT/.omc/state"
else
echo "ERROR: Could not locate .omc state directory" >&2
exit 1
fi
MODE="ralplan" # <-- 대상 모드로 바꾸세요
# 특정 모드의 세션 범위 상태 지우기
if [ -n "$SESSION_ID" ] && [ -d "$OMC_STATE/sessions/$SESSION_ID" ]; then
rm -f "$OMC_STATE/sessions/$SESSION_ID/${MODE}-state.json"
rm -f "$OMC_STATE/sessions/$SESSION_ID/${MODE}-stop-breaker.json"
rm -f "$OMC_STATE/sessions/$SESSION_ID/skill-active-state.json"
# 중지 훅이 취소 진행 중임을 감지하도록 취소 신호 쓰기
NOW_ISO="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
EXPIRES_ISO="$(date -u -d "+30 seconds" +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || python3 - <<'PY'\nfrom datetime import datetime, timedelta, timezone\nprint((datetime.now(timezone.utc) + timedelta(seconds=30)).strftime('%Y-%m-%dT%H:%M:%SZ'))\nPY\n)"
printf '{"active":true,"requested_at":"%s","expires_at":"%s","mode":"%s","source":"bash_fallback"}' \
"$NOW_ISO" "$EXPIRES_ISO" "$MODE" > "$OMC_STATE/sessions/$SESSION_ID/cancel-signal-state.json"
fi
# 세션 ID가 없을 때만 레거시 상태 지우기 (다른 세션 상태를 지우지 않도록)
if [ -z "$SESSION_ID" ]; then
rm -f "$OMC_STATE/${MODE}-state.json"
fi
자동 감지 (Auto-Detection)
/oh-my-claudecode:cancel은 세션 인식 상태 계약(session-aware state contract)을 따릅니다:
- 기본적으로 명령어는
state_list_active및state_get_status를 통해 현재 세션을 검사하고,.omc/state/sessions/{sessionId}/…에서 활성화된 모드를 찾습니다. - 세션 ID가 제공되었거나 이미 알려진 경우, 해당 세션 범위 경로가 권위를 갖습니다. 세션 ID가 없거나 비어 있는 경우에만 레거시 파일(
.omc/state/*.json)을 호환성 대체 수단으로 참조합니다. - Swarm은 공유 SQLite/마커 모드(
.omc/state/swarm.db/.omc/state/swarm-active.marker)이며 세션 범위가 아닙니다. - 기본 정리 흐름은 세션 ID와 함께
state_clear를 호출하여 해당 세션 파일만 제거합니다. 모드는 원래 세션에 바인딩된 상태로 유지됩니다.
활성 모드는 다음 종속성 순서대로 취소됩니다:
- 오토파일럿 (연결된 ralph 및 폐기된 상태 정리 포함)
- Ralph
- 레거시 Ultrawork/UltraQA 상태 정리
- Ultragoal (독립 실행형 런타임 가드 —
state_clear(mode="ultragoal"); 영구.omc/ultragoal/아티팩트는 보존) - Swarm (독립 실행형)
- Ultrapilot (독립 실행형)
- Pipeline (독립 실행형)
- Team (Claude Code 기본 기능)
- OMC Teams (tmux CLI 워커)
- 계획 합의 (Plan Consensus, 독립 실행형)
- 자체 개선 (Self-Improve, 독립 실행형 — 상태 지우기, 고아 worktree 정리, 재개를 위한 iteration_state 보존, 해결된
<self-improve-root>/state/agent-settings.json에 상태를 "user_stopped"로 설정; 새 실행은.omc/self-improve/topics/<topic-slug>/를 사용하며, 평면.omc/self-improve/는 레거시 단일 트랙 재개용으로만 유지)
강제 전체 지우기 (Force Clear All)
워크스페이스를 완전히 초기화해야 하는 경우, --force 또는 --all을 사용하여 모든 세션과 레거시 아티팩트를 지우십시오.
/oh-my-claudecode:cancel --force
/oh-my-claudecode:cancel --all
내부 단계:
state_list_active가.omc/state/sessions/{sessionId}/…을 열거하여 알려진 모든 세션을 찾습니다.state_clear가 세션당 한 번씩 실행되어 해당 세션의 파일을 삭제합니다.session_id없이 전역state_clear를 실행하면.omc/state/*.json,.omc/state/swarm*.db아래의 레거시 파일과 호환성 아티팩트(목록 참조)를 제거합니다.- 팀 아티팩트(
~/.claude/teams/*/,~/.claude/tasks/*/,.omc/state/team-state.json)는 레거시 대체 수단으로 최선을 다해 지워집니다.- 기본 팀에 대한 취소는 omc-teams 상태에 영향을 주지 않으며, 그 반대도 마찬가지입니다.
모든 state_clear 명령어는 session_id 인수를 따르므로, 강제 모드에서도 레거시 파일을 삭제하기 전에 먼저 세션 인식 경로를 사용합니다.
레거시 호환성 목록 (--force/--all에서만 제거):
.omc/state/autopilot-state.json.omc/state/ralph-state.json.omc/state/ralph-plan-state.json.omc/state/ralph-verification.json.omc/state/ultrawork-state.json.omc/state/ultraqa-state.json.omc/state/swarm.db.omc/state/swarm.db-wal.omc/state/swarm.db-shm.omc/state/swarm-active.marker.omc/state/swarm-tasks.db.omc/state/ultrapilot-state.json.omc/state/ultrapilot-ownership.json.omc/state/pipeline-state.json.omc/state/omc-teams-state.json.omc/state/plan-consensus.json.omc/state/ralplan-state.json.omc/state/boulder.json.omc/state/hud-state.json.omc/state/subagent-tracking.json.omc/state/subagent-tracker.lock.omc/state/rate-limit-daemon.pid.omc/state/rate-limit-daemon.log.omc/state/checkpoints/(디렉토리).omc/state/sessions/(세션 정리 후 빈 디렉토리 정리)
구현 단계
이 스킬을 호출할 때:
1. 인수 파싱 (Parse Arguments)
# --force 또는 --all 플래그 확인
FORCE_MODE=false
if [[ "$*" == *"--force"* ]] || [[ "$*" == *"--all"* ]]; then
FORCE_MODE=true
fi
2. 활성 모드 감지 (Detect Active Modes)
이제 이 스킬은 하드코딩된 파일 경로 대신 세션 인식 상태 계약에 의존합니다:
state_list_active를 호출하여.omc/state/sessions/{sessionId}/…을 열거하고 모든 활성 세션을 찾습니다.- 각 세션 ID에 대해
state_get_status를 호출하여 실행 중인 활성 모드와 종속 모드가 있는지 확인합니다. Ultrawork 레코드는 폐기된 정리 입력으로만 처리합니다. session_id가/oh-my-claudecode:cancel에 제공된 경우 레거시 대체를 완전히 건너뛰고 해당 세션 경로 내에서만 작동합니다. 그렇지 않으면 상태 도구가 활성 세션이 없다고 보고할 때만.omc/state/*.json의 레거시 파일을 참조합니다. Swarm은 세션 범위 밖의 공유 SQLite/마커 모드로 유지됩니다.- 이 문서의 모든 취소 로직은 상태 도구를 통해 발견된 종속성 순서(autopilot → ralph → …)를 따릅니다.
3A. 강제 모드 (Force Mode, --force 또는 --all인 경우)
state_clear를 통해 모든 세션과 레거시 아티팩트를 지우려면 강제 모드를 사용하십시오. 직접 파일 제거는 상태 도구가 활성 세션이 없다고 보고할 때 레거시 정리용으로 예약됩니다.
3B. 스마트 취소 (Smart Cancellation, 기본값)
팀이 활성화된 경우 (Claude Code 암시적 팀)
팀은 OMC 팀 상태를 통해 감지되며, 제거된 Claude Code ~/.claude/teams 설정 디렉토리는 사용되지 않습니다:
# 활성 OMC 팀 상태 확인
state_read(mode="team")
2단계 취소 프로토콜:
1단계: 정상 종료 (Graceful Shutdown)
활성 OMC 팀 상태:
1. OMC 상태/핸드오프/작업 장부에서 team_name 및 워커 레이블 읽기
2. 각 활성 팀원에 대해:
a. 활성 대화/팀 메시징 표면을 통해 이름이 지정된 팀원에게 질문 또는 알림
b. shutdown_response를 최대 15초 기다림
c. 응답 수신: 구성원 응답으로 표시
d. 타임아웃: 구성원을 응답 없음으로 표시하고 다음으로 진행
3. 로그: "정상 종료 단계: X/Y 구성원 응답"
2단계: 조정 (Reconciliation)
정상 종료 단계 후:
1. 아직 처리 중일 수 있는 응답 없는 팀원을 위해 5초 더 기다림
2. 취소 보고서에 남은 응답 없는 팀원 기록
3. TeamDelete 호출하지 않음; Claude Code 2.1.178+는 팀별 기본 정리를 제거함
OMC 상태 정리:
1. 팀 상태 지우기: state_clear(mode="team")
2. 연결된 ralph 확인: state_read(mode="ralph") — linked_team이 true인 경우:
a. ralph 상태 지우기: state_clear(mode="ralph")
3. 레거시 `omc team` / `/omc-teams` 워커에 대해서만 OMC tmux/CLI 고아 검사 실행 (아래 참조)
4. 구조화된 취소 보고서 출력
고아 감지 (정리 후):
레거시 OMC tmux/CLI 워커 실행의 경우, 워커 프로세스가 남아 있는지 확인합니다:
node "${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-orphans.mjs" --team-name "{team_name}"
고아 스캐너:
- OMC 워커 프로세스에 대해
ps aux(Unix) 또는tasklist(Windows)를 확인하여--team-name이 정리된 팀과 일치하는지 확인 - SIGTERM 전송, 5초 대기, 여전히 살아 있으면 SIGKILL 전송
- 정리 결과를 JSON으로 보고
--dry-run을 사용하여 종료하지 않고 검사만 할 수 있습니다. 스캐너는 여러 번 실행해도 안전합니다.
구조화된 취소 보고서:
팀 "{team_name}" 취소됨:
- 신호 보낸 구성원: N
- 응답 수신: M
- 응답 없음: K (있는 경우 이름 목록)
- OMC 상태 지워짐: 예/아니오
- 수동 정리 필요: 예/아니오
경로: OMC 팀 상태 / tmux 워커 프로세스 (있는 경우)
구현 참고 사항: 취소 스킬은 bash 스크립트가 아닌 LLM에 의해 실행됩니다. 활성 팀을 감지하면:
state_read(mode="team")를 읽어 활성 OMC 팀 찾기- 상태, 핸드오프 또는 작업 장부에서 활성 이름이 지정된 팀원 식별
- 각 팀원에 대해 활성 대화/팀 메시징 표면을 통해 이름이 지정된 팀원에게 질문 또는 알림
- 종료 응답을 잠시 기다림 (구성원당 15초 타임아웃)
- 조정 대기 후 응답 없는 팀원 기록
- 팀 상태 지우기:
state_clear(mode="team", session_id) - 사용자에게 구조화된 요약 보고
오토파일럿이 활성화된 경우
오토파일럿은 자체적인 기본-우선 정리를 처리합니다: 명명된 워크플로는 연결된 ralph 및 폐기된 ultraqa 정리 전에 자신의 세션이 소유한 중첩 ralplan 적용 상태만 추가로 제거합니다.
state_read(mode="autopilot", session_id)를 통해 오토파일럿 상태를 읽어workflowRunId가 있을 때 이를 포함한 정확한 현재 실행을 캡처합니다.- 좁은 변형
state_write(mode="autopilot", session_id, active=false, state={workflowRunId: "<정확한 실행 ID>"})로 해당 정확한 실행을 일시 중지합니다. 상태 읽기 값을 재생하거나 복사하지 마십시오. Linux의flock에서 도구는 변형 잠금 아래에서 보유된 실행 및 워크플로 무결성을 재검증한 후active만false로 변경합니다. 워크플로, 파이프라인 추적 및 작업 ID를 보존합니다.target_state_sha256은 현재 직렬화된 상태의 정확한 SHA-256인 경우에만 포함될 수 있습니다.- 이 쓰기가 실패하면 즉시 중단하십시오. 중첩된 ralplan, 연결된 상태, 취소 신호 또는 런타임 아티팩트를 지우지 마십시오.
- 명명된 워크플로의 경우, 동일한
session_id가 소유한ralplan상태만 지우십시오. 다른 세션의 독립 실행형 ralplan 상태는 절대 지우지 마십시오. 실패를 기록하되 일시 중지된 기본 실행은 재개 가능하게 유지하십시오. - 기본 일시 중지가 커밋된 후에만
state_read(mode="ralph", session_id)로 연결된 ralph를 확인하십시오.linked_autopilot이 true이면 ralph 상태를state_clear(mode="ralph", session_id)로 지우십시오. 연결된 ralph가 없으면 이 단계를 건너뛰십시오. - 연결된 상태 정리 후: 같은 session_id 아래의 폐기된 ultraqa 아티팩트를 확인하십시오. 존재하면
state_clear(mode="ultraqa", session_id)를 실행하십시오. (UltraQA는 상태만 정리 가능한 모드이며, 활성 워크플로가 없습니다.) - 모든 관련 취소 신호 파일(session-scoped
*-stop-breaker.json,skill-active-state.json)을 같은 session_id로 지우십시오.
실패에 대한 특별 참고 사항:
state_write가active=false시도를 거부하면(예: 다른 run_id가 잠금을 소유함), 경고를 표시하고 재정의하지 마십시오. 기본 상태를 그대로 두고 계속 진행하거나 중단하십시오.- ralph 정리는 기본 일시 중지에 실패한 경우 절대 실행되지 않습니다.
session_id없이 작업할 때(레거시 상태 경로를 통한 자동 감지 모드): 오토파일럿 정리는tar-기반 백업 파일을 지원하지 않습니다. 스냅샷 또는 중간 상태 읽기가 전혀 없습니다. 좁은state_write(active=false)가 취소의 유일한 진입점입니다.
Ralph가 활성화된 경우
state_read(mode="ralph")를 통해 ralph 상태를 읽습니다.linked_team이 true이면 ralph 취소 전에 팀 취소 단계를 실행하십시오(위의 "팀이 활성화된 경우" 참조).linked_autopilot이 true이면 오토파일럿 취소 단계를 실행하십시오(위 참조).state_clear(mode="ralph", session_id)를 호출합니다.- 세션이
ralplan상태를 소유한 경우state_clear(mode="ralplan", session_id)를 호출합니다.
구현 참고 사항: LLM은 이 단계를 순서대로 실행합니다. 이는 bash 파이프 명령어가 아닙니다. 오토파일럿이 활성화된 경우 ralph 취소 단계에 도달하기 전에 오토파일럿 취소 단계를 완전히 완료하십시오.
Ultragoal이 활성화된 경우
state_read(mode="ultragoal", session_id)를 통해 ultragoal 상태를 읽습니다.state_clear(mode="ultragoal", session_id)를 호출합니다. 이렇게 하면 세션 범위.omc/state/.../ultragoal-state.json런타임 가드가 제거되어/goal적용 및 Stop 강화가 해제됩니다..omc/ultragoal/아래의 영구 계획/원장 아티팩트는 건드리지 않습니다.- (선택 사항) 준비가 되면 사용자에게 영구 초점 영역(
.omc/ultragoal/...)을 다음 실행을 위해 보존 중임을 알립니다.
Swarm이 활성화된 경우
- Swarm 상태를 읽습니다(
state_read(mode="swarm")). Swarm 모드는 세션 범위가 아닙니다(공유 SQLite/마커). state_clear(mode="swarm")를 호출하여 공유 Swarm 상태(SQLite db, marker)를 지웁니다.- 스웜에서 작업을 수동으로 해제할 필요가 없습니다.
state_clear가 정리를 처리합니다.
Ultrapilot이 활성화된 경우
state_read(mode="ultrapilot", session_id)를 통해 ultrapilot 상태를 읽습니다.state_clear(mode="ultrapilot", session_id)를 호출합니다.
Pipeline이 활성화된 경우
state_read(mode="pipeline", session_id)를 통해 pipeline 상태를 읽습니다.state_clear(mode="pipeline", session_id)를 호출합니다.
Plan Consensus가 활성화된 경우
state_read(mode="plan-consensus", session_id)를 통해 Plan Consensus 상태를 읽습니다.state_clear(mode="plan-consensus", session_id)를 호출합니다.
자체 개선이 활성화된 경우 (Self-Improve)
state_read(mode="self-improve", session_id)를 통해 자체 개선 상태를 읽습니다.state_clear(mode="self-improve", session_id)를 호출하여 세션 범위 상태를 지웁니다.- 고아 worktree 정리:
selfImproveRoot가state_get_status에 의해 반환되면 다음을 사용하십시오:ls "${selfImproveRoot}/state/"*.worktree-name 2>/dev/null | while read f; do wt=$(cat "$f") git worktree remove "$wt" 2>/dev/null && rm -f "$f" done - 재개를 위한
iteration_state는 그대로 둡니다. state/agent-settings.json에서 상태를"user_stopped"로 설정합니다. 파일이 없으면 생성하지 마십시오.- 사용자에게 세션 범위 상태가 지워졌고 이터레이션 상태가 재개를 위해 보존되었음을 알립니다.
폐기된 모드(레거시 Ultrawork/UltraQA만 해당)
이러한 폐기된 모드는 활성 워크플로를 포함하지 않습니다. 확인하되 정리하지 마십시오. ultrawork/ultraqa 파일이 있으면 무시하고 사용자에게 업그레이드가 완료되었음을 알립니다.
연결된 모드 처리
현재 연결은 autopilot→ralph 및 team→ralph로 제한됩니다. LLM은 항상 먼저 기본 모드를 정리한 후 연결된 모드를 확인합니다.
- 오토파일럿 취소는 ralph가 연결된 경우
state_clear(mode="ralph")를 자동으로 호출합니다. - 팀 취소는 ralph가 연결된 경우
state_clear(mode="ralph")를 자동으로 호출합니다. - Ralph는 먼저 기본 오토파일럿/팀 정리를 트리거하지 않고 독립 실행형으로 정리되지 않습니다.
취소 중에 연결된 모든 모드가 함께 정리됩니다. 연결된 모드 체인이 더 긴 경우(예: autopilot→ralph→team은 현재 문서화되지 않음), 취소는 발견되는 대로 처리합니다.
4. 취소 확인 (Cancellation Confirmation)
취소 후, 확인을 위해 state_get_status를 호출하십시오. 활성 상태가 없어야 합니다. 활성 모드가 여전히 보고되면 각각에 대해 state_clear를 다시 시도하거나 최종 state_clear(session_id="__all__")로 폴백하십시오.
보안 참고 사항
취소 스킬은 LLM이 실행하는 대화형 작업입니다. FIM(채우기-중간 모드) 또는 claude_code_agent_operation 도구(자동화) 중에는 절대 실행되지 않습니다. MCP 상태 도구를 사용할 수 없는 비상 탈출 bash 대체 명령어는 SESSION_ID에 대해 CLAUDE_SESSION_ID 및 CLAUDECODE_SESSION_ID 환경 변수를 읽습니다. 공유 환경(예: CI/CD)에서는 의도하지 않은 세션 ID 충돌을 방지하기 위해 이러한 변수가 특정 실행으로만 범위가 지정되었는지 확인하십시오.
스테일니스 타임아웃 (Staleness Timeout)
state_clear가 계속 실패하면 중지 훅은 궁극적으로 2시간 스테일니스 타임아웃을 트리거합니다. 타임아웃에 도달하면 시스템은 모든 .omc/state/sessions/ 디렉토리를 안전하게 제거할 수 있다고 가정합니다. 타임아웃에 의존하는 것은 스테일니스 임계값에 도달할 때까지 Claude Code가 활성화되어 있어야 하므로 권장되지 않습니다.
문제 해결
- "state_clear 도구를 찾을 수 없음": ToolSearch 지연 로딩 섹션을 참조하여 먼저 로드하십시오.
- "state_clear 실패": MCP 시간 초과? 도구를 다시 로드하고 재시도하십시오. 계속 실패하면 bash 대체 명령어를 사용하고
--force로 재시도하십시오. - "취소가 활성 모드를 감지하지 못함":
state_get_status를 사용하여 시스템 상태를 확인하십시오.state_list_active를 호출하여 활성 세션이 있는지 확인하십시오. - "취소 후에도 오토파일럿이 계속 실행됨":
state_write(active=false)를 다시 호출하고 전달된workflowRunId를 확인하십시오. 새 실행을 시작하기 전에 이전 run_id가 항상 지워져야 합니다. 수동으로 확인하려면state_read(mode="autopilot", session_id)를 호출하고 반환된state의 내용을 검사하십시오.