From platinum-seo-engine
Use when: kullanıcı "yeni blog yaz", "blog üret", "content gen", "blog draft", "makale yaz", "yeni içerik üret", "new blog post", "pillar yaz", "cluster yaz" der ya da /pseo-new-blog çağırır; master.xlsx[new_content_plan] satırından plan al, SERP analiz yap, 5 template render et, JSON-LD @graph 5 entity üret, Foundational Principles 3-katman (truth-verifiable + profile-aware + anti-cheap-content) enforce et. Also use when: master.xlsx[topical_map] içinde assigned_url=null olan pillar/cluster/supporting satırı için ilk içerik üretilecek; new_content_plan satırının lifecycle_status=GREEN ya da PLANNED durumda; mode='draft' (review) veya 'publish' (immediate) seçildi; profile-aware switch tetik (project-config[profile] ya da project-config[profiles] priority merge). Do not use when: mevcut blog revize için (revise-content kullan); FAQ block re-render için (faq-optimization kullan); decay/sunset/prune için (content-remediation kullan); image generation için (generate-images kullan); manuel WordPress upload için (Section A upload-instructions template render edilir, skill upload yapmaz); master.xlsx eksikse (init-project önce çalışmalı, DURUR #1).
How this skill is triggered — by the user, by Claude, or both
Slash command
/platinum-seo-engine:new-blogThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Plan-driven full-article generator. Reads a single
Plan-driven full-article generator. Reads a single
master.xlsx[new_content_plan] row, joins it against
master.xlsx[cluster_keywords] (keyword set + intent + forbidden filters)
and master.xlsx[topical_map] (pillar/cluster/supporting page_type +
internal-link plan), runs SERP top-10 + mandatory Tier-1 Scrapling
competitor recon (×10 organic, CCE arming) and gates the draft against the
Brief Paketi, then renders four artifacts:
outputs/blog/{slug}/article.html — <article class="pse-blog-post">
fragment (R-22 fragment boundary; no <html> / <body> wrap).outputs/blog/{slug}/schema.jsonld — JSON-LD @graph with 5
entities (Article + Organization + Person + BreadcrumbList +
FAQPage; R-78..R-83).outputs/blog/{slug}/meta-tags.json — meta title (≤580px desktop)
outputs/blog/{slug}/upload-instructions.md — Section A new-blog
manuel WordPress upload workflow (R-74); skill itself does NOT
publish.The skill is READ-ONLY with respect to master.xlsx
(new_content_plan allowed_writers is null — F-1 schema authority,
verified pre-flight). It never calls transaction.append,
transaction.update, or transaction.delete against the workbook.
The only state mutation is the audit append to _state/events.jsonl
with event_type=content_new.
| Name | Type | Default | Notes |
|---|---|---|---|
project_slug | string | — | Required. projects/{slug}/ workspace root. |
new_content_plan_id | string | — | Required. Row id (kolon A) in master.xlsx[new_content_plan]. |
mode | string | draft | draft (review) or publish (immediate). Other values → DURUR #5. |
outputs/blog/{slug}/article.html — schema-markup-aware, WCAG 2.1 AA
compliant, BEM pse- CSS class prefix HTML article fragment.outputs/blog/{slug}/schema.jsonld — JSON-LD @graph 5 entity
(Article + Organization + Person + BreadcrumbList + FAQPage).outputs/blog/{slug}/meta-tags.json — meta title (≤580px) + meta
description (≤990px) per R-35 + OG + Twitter pack.outputs/blog/{slug}/upload-instructions.md — Section A new-blog
WordPress manual upload steps (R-74)._state/events.jsonl — audit append, event_type=content_new,
event_kind=work (events.schema enum: provenance / work / audit /
workflow), schema_version=1.0.The 3 üst-prensip (Phase 10 rules/content-quality.md#foundational-principles)
gate this skill end-to-end. No alt-rule (R-01..R-148) overrides them.
Statement. Tüm content/source/link/data %100 doğru ve kanıtlanabilir; uydurma yasak (kaynak, hikaye, case study, fiyat, stat, ürün/feature/ image-link).
3-katman defense (Step 8 implements):
content_settings.original_research_database + SERP top-10 source
match; citation count ≥ R-44 threshold.content_settings.experience_database
lookup, uydurma quote yasak).Failure mode: RED — yayın iptal, çıktı discard. DURUR #6 trigger.
Statement. Skill behavior project.config.json[profile] enum'una
göre değişir (singular field, Phase 11 W-F1 cascade fix). When profile
is unset, fall back to profiles[] priority merge per
rules/content-quality.md Principle 2 tablosu.
Enum 5-value: e-commerce / ymyl / local-service / b2b-saas /
portfolio.
Switch logic (Step 2 + Step 7 + Step 8):
| Boyut | YMYL | e-commerce | b2b-saas | local-service | portfolio |
|---|---|---|---|---|---|
| Author byline (R-28) | Zorunlu | Yok | Esnek | Esnek | Yok |
| Tone | semi-pro + siz | conversational+sen | formal + siz | conversational+siz | esnek |
| Word count | 1500–4000 | 800–2500 | 1800–3500 | 1000–2500 | 800–2000 |
| Counter-argument (R-50) | Zorunlu | Skip | Opsiyonel | Skip | Skip |
| Disclaimer (R-51) | medical/legal/financial | Skip | Opsiyonel | Skip | Skip |
| Image style | clean-illustration | product-photo | diagram-screenshot | location-photo | esnek |
| Stats density (R-104) | min 1/500w, max 1/200w | min 1/800w, max 1/300w | min 1/600w, max 1/250w | min 1/1000w, max esnek | esnek |
Failure mode: AMBER — wrong profile resolution worker raporlar; RED
ancak profile enum dışı (DURUR #2).
Statement. AI'ın doğal cheap content padding davranışını preempt et.
7-pattern gate (Step 8 implements):
brand_identity.tone_phrases_blocklist
consume + replace pattern ("Aslında", "Sonuç olarak", "Özetle",
R-118).Failure mode: AMBER warning (auto-correct attempt) → RED fail (manuel revise). 2x AMBER aynı pass → RED upgrade.
Bank entry (R-105 expert quote / R-114 original research / R-119
first-hand experience) selection passes a 3-step filter before any
template renders. Step 7 (render_5_templates) reads the result; Step
12 (emit_provenance) records the chosen entries. R-121 catches
semantic repetition (the same core fact copy-pasted across many
blogs); R-118 catches stylistic repetition (AI signature words
within one page). The two rules compose — both fire pre-publish.
entry.applicable_topics ∩ (new_content_plan.primary_keyword ∪ new_content_plan.assigned_cluster ∪ topical_map[matching_row].cluster) ≠ ∅ → entry remains a
candidate; empty intersection → entry skipped._state/events.jsonl content_new work events whose
note records bank_entry_id == entry.id AND
timestamp >= now - 30d. Skip if
count >= entry.max_usage_per_month; rotate to a different entry or
to a different phrasings[] form of the same entry.If all candidates fail the 3-step filter, the skill emits AMBER and
retries with phrasings[] rotation; 2x AMBER same pass → RED upgrade
(manual review).
Post-publish usage record (in the events.jsonl audit append at
Step 12): the content_new work event records the bank_entry_id(s)
used inside its note field — the append-only _state/events.jsonl is
the only state surface this skill writes (consistent with the
READ-ONLY claim above). The rotation counter at Step 3 reads from this
same append-only content_new event log on the next invocation —
single source of truth. The skill does NOT write
master.xlsx[completed_work] (allowed_writers=null — F-1); if a
durable completed_work row is later required, the done-protocol /
mark-done skill owns that append.
Schema enablement (v1.4, commit 8e07e1c): each bank entry exposes
applicable_topics, phrasings, last_used_in_content_id,
max_usage_per_month. Stage C of brand-onboarding (commit cb8df43)
populates these via R-44 evidence-gated atomic write.
Runtime integration deferred to Phase 11 Wave 2. This SKILL.md
section is the spec lock. scripts/production/new_blog.py now exists (CCE
B4 orchestrator helpers assemble_brief / evaluate) but does NOT yet
implement the R-121 3-step bank filter. When Wave 2 lands that runtime,
the 3-step filter implements as a pre-render_5_templates helper consumed
by Step 7.
YMYL profillerinde (profile == "ymyl"), R-124 gereği yazar künyesi
(R-28) yalnızca kayıtlı bir insan incelemesi ile geçerlidir. Bu
skill, YMYL içeriğini yayınlamadan ÖNCE zorunlu bir inceleme-imzası
adımı çalıştırır (Step 11.5 ymyl_review_signoff, Step 11 ile Step 12
arasında):
scripts/state/events_writer.append_audit(...) ile bir
event_kind=audit satırına yazar:
audit_action="modified" (events.schema 6-değer canonical enum
{created, modified, deleted, accessed, permission_changed, config_changed} — içeriğin yayın-öncesi inceleme kapısı
onaylandı/değiştirildi).audit_target="content:{project_slug}:{post-slug}".actor="skill:new-blog".notes payload üç zorunlu alan taşır (R-124): reviewer
(inceleyen adı) + review_date (ISO 8601) + content_version
(content hash veya R-103 revision id).Non-YMYL profillerde bu adım atlanır (R-28 künye opsiyonel/yok), audit satırı yazılmaz.
new-blog artık CCE motorunu çalıştırır: rakipten ölçülebilir biçimde daha
iyi içerik üretmek için bir silahlan → yaz → kapı → re-write döngüsü.
Mimari kural (spec §3): döngüyü Claude (bu skill) sürer çünkü
scripts/production/new_blog.py SAF Python'dur — MCP'yi/Claude'u ÇAĞIRMAZ;
döngüye yalnızca iki saf yardımcı verir (assemble_brief, evaluate). MCP
sınırı skill'e (Claude'a) aittir; deterministik tutkal koda.
Claude ham veriyi MCP ile toplar (kod değil), diske yazar, sonra
new_blog.assemble_brief(...)'i çağırır:
| Sinyal | MCP tool (Claude çağırır) | Not |
|---|---|---|
| SERP top-10 organic | mcp__dataforseo__serp_organic_live_advanced depth=10 | rakip sıralaması + URL listesi |
| Rakip DOM ×10 | mcp__ScraplingServer__stealthy_fetch | ZORUNLU her organic URL (Step 4) |
| Keyword genişleme | mcp__dataforseo__dataforseo_labs_google_keyword_suggestions + …_keyword_overview | reliable substring + volume/intent |
| AI Overview | serp_organic_live_advanced ai_overview bloğu | gerçek answer_points (Step 5) |
| GSC sinyali | mcp__gsc__search_analytics | {real_queries, current_position} |
assemble_brief 3 B1 transform'u sırayla çalıştırır (competitor_recon_transform
keyword_aio_intel_transform + build_brief) → tam Brief Paketi
(gap + structure_ceiling + keyword_set + aio + gsc). GSC sinyali
gsc= parametresiyle build_brief'in boş default'unu override eder.Claude makaleyi yazar; rules/content-craft-discipline.md (R-149..R-153)
pozitif yazım katmanını uygular: pain-mirror empati girişi (R-149), somut
örnek/senaryo (R-150), aktif marka sesi (R-151), rakip-üstü özgün değer
data-original="true" (R-152), H2 derinliği + mantıksal akış (R-153). Brief'in
gap maddeleri kapsanır; structure_ceiling+1 anlamlı tablo/liste hedeflenir.
Foundational Principles 3-katman + R-121 bank seçimi yine geçerlidir (üstte).
new_blog.evaluate(...)Üretilen HTML new_blog.evaluate(content_html, brief, round_num=..., max_rounds=3)
ile ölçülür; bu scripts/production/quality_gates.py'nin run_all'ini IMPORT
ile çağırır (subprocess değil) — 8 kapı sırasıyla: p0_truthfulness > gap >
structure > depth > aeo > voice > originality > schema_visual. Döner:
{gate_result, action, feedback}.
action | Anlam | Sonraki adım |
|---|---|---|
PASS | overall PASS | yayın akışına devam (Step 9+) |
REWRITE | overall RED, round < 3 | feedback (= rewrite_feedback) ile YENİDEN yaz (adım 2) |
AMBER_TERMINAL | overall RED, round ≥ 3 | 3-tur cap — sonsuz döngü YOK; eksik kapılar operatöre raporlanır (spec §8) |
AMBER yalnız orkestratör kararıdır; kapıların kendisi PASS/RED kalır. Döngü
PASS'e ya da AMBER_TERMINAL'e ulaşana kadar adım 2 ↔ 3 tekrar eder. Craft
kuralı ↔ kapı eşlemesi: R-149 → voice+aeo, R-150 → depth, R-151 → voice,
R-152 → originality, R-153 → depth (content-craft-discipline.md).
Step names are stable identifiers across runs (used as
steps[*].namewhen the skill callsworkflow_runner.create_run).
read_master_xlsxmaster.xlsx[new_content_plan] row read where
id == {input.new_content_plan_id}. master.xlsx[cluster_keywords]
filter where assigned_url == new_content_plan.url_slug.
master.xlsx[topical_map] filter where
pillar == new_content_plan.assigned_cluster OR
cluster == new_content_plan.assigned_cluster.
Workbook opens with openpyxl.load_workbook(read_only=True). F-1
allowed_writers=null discipline: skill MUST NOT call
transaction.append, transaction.update, or transaction.delete.
new_content_plan 14 columns consumed:
id, title, url_slug, primary_keyword, monthly_volume, assigned_cluster, target_word_count, priority, created_date, tivl_tag, lifecycle_status, image_prompt, alt_text, content_type (Phase 10 additive bump).
content_type enum: [listicle, guide, comparison, research, tutorial, review].
cluster_keywords 11 columns consumed: cluster, keyword, monthly_volume, data_source, assigned_url, gsc_clicks, gsc_impressions, gsc_position, intent, forbidden_kw, forbidden_reason. intent enum:
[Informational, Commercial, Transactional, Navigational].
topical_map 10 columns consumed: pillar, cluster, primary_keyword, monthly_volume, data_source, assigned_url, page_type, status, priority, note. page_type enum: [pillar, cluster, supporting].
DURUR #1. master.xlsx eksik → init-project skill önce çalışmalı.
read_project_config (Profile-Aware Switch)projects/{slug}/project.config.json parse. Singular profile field
(schema v1.2, Phase 11 W-F1 cascade fix) is the dominant Principle 2
switch; when missing, fall back to profiles[] priority merge per
rules/content-quality.md Principle 2 tablo.
content_settings 14 fields consumed (Phase 10): toc_strategy, related_posts_strategy, author_strategy, css_strategy, indexnow_enabled, ai_training_optin, video_integration, internal_data_sharing, external_uniqueness_check, original_research_database, experience_database, video_database, disclaimer_templates, image_model.
brand_identity 18 fields consumed (Phase 10): logo_url, primary_color, secondary_color, accent_color, font_family_heading, font_family_body, header_template_id, footer_template_id, source_url_for_sampling, tone, hitap, anglicism_tolerance, tone_phrases_blocklist, font_heading, font_body, default_hero_url, same_as_urls, image_style.
DURUR #2. Singular profile enum dışı bir değere sahipse RED;
schema v1.2 cascade fix uygulanmadıysa (schema_version != "1.2" ve
profile field schema'da yok) önce scripts/migrations/0002_project_ config_1.1_to_1.2.py çalışmalı.
serp_analysis (R-08)mcp__dataforseo__serp_organic_live_advanced çağrı:
keyword=new_content_plan.primary_keyword, depth=10. Top-10 sonuç +
entity extract (organic results dom_url, title, description).
DURUR #5. SERP analiz fail (boş response, API error, mode enum dışı)
→ manuel input gerekli, skill awaiting_approval.
scrapling_competitor_recon (CCE silahlanma, R-08 derinleştirme)ZORUNLU (artık optional değil; top-3 değil top-10). SERP top-10 organic
sonucun HER BİRİ için mcp__ScraplingServer__stealthy_fetch ile DOM çekilir —
CCE silahlanma motoru rakip kapsamasının TAMAMINI görmeli (spec §4a), yarısını
değil. Her sayfa {"url": ..., "html": ...} olarak biriktirilir; bu liste +
ham SERP assemble_brief'e verilir → competitor_recon_transform heading tree
Tier-0 fallback (basic SERP description) yalnızca tek bir URL kalıcı 403/blok verirse o URL'e özgüdür; Scrapling required MCP bağımlılığı olduğundan adım topluca atlanamaz. Eksik/bloklu sayfalar AMBER warning raporlanır, silahlanma toplanan sayfalarla devam eder.
aio_citation_check (R-109/R-110/R-111 + CCE AEO)Pasaj alıntılanabilirlik: SERP top-10 page'lerde featured snippet detect (R-109), people_also_ask (R-110), ai_overview citation (R-111).
CCE AEO bağı. Ham serp_organic_live_advanced payload'undaki ai_overview
bloğu boş heuristik DEĞİL, assemble_brief → keyword_aio_intel_transform ile
gerçek aio.answer_points (+ aio.cited_sources) listesine dönüştürülür ve
Brief Paketi'nin aio alanına yazılır. Bu answer_points B2 kapı motorunun
aeo kapısı tarafından ölçülür: içerik bu noktaların HER BİRİNİ kapsamalı
(aio.present=False ise yalnız "intro cevap-önce" şartı — R-149 / spec §6 R2).
content_gapcluster_keywords[forbidden_kw] negatif filter (forbidden_reason
kontrol). topical_map gap detect: status == 'planned' AND assigned_url == null. Internal link plan: relevant
topical_map[pillar/cluster] URL'leri article body içinde reference
(per ~300 word 1 link, R-06).
render_5_templates5 template render-time slot consume (4 file + 1 internal upload section):
templates/content/new-blog.template.md — markdown skeleton
(frontmatter + H1/H2/H3 outline). Planning-only, NOT yayınlanır.templates/content/new-blog.template.html — HTML article fragment
(<article class="pse-blog-post"> kök, R-22 fragment boundary).templates/content/faq-block.template.html — FAQ statik R-43
(accordion <details> + <summary> YASAK, R-43 statik HTML zorunlu).templates/content/upload-instructions.template.md — Section A
new-blog kısmı.Render-time slot dictionary:
| Slot | Source |
|---|---|
{primary_keyword} | new_content_plan.primary_keyword |
{tone} | brand_identity.tone (Principle 2 profile-aware override) |
{hitap} | brand_identity.hitap |
{primary_color} | brand_identity.primary_color |
{font_heading} | brand_identity.font_heading (alias to font_family_heading) |
{font_body} | brand_identity.font_body |
{author} | content_settings.author_strategy switch (YMYL byline-required) |
{disclaimer} | content_settings.disclaimer_templates[profile_kind] |
{default_hero_url} | brand_identity.default_hero_url (R-77 fallback) |
{image_style} | brand_identity.image_style (Principle 2 profile-aware) |
CSS class prefix: pse- BEM (plugin agnostik — proje slug
hardcode YASAK, e.g. demo-dental/demo-furniture/demo-hvac/demo-petcare/demo-shop/
demo-tires/demo-construction/demo-agency slug'lar HTML/CSS içinde geçemez).
foundational_principles_gate3-katman gate çalışır (Principle 1 + 2 + 3 yukarıda detaylı). Çıktı: P1 RED → DURUR #6; P2 enum dışı → DURUR #2; P3 7-pattern AMBER 2x → RED upgrade.
render_jsonld_graph (R-78..R-83)JSON-LD @graph 5 entity render:
Article — headline, description, datePublished, dateModified, author (Person ref), publisher (Organization ref), image, mainEntityOfPage.Organization — name, logo (logo_url), sameAs (same_as_urls; R-100).Person — name, jobTitle, knowsAbout (author_strategy switch,
R-105 expert quote bank-driven content_settings.experience_database
lookup; uydurma yasak — Principle 1 Layer 3).BreadcrumbList — Home > Pillar > Cluster > Article (R-83 4-level
cap).FAQPage — talep-güdümlü 3-6 FAQ Q&A items, hard cap 10 (R-79; R-09).Validate: Google Rich Results Test API mock validate (skill internal — actual API call optional). DURUR #8 trigger: REJECT → schema fix önce.
meta_pixel_wcag_validateMeta title pixel calc: ≤580px desktop (R-35 single authority; ~60 char is only a tech-audit approximation heuristic — Türkçe glyph widths vary, so the pixel cap is authoritative, not the char count). Meta description pixel calc: ≤990px desktop (R-35; ~160 char heuristic only). DURUR #7 trigger: cap aşımı → auto-correct attempt; fail ise manuel revise.
WCAG 2.1 AA axe-core simulate: violations=0 hedef. Color contrast
(primary_color vs background) ≥ 4.5:1. Image alt text required
(new_content_plan.alt_text consume; uydurma alt-text yasak —
Principle 1).
write_outputs4 artefact yaz:
outputs/blog/{slug}/article.html — <article class="pse-blog-post">
kök, R-22 fragment boundary.outputs/blog/{slug}/schema.jsonld — JSON-LD @graph.outputs/blog/{slug}/meta-tags.json — meta title/description/OG/
Twitter pack.outputs/blog/{slug}/upload-instructions.md — Section A WordPress
media library workflow (R-74).emit_provenance_state/events.jsonl append (audit):
| Field | Value |
|---|---|
event_type | content_new (events.schema event_type enum) |
event_kind | work (events.schema enum, ADR-020) |
schema_version | 1.0 |
actor | skill:new-blog |
target | master.xlsx[new_content_plan]#{id} |
timestamp | UTC ISO 8601 |
mode | input.mode (draft / publish) |
| # | Trigger | Resolution |
|---|---|---|
| 1 | master.xlsx eksik | init-project önce çalışmalı (Phase 5 W-Q paterni) |
| 2 | project-config[profile] enum dışı / schema v1.2 yok | scripts/migrations/0002_project_config_1.1_to_1.2.py |
| 3 | 6 rules dosyası eksik | Phase 10 deliverable verify (e4369ea commit) |
| 4 | MCP budget aşımı (estimated_credits 8) | scripts/budget/check_budget.py blocked |
| 5 | SERP analiz fail (R-08, mode enum dışı) | manuel input, awaiting_approval |
| 6 | P1 fact-check fail | RED — çıktı discard, claim revize |
| 7 | meta pixel cap aşımı | auto-correct fail ise manuel revise |
| 8 | Schema Rich Results Test REJECT | JSON-LD @graph fix önce |
| 9 | YMYL profili + reviewer adı yok (R-124 imza eksik) | RED yayın bloklu; operatör reviewer adlandır + append_audit kaydı (reviewer+review_date+content_version) |
Phase 10 finished without project-config[profile] (singular) which
Foundational Principle 2 directly cites. Phase 11 W-F1 closes that gap
in the SAME atomic commit as the new-blog skill itself, so this skill
ships with a schema-valid Principle 2 contract from day one.
File 1 — schemas/project-config.schema.json:
schema_version "1.1" → "1.2".properties.profile added (singular, enum 5-value:
e-commerce / ymyl / local-service / b2b-saas / portfolio).required[] UNCHANGED (additive policy →
rules/schema-versioning-discipline.md).File 2 — scripts/migrations/0002_project_config_1.1_to_1.2.py:
.bak backup).migrate(doc) -> dict
function for tests.File 3 — scripts/state/bootstrap_project.py:
SCHEMA_VERSION = "1.1" → "1.2" constant update.File 4 — tests/skills/test_init_project.py:
schema_version assertion "1.1" → "1.2".profile field with the exact enum 5-value.Smoke test (cascade fix verify):
python3 scripts/migrations/0002_project_config_1.1_to_1.2.py \
--in /tmp/test_config.json --dry-run
jq '.properties.schema_version.const' schemas/project-config.schema.json
jq '.properties.profile.enum' schemas/project-config.schema.json
Expected: schema_version "1.2", profile.enum array of 5 strings.
demo-dental, demo-furniture, demo-hvac, demo-petcare, demo-shop, demo-tires,
demo-construction, demo-agency are FORBIDDEN tokens — pytest grep verifies).pse- BEM only (pse-blog-post, pse-h2-answer,
pse-tldr, pse-faq-block).brand_identity (per-
project), never via hardcoded color/font.budget.estimated_credits
(number) is the only allowed shape per skill-frontmatter schema.| Failure | Mode | Action |
|---|---|---|
| master.xlsx schema drift | RED | DURUR #1, init-project re-run |
| project-config[profile] dışı | RED | DURUR #2, cascade fix verify |
| MCP DataForSEO budget exhausted | RED | DURUR #4, budget gate |
| Tier-1 Scrapling 403 / blocked | AMBER | tier-0 SERP description fallback |
| P1 citation missing | RED | DURUR #6, claim revize |
| P3 7-pattern AMBER 2x same pass | RED | manuel revise |
| meta pixel cap > 580 / 990 (R-35) | AMBER | auto-correct → fail RED |
| Schema Rich Results REJECT | RED | DURUR #8, @graph fix |
rules/content-quality.md (Foundational Principles, R-01..R-148).rules/content-html-discipline.md (R-22 fragment, R-23 inline CSS,
R-43 statik FAQ, R-77 fallback hero).rules/content-seo-discipline.md (R-08 SERP, R-78..R-83 schema).rules/content-eeat-discipline.md (R-28 byline, R-44 source verify,
R-104 stats-density single-source, R-105 expert quote, R-114/R-119
research bank, R-124 YMYL pre-publish review sign-off).rules/content-llm-discipline.md (R-109..R-111 AIO citation, R-118
humanize).rules/content-update-discipline.md (R-50 counter-argument).rules/content-craft-discipline.md (R-149..R-153 — CCE pozitif yazım
katmanı: pain-mirror giriş, somut örnek, marka sesi, özgünlük, derinlik).scripts/production/new_blog.py (CCE B4 orkestratör yardımcıları —
assemble_brief + evaluate; saf Python, MCP/Claude çağırmaz).scripts/production/quality_gates.py (CCE B2 8-kapı motoru — run_all).schemas/project-config.schema.json v1.4 (Phase 3.1 bank entry
schema bump — applicable_topics, phrasings,
last_used_in_content_id, max_usage_per_month fields R-121 reads;
W-F1 v1.2 + Phase 11 cascade still applies for profile singular).schemas/master-excel.schema.json (18 sheets — internal_links and
content_gaps are NOT among them; F-4 schema authority).schemas/events.schema.json (event_type enum 12 values, event_kind
enum 4 values).schemas/skill-frontmatter.schema.json (8 required fields, category
enum 8 values, status enum 3 values).This skill is status: wip until Phase 11 Wave 2 acceptance gate;
active bump deferred to the post-Wave 1 closeout. Manager owns the
status flip + governance audit.
npx claudepluginhub popiliadam/platinum-seo-engine --plugin platinum-seo-engineUse when: kullanıcı "blog revize et", "içerik güncelle", "decay düzelt", "section revise et", "blog tazele", "post güncelle", "article refresh" der ya da `/pseo-revise` çağırır. master.xlsx [content_decay] satırından action="revise" alındığında, R-87 section-targeted diff workflow uygulanır, R-88 freshness theater preempt edilir, R-89 canonical preserve edilir. Also use when: GSC clicks delta drop > threshold detect edildiğinde (R-85 multi-signal: clicks_delta < -20%, delta_pct < -15%, trend "down" 3-month rolling); manuel revise request var ve mevcut blog outputs/blog/{slug}/article.html olarak diskten okunabiliyor; project-config[profile] enum 5-değer (e-commerce | ymyl | local-service | b2b-saas | portfolio) içinden biri sabit ve revize sırasında profile-aware tone preserve edilecek (Principle 2). Do not use when: yeni blog için (new-blog skill kullan); FAQ block re-render için (faq-optimization Wave 2 kullan); decay action "prune"/"redirect"/"delete" için (content-remediation Wave 2 domain); image generation için (generate-images kullan); existing HTML diskte yok (DURUR #1, R-89 canonical preserve enforce edilemez); R-85 multi-signal threshold satisfied değil (DURUR #3, revize gereksiz); R-87 section-targeted yasak ve scope=full manuel approve olmadan (DURUR #5).
Manages full-lifecycle blog content with 30 sub-skills for writing, rewriting, analysis, SEO, schema, images, repurposing, and multilingual publishing. Optimized for Google rankings and AI citations.
Writes publish-ready SEO blog articles from a keyword pipeline, including research, competitor scraping, images, schema markup, and publishing checklist.