[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GXMFE3GQJB4448QAHWS1KT":3,"skill-same:01M6GXMFE3GQJB4448QAHWS1KT":78},{"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":19,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":47,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6GXMFE3GQJB4448QAHWS1KT","bind-consent-to-a-stated-purpose",null,"Use when building or auditing a consent flow and the wording, scope, or audit trail is unclear. Record purpose, notice version, and proof of action, then gate processing on a current grant.","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-bind-consent-to-a-stated-purpose\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-bind-consent-to-a-stated-purpose\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"bind","bind consent to a stated purpose","audit","flow","use","version","gate","record","proof","scope","notice","processing","action","trail","audit trail","when","2026-11-10 10:12:30",false,"---\nname: bind-consent-to-a-stated-purpose\ndescription: Use when building or auditing a consent flow and the wording, scope, or audit trail is unclear. Record purpose, notice version, and proof of action, then gate processing on a current grant.\n---\n\n# Bind consent to a stated purpose\n\nConsent that does not name a purpose cannot be relied on. This skill records what was agreed, when, and for exactly which use, and enforces it at call time.\n\n## Procedure\n\n1. Write each purpose as a discrete record id: `purpose_id = \"marketing_email_2024\"`. Vague wording such as \"improve services\" fails.\n\n2. Store the consent event append-only, never mutate: `(subject_id, purpose_id, granted_at, text_version, source, method, revoked_at)`.\n\n3. Pin the exact wording by hash so you can prove what the user saw: store `text_sha256` of the notice that was displayed.\n\n4. Capture the unbundled choice: separate rows for analytics, marketing, and personalisation. A single checkbox is not valid consent for three purposes.\n\n5. Capture proof of the action: IP, user agent, and the click itself, not the page load. A scripted consent event is not consent.\n\n6. Gate processing on a fresh lookup every time:\n   `select 1 from consent where subject_id=$1 and purpose_id=$2 and revoked_at is null and granted_at > now() - interval '24 months'`\n\n7. Make revocation as easy as grant and propagate it through every downstream system within a defined SLA (for example 24h to the email provider).\n\n8. Log the check result (granted or denied) per message so a complaint is answerable from logs alone.\n\n9. Re-consent on any material wording change; a new purpose is a new consent, never an edit to the old row.\n\n## Pitfalls\n\n- Pre-ticked boxes and implied consent fail in GDPR-style regimes; record an affirmative act.\n- Bundling consent into terms acceptance invalidates it for optional processing.\n- Deleting the row on revocation erases proof that consent ever existed; revoke with a timestamp instead.\n- A suppression list keyed only on email fails when the address changes; also key on the person identifier.\n- Consent drift: an old purpose string lingers in code while the notice changed underneath it; match on `purpose_id` and version.\n\n## Verification\n\n    psql \"$CONSENT_DB\" -c \"select purpose_id, count(*) filter (where revoked_at is null) active, count(*) total from consent group by 1 order by 1\"\n\nReport the active count per purpose, the newest notice version in use, and any system still sending on a revoked grant.\n","# Bind consent to a stated purpose\n\nConsent that does not name a purpose cannot be relied on. This skill records what was agreed, when, and for exactly which use, and enforces it at call time.\n\n## Procedure\n\n1. Write each purpose as a discrete record id: `purpose_id = \"marketing_email_2024\"`. Vague wording such as \"improve services\" fails.\n\n2. Store the consent event append-only, never mutate: `(subject_id, purpose_id, granted_at, text_version, source, method, revoked_at)`.\n\n3. Pin the exact wording by hash so you can prove what the user saw: store `text_sha256` of the notice that was displayed.\n\n4. Capture the unbundled choice: separate rows for analytics, marketing, and personalisation. A single checkbox is not valid consent for three purposes.\n\n5. Capture proof of the action: IP, user agent, and the click itself, not the page load. A scripted consent event is not consent.\n\n6. Gate processing on a fresh lookup every time:\n   `select 1 from consent where subject_id=$1 and purpose_id=$2 and revoked_at is null and granted_at > now() - interval '24 months'`\n\n7. Make revocation as easy as grant and propagate it through every downstream system within a defined SLA (for example 24h to the email provider).\n\n8. Log the check result (granted or denied) per message so a complaint is answerable from logs alone.\n\n9. Re-consent on any material wording change; a new purpose is a new consent, never an edit to the old row.\n\n## Pitfalls\n\n- Pre-ticked boxes and implied consent fail in GDPR-style regimes; record an affirmative act.\n- Bundling consent into terms acceptance invalidates it for optional processing.\n- Deleting the row on revocation erases proof that consent ever existed; revoke with a timestamp instead.\n- A suppression list keyed only on email fails when the address changes; also key on the person identifier.\n- Consent drift: an old purpose string lingers in code while the notice changed underneath it; match on `purpose_id` and version.\n\n## Verification\n\n    psql \"$CONSENT_DB\" -c \"select purpose_id, count(*) filter (where revoked_at is null) active, count(*) total from consent group by 1 order by 1\"\n\nReport the active count per purpose, the newest notice version in use, and any system still sending on a revoked grant.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-bind-consent-to-a-stated-purpose",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-13 02:31:19",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill bind-consent-to-a-stated-purpose",{"tool":56,"command":57},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill bind-consent-to-a-stated-purpose",{"tool":59,"command":60},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill bind-consent-to-a-stated-purpose","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-bind-consent-to-a-stated-purpose\u002FSKILL.md",true,[64,68,74],{"path":65,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"SOURCE.md","REFERENCE","参考文档",358,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-bind-consent-to-a-stated-purpose\u002FSOURCE.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-bind-consent-to-a-stated-purpose\u002FTRUST.auto.yaml",[79,106,129,147,160,169],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":83,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":36},"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",[],[87,88,89,90,91,92,93,94,95,23,96,97,98,99,100,101,102,103,104,105],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":110,"licenseFileUrl":111,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":36},"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",[],[115,116,117,118,119,120,121,122,123,124,125,126,127,128],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":110,"licenseFileUrl":133,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":36},"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",[],[137,116,138,139,140,141,142,126,125,124,143,144,145,120,146,119,118],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":110,"licenseFileUrl":151,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":36},"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",[],[155,156,117,157,158,127,125,159,123,122,120,119],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":161,"name":162,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":163,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":36},"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",[],[167,168,25],"refresh","0xklen version and refresh sanctions lists",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":173,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":36},"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",[],[177,178,179,180,181,182,183,24,184,185,186],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]