mixpanel-analytics
Django4Lyfe optimo_analyticsモジュールで、MixPanelの分析トラッキングを実装・レビューし、既存パターンに沿ったイベント実装や、個人情報保護、スキーマ設計、コード品質の確認を行うSkill。
📜 元の英語説明(参考)
MixPanel analytics tracking implementation and review Skill for Django4Lyfe optimo_analytics module. Implements new events following established patterns and reviews implementations for PII protection, schema design, and code quality.
🇯🇵 日本人クリエイター向け解説
Django4Lyfe optimo_analyticsモジュールで、MixPanelの分析トラッキングを実装・レビューし、既存パターンに沿ったイベント実装や、個人情報保護、スキーマ設計、コード品質の確認を行うSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o mixpanel-analytics.zip https://jpskill.com/download/18706.zip && unzip -o mixpanel-analytics.zip && rm mixpanel-analytics.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/18706.zip -OutFile "$d\mixpanel-analytics.zip"; Expand-Archive "$d\mixpanel-analytics.zip" -DestinationPath $d -Force; ri "$d\mixpanel-analytics.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
mixpanel-analytics.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
mixpanel-analyticsフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
MixPanel Analytics Skill
この Skill の使用時
この Skill は、optimo_analytics モジュールで MixPanel analytics のトラッキングを行う際に、Django4Lyfe バックエンドで使用します。
/mixpanel-analytics:implement– 新しい MixPanel トラッキングイベントを実装したり、確立されたパターンに従って既存のイベントを更新したりする場合に使用します(7段階チェックリスト)。/mixpanel-analytics:review– MixPanel の実装が正確であるか、PII(個人情報)保護がされているか、Django4Lyfe の標準に準拠しているかをレビューする場合に使用します。
プロンプトの例
実装モード
- 「
/mixpanel-analytics:implementを使用して、ユーザーがプロファイル設定を完了したときにトラッキングする新しいイベントを追加してください。」 - 「
/mixpanel-analytics:implement svc.surveys.reminder_sentを実行して、アンケートのリマインダー通知のトラッキングを追加してください。」 - 「
/mixpanel-analytics:implementを使用して、新しい HRIS CSV 検証機能の MixPanel トラッキングを実装してください。」
レビューモード
- 「
/mixpanel-analytics:review stagedを実行して、ステージングされた MixPanel の変更に PII 違反やパターン違反がないか確認してください。」 - 「
/mixpanel-analytics:review branchを使用して、このフィーチャーブランチ上のすべてのアナリティクスの変更を監査してください。」 - 「
/mixpanel-analytics:review allを使用して、optimo_analyticsモジュール全体をレビューしてください。」
モード
この Skill は、呼び出し方によって動作が異なります。
implementモード –/mixpanel-analytics:implementを介して呼び出されます。- 7つのステップを通して、新しい MixPanel イベントの実装をガイドします。
- 定数、スキーマ、レジストリエントリ、サービスメソッド、およびテストを作成します。
- PII 保護とコードパターンを強制します。
reviewモード –/mixpanel-analytics:reviewを介して呼び出されます。- 既存の実装がコンプライアンスに準拠しているかを監査します。
- PII 保護、スキーマ設計、サービスパターン、およびテストカバレッジを確認します。
- 重大度タグ付きの構造化されたレビューレポートを生成します。
環境とコンテキストの収集
この Skill を実行する際は、まずコンテキストを収集します。
# Git コンテキスト
git branch --show-current
git status --porcelain
git diff --cached --name-only | grep -E "optimo_analytics|mixpanel"
# アナリティクスのモジュール統計
grep -c "^ [A-Z_]* = " optimo_analytics/constants.py 2>/dev/null || echo "0"
grep -c "^class Mxp" optimo_analytics/schemas.py 2>/dev/null || echo "0"
grep -c "MixPanelEvent\." optimo_analytics/registry.py 2>/dev/null || echo "0"
ls -1 optimo_analytics/service/*.py 2>/dev/null | xargs -I{} basename {} .py
主要な参照ファイルを読みます。
optimo_analytics/AGENTS.md– モジュールレベルのルールと PII ガイドラインoptimo_analytics/schemas.py– 既存のスキーマパターンoptimo_analytics/service/AGENTS.md– サービスレイヤーのパターンoptimo_analytics/tests/AGENTS.md– テストパターン
実装モード
7段階実装チェックリスト
新しいイベントごとに、次のステップを順番に完了してください。
ステップ 1: イベント定数の追加 (optimo_analytics/constants.py)
# イベント命名規則: {prefix}.{object}.{action}[.error]
# 例:
# - svc.surveys.survey_delivered
# - svc.map.action_plan_created
# - svc.hris_csv.upload.analysis_completed
#
# 注: イベント名に "cron" を含めないでください - 代わりに is_cron_job プロパティを使用してください
class MixPanelEvent:
# コメント付きで適切なセクションの下に追加
NEW_EVENT_NAME = "svc.domain.action_name"
ステップ 2: スキーマの作成 (optimo_analytics/schemas.py)
# スキーマ命名: Mxp{Domain}{Action}EventSchema
# 重要なルール:
# - すべての UUID は文字列である必要があります (str, UUID ではない)
# - PII は含めないでください: 名前、メールアドレス、電話番号
# - organization_name は許可されています (ビジネス承認済み)
# - STRICT_MODEL_CONFIG (エイリアスなし) または ALIASED_MODEL_CONFIG ($ エイリアス) を使用してください
class MxpNewEventSchema(MixpanelSuperEventPropertiesSchema):
"""svc.domain.action_name イベントのプロパティ。
[このイベントがいつ発生するかを記述] するときに追跡されます。
"""
# 必須フィールド (デフォルトなし)
employee_id: str = Field(description="文字列としての従業員 UUID")
organization_id: str = Field(description="文字列としての組織 UUID")
organization_name: str = Field(description="分析用の組織名")
role: SystemRole | None = Field(description="ユーザーロール")
impersonation: bool = Field(description="なりすましセッションかどうか")
# イベント固有のフィールド
custom_field: str = Field(description="このフィールドが表すもの")
# 内部専用スキーマには STRICT_MODEL_CONFIG を使用してください
# フィールド名に MixPanel の $ 接頭辞が必要な場合は ALIASED_MODEL_CONFIG を使用してください (例: $device_id)
model_config = STRICT_MODEL_CONFIG
ステップ 3: レジストリへの登録 (optimo_analytics/registry.py)
# 上部にインポートを追加
from optimo_analytics.schemas import MxpNewEventSchema
# _EVENT_SCHEMA_REGISTRY 辞書に追加
_EVENT_SCHEMA_REGISTRY: dict[str, type[MixpanelSuperEventPropertiesSchema]] = {
# ... 既存のエントリ ...
MixPanelEvent.NEW_EVENT_NAME: MxpNewEventSchema,
}
ステップ 4: トラッキングヘルパーの追加 (optimo_analytics/service/{domain}.py)
適切なサービスファイルを選択するか、新しいファイルを作成してください。
auth.py- 認証イベントsurvey.py- アンケートのライフサイクルイベントrisk.py- リスク計算イベントmap.py- マネージャーアクションパイプラインイベントcore.py- コア/HRIS イベント
class OptimoMixpanel{Domain}TrackHelper:
"""{Domain} イベントトラッキングのヘルパークラス。"""
@classmethod
def track_new_event(
cls,
*, # 重要: キーワード専用引数を強制する
employee_id: str,
# ... その他のパラメータ ...
) -> None:
"""
新しいイベント (svc.domain.action_name) を追跡します。
[トリガー条件を記述] するときに追跡されます。
Args:
employee_id: 文字列としての従業員 UUID
"""
try:
cls._track_new_event(
employee_id=employee_id,
# ... すべての引数を渡す ...
)
except Exception:
# Fire-and-forget: ログに記録するが、伝播しない
logger.exception(
"mixpanel_new_event_tracking_failed",
employee_id=employee_id,
)
@staticmethod
def _track_new_event(
*, 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
MixPanel Analytics Skill
When to Use This Skill
Use this Skill in the Django4Lyfe backend when working with MixPanel analytics
tracking in the optimo_analytics module:
/mixpanel-analytics:implement– to implement new MixPanel tracking events or update existing ones following established patterns (7-step checklist)./mixpanel-analytics:review– to review MixPanel implementations for correctness, PII protection, and adherence to Django4Lyfe standards.
Example Prompts
Implement Mode
- "Use
/mixpanel-analytics:implementto add a new event for tracking when a user completes their profile setup." - "Run
/mixpanel-analytics:implement svc.surveys.reminder_sentto add tracking for survey reminder notifications." - "Implement MixPanel tracking for the new HRIS CSV validation feature using
/mixpanel-analytics:implement."
Review Mode
- "Run
/mixpanel-analytics:review stagedto check my staged MixPanel changes for PII violations and pattern compliance." - "Use
/mixpanel-analytics:review branchto audit all analytics changes on this feature branch." - "Review the entire optimo_analytics module with
/mixpanel-analytics:review all."
Modes
This Skill behaves differently based on how it is invoked:
implementmode – invoked via/mixpanel-analytics:implement:- Guides implementation of new MixPanel events through 7 steps.
- Creates constants, schemas, registry entries, service methods, and tests.
- Enforces PII protection and code patterns.
reviewmode – invoked via/mixpanel-analytics:review:- Audits existing implementations for compliance.
- Checks PII protection, schema design, service patterns, and test coverage.
- Generates structured review reports with severity tags.
Environment & Context Gathering
When this Skill runs, gather context first:
# Git context
git branch --show-current
git status --porcelain
git diff --cached --name-only | grep -E "optimo_analytics|mixpanel"
# Analytics module stats
grep -c "^ [A-Z_]* = " optimo_analytics/constants.py 2>/dev/null || echo "0"
grep -c "^class Mxp" optimo_analytics/schemas.py 2>/dev/null || echo "0"
grep -c "MixPanelEvent\." optimo_analytics/registry.py 2>/dev/null || echo "0"
ls -1 optimo_analytics/service/*.py 2>/dev/null | xargs -I{} basename {} .py
Read key reference files:
optimo_analytics/AGENTS.md– module-level rules and PII guidelinesoptimo_analytics/schemas.py– existing schema patternsoptimo_analytics/service/AGENTS.md– service layer patternsoptimo_analytics/tests/AGENTS.md– test patterns
Implementation Mode
7-Step Implementation Checklist
For each new event, complete these steps in order:
Step 1: Add Event Constant (optimo_analytics/constants.py)
# Event naming convention: {prefix}.{object}.{action}[.error]
# Examples:
# - svc.surveys.survey_delivered
# - svc.map.action_plan_created
# - svc.hris_csv.upload.analysis_completed
#
# NOTE: Do NOT include "cron" in event names - use is_cron_job property instead
class MixPanelEvent:
# Add under appropriate section with comment
NEW_EVENT_NAME = "svc.domain.action_name"
Step 2: Create Schema (optimo_analytics/schemas.py)
# Schema naming: Mxp{Domain}{Action}EventSchema
# CRITICAL RULES:
# - All UUIDs MUST be strings (str, not UUID)
# - NO PII: no names, emails, phone numbers
# - organization_name IS allowed (business approved)
# - Use STRICT_MODEL_CONFIG (no aliases) or ALIASED_MODEL_CONFIG ($ aliases)
class MxpNewEventSchema(MixpanelSuperEventPropertiesSchema):
"""Properties for svc.domain.action_name event.
Tracked when [describe when this event fires].
"""
# Required fields (no defaults)
employee_id: str = Field(description="Employee UUID as string")
organization_id: str = Field(description="Organization UUID as string")
organization_name: str = Field(description="Organization name for analytics")
role: SystemRole | None = Field(description="User role")
impersonation: bool = Field(description="Is impersonated session")
# Event-specific fields
custom_field: str = Field(description="What this field represents")
# Use STRICT_MODEL_CONFIG for internal-only schemas
# Use ALIASED_MODEL_CONFIG when field names need $ prefix for MixPanel (e.g., $device_id)
model_config = STRICT_MODEL_CONFIG
Step 3: Register in Registry (optimo_analytics/registry.py)
# Add import at top
from optimo_analytics.schemas import MxpNewEventSchema
# Add to _EVENT_SCHEMA_REGISTRY dict
_EVENT_SCHEMA_REGISTRY: dict[str, type[MixpanelSuperEventPropertiesSchema]] = {
# ... existing entries ...
MixPanelEvent.NEW_EVENT_NAME: MxpNewEventSchema,
}
Step 4: Add Tracking Helper (optimo_analytics/service/{domain}.py)
Choose appropriate service file or create new one:
auth.py- Authentication eventssurvey.py- Survey lifecycle eventsrisk.py- Risk calculation eventsmap.py- Manager Action Pipeline eventscore.py- Core/HRIS events
class OptimoMixpanel{Domain}TrackHelper:
"""Helper class for {Domain} event tracking."""
@classmethod
def track_new_event(
cls,
*, # CRITICAL: Force keyword-only arguments
employee_id: str,
# ... other params ...
) -> None:
"""
Track new event (svc.domain.action_name).
Tracked when [describe trigger condition].
Args:
employee_id: Employee UUID as string
"""
try:
cls._track_new_event(
employee_id=employee_id,
# ... pass all args ...
)
except Exception:
# Fire-and-forget: log but don't propagate
logger.exception(
"mixpanel_new_event_tracking_failed",
employee_id=employee_id,
)
@staticmethod
def _track_new_event(
*,
employee_id: str,
# ... other params ...
) -> None:
"""Track new event implementation."""
emp_info = OptimoMixpanelService._fetch_required_emp_info(
employee_id=employee_id
)
properties = MxpNewEventSchema(
employee_id=employee_id,
organization_id=str(emp_info.organization.uuid),
organization_name=emp_info.organization.name,
role=emp_info.role,
impersonation=False,
# ... event-specific fields ...
)
# distinct_id fallback hierarchy:
# 1. User's UUID (primary)
# 2. org_<organization_uuid> (fallback when no user)
# 3. Context-specific: slack_<id>, apikey_<id>, webhook_<id>
distinct_id = employee_id # or f"org_{org_uuid}" if no user
OptimoMixpanelService.track_event(
distinct_id=distinct_id,
event_name=MixPanelEvent.NEW_EVENT_NAME,
properties=properties,
)
Step 5: Export from __init__.py (optimo_analytics/service/__init__.py)
# Add to imports
from optimo_analytics.service.{domain} import OptimoMixpanel{Domain}TrackHelper
# Add to __all__
__all__ = [
# ... existing ...
"OptimoMixpanel{Domain}TrackHelper",
]
Step 6: Add Tests (optimo_analytics/tests/test_{event}_event.py)
"""Tests for {Event} MixPanel tracking."""
from unittest.mock import patch
from uuid import uuid4
import pytest
from optimo_analytics.constants import MixPanelEvent
from optimo_analytics.registry import EVENT_SCHEMA_REGISTRY, is_event_registered
from optimo_analytics.schemas import MxpNewEventSchema
from optimo_analytics.service import OptimoMixpanel{Domain}TrackHelper
pytestmark = [pytest.mark.django_db]
@pytest.fixture(autouse=True)
def eager_jobs(settings):
"""Force synchronous job execution."""
settings.OPTIMO_JOBS_EAGER_MODE = True
yield
settings.OPTIMO_JOBS_EAGER_MODE = False
@pytest.fixture
def mock_mixpanel():
"""Mock MixPanel client."""
with patch("optimo_analytics.service.MixPanelFactory.get_client") as mock:
yield mock.return_value
class TestNewEventSchema:
"""Test schema validation."""
def test_schema_creation_with_valid_properties(self):
"""Schema accepts valid properties."""
schema = MxpNewEventSchema(
employee_id=str(uuid4()),
organization_id=str(uuid4()),
organization_name="Test Org",
role=SystemRole.EMPLOYEE,
impersonation=False,
)
assert schema.employee_id is not None
class TestNewEventRegistry:
"""Test registry registration."""
def test_event_is_registered(self):
"""Event should be registered in schema registry."""
assert is_event_registered(MixPanelEvent.NEW_EVENT_NAME)
assert EVENT_SCHEMA_REGISTRY.get(MixPanelEvent.NEW_EVENT_NAME) is MxpNewEventSchema
class TestNewEventTracking:
"""Test service tracking method."""
def test_tracking_calls_mixpanel(self, mock_mixpanel, optimo_employee):
"""Tracking should call MixPanel with correct properties."""
OptimoMixpanel{Domain}TrackHelper.track_new_event(
employee_id=str(optimo_employee.uuid),
)
mock_mixpanel.track.assert_called_once()
class TestNewEventNonBlocking:
"""Test fire-and-forget behavior."""
def test_exception_does_not_propagate(self):
"""Tracking exceptions should be caught and logged."""
with patch.object(
OptimoMixpanel{Domain}TrackHelper,
"_track_new_event",
side_effect=Exception("boom"),
):
# Should NOT raise
OptimoMixpanel{Domain}TrackHelper.track_new_event(
employee_id=str(uuid4()),
)
Step 7: Integrate with Business Logic
from optimo_analytics.service import OptimoMixpanel{Domain}TrackHelper
def some_business_method(self, ...):
# ... business logic ...
# Track after successful operation
OptimoMixpanel{Domain}TrackHelper.track_new_event(
employee_id=str(employee.uuid),
)
Critical Rules (DO NOT VIOLATE)
PII Protection
- NEVER send: names, emails, phone numbers, addresses
- ALLOWED: organization_name (business approved for analytics)
- ALWAYS use UUIDs as strings for identifiers
Code Patterns
- ALWAYS use keyword-only arguments (
*,in method signature) - ALWAYS wrap tracking in try-except (fire-and-forget)
- NEVER let tracking failures break business logic
- ALWAYS use structured logging with IDs only
Event Naming Convention
{prefix}.{object}.{action}[.error]
Examples:
svc.surveys.survey_deliveredsvc.surveys.survey_delivered.error(for failures)svc.map.action_plan_created
Note: Do NOT include execution context (like "cron") in event names.
Use is_cron_job property instead.
When to Use is_cron_job
NOT all background jobs need is_cron_job=True. Only set it when you need:
- API time and tracking time to align - the event
timeshould reflect the original user action, not when the CRON ran - Ordering events with same timestamp - distinguish CRON-processed events from user-triggered ones
When to set is_cron_job=True:
properties = MxpYourEventSchema(
# ... other fields ...
is_cron_job=True,
cron_execution_timestamp=datetime_to_timestamp_ms(timezone.now()),
)
Validation: If is_cron_job=True, then cron_execution_timestamp is
required (enforced by validate_cron_properties).
Schema Field Types
- UUIDs:
str(neverUUID) - Timestamps: Use
datetime_to_timestamp_ms()for MixPanel - Enums: Use
SystemRole | None, etc. - Lists:
list[str]for UUID lists
Optional Values for String Fields
NEVER override base schema fields as Optional to handle None values. Instead:
- For
strfields that might have no value, pass empty string"" - Do NOT duplicate
organization_id,organization_name,employee_id, etc. withOptional[str]types in child schemas - The base
MixpanelSuperEventPropertiesSchemaalready defines these fields - inherit them, don't redefine
BAD - Don't do this:
class MxpNewEventSchema(MixpanelSuperEventPropertiesSchema):
# WRONG: duplicating base fields as Optional
organization_id: str | None = Field(default=None, description="...")
organization_name: str | None = Field(default=None, description="...")
GOOD - Do this instead:
class MxpNewEventSchema(MixpanelSuperEventPropertiesSchema):
# Inherit organization_id, organization_name from base schema
# Pass empty string when value is not available
pass
# In service method:
properties = MxpNewEventSchema(
organization_id=str(org.uuid) if org else "",
organization_name=org.name if org else "",
# ...
)
## Post-Implementation Validations
```bash
# 1. Ruff lint and format
.bin/ruff check optimo_analytics/ --fix
.bin/ruff format optimo_analytics/
# 2. Type checking
.bin/ty check optimo_analytics/
# 3. Django checks
DJANGO_CONFIGURATION=DevApp uv run python manage.py check
# 4. Run tests
.bin/pytest optimo_analytics/tests/ -v --dc=TestLocalApp
Review Mode
Review Checklist
1. PII Protection (CRITICAL - P0)
MUST CHECK:
- [ ] No
first_name,last_name,full_name,display_namein schemas - [ ] No
email,email_address,user_emailfields - [ ] No
phone,phone_number,phone_e164fields - [ ] No
address,city,countryas free-text fields - [ ] All identifiers are UUIDs as strings (not UUID objects)
- [ ]
organization_nameis ONLY sent to MixPanel, never logged
2. Event Registration Completeness (P1)
MUST VERIFY:
- [ ] Event constant exists in
constants.pyunderMixPanelEvent - [ ] Schema class exists in
schemas.py - [ ] Event is registered in
registry.py_EVENT_SCHEMA_REGISTRY - [ ] Schema inherits from
MixpanelSuperEventPropertiesSchema
3. Schema Design (P1)
MUST VERIFY:
- [ ] All UUID fields are typed as
str, notUUID - [ ] All required fields have
Field(description="...") - [ ] Uses
STRICT_MODEL_CONFIGorALIASED_MODEL_CONFIGappropriately - [ ] Enum fields use
SystemRole | Nonepattern - [ ] Docstring describes when the event is tracked
- [ ] Base schema fields from
MixpanelSuperEventPropertiesSchemaare NOT redefined asOptional[str]- pass empty string""for missing values
4. Service Method Patterns (P1)
MUST VERIFY:
- [ ] Public method is
@classmethod - [ ] Uses keyword-only arguments (
*,after cls) - [ ] Has try-except wrapper (fire-and-forget)
- [ ] Exception handler logs with structured fields
- [ ] Private implementation is
@staticmethod
5. Test Coverage (P2)
MUST HAVE:
- [ ] Schema validation tests
- [ ] Registry registration test
- [ ] Service tracking test with
mock_mixpanel - [ ] Non-blocking test (exception doesn't propagate)
- [ ] Uses
pytestmark = [pytest.mark.django_db]
6. Naming Conventions (P2)
Event names: {prefix}.{object}.{action}[.error]
Schema names: Mxp{Domain}{Action}EventSchema
Helper names: OptimoMixpanel{Domain}TrackHelper
7. is_cron_job Usage (P2)
NOTE: Not all background jobs need is_cron_job=True. Only use when:
- API time and tracking time need to align
- Events with same timestamp need ordering
IF is_cron_job=True is used, MUST VERIFY:
- [ ]
cron_execution_timestampis provided as Unix milliseconds - [ ] Event name does NOT contain "cron"
8. Timestamp Handling (P2)
MUST VERIFY:
- [ ] Uses
datetime_to_timestamp_ms()for MixPanel timestamps - [ ] Never sends ISO 8601 strings to MixPanel
9. distinct_id Selection (P1)
distinct_id MUST strictly follow this fallback hierarchy:
- Primary: User's UUID (the authenticated user performing the action)
- Fallback 1:
org_<organization_uuid>(when no user context exists) - Fallback 2: Context-specific ID based on the entity being tracked:
- Slack workspace:
slack_<slack_workspace_id> - API key:
apikey_<api_key_id> - Webhook:
webhook_<webhook_id>
- Slack workspace:
NEVER pass organization_id directly as distinct_id - always prefix with org_.
MUST VERIFY:
- [ ] distinct_id is user's UUID when user context is available
- [ ] distinctid uses `org<uuid>` prefix when falling back to organization
- [ ] distinct_id uses appropriate prefix for context-specific fallbacks
- [ ] distinct_id is NEVER a raw organization_id without prefix
10. Export Completeness (P3)
MUST VERIFY:
- [ ] New helper classes exported in
service/__init__.py - [ ] Added to
__all__list
Automated Checks
# 1. PII Scan
grep -rn "first_name\|last_name\|email\|phone\|address" optimo_analytics/schemas.py
# 2. UUID Type Check
grep -rn ": UUID" optimo_analytics/schemas.py
# 3. Registration Check
for event in $(grep "^ [A-Z_]* = " optimo_analytics/constants.py | cut -d'=' -f1 | tr -d ' '); do
grep -q "$event" optimo_analytics/registry.py || echo "UNREGISTERED: $event"
done
# 4. Keyword-only Check
grep -rn "def track_" optimo_analytics/service/*.py | while read line; do
file=$(echo $line | cut -d: -f1)
linenum=$(echo $line | cut -d: -f2)
if ! sed -n "$((linenum+1)),$((linenum+5))p" "$file" | grep -q '\*,'; then
echo "MISSING *,: $line"
fi
done
Review Output Format
# MixPanel Implementation Review
**Branch**: {branch}
**Scope**: {scope}
**Date**: {date}
## Summary
| Category | Status | Issues |
|----------|--------|--------|
| PII Protection | PASS/FAIL | {count} |
| Event Registration | PASS/FAIL | {count} |
| Schema Design | PASS/FAIL | {count} |
| Service Patterns | PASS/FAIL | {count} |
| Test Coverage | PASS/FAIL | {count} |
## Issues Found
### [P0] CRITICAL - {title}
**File**: `path:line`
**Issue**: Description
**Fix**: How to fix
### [P1] HIGH - {title}
...
## Recommendations
1. ...
2. ...
Severity Tags
[P0]CRITICAL – PII violations, security issues; must fix before merge[P1]HIGH – Missing registrations, pattern violations; strongly recommended[P2]MEDIUM – Test coverage gaps, naming issues; should fix[P3]LOW – Minor improvements; nice to have
Post-Review Actions
After review, if issues found:
- Create todo list of fixes
- Apply fixes using
/mixpanel-analytics:implement - Re-run review to verify
If review passes:
- Run
/monty-code-review:code-reviewfor general code quality - Run
/backend-atomic-commit:pre-commitfor commit preparation - Run tests:
.bin/pytest optimo_analytics/tests/ -v --dc=TestLocalApp
Compatibility Notes
This skill is designed to work with both Claude Code and OpenAI Codex.
For Codex users:
- Install via skill-installer with
--repo DiversioTeam/agent-skills-marketplace --path plugins/mixpanel-analytics/skills/mixpanel-analytics. - Use
$skill mixpanel-analyticsto invoke.
For Claude Code users:
- Install via
/plugin install mixpanel-analytics@diversiotech. - Use
/mixpanel-analytics:implementor/mixpanel-analytics:reviewto invoke.