$npx -y skills add yoyothesheep/claude-skills --skill publish-checklistPre-publish checklist for blog posts, career pages, industry pages, and /now articles. Run before publishing or updating to validate SEO, dates, sitemap, formatting, and build.
| 1 | # Publish Checklist |
| 2 | |
| 3 | Run before publishing or updating any page. Unless otherwise specified, fix failures immediately using Edit/Write tools before moving on. Report final results as PASS/FAIL/FIXED. |
| 4 | |
| 5 | ## Setup |
| 6 | |
| 7 | Read `.claude/skills/publish-checklist/CONFIG.md` and load: |
| 8 | - `PUBLISH_SCRIPT` — the automated validation script command |
| 9 | - `SITE_CHECKLIST_PATH` — path to the site-specific checklist instruction file |
| 10 | - `TRACKER_AEO_CONTENT` — content tracker file (all published pages) |
| 11 | |
| 12 | Read the file at `SITE_CHECKLIST_PATH` — it defines page type detection, the automated script flags, and all Phase 2 page-type-specific checks. |
| 13 | |
| 14 | --- |
| 15 | |
| 16 | ## Phase 0: Detect & Run Script |
| 17 | |
| 18 | Detect the page type from the user's input using the rules in `SITE_CHECKLIST_PATH`. |
| 19 | |
| 20 | Run the automated script from `PUBLISH_SCRIPT` and fix all FAILs before continuing. |
| 21 | |
| 22 | --- |
| 23 | |
| 24 | ## Phase 1: Shared Checks (all page types) |
| 25 | |
| 26 | ### Formatting |
| 27 | |
| 28 | - [ ] Anchor links: every `href="#..."` has a matching `id` attribute in rendered output |
| 29 | - [ ] Image/asset paths: all referenced files exist in the public directory |
| 30 | - [ ] Internal links point to valid routes |
| 31 | |
| 32 | ### SEO & Metadata |
| 33 | |
| 34 | - [ ] Title matches `<h1>`; title <60 chars |
| 35 | - [ ] Description: 1 sentence, distinct from homepage, <160 chars, specific (names a number, entity, or data point) |
| 36 | - [ ] OG quality: action-oriented or curiosity-driven — would you click this in search results? |
| 37 | - [ ] FAQ pairs are real questions (not statements) with concise, specific answers |
| 38 | - [ ] JSON-LD: correct schema type present for the page type (see `SITE_CHECKLIST_PATH` for type mapping) |
| 39 | - [ ] AEO: first paragraph of each `<h2>` directly answers the implied question; headings match common queries |
| 40 | |
| 41 | ### Accessibility & Mobile |
| 42 | |
| 43 | - [ ] `aria-expanded` on all expandable toggles |
| 44 | - [ ] Decorative SVGs have `aria-hidden="true"` |
| 45 | - [ ] Body prose uses responsive text sizing |
| 46 | - [ ] Stat rows widen on mobile (never fixed half-width) |
| 47 | - [ ] Charts/graphs use stacked vertical layout on mobile |
| 48 | |
| 49 | --- |
| 50 | |
| 51 | ## Phase 2: Page-Type Checks |
| 52 | |
| 53 | Run the section from `SITE_CHECKLIST_PATH` matching the detected page type. |
| 54 | |
| 55 | --- |
| 56 | |
| 57 | ## Phase 3: Update Content Tracker |
| 58 | |
| 59 | After all checks pass, update `TRACKER_AEO_CONTENT`: |
| 60 | |
| 61 | - If the page already has a row: update its Status to `Published YYYY-MM-DD` (today's date). |
| 62 | - If no row exists: add one to the Content Status table with columns: `Title | Type | Status | Priority | Slug | Notes`. Set Type to `Blog`, `Career`, `Industry`, or `Now`. Set Priority to `—`. Leave Notes blank unless there's something actionable. |
| 63 | |
| 64 | The automated script (`publish_check.py`) handles this for pages already in the tracker with a Draft/Planned status. Only intervene manually if the script reports "no Draft/Planned row found." |
| 65 | |
| 66 | **For blog posts only:** The script also creates `docs/tracker/citation_baselines/[slug]-baseline.md` with the Day 0/7/14 schedule pre-filled from the post's `faqQuestion`. After the script runs, open that file and fill in the Day 0 query results by running the listed queries in ChatGPT, Perplexity, Google AI Overview, and Gemini. Add 2 additional queries from the post's key claims before saving. |