-
Notifications
You must be signed in to change notification settings - Fork 0
[blogger-playbook] rewrite blogger around the SEO PLAYBOOK (SERP-steal, intent, bilingual, GEO) #94
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,6 +4,13 @@ Daily SEO-driven blog engine for knowcap.ai. Fires 07:00 Sun–Thu (open:agent, | |
| Read this fully, then execute. The full spec is [`ROUTINE.md`](./ROUTINE.md); the per-mode | ||
| prompts + gates are [`_skills/write-blog-draft/SKILL.md`](../_skills/write-blog-draft/SKILL.md). | ||
|
|
||
| **READ THE PLAYBOOK FIRST (every run):** `../claude-knowcap/marketing/digital-employees/seo/PLAYBOOK.md` | ||
| — the 7 laws shared with the `seo` routine. It governs HOW we win non-brand clicks. The blogger owns the | ||
| **content lane** (writing); the seo routine owns the mechanical lane. Where any step below conflicts with | ||
| the playbook, the playbook wins. The load-bearing reality it encodes: 16 EN thesis posts earned **0 | ||
| non-brand clicks in 28 days** — that format is dead. Stop inventing essays; answer the live SERP, in the | ||
| language the demand is in. | ||
|
|
||
| ## Mission | ||
|
|
||
| Every day: pull live MENA SEO demand, refresh the ranked opportunity queue, surface a | ||
|
|
@@ -22,21 +29,42 @@ hit a quota. | |
| 2. **Digest** — surface the top picks to Hassan in the run window / Claude agents sidebar. | ||
| 3. **Burn-state** — read `burn-state.json`; decide if today is a blog-gen day (see ROUTINE.md | ||
| "Daily flow + burn cadence"). If not → done for today (insights only). | ||
| 4. **Blog day** — pick the persona's top fresh EN opportunity as `target_keyword`. Assemble inputs | ||
| (persona section from `../claude-knowcap/company/docs/research/product-personas.md`, | ||
| VISION from `../claude-knowcap/company/docs/strategy/vision.md`, | ||
| POSITIONING from `../claude-knowcap/company/docs/strategy/POSITIONING.md`; | ||
| shipped slugs; queue row's volume+comp). | ||
| 5. **Mode** — try in order: | ||
| (1) **case-study**: Demo-org → persona project → source with ≥3 confirmed memories → cite `source_knowcap_ids`, generate verification panel via `lib/gen-verification-panel.mjs`. | ||
| (2) **comparison**: freshest `../claude-knowcap/company/docs/research/competitors-*.md` < 30d AND not covered in last 5 shipped → compare. | ||
| (3) **thesis**: default. | ||
| 6. **Write** via write-blog-draft SKILL → run ALL gates (banned words, 1300–1600 words, keyword | ||
| in title+H2+≥3, slug unique, exactly 5 FAQ, frontmatter). Fail → regenerate/skip, never ship thin. | ||
| 7. **Output** — draft → `docs/content-pipeline/drafts/<slug>.md`, open `[blog-draft]` PR to main. | ||
| 4. **Blog day — pick + classify the keyword.** Take the persona's top fresh opportunity as | ||
| `target_keyword` (best by score, NOT "the top EN one" — Arabic is in play now). | ||
| - **Classify intent (Law 2):** navigational/tool (login/download/تسجيل دخول/تحميل, bare brand) → | ||
| **skip this keyword**, advance to the next. Commercial (best/software/tool/vs/for-persona/pricing) → | ||
| **money-page mode** (Law 3), not a blog. Informational (how/what/template/نموذج/دليل) → continue. | ||
| - **Pick language (Law 4):** Arabic-demand keyword → **native Arabic post** (`lang: ar`, `dir: rtl`, | ||
| slug suffixed `-ar`), written in Arabic for Arabic searchers. English-demand → English. Note the | ||
| EN/AR hreflang pair to link. | ||
| - Assemble inputs (persona section from `../claude-knowcap/company/docs/research/product-personas.md`, | ||
| VISION `…/strategy/vision.md`, POSITIONING `…/strategy/POSITIONING.md`; shipped slugs; queue row's | ||
| volume+comp). | ||
| 5. **Steal the SERP / inherit the brief (Law 1 — MANDATORY gate).** Look for the matching SEO brief at | ||
| `../claude-knowcap/knowledge/topics/research/seo/content-briefs/<keyword-slug>.md`. **If it exists, it | ||
| IS the SERP steal** — write TO it (it carries intent, the H2 outline that beats top-10, PAA questions, | ||
| target word count, the citable-passage callouts). If NO brief exists, pull the live top-3 yourself via | ||
| `serp_organic_live_advanced` (keyword's market: AR→KSA/Egypt+Arabic, EN→Egypt/UAE+English); extract the | ||
| avg word count, the H2s every top result shares, and the PAA. **A draft not shaped from a brief or a | ||
| live SERP is REFUSED** — no more invented essays. | ||
| 6. **Mode** — within informational intent, pick the spine: | ||
| (1) **case-study**: Demo-org → persona project → source with ≥3 confirmed memories → cite | ||
| `source_knowcap_ids`, generate verification panel via `lib/gen-verification-panel.mjs`. | ||
| (2) **comparison**: freshest `../claude-knowcap/company/docs/research/competitors-*.md` < 30d AND not | ||
| covered in last 5 shipped → compare. | ||
| (3) **thesis**: default — now **SERP-grounded** (answer the query the way the winning results do, beat | ||
| their depth; never a free-form opinion essay). | ||
| For **commercial** intent → **money-page mode** (a `/compare/*` or use-case "zipper" landing page, | ||
| Law 3 — the only format that ranks #1 for us), not a blog post. | ||
| 7. **Write** via write-blog-draft SKILL → run ALL gates (banned words; word count = the SERP/brief target | ||
| (beat top-10), not a fixed range; keyword in title+H2+≥3; 134–167w citable passages; schema + exactly | ||
| 5 FAQ; correct `lang`/`dir` + hreflang pair; slug unique; frontmatter). Fail → regenerate/skip, never | ||
| ship thin. | ||
| 8. **Output** — draft → `docs/content-pipeline/drafts/<slug>.md`, open `[blog-draft]` PR to main. | ||
| Always report live URL: `https://knowcap.ai/blog/<slug>` — post goes live automatically on PR merge | ||
| via `.github/workflows/publish-blog-draft.yml` + `scripts/publish-draft.mjs` (no manual move needed). | ||
| Update `burn-state.json` (total_posts++, posts_this_week++). | ||
| Update `burn-state.json` (total_posts++, posts_this_week++). After the PR opens, hand the URL to the | ||
| `seo` routine's TASK 9 (request-indexing) so it gets indexed in ~1 day, not weeks (Law 6). | ||
|
Comment on lines
+59
to
+67
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
# Verify SEO routine TASK 9 and citable passage source
# 1. Find seo routine TASK 9
rg -n 'TASK 9|request-indexing|request indexing' ../claude-knowcap/marketing/digital-employees/seo/ || echo "Not found in expected path"
# 2. Search for 134 or 167 in playbook or specs
rg -n '134|167' ../claude-knowcap/marketing/digital-employees/seo/PLAYBOOK.md 2>/dev/null || echo "Not in playbook"
rg -n '134|167' routines/_skills/write-blog-draft/SKILL.md 2>/dev/null || echo "Not in SKILL.md"
# 3. Check for burn-state.json update logic in scripts
rg -n 'burn-state' routines/blogger/scripts/ || echo "No script references found"Repository: Knowcap-V2/knowcap-website Length of output: 1855 🏁 Script executed: #!/bin/bash
set -euo pipefail
# Map the relevant files and search for the SEO handoff and URL rules.
git ls-files | rg '(^|/)(AGENT\.md|PLAYBOOK\.md|SKILL\.md|burn-state\.json|publish-blog-draft\.yml|publish-draft\.mjs|seo|blogger)'
printf '\n-- TASK 9 / request-indexing matches --\n'
rg -n 'TASK 9|request-indexing|request indexing|seo routine' routines .github scripts docs || true
printf '\n-- live URL / blog slug matches --\n'
rg -n 'https://knowcap\.ai/blog/|/blog/<slug>|hreflang|lang/dir|burn-state\.json|total_posts\+\+|posts_this_week\+\+' routines .github scripts docs || trueRepository: Knowcap-V2/knowcap-website Length of output: 4482 🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '\n-- audit-seo skill --\n'
ast-grep outline routines/_skills/audit-seo/SKILL.md --view expanded || true
printf '\n-- request-indexing matches in repo --\n'
rg -n 'request-indexing|request indexing|indexing|TASK 9' routines/_skills routines/blogger .github scripts docs || true
printf '\n-- blogger routine/AGENT relevant lines --\n'
sed -n '56,70p' routines/blogger/AGENT.md
printf '\n-- audit-seo file excerpt --\n'
sed -n '1,220p' routines/_skills/audit-seo/SKILL.mdRepository: Knowcap-V2/knowcap-website Length of output: 3200 Remove the nonexistent SEO handoff 🧰 Tools🪛 LanguageTool[uncategorized] ~65-~65: The official name of this software platform is spelled with a capital “H”. (GITHUB) 🤖 Prompt for AI Agents |
||
|
|
||
| ## Hard rules | ||
|
|
||
|
|
@@ -45,7 +73,9 @@ hit a quota. | |
| - **Quality > quota** — no fresh opportunity clears the gates → skip the day. A missed burn post beats a thin one (Google scaled-content-abuse demotes the whole domain). | ||
| - **Honesty** — case-study only on genuinely human-confirmed claims. SEO-grounded thesis must add real value, not keyword-stuff. Never claim a verification panel for unconfirmed claims. | ||
| - **No duplicates** — dedup against last 20 shipped slugs AND in-flight drafts. The queue already flags `covered`. | ||
| - **English posts**, MENA-targeted (mine EN + AR demand, publish EN). | ||
| - **SERP-steal is a gate (Law 1)** — never write from imagination. Inherit the SEO brief, or pull the live SERP yourself, first. No brief + no SERP = no draft. | ||
| - **Intent-match or skip (Law 2)** — navigational/tool keyword → skip; commercial → money page, not a blog; only informational keywords become posts. | ||
| - **Bilingual, demand-driven (Law 4)** — write in the language of the keyword's demand. Arabic-demand → native Arabic post (`lang: ar`, `dir: rtl`); English-demand → English. EN-only is retired; the largest winnable demand is Arabic. Pair EN/AR with hreflang. | ||
| - **DataForSEO down → stop**, don't invent data. One-line error, never silent. | ||
|
|
||
| ## Files | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Missing prompt for
comparisonmode.The modes table lists four modes (
money-page,thesis,case-study,comparison), but onlythesisandmoney-pagehave dedicated prompt sections below. Either add acomparisonmode prompt or remove it from the table to avoid runtime ambiguity when the routine selects it.♻️ Suggested fixes
Option A — Add a comparison prompt (preferred if the mode is real):
Option B — Remove from table if not yet implemented:
-| **`comparison`** | Competitor research + persona + audit | When `../claude-knowcap/company/docs/research/competitors-*.md` is < 30 days AND not covered in last 5 shipped. |🤖 Prompt for AI Agents