peec-content-intel — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited peec-content-intel (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
For one Peec prompt that the brand is losing, produce one publish-ready content brief: sub-queries, verbatim buyer pains, competitor breakdown, outline, focus keywords, and outreach targets.
project_id — Peec project (read from setup_state.json per pre-flight; do not re-resolve)prompt_id — the target prompt (must have ≥24h of data)date_range — default last 28 dayslanguage — read from setup_state.json (prompt_language); user can override per-run, but never default to en silentlytarget_country — read from setup_state.json; drives forum source picks (DE→reddit/r/de+gutefrage+t3n, AT→reddit+derstandard, US→reddit+quora, CH→reddit/r/de+r/fr) and SERP/GSC market filterspage_type — required. Must be one of the values in setup_state.page_type_taxonomy. If the user doesn't pass it, the skill infers the best fit from the funnel stage of the target prompt + competitor top-url classifications, then ASKS the user to confirm ("Suggested page_type: landing_page (Decision-stage, competitors use PRODUCT_PAGE). OK? [y/n/override]"). Never guess silently — a brief with the wrong page_type is a wasted publish cycle.business_type — read from setup_state.json. Used to validate page_type selection against the allowed taxonomy matrix.audience — read from setup_state.json. audience.primary and audience.pain_points feed the brief's "Why this page wins" + "Voice / tonality" sections directly; do not restate them in the brief prose, USE them.One markdown brief per prompt, saved at briefs/<YYYY-MM-DD>_<prompt-slug>/brief.md, plus the raw data next to it (competitor-urls.json, forum-pains.json, scoring.json). No dashboards.
Every brief starts with a front-matter block that downstream skills (peec-report, peec-learn) consume for attribution:
---
brief_id: <YYYY-MM-DD>_<prompt-slug>
prompt_id: pr_xxxxxx
business_type: b2b-service
page_type: landing_page # MUST be in setup_state.page_type_taxonomy
target_url: /seo-retainer # planned publish path
funnel_stage: Decision # from the prompt's topic
audience:
primary: "Shop-Owner DACH, 3-20 MA, Shopify"
pain_hook: "3 Agenturen gewechselt, keine Ergebnisse"
success_metric_4w:
prompt_visibility: "0% → ≥15%"
zone_visibility: "4% → ≥20%"
---A brief without this front-matter block is invalid and will be rejected by peec-report.
peec-setup — the project must exist with structured prompts.Do not use when:
Per _shared/SETUP_STATE.md, this skill refuses to run without a completed setup:
Read <project>/growth_loop/setup_state.json
If missing OR completed_at missing OR phases_completed lacks
{competitors, prompts, topics, tags}:
STOP. Output:
"No Peec setup state found at <project>/growth_loop/setup_state.json.
Run /peec-setup first."
If completed_at older than 90 days: WARN once, continue.
Use peec_project_id from state — don't re-resolve via list_projects.mcp__peec-ai__get_brand_report(
project_id, start_date, end_date,
dimensions=["prompt_id"],
filters=[{field: "prompt_id", operator: "in", values: [prompt_id]}]
)
mcp__peec-ai__get_url_report(
project_id, start_date, end_date,
dimensions=["prompt_id"],
filters=[
{field: "prompt_id", operator: "in", values: [prompt_id]},
{field: "gap", operator: "gt", value: 0}
],
limit=25
)Output: up to 25 URLs, sorted by retrieval frequency, each with a classification (LISTICLE / ARTICLE / COMPARISON / HOW_TO_GUIDE / PROFILE / DISCUSSION).
Interpretation:
Primary path — `mcp__visiblyai__query_fanout` (Visibly MCP ≥ v0.6.0, ~3–5 credits):
mcp__visiblyai__query_fanout(
url="https://<own-or-competitor-domain>/<page>",
keyword="<focus_keyword>",
data_source="dataforseo", # or "gsc" / "both"
gsc_property=null, # required if data_source includes gsc
language="de" # or "en"
)Returns: fanout_queries[], coverage_score (0–1), covered_count / total_count, gaps[] (sub-queries not addressed on the URL — this is the content backlog), coverage_details[].
Fire once per top gap URL from Phase 1. Replaces sub-query generation + crawling + semantic match in one call.
Fallback — inline heuristic (if Visibly MCP unavailable or credits tight):
Generate 6 sub-queries along fixed intent axes:
Coverage matching is then skipped — flag that explicitly in the brief.
Reddit (tested 2026-04-19): WebFetch against reddit.com is blocked. The workaround that works: Peec has already scraped Reddit threads, so use
mcp__peec-ai__get_url_content(project_id, url="https://reddit.com/r/<sub>/comments/<id>/...")Procedure:
classification=DISCUSSION + domain=reddit.com URLsget_url_contentGutefrage / t3n / OMR:
WebSearch("site:gutefrage.net <query>")
WebSearch("site:t3n.de/forum <query>")
WebSearch("site:omr.com <query>")
WebFetch(url, "Extract the original question verbatim, plus top 3 answers. Note frustrations, decision triggers, competitor/brand mentions.")Gutefrage blocks WebFetch with 403. Fallback: Google search snippets + archive.org.
Per sub-query, aggregate: 3–5 verbatim pain quotes, competitor mentions with sentiment, top 2–3 thread URLs for later engagement.
Per top gap URL from Phase 1:
mcp__visiblyai__get_backlinks(domain="<competitor-domain>", limit=10, location="Germany")
mcp__visiblyai__onpage_analysis(url="<competitor-url>", keyword="<focus-keyword>") # 15 credits, top 3 only
mcp__peec-ai__get_url_content(project_id, url="<competitor-url>") # for outline mining
mcp__visiblyai__get_keywords(domain="<competitor-domain>", limit=200, location="Germany")Backlinks caution: get_backlinks can return 260 KB+ (2,836 backlinks for noahlutz.de). Always pass limit: 10-20 or delegate to a subagent. For headline metrics (total_count, rank, domain_from_rank), limit=1 is enough.
DR interpretation:
score = (retrieval_freq × gap_size × forum_pain_density)
/ (domain_DR × (1 + content_quality_diff))Tiers:
Save to briefs/<YYYY-MM-DD>_<prompt-slug>/brief.md. Schema below.
## Content Brief: <prompt text>
### Goal
Win Peec prompt: "<prompt_text>"
Funnel stage: Awareness | Consideration | Decision | Retention
Current own visibility: X% → Target: Y% in 90 days
### Buyer language (forum pain, verbatim)
- "<verbatim quote>" (source: r/selbststaendig, 2026-03)
- "<verbatim quote>" (source: Gutefrage)
- "<decision trigger>"
### Sub-queries (Query Fan-Out)
1. <sub-query>
2. <sub-query>
...
### Competitor landscape
| URL | Class | Retrieval | DR | Opp score | Note |
|---|---|---|---|---|---|
| evergreen.media/ki-seo | ARTICLE | 22% | 47 | 35 | high DR, pitch as contributor |
| noahlutz.de/ki-seo | LISTICLE | 9% | 22 | 68 | direct attack, similar DR |
### Recommended format
<LISTICLE | COMPARISON | HOW-TO | DEFINITION> — based on dominant URL class
### Title (draft, ≤60 chars)
<title>
### Meta description (≤155 chars)
<description using buyer language>
### Outline (H2 / H3)
1. <opening pain>
2. <definition / framework>
3. <decision matrix or checklist>
4. <practice examples>
5. <pitfalls>
6. <CTA>
### Focus + secondary keywords
- Focus: <keyword> (volume, intent)
- Secondary: <kw2>, <kw3>, <kw4> (from keyword gap)
### Backlink strategy
- <domain 1>: editorial pitch (template)
- <subreddit>: join thread (URL)
- <editorial>: contribute to existing article
### KPI
- Prompt visibility after 90 days: Y%
- GSC position for focus keyword: top 10
- ≥3 backlinks from DR >30| Step | Tool |
|---|---|
| Gap URLs | mcp__peec-ai__get_url_report(filters: gap>0) |
| AI response + sources | mcp__peec-ai__list_chats → get_chat |
| Scraped competitor content | mcp__peec-ai__get_url_content |
| Query Fan-Out + coverage | mcp__visiblyai__query_fanout (≥v0.6.0) |
| Backlink profile | mcp__visiblyai__get_backlinks |
| 24-point onpage audit | mcp__visiblyai__onpage_analysis (15 cr) |
| Competitor keywords | mcp__visiblyai__get_keywords |
| Intent classification | mcp__visiblyai__classify_keywords |
| Full-site crawl | mcp__visiblyai__crawl_website (15–60 cr) |
Per prompt analysis: ~45–75 credits.
get_backlinks per top-3 competitor domain (cheap, often ~0)onpage_analysis → 45get_keywords per top-2 competitor (cheap)Batch of 10 prompts: ~500–750 credits.
WebFetch Gutefrage (403) — use WebSearch snippets insteadonpage_analysis on more than the top-3 URLs — credit drainget_url_contentpeec-setup — depends on structured prompts/topics/tags~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.