Agent Skills: /fix-posthog

|

UncategorizedID: phrazzld/claude-config/fix-posthog

Install this agent skill to your local

pnpm dlx add-skill https://github.com/phrazzld/claude-config/tree/HEAD/skills/fix-posthog

Skill Files

Browse the full folder contents for fix-posthog.

Download Skill

Loading file tree…

skills/fix-posthog/SKILL.md

Skill Metadata

Name
fix-posthog
Description
|

/fix-posthog

Run /check-posthog, then fix the highest priority issue.

What This Does

  1. Run /check-posthog to identify issues
  2. Pick the highest priority unfixed issue
  3. Implement the fix
  4. Verify the fix works
  5. Report what was fixed

Fixes one issue per invocation. Run multiple times to fix multiple issues.

Fix Playbook

P0: SDK Not Initialized

Problem: initPostHog() not called or PostHogProvider missing.

Fix:

codex exec --full-auto "Add PostHog initialization. \
Create lib/analytics/posthog.ts with initPostHog(). \
Create PostHogProvider component. \
Add to app/layout.tsx. \
Reference: ~/.claude/skills/posthog/references/sdk-patterns.md. \
Verify: pnpm typecheck" \
--output-last-message /tmp/codex-fix.md 2>/dev/null

P0: API Key Missing

Problem: NEXT_PUBLIC_POSTHOG_KEY not set.

Fix:

# Get key from PostHog dashboard
# Add to .env.local
echo "NEXT_PUBLIC_POSTHOG_KEY=phc_xxx" >> .env.local

# Add to Vercel production
printf '%s' 'phc_xxx' | vercel env add NEXT_PUBLIC_POSTHOG_KEY production

P1: No Reverse Proxy

Problem: Direct PostHog host gets blocked by ad blockers.

Fix:

codex exec --full-auto "Add PostHog reverse proxy to next.config. \
Add rewrites for /ingest/* to us.i.posthog.com/*. \
Add rewrites for /ingest/static/* to us-assets.i.posthog.com/static/*. \
Update posthog.init to use api_host: '/ingest'. \
Reference: ~/.claude/skills/posthog/references/sdk-patterns.md section 4. \
Verify: pnpm build" \
--output-last-message /tmp/codex-fix.md 2>/dev/null

P1: Privacy Masking Missing

Problem: mask_all_text and maskAllInputs not configured.

Fix:

codex exec --full-auto "Add privacy settings to PostHog init. \
Add mask_all_text: true. \
Add session_recording.maskAllInputs: true. \
Add person_profiles: 'identified_only'. \
Reference: ~/.claude/skills/posthog/references/privacy-checklist.md. \
Verify: pnpm typecheck" \
--output-last-message /tmp/codex-fix.md 2>/dev/null

P1: PII in identify() Calls

Problem: Email/name passed to posthog.identify().

Fix:

codex exec --full-auto "Remove PII from posthog.identify calls. \
Only pass user ID, no email/name/phone properties. \
Search: grep -rE 'posthog.identify.*email|identify.*name' --include='*.ts' --include='*.tsx'. \
Verify: pnpm typecheck && grep -rE 'posthog.identify.*email' returns no results" \
--output-last-message /tmp/codex-fix.md 2>/dev/null

P2: No Standard Events

Problem: No typed event schema defined.

Fix:

codex exec --full-auto "Add typed event schema to PostHog analytics. \
Create StandardEvent type with: user_signed_up, user_activated, subscription_started, subscription_cancelled, feature_used. \
Add trackEvent function that enforces type. \
Reference: ~/.claude/skills/posthog/references/sdk-patterns.md section 1. \
Verify: pnpm typecheck" \
--output-last-message /tmp/codex-fix.md 2>/dev/null

Verification

After each fix, verify with MCP:

# Check events are flowing
mcp__posthog__query-run with TrendsQuery for last 1h

# Check for errors
mcp__posthog__list-errors

Manual browser verification:

  1. Open DevTools → Network
  2. Filter for ingest or posthog
  3. Trigger action → verify request succeeds
  4. Check PostHog Live Events → verify event appears

Output

After fixing, report:

  • What was fixed
  • How it was verified
  • What's the next priority issue (if any)

Related

  • /check-posthog - Audit only (no fixes)
  • /log-posthog-issues - Create GitHub issues
  • /posthog - Full lifecycle workflow