Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This skill provides comprehensive guidance for implementing and reviewing GDPR-compliant features in Empathy Ledger.
.claude/skills/aiskillstore-gdpr-compliance/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-16 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 31% | 0% |
This skill provides comprehensive guidance for implementing and reviewing GDPR-compliant features in Empathy Ledger.
Requirement: Users can request a copy of their personal data
Implementation:
typescript// GET /api/user/export const data = await gdprService.exportUserData(userId) // Returns: stories, media, profile, consent records, activity logs
Requirement: Users can correct inaccurate personal data
Implementation:
Requirement: Users can request deletion of their data
Implementation:
typescript// POST /api/user/deletion-request // Initiates 30-day deletion workflow // POST /api/stories/[id]/anonymize // Immediate anonymization of specific story
Anonymization Process:
Requirement: Users can export data in machine-readable format
Implementation:
typescriptinterface ConsentRecord { has_consent: boolean // Initial consent given consent_verified: boolean // Consent verification completed consent_method?: string // 'written' | 'verbal' | 'digital' consent_date?: Date consent_witness_id?: string // For verbal consent }
typescript// POST /api/stories/[id]/consent/withdraw // Triggers: // 1. Set consent_withdrawn_at timestamp // 2. Revoke all embed tokens // 3. Mark all distributions as revoked // 4. Send webhook notifications // 5. Queue external takedown requests // 6. Create audit log entries
For Empathy Ledger, we rely on:
□ Export includes all user stories
□ Export includes media files
□ Export includes profile data
□ Export includes consent records
□ Export includes activity log
□ Format is JSON (machine-readable)
□ Download is secure (authenticated)□ Deletion request creates ticket
□ User receives confirmation email
□ 30-day processing window
□ All stories anonymized or deleted
□ All media files removed
□ Profile data erased
□ Audit trail anonymized
□ Third-party distributions notified□ Consent captured before distribution
□ Consent method recorded
□ Consent can be withdrawn
□ Withdrawal cascades automatically
□ Audit trail for consent changes
□ Re-consent required for new purposesGET /api/user/export - Export all user dataPOST /api/user/deletion-request - Request account deletionGET /api/user/deletion-request - Check deletion statusPOST /api/stories/[id]/anonymize - Anonymize specific storyPOST /api/stories/[id]/consent/withdraw - Withdraw consentGET /api/stories/[id]/audit - View story audit trailPOST /api/stories/[id]/audit/export - Export audit reportsqlCREATE TABLE deletion_requests ( id UUID PRIMARY KEY, user_id UUID NOT NULL, tenant_id UUID NOT NULL, request_type TEXT NOT NULL, -- 'anonymize_story', 'delete_account' status TEXT DEFAULT 'pending', -- 'pending', 'processing', 'completed' requested_at TIMESTAMPTZ, processed_at TIMESTAMPTZ, completed_at TIMESTAMPTZ );
sql-- On stories table anonymization_status TEXT, -- null, 'partial', 'full' anonymized_fields JSONB, -- Track what was anonymized consent_withdrawn_at TIMESTAMPTZ -- When consent was withdrawn
typescriptclass GDPRService { exportUserData(userId: string): Promise<DataExport> anonymizeStory(storyId: string): Promise<AnonymizeResult> anonymizeUserData(userId: string): Promise<AnonymizeResult> createDeletionRequest(userId: string, type: string): Promise<Request> processDeletionRequest(requestId: string): Promise<void> scrubPII(content: string): string }
When reviewing code, verify:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→pass | 7,943 | 4,598 | -42% | 1 | 1 | 0% | 1,239 | 2,109 | +70% | 0 | 0 | — |
case-22 | fail→fail | 22,489 | 16,520 | -27% | 1 | 1 | 0% | 4,132 | 4,616 | +12% | 0 | 0 | — |
case-05 | fail→pass | 15,642 | 9,859 | -37% | 1 | 1 | 0% | 2,971 | 3,405 | +15% | 0 | 0 | — |
case-06 | fail→pass | 15,916 | 8,716 | -45% | 1 | 1 | 0% | 2,834 | 2,908 | +3% | 0 | 0 | — |
case-01 | fail→pass | 19,500 | 17,640 | -10% | 1 | 1 | 0% | 3,287 | 5,033 | +53% | 0 | 0 | — |
case-02 | fail→pass | 19,446 | 15,439 | -21% | 1 | 1 | 0% | 3,203 | 4,202 | +31% | 0 | 0 | — |
case-03 | pass→pass | 14,984 | 13,147 | -12% | 1 | 1 | 0% | 2,508 | 3,747 | +49% | 0 | 0 | — |
case-04 | fail→pass | 18,359 | 13,814 | -25% | 1 | 1 | 0% | 3,087 | 4,077 | +32% | 0 | 0 | — |
case-07 | fail→pass | 13,699 | 5,830 | -57% | 1 | 1 | 0% | 2,424 | 2,569 | +6% | 0 | 0 | — |
case-08 | fail→pass | 14,321 | 4,097 | -71% | 1 | 1 | 0% | 2,533 | 2,225 | -12% | 0 | 0 | — |
case-09 | fail→pass | 12,908 | 4,593 | -64% | 1 | 1 | 0% | 2,256 | 2,240 | -1% | 0 | 0 | — |
case-10 | pass→pass | 14,587 | 6,556 | -55% | 1 | 1 | 0% | 2,525 | 2,680 | +6% | 0 | 0 | — |
case-11 | pass→pass | 10,088 | 2,358 | -77% | 1 | 1 | 0% | 1,848 | 1,765 | -4% | 0 | 0 | — |
case-12 | pass→pass | 16,300 | 10,268 | -37% | 1 | 1 | 0% | 2,603 | 3,073 | +18% | 0 | 0 | — |
case-13 | fail→pass | 14,787 | 6,407 | -57% | 1 | 1 | 0% | 3,099 | 2,740 | -12% | 0 | 0 | — |
case-14 | fail→pass | 6,125 | 2,445 | -60% | 1 | 1 | 0% | 1,119 | 1,810 | +62% | 0 | 0 | — |
case-15 | pass→pass | 15,506 | 6,284 | -59% | 1 | 1 | 0% | 2,431 | 2,382 | -2% | 0 | 0 | — |
case-17 | pass→pass | 15,513 | 10,581 | -32% | 1 | 1 | 0% | 2,624 | 3,235 | +23% | 0 | 0 | — |
case-18 | fail→pass | 8,552 | 2,865 | -66% | 1 | 1 | 0% | 1,468 | 1,844 | +26% | 0 | 0 | — |
case-19 | pass→pass | 7,107 | 4,780 | -33% | 1 | 1 | 0% | 1,101 | 2,052 | +86% | 0 | 0 | — |
case-20 | pass→pass | 6,424 | 2,488 | -61% | 1 | 1 | 0% | 1,018 | 1,671 | +64% | 0 | 0 | — |
case-21 | fail→fail | 18,598 | 16,035 | -14% | 1 | 1 | 0% | 3,109 | 4,347 | +40% | 0 | 0 | — |
case-23 | fail→fail | 21,136 | 18,196 | -14% | 1 | 1 | 0% | 3,344 | 4,743 | +42% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +52 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.