Portfolio skill · read-only · no account, no keys

CMS content audit

One HTTP GET audits a published sitemap — well-formed, untruncated, canonical URL present — read-only, the way a crawler would read it.

A real, replayable Reelier skill against a live public API. Every replay proves the same thing: A public sitemap answers as a complete urlset that still enumerates its canonical URL — and writes a receipt saying exactly which assertions held.

What this checks

One step: an HTTP GET to the public sitemap.xml. Four assertions hold it to account — the endpoint answered 200, the body opens with <urlset (a real sitemap, not an HTML error page), it carries the closing </urlset> (the document arrived whole, not truncated mid-stream), and <loc>https://www.reelier.com/</loc> is still enumerated (the homepage didn't silently drop out of a regen).

The assertions pin structure and canonicals, never a URL count. The first enumerated URL is bound onto the receipt (first_url = body match /<loc>...</loc>/) instead of pinned, so shipping a new page changes the sitemap without breaking the replay.

This is the only body-as-text audit in the portfolio — it reads the response as content, not as a JSON API, and catches content-integrity breaks (a missing route serving HTML, a truncated response, a dropped canonical) that a JSON shape-check would never see.

StepsAssertionsEffectSeed run (2026-07-21)
14read1/1 passed · 132ms · 0 LLM tokens

Endpoint it hits:

  • https://www.reelier.com/sitemap.xml

The skill file

This is the whole artifact — a markdown file with an assertion on every step. Copy it, check it into your repo, replay it anywhere.

cms-content-audit.skill.md — verbatim
---
name: cms-content-audit
description: Read-only content audit of a public sitemap — well-formed urlset, not truncated, canonical URL still present
---

<!-- synced from seldonframe/reelier examples/portfolio — edit there -->

# CMS content audit

Inputs: (none — this file replays green as-is; see the personalization note)

<!--
  Personalization: swap the literal host `www.reelier.com` for your own
  domain — one sed pass rewrites BOTH the sitemap URL and the canonical-URL
  assertion, since both carry the same host (the portfolio README's "Point
  these at YOUR project" section has the one-command version). Then make the
  `body contains "<loc>...</loc>"` assertion name a URL you KNOW is always in
  your sitemap (your homepage, a pillar page). The skill grammar has no
  default-value syntax for {{var}} holes — an unbound {{var}} is an explicit
  error, never a guessed fallback — so this file ships with literals that
  replay green with zero flags.

  This is the "did my published content break" audit, not a freshness radar.
  It reads the sitemap the way a crawler would and pins the invariants that
  must never quietly break: the response is a real urlset (not an HTML error
  page), the document arrived whole (the closing tag is present, so it wasn't
  truncated mid-stream), and a canonical URL is still enumerated (a regen that
  silently drops your homepage fails here instead of in Search Console weeks
  later).

  Endpoint verified live on 2026-07-21: 200, application/xml, 73 <loc>
  entries, `<loc>https://www.reelier.com/</loc>` present.
-->

Content moves; structure and canonicals don't. The assertions pin the SHAPE
(it's a urlset, it's complete, the homepage is in it) and bind the first
enumerated URL onto the receipt — never a specific URL count that would rot
the day a new page ships.

## Steps

### Step 1 — Sitemap is a complete urlset with the canonical URL present
- intent: Fetch the public sitemap and confirm it is a well-formed, untruncated urlset that still enumerates the homepage
- action: http.get {"url": "https://www.reelier.com/sitemap.xml"}
- assert: status == 200
- assert: body contains "<urlset"
- assert: body contains "</urlset>"
- assert: body contains "<loc>https://www.reelier.com/</loc>"
- bind: first_url = body match /<loc>([^<]+)<\/loc>/
- effect: read
synced from seldonframe/reelier examples/portfolio · the file is the artifact

Run it yourself

reelier run takes a local file, so fetch the canonical copy first (or clone the repo). The replay is read-only, needs no account and no keys, and writes its receipt to .reelier/runs/.

sh
# straight from the repo's main branch (the canonical copy):
curl -fsSL https://raw.githubusercontent.com/seldonframe/reelier/main/examples/portfolio/cms-content-audit.skill.md -o cms-content-audit.skill.md
npx -y reelier@latest run cms-content-audit.skill.md

# or from a clone:
git clone https://github.com/seldonframe/reelier
cd reelier && npx -y reelier@latest run examples/portfolio/cms-content-audit.skill.md

The receipt

The portfolio README records a real seed run of this skill, replayed with the published CLI on 2026-07-21. Verbatim output:

run receipt · 2026-07-21 · reelier@0.14.0
✓ Step 1 — Sitemap is a complete urlset with the canonical URL present [passed] 132ms

PASSED: 1/1 steps ok, 0 failed, 132ms total
[measured] 0 LLM tokens
replayed with the published CLI on 2026-07-21 · run record confirms passed: true, 0 LLM tokens (input + output)

And the proof keeps accumulating without anyone touching it: a GitHub Action replays all five portfolio skills every 6 hours (plus on demand) — the public Actions tab is the standing audit log. A failing endpoint produces an honestly failing receipt there, never a retried-until-green one.

Point it at your project

Swap the one literal host `www.reelier.com` for your own domain — a single sed pass rewrites both the sitemap URL and the canonical-URL assertion, since they share the host. Then point the `body contains "<loc>...</loc>"` assertion at a URL you KNOW is always in your sitemap (your homepage or a pillar page). The skill grammar has no default-value syntax for {{var}} holes — an unbound {{var}} is an explicit error, never a guessed fallback — so this file ships with literals that replay green with zero flags.

sh
sed 's/www\.reelier\.com/YOUR-DOMAIN.com/g' cms-content-audit.skill.md > my-content-audit.skill.md \
  && npx -y reelier@latest run my-content-audit.skill.md