- name
- confirm-the-premise-before-offering-the-choice
- description
- 사용자에게 선택지를 제시하기 전에, 그 선택지가 실제로 무엇을 하는지 코드로 확인하라. 인수인계·설계문서·백로그 문장을 근거로 질문을 만들면 사용자가 틀린 전제 위에서 결정하게 되고, 그 결정은 되돌릴 수 없다(사람은 이미 골랐다). 코드 작성 전 검증보다 **질문 전 검증**이 먼저다. 트리거 - AskUserQuestion 으로 옵션 제시, "A 하면 B 가 됩니다" 형태의 설명, 문서를 인용해 결정을 요청, 되돌릴 수 없는 작업의 승인 요청.
- version
- 1.0.0
- task_types
- ["workflow","design","review"]
- triggers
- [{"pattern":"사용자에게 선택지를 제시하기 직전 (AskUserQuestion 등)"},{"pattern":"'X 하면 Y 가 실증된다' 처럼 인과를 주장하며 승인을 요청할 때"},{"pattern":"인수인계/설계문서/백로그의 문장을 근거로 결정을 요청할 때"}]
- category
- trap
# 선택지를 드리기 전에 전제를 코드로 확인하라
## Problem
`verify-handoff-claims-against-code-before-building` 은 **짓기 전에** 확인하라고 한다.
그런데 더 앞에 있는 관문이 있다 — **묻기 전에.**
BSVibe 2026-08-20. 인수인계에 이렇게 적혀 있었다:
> pending Safe Mode 4건을 해소하는 것이 #782·#784 실증의 **유일한 열쇠**다.
그 문장을 근거로 사용자에게 세 선택지를 드렸고, 사용자는 *"제가 전부 discard 로 정리"* 를
골랐다. 그 **뒤에** 코드를 읽었다:
```python
if flipped and reason_text: # ← 사유가 비면 아래가 통째로 안 돈다
await self._record_rejection_knowledge(...) # settle → 볼트 (= #784 실증 경로)
await self._reopen_run_with_the_reason(...) # 런 재개 (= #782 실증 경로)
```
즉 실제 갈림길은 내가 제시한 것과 **다른 모양**이었다:
| | settle/재개 | 볼트 오염 |
|---|---|---|
| 사유 비움 | **안 일어남** | 없음 |
| 사유 채움 | 일어남 | **영구 negative knowledge** |
사용자는 "정리하면 실증된다"는 전제로 골랐는데, 고른 대로 하면 **실증이 안 된다.**
prod 실측이 확인했다: settle 활동 **0건**, 지표 불변.
- 증상: 결정을 받아 실행한 뒤 "그런데 이게 원래 목적을 달성하지 못한다"를 뒤늦게 발견.
- 근본 원인: 질문의 **인과 주장**("A 하면 B 가 된다")을 문서에서 복사했고, 그 인과가
코드에 없었다.
- 왜 더 나쁜가: 코드는 다시 짜면 되지만 **사람의 결정은 되돌릴 수 없다.** 이미 골랐고,
그 선택은 틀린 세계관 위에서 이뤄졌다. 사용자의 시간과 신뢰를 쓴 것이 헛돈다.
## Solution
### 1. 질문에 담긴 **인과 주장**을 목록으로 뽑아라
질문 초안에서 "~하면 ~된다", "~가 유일한 방법이다", "~하지 않으면 ~가 안 된다"를 전부
찾아라. 각각이 **검증해야 할 명제**다.
### 2. 각 명제를 코드에서 확인하라 — 특히 **조건문**
가장 자주 틀리는 자리는 "이 동작이 일어나긴 하나"가 아니라 **"어떤 조건에서 일어나나"** 다.
호출부만 보고 끝내지 말고 그 안의 가드를 읽어라.
```bash
grep -n "def deny" -A 40 backend/.../safe_mode_queue.py # 호출만이 아니라 가드까지
```
### 3. 되돌릴 수 없는 축을 표로 만들어 질문에 **함께** 넣어라
선택지의 설명이 아니라 **결과의 비대칭**을 보여줘라. 위 예에서 사용자가 알아야 했던 것은
"어느 쪽이 편한가"가 아니라 "**실증을 얻으려면 영구 오염을 감수해야 한다**"였다.
### 4. 물은 뒤에 전제가 틀린 걸 알았다면 — 실행 전에 **정정부터**
정정은 사과가 아니라 **정보 갱신**이다. 새 사실 → 갈림길이 어떻게 달라졌는지 → 내가 어느
쪽으로 갈지와 그 이유. 그러고 나서 실행하고, 결과를 실측으로 보고하라.
```
"제 질문의 전제가 틀렸습니다. 코드는 X 조건에서만 Y 를 합니다.
그래서 고르신 쪽으로 하면 Z 는 달성되지 않습니다.
인수인계가 경고한 쪽(영구 오염 금지)을 따라 A 로 진행하고, 실측으로 확인하겠습니다."
```
### 5. 전제가 문서에서 왔으면 **문서도 고쳐라**
같은 문장이 다음 세션에서 같은 잘못된 질문을 만든다. 인수인계·설계문서의 그 줄을 실측 결과로
교체하고, "왜 틀렸는지"를 남겨라.
## Verification
선택지를 제시하기 전 체크:
- [ ] 질문 안의 모든 "~하면 ~된다"를 코드에서 확인했다 (조건문까지)
- [ ] 되돌릴 수 없는 결과(영구 기록·외부 전송·삭제)를 선택지 설명에 **명시**했다
- [ ] 어느 선택지도 원래 목적을 달성 못 한다면, 그 사실 자체를 먼저 보고했다
- [ ] 전제의 출처가 문서라면, 그 문서를 고칠 계획이 있다
## Related
- `verify-handoff-claims-against-code-before-building` — 짓기 전 검증(이 스킬의 다음 단계)
- `absence-measurement-validity-check` — "안 일어난다"고 결론짓기 전 프로듀서 확인
- `diagnostic-call-must-be-read-only` — 진단하려고 친 쓰기가 지식을 오염시킨다
Auf GitHub ansehen