---
name: seoaio-content
description: >-
  Plan and write the customer's own pages for the tracked questions AI engines answer
  without citing them, from live SEOAIO MCP data, then re-measure. Use when the user asks
  which questions they lose, what page would answer them, or wants content for the prompts
  where competitors are cited instead. Trigger on "questions we lose", "what should we
  publish", "content for missing prompts", or when the user asks you to fetch or follow
  https://seoaio.ai/content/SKILL.md.
version: 2.0.0
homepage: https://seoaio.ai/content/SKILL.md
metadata:
  site: https://seoaio.ai
  setup: https://seoaio.ai/SKILL.md
  mcp: https://app.seoaio.ai/api/mcp
  docs: https://seoaio.ai/docs/tools
---

# SEOAIO: pages for the questions you lose

**Start here.** You are reading `https://seoaio.ai/content/SKILL.md`. This file is complete only if
its **last line** is `END SKILL v2.0.0`. If that line is missing, fetch it again.

Cover the questions the brand loses with the customer's own pages, one per cluster, after
approval, and then measure whether the question moved. Nothing here promises a citation.

## If MCP is not connected

Fetch `https://seoaio.ai/SKILL.md` and follow its "Connect MCP" section, then come back here.

## Prerequisites

- A connected SEOAIO MCP server with a measured citation sweep for the site.
- The user's content repository for that site, open in this harness, with permission to
  edit files in it. You write the customer's own pages and nothing else.

## Call order (do not skip)

1. `list_assets`: pick the site the user named, by hostname. Never invent an `assetId`.
2. `get_measurement_status`: if `citations` is `null`, stop. No sweep means no
   question has an outcome yet; say so. Note `citations.ageHours` and `inFlight.count`.
3. `list_prompt_outcomes`: every tracked question, worst first, with `counts`,
   `citedShare` (value, low, high, n) and `byEngine`. If `competitorCount` is 0, the
   category-only and absent split is unmeasurable; say so rather than reading absent as
   lost.
4. `list_findings` and `list_recommendations`: whether a recommendation already names
   a page to write, so the plan does not duplicate it.

The only SEOAIO write this skill calls is one `propose_measurement` in Phase 6.
`propose_prompt` is not called unless the user explicitly asks to track a new question.

## Phase 1: snapshot

Fill this block from tool JSON only. Every share line carries its n and interval; a
`null` is written as `not measured`, never as 0.

```
CONTENT PLAN:
Site: <hostname> (<assetId>)
Sweep: <collectedAt> (<citations.ageHours>h ago) | Pooled from <snapshotsPooled> snapshot(s) | Competitors confirmed: <competitorCount>
Questions lost, worst first:
- "<promptText>": lost <lost> of <n> | cited <citedShare.value>% (n=<citedShare.n>, 95% CI <citedShare.low> to <citedShare.high>) | by engine: <engine> <counts.category_only> category-only, <counts.absent> absent
Already recommended: <recommendations[].title that names a page>
```

## Phase 2: cluster and canonicalize

Group the lost questions that share one search intent. One cluster is one page. For each
cluster decide exactly one of:

- `new`: no existing page answers this intent.
- `rewrite`: an existing page answers it badly; same URL, updated in place.
- `consolidate`: two pages half-answer it; merge into the stronger URL.

Read the repository first: existing page files, titles, descriptions and redirects. Prefer
rewrite or consolidate over a near-duplicate.

## Phase 3: stop for approval

Present the plan and **wait**. Do not write any file before the user approves.

```
| cluster (questions) | intent | action (new/rewrite/consolidate) | file | working title | facts needed from the user |
```

Include the CONTENT PLAN block above it. List every fact the page would need that only
the user can confirm: prices, dates, service areas, claims. A page with an unconfirmed
fact is not written.

## CONTENT BATCH MANIFEST

Keep this in the chat, or in a file the user names. Update it as you go and resume from
it in a later session. Do not overwrite another worker's row.

```
CONTENT BATCH MANIFEST v1
Site: <hostname>
Sweep at: <collectedAt>
Phase: <snapshot|plan|write|proposed|re-measured>

| cluster | action | file | phase | measurement request | notes |
| --- | --- | --- | --- | --- | --- |
| <questions> | new | <path> | planned | | |

phase values: planned | approved | written | proposed | re-measured | unchanged | blocked
```

## Phase 4: write (after approval only)

- One page per approved cluster, in the user's repository, following its conventions.
- Answer the questions in the cluster directly, in the user's voice, with only the facts
  the user confirmed. No invented statistics, prices, quotes, awards or comparisons.
- Do not deploy, commit, push, email, post, or purchase unless the user explicitly asks.
  Say what the user needs to deploy for the page to be live.

## Phase 5: not this skill's job

- It does not pitch independent listicles or roundups, and drafts no outreach.
- It does not write posts for communities, forums or social platforms.
- It does not fan out to parallel workers or write pages in bulk. One page per approved
  cluster, and a measured gap closed is the goal, not volume.
- It does not add tracked questions to make a page look needed.

## Phase 6: re-measure

1. When the user says the page is live, call `propose_measurement` once, with a reason
   naming the page. It queues a request a person approves at `https://app.seoaio.ai/dashboard/requests`. Record
   the `changeRequestId` in the manifest. No tool starts a run, reads history, or subscribes to anything; propose_measurement only queues a request for a human. Do not invent a tool name: the list from tools/list is complete.
2. Call `get_measurement_status` until `citations.collectedAt` is newer than the
   publication and `inFlight.count` is 0. There is no subscribe tool; call it again later.
3. Call `list_prompt_outcomes` again and, for each question in the manifest, quote before
   and after: cited share with n and its 95% interval, per engine.
   Every share arrives with its sample size and a 95% Wilson interval; quote both or quote nothing. Absent is not zero: a value that was not measured says so, and the composite Visibility Score is held until at least 5 of its 7 pillars are measured. If the two intervals overlap, say "cannot tell yet" and roughly how
   many more prompts or runs it would take. Do not call a page a win from one sweep.

## Do not

- Write any file before the user approves the table in Phase 3.
- Pitch listicles, draft outreach, post to communities, or write in bulk.
- Invent a fact, a statistic, a quote, a citation or a delta.
- Promise a citation, a ranking or "full coverage".
- Convert any share or count into traffic, revenue or a dollar figure.
- Call `propose_prompt` unless the user asked to track that question.
- Treat a `null` block as zero, or as a broken connection.

## Check before you hand off

- [ ] Every written page was in the approved table, with every fact confirmed by the user
- [ ] The manifest is current
- [ ] One `propose_measurement`, and the user knows it awaits approval
- [ ] Every before-and-after share has n and its interval
- [ ] No listicles, no outreach, no community posts, no dollars

## More

- Setup and the rules for quoting a number: https://seoaio.ai/SKILL.md
- The fix loop for findings on existing pages: https://seoaio.ai/fix-loop/SKILL.md
- One page per tool: https://seoaio.ai/docs/tools
- Troubleshooting: https://seoaio.ai/docs/troubleshooting

END SKILL v2.0.0
