[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GZ3V2YVZCD2Y7BSPKN04PZ":3,"skill-same:01M6GZ3V2YVZCD2Y7BSPKN04PZ":75},{"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":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":44,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M6GZ3V2YVZCD2Y7BSPKN04PZ","log-a-scheduled-run-outcome",null,"Use when a job runs unattended and you cannot tell what it did. Emits one structured, greppable outcome line per run with counts and the run key.","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-log-a-scheduled-run-outcome\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-log-a-scheduled-run-outcome\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32],"run","outcome","log","scheduled","log a scheduled run outcome","use","structured","line","it","with","you","unattended","when","2026-11-10 10:12:30",false,"---\nname: log-a-scheduled-run-outcome\ndescription: Use when a job runs unattended and you cannot tell what it did. Emits one structured, greppable outcome line per run with counts and the run key.\n---\n\n# Log a scheduled run outcome\n\nUnattended jobs need a per-run record that answers \"did this run, what did it change, and how long did it take\" without reading the whole log stream. Emit one structured line per run.\n\n## Procedure\n\n1. Emit exactly one outcome record when the job finishes, as a single-line JSON object, so it greps and parses:\n       {\"job\":\"nightly-reconcile\",\"run\":\"2026-10-07\",\"status\":\"ok\",\"rows\":4821,\n        \"duration_ms\":63120,\"started\":\"2026-10-07T03:00:01Z\",\"finished\":\"2026-10-07T03:01:04Z\"}\n2. Include the run key so the line ties back to the idempotency guard and the status table.\n3. Log counts that matter for correctness: rows read, rows written, rows skipped or duplicated. A zero-write day is often the bug.\n4. Log at a single level (`INFO`) with a stable event name (`event=job_finish`) so you can build one query across all jobs.\n5. On failure, emit the same fields plus `status=\"error\"`, an error class, and the trace or correlation id — never a bare stack trace on its own line.\n6. Put the log line on stdout so the scheduler's log collector picks it up; do not write to a per-job file nobody ships.\n7. Never log secrets, tokens, or full PII payloads in the outcome; log identifiers, not contents.\n8. Make the logger a shared helper so every job emits the same schema; a bespoke format breaks the cross-job query.\n9. Keep verbose per-item logs at DEBUG and off by default, so the outcome line is not buried in thousands of peers.\n10. Alert off the aggregate of these lines, not by parsing free text.\n11. Verify by running the job and checking one parseable line comes out with the expected keys.\n\n## Pitfalls\n\n- Logging \"done\" with no counts, so a run that processed nothing looks identical to a healthy one.\n- Multi-line stack traces that break line-based parsing and flood the stream.\n- Logging the whole payload, including customer data.\n- A different JSON key per job, so the cross-job dashboard needs a mapping per job.\n- Logging at job start with no finish line, so a hung job looks like it completed.\n- Writing the outcome to a file on the host that is lost on restart.\n\n## Verification\n\n    .\u002Fnightly-reconcile 2>&1 | grep -E '\"event\":\"job_finish\"' | jq -c '.status,.rows,.duration_ms'\n    # pass: exactly one finish line, status ok, rows>0, duration_ms present\n\nReport the outcome field list, the shared helper, and a sample line from a real run.\n","# Log a scheduled run outcome\n\nUnattended jobs need a per-run record that answers \"did this run, what did it change, and how long did it take\" without reading the whole log stream. Emit one structured line per run.\n\n## Procedure\n\n1. Emit exactly one outcome record when the job finishes, as a single-line JSON object, so it greps and parses:\n       {\"job\":\"nightly-reconcile\",\"run\":\"2026-10-07\",\"status\":\"ok\",\"rows\":4821,\n        \"duration_ms\":63120,\"started\":\"2026-10-07T03:00:01Z\",\"finished\":\"2026-10-07T03:01:04Z\"}\n2. Include the run key so the line ties back to the idempotency guard and the status table.\n3. Log counts that matter for correctness: rows read, rows written, rows skipped or duplicated. A zero-write day is often the bug.\n4. Log at a single level (`INFO`) with a stable event name (`event=job_finish`) so you can build one query across all jobs.\n5. On failure, emit the same fields plus `status=\"error\"`, an error class, and the trace or correlation id — never a bare stack trace on its own line.\n6. Put the log line on stdout so the scheduler's log collector picks it up; do not write to a per-job file nobody ships.\n7. Never log secrets, tokens, or full PII payloads in the outcome; log identifiers, not contents.\n8. Make the logger a shared helper so every job emits the same schema; a bespoke format breaks the cross-job query.\n9. Keep verbose per-item logs at DEBUG and off by default, so the outcome line is not buried in thousands of peers.\n10. Alert off the aggregate of these lines, not by parsing free text.\n11. Verify by running the job and checking one parseable line comes out with the expected keys.\n\n## Pitfalls\n\n- Logging \"done\" with no counts, so a run that processed nothing looks identical to a healthy one.\n- Multi-line stack traces that break line-based parsing and flood the stream.\n- Logging the whole payload, including customer data.\n- A different JSON key per job, so the cross-job dashboard needs a mapping per job.\n- Logging at job start with no finish line, so a hung job looks like it completed.\n- Writing the outcome to a file on the host that is lost on restart.\n\n## Verification\n\n    .\u002Fnightly-reconcile 2>&1 | grep -E '\"event\":\"job_finish\"' | jq -c '.status,.rows,.duration_ms'\n    # pass: exactly one finish line, status ok, rows>0, duration_ms present\n\nReport the outcome field list, the shared helper, and a sample line from a real run.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-log-a-scheduled-run-outcome",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":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill log-a-scheduled-run-outcome",{"tool":53,"command":54},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill log-a-scheduled-run-outcome",{"tool":56,"command":57},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill log-a-scheduled-run-outcome","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-log-a-scheduled-run-outcome\u002FSKILL.md",true,[61,65,71],{"path":62,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"SOURCE.md","REFERENCE","参考文档",353,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-log-a-scheduled-run-outcome\u002FSOURCE.md",{"path":72,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":73,"sourceHtmlUrl":74},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-log-a-scheduled-run-outcome\u002FTRUST.auto.yaml",[76,104,127,145,158,168],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":80,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":33},"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",[],[84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":108,"licenseFileUrl":109,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":33},"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",[],[113,114,115,116,117,118,119,120,121,122,123,124,125,126],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":108,"licenseFileUrl":131,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":33},"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",[],[135,114,136,137,138,139,140,124,123,122,141,142,143,118,144,117,116],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":108,"licenseFileUrl":149,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":33},"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",[],[153,154,115,155,156,125,123,157,121,120,118,117],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":159,"name":160,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":161,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":33},"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",[],[165,166,167],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":172,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":33},"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",[],[176,177,178,179,180,181,182,25,183,184,185],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]