[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6P7FPKS7SJ0CC5XG8D4EM4V":3,"skill-same:01M6P7FPKS7SJ0CC5XG8D4EM4V":70},{"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":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":14,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":54,"updatedAt":55,"install":56,"resources":69},"01M6P7FPKS7SJ0CC5XG8D4EM4V","email-and-password-best-practices",null,"Secure and review email and password authentication using Better Auth.\nUSE FOR: secure Better Auth email-and-password authentication; review Better Auth sign-up and password flows; reject readable text or plaintext password storage; secure Better Auth password reset and verification flows.\nDO NOT USE FOR: credential-free sign-in methods.","sarthchawla\u002FSetupMyAI","sarthchawla","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F41484686?v=4","01M6P7D22NFMY9MA11Q2YGPKV2","Sarthak Chawla","01M6P7D26JJ9KW98SD1G8BB83R",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Fpackages\u002Fauth-security\u002Fskills\u002Femail-and-password-best-practices\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"best practices","email","email and password best practices","password","text","for","flows","free","reset","sign","do","methods","up","use","review","password reset","verification","authentication","auth","storage","2026-11-10 10:12:30",false,"---\nname: email-and-password-best-practices\ndescription: |\n  Secure and review email and password authentication using Better Auth.\n  USE FOR: secure Better Auth email-and-password authentication; review Better Auth sign-up and password flows; reject readable text or plaintext password storage; secure Better Auth password reset and verification flows.\n  DO NOT USE FOR: credential-free sign-in methods.\n---\n\n## Email Verification Setup\n\nWhen enabling email\u002Fpassword authentication, configure `emailVerification.sendVerificationEmail` to verify user email addresses. This helps prevent fake sign-ups and ensures users have access to the email they registered with.\n\n```ts\nimport { betterAuth } from \"better-auth\";\nimport { sendEmail } from \".\u002Femail\"; \u002F\u002F your email sending function\n\nexport const auth = betterAuth({\n  emailVerification: {\n    sendVerificationEmail: async ({ user, url, token }, request) => {\n      await sendEmail({\n        to: user.email,\n        subject: \"Verify your email address\",\n        text: `Click the link to verify your email: ${url}`,\n      });\n    },\n  },\n});\n```\n\n**Note**: The `url` parameter contains the full verification link. The `token` is available if you need to build a custom verification URL.\n\n### Requiring Email Verification\n\nFor stricter security, enable `emailAndPassword.requireEmailVerification` to block sign-in until the user verifies their email. When enabled, unverified users will receive a new verification email on each sign-in attempt.\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    requireEmailVerification: true,\n  },\n});\n```\n\n**Note**: This requires `sendVerificationEmail` to be configured and only applies to email\u002Fpassword sign-ins.\n\n## Client side validation\n\nWhile Better Auth validates inputs server-side, implementing client-side validation is still recommended for two key reasons:\n\n1. **Improved UX**: Users receive immediate feedback when inputs don't meet requirements, rather than waiting for a server round-trip.\n2. **Reduced server load**: Invalid requests are caught early, minimizing unnecessary network traffic to your auth server.\n\n## Callback URLs\n\nAlways use absolute URLs (including the origin) for callback URLs in sign-up and sign-in requests. This prevents Better Auth from needing to infer the origin, which can cause issues when your backend and frontend are on different domains.\n\n```ts\nconst { data, error } = await authClient.signUp.email({\n  callbackURL: \"https:\u002F\u002Fexample.com\u002Fcallback\", \u002F\u002F absolute URL with origin\n});\n```\n\n## Password Reset Flows\n\nPassword reset flows are essential to any email\u002Fpassword system, we recommend setting this up.\n\nTo allow users to reset a password first you need to provide `sendResetPassword` function to the email and password authenticator.\n\n```ts\nimport { betterAuth } from \"better-auth\";\nimport { sendEmail } from \".\u002Femail\"; \u002F\u002F your email sending function\n\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    \u002F\u002F Custom email sending function to send reset-password email\n    sendResetPassword: async ({ user, url, token }, request) => {\n      void sendEmail({\n        to: user.email,\n        subject: \"Reset your password\",\n        text: `Click the link to reset your password: ${url}`,\n      });\n    },\n    \u002F\u002F Optional event hook\n    onPasswordReset: async ({ user }, request) => {\n      \u002F\u002F your logic here\n      console.log(`Password for user ${user.email} has been reset.`);\n    },\n  },\n});\n```\n\n### Security considerations\n\nBetter Auth implements several security measures in the password reset flow:\n\n#### Timing attack prevention\n\n- **Background email sending**: Better Auth uses `runInBackgroundOrAwait` internally to send reset emails without blocking the response. This prevents attackers from measuring response times to determine if an email exists.\n- **Dummy operations on invalid requests**: When a user is not found, Better Auth still performs token generation and a database lookup (with a dummy value) to maintain consistent response times.\n- **Constant response message**: The API always returns \"If this email exists in our system, check your email for the reset link\" regardless of whether the user exists.\n\nOn serverless platforms, configure a background task handler to ensure emails are sent reliably:\n\n```ts\nexport const auth = betterAuth({\n  advanced: {\n    backgroundTasks: {\n      handler: (promise) => {\n        \u002F\u002F Use platform-specific methods like waitUntil\n        waitUntil(promise);\n      },\n    },\n  },\n});\n```\n\n#### Token security\n\n- **Cryptographically random tokens**: Reset tokens are generated using `generateId(24)`, producing a 24-character alphanumeric string (a-z, A-Z, 0-9) with high entropy.\n- **Token expiration**: Tokens expire after **1 hour** by default. Configure with `resetPasswordTokenExpiresIn` (in seconds):\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    resetPasswordTokenExpiresIn: 60 * 30, \u002F\u002F 30 minutes\n  },\n});\n```\n\n- **Single-use tokens**: Tokens are deleted immediately after successful password reset, preventing reuse.\n\n#### Session revocation\n\nEnable `revokeSessionsOnPasswordReset` to invalidate all existing sessions when a password is reset. This ensures that if an attacker has an active session, it will be terminated:\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    revokeSessionsOnPasswordReset: true,\n  },\n});\n```\n\n#### Redirect URL validation\n\nThe `redirectTo` parameter is validated against your `trustedOrigins` configuration to prevent open redirect attacks. Malicious redirect URLs will be rejected with a 403 error.\n\n#### Password requirements\n\nDuring password reset, the new password must meet length requirements:\n- **Minimum**: 8 characters (default), configurable via `minPasswordLength`\n- **Maximum**: 128 characters (default), configurable via `maxPasswordLength`\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    minPasswordLength: 12,\n    maxPasswordLength: 256,\n  },\n});\n```\n\n### Sending the password reset\n\nOnce the password reset configurations are set-up, you can now call the `requestPasswordReset` function to send reset password link to user. If the user exists, it will trigger the `sendResetPassword` function you provided in the auth config.\n\n```ts\nconst data = await auth.api.requestPasswordReset({\n  body: {\n    email: \"john.doe@example.com\", \u002F\u002F required\n    redirectTo: \"https:\u002F\u002Fexample.com\u002Freset-password\",\n  },\n});\n```\n\nOr authClient:\n\n```ts\nconst { data, error } = await authClient.requestPasswordReset({\n  email: \"john.doe@example.com\", \u002F\u002F required\n  redirectTo: \"https:\u002F\u002Fexample.com\u002Freset-password\",\n});\n```\n\n**Note**: While the `email` is required, we also recommend configuring the `redirectTo` for a smoother user experience.\n\n## Password Hashing\n\nBetter Auth uses `scrypt` by default for password hashing. This is a solid choice because:\n\n- It's designed to be slow and memory-intensive, making brute-force attacks costly\n- It's natively supported by Node.js (no external dependencies)\n- OWASP recommends it when Argon2id isn't available\n\n### Custom Hashing Algorithm\n\nTo use a different algorithm (e.g., Argon2id), provide custom `hash` and `verify` functions in the `emailAndPassword.password` configuration:\n\n```ts\nimport { betterAuth } from \"better-auth\";\nimport { hash, verify, type Options } from \"@node-rs\u002Fargon2\";\n\nconst argon2Options: Options = {\n  memoryCost: 65536, \u002F\u002F 64 MiB\n  timeCost: 3, \u002F\u002F 3 iterations\n  parallelism: 4, \u002F\u002F 4 parallel lanes\n  outputLen: 32, \u002F\u002F 32 byte output\n  algorithm: 2, \u002F\u002F Argon2id variant\n};\n\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    password: {\n      hash: (password) => hash(password, argon2Options),\n      verify: ({ password, hash: storedHash }) =>\n        verify(storedHash, password, argon2Options),\n    },\n  },\n});\n```\n\n**Note**: If you switch hashing algorithms on an existing system, users with passwords hashed using the old algorithm won't be able to sign in. Plan a migration strategy if needed.\n","## Email Verification Setup\n\nWhen enabling email\u002Fpassword authentication, configure `emailVerification.sendVerificationEmail` to verify user email addresses. This helps prevent fake sign-ups and ensures users have access to the email they registered with.\n\n```ts\nimport { betterAuth } from \"better-auth\";\nimport { sendEmail } from \".\u002Femail\"; \u002F\u002F your email sending function\n\nexport const auth = betterAuth({\n  emailVerification: {\n    sendVerificationEmail: async ({ user, url, token }, request) => {\n      await sendEmail({\n        to: user.email,\n        subject: \"Verify your email address\",\n        text: `Click the link to verify your email: ${url}`,\n      });\n    },\n  },\n});\n```\n\n**Note**: The `url` parameter contains the full verification link. The `token` is available if you need to build a custom verification URL.\n\n### Requiring Email Verification\n\nFor stricter security, enable `emailAndPassword.requireEmailVerification` to block sign-in until the user verifies their email. When enabled, unverified users will receive a new verification email on each sign-in attempt.\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    requireEmailVerification: true,\n  },\n});\n```\n\n**Note**: This requires `sendVerificationEmail` to be configured and only applies to email\u002Fpassword sign-ins.\n\n## Client side validation\n\nWhile Better Auth validates inputs server-side, implementing client-side validation is still recommended for two key reasons:\n\n1. **Improved UX**: Users receive immediate feedback when inputs don't meet requirements, rather than waiting for a server round-trip.\n2. **Reduced server load**: Invalid requests are caught early, minimizing unnecessary network traffic to your auth server.\n\n## Callback URLs\n\nAlways use absolute URLs (including the origin) for callback URLs in sign-up and sign-in requests. This prevents Better Auth from needing to infer the origin, which can cause issues when your backend and frontend are on different domains.\n\n```ts\nconst { data, error } = await authClient.signUp.email({\n  callbackURL: \"https:\u002F\u002Fexample.com\u002Fcallback\", \u002F\u002F absolute URL with origin\n});\n```\n\n## Password Reset Flows\n\nPassword reset flows are essential to any email\u002Fpassword system, we recommend setting this up.\n\nTo allow users to reset a password first you need to provide `sendResetPassword` function to the email and password authenticator.\n\n```ts\nimport { betterAuth } from \"better-auth\";\nimport { sendEmail } from \".\u002Femail\"; \u002F\u002F your email sending function\n\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    \u002F\u002F Custom email sending function to send reset-password email\n    sendResetPassword: async ({ user, url, token }, request) => {\n      void sendEmail({\n        to: user.email,\n        subject: \"Reset your password\",\n        text: `Click the link to reset your password: ${url}`,\n      });\n    },\n    \u002F\u002F Optional event hook\n    onPasswordReset: async ({ user }, request) => {\n      \u002F\u002F your logic here\n      console.log(`Password for user ${user.email} has been reset.`);\n    },\n  },\n});\n```\n\n### Security considerations\n\nBetter Auth implements several security measures in the password reset flow:\n\n#### Timing attack prevention\n\n- **Background email sending**: Better Auth uses `runInBackgroundOrAwait` internally to send reset emails without blocking the response. This prevents attackers from measuring response times to determine if an email exists.\n- **Dummy operations on invalid requests**: When a user is not found, Better Auth still performs token generation and a database lookup (with a dummy value) to maintain consistent response times.\n- **Constant response message**: The API always returns \"If this email exists in our system, check your email for the reset link\" regardless of whether the user exists.\n\nOn serverless platforms, configure a background task handler to ensure emails are sent reliably:\n\n```ts\nexport const auth = betterAuth({\n  advanced: {\n    backgroundTasks: {\n      handler: (promise) => {\n        \u002F\u002F Use platform-specific methods like waitUntil\n        waitUntil(promise);\n      },\n    },\n  },\n});\n```\n\n#### Token security\n\n- **Cryptographically random tokens**: Reset tokens are generated using `generateId(24)`, producing a 24-character alphanumeric string (a-z, A-Z, 0-9) with high entropy.\n- **Token expiration**: Tokens expire after **1 hour** by default. Configure with `resetPasswordTokenExpiresIn` (in seconds):\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    resetPasswordTokenExpiresIn: 60 * 30, \u002F\u002F 30 minutes\n  },\n});\n```\n\n- **Single-use tokens**: Tokens are deleted immediately after successful password reset, preventing reuse.\n\n#### Session revocation\n\nEnable `revokeSessionsOnPasswordReset` to invalidate all existing sessions when a password is reset. This ensures that if an attacker has an active session, it will be terminated:\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    revokeSessionsOnPasswordReset: true,\n  },\n});\n```\n\n#### Redirect URL validation\n\nThe `redirectTo` parameter is validated against your `trustedOrigins` configuration to prevent open redirect attacks. Malicious redirect URLs will be rejected with a 403 error.\n\n#### Password requirements\n\nDuring password reset, the new password must meet length requirements:\n- **Minimum**: 8 characters (default), configurable via `minPasswordLength`\n- **Maximum**: 128 characters (default), configurable via `maxPasswordLength`\n\n```ts\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    minPasswordLength: 12,\n    maxPasswordLength: 256,\n  },\n});\n```\n\n### Sending the password reset\n\nOnce the password reset configurations are set-up, you can now call the `requestPasswordReset` function to send reset password link to user. If the user exists, it will trigger the `sendResetPassword` function you provided in the auth config.\n\n```ts\nconst data = await auth.api.requestPasswordReset({\n  body: {\n    email: \"john.doe@example.com\", \u002F\u002F required\n    redirectTo: \"https:\u002F\u002Fexample.com\u002Freset-password\",\n  },\n});\n```\n\nOr authClient:\n\n```ts\nconst { data, error } = await authClient.requestPasswordReset({\n  email: \"john.doe@example.com\", \u002F\u002F required\n  redirectTo: \"https:\u002F\u002Fexample.com\u002Freset-password\",\n});\n```\n\n**Note**: While the `email` is required, we also recommend configuring the `redirectTo` for a smoother user experience.\n\n## Password Hashing\n\nBetter Auth uses `scrypt` by default for password hashing. This is a solid choice because:\n\n- It's designed to be slow and memory-intensive, making brute-force attacks costly\n- It's natively supported by Node.js (no external dependencies)\n- OWASP recommends it when Argon2id isn't available\n\n### Custom Hashing Algorithm\n\nTo use a different algorithm (e.g., Argon2id), provide custom `hash` and `verify` functions in the `emailAndPassword.password` configuration:\n\n```ts\nimport { betterAuth } from \"better-auth\";\nimport { hash, verify, type Options } from \"@node-rs\u002Fargon2\";\n\nconst argon2Options: Options = {\n  memoryCost: 65536, \u002F\u002F 64 MiB\n  timeCost: 3, \u002F\u002F 3 iterations\n  parallelism: 4, \u002F\u002F 4 parallel lanes\n  outputLen: 32, \u002F\u002F 32 byte output\n  algorithm: 2, \u002F\u002F Argon2id variant\n};\n\nexport const auth = betterAuth({\n  emailAndPassword: {\n    enabled: true,\n    password: {\n      hash: (password) => hash(password, argon2Options),\n      verify: ({ password, hash: storedHash }) =>\n        verify(storedHash, password, argon2Options),\n    },\n  },\n});\n```\n\n**Note**: If you switch hashing algorithms on an existing system, users with passwords hashed using the old algorithm won't be able to sign in. Plan a migration strategy if needed.\n",{"name":5,"description":7},"main","3934845b800ff514cb89eb81d43f3dc4cbf51ff2","packages\u002Fauth-security\u002Fskills\u002Femail-and-password-best-practices","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI","https:\u002F\u002Fgithub.com\u002Fsarthchawla","there ain't no problem i can't solve","2026-10-23 01:26:57",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add sarthchawla\u002FSetupMyAI --skill email-and-password-best-practices",{"tool":62,"command":63},"bunx","bunx skills add sarthchawla\u002FSetupMyAI --skill email-and-password-best-practices",{"tool":65,"command":66},"pnpm","pnpm dlx skills add sarthchawla\u002FSetupMyAI --skill email-and-password-best-practices","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Fpackages\u002Fauth-security\u002Fskills\u002Femail-and-password-best-practices\u002FSKILL.md",true,[],[71,82,97,106,116,136],{"skillNo":72,"name":73,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":79,"publishedAt":44},"01M6P8953HNC422WFQSPP2FMQE","sample-skill","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fmock-repo\u002F.claude\u002Fskills\u002Fsample-skill\u002FSKILL.md",[76],{"categoryNo":77,"categoryName":78,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[80,81],"sample","sample skill",{"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":88,"publishedAt":44},"01M6P8924ZSDAZ88Y5Q9P3KAQV","synthetic-review-candidate","Candidate for smoke testing an evaluation runner only.","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Fscripts\u002Fskill-eval\u002Ffixtures\u002Fcandidate\u002FSKILL.md",[],[89,90,91,38,92,93,94,95,96,29],"synthetic review candidate","candidate","synthetic","only","testing","Evaluation","smoke","runner",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":44},"01M6P88FEGGNH8EZY0PDHD9KQA","synthetic-review-baseline","Baseline for smoke testing an evaluation runner only.","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Fscripts\u002Fskill-eval\u002Ffixtures\u002Fbaseline\u002FSKILL.md",[],[104,91,105,38,95,96,29,92,93,94],"synthetic review baseline","baseline",{"skillNo":107,"name":38,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":44},"01M6P87ZXVEHRM860960DB5FEQ","Run the existing user-invoked review bundle and independently adjudicate its findings.","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Fpackages\u002Funiversal\u002Fskills\u002Freview\u002FSKILL.md",[],[38,112,113,114,115],"run","user","bundle","Existing",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":44},"01M6P87FC73MZTRB6ZBP4GR1VQ","review-adjudication","Verify generated or human review findings before fixing, defending, replying, resolving, or reusing them as learned guidance. Use within a review, review-comment fix, monitor, or readiness workflow.","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Fpackages\u002Funiversal\u002Fskills\u002Freview-adjudication\u002FSKILL.md",[],[123,38,124,125,126,127,128,129,130,131,132,133,37,134,135],"review adjudication","workflow","generated","human review","guidance","human","as","readiness","learned","review findings","fix","verify","monitor",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":44},"01M6P871Q44KQES293T60JQETA","monitor-mr","Monitor review findings and CI using the shared adjudication procedure.","https:\u002F\u002Fgithub.com\u002Fsarthchawla\u002FSetupMyAI\u002Fblob\u002Fmain\u002Fpackages\u002Funiversal\u002Fskills\u002Fmonitor-mr\u002FSKILL.md",[],[135,143,144,132,145,146,38],"mr","monitor mr","shared","ci"]