[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H09WW9JMQTR6MM115440VV":3,"skill-same:01M6H09WW9JMQTR6MM115440VV":85},{"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":16,"sourceHtmlUrl":17,"categories":18,"keywords":27,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":54,"ownerDescription":55,"updatedAt":56,"install":57,"resources":70},"01M6H09WW9JMQTR6MM115440VV","separate-privacy-data-from-compliance-records",null,"Use when a compliance obligation and a privacy obligation pull in opposite directions, and you must keep the screening record intact without letting identifiable data sprawl across systems.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-separate-privacy-data-from-compliance-records\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-separate-privacy-data-from-compliance-records\u002FSKILL.md",[19,24],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",{"categoryNo":25,"categoryName":26,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000037","律师与法务",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"compliance","privacy","data","records","separate privacy data from compliance records","pull","use","record","across","systems","keep","you","screening","directions","when","2026-11-10 10:12:30",false,"---\nname: separate-privacy-data-from-compliance-records\ndescription: Use when a compliance obligation and a privacy obligation pull in opposite directions, and you must keep the screening record intact without letting identifiable data sprawl across systems.\n---\n\n# Separate privacy data from compliance records\n\nAnti-money-laundering rules say keep the evidence; data-protection rules say minimise, purpose-\nlimit and delete. The reconciliation is architectural: one narrow, lawful compliance record and a\ndeliberately small footprint everywhere else.\n\n## Procedure\n\n1. Name the lawful basis per processing activity before writing code. Sanctions screening and\n   record-keeping typically rest on a legal obligation, whereas marketing analytics rests on\n   consent — and a record kept on the wrong basis is unlawful however useful it is.\n\n```\n       cat > ropa.csv \u003C\u003C'CSV'\n       activity,basis,purpose,retention\n       sanctions_screen,legal_obligation,AML,5y\n       kyc_verify,legal_obligation,AML,5y\n       product_analytics,consent,growth,13m\n       CSV\n```\n\n2. Keep the compliance record to what the obligation requires. For a screen that is: subject\n   identifier, list digest, timestamp, result, reviewer. Not the customer's whole file.\n\n3. Split the stores. The AML record lives in a restricted archive with its own access log; the\n   product, analytics and marketing systems must not be able to read it and must not duplicate it.\n\n       grep -rn \"kyc_\\|sanctions_\" services\u002F*\u002Fconfig.yaml | grep -v \"aml-archive\"\n\n   Every hit outside the archive service is a leak path to close.\n\n4. Support subject requests with a defined carve-out. Where a legal obligation requires retention,\n   the response says the record is retained for that purpose; it does not disclose a suspicious-\n   activity report.\n\n5. Delete on the day the period ends, automatically. A retention policy with manual deletion is a\n   policy with no deletion.\n\n6. Log access to the compliance store. Who read a record and why is part of the control, and it is\n   also how you show a breach did or did not reach the vault.\n\n## Pitfalls\n\n- Copying the KYC result into the CRM \"so support can see it\", which doubles the exposure and\n  creates a store with none of the archive's controls.\n- Writing full statutory records into application logs. Logs get shipped, indexed and copied; the\n  purpose limitation does not survive the pipeline.\n- Deleting a screening record when a customer closes their account, which destroys the obligation\n  the regime imposes.\n- Treating the record of an AML decision as the customer's to receive. Some of it is protected,\n  and the carve-out is jurisdiction-specific.\n- Assuming minimisation means deletion everywhere. Compliance retention is itself an exception,\n  and both rules have to be written down per activity.\n\n## Verification\n\n    python3 -c 'import csv;r=list(csv.DictReader(open(\"ropa.csv\")));\n    assert all(x[\"basis\"] and x[\"retention\"] for x in r); print(len(r),\"activities mapped\")'\n    grep -rl \"kyc_blob\\|gov_id_image\" services\u002F | grep -v aml-archive || echo \"no stray copies\"\n\nA pass maps every activity to a basis and retention and finds no PII copy outside the archive.\n\nReport the processing map, the stores holding identifiable data, the retention clocks, and any\nstray copies found. Which basis applies and how a subject request is answered are legal\ndeterminations for a qualified privacy officer and counsel.\n","# Separate privacy data from compliance records\n\nAnti-money-laundering rules say keep the evidence; data-protection rules say minimise, purpose-\nlimit and delete. The reconciliation is architectural: one narrow, lawful compliance record and a\ndeliberately small footprint everywhere else.\n\n## Procedure\n\n1. Name the lawful basis per processing activity before writing code. Sanctions screening and\n   record-keeping typically rest on a legal obligation, whereas marketing analytics rests on\n   consent — and a record kept on the wrong basis is unlawful however useful it is.\n\n```\n       cat > ropa.csv \u003C\u003C'CSV'\n       activity,basis,purpose,retention\n       sanctions_screen,legal_obligation,AML,5y\n       kyc_verify,legal_obligation,AML,5y\n       product_analytics,consent,growth,13m\n       CSV\n```\n\n2. Keep the compliance record to what the obligation requires. For a screen that is: subject\n   identifier, list digest, timestamp, result, reviewer. Not the customer's whole file.\n\n3. Split the stores. The AML record lives in a restricted archive with its own access log; the\n   product, analytics and marketing systems must not be able to read it and must not duplicate it.\n\n       grep -rn \"kyc_\\|sanctions_\" services\u002F*\u002Fconfig.yaml | grep -v \"aml-archive\"\n\n   Every hit outside the archive service is a leak path to close.\n\n4. Support subject requests with a defined carve-out. Where a legal obligation requires retention,\n   the response says the record is retained for that purpose; it does not disclose a suspicious-\n   activity report.\n\n5. Delete on the day the period ends, automatically. A retention policy with manual deletion is a\n   policy with no deletion.\n\n6. Log access to the compliance store. Who read a record and why is part of the control, and it is\n   also how you show a breach did or did not reach the vault.\n\n## Pitfalls\n\n- Copying the KYC result into the CRM \"so support can see it\", which doubles the exposure and\n  creates a store with none of the archive's controls.\n- Writing full statutory records into application logs. Logs get shipped, indexed and copied; the\n  purpose limitation does not survive the pipeline.\n- Deleting a screening record when a customer closes their account, which destroys the obligation\n  the regime imposes.\n- Treating the record of an AML decision as the customer's to receive. Some of it is protected,\n  and the carve-out is jurisdiction-specific.\n- Assuming minimisation means deletion everywhere. Compliance retention is itself an exception,\n  and both rules have to be written down per activity.\n\n## Verification\n\n    python3 -c 'import csv;r=list(csv.DictReader(open(\"ropa.csv\")));\n    assert all(x[\"basis\"] and x[\"retention\"] for x in r); print(len(r),\"activities mapped\")'\n    grep -rl \"kyc_blob\\|gov_id_image\" services\u002F | grep -v aml-archive || echo \"no stray copies\"\n\nA pass maps every activity to a basis and retention and finds no PII copy outside the archive.\n\nReport the processing map, the stores holding identifiable data, the retention clocks, and any\nstray copies found. Which basis applies and how a subject request is answered are legal\ndeterminations for a qualified privacy officer and counsel.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-separate-privacy-data-from-compliance-records",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-15 02:28:10",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill separate-privacy-data-from-compliance-records",{"tool":63,"command":64},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill separate-privacy-data-from-compliance-records",{"tool":66,"command":67},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill separate-privacy-data-from-compliance-records","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-separate-privacy-data-from-compliance-records\u002FSKILL.md",true,[71,75,81],{"path":72,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"SOURCE.md","REFERENCE","参考文档",371,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-separate-privacy-data-from-compliance-records\u002FSOURCE.md",{"path":82,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":83,"sourceHtmlUrl":84},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-separate-privacy-data-from-compliance-records\u002FTRUST.auto.yaml",[86,114,137,154,167,177],{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":90,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":43},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":118,"licenseFileUrl":119,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":43},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[123,124,125,126,127,128,129,130,131,132,133,134,135,136],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":118,"licenseFileUrl":141,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":43},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[145,124,146,147,148,149,150,134,133,132,151,152,30,128,153,127,126],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","orders",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":118,"licenseFileUrl":158,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":43},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[162,163,125,164,165,135,133,166,131,130,128,127],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":168,"name":169,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":170,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":43},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[174,175,176],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":181,"sourceHtmlUrl":182,"categories":183,"keywords":184,"publishedAt":43},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[185,186,187,188,189,190,191,34,192,193,194],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]