Content Engine — VPC × Storytelling Pipeline
Commercial pipeline để biến hồ sơ khách hàng (Value Proposition Canvas) thành post IG/Reels chất lượng. 4 stage độc lập — buyer có thể chạy full pipeline hoặc dừng/edit/rerun từng stage.
When to invoke
VN trigger phrases:
- "lập hồ sơ khách hàng + viết content"
- "content engine"
- "build factory content"
- "viết content theo VPC"
- "tạo content từ insight khách hàng"
User can also invoke /content-engine directly.
Do NOT use for:
- Long-form blog/SEO articles (use other skill)
- Lead magnet ebooks (use
lead-magnet-factory) - Pure customer research without content output (use
fb-insight-minerstandalone) - Non-Vietnamese content (skill is VN-only in v1)
Required inputs (ask user if missing)
Ask in 1 consolidated question. Required:
- Persona/niche — e.g., "beauty creator chuyển từ affiliate sang course"
- Data source — chọn 1:
fanpage_url(FB fanpage public để scrape qua fb-insight-miner)brief(điền formtemplates/brief-form.md)hybrid(cả 2)
- Content goal trọng tâm —
awareness/lead/sale(có thể đa mục tiêu, defaultlead) - Output format —
ig_caption/reels_30s/reels_60s/fb_post/multi - Số bài cần generate — default 12 (mix formula)
- CTA chính — sản phẩm/offer skill sẽ điều hướng tới (ví dụ: "khoá Content POV 4 tuần — link bio")
- Brand voice notes (optional) — tone, từ cấm, signature phrases
- Quality mode —
economy(default) hoặcpro:economy: Sonnet 4.6 mọi stage, không có editorial pass. ~$0.80/run. Đủ chất lượng cho daily content.pro: Sonnet 4.6 stage 1-3, Opus 4.7 stage 4 + editorial pass. ~$2.50/run. Dùng cho launch/sale post quan trọng.
4-stage workflow
Use TodoWrite to track each stage visibly.
Stage 1 — Customer Profile (VPC)
Goal: sản xuất output/{persona_slug}/profile.json đạt schema schemas/profile.schema.json.
Read first: references/vpc-framework.md.
Branching by data_source:
- fanpage_url → invoke
fb-insight-minerskill on the URL. After it produces an insight report, map:- Pain points →
pains[] - Voice-of-customer phrases →
voice.verbatim_bank+voice.repeated_words - Persona summary →
demographics - Aspirations from comments →
gains[] - "What they're trying to do" →
jobs[]
- Pain points →
- brief → load
templates/brief-form.md, present to user, parse answers into the same fields. - hybrid → run both; cross-reference; flag any field where brief contradicts scraped data.
Quality gates (from references/vpc-framework.md Section 3):
- jobs ≥ 3, pains ≥ 5, gains ≥ 5, verbatim_bank ≥ 5
evidence_summary.observed_pct ≥ 60→ setready_for_hook_stage = true- If gates fail → tell user explicitly, suggest re-running fb-insight-miner with deeper depth, OR ask user to fill brief gaps.
Niche pack assist: if user's niche matches a file in niche-packs/ (e.g., beauty-creator.json), seed the profile with priors then verify each prior against actual data — never silently ship priors as observed.
Write output/{persona_slug}/profile.json and validate with scripts/validate.py profile.
Stage 2 — Insight Mining
Goal: sản xuất output/{persona_slug}/insights.json (10-25 insight) đạt schema schemas/insights.schema.json.
Read first: references/vpc-framework.md Section 2.1 (field-to-asset mapping) + references/storytelling-and-hooks.md Section 3 (mapping tables).
Procedure:
- Load
profile.jsoninto context. - For each of 8 insight types (tension / contradiction / say_vs_do / surprise_myth_bust / aspiration / objection / transformation / identity_shift), generate 1-3 candidate insights by combining pains/gains/voice. Insight = reframing, not raw pain.
- Score each by
novelty_score(1-5). Drop anything ≤ 2 unless it's the only insight in that category. - For each insight: cite ≥1 verbatim quote from
profile.voice.verbatim_bank. - Auto-suggest
recommended_formulasusing Table A from storytelling-and-hooks.md. - Tag
applicable_goals.
Write to output/{persona_slug}/insights.json and validate.
Stage 3 — Hook Library
Goal: sản xuất output/{persona_slug}/hooks.json (50-100 hooks) đạt schema schemas/hooks.schema.json.
Read first: references/storytelling-and-hooks.md Section 2 (8 hook frameworks).
🆕 Hook bank integration (added v1.1):
- Trước khi generate, check niche của user → nếu match một bank trong
~/.claude/skills/hook-swipe-library/banks/, load hooks từ bank làm seed:women-biz-vnniche → loadwomen-biz-vn-72.json(72 hook proven theo Kallaway 18-topic × 4-temperature)- Future banks: thêm vào
hook-swipe-library/banks/khi có
- Tỷ lệ trộn: 30-50% hook từ bank (đã proven, chỉ cần remix theo voice persona) + 50-70% generated mới (theo profile.voice cụ thể)
- Lý do: bank = baseline an toàn; generated = customize sâu cho persona cụ thể.
🆕 Methodology integration (added v1.1):
Khi generate hook mới, follow ~/.claude/skills/kallaway-hook-master/ framework:
- 6 Hook Frameworks (
references/6-hook-frameworks.md): Fortune Teller / Experimenter / Teacher / Magician / Investigator / Contrarian - 5 Dream Outcome Formats (
references/5-dream-outcome-formats.md): About Me / If I / To You / Can You / He-She Just Did - 4-Component Alignment (
references/4-component-alignment.md): Spoken + Text + Visual + Audio cho format video
→ Mỗi hook output có thêm field kallaway_framework (1 trong 11 framework) và temperature (lanh/am/nong/banhang) để A/B test có hệ thống.
Procedure:
- Load
profile.json+insights.json. - (NEW) Check
hook-swipe-library/banks/for matching niche → load seed hooks. - For each insight, generate 3-6 hook variants spanning ≥3 different hook types (curiosity_gap / contradiction / stat_led / question_led / story_open / callout / list / transformation) HOẶC dùng 1 trong 11 Kallaway frameworks (recommend cho video format).
- Each hook MUST:
- Use ≥1 word from
profile.voice.repeated_words(record inuses_voice_words) - Be ≤25 words
- Reference its
paired_insight_id - Have a
paired_formula(use Table A mapping) - Have a
goal - (NEW for video format) Have
kallaway_framework+temperaturetags
- Use ≥1 word from
- Spread
goaldistribution across awareness/lead/sale roughly matching user's statedcontent_goal. - (NEW) Spread
temperaturedistribution: ~30% lanh, ~30% am, ~30% nong, ~10% banhang (adjust theo content_goal).
Write + validate.
Stage 4 — Content Generation
Goal: sản xuất output/{persona_slug}/content.json (N posts) đạt schema schemas/content.schema.json.
Read first: references/storytelling-and-hooks.md Section 1 (formula specs + word counts).
Procedure:
- Load
profile.json+insights.json+hooks.json. - Pick N hooks balanced across formulas + goals (default 12 posts: 3 awareness / 5 lead / 4 sale; varied formulas).
- For each pick, fill the formula's beat slots using:
- Hook → from
hooks.jsonentry - Body → from paired insight's
statement_vi,hidden_cost,reframe_angle - Solution/Proof → from
profile.gains(required/expected) + user'scta.offer - Voice → use customer vocabulary from
profile.voice
- Hook → from
- Respect word count from formula spec + format (ig_caption / reels_30s / reels_60s / fb_post).
- Generate hashtags: 3 broad + 5 niche + 2 branded (do not exceed 12).
- Validate via
scripts/validate.py content— every post must pass:- word count in range
- uses_voice_vocabulary = true
- no fabricated stats
- no fabricated testimonials (use
[testimonial_X_placeholder]if needed) - hook within first line
- cta present
- Write per-post markdown files to
output/{persona_slug}/posts/{post_id}_{formula}.mdfor human review.
Directory layout
content-engine/
├── SKILL.md # this file
├── README.md # buyer-facing intro
├── schemas/
│ ├── profile.schema.json
│ ├── insights.schema.json
│ ├── hooks.schema.json
│ └── content.schema.json
├── references/
│ ├── vpc-framework.md # Stage 1 reference
│ └── storytelling-and-hooks.md # Stages 3+4 reference
├── templates/ # (build after foundation approved)
│ ├── prompt-stage1-profile.md
│ ├── prompt-stage2-insight.md
│ ├── prompt-stage3-hook.md
│ ├── prompt-stage4-content.md
│ └── brief-form.md
├── niche-packs/ # (build after foundation approved)
│ ├── _universal.json
│ ├── beauty-creator.json
│ ├── coach-online.json
│ └── ... # 10 niches total
├── scripts/
│ ├── validate.py # JSON schema validator
│ └── render_post.py # content.json → markdown post files
├── examples/
│ └── linh-beauty-28/ # full sample run for buyers
│ ├── profile.json
│ ├── insights.json
│ ├── hooks.json
│ └── posts/
└── output/ # per-run artifacts
└── {persona_slug}/
├── profile.json
├── insights.json
├── hooks.json
├── content.json
└── posts/
Commercial reliability rules
- Never fabricate testimonials. Use
[testimonial_N_placeholder]placeholders. - Never hallucinate stats. If profile has no observed stat, write qualitatively.
- Never paraphrase verbatim quotes in
profile.voice.verbatim_bank— keep original spelling/typos. - Stage gates are hard. If
profile.evidence_summary.ready_for_hook_stage = false, do NOT proceed to Stage 2 without explicit user override. - Language lock. v1 = Vietnamese only. No code-switching unless brand voice explicitly allows.
- Source traceability. Every pain/gain/job entry must carry
source_refor be markedconfidence: "assumed". - CTA consistency. Every Stage 4 post's CTA must align with the user-provided
cta.offerfrom inputs. No drift.
Cost transparency
- fb-insight-miner data path — quote user the fb-insight-miner cost (depth-dependent: $2–$6).
- Brief-only path — ~free (just AI tokens).
- Per-stage AI tokens by quality_mode:
| Stage | Economy (Sonnet 4.6) | Pro (Sonnet 4.6 + Opus 4.7 editorial) |
|---|---|---|
| 1 (profile mapping) | ~5K in / ~3K out | same |
| 2 (insights) | ~8K in / ~5K out | same |
| 3 (hooks) | ~10K in / ~8K out | same |
| 4 (content, 12 posts) | ~15K in / ~20K out (Sonnet) | ~30K in / ~25K out (Opus 4.7 + editorial) |
| Total | ~$0.80/run | ~$2.50/run |
Cost-cap (hard stop): if a single run exceeds $5 in token cost, stop and ask user to confirm before continuing. Show running total after each stage.
Failure modes
- Profile thin (gates fail) → Stop Stage 1. Recommend deeper data collection. Don't fake the gates.
- Insights all generic (novelty_score ≤ 2 across the board) → Likely Stage 1 voice/vocab is shallow. Reload profile, focus on
voice.verbatim_bank. - Hooks all sound the same → Pin hook type distribution explicitly; force ≥3 different types per insight.
- Posts use generic words instead of customer voice → Validate fail on
uses_voice_vocabulary. Re-generate with stricter prompt citingprofile.voiceblock. - CTA drift in posts → Validate fail on
cta_present+ voice. Inject CTA from user input at template level, not by hoping AI remembers. - Buyer wants English output → v1 doesn't support; tell user explicitly.
Output language
Vietnamese only in v1. All examples, prompts, and posts in VN.
Files to load at each stage
| Stage | Reference files | Schema |
|---|---|---|
| 1 | references/vpc-framework.md |
profile.schema.json |
| 2 | vpc-framework.md §2.1 + storytelling-and-hooks.md §3 |
insights.schema.json |
| 3 | storytelling-and-hooks.md §2 |
hooks.schema.json |
| 4 | storytelling-and-hooks.md §1 + §4 |
content.schema.json |
Status
v1.0 — foundation + templates + scripts + niche pack (coach personal brand) + 1 full example shipped.