deploy-verify — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited deploy-verify (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Automated post-deploy health check across all services. Run after every deploy to catch regressions before users do. Works with any project — auto-detects configuration.
Run within 15 minutes of deploy. The sooner you check, the smaller the blast radius.
Parallel where possible. Sentry, Supabase, and Langfuse checks are independent — run them in parallel to save time.
The verdict must be binary. SHIP, ROLLBACK, or MONITOR (with clear criteria for when MONITOR escalates to ROLLBACK).
Evidence over opinion. Every check produces a PASS/FAIL with specific data. Never say "looks fine."
Always use the `browser-anti-stall` protocol when using Playwright browser MCP tools.
Grep(pattern: "vercel\\.json|netlify\\.toml|fly\\.toml|render\\.yaml|railway\\.json|Dockerfile|docker-compose|appspec\\.yml", output_mode: "files_with_matches")
Grep(pattern: "VERCEL_URL|RENDER_EXTERNAL_URL|FLY_APP_NAME|RAILWAY_STATIC_URL", glob: ".env*")Grep(pattern: "NEXT_PUBLIC_APP_URL|NEXT_PUBLIC_BASE_URL|VITE_APP_URL|PUBLIC_URL|PRODUCTION_URL|APP_URL", glob: ".env*")
Grep(pattern: "https://.*\\.vercel\\.app|https://.*\\.netlify\\.app|https://.*\\.fly\\.dev|https://.*\\.railway\\.app", glob: ".env*")Also check framework config files:
Grep(pattern: "url|domain|hostname", glob: "{vercel.json,netlify.toml,next.config.*}")Grep(pattern: "SENTRY_ORG|SENTRY_PROJECT|SENTRY_DSN|SENTRY_AUTH_TOKEN|@sentry/nextjs|@sentry/react|@sentry/node|sentry-cli", glob: "{.env*,package.json,.sentryclirc,sentry.*.config.*}")Grep(pattern: "SUPABASE_URL|NEXT_PUBLIC_SUPABASE_URL|SUPABASE_SERVICE_ROLE_KEY|SUPABASE_ANON_KEY", glob: ".env*")To get the project ID for MCP calls:
CallMcpTool(server: "plugin-supabase-supabase", toolName: "list_projects", arguments: {})Match the detected URL to a project to get project_id.
Grep(pattern: "LANGFUSE_PUBLIC_KEY|LANGFUSE_SECRET_KEY|LANGFUSE_HOST|@langfuse", glob: "{.env*,package.json}")Detect the app's route structure to identify critical paths for smoke testing:
Glob("**/app/**/page.{tsx,jsx,ts,js}")
Glob("**/pages/**/*.{tsx,jsx,ts,js}")
Glob("**/src/routes/**/*.{tsx,jsx,svelte}")Identify the critical paths (prioritized):
Record all detected values:
PRODUCTION_URLSENTRY_ORG, SENTRY_PROJECTSUPABASE_PROJECT_IDLANGFUSE_AVAILABLE (boolean)CRITICAL_PATHS (list of URLs to smoke test)CallMcpTool(server: "plugin-sentry-sentry", toolName: "find_organizations", arguments: {})Use the detected org slug and project slug from Phase 0c.
CallMcpTool(server: "plugin-sentry-sentry", toolName: "find_releases", arguments: {
"organizationSlug": "<ORG_SLUG>",
"projectSlug": "<PROJECT_SLUG>"
})Verify:
CallMcpTool(server: "plugin-sentry-sentry", toolName: "search_issues", arguments: {
"organizationSlug": "<ORG_SLUG>",
"projectSlug": "<PROJECT_SLUG>",
"query": "is:unresolved firstSeen:>1h",
"sortBy": "freq"
})Also check for regressions (previously resolved issues that re-opened):
CallMcpTool(server: "plugin-sentry-sentry", toolName: "search_issues", arguments: {
"organizationSlug": "<ORG_SLUG>",
"projectSlug": "<PROJECT_SLUG>",
"query": "is:regressed",
"sortBy": "freq"
})For any new issue with high event count or critical severity, run Sentry's AI root-cause analysis:
CallMcpTool(server: "plugin-sentry-sentry", toolName: "analyze_issue_with_seer", arguments: {
"organizationSlug": "<ORG_SLUG>",
"issueId": "<ISSUE_ID>"
})This provides:
Decision criteria:
Skip this phase if no Supabase integration detected.
CallMcpTool(server: "plugin-supabase-supabase", toolName: "list_migrations", arguments: {
"project_id": "<PROJECT_ID>"
})Verify:
CallMcpTool(server: "plugin-supabase-supabase", toolName: "get_logs", arguments: {
"project_id": "<PROJECT_ID>",
"service": "api"
})Check for:
CallMcpTool(server: "plugin-supabase-supabase", toolName: "get_logs", arguments: {
"project_id": "<PROJECT_ID>",
"service": "edge-function"
})Check for:
CallMcpTool(server: "plugin-supabase-supabase", toolName: "get_logs", arguments: {
"project_id": "<PROJECT_ID>",
"service": "auth"
})Check for:
CallMcpTool(server: "plugin-supabase-supabase", toolName: "get_advisors", arguments: {
"project_id": "<PROJECT_ID>",
"type": "security"
})CallMcpTool(server: "plugin-supabase-supabase", toolName: "get_advisors", arguments: {
"project_id": "<PROJECT_ID>",
"type": "performance"
})Flag any new warnings that weren't present before the deploy.
Run a quick data integrity check on the most important tables:
CallMcpTool(server: "plugin-supabase-supabase", toolName: "execute_sql", arguments: {
"project_id": "<PROJECT_ID>",
"query": "SELECT schemaname, relname, n_dead_tup, last_autovacuum FROM pg_stat_user_tables WHERE n_dead_tup > 10000 ORDER BY n_dead_tup DESC LIMIT 5"
})Decision criteria:
Skip this phase if no Langfuse integration detected.
npx langfuse-cli api traces list --limit 10Verify:
From the trace list, examine:
npx langfuse-cli api prompts listConfirm that active prompt versions match what the deploy should be using (check the production label).
Decision criteria:
CallMcpTool(server: "user-playwright", toolName: "browser_navigate", arguments: {
"url": "<PRODUCTION_URL>"
})Important: Apply the browser-anti-stall protocol:
browser_wait_for on navigationbrowser_snapshot to detect ready stateFor each critical path identified in Phase 0f:
CallMcpTool(server: "user-playwright", toolName: "browser_console_messages", arguments: {})CallMcpTool(server: "user-playwright", toolName: "browser_network_requests", arguments: {})If the app has auth:
Navigate to the primary feature and perform one basic interaction:
CallMcpTool(server: "user-playwright", toolName: "browser_take_screenshot", arguments: {})Decision criteria:
Aggregate all phase results into a final verdict.
| Scenario | Verdict |
|---|---|
| All phases PASS | SHIP — Deploy is healthy |
| All phases PASS except 1-2 MONITOR items | MONITOR — Watch for 1 hour, re-check |
| Any phase FAIL with a quick fix available | HOTFIX — Apply fix and re-verify |
| Any critical phase FAIL (auth broken, data loss, 5xx on main feature) | ROLLBACK — Revert immediately |
| Seer identifies a simple root cause for the only FAIL | HOTFIX — Apply Seer's fix, re-verify |
═══════════════════════════════════════════════════════
POST-DEPLOY VERIFICATION REPORT
Project: <PROJECT_NAME>
Deploy Time: <TIMESTAMP>
Production URL: <URL>
Checked At: <CHECK_TIMESTAMP>
═══════════════════════════════════════════════════════
## HEALTH CHECK RESULTS
| Check | Status | Details |
|------------------------------|---------|--------------------------------------|
| Sentry: new errors | ✅/❌ | [0 new / N new — list top issues] |
| Sentry: regressions | ✅/❌ | [0 regressed / N regressed] |
| Sentry: release tracked | ✅/❌ | [release ID and timestamp] |
| Supabase: migrations | ✅/❌ | [all applied / N pending/failed] |
| Supabase: API logs | ✅/❌ | [clean / N errors in last 30m] |
| Supabase: Edge Function logs | ✅/❌ | [clean / N errors] |
| Supabase: Auth logs | ✅/❌ | [clean / N errors] |
| Supabase: advisors | ✅/❌ | [no new warnings / N new warnings] |
| Langfuse: traces flowing | ✅/❌ | [N traces in last 15m / no traces] |
| Langfuse: latency | ✅/❌ | [normal / Xms above baseline] |
| Langfuse: prompt versions | ✅/❌ | [match expected / mismatch on N] |
| Smoke: home page | ✅/❌ | [loads in Xs / error] |
| Smoke: auth flow | ✅/❌ | [works / broken] |
| Smoke: main feature | ✅/❌ | [works / broken] |
| Smoke: console errors | ✅/❌ | [0 errors / N errors] |
| Smoke: network 5xx | ✅/❌ | [0 / N failed requests] |
## SEER ANALYSIS (if any P0 issues)
Issue: <ISSUE_ID>
Root Cause: <SEER_EXPLANATION>
Suggested Fix: <CODE_FIX>
Files Affected: <FILE_LIST>
## VERDICT
┌─────────────────────────────────────────────────┐
│ │
│ [SHIP / MONITOR / HOTFIX / ROLLBACK] │
│ │
│ Reason: <one-line explanation> │
│ │
│ Next action: <what to do now> │
│ │
└─────────────────────────────────────────────────┘
## MONITOR ESCALATION (if verdict is MONITOR)
Re-check in: [30 minutes / 1 hour]
Escalate to ROLLBACK if: [specific condition, e.g., error count exceeds 50]
Watch: [specific metrics to monitor]
═══════════════════════════════════════════════════════~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.