@@ -36,38 +36,45 @@ def build_compose_layout_prompt(ctx: RecommendationContext) -> str:
3636 posts_json = json .dumps (posts_payload , ensure_ascii = False , indent = 2 )
3737 keywords_str = ", " .join (ctx .keywords ) if ctx .keywords else ""
3838
39- return f"""너는 Decoded 매거진의 시니어 에디터다 .
40- 아래 angle 과 source posts 를 바탕으로 **Hypebeast TAGGED 스타일** 의
41- 멀티 소스 매거진 기사 layout 을 작성해라 .
39+ return f"""You are the senior editor of Decoded magazine .
40+ Based on the angle and source posts below, write a multi-source magazine
41+ article layout in the **Hypebeast TAGGED style** — but in English .
4242
4343[Angle]
4444title: { ctx .angle_title }
4545description: { ctx .angle_description or '' }
4646rationale: { ctx .rationale or '' }
4747keywords: { keywords_str }
4848
49- [Source posts (post_id 와 솔루션 )]
49+ [Source posts (post_id and solutions )]
5050{ posts_json }
5151
52- 요구사항:
53- - title: angle_title 을 다듬은 매거진 제목 (한국어, TAGGED 톤).
54- - subtitle: 한 문장 부제.
55- - hero_image_url: null. (#429 — 매거진 본문에 hero banner 안 씀, OG 메타 등은
56- thumbnail_url 사용. LLM 은 hero_image_url 채우지 마라.)
57- - sections: 다음 순서로 구성. **hero 섹션 만들지 마라** — title/subtitle 은 layout
58- 의 최상위 필드에서 이미 표시됨.
59- 1. intro (200-300자 도입 카피, 이 angle 이 왜 지금 의미있는지)
60- 2. curation_card N개 — source post 마다 1개. body 에 100-200자 카피, post_id /
61- image_url / solutions (그 post 의 솔루션 카드들) 포함.
62- 3. (선택) spotlight 1개 — 가장 강조하고 싶은 솔루션 / 브랜드.
63- 4. closing (100-150자 마무리 카피)
64- - 모든 post_id / solution_id 는 입력에 등장한 것만 사용. 새 id 만들지 마라.
65- - solutions 배열에는 input solution 의 **original_url / affiliate_url 그대로
66- 복사** (있으면). 사용자가 상품 페이지로 바로 갈 수 있어야 함. URL 변형 X.
67- - "Hypebeast" / "Tagged" 라는 단어는 출력에 절대 포함 금지. Decoded 로 표기.
68- - 카피는 한국어, 자연스럽고 트렌디한 매거진 톤.
52+ Requirements:
53+ - title: a refined English magazine headline derived from angle_title (TAGGED
54+ editorial tone — punchy, trend-aware, no clickbait).
55+ - subtitle: one English sentence.
56+ - hero_image_url: null. (#429 — the magazine body does not use a hero banner;
57+ OG/share use thumbnail_url. Do NOT fill hero_image_url.)
58+ - sections: in this order. **Do NOT create a hero section** — title/subtitle
59+ are already rendered from the layout's top-level fields.
60+ 1. intro (200-400 chars of opening copy in English — why this angle matters
61+ right now)
62+ 2. curation_card × N — one per source post. body is 100-250 chars of English
63+ copy. Include post_id / image_url / solutions (the solution cards for
64+ that post).
65+ 3. (optional) spotlight × 1 — the single solution / brand most worth
66+ highlighting.
67+ 4. closing (100-200 chars of English closing copy)
68+ - Use only post_id / solution_id values present in the input. Never invent ids.
69+ - In the solutions array, copy the input solution's **original_url /
70+ affiliate_url verbatim** when present, so the reader can jump straight to
71+ the product page. Do not modify URLs.
72+ - The words "Hypebeast" / "Tagged" must NEVER appear in output. Brand as
73+ Decoded.
74+ - All copy in English. Natural, on-trend magazine tone — confident, specific,
75+ no filler.
6976
70- JSON 출력만 . MagazineLayout 스키마 :
77+ Output JSON only . MagazineLayout schema :
7178{{"schema_version": "1.0", "title": "...", "subtitle": "...",
7279 "hero_image_url": "...",
7380 "sections": [{{"type": "intro|curation_card|spotlight|closing",
0 commit comments