refreshlisted
Install: claude install-skill mkreindel/seo-toolkit-template
# `/refresh` — Existing-post refresher
Upgrades an existing published blog post in place. Often higher-leverage than writing a new post — Google rewards freshness on existing-ranking content.
## Inputs
Required:
- **Site** — must match a folder under `sites/[name]/`.
- **Post URL** — the live URL of the post to refresh.
Optional:
- **Refresh scope** — `light` (stats + internal links + `dateModified` only), `medium` (light + Tier 1 fixes + image upgrades), `heavy` (medium + section rewrites + new SERP analysis). Default: `medium`.
- **Image source** — overrides default (only if scope includes image upgrades).
## Workflow
### Step 0 — Cron-mode detection (if invoked with `--cron`)
If the invocation contains `--cron`, this skill runs in cron mode (no user available). Required behavior:
1. **Idempotency check:** see this skill's "Routine versioning + idempotency contract" section. If today's output already exists, exit cleanly with `exit: "idempotent-skip"`. Write one line to the audit log via `scripts/lib/audit-log.mjs` `appendRun({ exit: "idempotent-skip", ... })`.
2. **Escalation contract:** any decision that would normally prompt the user (missing required file, voice anti-AI failure, schema validation failure, keyword cannibalization, etc.) MUST be escalated by writing an item to `sites/{site}/_inbox/` via `scripts/lib/cron-mode.mjs` `writeInboxItem(...)`. After writing, exit cleanly with `exit: "escalated"`. Do NOT use `AskUserQuestion` in cron mode.
3. **Defaults