Skip to content

fix(crush): 비대화형 경로에서 question 도구 숨김 - #934

Merged
jinon86 merged 1 commit into
mainfrom
fix/crush-deny-question
Aug 4, 2026
Merged

fix(crush): 비대화형 경로에서 question 도구 숨김#934
jinon86 merged 1 commit into
mainfrom
fix/crush-deny-question

Conversation

@jinon86

@jinon86 jinon86 commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

성격 정정 (2026-08-04)

이 PR은 비대화형 경로 강화이며, 방통 Processing failed: tool_use의 수정은 아닙니다. 해당 실패의 근본 원인은 crush의 중간 finish reason tool_use_FINISH_OK에 없던 것으로 PR #935가 수정합니다. question deny 자체는 대화형 도구가 응답 경로 없는 헤드리스·브릿지에서 호출되는 것을 막는 유효한 강화로 유지합니다.

변경

  • crush/crushrc.readonly: deny 목록에 question 추가 + 주석
  • docs/crush-harness.md: 비대화형 경로에서 question deny 권고 + 사례 기록
  • 방통·soonwook 라이브 ~/.config/crush/crushrc에도 deny 적용 (노드 로컬)

테스트: headless.test.sh 11/11 통과.

🤖 Generated with Claude Code

- crushrc.readonly: permissions deny에 question 추가 — 대화형 question 도구는
  헤드리스·텔레그램 브릿지에 응답 경로가 없어, 모델이 부륩면 턴 전체가 실패
  (방통 브릿지 k3 2개 질문 배치 후 'Processing failed: tool_use', 2026-08-04)
- docs: question deny 필수화와 사례 기록
- 방통·soonwook 라이브 crushrc에도 deny 적용 완료(노드 로컬)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@seoseo-ai seoseo-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved after explicit operator authorization using the local seoseo-ai credential.

@jinon86
jinon86 merged commit 2fd2903 into main Aug 4, 2026
8 checks passed
@jinon86
jinon86 deleted the fix/crush-deny-question branch August 4, 2026 09:55
jinon86 added a commit that referenced this pull request Aug 4, 2026
* fix(crush): bridge 레인에 owner-operator 권한 설정을 준다 (#940 정정)

#940 에서 bridge 가 crush 설정을 못 읽는 문제를 고치면서 레포의
crush/crushrc.readonly 를 물렸다. 그 파일은 이름 그대로 **agent-cron
비대화형 러너용**이고 bash/edit/write 를 막는다.

그래서 owner 봇이 셸을 못 쓰게 됐다. dungae 실사용:

  "Crush 환경에서 bash 도구가 비활성화되어 있어 직접 셸 명령을 실행할 수
   없습니다"

정작 그 레인의 실제 정책은 반대다(dungae 실측):

  execution_profile=owner-operator  bash_policy=auto-approve  host_scope=true

같은 정책에서 Codex 레인은 approval=never + sandbox=dangerFullAccess 를
받는다(bot_access.py `_codex_approval_policy`/`_codex_sandbox_policy`).
crush 만 읽기 전용으로 두면 프로바이더를 바꿨을 때 능력이 줄어든다.

crushrc.bridge 를 추가하고 crush_runtime 의 기본값을 그리로 옮긴다.
provider/model 정의는 동일하고 permissions 만 다르다 — question 만 막는다
(bridge 에 응답 경로가 없어 모델이 쓰면 턴 전체가 실패한다, #934).

안전장치는 유지된다: crush 의 permission 요청은 여전히 `_decide_permission`
-> bridge approval handler 로 가고 운영자의 bash_policy 가 판단한다
(auto-approve=허용, approve-each=매번 확인, 그 외=거부). 이 파일은 무엇을
제안할 수 있는가를 정할 뿐 실행 여부는 bridge 정책이 정한다.

실측: crushrc.bridge 로 26개 전체 도구 노출(bash/edit/write/download 포함),
question 없음. crushrc.readonly 는 그대로 22개.
※ permissions 는 나중 줄이 이기지 않는다 — deny 뒤에 allow 를 붙여도
   뒤집히지 않아서 파일 분리가 필요했다(실측).

테스트 4건 추가: bridge 는 셸 도구를 막지 않고 question 은 막는다 /
readonly 는 여전히 전부 막는다 / 두 파일의 provider 정의가 동일하다
(드리프트 가드) / 런타임 기본값이 crushrc.bridge 다.
전체 스위트 2238 passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(crush): auto-approve 노드에서 crush 도구를 미리 허용한다 (never 동등)

앞 커밋은 도구를 열어줬지만 승인 왕복은 남겼다. 실측해 보니 crush 는
도구마다 다르게 굴었다(dungae, 2026-08-04, DENY 핸들러로 확인):

  bash(echo)  crush 가 묻지 않고 실행
  write       crush 가 승인을 요청 -> 거부되니 파일도 안 생기고 출력도
              비었는데 **에러는 없다**(조용한 실패)

그 왕복에는 실패 경로가 하나 더 있다 — `_decide_permission` 은
`turn_ready` 를 5초 기다리고 타임아웃이면 DENY 한다. 부하가 걸리면
승인될 도구가 조용히 거부될 수 있다.

Codex 는 같은 정책에서 approval=never 를 받아 아예 묻지 않는다. crush 도
같은 자리에 두려면 왕복 자체를 없애야 한다.

crushrc 에 박지 않고 bash_policy 에서 파생시킨다 — 파일에 allow 를 적으면
approve-each 로 조여도 crush 가 묻지 않아 가로챌 수 없다. 정책은 한
곳에서만 나와야 한다.

  auto-approve  -> permissions allow <26개 도구> 를 스테이징 시 덧붙임
  approve-each  -> 덧붙이지 않음. crush 가 묻고 bridge 가 매번 확인
  그 외         -> 덧붙이지 않음. crush 가 묻고 bridge 가 거부

question 은 어느 경우에도 허용 목록에 없다.

실측(preapprove_tools=True, DENY 핸들러):
  승인요청 없음 · 파일 생성 True 'WROTE-5521' · OUTPUT 'WROTE-5521'

전체 스위트 2239 passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style(bridge): ruff 위반 수정 (E741/F541)

애매한 변수명 l -> line, 플레이스홀더 없는 f-string 제거.
로컬에서 pytest 만 돌리고 ruff 를 안 돌려 CI python-lint 에서 잡혔다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: jinon86 <247078695+jinon86@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants