AgentSkillsCN

clay-data-handling

实施Clay PII处理、数据保留与GDPR/CCPA合规模式。 当处理敏感数据、实施数据脱敏、配置保留策略、 或确保Clay集成的隐私法规合规时使用。 可通过“Clay数据”、“Clay PII”、 “Clay GDPR”、“Clay数据保留”、“Clay隐私”、“Clay CCPA”等短语触发。

SKILL.md
--- frontmatter
name: clay-data-handling
description: |
  Implement Clay PII handling, data retention, and GDPR/CCPA compliance patterns.
  Use when handling sensitive data, implementing data redaction, configuring retention policies,
  or ensuring compliance with privacy regulations for Clay integrations.
  Trigger with phrases like "clay data", "clay PII",
  "clay GDPR", "clay data retention", "clay privacy", "clay CCPA".
allowed-tools: Read, Write, Edit
version: 1.0.0
license: MIT
author: Jeremy Longshore <jeremy@intentsolutions.io>

Clay Data Handling

Overview

Handle sensitive data correctly when integrating with Clay.

Prerequisites

  • Understanding of GDPR/CCPA requirements
  • Clay SDK with data export capabilities
  • Database for audit logging
  • Scheduled job infrastructure for cleanup

Data Classification

CategoryExamplesHandling
PIIEmail, name, phoneEncrypt, minimize
SensitiveAPI keys, tokensNever log, rotate
BusinessUsage metricsAggregate when possible
PublicProduct namesStandard handling

PII Detection

typescript
const PII_PATTERNS = [
  { type: 'email', regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g },
  { type: 'phone', regex: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g },
  { type: 'ssn', regex: /\b\d{3}-\d{2}-\d{4}\b/g },
  { type: 'credit_card', regex: /\b\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}\b/g },
];

function detectPII(text: string): { type: string; match: string }[] {
  const findings: { type: string; match: string }[] = [];

  for (const pattern of PII_PATTERNS) {
    const matches = text.matchAll(pattern.regex);
    for (const match of matches) {
      findings.push({ type: pattern.type, match: match[0] });
    }
  }

  return findings;
}

Data Redaction

typescript
function redactPII(data: Record<string, any>): Record<string, any> {
  const sensitiveFields = ['email', 'phone', 'ssn', 'password', 'apiKey'];
  const redacted = { ...data };

  for (const field of sensitiveFields) {
    if (redacted[field]) {
      redacted[field] = '[REDACTED]';
    }
  }

  return redacted;
}

// Use in logging
console.log('Clay request:', redactPII(requestData));

Data Retention Policy

Retention Periods

Data TypeRetentionReason
API logs30 daysDebugging
Error logs90 daysRoot cause analysis
Audit logs7 yearsCompliance
PIIUntil deletion requestGDPR/CCPA

Automatic Cleanup

typescript
async function cleanupClayData(retentionDays: number): Promise<void> {
  const cutoff = new Date();
  cutoff.setDate(cutoff.getDate() - retentionDays);

  await db.clayLogs.deleteMany({
    createdAt: { $lt: cutoff },
    type: { $nin: ['audit', 'compliance'] },
  });
}

// Schedule daily cleanup
cron.schedule('0 3 * * *', () => cleanupClayData(30));

GDPR/CCPA Compliance

Data Subject Access Request (DSAR)

typescript
async function exportUserData(userId: string): Promise<DataExport> {
  const clayData = await clayClient.getUserData(userId);

  return {
    source: 'Clay',
    exportedAt: new Date().toISOString(),
    data: {
      profile: clayData.profile,
      activities: clayData.activities,
      // Include all user-related data
    },
  };
}

Right to Deletion

typescript
async function deleteUserData(userId: string): Promise<DeletionResult> {
  // 1. Delete from Clay
  await clayClient.deleteUser(userId);

  // 2. Delete local copies
  await db.clayUserCache.deleteMany({ userId });

  // 3. Audit log (required to keep)
  await auditLog.record({
    action: 'GDPR_DELETION',
    userId,
    service: 'clay',
    timestamp: new Date(),
  });

  return { success: true, deletedAt: new Date() };
}

Data Minimization

typescript
// Only request needed fields
const user = await clayClient.getUser(userId, {
  fields: ['id', 'name'], // Not email, phone, address
});

// Don't store unnecessary data
const cacheData = {
  id: user.id,
  name: user.name,
  // Omit sensitive fields
};

Instructions

Step 1: Classify Data

Categorize all Clay data by sensitivity level.

Step 2: Implement PII Detection

Add regex patterns to detect sensitive data in logs.

Step 3: Configure Redaction

Apply redaction to sensitive fields before logging.

Step 4: Set Up Retention

Configure automatic cleanup with appropriate retention periods.

Output

  • Data classification documented
  • PII detection implemented
  • Redaction in logging active
  • Retention policy enforced

Error Handling

IssueCauseSolution
PII in logsMissing redactionWrap logging with redact
Deletion failedData lockedCheck dependencies
Export incompleteTimeoutIncrease batch size
Audit gapMissing entriesReview log pipeline

Examples

Quick PII Scan

typescript
const findings = detectPII(JSON.stringify(userData));
if (findings.length > 0) {
  console.warn(`PII detected: ${findings.map(f => f.type).join(', ')}`);
}

Redact Before Logging

typescript
const safeData = redactPII(apiResponse);
logger.info('Clay response:', safeData);

GDPR Data Export

typescript
const userExport = await exportUserData('user-123');
await sendToUser(userExport);

Resources

Next Steps

For enterprise access control, see clay-enterprise-rbac.