AI Sequence Proposal · Prompt Analysisv2 · 816a9c178 (PR #8885 반영)

AI 시퀀스 제안 — "미팅 제안 문구" 강제의 진짜 출처 분석

대상 린다세일즈 / GRINDA AI 요청자 허동연 바이어 사례 디자인플레이하우스(유혜림 대표) 작성일 2026-06-19 기준 alpha HEAD 816a9c178
목차
  1. TL;DR
  2. 이슈 정의 · 사실관계
  3. AI 제안의 2단계 구조
  4. ① blueprint 프롬프트 (미팅 차단)
  5. ② 본문 생성 (미팅 강제)
  6. 핵심 모순 — blueprint ↔ template drift
  7. 미팅 하드코딩 위치
  8. 최적방안

TL;DR

1 이슈 정의 · 사실관계

바이어(유혜림 대표, 디자인플레이하우스)가 "영어 미팅 진행이 어려워, 발송 메일에서 미팅 제안 문구를 제외하고 싶다"고 요청. 우선 이메일로 소개서·도매조건을 전달하고 관심 바이어와 메일로만 소통하려는 의도.

#질문결론 (v2)
Q1미팅 제안에 강제 코드가 있는가?있음 — 단, AI 제안이 아니라 본문 템플릿
Q2미팅 제거 발송이 가능한가?avoidMention 연결로 가능 · 소규모
사실관계 (beta DB)
디자인플레이하우스/유혜림은 워크스페이스 소유자가 아니라 린다세일즈 캠페인의 바이어(수신자). 그가 본 "전체 메일의 미팅 제안"은 본인 워크스페이스의 AI 제안 프리뷰(STEP_TEMPLATES_KO Step 3·5·6)로 추정. 실제 발송 콜드메일 1~3차는 미팅 직접 제안이 약했고("가볍게 이야기"), 명시적 미팅은 답장 이후 운영자 수동 메일에서 등장.

2 AI 제안의 2단계 구조

"AI 시퀀스 제안" 기능은 두 개의 독립된 LLM 호출로 구성된다.

제안서 설계 (blueprint) — LangGraph
캠페인 전략·언어·tonePersona·8-step 일정·각 step의 goal/angle/mustMention/avoidMention·rationale 생성. 사용자에게 보여주는 "계획".
shared/langgraph/sequence-proposal/ · prompts/blueprint.prompt.ts (BLUEPRINT_SYSTEM_PROMPT)
본문 / 프리뷰 생성 — generateDraft
stepOrderSTEP_TEMPLATES_KO 고정 템플릿을 선택해 본문 작성. 실제 발송(personalized-email-streaming)과 동일한 단일 SSOT (PR #8885).
workers/bullmq/sequence-proposal-preview-email.worker.ts → personalized-email-generation.service.generateDraft → prompt-builder → STEP_TEMPLATES_KO
PR #8885 변화
과거 시퀀스 제안 batch 생성을 담당하던 Mastra sequenceEmailAgent(자체 "MISSION: lead to MEETINGS" 하드코딩)가 3,499줄과 함께 삭제됐다. 이제 ②는 발송과 동일한 step-strategies SSOT를 쓴다 → 프리뷰와 발송이 1:1 일치, drift 경로 1개 제거.

3 ① blueprint 프롬프트 — 미팅을 오히려 차단

BLUEPRINT_SYSTEM_PROMPT(blueprint.prompt.ts) 전문 검토 결과, 미팅/demo/call 관련 지시는 단 1곳이며 회피 지시다.

Rule 19 — dead phrase 차단

19. mustMention/avoidMention — at least 1 mustMention per step (anchors LLM email gen). … avoidMention should block known dead phrases: ["our pricing", "schedule a demo", "synergy", "circle back"] for cold prospects.

Rule 8 — step goal arc (미팅 goal 없음)

step 1 = soft_intro, step 2 = value_proof, step 3 = social_proof, step 4 = value_proof, step 5 = objection_handling, step 6 = social_proof, step 7 = urgency, step 8 = breakup

blueprint이 생성하는 필드: recommended(language·tonePersona·sendHour) · schedule[](goal·delayDays·angle·mustMention·avoidMention·reasoningNote) · rationale · riskFlags · usedAssets. 어디에도 미팅 CTA 지시가 없다.

4 ② 본문 생성 — 미팅을 강제 (유일한 출처)

본문은 getStepRecipe(stepOrder)STEP_TEMPLATES_KO[stepOrder] 고정 템플릿을 주입하고, OUTPUT RULES가 "문장 구조/순서/톤을 최대한 보존"하라 강제한다 → 템플릿의 미팅 문장이 결과에 그대로 재현.

// STEP_TEMPLATES_KO[3] (Step 3 클로징) 다만 {{업황_빅이슈}}과 관련해 {{시간적 제약}}이기도 해서요, 지금이 가장 좋은 타이밍일 것 같아 미팅 제안을 드리고 싶었습니다. 이번 주 중으로 편하신 시간에 해당 건에 대해 10분 정도 이야기 나눠보시면 어떨까요?

5 핵심 모순 — blueprint ↔ template drift

워커(sequence-proposal-preview-email.worker.ts:269-281)는 본문 생성 ctx에 blueprint의 goal·avoidMention을 전달하지 않는다. 오직 stepOrder(고정 템플릿 선택)와 angle(customPrompt로 격하)만 넘긴다.

Stepblueprint 설계 (Rule 8)실제 본문 (STEP_TEMPLATES_KO)
Step 3social_proof긴급성 트리거 + "미팅 제안" CTA
Step 5objection_handling"10분 정도만 시간 내 주시면"
Step 6social_proof"10분만 시간 내주시면"
Step 7urgency거절 가능성 염두
결정적 결론
blueprint이 avoidMention: ["schedule a demo"]로 설계해도, 본문은 stepOrder=3이면 무조건 STEP_TEMPLATES_KO[3]의 "미팅 제안을 드리고 싶었습니다"를 재현한다. AI 제안의 의도(미팅 회피)와 실제 발송 본문(미팅 강제)이 정면으로 어긋난다. 유혜림이 본 미팅 문구는 AI가 제안한 전략이 아니라, 본문 템플릿이 blueprint를 무시하고 끼워 넣은 것이다.

6 미팅 하드코딩 — 현재 잔존 위치

파일:라인내용상태
step-templates-ko.ts:64-65,105,122,185Step 3·5·6 "미팅/10분" + mission잔존
prompt-builder.ts:413,439CTA 옵션 "10-min ask"잔존
static-quality-guide.ts:22,48"30-min demo / 20-min call"잔존
email-reply-agent/prompts.ts:21,28,31답장 "즉시 미팅 제안" + Calendly잔존 (답장 경로)
sequence-email-agent/prompts.ts:42,112"MISSION: lead to MEETINGS / 10-min call"삭제됨

PR #8885로 Mastra 시퀀스 제안 경로가 사라져, 본문 미팅 출처는 사실상 STEP_TEMPLATES_KO 단일 SSOT로 수렴했다(+ 답장은 별도 경로).

7 최적방안

근본 원인은 "영어 미팅 불가" → 진짜 제약은 미팅이 아니라 언어다. 미팅을 삭제하는 대신, 이미 설계된 avoidMention 파이프라인을 본문까지 연결해 drift를 없애는 것이 제1원리 해법이다.

우선순위방안성격
최적워커가 blueprint의 avoidMention(이미 "schedule a demo" 포함)을 본문 생성 ctx로 전달prompt-builder가 avoidMention을 강한 가드로 주입 + Step 3·5·6 미팅 CTA를 avoidMention 매칭 시 대체 CTA로 치환기존 메커니즘 연결 · drift 해소
보강blueprint이 email_first 의도(영어 미팅 불가 등)를 감지하면 avoidMention에 "미팅 제안 / 10분 통화"를 자동 추가유혜림 케이스 직접 충족
비권장전역 상수 STEP_TEMPLATES_KO에서 미팅 문구 일괄 삭제전 워크스페이스 영향 · 금지

변경 지점 (최적안)

① 워커: ctx.stepgoal·avoidMention 포함해 전달
prompt-builder: avoidMention을 LOCK급 가드로 주입
step-strategies: avoidMention에 미팅류 포함 시 Step 3·5·6 CTA 치환
static-quality-guide: demo/call 예시 중립화 (1024 토큰 가드 유지)
email-reply-agent: Calendly 블록 조건부
발송·제안 프리뷰가 단일 SSOT라 ②③ 한 번 고치면 양쪽 동시 적용

대체 CTA 예시 (영어 미팅 회피)

관심 있으시면 제품 소개서와 도매 조건을 메일로 정리해 보내드리겠습니다. "네" 한 줄만 회신 주세요.

고관심 단계(Step 7~8)는 "한국어로 응대 가능한 담당자가 메일로 안내"로 전환력 보존.


다음 단계: 최적안의 코드 diff(워커 ctx 전달 + prompt-builder avoidMention 가드)를 구체화할 수 있습니다.