Skip to content
Back to skills

Generate Images

ASecurity

use_when: | Hero image üret, blog görseli oluştur, nano-banana image gen, 8K ultra realistic image, hero image regenerate. Kullanıcı "hero image üret", "blog görseli oluştur", "nano-banana image gen", "8K ultra realistic image" der ya da `/pseo-generate-images` çağırır. master.xlsx[new_content_plan].image_prompt + alt_text source consume; project-config[content_settings.image_model] (R-72 plugin agnostik serbest string, default nano-banana, override edilebilir); project-config[brand_identity....

  • 27 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added October 2, 2026
ai-agentspythongogitapi

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned October 2, 2026

npx -y skills add popiliadam/platinum-seo-engine --skill generate-images --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Generate Images?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Generate Images
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/popiliadam-generate-images/badge)](https://www.skillsdirectory.com/skills/popiliadam-generate-images)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: generate-images
description: |
  use_when: |
    Hero image üret, blog görseli oluştur, nano-banana image gen,
    8K ultra realistic image, hero image regenerate. Kullanıcı
    "hero image üret", "blog görseli oluştur", "nano-banana image gen",
    "8K ultra realistic image" der ya da `/pseo-generate-images` çağırır.
    master.xlsx[new_content_plan].image_prompt + alt_text source consume;
    project-config[content_settings.image_model] (R-72 plugin agnostik
    serbest string, default nano-banana, override edilebilir);
    project-config[brand_identity.image_style] profile-aware switch
    (Principle 2 enum 5-value: clean-illustration / product-photo /
    diagram-screenshot / location-photo / esnek);
    project-config[brand_identity.default_hero_url] DURUR #5 fallback
    URL. R-71 (8K ultra realistic prompt enrichment) + R-72 (nano-banana
    default model) + R-73 (1200x675 hero size + manual upload trail) +
    R-74 (multi-skill collaborative upload-instructions Section B) +
    R-75 (`<picture>` LCP optimization + loading="eager" +
    fetchpriority="high") + R-76 (AVIF + WebP + JPG format cascade)
    sentinel enforce.
  also_use: |
    new-blog skill collaborative output (Section B append
    upload-instructions.md, R-74 paterni); existing blog hero image
    regenerate (cheap AI artifact / low-res anime drift detect, R-71
    enforcement); brand_identity güncelleme sonrası hero image refresh
    (image_style profile boyutu değişmişse).
  do_not_use: |
    Yeni blog için (new-blog kullan, image plan tetikler);
    FAQ enhance için (faq-optimization kullan); content prune /
    redirect / delete için (content-remediation kullan);
    image upload için (R-74 manual upload, otomatik publish YASAK,
    auto-upload WordPress credential exposure + plugin agnostik
    Ticimax/Ideasoft farklı API).
version: "1.0"
status: wip
category: production
inputs:
  project_slug:
    type: string
    required: true
    description: "Workspace proje slug (resolves projects/{slug}/master.xlsx + outputs/images/ + outputs/blog/{slug}/)."
  new_content_plan_id:
    type: string
    required: true
    description: "master.xlsx[new_content_plan] row id reference (kolon A); image_prompt + alt_text + content_type source (Phase 10 +3 col)."
  image_kind:
    type: string
    required: false
    default: "hero"
    description: "Image kind — currently hero only (enum: [hero], R-73 1200x675 fixed). Future: inline_section (Wave 3 deferred). Schema-first override: schema-frontmatter inputs[].properties whitelist 4 field additionalProperties=false; enum description'a taşındı (W-F3 D1 paterni reuse)."
outputs:
  - "outputs/images/{slug}-{kind}.webp"
  - "outputs/images/{slug}-{kind}.avif"
  - "outputs/images/{slug}-{kind}.jpg"
  - "outputs/blog/{slug}/upload-instructions.md"
  - "_state/events.jsonl"
consumes:
  - "init-project:projects/{slug}/master.xlsx#new_content_plan"
  - "init-project:projects/{slug}/project.config.json#content_settings.image_model"
  - "init-project:projects/{slug}/project.config.json#brand_identity.image_style"
  - "init-project:projects/{slug}/project.config.json#brand_identity.default_hero_url"
  - "rules:rules/content-quality.md"
  - "rules:rules/content-html-discipline.md"
  - "rules:rules/content-seo-discipline.md"
  - "rules:rules/content-eeat-discipline.md"
  - "rules:rules/content-llm-discipline.md"
  - "rules:rules/content-update-discipline.md"
  - "templates:templates/content/upload-instructions.template.md"
produces:
  - "new-blog"
triggers:
  manual: ["/pseo-generate-images"]
  natural_language: |
    "hero image üret ve 8K ultra realistic prompt enrichment uygula",
    "blog görseli oluştur ve nano-banana image_model default kullan",
    "nano-banana image gen yap ve 1200x675 hero size R-73 zorla",
    "8K ultra realistic image üret ve cheap AI artifact preempt et",
    "hero image regenerate et ve image_style profile-aware switch uygula"
  hooks: []
  scheduled: []
mcp_tools:
  required:
    - "mcp__higgsfield__generate_image"
  optional:
    - "mcp__higgsfield__job_status"
budget:
  uses_paid_mcp: true
  estimated_credits: 5
autonomy:
  confidence: HIGH
  requires_approval: true
  safe_auto_execute: false
---

# generate-images — production skill (Phase 11 Wave 2 W-F5)

Hero image üretim skill'i. master.xlsx[new_content_plan].image_prompt
+ alt_text source; project-config[content_settings.image_model] consume
(R-72 plugin agnostik); project-config[brand_identity.image_style]
profile-aware switch (Principle 2 enum 5-value); R-71/R-72/R-73/R-74/
R-75/R-76 sentinel enforce. Higgsfield MCP runtime call (Claude tool
registry); fallback `default_hero_url` (DURUR #5). Pillow Image format
cascade (WebP + AVIF + JPG, R-76); `<picture>` tag LCP optimization
(R-75); upload-instructions.md Section B append (R-74 multi-skill
collaborative output).

The skill is **READ-ONLY** with respect to `master.xlsx`
(`new_content_plan` allowed_writers is `null` — F-1 schema authority).
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` (event_kind=`work` per
ADR-020 + events.schema event_kind discriminator; event_type=`manual`
per events.schema enum).

## 🔴 KRİTİK — Plugin Agnostik MCP Boundary (F-16, Süleyman Seçenek D)

Worker (this skill) **does NOT write to `.mcp.json`.** Higgsfield MCP
is **not a plugin dependency** — it is configured at VS Code user-level
(Süleyman responsibility). When the plugin is given to another user,
Higgsfield availability is NOT mandatory; the skill gracefully falls
back via DURUR #5.

**Boundary contract:**

| Concern                       | Location                                                    | Discipline                                       |
|-------------------------------|-------------------------------------------------------------|--------------------------------------------------|
| `.mcp.json`                   | Project-local (5 servers: gsc, dataforseo, ScraplingServer, sf, adstark) | Plugin agnostik; Higgsfield ABSENT (F-16 intact) |
| Higgsfield MCP                | VS Code user-level (Süleyman setup)                         | Per-user, not per-plugin                         |
| `HIGGSFIELD_API_KEY`          | Süleyman `.env` (12-factor app)                              | Never committed; never in plugin                 |
| `mcp__higgsfield__generate_image` | Claude tool registry runtime call                       | Worker calls if available; DURUR #5 if absent    |

**STOP rule:** if a worker proposal requires writing the Higgsfield
server entry into `.mcp.json`, the proposal violates F-16 plugin
agnostik boundary and MUST stop. R-72 (image_model serbest string +
override edilebilir) is the architectural twin of this boundary at the
schema level.

**External dependency preflight (P1-13 registry contract).** Higgsfield is
declared in `mcp-tool-registry.json` under
`external_user_dependencies.higgsfield` (NOT under `servers`) — the governance
representation of a **user-level external MCP** that must already exist in the
operator's own client environment. Step 4 **preflights**
`mcp__higgsfield__generate_image` in the Claude tool registry; if the external
tool is absent the skill does NOT crash — it routes to **DURUR #5** (graceful
`default_hero_url` fallback + a clear "Higgsfield MCP not configured at
user-level" message). This is what lets the registry advertise a
required-but-not-plugin-installed tool without tripping the
`.mcp.json`↔registry server-key invariant (F-24).

## Foundational Principles Enforcement (3-Layer)

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.

### Principle 1 — Truth-Verifiable Content (R-27, Süleyman 5x vurgu)

**Statement (image context).** alt_text + image caption verifiable;
uydurma claim YASAK. Image içerik claim'leri ile actual generated
image arasında consistency required (alt_text "doktor muayenehanesi"
diyorsa generated image medical clinic resmi olmalı, generic stock
photo değil).

**3-katman defense:**
- Layer 1: skill prompt explicit "uydurma alt_text yasak" — Step 7
  upload-instructions.md Section B render öncesi alt_text source
  verify (manuel kayıt new_content_plan.alt_text, AI invent yasak).
- Layer 2: alt_text source verify — `master.xlsx[new_content_plan]`
  row.alt_text consume (manuel typed by Süleyman / new-blog
  collaborator). AI alt_text invention forbidden.
- Layer 3: image_prompt R-71 8K ultra realistic enrichment — low-res
  anime drift detect; cheap AI artifact preempt.

**Failure mode.** RED (image discard, alt_text inconsistency) — DURUR
#6 trigger.

### Principle 2 — Profile-Aware Enforcement

**Statement.** Skill behavior `project.config.json[profile]` enum'una
göre değişir; image_style boyutu profile-driven (project-config
schema image_style enum, 5-value).

**Enum 5-value switch (Step 2 + Step 3):**

| `profile` value  | `image_style`        | Aesthetic intent                                           |
|------------------|----------------------|------------------------------------------------------------|
| `ymyl`           | `clean-illustration` | Medical/legal authoritative aesthetic; sterile composition |
| `e-commerce`     | `product-photo`      | Transactional intent; product-centric studio lighting      |
| `b2b-saas`       | `diagram-screenshot` | Technical clarity; UI/diagram screenshot composition       |
| `local-service`  | `location-photo`     | Local SEO authority; on-location authentic photography     |
| `portfolio`      | `esnek`              | Flexible — creative discretion                             |

**Failure mode.** RED — `image_style` enum dışı bir değer (DURUR #3);
profile resolve etmezse worker AMBER warning + `esnek` fallback.

### Principle 3 — AI Suistimal Önlemi (Anti-Cheap-Content)

**Statement (image context).** AI'ın doğal cheap content padding
davranışını image generation'da preempt et.

**3-pattern gate (Step 3 + Step 4 implements):**
- R-71 8K ultra realistic prompt enrichment — low-res / anime drift
  preempt (Süleyman explicit "8K ultra realistic" tone preference).
- R-72 image_model `nano-banana` default (cheap AI artifact preempt;
  plugin agnostik override allowed via `content_settings.image_model`
  serbest string).
- Image content cheap padding yasak — decorative-only image RED;
  fact-conveying / entity-illustrating image expected.

**Failure mode.** AMBER warning (auto-correct prompt enrichment
attempt) → RED fail (manuel revise) on 2x AMBER same pass.

## Routing — 7-Step Workflow

> Step names are stable identifiers across runs.

### Step 1 — `read_master_xlsx_row`

`master.xlsx[new_content_plan]` row read where
`id == {input.new_content_plan_id}`. Workbook opens with
`openpyxl.load_workbook(read_only=True)` (F-1 allowed_writers=null).

`new_content_plan` 14 columns consumed (Phase 10 additive bump):
`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`.
Step 1 surface fields: `image_prompt` + `alt_text` + `content_type`
+ `url_slug` (output filename slot).

**DURUR #1.** `image_prompt` empty (R-71 prompt eksik) → REJECT;
init-project / new-blog skill paterni new_content_plan row populate
etmeli.

### Step 2 — `read_project_config` (Profile-Aware Switch + R-72 image_model)

`projects/{slug}/project.config.json` parse:
- `content_settings.image_model` — R-72 plugin agnostik serbest string
  (default `nano-banana`, override edilebilir). Schema:
  `{type: string, default: "nano-banana", description: "R-72.
  Plugin agnostik (Higgsfield veya equivalent), per-project override."}`
- `brand_identity.image_style` — project-config schema 5-enum
  profile-aware (`clean-illustration` / `product-photo` /
  `diagram-screenshot` / `location-photo` / `esnek`).
- `brand_identity.default_hero_url` — DURUR #5 fallback URL
  (R-77 image alt_text fallback).
- `profile` (singular, schema v1.2 W-F1) — Principle 2 switch driver.

Profile-aware `image_style` resolve:

```text
if profile == "ymyl":           image_style := "clean-illustration"
elif profile == "e-commerce":   image_style := "product-photo"
elif profile == "b2b-saas":     image_style := "diagram-screenshot"
elif profile == "local-service":image_style := "location-photo"
elif profile == "portfolio":    image_style := "esnek"
```

When `brand_identity.image_style` is set explicitly, the explicit value
wins (override-friendly); profile-mapped value is the default when the
field is null.

**DURUR #3.** `image_style` enum 5-value dışı (project-config
`brand_identity.image_style` enum violation) → REJECT.

### Step 3 — `r71_prompt_enrichment` (8K Ultra Realistic)

R-71 enrichment pipeline (Süleyman explicit "8K ultra realistic" tone
preference; cheap AI artifact / low-res anime drift preempt):

```text
enriched_prompt :=
    "{image_prompt}, "
    "8K ultra realistic, sharp focus, professional photography, "
    "{image_style}, "
    "1200x675 landscape, hero image composition, "
    "high detail, vibrant colors, "
    "no anime/cartoon style, no low-res artifacts"
```

`image_style` is the profile-aware suffix from Step 2 (5-enum
switch). Tone keywords (`8K ultra realistic`, `sharp focus`,
`photographic`) are R-71 mandatory; AI suistimal preempt directives
(`no anime/cartoon style`, `no low-res artifacts`) are P3 mandatory.

### Step 4 — 🔴 `mcp_higgsfield_runtime_call` (Plugin Agnostik MCP Boundary)

**Worker DOES NOT write to `.mcp.json`.** Worker calls
`mcp__higgsfield__generate_image` from the Claude tool registry at
runtime (F-16 Süleyman Seçenek D + R-72 plugin agnostik twin).

```text
mcp__higgsfield__generate_image(
    model        = content_settings.image_model,   # default "nano-banana"
    prompt       = enriched_prompt,                # Step 3 output
    size         = "1200x675",                     # R-73 hero only
    aspect_ratio = "landscape",
)
```

**DURUR #4.** Higgsfield response size != 1200x675 (R-73 hero size
violation) → REJECT.

**DURUR #5 — Higgsfield MCP unavailable.** Claude tool registry'de
`mcp__higgsfield__generate_image` YOK (VS Code user-level setup
eksik veya `HIGGSFIELD_API_KEY` env yok):
- Fallback: `brand_identity.default_hero_url` consume (project-config'den).
- AMBER warning emit: image generation skip.
- upload-instructions.md Section B "manual upload required, fallback
  hero used" mark.
- events.jsonl `event_type=manual` (events.schema enum), `event_kind=work`
  (ADR-020 event_kind discriminator).

**DURUR #2.** Higgsfield budget aşımı (`estimated_credits` 5 cap) →
`scripts/budget/check_budget.py` blocked.

**Plugin agnostik discipline.** Worker:
- DOES NOT write `mcpServers.higgsfield` into `.mcp.json` (F-16
  violation; STOP rule).
- DOES NOT hardcode `HIGGSFIELD_API_KEY` (Süleyman `.env`, 12-factor).
- DOES use `mcp_tools.required: ["mcp__higgsfield__generate_image"]`
  in frontmatter (advisory — worker reports the dependency; user-level
  MCP availability is not enforced via `.mcp.json`).

### Step 5 — `pillow_format_cascade` (R-76)

Generated raw image (PNG/JPEG byte stream) Pillow library ile convert:

| Format | Output path                                  | Rationale                                    |
|--------|----------------------------------------------|----------------------------------------------|
| WebP   | `outputs/images/{slug}-{kind}.webp`          | Modern, geniş browser support (~30% smaller) |
| AVIF   | `outputs/images/{slug}-{kind}.avif`          | Next-gen (~50% smaller); Safari 16+          |
| JPG    | `outputs/images/{slug}-{kind}.jpg`           | Legacy fallback (universal)                  |

R-76 enforcement: 3 format hepsi yazılmalı; tek format yasak.

```python
from PIL import Image
img = Image.open(raw_bytes_io).convert("RGB")
img.save(f"outputs/images/{slug}-{kind}.webp", format="WEBP", quality=85)
img.save(f"outputs/images/{slug}-{kind}.avif", format="AVIF", quality=70)
img.save(f"outputs/images/{slug}-{kind}.jpg",  format="JPEG", quality=88)
```

### Step 5b — `r123_iptc_disclosure_write` (R-123 AI Image Disclosure)

Format cascade tamamlandıktan sonra (Step 5), WebP + JPG outputs IPTC
`DigitalSourceType=TrainedAlgorithmicMedia` metadata ile patch edilir
(Google Merchant Center AI-image disclosure policy + 2026-05-15 AI
Optimization Guide reaffirmation). AVIF silent skip — piexif format
desteklemez (R-123 failure_mode AMBER, R-76 cascade'in WebP + JPG
çıktıları metadata garantisi sağlar).

```python
from scripts.util.iptc_metadata import write_ai_image_disclosure

# AVIF skip — piexif unsupported (documented R-123 failure_mode)
for output_path in [webp_path, jpg_path]:
    write_ai_image_disclosure(output_path)
```

R-123 enforcement (`rules/content-html-discipline.md`). Utility:
`scripts/util/iptc_metadata.write_ai_image_disclosure` (5/5 unit test
PASS — round-trip + idempotent + missing-file + WebP + constant-format).

### Step 6 — `r75_picture_tag_lcp` (LCP Optimization)

R-75 `<picture>` tag generate (LCP-optimized hero):

```html
<picture>
  <source type="image/avif" srcset="outputs/images/{slug}-hero.avif">
  <source type="image/webp" srcset="outputs/images/{slug}-hero.webp">
  <img src="outputs/images/{slug}-hero.jpg"
       alt="{alt_text}"
       width="1200" height="675"
       loading="eager"
       fetchpriority="high">
</picture>
```

LCP optimization directives:
- `loading="eager"` — above-fold hero (lazy load yasak).
- `fetchpriority="high"` — Chromium 102+ priority hint.
- Explicit `width="1200" height="675"` — CLS preempt (R-62 alignment).
- `alt="{alt_text}"` — `master.xlsx[new_content_plan].alt_text`
  consume (Principle 1 truth-verifiable; uydurma alt_text yasak).

The `<picture>` skeleton is rendered into upload-instructions.md
Section B as the canonical reference; the skill itself does not
inject HTML into `outputs/blog/{slug}/article.html` (new-blog skill
owns that artefact, R-74 multi-skill collaborative paterni).

### Step 7 — `append_section_b_and_emit_provenance` (R-74)

`templates/content/upload-instructions.template.md` Section B render
+ append (multi-skill collaborative output; new-blog Section A intact;
revise-content Section C intact when applicable):

```markdown
## Section B — Hero Image Upload (R-74)

**Generated:** {ISO 8601 UTC timestamp}
**Image Style:** {image_style}        # project-config image_style enum
**Image Model:** {image_model}        # R-72 default nano-banana
**Files:**
- WebP: outputs/images/{slug}-hero.webp ({size_kb} KB)
- AVIF: outputs/images/{slug}-hero.avif ({size_kb} KB)
- JPG:  outputs/images/{slug}-hero.jpg  ({size_kb} KB)

**WordPress Manual Upload Steps (R-74):**
1. WordPress admin → Media Library → Add New
2. Upload all 3 format files (WebP + AVIF + JPG); WordPress
   AVIF support v6.5+ (Squoosh fallback if needed).
3. Alt text: "{alt_text}"  # truth-verifiable, P1 Layer 2
4. Insert into blog post hero placeholder
   ({{HERO_IMAGE_URL_REPLACE}} token)
5. Verify <picture> tag rendering (R-75 LCP optimization)
6. PageSpeed Insights LCP < 2.5s + CLS < 0.1 measure
   (R-65 + R-62 alignment)
```

`_state/events.jsonl` append (audit, events.schema + ADR-020 compliance):

| Field            | Value                                                                          |
|------------------|--------------------------------------------------------------------------------|
| `schema_version` | `"1.0"` (events.schema const)                                              |
| `event_kind`     | `"work"` (ADR-020 event_kind discriminator)                                     |
| `event_type`     | `"manual"` (success AND DURUR #5 fallback) — events.schema 12-enum                       |
| `event_id`       | UUID v4                                                                         |
| `timestamp`      | UTC ISO 8601                                                                    |
| `project_id`     | `{input.project_slug}` (events.schema pattern `^[a-z][a-z0-9-]*$`)                       |
| `note`           | `image_generated: kind={image_kind} model={image_model} plan_id={new_content_plan_id}` (note-encoded provenance) |
| `actor`          | `agent:generate-images` (canonical code block)                                 |
| `image_kind`     | `{input.image_kind}` (default `hero`)                                          |
| `image_model`    | `{content_settings.image_model}` (R-72 plugin agnostik)                         |
| `image_style`    | `{brand_identity.image_style}` (project-config image_style enum, profile-aware) |

Canonical events_writer invocation (schema-first override 16'ıncı uygulama —
`event_type=manual` + `note=image_generated` paterni; `content_new` schema'da
url + url_normalized + after + pillar mandatory koşar, standalone hero
regenerate scope'unda yok → faq-optimization + content-remediation
precedent paterni reuse):

```python
import os
import sys
import hashlib

sys.path.insert(0, os.getcwd())

from scripts.state import events_writer

# Synthetic task_id mint (whats-next paterni reuse, schema regex ^T-[0-9]{4,}$)
hex_token = hashlib.sha1(str(new_content_plan_id).encode()).hexdigest()[:4]
synthetic = 90000 + (int(hex_token, 16) % 9999)
task_id = f"T-{synthetic}"

# WORK event — schema-first override (manual + note=image_generated)
# DURUR #5 (Higgsfield unavailable) durumunda da aynı paterni: event_type=manual.
events_writer.append_work(
    project_id=project_slug,
    event_type="manual",
    task_id=task_id,
    note=(
        f"image_generated: kind={image_kind} model={image_model} "
        f"plan_id={new_content_plan_id}"
    ),
    actor="agent:generate-images",
    primary_source="manual",
)
```

The synthetic `task_id` mint paterni preserves provenance traceability via
the `note` field (`plan_id={new_content_plan_id}`) without coupling the
skill to a `master_task` row that may not exist (new_content_plan can be
1:N to master_task; init-project may delay master_task population).
Schema-first override 16'ıncı uygulama: rules/events-writer.md Section 4
matrix `generate-images → content_new + image_generated` direkt match
gibi görünse de events.schema URL-bearing work event constraints
(`url + url_normalized + after + pillar` REQUIRED) standalone hero
regenerate scope'unda satisfy edilemez; `manual + note=image_generated`
schema authority + intent preservation = doğru fit.

## DURUR Conditions (6)

| #  | Trigger                                                                    | Resolution                                                         |
|----|----------------------------------------------------------------------------|--------------------------------------------------------------------|
| 1  | `master.xlsx[new_content_plan].image_prompt` empty (R-71 prompt eksik)      | REJECT — new-blog / init-project row populate etmeli                |
| 2  | Higgsfield budget aşımı (`estimated_credits` 5 cap)                         | `scripts/budget/check_budget.py` blocked                            |
| 3  | `image_style` project-config 5-enum dışı                                    | REJECT — schema authority cascade fix verify                        |
| 4  | Higgsfield response size != 1200x675 (R-73 hero size violation)             | REJECT — model param mismatch, retry with explicit size param       |
| 5  | Higgsfield MCP unavailable (Claude tool registry'de YOK; F-16 plugin agnostik) | Fallback `brand_identity.default_hero_url` + AMBER + `event_type=manual` |
| 6  | P1 truth-verifiable: alt_text uydurma claim detect                          | RED — image discard, alt_text source verify                         |

## Plugin-Agnostic Discipline

- **🔴 `.mcp.json` Higgsfield server entry YASAK** (F-16 Süleyman
  Seçenek D; R-72 architectural twin). Worker STOP rule on this
  proposal.
- No project slug hardcoded inside this skill (`demo-dental`, `demo-furniture`,
  `demo-hvac`, `demo-petcare`, `demo-shop`, `demo-tires`, `demo-construction`, `demo-agency`
  are FORBIDDEN tokens — pytest grep verifies).
- `image_model` resolves at runtime from `content_settings.image_model`
  (R-72 serbest string, override edilebilir; default `nano-banana`).
- `image_style` resolves at runtime from `brand_identity.image_style`
  (project-config image_style 5-enum) or profile-mapped default.
- `default_hero_url` resolves at runtime from
  `brand_identity.default_hero_url` (R-77 fallback hero, DURUR #5).
- Per-call / per-url credit shape names (Phase 7 lesson, ADR-028
  anti-pattern) MUST NOT appear — `budget.estimated_credits` (number)
  is the only allowed shape.

## WCAG 2.1 AA Accessibility

- `<img alt="...">` zorunlu (R-77; non-decorative hero image; alt_text
  source `master.xlsx[new_content_plan].alt_text`, uydurma yasak).
- Explicit `width` + `height` attributes (CLS preempt, R-62).
- h3 visible focus state — `<picture>` çevresi `<figure>` wrap
  edilecekse (new-blog skill owns), `figcaption` h3 hierarchy preserve.
- focus-visible CSS hint (R-39 axe-core simulate): `<picture>`
  interactive element değil; ancak çevresel `<a>` link wrap edilirse
  `:focus-visible` outline mandatory.

## Error Handling

| Failure                                              | Mode  | Action                                                  |
|------------------------------------------------------|-------|---------------------------------------------------------|
| `new_content_plan.image_prompt` boş                  | RED   | DURUR #1 — REJECT, prompt source eksik                  |
| Higgsfield budget exhausted                          | RED   | DURUR #2 — `check_budget.py` blocked                    |
| `image_style` enum dışı                              | RED   | DURUR #3 — schema cascade fix verify (v1.2 W-F1)        |
| Higgsfield response 1200x675 size mismatch           | RED   | DURUR #4 — REJECT, retry with explicit size             |
| Higgsfield MCP runtime registry'de YOK               | AMBER | DURUR #5 — `default_hero_url` fallback, `event_type=manual` |
| P1 truth-verifiable alt_text uydurma                 | RED   | DURUR #6 — image discard, alt_text source verify        |
| Pillow AVIF encode fail (libavif missing)            | AMBER | WebP + JPG only fallback; AVIF skip mark in Section B   |
| `<picture>` LCP measurement > 2.5s post-publish      | AMBER | manual measure post-upload, R-75 enforcement check      |

## References

- `rules/content-quality.md` (Foundational Principles 1+2+3,
  R-01..R-148).
- `rules/content-html-discipline.md` (R-71 8K ultra realistic,
  R-72 nano-banana default, R-73 manual upload, R-74 multi-skill
  collaborative output, R-75 LCP optimization, R-76 format fallback,
  R-77 alt text, R-123 IPTC DigitalSourceType disclosure).
- `rules/content-seo-discipline.md` (R-65 LCP < 2.5s ranking signal,
  R-62 CLS preempt).
- `rules/content-eeat-discipline.md` (R-44 source verify; image
  authority signal).
- `schemas/project-config.schema.json` v1.2
  (`content_settings.image_model` serbest string default `nano-banana`;
  `brand_identity.image_style` 5-enum; `brand_identity.default_hero_url`
  format=uri).
- `schemas/master-excel.schema.json` (`new_content_plan` 14 col Phase
  10 +3 col additive: `image_prompt`, `alt_text`, `content_type`).
- `schemas/events.schema.json` (event_kind=`work` ADR-020 discriminator;
  event_type 12-enum events.schema: `manual` for success AND DURUR #5 fallback).
- `schemas/skill-frontmatter.schema.json` (8 required fields, category
  enum 8 values, status enum 3 values, `mcp_tools.required` advisory).
- `.mcp.json` (5 servers: `gsc`, `dataforseo`, `ScraplingServer`, `sf`, `adstark`;
  Higgsfield ABSENT — F-16 plugin agnostik boundary intact).
- ADR-020 (event_kind=workflow vs work routing).
- ADR-028 (per-call / per-url credit shape anti-pattern).

## Wave-Out Note

This skill is `status: wip` until Phase 11 Wave 2 acceptance gate;
`active` bump deferred to the post-Wave 2 closeout. Manager owns the
status flip + governance audit. Atomic commit Wave 2 6'ıncı kanıt
hedef (W-F3 + W-F4 + W-F5 paralel atomic dispatch + drift sıfır).

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.