남윤서AX 사업개발 · 사업관리

A02

고객 진단 스펙

페인 1건만 있으면 시작하는, 원문·해석·근거·확신도가 분리된 고객 진단 포맷.

형식
템플릿
붙이는 곳
프로젝트 docs/ 에 저장하고 에이전트에게 참조시킴
분량
144줄
업무 단계
고객 진단
버전
v0.1 · 2026. 8. 10.

언제 쓰나

  • 선제안 단계로 고객 정보가 부족한 상태에서 다음 미팅 질문지를 작성해야 할 때
  • 미팅이 3~4회 이어지며 초기 해석이 번복됐으나 번복 사유가 기록되지 않을 때
  • 하나의 고객 건을 여러 담당자가 분담하여 확인된 정보의 범위를 맞춰야 할 때

안 쓰는 경우

RFP나 요구사항정의서로 요구가 확정된 건에는 적합하지 않습니다. 확정된 요구를 원문·해석으로 재분해하면 재구조화 비용만 발생합니다. 해당 경우에는 A06(요구 해체)을 사용합니다.

입력

최소 입력은 고객 페인 1건입니다. 미팅 메모 한 줄이나 영업 전달 사항 한 건으로도 착수할 수 있습니다. 나머지 필드를 비워두면 가정 배지가 부여되며, 배지 목록이 다음 미팅의 질문지가 됩니다.

사용법

  1. 전문을 프로젝트의 docs/DIAGNOSIS-SPEC.md 로 저장합니다.
  2. 페인 1건을 items 에 넣고 §6 최소 예시 형태로 채웁니다. 확인되지 않은 칸은 비워둡니다.
  3. 에이전트에게 "이 스펙에 맞춰 진단을 갱신하고, 확인이 필요한 질문 목록을 뽑아줘"라고 지시합니다.

본문

144줄
<!-- 고객 진단 스펙 v0.1 · https://namtank96.github.io/assets/a02-diagnosis -->

# 고객 진단 스펙

고객의 페인·현황·요구를 **원문과 해석을 분리한 채** 축적하는 포맷.
선제안·컨설팅 초기처럼 정보가 부족한 상태에서 시작해, 미팅을 거치며 채워 나가는 것을 전제로 한다.

## 0. 담는 것 / 담지 않는 것

- 담는다: 고객이 실제로 한 말, 그 말에 대한 우리 해석과 근거, 해석이 바뀐 궤적, 확인해야 할 질문.
- 담지 않는다: 최종 제안서 문장, 화면 설계, 견적 로직. 전부 이 문서에서 **파생**되는 산출물이고, 여기 저장하지 않는다.

## 1. 최소 입력 = 페인 1건

나머지는 전부 선택이다. 못 채워서 시작을 못 하는 것보다, 얕게라도 시작해 미팅에서 채우는 게 낫다.
빈 곳은 삭제하지 말고 **가정 배지**를 붙여 남긴다. 무엇을 모르는지가 곧 다음 미팅의 질문지다.

| 항목 | 최소 입력 시 |
|---|---|
| `pain` | **필수 (1건 이상).** 페인이 없으면 이후 모든 산출물의 근거가 없다 |
| `need` | 권장. pain에서 도출 가능 |
| `goal` | 권장. 없으면 "pain 해소"로 가정 |
| `currentData` / `currentSystem` | 선택. 있으면 정밀해짐 |
| `cost` | 선택 |
| `gap` | **입력하지 않는다.** 계산되는 것이다 (§4) |

## 2. 구조

```yaml
meta:
  id: dg-001
  customer: "{고객}"          # 익명 표기 가능. 업종·규모만으로도 충분할 때가 많다
  stage: 선제안 | 제안 | 수행
  updated: YYYY-MM-DD

context:
  trigger: "왜 지금 이 논의가 시작됐는가"
  constraints: ["예산 주기", "기존 시스템 제약", "조직 제약"]

actors:                        # 누구의 일인가
  - id: ac-01
    label: "{역할}"            # 실명 금지. 역할로 적는다
    raw: "고객 원문에 근거가 있을 때만 채운다"
    responsibility: "이 사람이 실제로 하는 일"
    authority: ["이 사람이 확정할 수 있는 결정"]
    confidence: 낮음 | 중간 | 높음

items:                         # 본체. 각 항목이 하나의 추론 궤적
  - id: it-01
    type: pain | need | goal | currentData | currentSystem | cost | other
    actorRef: ac-01
    raw: "고객이 실제로 한 말. 두루뭉술해도 그대로."
    interpretations:
      - at: YYYY-MM-DD
        text: "우리 해석"
        basis: "웹서칭 | 업종패턴 | 미팅발언 | 자료"
        confidence: 낮음 | 중간 | 높음
        status: 현행 | 후보 | 폐기
        retiredReason: "폐기일 때만. 왜 틀렸는지."
    verify:
      method: 미팅질문 | 자료요청 | 데모반응
      question: "확인할 질문 한 문장"
      resolved: false
    customerFacing: false      # 표출층 노출 여부 (§5)

benchmarks:
  - id: bm-01
    type: target | competitive # 기본 target. 확실한 정보가 있을 때만 competitive
    raw: "확인된 사실만"
    source: "출처"
    confidence: 낮음 | 중간 | 높음
```

## 3. 작성 규칙

1. **원문을 다듬지 않는다.** `raw`는 고객이 말한 그대로 적는다. 요약하는 순간 나중에 근거로 쓸 수 없다.
2. **원문과 해석을 같은 칸에 넣지 않는다.** 섞이면 어디까지가 사실이고 어디부터가 추측인지 두 달 뒤에 아무도 구분 못 한다.
3. **해석에는 반드시 `basis`와 `confidence`를 단다.** 근거가 없으면 confidence는 자동으로 `낮음`이고, `verify.question`을 함께 채운다.
4. **`현행` 해석은 항목당 1개.** 대안은 `후보`로 병렬 보관한다.
5. **`폐기`를 삭제하지 않는다.** `retiredReason`과 함께 남긴다. 틀린 궤적이 다음 건의 재료다.
6. **행위자가 다르면 같은 항목으로 묶지 않는다.** 대상이 같아도 쓰는 사람이 다르면 다른 건이다. 이걸 안 지키면 뒤에서 화면 하나에 두 사람의 요구가 뭉개진다.
7. **`authority`에 없는 권한을 산출물에 만들지 않는다.** 확정 권한이 확인되지 않은 역할에 승인 버튼을 그리지 않는다.
8. **`actors.raw`는 근거가 있을 때만 채운다.** 없으면 비우고 가정 배지. 우리가 상상한 조직도를 그리지 않는다.
9. **`actors`는 해석 궤적을 타지 않는다.** 페인은 좁혀가는 것이지만 행위자는 식별되는 것이다. `confidence` 한 축만 둔다.
10. **벤치마크는 기본 `target`.** 초기에는 경쟁 정보가 부실하므로 "이런 방향이 좋다" 수준으로 방어적으로 둔다. 확정 정보가 생겼을 때만 `competitive`로 승격한다.
11. **추적성 없는 결론을 만들지 않는다.** 모든 파생 산출물은 어느 `items[].id`에서 나왔는지 달고 나간다. 달 수 없으면 그 결론은 만들지 않는다.
12. **미기재는 질의 대상으로 넘긴다.** 고객이 말하지 않은 것을 없는 것으로 처리하지 않는다.
13. **모르는 것을 적는 칸을 비워두지 않는다.** `verify.question`이 비어 있으면 그 항목은 아직 진단이 아니다.
14. **도메인 용어를 골격에 하드코딩하지 않는다.** 업종 어휘는 `{도메인}` 자리에 태그로 얹고, 골격은 중립으로 둔다.
15. **규격과 산출물이 어긋나면 규격을 먼저 고친다.** 산출물 쪽에서 우회하면 다음 건에서 같은 문제가 다시 난다.

## 4. 갭은 저장하지 않고 계산한다

갭은 필드가 아니라 **파생 뷰**다.

```
gap = {
  requirement: "산출물이 요구하는 데이터·기능·기준",
  current:     현황 항목의 현행 해석,
  target:      요구 항목의 현행 해석,
  delta:       자동 생성 문구 — 검토 전까지 draft,
  approved:    false        # 승인 전까지 표출층 노출 금지
}
```

- **갭은 요구 관계로 잡는다.** "같은 대상의 현재 vs 목표"로 맞추려 하면 자료 명사와 업무 명사의 층위가 달라 짝이 안 맞는다. "산출물이 요구하는 것 ↔ 현재가 제공하는 것"으로 대조한다.
- **`current`가 아예 없으면 가정 배지로 둔다.** 있는데 요구에 못 미칠 때만 갭이다. 미확인이 확인되는 순간 배지가 갭으로 승격한다.
- 도출은 자동, **표출은 승인 후.**

## 5. 내부층 / 표출층

고객에게 나가는 것은 다음을 **모두** 만족하는 항목뿐이다.

- `raw`에 실제 근거가 있고
- `customerFacing: true`이고
- 현행 해석이 있고
- 갭이라면 `approved: true`

나머지는 전부 내부 전용이다. 확신도 `낮음`인 해석을 고객 문서에 넣지 않는다.

> 내부층/표출층은 **산출물을 누가 보느냐**(우리 팀 vs 고객)이고, `actors`는 **만들 시스템을 누가 쓰느냐**다. 섞지 않는다.

## 6. 최소 예시 (페인 1건으로 시작)

```yaml
meta: { id: dg-001, customer: "{도메인} 중견기업", stage: 선제안, updated: 2026-08-10 }
context: { trigger: "현장 점검 이력 관리가 수기라 월말 집계에 며칠 걸린다는 언급" }
actors: []                       # 미확인 → 가정 배지 '행위자 미확인'
items:
  - id: it-01
    type: pain
    raw: "점검 결과가 여기저기 흩어져 있어서 매번 취합하느라 시간을 씁니다"
    interpretations:
      - at: 2026-08-10
        text: "부서별 수기 취합 → 집계 자동화가 1차 니즈"
        basis: 초도미팅 발언
        confidence: 중간
        status: 현행
    verify: { method: 미팅질문, question: "취합은 어느 주기로, 누가 하시나요?", resolved: false }
    customerFacing: true
```

이 상태로도 진단은 성립한다. `actors`는 비어 있어 가정 배지가 붙었고, `verify.question`은 다음 미팅에서 물을 것이다.

출력 예시

동일 항목이 미팅을 거치며 변경되는 과정이 이 포맷의 핵심입니다. 초도 미팅 직후의 상태입니다.

- id: it-01
  type: pain
  raw: "점검 결과가 여기저기 흩어져 있어서 매번 취합하느라 시간을 씁니다"
  interpretations:
    - at: 2026-08-10
      text: "데이터 사일로 → 통합 카탈로그 필요"
      basis: 웹서칭 + 업종패턴
      confidence: 낮음
      status: 현행
  verify: { method: 미팅질문, question: "취합은 어느 주기로, 누가 하시나요?", resolved: false }

2차 미팅에서 “취합”이 수작업 리포팅 문제로 확인된 뒤의 상태입니다.

- id: it-01
  type: pain
  raw: "점검 결과가 여기저기 흩어져 있어서 매번 취합하느라 시간을 씁니다"
  interpretations:
    - at: 2026-08-10
      text: "데이터 사일로 → 통합 카탈로그 필요"
      basis: 웹서칭 + 업종패턴
      confidence: 낮음
      status: 폐기
      retiredReason: "2차 미팅서 '취합'은 월말 수기 리포팅 문제로 확인. 저장소는 이미 단일."
    - at: 2026-08-24
      text: "월말 수기 집계 → 리포팅 자동화가 1차 니즈"
      basis: 2차 미팅 발언
      confidence: 높음
      status: 현행
  verify: { method: 미팅질문, question: "취합은 어느 주기로, 누가 하시나요?", resolved: true }

원문(raw)은 변경되지 않았고, 폐기된 해석은 삭제되지 않은 채 retiredReason과 함께 남았습니다. 석 달 뒤 통합 카탈로그 안을 철회한 사유를 다시 확인할 필요가 없습니다.

이 규칙의 근거

원문을 다듬지 않는 것. 고객 발화를 정리해 기록하면 두 달 뒤에는 고객 발언과 해석이 구분되지 않습니다. 그 상태로 제안서를 작성하면 추측이 고객 요구로 반영됩니다. 주의로 구분을 유지하는 방식은 지속되지 않습니다. rawinterpretations를 별도 필드로 분리하면 혼입 가능성이 제거됩니다.

폐기 해석을 지우지 않는 것. 초기 해석은 웹서칭과 업종 패턴에 근거해 작성되므로 오류 빈도가 높습니다. 오류 자체보다, 기록을 삭제하면 다음 건에서 동일한 오해가 반복되는 것이 문제입니다. retiredReason을 보존해 다음 건에서 참조합니다.

행위자를 분리한 것. 이 필드는 초기 버전에 없었습니다. 산출물 생성 시 대상이 같으면 하나로 묶는 규칙이 있어, 실무자의 애로와 관리자의 요구가 대상이 같다는 이유로 한 화면에 병합됐습니다. 필드 하나의 누락이 다른 규칙까지 오염시킨 사례입니다. 대상이 같아도 사용자가 다르면 별건으로 계산합니다.

갭을 저장하지 않는 것. 갭을 필드로 저장하면 현황이나 요구가 변경될 때마다 수기 갱신이 필요하며 불일치가 발생합니다. 계산값으로 두면 불일치가 발생하지 않습니다. 대조 축은 **“산출물이 요구하는 것 ↔ 현재가 제공하는 것”**으로 설정합니다. 동일 대상의 현재와 목표를 대조하면 자료 명사와 업무 명사의 층위가 달라 대응하지 않습니다.

최소 입력을 페인 1건으로 낮춘 것. 입력 요건이 과중하면 사용률이 낮아집니다. 빈 칸을 차단하는 대신 가정 배지를 부여해 통과시켰습니다. 배지 목록은 다음 미팅의 질문지로 사용합니다.

주의점·한계

  • 확신도·근거를 채우지 않으면 단순 메모에 그칩니다. 이 포맷의 효용은 basis/confidence 두 필드에서 나옵니다.
  • 항목이 30개를 초과하면 YAML 관리가 어렵습니다. 해당 시점에는 표나 DB 로 이관하고 이 스펙은 규칙 정의로만 유지합니다.
  • 갭 계산은 사람이 확인해야 합니다. 자동 생성된 delta 문구를 검토 없이 고객 문서에 반영하지 않습니다.

변경 이력

  • v0.1 · 2026. 8. 10. · 최초 공개