From platinum-seo-engine
Use when: kullanıcı "yeni proje", "brand onboarding", "proje bootstrap", "wizard çalıştır", "yeni site ekle", "project-config oluştur" der ya da /pseo-brand-onboarding çağırır; brand_identity 20 + content_settings 14 + profile enum 5-value Süleyman input'u alarak project-config.schema 1.5 conformant staging output üretir. Also use when: workspace henüz yok (Phase 14 öncesi staging-only mode); domain DNS doğrulanması gerekiyor; profile heuristic suggest fallback istendi; init-project çalıştırılmadan önce config wizardı isteniyor. Do not use when: mevcut proje config update için (separate edit-config skill — gelecek phase); workspace var ve direkt project.config.json yazılacak (Phase 14+ behavior; init-project devreye giriyor); başka projenin config'i kopyalanacak (template-clone — gelecek phase).
How this skill is triggered — by the user, by Claude, or both
Slash command
/platinum-seo-engine:brand-onboardingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
10-step interactive wizard that captures brand identity + content
10-step interactive wizard that captures brand identity + content
settings + profile hint from Süleyman, validates against
schemas/project-config.schema.json v1.5, and emits a
staging-only config artifact under outputs/onboarding/. The
wizard core (Steps 1-10) is non-destructive: it NEVER writes the
canonical projects/{slug}/project.config.json — that full-config
write is deferred to Phase 14 (workspace bring-up). The ONE sanctioned
exception is Stage C of the Bank Seed Pipeline below: once a
workspace exists, Stage C appends approved bank entries into the
existing projects/{slug}/project.config.json (Step 6 + DURUR #5
carve-out). Pre-Phase-14 wizard-core invocations remain STAGING-ONLY
(DURUR #5 surfaces an AMBER warning but does NOT block the wizard).
Süleyman'ın manuel
onayı (approval_received=true) zorunlu (DURUR #1) — onay yoksa
events.jsonl'a yazma yapılmaz, hiçbir staging dosyası kalıcı
kabul edilmez.
events.jsonl payload'una (notes field, event_kind=workflow
discipline) birebir aktarılır. Skill kendi kafasından alan
tahmin etmez; eksik alanı AMBER ile geri sorar (DURUR #3).profile_hint 5-value
enum'una (e-commerce | ymyl | local-service | b2b-saas | portfolio) type-safe kilitlenir. 6. değer reddedilir
(DURUR #4). profile_hint boşsa domain heuristic suggest
(TLD pattern, kelime regex) Süleyman'a sunulur — son kararı
Süleyman verir (autonomy boundary).| Name | Type | Required | Notes |
|---|---|---|---|
project_slug | string | yes | kebab-case (^[a-z][a-z0-9-]*$) + reserved word + collision check. |
domain | string | yes | URI format + socket.gethostbyname DNS sanity. AMBER fallback (#6). |
profile_hint | string | no | 5-value enum. Boşsa heuristic suggest. 6. değer REJECT (#4). |
_state/events.jsonl — workflow lifecycle event (event_kind=workflow,
workflow_action=done, workflow_run_id={generated}). Yazılır
YALNIZCA Süleyman onayı geldikten sonra (DURUR #1).outputs/onboarding/{slug}-staging-config.json —
project-config.schema.json v1.5 conformant staging artifact;
validation amaçlı, projects/{slug}/project.config.json
DEĞİLDİR (DURUR #5 STAGING-ONLY mode).project_slugRegex ^[a-z][a-z0-9-]*$ (project-config.schema.project_id pattern).
Reserved word check: admin, system, root, api, www,
config, static, assets, public, private, internal. Bu
slug'lar workspace bootstrap pipe'ında çakışma yaratır → REJECT.
Mevcut projects/{slug}/ dizini varsa DURUR #2.
domainURI format kontrolü (urllib.parse.urlparse scheme + netloc) +
socket.gethostbyname(host) DNS sanity (Python stdlib, harici
bağımlılık yok). DNS resolve fail olursa DURUR #6 — AMBER prompt
("Bu domain DNS'te bulunamadı. Manuel onay verir misin? [y/N]").
Süleyman onaylarsa devam, aksi halde ABORT.
profileprofile_hint set ise direkt geç. Değilse heuristic:
| Heuristic | Suggest |
|---|---|
Domain TLD .shop, .store, alt-domain mağaza, shop regex | e-commerce |
Pattern klinik|hastane|saglik|hukuk|finans | ymyl |
Pattern tamir|servis|nakliyat|temizlik + .com.tr | local-service |
Pattern app|saas|platform|api + .io|.dev | b2b-saas |
Pattern portfolyo|portfolio|kisisel | portfolio |
Heuristic önerisini Süleyman'a göster, "Bu mu? [y/N + alternatif seç]" prompt. Son kararı Süleyman verir.
Her alan ayrı prompt; default YOK (AI suistimal yasağı). Skip
edilen alan AMBER + iterate (DURUR #3). 20 alan sırası (v1.3
ADR-030 ile 18 → 20: pronoun_preference + formality canonical
eklendi; eski hitap + tone 1-yıl deprecated alias):
logo_url — URIprimary_color — ^#[0-9a-fA-F]{6}$secondary_color — ^#[0-9a-fA-F]{6}$accent_color — ^#[0-9a-fA-F]{6}$font_family_heading — stringfont_family_body — stringheader_template_id — enum [minimal, classic, ecom]footer_template_id — enum [minimal, full]source_url_for_sampling — URItone — enum [semi-pro, conversational, formal, casual] — DEPRECATED v1.3 (use formality)formality — enum [semi-pro, conversational, formal, casual] — v1.3 canonicalhitap — enum [sen, siz] — DEPRECATED v1.3 (use pronoun_preference)pronoun_preference — enum [sen, siz] — v1.3 canonicalanglicism_tolerance — enum [low, medium, high]tone_phrases_blocklist — arrayfont_heading — string (alias of #5)font_body — string (alias of #6)default_hero_url — URIsame_as_urls — arrayimage_style — enum [clean-illustration, product-photo,
diagram-screenshot, location-photo, esnek]Aynı disiplin (default yok, skip = AMBER iterate). 14 alan:
toc_strategy — enum [none, static, sticky, auto-generate]related_posts_strategy — enum [none, cluster, tag-based, manual]author_strategy — enum [none, byline-required, byline-optional, person-schema-only]css_strategy — enum [inline, external-tier, hybrid]indexnow_enabled — booleanai_training_optin — booleanvideo_integration — enum [none, youtube, vimeo, self-hosted]internal_data_sharing — booleanexternal_uniqueness_check — booleanoriginal_research_database — array
experience_database — array
video_database — array
disclaimer_templates — object<string,string>image_model — string (default-aware: nano-banana)projects/{slug}/project.config.json YAZILMAZPhase 14 öncesi workspace yok ya da skill scope dışında. Bu adım
explicit no-op: wizard core (Steps 1-10) projects/{slug}/project.config.json
dosyasını ASLA oluşturmaz / full-config yazmaz — staging output (Step 7)
otoritedir. STAGING-ONLY (DURUR #5).
Stage C carve-out: Bu mutlak SADECE wizard core (Steps 1-10) içindir. Aşağıdaki Bank Seed Pipeline'ın Stage C'si, bir workspace ZATEN varsa mevcut
projects/{slug}/project.config.json'a onaylı bank entry'leri append eder (sanctioned bank-write —scripts/meta/brand_onboarding_write. write_bank_entries, R-44 enforced). Wizard core full-config yazmaz; Stage C yalnızcacontent_settingsbank array'lerine ekleme yapar, başka alana dokunmaz.
outputs/onboarding/{slug}-staging-config.json yazılır. İçerik
schemas/project-config.schema.json v1.5 ile (Draft7) validate
edilir; başarısızsa DURUR #3 (eksik alan iterate). Schema PASS
olunca artifact diske inilir. Bu staging output; init-project
Phase 14'te bunu input olarak okuyabilir, ama buradaki dosya
otoritatif değildir.
Skill awaiting_approval durumuna geçer. Onaylanmadan:
events.jsonl yazılmaz.draft
yerine değil — onay öncesi zaten yazılmış olabilir; gerçek gating
events.jsonl appendinde)Onay komutu: Süleyman explicit "evet/onaylıyorum/y" yazar →
approval_received=true. Hayır/atlama → ABORT.
_state/events.jsonl (ONLY ON APPROVAL){
"schema_version": "<events.schema $.const>",
"event_kind": "workflow",
"workflow_action": "done",
"workflow_run_id": "<uuid>",
"step_index": 8,
"event_id": "brand_onboarded_<slug>_<timestamp>",
"timestamp": "<ISO8601 UTC>",
"project_id": "<project_slug>",
"notes": "brand-onboarding wizard complete; semantic_marker=brand_onboarded; profile=<chosen>"
}
Schema-first override (Lesson 7+23): Brief
event_type=brand_onboardedöneriyor; ancakevents.schema.jsonevent_typeenum'u 12-value WORK-only kapalı liste (content_new,content_revise, ...).event_kind=workflowiçin doğru alanlarworkflow_action(8-value lifecycle) +workflow_run_id. Semantic marker olarakbrand_onboardedstring'inotesfield'una taşınır — schema invariant korunur, intent kaybolmaz.
Süleyman'a outputs/onboarding/{slug}-staging-config.json path,
chosen profile, 20 brand_identity + 14 content_settings field
özet tablosu, ve "Phase 14 init-project bu staging dosyasını
input olarak okuyacak" notu raporlanır.
After Step 10, the skill chains into a 3-stage hybrid bank-seed
pipeline that populates content_settings.experience_database and
content_settings.original_research_database so the May 2026 Core
Update "original, helpful, people-first content" emphasis is met
with real first-hand signals (R-105, R-114, R-119).
Stage A — Auto Discovery:
scripts/meta/brand_onboarding_discovery.discover(project_slug) runs
DFS + Scrapling probes against the project's public surface (WHOIS
founding year, /hakkımızda parse, GBP listing for local-service,
case-study HTML, top-20 keywords). Output: draft_experience_entries
draft_research_entries + topic_candidates. F-16 budget
pre-flight short-circuits to DURUR awaiting_approval if DFS daily
credits are exhausted.STAGING-ONLY (P1-12) — real discovery deferred. Stage A is stubbed today:
discover()returns empty drafts until the live-MCP wiring lands (Phase 11 Wave 2) and the full staging→canonical flow goes live with workspace bring-up (Phase 14). It never spends paid credits and never writes project state — the 5 profile-aware questions below are the operator's manual fallback in the meantime.
Stage B — Operator Review:
scripts/meta/brand_onboarding_review.generate_review_prompt()
renders a markdown document listing every draft with a 3-action
menu (approve / edit / reject); operator fills in decisions; calling
layer hands the decisions dict to
apply_review_decisions(discovery_output, decisions). Output:
approved_experience + approved_research + topic_candidates.
Stage C — Atomic Bank Write:
scripts/meta/brand_onboarding_write.write_bank_entries(project_slug, review_output) appends approved entries to project.config.json's
bank arrays. R-44 evidence_url validation fires HERE — every
experience entry MUST carry non-empty evidence_url; every research
entry MUST carry non-empty url. Atomic batch contract: if any entry
fails validation, the file stays untouched.
| # | Question | Profile gate | Bank target |
|---|---|---|---|
| 1 | Sektör tecrübesi (yıl + sertifika + partner) | all profiles | experience_database |
| 2 | 3 müşteri vaka hikayesi | all profiles | experience_database |
| 3 | Yönetici sektörel deneyimi | YMYL + b2b-saas | experience_database |
| 4 | Şirket içi anket / araştırma / case study | all (skip OK) | original_research_database |
| 5 | First-hand somut olaylar (canlı vaka) | YMYL + b2b-saas | experience_database |
Stop and flag the manager — do not patch, do not fall back silently.
approval_received != true →
ABORT. events.jsonl yazılmaz, staging artifact orphan kalır
(cleanup audit ledger sorumluluğu).project_slug çakışması. projects/{slug}/
dizini var ya da reserved word listesi (admin/system/root/api/www
vs.) ile çakışıyor → REJECT.profile_hint enum dışı. 5-value (e-commerce,
ymyl, local-service, b2b-saas, portfolio) dışı seçim →
REJECT. Type-safe assert; 6. değer kabul edilmez.projects/
dizini engine repo'sunda yok → STAGING-ONLY mode (warning, devam).
Wizard core (Steps 1-10) projects/{slug}/project.config.json'ı ASLA
yazmaz. (Workspace VARSA, Stage C bu dosyanın content_settings bank
array'lerine append edebilir — Step 6 Stage C carve-out; bu DURUR
yalnızca workspace YOKKEN wizard core'u staging'e kilitler.)socket.gethostbyname
exception fırlatır → AMBER prompt; Süleyman manual confirm
verirse devam, "no" derse ABORT.Bu skill .mcp.json dosyasına ASLA yazmaz, MCP tool sözleşmesi
yoktur (mcp_tools.required = [], mcp_tools.optional = []).
Phase 11+ plugin agnostik MCP boundary korunur; byte-hash sentinel
test'le doğrulanır (tests/skills/test_brand_onboarding.py).
schemas/skill-frontmatter.schema.json (frontmatter
contract), schemas/project-config.schema.json v1.5 (staging
artifact validation), schemas/events.schema.json v1.0
(workflow event_kind discipline ADR-020).init-project (Phase 14 staging consumer),
load-context, whats-next (meta peer skills).tests/skills/test_brand_onboarding.py (15 case;
frontmatter + 6 DURUR + plugin agnostik + 3-layer principles +
schema staging conformance).npx claudepluginhub popiliadam/platinum-seo-engine --plugin platinum-seo-engineUse when: kullanıcı "yeni proje", "init project", "bootstrap project", "{slug} kur", "{slug} ekle", "workspace bootstrap", "yeni proje aç" der ya da /pseo-init çağırır. Also use when: pilot project workspace iskelet eksik (projects/{slug}/ yok ya da master.xlsx ve project.config.json mevcut değil); workspace- staging'de yeni bir slug ilk kez kuruluyor; idempotent re-bootstrap isteniyor (var olan master.xlsx KORUNUR, sadece config refresh). Do not use when: project zaten kurulmuş ve sadece veri ingest edilecek — sf-import, quick-wins veya başka discovery/ingestion skill kullan; mevcut master.xlsx'i schema-uyumsuz şekilde yeniden yaratmak gerekiyor — bu yıkıcı, init-project ASLA mevcut master.xlsx'e dokunmaz (F1 workbook policy + idempotency invariant).
Initializes an Agentic SEO project with standard directory structure, blank brain templates, content scaffolding, and first log entry. Use when creating or resetting the project.
Onboards a new GTM project via an agency-style interview, then generates CLAUDE.md, PROGRESS.md, about/me.md, strategy/brand.md, and scaffolds, and content/assets folders.