GrowReach v2 Prompt Engineering — Session Summary

Date: June 24, 2026

Duration: Single extended session

Participants: Rahul (founder, 10xers Labs) + Hermes Agent


What Was Accomplished

1. Context Building (Files 1-5)

Rahul shared 5 files to build complete understanding of GrowReach’s comment generation system:

  • File 1: Product Overview — GrowReach is an AI-powered LinkedIn engagement automation SaaS. Finds viral posts, generates personalized human-sounding comments, posts them (manual or auto mode). Pricing: 49/$69. Pre-revenue as of Feb 2026.

  • File 2: v1 Comment Generation PRD — Defined the v1 system prompt + user prompt architecture. System prompt had 3 strategies (agreeable_value_add, thought_provoking, question_based), anti-AI-detection rules, voice adaptation matrix (4 industries × 4 seniority levels). User prompt had 6 commenter inputs + 5 post inputs.

  • File 3: 262 Real Comments — Excel sheet of all comments generated by v1 over ~1 month. Analyzed every single comment for patterns, strengths, and weaknesses.

  • File 4: Commenting Voice Feature PRD — New v2 input system with 9 categories: website, target audience, content goal, content tone, content persona, content priority, emoji preference, voice brief (auto-generated from LinkedIn profile), custom DOs/DON’Ts.

  • File 5: Rahul’s Commenting Voice — Rahul’s own setup as the reference user. Founder of 10xers Labs, ex Go-Jek/Careem/Ola. Conversational tone, Data-Driven Analyst + Industry Expert + Thought Leader persona, Metrics first priority.

2. Analysis (Mine + Claude’s Peer Review)

My Independent Analysis of 262 Comments:

  • 99.2% end with a question — biggest automation tell
  • 85% open with “The…” — formulaic openers
  • 45.8% follow same formula (Insight → Company mention → Question)
  • Average 121 words — far too long for LinkedIn comments
  • Only 2-3 voice profiles across 262 comments despite 16 possible combinations
  • 120 comments mention “10xers” (45.8%) — account looks like marketing channel
  • 63% “we” pronoun — corporate/agency voice
  • 0 banned phrase violations — anti-AI rules working at per-comment level
  • 72.5% contain {{0}} placeholder — later clarified as intentional (API replaces with tagged author name)

Claude’s Peer Review (File 6):

  • Scored each comment on 5 dimensions (out of 5): structure diversity (1.32), length (1.71), humanness (1.81), dash compliance (1.89), tone variety (2.37)
  • Overall v2-readiness: 1.74/5
  • 98% are exactly 3 paragraphs — traced to v1’s paragraph formatting rules
  • Root cause: “v1 had no length-variation or tone-variation control, so the model defaulted to one safe shape”
  • Traced “The…” opener to v1 prompt’s example phrase “Start mid-thought: The challenge with…”
  • Traced question ending to over-generalization of “put the question on its own line” instruction

3. v2 Prompt Design

Built complete v2 system prompt and user prompt based on all analysis:

6 Comment Structures (replacing v1’s 3 undifferentiated strategies):

  1. validate_extend (40-80 words) — Agree + add your angle
  2. challenge_nuance (40-90 words) — Surface hidden tradeoff
  3. share_experience (50-100 words) — Brief personal anecdote
  4. ask_explore (40-80 words) — Insight + genuine question
  5. direct_observation (20-60 words) — Punchy one-liner, no company, no question
  6. casual_react (15-50 words) — Very short human reaction

Key Changes from v1 → v2:

v1 Problemv2 Solution
99% end with questionQuestion is one of 6 engagement options
85% open with “The”Banned “The point…” pattern, varied openers per structure
98% are 3 paragraphs1-2 max for most structures, single sentence allowed
121 words average15-100 words depending on structure
No example phrasesRemoved all literal examples (AI was copying them as templates)
Em dashes encouragedHard ban (em/en/hyphen)
No typo controlConditional intentional typos per user preference
6 commenter inputs9+ input categories including voice brief, tone, persona, priority, audience, goals
No structure variety6 distinct structures with different lengths, paragraphs, openers, closes
”We” pronoun dominanceKept at user preference (Rahul uses “we” deliberately)

Content Priority → Length Mapping:

  • Authenticity only → structures 5, 6 (shortest)
  • Authenticity first → structures 3, 5, 6
  • Balance → any structure
  • Metrics first → structures 1, 2, 4
  • Performance only → structures 1, 2, 4 (longer, stronger hooks)

Custom Instructions Weighting:

  • DON’Ts = HIGH weight (always obey unless conflicts with system prompt)
  • DOs = LOW weight (preferences, can be ignored if they’d make comment robotic)

4. Backend Variables

Commenter Persona:

  • {{.Persona.FirstName}}
  • {{.Persona.Role}} at {{.Persona.Company}}
  • {{.Persona.Industry}}
  • {{.Persona.DomainExpertise}}
  • {{.Persona.YearOfExperience}}

Commenting Voice:

  • {{.CommentingStrategy.WebsiteUrl}}
  • {{.CommentingStrategy.VoiceBrief}} — HIGH weight, critical input
  • {{.CommentingStrategy.ContentTone}} — single-select
  • {{.CommentingStrategy.ContentPersona}} — multi-select
  • {{.CommentingStrategy.ContentPriority}} — single-select
  • {{.CommentingStrategy.TargetAudience}} — multi-select
  • {{.CommentingStrategy.ContentGoal}} — multi-select
  • {{.CommentingStrategy.UseEmoji}} — Yes/No
  • {{.CommentingStrategy.ThingsToInclude}} — custom DOs (LOW weight)
  • {{.CommentingStrategy.ThingsToAvoid}} — custom DON’Ts (HIGH weight)

Post Details:

  • {{.Post.Author.Name}} — first name only (backend handles)
  • {{.Post.Author.Title}} — needs to be wired up by dev
  • {{.Post.Author.Company}} — needs to be wired up by dev
  • {{.Post.Text}} — full post content

Omitted Variables (intentionally not used):

  • {{.LengthTarget}} — AI picks length based on chosen structure
  • {{.OpenerType}} — AI picks opener based on chosen structure
  • {{.EndWithQuestion}} — AI decides based on chosen structure
  • {{.Post.Hashtags}} — obsolete on LinkedIn

JSON Output Format:

{
  "comment": "comment text with \\n\\n for paragraph breaks",
  "strategy_name": "one of: validate_extend, challenge_nuance, share_experience, ask_explore, direct_observation, casual_react",
  "strategy_used": "same value as strategy_name",
  "voice_profile": "short stable tag, e.g. 'senior AI founder, direct and analytical'",
  "voice_description": "brief note on voice adaptation for this comment",
  "word_count": 67
}

5. Action Items for Developers

  1. Wire up {{.Post.Author.Title}} and {{.Post.Author.Company}} — these variables are in the user prompt template but were omitted from the backend variable list by mistake. The AI needs these to contextualize the comment for the post author.

  2. Remove {{.LengthTarget}}, {{.OpenerType}}, {{.EndWithQuestion}} from the backend logic — these are no longer needed. The AI picks structure, length, and opener intelligently from the system prompt.

  3. Verify {{.Post.Author.Name}} sends first name only — the v1 prompt specified “only give the model the 1st name.” The backend should handle this.

  4. Confirm {{0}} placeholder handling — the API replaces {{0}} with a tagged link to the post author. The AI uses {{0}} naturally where it wants to address the author. Confirm this is still working in v2.

  5. Test with Gemma 4 via Ollama — the v2 system prompt is 14,253 characters. Consider architectural optimizations (see architecture options in separate section).

  6. Roll out, observe comments, iterate to v3 — collect v2 comments, run same analysis methodology, compare against v1 baseline scores, identify remaining patterns, adjust.


Files in This Repo

FileDescription
v2-system-prompt.mdComplete v2 system prompt (14,476 chars)
v2-user-prompt.mdComplete v2 user prompt template (2,841 chars)
backend-variables.mdBackend variable reference
session-summary.mdThis file — full session summary for sharing

Google Docs (editable versions)