[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70GDSA1QP8SVG3AVN5P2D7S":3,"skill-same:01M70GDSA1QP8SVG3AVN5P2D7S":81},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":65,"updatedAt":66,"install":67,"resources":80},"01M70GDSA1QP8SVG3AVN5P2D7S","gdpr-data-handling",null,"Implement GDPR-compliant data handling with consent management, data subject rights, and privacy by design. Use when building systems that process EU personal data, implementing privacy controls, or conducting GDPR compliance reviews.","shengdabai\u002FTony-Claude-Code-Skills","shengdabai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F116417419?v=4","01M70F6D2WY5PQV5A92BKYJQEW","Tony Sheng","01M70F6D3GAAAYZ5H4CC1G8VXM",3,"MIT","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002F_collections\u002Fplugins\u002Fhr-legal-compliance\u002Fskills\u002Fgdpr-data-handling\u002FSKILL.md",[18,23,28],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",{"categoryNo":29,"categoryName":30,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000037","律师与法务",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"data","gdpr","gdpr data handling","privacy","systems","process","compliance","rights","with","implement","use","controls","consent management","privacy by design","personal","gdpr compliance","when","design","implementing","reviews","2026-11-10 10:12:30",false,"---\nname: gdpr-data-handling\ndescription: Implement GDPR-compliant data handling with consent management, data subject rights, and privacy by design. Use when building systems that process EU personal data, implementing privacy controls, or conducting GDPR compliance reviews.\n---\n\n# GDPR Data Handling\n\nPractical implementation guide for GDPR-compliant data processing, consent management, and privacy controls.\n\n## When to Use This Skill\n\n- Building systems that process EU personal data\n- Implementing consent management\n- Handling data subject requests (DSRs)\n- Conducting GDPR compliance reviews\n- Designing privacy-first architectures\n- Creating data processing agreements\n\n## Core Concepts\n\n### 1. Personal Data Categories\n\n| Category | Examples | Protection Level |\n|----------|----------|------------------|\n| **Basic** | Name, email, phone | Standard |\n| **Sensitive (Art. 9)** | Health, religion, ethnicity | Explicit consent |\n| **Criminal (Art. 10)** | Convictions, offenses | Official authority |\n| **Children's** | Under 16 data | Parental consent |\n\n### 2. Legal Bases for Processing\n\n```\nArticle 6 - Lawful Bases:\n├── Consent: Freely given, specific, informed\n├── Contract: Necessary for contract performance\n├── Legal Obligation: Required by law\n├── Vital Interests: Protecting someone's life\n├── Public Interest: Official functions\n└── Legitimate Interest: Balanced against rights\n```\n\n### 3. Data Subject Rights\n\n```\nRight to Access (Art. 15)      ─┐\nRight to Rectification (Art. 16) │\nRight to Erasure (Art. 17)       │ Must respond\nRight to Restrict (Art. 18)      │ within 1 month\nRight to Portability (Art. 20)   │\nRight to Object (Art. 21)       ─┘\n```\n\n## Implementation Patterns\n\n### Pattern 1: Consent Management\n\n```javascript\n\u002F\u002F Consent data model\nconst consentSchema = {\n  userId: String,\n  consents: [{\n    purpose: String,         \u002F\u002F 'marketing', 'analytics', etc.\n    granted: Boolean,\n    timestamp: Date,\n    source: String,          \u002F\u002F 'web_form', 'api', etc.\n    version: String,         \u002F\u002F Privacy policy version\n    ipAddress: String,       \u002F\u002F For proof\n    userAgent: String        \u002F\u002F For proof\n  }],\n  auditLog: [{\n    action: String,          \u002F\u002F 'granted', 'withdrawn', 'updated'\n    purpose: String,\n    timestamp: Date,\n    source: String\n  }]\n};\n\n\u002F\u002F Consent service\nclass ConsentManager {\n  async recordConsent(userId, purpose, granted, metadata) {\n    const consent = {\n      purpose,\n      granted,\n      timestamp: new Date(),\n      source: metadata.source,\n      version: await this.getCurrentPolicyVersion(),\n      ipAddress: metadata.ipAddress,\n      userAgent: metadata.userAgent\n    };\n\n    \u002F\u002F Store consent\n    await this.db.consents.updateOne(\n      { userId },\n      {\n        $push: {\n          consents: consent,\n          auditLog: {\n            action: granted ? 'granted' : 'withdrawn',\n            purpose,\n            timestamp: consent.timestamp,\n            source: metadata.source\n          }\n        }\n      },\n      { upsert: true }\n    );\n\n    \u002F\u002F Emit event for downstream systems\n    await this.eventBus.emit('consent.changed', {\n      userId,\n      purpose,\n      granted,\n      timestamp: consent.timestamp\n    });\n  }\n\n  async hasConsent(userId, purpose) {\n    const record = await this.db.consents.findOne({ userId });\n    if (!record) return false;\n\n    const latestConsent = record.consents\n      .filter(c => c.purpose === purpose)\n      .sort((a, b) => b.timestamp - a.timestamp)[0];\n\n    return latestConsent?.granted === true;\n  }\n\n  async getConsentHistory(userId) {\n    const record = await this.db.consents.findOne({ userId });\n    return record?.auditLog || [];\n  }\n}\n```\n\n```html\n\u003C!-- GDPR-compliant consent UI -->\n\u003Cdiv class=\"consent-banner\" role=\"dialog\" aria-labelledby=\"consent-title\">\n  \u003Ch2 id=\"consent-title\">Cookie Preferences\u003C\u002Fh2>\n\n  \u003Cp>We use cookies to improve your experience. Select your preferences below.\u003C\u002Fp>\n\n  \u003Cform id=\"consent-form\">\n    \u003C!-- Necessary - always on, no consent needed -->\n    \u003Cdiv class=\"consent-category\">\n      \u003Cinput type=\"checkbox\" id=\"necessary\" checked disabled>\n      \u003Clabel for=\"necessary\">\n        \u003Cstrong>Necessary\u003C\u002Fstrong>\n        \u003Cspan>Required for the website to function. Cannot be disabled.\u003C\u002Fspan>\n      \u003C\u002Flabel>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Analytics - requires consent -->\n    \u003Cdiv class=\"consent-category\">\n      \u003Cinput type=\"checkbox\" id=\"analytics\" name=\"analytics\">\n      \u003Clabel for=\"analytics\">\n        \u003Cstrong>Analytics\u003C\u002Fstrong>\n        \u003Cspan>Help us understand how you use our site.\u003C\u002Fspan>\n      \u003C\u002Flabel>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Marketing - requires consent -->\n    \u003Cdiv class=\"consent-category\">\n      \u003Cinput type=\"checkbox\" id=\"marketing\" name=\"marketing\">\n      \u003Clabel for=\"marketing\">\n        \u003Cstrong>Marketing\u003C\u002Fstrong>\n        \u003Cspan>Personalized ads based on your interests.\u003C\u002Fspan>\n      \u003C\u002Flabel>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"consent-actions\">\n      \u003Cbutton type=\"button\" id=\"accept-all\">Accept All\u003C\u002Fbutton>\n      \u003Cbutton type=\"button\" id=\"reject-all\">Reject All\u003C\u002Fbutton>\n      \u003Cbutton type=\"submit\">Save Preferences\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\n    \u003Cp class=\"consent-links\">\n      \u003Ca href=\"\u002Fprivacy-policy\">Privacy Policy\u003C\u002Fa> |\n      \u003Ca href=\"\u002Fcookie-policy\">Cookie Policy\u003C\u002Fa>\n    \u003C\u002Fp>\n  \u003C\u002Fform>\n\u003C\u002Fdiv>\n```\n\n### Pattern 2: Data Subject Access Request (DSAR)\n\n```python\nfrom datetime import datetime, timedelta\nfrom typing import Dict, List, Optional\nimport json\n\nclass DSARHandler:\n    \"\"\"Handle Data Subject Access Requests.\"\"\"\n\n    RESPONSE_DEADLINE_DAYS = 30\n    EXTENSION_ALLOWED_DAYS = 60  # For complex requests\n\n    def __init__(self, data_sources: List['DataSource']):\n        self.data_sources = data_sources\n\n    async def submit_request(\n        self,\n        request_type: str,  # 'access', 'erasure', 'rectification', 'portability'\n        user_id: str,\n        verified: bool,\n        details: Optional[Dict] = None\n    ) -> str:\n        \"\"\"Submit a new DSAR.\"\"\"\n        request = {\n            'id': self.generate_request_id(),\n            'type': request_type,\n            'user_id': user_id,\n            'status': 'pending_verification' if not verified else 'processing',\n            'submitted_at': datetime.utcnow(),\n            'deadline': datetime.utcnow() + timedelta(days=self.RESPONSE_DEADLINE_DAYS),\n            'details': details or {},\n            'audit_log': [{\n                'action': 'submitted',\n                'timestamp': datetime.utcnow(),\n                'details': 'Request received'\n            }]\n        }\n\n        await self.db.dsar_requests.insert_one(request)\n        await self.notify_dpo(request)\n\n        return request['id']\n\n    async def process_access_request(self, request_id: str) -> Dict:\n        \"\"\"Process a data access request.\"\"\"\n        request = await self.get_request(request_id)\n\n        if request['type'] != 'access':\n            raise ValueError(\"Not an access request\")\n\n        # Collect data from all sources\n        user_data = {}\n        for source in self.data_sources:\n            try:\n                data = await source.get_user_data(request['user_id'])\n                user_data[source.name] = data\n            except Exception as e:\n                user_data[source.name] = {'error': str(e)}\n\n        # Format response\n        response = {\n            'request_id': request_id,\n            'generated_at': datetime.utcnow().isoformat(),\n            'data_categories': list(user_data.keys()),\n            'data': user_data,\n            'retention_info': await self.get_retention_info(),\n            'processing_purposes': await self.get_processing_purposes(),\n            'third_party_recipients': await self.get_recipients()\n        }\n\n        # Update request status\n        await self.update_request(request_id, 'completed', response)\n\n        return response\n\n    async def process_erasure_request(self, request_id: str) -> Dict:\n        \"\"\"Process a right to erasure request.\"\"\"\n        request = await self.get_request(request_id)\n\n        if request['type'] != 'erasure':\n            raise ValueError(\"Not an erasure request\")\n\n        results = {}\n        exceptions = []\n\n        for source in self.data_sources:\n            try:\n                # Check for legal exceptions\n                can_delete, reason = await source.can_delete(request['user_id'])\n\n                if can_delete:\n                    await source.delete_user_data(request['user_id'])\n                    results[source.name] = 'deleted'\n                else:\n                    exceptions.append({\n                        'source': source.name,\n                        'reason': reason  # e.g., 'legal retention requirement'\n                    })\n                    results[source.name] = f'retained: {reason}'\n            except Exception as e:\n                results[source.name] = f'error: {str(e)}'\n\n        response = {\n            'request_id': request_id,\n            'completed_at': datetime.utcnow().isoformat(),\n            'results': results,\n            'exceptions': exceptions\n        }\n\n        await self.update_request(request_id, 'completed', response)\n\n        return response\n\n    async def process_portability_request(self, request_id: str) -> bytes:\n        \"\"\"Generate portable data export.\"\"\"\n        request = await self.get_request(request_id)\n        user_data = await self.process_access_request(request_id)\n\n        # Convert to machine-readable format (JSON)\n        portable_data = {\n            'export_date': datetime.utcnow().isoformat(),\n            'format_version': '1.0',\n            'data': user_data['data']\n        }\n\n        return json.dumps(portable_data, indent=2, default=str).encode()\n```\n\n### Pattern 3: Data Retention\n\n```python\nfrom datetime import datetime, timedelta\nfrom enum import Enum\n\nclass RetentionBasis(Enum):\n    CONSENT = \"consent\"\n    CONTRACT = \"contract\"\n    LEGAL_OBLIGATION = \"legal_obligation\"\n    LEGITIMATE_INTEREST = \"legitimate_interest\"\n\nclass DataRetentionPolicy:\n    \"\"\"Define and enforce data retention policies.\"\"\"\n\n    POLICIES = {\n        'user_account': {\n            'retention_period_days': 365 * 3,  # 3 years after last activity\n            'basis': RetentionBasis.CONTRACT,\n            'trigger': 'last_activity_date',\n            'archive_before_delete': True\n        },\n        'transaction_records': {\n            'retention_period_days': 365 * 7,  # 7 years for tax\n            'basis': RetentionBasis.LEGAL_OBLIGATION,\n            'trigger': 'transaction_date',\n            'archive_before_delete': True,\n            'legal_reference': 'Tax regulations require 7 year retention'\n        },\n        'marketing_consent': {\n            'retention_period_days': 365 * 2,  # 2 years\n            'basis': RetentionBasis.CONSENT,\n            'trigger': 'consent_date',\n            'archive_before_delete': False\n        },\n        'support_tickets': {\n            'retention_period_days': 365 * 2,\n            'basis': RetentionBasis.LEGITIMATE_INTEREST,\n            'trigger': 'ticket_closed_date',\n            'archive_before_delete': True\n        },\n        'analytics_data': {\n            'retention_period_days': 365,  # 1 year\n            'basis': RetentionBasis.CONSENT,\n            'trigger': 'collection_date',\n            'archive_before_delete': False,\n            'anonymize_instead': True\n        }\n    }\n\n    async def apply_retention_policies(self):\n        \"\"\"Run retention policy enforcement.\"\"\"\n        for data_type, policy in self.POLICIES.items():\n            cutoff_date = datetime.utcnow() - timedelta(\n                days=policy['retention_period_days']\n            )\n\n            if policy.get('anonymize_instead'):\n                await self.anonymize_old_data(data_type, cutoff_date)\n            else:\n                if policy.get('archive_before_delete'):\n                    await self.archive_data(data_type, cutoff_date)\n                await self.delete_old_data(data_type, cutoff_date)\n\n            await self.log_retention_action(data_type, cutoff_date)\n\n    async def anonymize_old_data(self, data_type: str, before_date: datetime):\n        \"\"\"Anonymize data instead of deleting.\"\"\"\n        # Example: Replace identifying fields with hashes\n        if data_type == 'analytics_data':\n            await self.db.analytics.update_many(\n                {'collection_date': {'$lt': before_date}},\n                {'$set': {\n                    'user_id': None,\n                    'ip_address': None,\n                    'device_id': None,\n                    'anonymized': True,\n                    'anonymized_date': datetime.utcnow()\n                }}\n            )\n```\n\n### Pattern 4: Privacy by Design\n\n```python\nclass PrivacyFirstDataModel:\n    \"\"\"Example of privacy-by-design data model.\"\"\"\n\n    # Separate PII from behavioral data\n    user_profile_schema = {\n        'user_id': str,  # UUID, not sequential\n        'email_hash': str,  # Hashed for lookups\n        'created_at': datetime,\n        # Minimal data collection\n        'preferences': {\n            'language': str,\n            'timezone': str\n        }\n    }\n\n    # Encrypted at rest\n    user_pii_schema = {\n        'user_id': str,\n        'email': str,  # Encrypted\n        'name': str,   # Encrypted\n        'phone': str,  # Encrypted (optional)\n        'address': dict,  # Encrypted (optional)\n        'encryption_key_id': str\n    }\n\n    # Pseudonymized behavioral data\n    analytics_schema = {\n        'session_id': str,  # Not linked to user_id\n        'pseudonym_id': str,  # Rotating pseudonym\n        'events': list,\n        'device_category': str,  # Generalized, not specific\n        'country': str,  # Not city-level\n    }\n\nclass DataMinimization:\n    \"\"\"Implement data minimization principles.\"\"\"\n\n    @staticmethod\n    def collect_only_needed(form_data: dict, purpose: str) -> dict:\n        \"\"\"Filter form data to only fields needed for purpose.\"\"\"\n        REQUIRED_FIELDS = {\n            'account_creation': ['email', 'password'],\n            'newsletter': ['email'],\n            'purchase': ['email', 'name', 'address', 'payment'],\n            'support': ['email', 'message']\n        }\n\n        allowed = REQUIRED_FIELDS.get(purpose, [])\n        return {k: v for k, v in form_data.items() if k in allowed}\n\n    @staticmethod\n    def generalize_location(ip_address: str) -> str:\n        \"\"\"Generalize IP to country level only.\"\"\"\n        import geoip2.database\n        reader = geoip2.database.Reader('GeoLite2-Country.mmdb')\n        try:\n            response = reader.country(ip_address)\n            return response.country.iso_code\n        except:\n            return 'UNKNOWN'\n```\n\n### Pattern 5: Breach Notification\n\n```python\nfrom datetime import datetime\nfrom enum import Enum\n\nclass BreachSeverity(Enum):\n    LOW = \"low\"\n    MEDIUM = \"medium\"\n    HIGH = \"high\"\n    CRITICAL = \"critical\"\n\nclass BreachNotificationHandler:\n    \"\"\"Handle GDPR breach notification requirements.\"\"\"\n\n    AUTHORITY_NOTIFICATION_HOURS = 72\n    AFFECTED_NOTIFICATION_REQUIRED_SEVERITY = BreachSeverity.HIGH\n\n    async def report_breach(\n        self,\n        description: str,\n        data_types: List[str],\n        affected_count: int,\n        severity: BreachSeverity\n    ) -> dict:\n        \"\"\"Report and handle a data breach.\"\"\"\n        breach = {\n            'id': self.generate_breach_id(),\n            'reported_at': datetime.utcnow(),\n            'description': description,\n            'data_types_affected': data_types,\n            'affected_individuals_count': affected_count,\n            'severity': severity.value,\n            'status': 'investigating',\n            'timeline': [{\n                'event': 'breach_reported',\n                'timestamp': datetime.utcnow(),\n                'details': description\n            }]\n        }\n\n        await self.db.breaches.insert_one(breach)\n\n        # Immediate notifications\n        await self.notify_dpo(breach)\n        await self.notify_security_team(breach)\n\n        # Authority notification required within 72 hours\n        if self.requires_authority_notification(severity, data_types):\n            breach['authority_notification_deadline'] = (\n                datetime.utcnow() + timedelta(hours=self.AUTHORITY_NOTIFICATION_HOURS)\n            )\n            await self.schedule_authority_notification(breach)\n\n        # Affected individuals notification\n        if severity.value in [BreachSeverity.HIGH.value, BreachSeverity.CRITICAL.value]:\n            await self.schedule_individual_notifications(breach)\n\n        return breach\n\n    def requires_authority_notification(\n        self,\n        severity: BreachSeverity,\n        data_types: List[str]\n    ) -> bool:\n        \"\"\"Determine if supervisory authority must be notified.\"\"\"\n        # Always notify for sensitive data\n        sensitive_types = ['health', 'financial', 'credentials', 'biometric']\n        if any(t in sensitive_types for t in data_types):\n            return True\n\n        # Notify for medium+ severity\n        return severity in [BreachSeverity.MEDIUM, BreachSeverity.HIGH, BreachSeverity.CRITICAL]\n\n    async def generate_authority_report(self, breach_id: str) -> dict:\n        \"\"\"Generate report for supervisory authority.\"\"\"\n        breach = await self.get_breach(breach_id)\n\n        return {\n            'organization': {\n                'name': self.config.org_name,\n                'contact': self.config.dpo_contact,\n                'registration': self.config.registration_number\n            },\n            'breach': {\n                'nature': breach['description'],\n                'categories_affected': breach['data_types_affected'],\n                'approximate_number_affected': breach['affected_individuals_count'],\n                'likely_consequences': self.assess_consequences(breach),\n                'measures_taken': await self.get_remediation_measures(breach_id),\n                'measures_proposed': await self.get_proposed_measures(breach_id)\n            },\n            'timeline': breach['timeline'],\n            'submitted_at': datetime.utcnow().isoformat()\n        }\n```\n\n## Compliance Checklist\n\n```markdown\n## GDPR Implementation Checklist\n\n### Legal Basis\n- [ ] Documented legal basis for each processing activity\n- [ ] Consent mechanisms meet GDPR requirements\n- [ ] Legitimate interest assessments completed\n\n### Transparency\n- [ ] Privacy policy is clear and accessible\n- [ ] Processing purposes clearly stated\n- [ ] Data retention periods documented\n\n### Data Subject Rights\n- [ ] Access request process implemented\n- [ ] Erasure request process implemented\n- [ ] Portability export available\n- [ ] Rectification process available\n- [ ] Response within 30-day deadline\n\n### Security\n- [ ] Encryption at rest implemented\n- [ ] Encryption in transit (TLS)\n- [ ] Access controls in place\n- [ ] Audit logging enabled\n\n### Breach Response\n- [ ] Breach detection mechanisms\n- [ ] 72-hour notification process\n- [ ] Breach documentation system\n\n### Documentation\n- [ ] Records of processing activities (Art. 30)\n- [ ] Data protection impact assessments\n- [ ] Data processing agreements with vendors\n```\n\n## Best Practices\n\n### Do's\n- **Minimize data collection** - Only collect what's needed\n- **Document everything** - Processing activities, legal bases\n- **Encrypt PII** - At rest and in transit\n- **Implement access controls** - Need-to-know basis\n- **Regular audits** - Verify compliance continuously\n\n### Don'ts\n- **Don't pre-check consent boxes** - Must be opt-in\n- **Don't bundle consent** - Separate purposes separately\n- **Don't retain indefinitely** - Define and enforce retention\n- **Don't ignore DSARs** - 30-day response required\n- **Don't transfer without safeguards** - SCCs or adequacy decisions\n\n## Resources\n\n- [GDPR Full Text](https:\u002F\u002Fgdpr-info.eu\u002F)\n- [ICO Guidance](https:\u002F\u002Fico.org.uk\u002Ffor-organisations\u002Fguide-to-data-protection\u002Fguide-to-the-general-data-protection-regulation-gdpr\u002F)\n- [EDPB Guidelines](https:\u002F\u002Fedpb.europa.eu\u002Four-work-tools\u002Fgeneral-guidance\u002Fgdpr-guidelines-recommendations-best-practices_en)\n","# GDPR Data Handling\n\nPractical implementation guide for GDPR-compliant data processing, consent management, and privacy controls.\n\n## When to Use This Skill\n\n- Building systems that process EU personal data\n- Implementing consent management\n- Handling data subject requests (DSRs)\n- Conducting GDPR compliance reviews\n- Designing privacy-first architectures\n- Creating data processing agreements\n\n## Core Concepts\n\n### 1. Personal Data Categories\n\n| Category | Examples | Protection Level |\n|----------|----------|------------------|\n| **Basic** | Name, email, phone | Standard |\n| **Sensitive (Art. 9)** | Health, religion, ethnicity | Explicit consent |\n| **Criminal (Art. 10)** | Convictions, offenses | Official authority |\n| **Children's** | Under 16 data | Parental consent |\n\n### 2. Legal Bases for Processing\n\n```\nArticle 6 - Lawful Bases:\n├── Consent: Freely given, specific, informed\n├── Contract: Necessary for contract performance\n├── Legal Obligation: Required by law\n├── Vital Interests: Protecting someone's life\n├── Public Interest: Official functions\n└── Legitimate Interest: Balanced against rights\n```\n\n### 3. Data Subject Rights\n\n```\nRight to Access (Art. 15)      ─┐\nRight to Rectification (Art. 16) │\nRight to Erasure (Art. 17)       │ Must respond\nRight to Restrict (Art. 18)      │ within 1 month\nRight to Portability (Art. 20)   │\nRight to Object (Art. 21)       ─┘\n```\n\n## Implementation Patterns\n\n### Pattern 1: Consent Management\n\n```javascript\n\u002F\u002F Consent data model\nconst consentSchema = {\n  userId: String,\n  consents: [{\n    purpose: String,         \u002F\u002F 'marketing', 'analytics', etc.\n    granted: Boolean,\n    timestamp: Date,\n    source: String,          \u002F\u002F 'web_form', 'api', etc.\n    version: String,         \u002F\u002F Privacy policy version\n    ipAddress: String,       \u002F\u002F For proof\n    userAgent: String        \u002F\u002F For proof\n  }],\n  auditLog: [{\n    action: String,          \u002F\u002F 'granted', 'withdrawn', 'updated'\n    purpose: String,\n    timestamp: Date,\n    source: String\n  }]\n};\n\n\u002F\u002F Consent service\nclass ConsentManager {\n  async recordConsent(userId, purpose, granted, metadata) {\n    const consent = {\n      purpose,\n      granted,\n      timestamp: new Date(),\n      source: metadata.source,\n      version: await this.getCurrentPolicyVersion(),\n      ipAddress: metadata.ipAddress,\n      userAgent: metadata.userAgent\n    };\n\n    \u002F\u002F Store consent\n    await this.db.consents.updateOne(\n      { userId },\n      {\n        $push: {\n          consents: consent,\n          auditLog: {\n            action: granted ? 'granted' : 'withdrawn',\n            purpose,\n            timestamp: consent.timestamp,\n            source: metadata.source\n          }\n        }\n      },\n      { upsert: true }\n    );\n\n    \u002F\u002F Emit event for downstream systems\n    await this.eventBus.emit('consent.changed', {\n      userId,\n      purpose,\n      granted,\n      timestamp: consent.timestamp\n    });\n  }\n\n  async hasConsent(userId, purpose) {\n    const record = await this.db.consents.findOne({ userId });\n    if (!record) return false;\n\n    const latestConsent = record.consents\n      .filter(c => c.purpose === purpose)\n      .sort((a, b) => b.timestamp - a.timestamp)[0];\n\n    return latestConsent?.granted === true;\n  }\n\n  async getConsentHistory(userId) {\n    const record = await this.db.consents.findOne({ userId });\n    return record?.auditLog || [];\n  }\n}\n```\n\n```html\n\u003C!-- GDPR-compliant consent UI -->\n\u003Cdiv class=\"consent-banner\" role=\"dialog\" aria-labelledby=\"consent-title\">\n  \u003Ch2 id=\"consent-title\">Cookie Preferences\u003C\u002Fh2>\n\n  \u003Cp>We use cookies to improve your experience. Select your preferences below.\u003C\u002Fp>\n\n  \u003Cform id=\"consent-form\">\n    \u003C!-- Necessary - always on, no consent needed -->\n    \u003Cdiv class=\"consent-category\">\n      \u003Cinput type=\"checkbox\" id=\"necessary\" checked disabled>\n      \u003Clabel for=\"necessary\">\n        \u003Cstrong>Necessary\u003C\u002Fstrong>\n        \u003Cspan>Required for the website to function. Cannot be disabled.\u003C\u002Fspan>\n      \u003C\u002Flabel>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Analytics - requires consent -->\n    \u003Cdiv class=\"consent-category\">\n      \u003Cinput type=\"checkbox\" id=\"analytics\" name=\"analytics\">\n      \u003Clabel for=\"analytics\">\n        \u003Cstrong>Analytics\u003C\u002Fstrong>\n        \u003Cspan>Help us understand how you use our site.\u003C\u002Fspan>\n      \u003C\u002Flabel>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Marketing - requires consent -->\n    \u003Cdiv class=\"consent-category\">\n      \u003Cinput type=\"checkbox\" id=\"marketing\" name=\"marketing\">\n      \u003Clabel for=\"marketing\">\n        \u003Cstrong>Marketing\u003C\u002Fstrong>\n        \u003Cspan>Personalized ads based on your interests.\u003C\u002Fspan>\n      \u003C\u002Flabel>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"consent-actions\">\n      \u003Cbutton type=\"button\" id=\"accept-all\">Accept All\u003C\u002Fbutton>\n      \u003Cbutton type=\"button\" id=\"reject-all\">Reject All\u003C\u002Fbutton>\n      \u003Cbutton type=\"submit\">Save Preferences\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\n    \u003Cp class=\"consent-links\">\n      \u003Ca href=\"\u002Fprivacy-policy\">Privacy Policy\u003C\u002Fa> |\n      \u003Ca href=\"\u002Fcookie-policy\">Cookie Policy\u003C\u002Fa>\n    \u003C\u002Fp>\n  \u003C\u002Fform>\n\u003C\u002Fdiv>\n```\n\n### Pattern 2: Data Subject Access Request (DSAR)\n\n```python\nfrom datetime import datetime, timedelta\nfrom typing import Dict, List, Optional\nimport json\n\nclass DSARHandler:\n    \"\"\"Handle Data Subject Access Requests.\"\"\"\n\n    RESPONSE_DEADLINE_DAYS = 30\n    EXTENSION_ALLOWED_DAYS = 60  # For complex requests\n\n    def __init__(self, data_sources: List['DataSource']):\n        self.data_sources = data_sources\n\n    async def submit_request(\n        self,\n        request_type: str,  # 'access', 'erasure', 'rectification', 'portability'\n        user_id: str,\n        verified: bool,\n        details: Optional[Dict] = None\n    ) -> str:\n        \"\"\"Submit a new DSAR.\"\"\"\n        request = {\n            'id': self.generate_request_id(),\n            'type': request_type,\n            'user_id': user_id,\n            'status': 'pending_verification' if not verified else 'processing',\n            'submitted_at': datetime.utcnow(),\n            'deadline': datetime.utcnow() + timedelta(days=self.RESPONSE_DEADLINE_DAYS),\n            'details': details or {},\n            'audit_log': [{\n                'action': 'submitted',\n                'timestamp': datetime.utcnow(),\n                'details': 'Request received'\n            }]\n        }\n\n        await self.db.dsar_requests.insert_one(request)\n        await self.notify_dpo(request)\n\n        return request['id']\n\n    async def process_access_request(self, request_id: str) -> Dict:\n        \"\"\"Process a data access request.\"\"\"\n        request = await self.get_request(request_id)\n\n        if request['type'] != 'access':\n            raise ValueError(\"Not an access request\")\n\n        # Collect data from all sources\n        user_data = {}\n        for source in self.data_sources:\n            try:\n                data = await source.get_user_data(request['user_id'])\n                user_data[source.name] = data\n            except Exception as e:\n                user_data[source.name] = {'error': str(e)}\n\n        # Format response\n        response = {\n            'request_id': request_id,\n            'generated_at': datetime.utcnow().isoformat(),\n            'data_categories': list(user_data.keys()),\n            'data': user_data,\n            'retention_info': await self.get_retention_info(),\n            'processing_purposes': await self.get_processing_purposes(),\n            'third_party_recipients': await self.get_recipients()\n        }\n\n        # Update request status\n        await self.update_request(request_id, 'completed', response)\n\n        return response\n\n    async def process_erasure_request(self, request_id: str) -> Dict:\n        \"\"\"Process a right to erasure request.\"\"\"\n        request = await self.get_request(request_id)\n\n        if request['type'] != 'erasure':\n            raise ValueError(\"Not an erasure request\")\n\n        results = {}\n        exceptions = []\n\n        for source in self.data_sources:\n            try:\n                # Check for legal exceptions\n                can_delete, reason = await source.can_delete(request['user_id'])\n\n                if can_delete:\n                    await source.delete_user_data(request['user_id'])\n                    results[source.name] = 'deleted'\n                else:\n                    exceptions.append({\n                        'source': source.name,\n                        'reason': reason  # e.g., 'legal retention requirement'\n                    })\n                    results[source.name] = f'retained: {reason}'\n            except Exception as e:\n                results[source.name] = f'error: {str(e)}'\n\n        response = {\n            'request_id': request_id,\n            'completed_at': datetime.utcnow().isoformat(),\n            'results': results,\n            'exceptions': exceptions\n        }\n\n        await self.update_request(request_id, 'completed', response)\n\n        return response\n\n    async def process_portability_request(self, request_id: str) -> bytes:\n        \"\"\"Generate portable data export.\"\"\"\n        request = await self.get_request(request_id)\n        user_data = await self.process_access_request(request_id)\n\n        # Convert to machine-readable format (JSON)\n        portable_data = {\n            'export_date': datetime.utcnow().isoformat(),\n            'format_version': '1.0',\n            'data': user_data['data']\n        }\n\n        return json.dumps(portable_data, indent=2, default=str).encode()\n```\n\n### Pattern 3: Data Retention\n\n```python\nfrom datetime import datetime, timedelta\nfrom enum import Enum\n\nclass RetentionBasis(Enum):\n    CONSENT = \"consent\"\n    CONTRACT = \"contract\"\n    LEGAL_OBLIGATION = \"legal_obligation\"\n    LEGITIMATE_INTEREST = \"legitimate_interest\"\n\nclass DataRetentionPolicy:\n    \"\"\"Define and enforce data retention policies.\"\"\"\n\n    POLICIES = {\n        'user_account': {\n            'retention_period_days': 365 * 3,  # 3 years after last activity\n            'basis': RetentionBasis.CONTRACT,\n            'trigger': 'last_activity_date',\n            'archive_before_delete': True\n        },\n        'transaction_records': {\n            'retention_period_days': 365 * 7,  # 7 years for tax\n            'basis': RetentionBasis.LEGAL_OBLIGATION,\n            'trigger': 'transaction_date',\n            'archive_before_delete': True,\n            'legal_reference': 'Tax regulations require 7 year retention'\n        },\n        'marketing_consent': {\n            'retention_period_days': 365 * 2,  # 2 years\n            'basis': RetentionBasis.CONSENT,\n            'trigger': 'consent_date',\n            'archive_before_delete': False\n        },\n        'support_tickets': {\n            'retention_period_days': 365 * 2,\n            'basis': RetentionBasis.LEGITIMATE_INTEREST,\n            'trigger': 'ticket_closed_date',\n            'archive_before_delete': True\n        },\n        'analytics_data': {\n            'retention_period_days': 365,  # 1 year\n            'basis': RetentionBasis.CONSENT,\n            'trigger': 'collection_date',\n            'archive_before_delete': False,\n            'anonymize_instead': True\n        }\n    }\n\n    async def apply_retention_policies(self):\n        \"\"\"Run retention policy enforcement.\"\"\"\n        for data_type, policy in self.POLICIES.items():\n            cutoff_date = datetime.utcnow() - timedelta(\n                days=policy['retention_period_days']\n            )\n\n            if policy.get('anonymize_instead'):\n                await self.anonymize_old_data(data_type, cutoff_date)\n            else:\n                if policy.get('archive_before_delete'):\n                    await self.archive_data(data_type, cutoff_date)\n                await self.delete_old_data(data_type, cutoff_date)\n\n            await self.log_retention_action(data_type, cutoff_date)\n\n    async def anonymize_old_data(self, data_type: str, before_date: datetime):\n        \"\"\"Anonymize data instead of deleting.\"\"\"\n        # Example: Replace identifying fields with hashes\n        if data_type == 'analytics_data':\n            await self.db.analytics.update_many(\n                {'collection_date': {'$lt': before_date}},\n                {'$set': {\n                    'user_id': None,\n                    'ip_address': None,\n                    'device_id': None,\n                    'anonymized': True,\n                    'anonymized_date': datetime.utcnow()\n                }}\n            )\n```\n\n### Pattern 4: Privacy by Design\n\n```python\nclass PrivacyFirstDataModel:\n    \"\"\"Example of privacy-by-design data model.\"\"\"\n\n    # Separate PII from behavioral data\n    user_profile_schema = {\n        'user_id': str,  # UUID, not sequential\n        'email_hash': str,  # Hashed for lookups\n        'created_at': datetime,\n        # Minimal data collection\n        'preferences': {\n            'language': str,\n            'timezone': str\n        }\n    }\n\n    # Encrypted at rest\n    user_pii_schema = {\n        'user_id': str,\n        'email': str,  # Encrypted\n        'name': str,   # Encrypted\n        'phone': str,  # Encrypted (optional)\n        'address': dict,  # Encrypted (optional)\n        'encryption_key_id': str\n    }\n\n    # Pseudonymized behavioral data\n    analytics_schema = {\n        'session_id': str,  # Not linked to user_id\n        'pseudonym_id': str,  # Rotating pseudonym\n        'events': list,\n        'device_category': str,  # Generalized, not specific\n        'country': str,  # Not city-level\n    }\n\nclass DataMinimization:\n    \"\"\"Implement data minimization principles.\"\"\"\n\n    @staticmethod\n    def collect_only_needed(form_data: dict, purpose: str) -> dict:\n        \"\"\"Filter form data to only fields needed for purpose.\"\"\"\n        REQUIRED_FIELDS = {\n            'account_creation': ['email', 'password'],\n            'newsletter': ['email'],\n            'purchase': ['email', 'name', 'address', 'payment'],\n            'support': ['email', 'message']\n        }\n\n        allowed = REQUIRED_FIELDS.get(purpose, [])\n        return {k: v for k, v in form_data.items() if k in allowed}\n\n    @staticmethod\n    def generalize_location(ip_address: str) -> str:\n        \"\"\"Generalize IP to country level only.\"\"\"\n        import geoip2.database\n        reader = geoip2.database.Reader('GeoLite2-Country.mmdb')\n        try:\n            response = reader.country(ip_address)\n            return response.country.iso_code\n        except:\n            return 'UNKNOWN'\n```\n\n### Pattern 5: Breach Notification\n\n```python\nfrom datetime import datetime\nfrom enum import Enum\n\nclass BreachSeverity(Enum):\n    LOW = \"low\"\n    MEDIUM = \"medium\"\n    HIGH = \"high\"\n    CRITICAL = \"critical\"\n\nclass BreachNotificationHandler:\n    \"\"\"Handle GDPR breach notification requirements.\"\"\"\n\n    AUTHORITY_NOTIFICATION_HOURS = 72\n    AFFECTED_NOTIFICATION_REQUIRED_SEVERITY = BreachSeverity.HIGH\n\n    async def report_breach(\n        self,\n        description: str,\n        data_types: List[str],\n        affected_count: int,\n        severity: BreachSeverity\n    ) -> dict:\n        \"\"\"Report and handle a data breach.\"\"\"\n        breach = {\n            'id': self.generate_breach_id(),\n            'reported_at': datetime.utcnow(),\n            'description': description,\n            'data_types_affected': data_types,\n            'affected_individuals_count': affected_count,\n            'severity': severity.value,\n            'status': 'investigating',\n            'timeline': [{\n                'event': 'breach_reported',\n                'timestamp': datetime.utcnow(),\n                'details': description\n            }]\n        }\n\n        await self.db.breaches.insert_one(breach)\n\n        # Immediate notifications\n        await self.notify_dpo(breach)\n        await self.notify_security_team(breach)\n\n        # Authority notification required within 72 hours\n        if self.requires_authority_notification(severity, data_types):\n            breach['authority_notification_deadline'] = (\n                datetime.utcnow() + timedelta(hours=self.AUTHORITY_NOTIFICATION_HOURS)\n            )\n            await self.schedule_authority_notification(breach)\n\n        # Affected individuals notification\n        if severity.value in [BreachSeverity.HIGH.value, BreachSeverity.CRITICAL.value]:\n            await self.schedule_individual_notifications(breach)\n\n        return breach\n\n    def requires_authority_notification(\n        self,\n        severity: BreachSeverity,\n        data_types: List[str]\n    ) -> bool:\n        \"\"\"Determine if supervisory authority must be notified.\"\"\"\n        # Always notify for sensitive data\n        sensitive_types = ['health', 'financial', 'credentials', 'biometric']\n        if any(t in sensitive_types for t in data_types):\n            return True\n\n        # Notify for medium+ severity\n        return severity in [BreachSeverity.MEDIUM, BreachSeverity.HIGH, BreachSeverity.CRITICAL]\n\n    async def generate_authority_report(self, breach_id: str) -> dict:\n        \"\"\"Generate report for supervisory authority.\"\"\"\n        breach = await self.get_breach(breach_id)\n\n        return {\n            'organization': {\n                'name': self.config.org_name,\n                'contact': self.config.dpo_contact,\n                'registration': self.config.registration_number\n            },\n            'breach': {\n                'nature': breach['description'],\n                'categories_affected': breach['data_types_affected'],\n                'approximate_number_affected': breach['affected_individuals_count'],\n                'likely_consequences': self.assess_consequences(breach),\n                'measures_taken': await self.get_remediation_measures(breach_id),\n                'measures_proposed': await self.get_proposed_measures(breach_id)\n            },\n            'timeline': breach['timeline'],\n            'submitted_at': datetime.utcnow().isoformat()\n        }\n```\n\n## Compliance Checklist\n\n```markdown\n## GDPR Implementation Checklist\n\n### Legal Basis\n- [ ] Documented legal basis for each processing activity\n- [ ] Consent mechanisms meet GDPR requirements\n- [ ] Legitimate interest assessments completed\n\n### Transparency\n- [ ] Privacy policy is clear and accessible\n- [ ] Processing purposes clearly stated\n- [ ] Data retention periods documented\n\n### Data Subject Rights\n- [ ] Access request process implemented\n- [ ] Erasure request process implemented\n- [ ] Portability export available\n- [ ] Rectification process available\n- [ ] Response within 30-day deadline\n\n### Security\n- [ ] Encryption at rest implemented\n- [ ] Encryption in transit (TLS)\n- [ ] Access controls in place\n- [ ] Audit logging enabled\n\n### Breach Response\n- [ ] Breach detection mechanisms\n- [ ] 72-hour notification process\n- [ ] Breach documentation system\n\n### Documentation\n- [ ] Records of processing activities (Art. 30)\n- [ ] Data protection impact assessments\n- [ ] Data processing agreements with vendors\n```\n\n## Best Practices\n\n### Do's\n- **Minimize data collection** - Only collect what's needed\n- **Document everything** - Processing activities, legal bases\n- **Encrypt PII** - At rest and in transit\n- **Implement access controls** - Need-to-know basis\n- **Regular audits** - Verify compliance continuously\n\n### Don'ts\n- **Don't pre-check consent boxes** - Must be opt-in\n- **Don't bundle consent** - Separate purposes separately\n- **Don't retain indefinitely** - Define and enforce retention\n- **Don't ignore DSARs** - 30-day response required\n- **Don't transfer without safeguards** - SCCs or adequacy decisions\n\n## Resources\n\n- [GDPR Full Text](https:\u002F\u002Fgdpr-info.eu\u002F)\n- [ICO Guidance](https:\u002F\u002Fico.org.uk\u002Ffor-organisations\u002Fguide-to-data-protection\u002Fguide-to-the-general-data-protection-regulation-gdpr\u002F)\n- [EDPB Guidelines](https:\u002F\u002Fedpb.europa.eu\u002Four-work-tools\u002Fgeneral-guidance\u002Fgdpr-guidelines-recommendations-best-practices_en)\n",{"name":5,"description":7},"main","7850740bd837adb32f0a109ab2af82482196c6f2","skills\u002F_collections\u002Fplugins\u002Fhr-legal-compliance\u002Fskills\u002Fgdpr-data-handling",1,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills","https:\u002F\u002Fzturnsgo.com","https:\u002F\u002Fgithub.com\u002Fshengdabai","https:\u002F\u002Fzturnsgo.com\u002F","AI × education creator — producer, not consumer. Taught 6,000+ learners; shipping learning tools & daily essays with Claude Code, practicing @xiaolai's way 🥋","2026-11-01 21:28:23",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add shengdabai\u002FTony-Claude-Code-Skills --skill gdpr-data-handling",{"tool":73,"command":74},"bunx","bunx skills add shengdabai\u002FTony-Claude-Code-Skills --skill gdpr-data-handling",{"tool":76,"command":77},"pnpm","pnpm dlx skills add shengdabai\u002FTony-Claude-Code-Skills --skill gdpr-data-handling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002F_collections\u002Fplugins\u002Fhr-legal-compliance\u002Fskills\u002Fgdpr-data-handling\u002FSKILL.md",true,[],[82,99,131,156,178,198],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":91,"publishedAt":52},"01M70P17DAD4C1C47NPH6A96EM","xiaolai-methodology","以李笑来(Li Xiaolai)的思考方式、方法论与表达风格,为用户做全方位 1-on-1 教练指导,覆盖创业、赚钱、投资、学习、自学、读书写作、用 AI、以及人生心态与自我管理。当用户提到 \"李笑来\"、\"笑来\"、\"笑来老师\"、\"扮演李笑来\"、\"找笑来聊聊\"、\"笑来怎么看\"、\"xiaolai\"、\"把时间当作朋友\"、\"通往财富自由之路\"、\"定投改变命运\"、\"韭菜的自我修养\"、\"自学是门手艺\"、\"让时间陪你慢慢变富\"、\"七年就是一辈子\"、\"元认知\"、\"活在未来\"、\"复利\u002F长期主义\"、\"践行\"、\"痴迷改进\"、\"个人商业模式\u002F出售时间\"、\"睡后收入\"、\"定投\"、\"财富自由\"、\"操作系统升级\"、\"最少必要知识\"、\"北极星提示词\"、\"用 AI 该怎么学\u002F思考\" 等任一触发词,或当用户带着关于创业\u002F赚钱\u002F投资\u002F学习\u002F职业\u002F重大人生决策的困惑、希望被人用笑来式的「逻辑 + 大白话 + 类比 + 重新定义 + 践行导向」来点醒和指导时,自动进入李笑来教练模式。","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fxiaolai-methodology\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",[92,93,94,95,96,97,98],"methodology","xiaolai","xiaolai methodology","朋友","投资","writing","收入",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":111,"publishedAt":52},"01M70P13NB9YP7ACJR1S861CDS","zread","Produce and consume a wiki-style knowledge base for a code repository via the `zread` CLI and its on-disk output under `.\u002F.zread\u002Fwiki\u002F`. Use this skill whenever the user wants to understand, onboard onto, explore, summarize, map, or get an overview of an unfamiliar codebase; asks for architecture docs, a project wiki, a repo walkthrough, module\u002Fpackage explanations, or \"what does this repo do\"; wants to generate, regenerate, resume, browse, or serve code documentation locally; or mentions zread \u002F zread.ai directly. Also use it proactively before diving into a large unknown repo — if `.\u002F.zread\u002Fwiki\u002Fcurrent` exists, read the generated pages instead of crawling source file-by-file; if it doesn't, consider offering to run `zread generate`. The trigger is the intent (understand a codebase through generated docs), not the literal word \"zread\".","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fzread\u002FSKILL.md",[105,108],{"categoryNo":106,"categoryName":107,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":109,"categoryName":110,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师",[101,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130],"knowledge","wiki","explore","walkthrough","project","get","knowledge base","run","generate","intent","cli","map","documentation","project wiki","disk","architecture","code","unknown","generated",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":141,"publishedAt":52},"01M70P10S4SWMZQ8BJAFBFDRW3","youtube","Launch the YouTube Creator Agent to auto-generate videos.\nUse when: user types \u002Fyoutube, wants to create YouTube videos,\ngenerate video content, or upload to YouTube.\nKeywords: youtube, video, 视频, 创作视频, 发布视频","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube\u002FSKILL.md",[137,138],{"categoryNo":106,"categoryName":107,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":139,"categoryName":140,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者",[133,142,143,144,145,146,147,148,120,149,150,151,48,42,152,153,154,155],"user","content","视频","creator","generate video","videos","launch","video content","create","upload","auto","types","Video","创作",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":52},"01M70P0YE95D8BACZCGV8BK90K","youtube-script-sync","Sync, update, or optimize Tony's GetNote knowledge base `Youtube视频逐字稿` by turning each parent recording or first-person idea note into an idempotent child note containing a directly recordable YouTube long-video or Shorts script. Use when the user says “更新\u002F同步\u002F优化 Youtube视频逐字稿知识库”, or says “更新\u002F同步\u002F优化该知识库” while this knowledge base is the active context.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube-script-sync\u002FSKILL.md",[162],{"categoryNo":106,"categoryName":107,"taxonomyType":21,"taxonomyTypeDesc":22},[164,165,133,166,167,154,168,169,170,171,172,173,174,175,118,176,48,42,112,177],"sync","script","youtube script sync","recording","shorts","first","base","person","update","active","child","optimize","idempotent","long",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":188,"publishedAt":52},"01M70P0WMV5XT0EEC0N445PW07","writing-skills","How to write SKILL.md files that trigger reliably and teach effectively. Use when creating, improving, or reviewing Claude Code skills.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fxiaolai\u002Fnlpm\u002Fskills\u002Fnlpm\u002Fwriting-skills\u002FSKILL.md",[184,185,186,187],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":106,"categoryName":107,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":109,"categoryName":110,"taxonomyType":26,"taxonomyTypeDesc":27},{"categoryNo":139,"categoryName":140,"taxonomyType":26,"taxonomyTypeDesc":27},[189,97,190,191,192,193,128,48,42,194,195,196,197],"writing skills","how","teach","write skill","write","claude code skills","files","how to","trigger",{"skillNo":199,"name":200,"nameZh":6,"description":201,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":202,"categories":203,"keywords":206,"publishedAt":52},"01M70P0SJFR4YVJQBGMHKGSKXT","writing-rules","How to write .claude\u002Frules\u002F files that Claude actually follows. Use when creating, improving, or reviewing project rules.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fxiaolai\u002Fnlpm\u002Fskills\u002Fnlpm\u002Fwriting-rules\u002FSKILL.md",[204,205],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":139,"categoryName":140,"taxonomyType":26,"taxonomyTypeDesc":27},[207,97,208,116,209,195,48,190,193,42,196],"Rules","writing rules","project rules"]