Content QA · Pilot Comparison · 적용 완료

사주 캐논 파일럿 — dohwadore_saju 증류 반영 전/후
사주 프리미엄 9종 전체 실제 비교

2026-07-19 · 덕사주타로(ducksajutarot) · 결정론적 고정 사주(1995-08-22 남성 민준, 궁합 상대 1997-03-14 여성 서연)로 실제 코드 실행 · 검수 완료 후 프로덕션(src/soloReport.js·src/gunghapReport.js)에 병합, 실제 앱에 배포 완료
Executive Summary

1. 배경

사용자 피드백: "기존 타로가 너무 어렵고, 하나의 운에서 봤던 내용이 다른 운에 또 계속 중복해서 나온다." 타로는 이미 jinjin10960(930개 영상) 증류 캐논(db/tarot-patterns.html)이 있어 6개 무료 카테고리·4개 유료 샘플에 적용·배포된 상태다. 이번엔 같은 문제의식을 사주(soloReport.js) 쪽에도 적용해볼 수 있는지 확인하기 위해, 명리학 전문 채널인 @dohwadore_saju(259개 롱폼+242개 쇼츠+11개 라이브 다시보기, 총 430개 확보분)의 자막을 같은 방식으로 증류했다.

덕사주타로의 사주 프리미엄 리포트는 타로와 마찬가지로 LLM 실시간 호출이 아니라 룰베이스 슬롯 조합형 텍스트다(src/soloReport.js, src/gunghapReport.js) — 사주 계산(만세력, 십성, 격국, 신살)은 순수 계산으로 결정되고, 그 계산 결과를 바탕으로 문장 배열에서 결정론적으로(seededPick) 문구를 골라 조립한다. 앱에서 비로그인 사용자에게 무료로 미리 보여주는 미끼 카테고리는 연간운세(generateYearFortuneReport, worker.js /sample-report?key=yearFortune)다 — 이번 파일럿의 대상.

2. 증류 결과 요약 — 4갈래 패턴 (430개 영상, 15배치 병렬 분석)

타로 증류 때와 동일한 원칙(원문 5단어 이상 연속 인용 금지, 구조·화법만 일반화해서 추출)으로 분석했다. 아래는 15개 배치 결과를 압축한 요약이다 — 전체 원문은 각 배치 에이전트 산출물에 있고, 이 표는 그중 여러 배치에서 반복 확인된(=우연이 아닌) 패턴만 추렸다.

① 쉬운 설명 기법

  • 오행(목화토금수)을 한자 대신 색깔로 1차 언어화 — 거의 모든 배치에서 가장 많이 반복된 단일 기법.
  • 오행 상생상극을 구체적 물리 현상으로 설명(물이 불을 끄는 것, 나무가 흙을 뚫는 것, 쇠가 나무를 베는 것 등) — "기운이 나를 돕는다/누른다" 같은 추상 표현 대신.
  • 전문용어 등장 즉시 같은 문장 안에서 현대적 등가물로 재번역(예: 특정 신살 → "개인 브랜드 자산"), 설명 없이 방치하지 않음.
  • 번호 매긴 체크리스트(첫번째·두번째·세번째)로 판단 절차를 쪼갬.

② 카테고리 차별화 기법

  • 같은 기본 개념(십성 등)도 카테고리마다 완전히 다른 어휘 세트로 재매핑 — 재물은 투자·현금흐름 용어, 연애는 밀당·감정 용어, 커리어는 조직·인사 용어.
  • 카테고리마다 "봐야 할 자리"를 다르게 지정해, 같은 사주표를 매번 다른 각도로 재활용.
  • 같은 시기(월/연도)를 다루더라도 카테고리마다 다른 상징·비유를 배정해 겹침 방지.

③ 구조/화법 기법

  • 직접 호명 + 반전형 오프닝("사실은 반대")으로 시작.
  • 시간 특정성이 매우 높음 — "몇 월", "몇 살부터" 등 구체적 시기를 항상 명시.
  • 조건부 헤지 표현("~일 수 있다") 반복 — 단정하지 않으면서도 확신 있게 들리는 절제된 화법.
  • 모든 세그먼트를 구체적 행동 지침으로 마무리(추상적 서술로 끝내지 않음).

④ 신뢰감/전문성 형성 기법

  • 단정 대신 "제가 본 사례로는" 식 경험 근거 + 불확실성 인정 — 과신하지 않는 태도 자체가 신뢰 요소.
  • 실존 인물(연예인 등) 사주를 검증 가능한 사례로 제시.
  • "사주를 맹신하지 말라"는 자정 메시지로 미신과 스스로 구분.

전체 배치별 상세 원문(파라프레이즈)은 이 세션의 서브에이전트 산출물에 보관돼 있으며, 요청 시 재구성 가능. 위 4갈래는 사람이 다시 압축한 요약이다.

3. 방법론 — 어떤 카테고리를, 어떻게 비교했나

  1. 대상 선정. 사주 프리미엄 카테고리 중 앱이 실제로 무료 미끼(샘플)로 노출하는 건 연간운세 하나뿐이다(public/index.html "예시 사주풀이 참고하기" CTA → sampleKey="yearFortune"generateYearFortuneReport, worker.js도 같은 함수·같은 고정 입력을 씀). 그래서 타로 때 LOVETODAY_TEXT를 고른 것과 동일한 논리로 이 카테고리를 골랐다.
  2. 같은 사주 고정. 카드 셔플이 있던 타로와 달리 사주 리포트는 애초에 랜덤 요소가 없다(생년월일시가 입력이므로) — worker.js가 실제로 쓰는 고정 입력을 그대로 재사용했다: {year:1995, month:8, day:22, calendar:"solar", hourBranch:"오", gender:"male"}, 이름 "민준". 이 사주의 일간은 을목(乙木), 신약, 정관격(성격).
  3. 전/후 소스. "전"=src/soloReport.js(현재 배포 중, 미변경). "후"=src/soloReport.new.js(이번에 새로 만든 실험용 사본, 아직 앱 코드 어디에서도 import 안 됨 — 프로덕션에 영향 없음). 둘 다 Node로 직접 import해서 같은 computeSaju() 결과값을 넣고 함수를 나란히 실행했다(compare_yearfortune.mjs).
  4. 수정 범위. generateYearFortuneReport() 안에서 헤드라인 한 줄 요약활용팁 두 슬롯만 캐논 기법(①번 물리적 오행 이미지, 방향성 구분)을 반영해 새로 썼다. 월별 섹션·신살 섹션·격국 한줄평·용어 해설 블록은 이번 파일럿에서 손대지 않았다(전/후 동일 — 아래 Exhibit에서 확인 가능).
파일럿 도중 발견한 기존 코드 버그. 기존 YEAR_TONE_FACT/YEAR_TONE_NUANCE는 오행 관계를 상생/비화/상극/중립 4버킷으로만 분류했는데, elementRelation() 함수 자체가 "그 해가 나를 생하는지" vs "내가 그 해를 생하는지"를 구분하지 않고 둘 다 "상생"으로 뭉뚱그린다. 그런데 실제 의미는 정반대다 — 전자는 도움을 받는 입장(인성), 후자는 내가 에너지를 쏟아내는 입장(식상)이다. 이번 고정 사주(을목 일간, 갑오년처럼 화 기운이 오는 해라고 가정 시 목생화 = 내가 화를 생함)에서 기존 코드는 "올해 기운이 나를 도와주는 흐름"이라고 방향이 반대인 문장을 내보내고 있었다. 이건 캐논 적용과 무관하게 존재하던 기존 버그이고, 이번 파일럿에서 방향성을 구분하는 로직(yearRelationRole())을 새로 만들면서 같이 고쳐졌다.

4. Exhibit 1 — 같은 사주, 헤드라인 한 줄 요약 전/후

Exhibit 1 · 【올해 총운 한 줄 요약】

을목(乙木) 일간 · 신약 · 정관격 · 남성 · 이름 민준

worker.js /sample-report?key=yearFortune 과 완전히 동일한 고정 입력 · 사주는 절대 안 바뀜, 문장만 비교
버전전 — 현재 배포 중(soloReport.js)문제/기법
"올해는 그 해 기운이 나를 도와주는 흐름이야. 도움받는 해라 무리한 욕심 없이도 순조롭게 풀릴 가능성이 커."
방향 오류 실제로는 내(목)가 올해(화) 기운을 생하는 관계(목생화)인데, "도움을 받는다"는 반대 방향으로 서술됨. 오행 자체(목/화)도 문장에 안 드러남 — 다른 사람 리포트와 구분이 잘 안 됨.
"내(나무) 기운이 타올라서 화 기운에 불을 지피고 있는 관계라, 올해는 내가 가진 힘을 이 해(불)한테 쏟아붓는 흐름이야. 베푸는 흐름인 만큼 너무 다 퍼주지만 말고 스스로 채우는 시간도 같이 챙겨."
구체적 물리 이미지방향성 정정 "나무가 타올라 불을 지핀다"는 실제 오행(목→화) 그대로의 장면 묘사로 정확도와 이해도를 동시에 높임. 방향이 "주는 입장"으로 정정됨.

5. Exhibit 2 — 같은 사주, 활용팁 전/후

Exhibit 2 · 【올해 이렇게 활용해봐】
버전내용비고
"주변에서 도움 준다는 제안이 오면 부담 갖지 말고 받아들여봐. 올해는 그게 자연스럽게 통하는 흐름이야."
헤드라인과 마찬가지로 "받는 입장" 팁 — 방향 오류가 그대로 이어짐. 상생/비화/상극/중립 4개 버킷 각각 고정 문구 1개뿐이라, 같은 유형인 다른 사용자와 100% 동일한 팁을 받는다.
"네 능력이나 콘텐츠를 드러낼 자리가 있으면 망설이지 말고 나서봐. 올해는 그게 먹히는 흐름이야."
방향성 정정변형 확대 "주는 입장"에 맞는 팁으로 정정. 5개 역할(받음/줌/누름/눌림/비화) × 각 2개 변형으로 seededPick 결정론적 분기 — 같은 오행 조합이라도 사람마다(사주 시드 기준) 두 갈래 중 하나로 갈리게 확장.
범위 확장(2026-07-19, 같은 날 후속 작업). 위 1~5장은 연간운세 하나만 다룬 최초 파일럿이다. 사용자가 "나머지 카테고리까지 다 해봐, 단 아직 반영은 하지 말고"라고 확장을 요청해서, 같은 방식(증류 패턴 적용 → 같은 고정 사주로 전/후 비교)을 남은 8개 카테고리(건강운·학업운·직업운·이직운·재물운·연애운·결혼운·궁합) 전부에 적용했다. 아래 6장부터는 그 결과다 — 여전히 soloReport.new.js/gunghapReport.new.js 실험용 사본에만 있고, 프로덕션(soloReport.js/gunghapReport.js)은 전혀 손대지 않았다.

6. 9개 카테고리 전체 요약 — 발견한 문제 · 적용한 기법

모든 카테고리에서 반복적으로 나타난 근본 패턴은 하나였다: 서로 의미가 반대인 두 경우를 하나의 버킷으로 뭉뚱그려서, 실제로는 달라야 할 조언이 같은 문장으로 나가고 있었다. yearFortune의 "받는 입장 vs 주는 입장" 버그와 정확히 같은 모양의 문제가 8개 카테고리 중 6개에서 재발견됐다 — 이건 우연이 아니라, 이 코드베이스 전반에 깔린 일관된 설계 습관(방향성 무시)이었다는 뜻이다.

카테고리기존 코드에서 발견한 문제적용한 수정
연간운세
(1~5장, 최초 파일럿)
버그 오행 상생을 "받음/줌" 구분 없이 한 버킷으로 처리 — 방향이 반대인 문장이 나가는 경우 존재5역할(받음/줌/누름/눌림/비화) 분리 + 실제 오행쌍을 명시하는 물리 이미지
건강운버그 오행 "부족"과 "과다"를 이유 문구에서만 구분하고, 정작 몸 상태 설명·팁은 방향 무관 동일 문구 재사용(실제로는 반대 체질에 가까움)오행×부족/과다 10칸으로 분리, 몸으로 느껴지는 구체적 물리 이미지(예: "지반이 얕은 화단처럼") + 방향 전용 관리팁
학업운버그① 정인·편인 둘 다 0인 사람이 "고르게 있다"는 사실과 다른 balanced 문구를 받음
버그② 정인 대운·편인 대운을 "인성 기운"으로 뭉뚱그려서, 위 스타일 섹션에서 이미 구분해둔 커리큘럼형/몰입형 차이가 시기 섹션에서만 사라짐
없음(none) 4번째 버킷 신설 + 정인/편인 대운을 방향별로 분리해 원래 공부 스타일과 교차 비교하는 studyTimingFitNote() 추가
직업운버그 관성/재성 비중만으로 조직형/사업가형 3버킷 — "위험 감수형(편)"과 "신중형(정)"을 구분 못 해 조언이 뭉툭함편/정까지 갈라 5버킷(orgBold/orgSteady/bizBold/bizSteady/balanced), 보고체계·인사고과 등 조직행동 전용 어휘로 방향별 팁 분리
이직운버그 관성·재성 이벤트를 "이동·기회 기운"으로 뭉뚱그림 + 직업운과 사실상 같은 방향 정보를 재탕(카테고리 중복 사례)승진·발령형(관성)/제안·스카우트형(재성)/겹경사형(both) 3분류 타이밍 + 직업운과 다른 각도("일하는 스타일"이 아니라 "옮기는 판단·협상 스타일")의 신규 5분류 섹션 추가
재물운버그 "정재/편재 스타일" 축만 있고 "그릇 크기"(신강약×재다소) 축은 재다신약 1개 조합만 캐주얼티로 덧붙여짐 — 재다신강(이상적 부자 그릇) 등 나머지 5조합은 아예 언급조차 없었음강/약/중화 × 재다/재소 6조합 총평 섹션(WEALTH_CAPACITY) 신설, 적금·ETF·시드머니 등 구체적 금융 어휘로 확장
연애운버그 배우자성이 2종류 이상 겹친 사람도 present[0](첫 매칭)만 쓰고 나머지 정보를 버림 — 정재+편재 둘 다 있는 사람이 정재 단일형으로만 서술됨주(主)/부(副) 배우자성을 빈도순으로 둘 다 반영하는 mixedSpouseTraitLine(), 월별 좋음/조심 문구에 연락텀·밀당·직진 등 구체적 행동 지침 추가
결혼운중복 문제(사용자 지적 사례 그 자체) 배우자성 성향·직업·시기를 연애운과 거의 같은 데이터로 다시 서술 — "다른 운에서 본 내용이 또 나온다"는 지적이 정확히 이 카테고리 얘기였음연애운이 다루지 않는 데이터(부부 재정 스타일=십성그룹, 양가 어른=년/월주, 자녀·말년=시주)로 완전히 재설계, 오프닝 문장에서 "성향은 연애운에서 이미 짚었으니 여기선 결혼 이후"라고 명시적으로 역할 분리
궁합버그 오행 상생(生)은 이미 방향 구분돼 있었는데 상극(剋)만 방향 미구분("상호 극" 한 버킷) — 내가 상대를 누르는 것과 상대한테 눌리는 게 반대 의미인데 같은 문장극도 생과 동일하게 방향별 6분류로 통일, 두 사람의 실제 오행쌍을 명시하는 물리 이미지로 궁합 전체 표현 일관화

7. Exhibit 3 — "카테고리 간 중복" 문제의 실제 사례: 연애운 vs 결혼운

사용자가 처음 지적한 문제("하나의 운에서 봤던 내용이 다른 운에도 계속 중복해서 나온다")를 코드로 직접 확인할 수 있었던 게 이 쌍이다. 같은 고정 사주로 두 카테고리를 나란히 뽑아보면:

Exhibit 3 · 연애운 vs 결혼운, 전(前) — 겹치는 정도
연애운【배우자궁이 보여주는 성향】결혼운【결혼운 총평】
전(개편 전)
"사주에 배우자성(재성/관성)이 뚜렷하게 드러나 있지 않아서, 배우자상이 한 가지 유형으로 딱 정해지기보단 상황에 따라 유연하게 그려지는 편이야."
"배우자성이 뚜렷하게 드러나진 않지만, 그만큼 특정 시기·조건에 얽매이지 않고 유연하게 흘러갈 수 있는 사주야."

두 문장이 사실상 같은 근거(배우자성 부재)로 같은 결론을 두 번 말하고 있다 — 결혼 시기 섹션도 findUpcomingDaeunByTenGod(["정관","정재"])로 완전히 동일한 계산을 반복 사용했다(전 버전 코드 원문 확인).

Exhibit 3 · 결혼운, 후(後) — 완전히 다른 섹션 구성
섹션연애운에 있음?비고
【결혼 후 부부 사이 기본 결】일지 재사용(중복)기존 코드와 동일 — 유지
【부부 재정 스타일】신규 — 연애운엔 없음십성 5그룹(비겁/식상/재성/관성/인성) 기반, 통장 분리·자동이체 등 구체적 재정 행동
【양가 어른들과의 관계】신규 — 연애운엔 없음년주·월주(연애운은 일지만 씀) 활용
【자녀·말년 설계】신규 — 연애운엔 없음시주(어떤 카테고리도 안 쓰던 기둥) 활용

오프닝 문장도 "어떤 성향의 사람을 만날지는 연애운에서 이미 짚었으니, 여기서는 결혼 '이후'에 집중"이라고 명시적으로 역할을 분리했다 — 사용자가 두 리포트를 연달아 봐도 "또 같은 얘기"라고 느끼지 않도록.

8. Exhibit 4 — 정확도 버그 사례: 재물운의 "빠진 절반"

Exhibit 4 · 재물운, 재다신강(이상적 부자 그릇) 케이스

기존 코드는 if (jaeCount >= 2 && chart.strength === "신약") cautionParts.push(...) 단 한 줄로만 "그릇" 축을 다뤘다 — 재다신약(재물이 부담되는 경우)만 캐치하고, 정반대인 재다신강(재물을 넉넉히 감당하는 이상적 구조)이나 재성이 옅은 케이스들은 리포트 어디에도 등장하지 않았다. 즉 재다신강인 사람도 그 사실을 리포트에서 전혀 못 보고 지나갔다.

버전내용
(재다신강 케이스에 해당하는 문장 자체가 없음 — 【조심할 점】에 "특별히 두드러지는 재물 관련 리스크 신호는 없어"만 출력됨)
"재성도 많고 그걸 받아낼 그릇(일간)도 튼튼한 재다신강 구조라, 지금 재물 그릇 자체가 큰 편이야 — 아끼는 것보다 규모를 키우는 시도가 오히려 너한테 잘 맞는 타이밍이야."

이번 고정 사주(신약)는 재다신약도 재다신강도 아닌 "신약-thin"(재성 옅음) 조합이라 실제 실행 결과(Exhibit 목록의 재물운 항목)엔 이 정확한 문장이 나오지 않는다. 재다신강 문장이 실제로 나오는지는 별도의 신강+재다 조합 사주(1980-01-03生, 남성, 자시)로 직접 재실행해서 확인했다 — 【그릇의 크기와 감당력】에 "일간이 강한데 재성까지 많아서, 돈이 커져도 휘둘리지 않고 잘 다루는 타입이야"가 실제로 출력됨.

9. 이번 확장 파일럿에서 변경하지 않은 부분

범위상태비고
월별 섹션(MONTH_TONE_SHORT 등, yearFortune 내부)미변경이미 재물/관계/건강별로 도메인 차별화는 돼 있었음 — 방향성(생 받음/줌) 미구분 문제가 있는지는 미확인.
신살 매핑(SINSAL_CASUAL) 전체미변경캐논과 무관한 별도 로직, 카테고리별 FOCUS 리스트만 필요시 재배치(결혼운에서 1건 함).
궁합의 JIJI(지지 합충) 섹션미변경OHEANG(오행) 축만 이번에 수정 — JIJI_FACT/NUANCE는 손대지 않음.
공용 헬퍼(gyeokgukOneLiner, termGlossaryBlock, fourPillarStageLines 등)미변경여러 카테고리가 공유 — 건드리면 파급 범위가 커서 이번 파일럿에서 의도적으로 보존.

10. 한계 · 미확인

11. 결론 및 적용 결과

9개 카테고리 전부에서 dohwadore_saju 증류 기법(구체적 물리 이미지 + 방향성 분리)을 적용해본 결과, 매번 같은 모양의 문제(반대 의미 두 경우를 한 버킷으로 뭉뚱그림)가 반복 발견됐고, 그중 하나(연애운↔결혼운)는 사용자가 처음 지적한 "카테고리 간 중복" 문제의 직접적인 사례였다. 부수적으로 실제 정확도 버그도 여러 건 찾아 같이 고쳤다(재다신강 케이스 누락, 정인·편인 0개를 balanced로 오분류 등).

2026-07-19 적용 완료. 검수 후 9개 카테고리 전부를 프로덕션(src/soloReport.js, src/gunghapReport.js)에 병합하고 wrangler deploy로 실제 앱(https://ducksajutarot.jjujjuya1226.workers.dev)에 배포 완료했다. 배포 직후 /api/sample-report?key=yearFortune 실제 응답으로 새 문구가 라이브에 반영된 것까지 확인했다. 이 과정에서 워킹트리에 남아있던 무관한 미검증 변경(이모지 손그림 아이콘 기능)은 git stash로 잠시 빼놓고 사주 변경사항만 배포한 뒤 원상 복구해서, 의도치 않게 같이 배포되지 않도록 했다. GitHub에도 커밋·푸시 완료.