{"id":10441,"plugin_id":"plugin_asdk_app_69fe16bb7a048191af54574d5986aab2","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T22:57:11.921Z","digest":"119269766a1ca045ab8941ff2f0e1ccbda2e5dc605630b7f6772d5bcadd93fd1","against":null,"payload":{"name":"client-handoff-checklist","description":"Pre-launch QA pass for a BrightSite site before handing it to a client or going live. Verifies site identity, error pages, blog settings, forms, redirects, analytics, and meta defaults are all configured. Outputs a checklist with green/yellow/red status. Use when the user mentions \"client handoff,\" \"pre-launch checklist,\" \"launch QA,\" \"going live,\" \"ready to ship,\" \"is this site ready,\" or wants a final QA pass before publishing a site.","included_files":[],"skill_md_contents":"---\nname: client-handoff-checklist\ndescription: Pre-launch QA pass for a BrightSite site before handing it to a client or going live. Verifies site identity, error pages, blog settings, forms, redirects, analytics, and meta defaults are all configured. Outputs a checklist with green/yellow/red status. Use when the user mentions \"client handoff,\" \"pre-launch checklist,\" \"launch QA,\" \"going live,\" \"ready to ship,\" \"is this site ready,\" or wants a final QA pass before publishing a site.\n---\n\n# Client Handoff Checklist\n\nEvery agency forgets something. This is the \"before you push the launch button\" QA pass for a BrightSite site. Run it the day before going live.\n\n> If the launch is a **redesign built on a staging site**, run this checklist against the\n> staging site (pass `site: \"staging\"` on the read tools below, or point at the staging\n> `preview_url`) *before* you `promote_staging`. See the `staging-redesign` skill.\n\n## When to use this\n\n- About to point the domain at a BrightSite site.\n- About to email the client login credentials.\n- Just finished a site build and want to know what you missed.\n\n## Inputs you need from the user\n\n1. **Account ID**\n2. **Public URL** — what URL will visitors hit? (Used to validate canonical URLs.)\n3. **Anything skip-worthy?** — e.g. \"no blog on this site, skip blog checks\" or \"no contact form, skip form checks.\"\n\n## Workflow\n\nRun through every check below. For each, report `[OK]`, `[WARN]`, or `[FAIL]` and a one-line summary. Use plain text markers — no emojis unless the user explicitly asked for them.\n\n### 1. Site identity (`mcp__brightsite__get_site_identity`)\n\n- `[FAIL]` if `title` is empty or still \"Untitled Site\" / default\n- `[FAIL]` if `logo_id` is null\n- `[WARN]` if `icon_id` (favicon) is null\n- `[FAIL]` if `business_type` is null (hurts schema/structured data)\n- `[WARN]` if `business_description` is missing\n- `[WARN]` if `email` or `phone` is missing (clients usually want at least one contact method)\n- For local businesses: `[WARN]` if address fields are missing or `geo_lat`/`geo_lng` is null\n- `[WARN]` if `social_profiles` is empty\n\n### 2. Pages (`mcp__brightsite__list_pages` + `mcp__brightsite__get_page` on each)\n\n- `[FAIL]` if no page has `is_home_page: true`\n- `[FAIL]` if any page has `status` of `draft` and is linked from the homepage (sanity-check by scanning the home page HEEx for internal links)\n- `[WARN]` if any page has `has_unpublished_changes: true` — those staged changes won't be live\n- `[FAIL]` for any page missing `meta_title` or `meta_description`\n- `[WARN]` for pages where `canonical_url` is set to a different domain than the public URL\n\nRun a mini-version of `bulk-seo-audit` inline — count and report total SEO issues across all pages.\n\n### 3. Error pages (`mcp__brightsite__list_error_pages`)\n\nThe returned rows expose the HTTP status as `status_code` (integer), so filter on that field.\n\n- `[FAIL]` if no row with `status_code: 404` exists\n- `[WARN]` if no row with `status_code: 500` exists\n- `[WARN]` if any error page has `has_unpublished_changes: true`\n\n### 4. Blog settings (`mcp__brightsite__get_blog_settings`) — skip if user said no blog\n\n- `[OK]` to skip if `enabled: false` and user confirmed no blog\n- `[FAIL]` if `enabled: true` but `blog_title` is empty\n- `[WARN]` if `blog_url` or `listing_url` are missing or do not start with `/`. These are path settings, not full domains.\n- `[WARN]` if `posts_per_page` is null or absurd (< 3 or > 50)\n- `[WARN]` if `enable_open_graph` is `false` (poor social sharing)\n\n### 5. Posts (`mcp__brightsite__list_posts` + `mcp__brightsite__get_post` on each) — skip if no blog\n\n- `[WARN]` if zero published posts (clients usually want at least 1-3 launch posts)\n- `[WARN]` if any post has `has_unpublished_changes: true`\n- Inline mini-audit: fetch each post with `mcp__brightsite__get_post`, then count posts missing `meta_description` or both `feature_image_url` and `feature_image_id`\n\n### 6. Forms (`mcp__brightsite__list_forms`) — skip if user said no forms\n\n- `[WARN]` if no forms exist but the homepage contains \"contact\" copy (probably an oversight).\n- `[OK]` if forms exist.\n- `[INFO]` Always print this reminder: the MCP cannot inspect form delivery/recipient configuration. Tell the user: **\"I confirmed forms exist, but you must verify in the BrightSite dashboard that each form has a notification email or webhook configured. A form with no recipient silently drops submissions.\"**\n\n### 7. Redirects (`mcp__brightsite__list_redirects`)\n\n- `[OK]` informational only — count how many redirects exist\n- If the site was a migration, `[WARN]` if zero redirects exist (probably forgot the redirect map)\n\n### 8. Analytics (`mcp__brightsite__get_analytics` with `metric: \"summary\"`, `period: \"7d\"`)\n\n- `[OK]` if any data exists (means tracking is firing)\n- `[WARN]` if `total_page_views: 0` over the last 7 days — either it's pre-launch (fine) or tracking isn't wired up (bad)\n\n### 9. Global code (`mcp__brightsite__get_global_code`)\n\n- `[WARN]` if `css_staged`, `js_staged`, or `tailwind_config_staged` differ from published versions (staged but unpublished global code)\n- `[OK]` otherwise\n\n### 10. Production-readiness final pass\n\n- `[FAIL]` if any page or post still has placeholder text. Reuse the `heex`/`heex_staged` (pages) and `content`/`content_staged` (posts) strings already fetched in steps 2 and 5 — do NOT call any write tools. Scan BOTH live and staged versions; staged placeholder text will go live the next time the user publishes. Substrings to flag (case-insensitive): `\"lorem ipsum\"`, `\"TODO\"`, `\"FIXME\"`, `\"test test\"`, `\"placeholder\"`, `\"xxx\"` as a standalone token. Report the entity ID, which version (live vs staged), and the matched substring so the user can locate it in the editor.\n\n## Output format\n\nEnd with a clear summary block:\n\n```\nHandoff readiness: NOT READY\n-----------------------------\n[FAIL] 3 critical issues\n[WARN] 8 warnings\n[OK]  31 checks passed\n\nCritical issues to fix before launch:\n1. Home page has no meta_description (page ID 8fd2k3jq91pn)\n2. 404 error page does not exist\n3. Site identity missing logo\n\nWarnings worth addressing:\n- 2 pages have unpublished staged changes\n- Blog has no posts published yet\n- ...\n\nRe-run this checklist after fixing the critical issues.\n```\n\nOr, on a clean site:\n\n```\nHandoff readiness: READY\n-------------------------\n[OK] 41 checks passed\n[WARN] 2 warnings (non-blocking)\n\nNon-blocking warnings:\n- No social_profiles set in site identity\n- Blog has only 1 published post\n\nShip it.\n```\n\n## Anti-patterns to avoid\n\n- **Don't fix things automatically.** This is a checklist, not a remediation tool. The user wants to see what's wrong and decide.\n- **Don't grade on a curve.** A site missing a meta_description on the homepage is `[FAIL]`, even if the rest is great. Be honest.\n- **Don't skip checks the user didn't explicitly skip.** If the user didn't say \"no blog,\" run the blog checks.\n\n## Example invocation\n\n> Run the handoff checklist on account `YOUR_ACCOUNT_ID`, public URL is `https://acmehvac.com`. They have a contact form and a blog.\n\n## Tools used\n\n- `mcp__brightsite__get_site_identity`\n- `mcp__brightsite__list_pages` + `mcp__brightsite__get_page`\n- `mcp__brightsite__list_error_pages`\n- `mcp__brightsite__get_blog_settings`\n- `mcp__brightsite__list_posts` + `mcp__brightsite__get_post`\n- `mcp__brightsite__list_forms`\n- `mcp__brightsite__list_redirects`\n- `mcp__brightsite__get_analytics`\n- `mcp__brightsite__get_global_code`\n\nThis skill is **read-only**. It never calls a write tool. The placeholder-text check in step 10 runs against content already loaded into context — it does not call `search_replace` or any other mutating tool.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}