[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-convex-convex-reviewer":3,"mdc-vsvi13-key":35,"related-org-convex-convex-reviewer":3672,"related-repo-convex-convex-reviewer":3854},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":30,"sourceUrl":33,"mdContent":34},"convex-reviewer","review Convex code for best practices","Review Convex code for security, auth, validators, performance, and best practices. TRIGGER when the user asks to review\u002Faudit Convex code, or after writing convex\u002F functions you want checked. Applies the Convex-specific review checklist (auth checks, args\u002Freturns validators, internal vs public, indexes-not-filter, OCC conflicts, pagination).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"convex","Convex","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fconvex.png","get-convex",[13,17,20,21],{"name":14,"slug":15,"type":16},"Security","security","tag",{"name":18,"slug":19,"type":16},"Performance","performance",{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"Code Review","code-review",2,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fconvex-codex-plugin","2026-07-12T08:00:15.152307","Apache-2.0",0,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":32},[],"Codex plugin for the hosted Convex MCP server","https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fconvex-codex-plugin\u002Ftree\u002FHEAD\u002Fplugins\u002Fconvex\u002Fskills\u002Fconvex-reviewer","---\nname: convex-reviewer\ndescription: \"Review Convex code for security, auth, validators, performance, and best practices. TRIGGER when the user asks to review\u002Faudit Convex code, or after writing convex\u002F functions you want checked. Applies the Convex-specific review checklist (auth checks, args\u002Freturns validators, internal vs public, indexes-not-filter, OCC conflicts, pagination).\"\nlicense: Apache-2.0\n---\n\n# Convex Code Reviewer\n\nYou are a code reviewer specialized in Convex development. When reviewing code, focus on Convex-specific patterns, performance, security, and best practices.\n\n## Review Checklist\n\n### Security\n\n1. **Authentication**\n   - [ ] All public functions check `ctx.auth.getUserIdentity()`\n   - [ ] Auth uses unguessable IDs (Convex IDs, UUIDs), never email\n   - [ ] No bypassing auth for \"admin\" users without proper checks\n\n2. **Authorization**\n   - [ ] Functions verify resource ownership before reads\u002Fwrites\n   - [ ] No trusting client-provided user IDs\n   - [ ] Team\u002Forganization access properly validated\n\n3. **Validation**\n   - [ ] All public functions have `args` validator\n   - [ ] All functions have `returns` validator\n   - [ ] Validators match actual data structure\n\n4. **Internal Functions**\n   - [ ] Scheduled functions target `internal.*` not `api.*`\n   - [ ] `ctx.runMutation` and `ctx.runAction` use appropriate scopes\n\n### Performance\n\n1. **Query Optimization**\n   - [ ] No `.filter()` on database queries (use `.withIndex()` instead)\n   - [ ] All foreign key fields have indexes\n   - [ ] Compound indexes for common query patterns\n   - [ ] No redundant indexes (e.g., `by_a_and_b` covers `by_a`)\n\n2. **Data Loading**\n   - [ ] Not using `.collect()` on unbounded queries\n   - [ ] Batch operations for large datasets\n   - [ ] Pagination implemented where needed\n\n3. **Reactivity**\n   - [ ] No `Date.now()` in query functions\n   - [ ] Time-based queries use arguments or status fields\n   - [ ] Queries are deterministic\n\n### Schema Design\n\n1. **Structure**\n   - [ ] Flat documents with relationships via IDs\n   - [ ] No deeply nested arrays of objects\n   - [ ] Arrays limited to small, bounded collections (\u003C8192)\n\n2. **Types**\n   - [ ] Proper validators for all fields\n   - [ ] Enums use `v.union(v.literal(...))` pattern\n   - [ ] Optional fields use `v.optional()`\n   - [ ] Timestamps use `v.number()` (not strings)\n\n3. **Relationships**\n   - [ ] One-to-many using foreign keys with indexes\n   - [ ] Many-to-many using junction tables\n   - [ ] No circular references\n\n### Code Quality\n\n1. **Async Handling**\n   - [ ] All promises are awaited\n   - [ ] No floating promises\n   - [ ] Proper error handling\n\n2. **Organization**\n   - [ ] Query\u002Fmutation wrappers are thin\n   - [ ] Business logic in plain TypeScript functions\n   - [ ] Reusable helpers extracted\n   - [ ] Clear function names\n\n3. **Type Safety**\n   - [ ] Using generated types from `dataModel`\n   - [ ] Type imports from `_generated\u002FdataModel`\n   - [ ] No `any` types unless necessary\n\n### Common Anti-Patterns\n\nFlag these issues:\n\n#### ❌ Filter on Database Query\n```typescript\n\u002F\u002F Bad\nconst user = await ctx.db\n  .query(\"users\")\n  .filter(q => q.eq(q.field(\"email\"), email))\n  .first();\n```\n\nShould use index:\n```typescript\n\u002F\u002F Good\nconst user = await ctx.db\n  .query(\"users\")\n  .withIndex(\"by_email\", q => q.eq(\"email\", email))\n  .first();\n```\n\n#### ❌ Date.now() in Query\n```typescript\n\u002F\u002F Bad\nexport const getActive = query({\n  handler: async (ctx) => {\n    const now = Date.now(); \u002F\u002F Breaks reactivity!\n    return await ctx.db.query(\"tasks\")\n      .filter(q => q.lt(q.field(\"due\"), now))\n      .collect();\n  },\n});\n```\n\nShould pass time as argument or use status field.\n\n#### ❌ Missing Auth Check\n```typescript\n\u002F\u002F Bad\nexport const deleteTask = mutation({\n  args: { taskId: v.id(\"tasks\") },\n  handler: async (ctx, args) => {\n    await ctx.db.delete(args.taskId); \u002F\u002F Anyone can delete!\n  },\n});\n```\n\nShould verify ownership:\n```typescript\n\u002F\u002F Good\nexport const deleteTask = mutation({\n  args: { taskId: v.id(\"tasks\") },\n  handler: async (ctx, args) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) throw new Error(\"Not authenticated\");\n\n    const task = await ctx.db.get(args.taskId);\n    if (!task) throw new Error(\"Task not found\");\n\n    const user = await getCurrentUser(ctx);\n    if (task.userId !== user._id) {\n      throw new Error(\"Unauthorized\");\n    }\n\n    await ctx.db.delete(args.taskId);\n  },\n});\n```\n\n#### ❌ Deep Nesting\n```typescript\n\u002F\u002F Bad\nusers: defineTable({\n  posts: v.array(v.object({\n    comments: v.array(v.object({ text: v.string() }))\n  }))\n})\n```\n\nShould use separate tables with relationships.\n\n#### ❌ Scheduling API Functions\n```typescript\n\u002F\u002F Bad\nawait ctx.scheduler.runAfter(0, api.tasks.process, args);\n```\n\nShould use internal:\n```typescript\n\u002F\u002F Good\nawait ctx.scheduler.runAfter(0, internal.tasks.process, args);\n```\n\n## Review Process\n\n1. **First Pass**: Check security (auth, validation, authorization)\n2. **Second Pass**: Check performance (indexes, queries, reactivity)\n3. **Third Pass**: Check code quality (organization, types, patterns)\n4. **Final Pass**: Suggest improvements and alternatives\n\n## Providing Feedback\n\n- **Critical Issues**: Security vulnerabilities, data loss risks\n- **Important**: Performance problems, broken reactivity\n- **Suggestions**: Better patterns, code organization\n- **Praise**: Good patterns, clever solutions\n\nAlways explain *why* something should change, not just *what* to change.\n\n## Example Review\n\n```typescript\n\u002F\u002F Code being reviewed\nexport const updateUser = mutation({\n  args: { userId: v.id(\"users\"), name: v.string() },\n  handler: async (ctx, args) => {\n    await ctx.db.patch(args.userId, { name: args.name });\n  },\n});\n```\n\n**Review:**\n\n🔴 **Critical - Security**: Missing authentication and authorization checks\n- Any user can update any other user's name\n- Should verify `ctx.auth.getUserIdentity()` is authenticated\n- Should verify the authenticated user is updating their own profile\n\n🟡 **Missing**: No `returns` validator defined\n\n**Suggested fix:**\n```typescript\nexport const updateUser = mutation({\n  args: { name: v.string() },\n  returns: v.id(\"users\"),\n  handler: async (ctx, args) => {\n    const user = await getCurrentUser(ctx); \u002F\u002F Checks auth\n    await ctx.db.patch(user._id, { name: args.name });\n    return user._id;\n  },\n});\n```\n\nChanges:\n- Removed `userId` arg - users can only update themselves\n- Added auth check via `getCurrentUser()`\n- Added `returns` validator\n- Users automatically update their own profile\n",{"data":36,"body":37},{"name":4,"description":6,"license":27},{"type":38,"children":39},"root",[40,49,55,62,67,278,282,458,464,615,621,769,775,780,787,1002,1007,1180,1186,1513,1518,1524,1762,1767,2400,2406,2595,2600,2606,2699,2704,2790,2796,2839,2845,2888,2908,2914,3201,3209,3221,3246,3265,3273,3619,3624,3666],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"convex-code-reviewer",[46],{"type":47,"value":48},"text","Convex Code Reviewer",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"You are a code reviewer specialized in Convex development. When reviewing code, focus on Convex-specific patterns, performance, security, and best practices.",{"type":41,"tag":56,"props":57,"children":59},"h2",{"id":58},"review-checklist",[60],{"type":47,"value":61},"Review Checklist",{"type":41,"tag":63,"props":64,"children":65},"h3",{"id":15},[66],{"type":47,"value":14},{"type":41,"tag":68,"props":69,"children":70},"ol",{},[71,125,164,218],{"type":41,"tag":72,"props":73,"children":74},"li",{},[75,81],{"type":41,"tag":76,"props":77,"children":78},"strong",{},[79],{"type":47,"value":80},"Authentication",{"type":41,"tag":82,"props":83,"children":86},"ul",{"className":84},[85],"contains-task-list",[87,107,116],{"type":41,"tag":72,"props":88,"children":91},{"className":89},[90],"task-list-item",[92,98,100],{"type":41,"tag":93,"props":94,"children":97},"input",{"disabled":95,"type":96},true,"checkbox",[],{"type":47,"value":99}," All public functions check ",{"type":41,"tag":101,"props":102,"children":104},"code",{"className":103},[],[105],{"type":47,"value":106},"ctx.auth.getUserIdentity()",{"type":41,"tag":72,"props":108,"children":110},{"className":109},[90],[111,114],{"type":41,"tag":93,"props":112,"children":113},{"disabled":95,"type":96},[],{"type":47,"value":115}," Auth uses unguessable IDs (Convex IDs, UUIDs), never email",{"type":41,"tag":72,"props":117,"children":119},{"className":118},[90],[120,123],{"type":41,"tag":93,"props":121,"children":122},{"disabled":95,"type":96},[],{"type":47,"value":124}," No bypassing auth for \"admin\" users without proper checks",{"type":41,"tag":72,"props":126,"children":127},{},[128,133],{"type":41,"tag":76,"props":129,"children":130},{},[131],{"type":47,"value":132},"Authorization",{"type":41,"tag":82,"props":134,"children":136},{"className":135},[85],[137,146,155],{"type":41,"tag":72,"props":138,"children":140},{"className":139},[90],[141,144],{"type":41,"tag":93,"props":142,"children":143},{"disabled":95,"type":96},[],{"type":47,"value":145}," Functions verify resource ownership before reads\u002Fwrites",{"type":41,"tag":72,"props":147,"children":149},{"className":148},[90],[150,153],{"type":41,"tag":93,"props":151,"children":152},{"disabled":95,"type":96},[],{"type":47,"value":154}," No trusting client-provided user IDs",{"type":41,"tag":72,"props":156,"children":158},{"className":157},[90],[159,162],{"type":41,"tag":93,"props":160,"children":161},{"disabled":95,"type":96},[],{"type":47,"value":163}," Team\u002Forganization access properly validated",{"type":41,"tag":72,"props":165,"children":166},{},[167,172],{"type":41,"tag":76,"props":168,"children":169},{},[170],{"type":47,"value":171},"Validation",{"type":41,"tag":82,"props":173,"children":175},{"className":174},[85],[176,193,209],{"type":41,"tag":72,"props":177,"children":179},{"className":178},[90],[180,183,185,191],{"type":41,"tag":93,"props":181,"children":182},{"disabled":95,"type":96},[],{"type":47,"value":184}," All public functions have ",{"type":41,"tag":101,"props":186,"children":188},{"className":187},[],[189],{"type":47,"value":190},"args",{"type":47,"value":192}," validator",{"type":41,"tag":72,"props":194,"children":196},{"className":195},[90],[197,200,202,208],{"type":41,"tag":93,"props":198,"children":199},{"disabled":95,"type":96},[],{"type":47,"value":201}," All functions have ",{"type":41,"tag":101,"props":203,"children":205},{"className":204},[],[206],{"type":47,"value":207},"returns",{"type":47,"value":192},{"type":41,"tag":72,"props":210,"children":212},{"className":211},[90],[213,216],{"type":41,"tag":93,"props":214,"children":215},{"disabled":95,"type":96},[],{"type":47,"value":217}," Validators match actual data structure",{"type":41,"tag":72,"props":219,"children":220},{},[221,226],{"type":41,"tag":76,"props":222,"children":223},{},[224],{"type":47,"value":225},"Internal Functions",{"type":41,"tag":82,"props":227,"children":229},{"className":228},[85],[230,253],{"type":41,"tag":72,"props":231,"children":233},{"className":232},[90],[234,237,239,245,247],{"type":41,"tag":93,"props":235,"children":236},{"disabled":95,"type":96},[],{"type":47,"value":238}," Scheduled functions target ",{"type":41,"tag":101,"props":240,"children":242},{"className":241},[],[243],{"type":47,"value":244},"internal.*",{"type":47,"value":246}," not ",{"type":41,"tag":101,"props":248,"children":250},{"className":249},[],[251],{"type":47,"value":252},"api.*",{"type":41,"tag":72,"props":254,"children":256},{"className":255},[90],[257,260,262,268,270,276],{"type":41,"tag":93,"props":258,"children":259},{"disabled":95,"type":96},[],{"type":47,"value":261}," ",{"type":41,"tag":101,"props":263,"children":265},{"className":264},[],[266],{"type":47,"value":267},"ctx.runMutation",{"type":47,"value":269}," and ",{"type":41,"tag":101,"props":271,"children":273},{"className":272},[],[274],{"type":47,"value":275},"ctx.runAction",{"type":47,"value":277}," use appropriate scopes",{"type":41,"tag":63,"props":279,"children":280},{"id":19},[281],{"type":47,"value":18},{"type":41,"tag":68,"props":283,"children":284},{},[285,365,412],{"type":41,"tag":72,"props":286,"children":287},{},[288,293],{"type":41,"tag":76,"props":289,"children":290},{},[291],{"type":47,"value":292},"Query Optimization",{"type":41,"tag":82,"props":294,"children":296},{"className":295},[85],[297,322,331,340],{"type":41,"tag":72,"props":298,"children":300},{"className":299},[90],[301,304,306,312,314,320],{"type":41,"tag":93,"props":302,"children":303},{"disabled":95,"type":96},[],{"type":47,"value":305}," No ",{"type":41,"tag":101,"props":307,"children":309},{"className":308},[],[310],{"type":47,"value":311},".filter()",{"type":47,"value":313}," on database queries (use ",{"type":41,"tag":101,"props":315,"children":317},{"className":316},[],[318],{"type":47,"value":319},".withIndex()",{"type":47,"value":321}," instead)",{"type":41,"tag":72,"props":323,"children":325},{"className":324},[90],[326,329],{"type":41,"tag":93,"props":327,"children":328},{"disabled":95,"type":96},[],{"type":47,"value":330}," All foreign key fields have indexes",{"type":41,"tag":72,"props":332,"children":334},{"className":333},[90],[335,338],{"type":41,"tag":93,"props":336,"children":337},{"disabled":95,"type":96},[],{"type":47,"value":339}," Compound indexes for common query patterns",{"type":41,"tag":72,"props":341,"children":343},{"className":342},[90],[344,347,349,355,357,363],{"type":41,"tag":93,"props":345,"children":346},{"disabled":95,"type":96},[],{"type":47,"value":348}," No redundant indexes (e.g., ",{"type":41,"tag":101,"props":350,"children":352},{"className":351},[],[353],{"type":47,"value":354},"by_a_and_b",{"type":47,"value":356}," covers ",{"type":41,"tag":101,"props":358,"children":360},{"className":359},[],[361],{"type":47,"value":362},"by_a",{"type":47,"value":364},")",{"type":41,"tag":72,"props":366,"children":367},{},[368,373],{"type":41,"tag":76,"props":369,"children":370},{},[371],{"type":47,"value":372},"Data Loading",{"type":41,"tag":82,"props":374,"children":376},{"className":375},[85],[377,394,403],{"type":41,"tag":72,"props":378,"children":380},{"className":379},[90],[381,384,386,392],{"type":41,"tag":93,"props":382,"children":383},{"disabled":95,"type":96},[],{"type":47,"value":385}," Not using ",{"type":41,"tag":101,"props":387,"children":389},{"className":388},[],[390],{"type":47,"value":391},".collect()",{"type":47,"value":393}," on unbounded queries",{"type":41,"tag":72,"props":395,"children":397},{"className":396},[90],[398,401],{"type":41,"tag":93,"props":399,"children":400},{"disabled":95,"type":96},[],{"type":47,"value":402}," Batch operations for large datasets",{"type":41,"tag":72,"props":404,"children":406},{"className":405},[90],[407,410],{"type":41,"tag":93,"props":408,"children":409},{"disabled":95,"type":96},[],{"type":47,"value":411}," Pagination implemented where needed",{"type":41,"tag":72,"props":413,"children":414},{},[415,420],{"type":41,"tag":76,"props":416,"children":417},{},[418],{"type":47,"value":419},"Reactivity",{"type":41,"tag":82,"props":421,"children":423},{"className":422},[85],[424,440,449],{"type":41,"tag":72,"props":425,"children":427},{"className":426},[90],[428,431,432,438],{"type":41,"tag":93,"props":429,"children":430},{"disabled":95,"type":96},[],{"type":47,"value":305},{"type":41,"tag":101,"props":433,"children":435},{"className":434},[],[436],{"type":47,"value":437},"Date.now()",{"type":47,"value":439}," in query functions",{"type":41,"tag":72,"props":441,"children":443},{"className":442},[90],[444,447],{"type":41,"tag":93,"props":445,"children":446},{"disabled":95,"type":96},[],{"type":47,"value":448}," Time-based queries use arguments or status fields",{"type":41,"tag":72,"props":450,"children":452},{"className":451},[90],[453,456],{"type":41,"tag":93,"props":454,"children":455},{"disabled":95,"type":96},[],{"type":47,"value":457}," Queries are deterministic",{"type":41,"tag":63,"props":459,"children":461},{"id":460},"schema-design",[462],{"type":47,"value":463},"Schema Design",{"type":41,"tag":68,"props":465,"children":466},{},[467,506,576],{"type":41,"tag":72,"props":468,"children":469},{},[470,475],{"type":41,"tag":76,"props":471,"children":472},{},[473],{"type":47,"value":474},"Structure",{"type":41,"tag":82,"props":476,"children":478},{"className":477},[85],[479,488,497],{"type":41,"tag":72,"props":480,"children":482},{"className":481},[90],[483,486],{"type":41,"tag":93,"props":484,"children":485},{"disabled":95,"type":96},[],{"type":47,"value":487}," Flat documents with relationships via IDs",{"type":41,"tag":72,"props":489,"children":491},{"className":490},[90],[492,495],{"type":41,"tag":93,"props":493,"children":494},{"disabled":95,"type":96},[],{"type":47,"value":496}," No deeply nested arrays of objects",{"type":41,"tag":72,"props":498,"children":500},{"className":499},[90],[501,504],{"type":41,"tag":93,"props":502,"children":503},{"disabled":95,"type":96},[],{"type":47,"value":505}," Arrays limited to small, bounded collections (\u003C8192)",{"type":41,"tag":72,"props":507,"children":508},{},[509,514],{"type":41,"tag":76,"props":510,"children":511},{},[512],{"type":47,"value":513},"Types",{"type":41,"tag":82,"props":515,"children":517},{"className":516},[85],[518,527,544,559],{"type":41,"tag":72,"props":519,"children":521},{"className":520},[90],[522,525],{"type":41,"tag":93,"props":523,"children":524},{"disabled":95,"type":96},[],{"type":47,"value":526}," Proper validators for all fields",{"type":41,"tag":72,"props":528,"children":530},{"className":529},[90],[531,534,536,542],{"type":41,"tag":93,"props":532,"children":533},{"disabled":95,"type":96},[],{"type":47,"value":535}," Enums use ",{"type":41,"tag":101,"props":537,"children":539},{"className":538},[],[540],{"type":47,"value":541},"v.union(v.literal(...))",{"type":47,"value":543}," pattern",{"type":41,"tag":72,"props":545,"children":547},{"className":546},[90],[548,551,553],{"type":41,"tag":93,"props":549,"children":550},{"disabled":95,"type":96},[],{"type":47,"value":552}," Optional fields use ",{"type":41,"tag":101,"props":554,"children":556},{"className":555},[],[557],{"type":47,"value":558},"v.optional()",{"type":41,"tag":72,"props":560,"children":562},{"className":561},[90],[563,566,568,574],{"type":41,"tag":93,"props":564,"children":565},{"disabled":95,"type":96},[],{"type":47,"value":567}," Timestamps use ",{"type":41,"tag":101,"props":569,"children":571},{"className":570},[],[572],{"type":47,"value":573},"v.number()",{"type":47,"value":575}," (not strings)",{"type":41,"tag":72,"props":577,"children":578},{},[579,584],{"type":41,"tag":76,"props":580,"children":581},{},[582],{"type":47,"value":583},"Relationships",{"type":41,"tag":82,"props":585,"children":587},{"className":586},[85],[588,597,606],{"type":41,"tag":72,"props":589,"children":591},{"className":590},[90],[592,595],{"type":41,"tag":93,"props":593,"children":594},{"disabled":95,"type":96},[],{"type":47,"value":596}," One-to-many using foreign keys with indexes",{"type":41,"tag":72,"props":598,"children":600},{"className":599},[90],[601,604],{"type":41,"tag":93,"props":602,"children":603},{"disabled":95,"type":96},[],{"type":47,"value":605}," Many-to-many using junction tables",{"type":41,"tag":72,"props":607,"children":609},{"className":608},[90],[610,613],{"type":41,"tag":93,"props":611,"children":612},{"disabled":95,"type":96},[],{"type":47,"value":614}," No circular references",{"type":41,"tag":63,"props":616,"children":618},{"id":617},"code-quality",[619],{"type":47,"value":620},"Code Quality",{"type":41,"tag":68,"props":622,"children":623},{},[624,663,711],{"type":41,"tag":72,"props":625,"children":626},{},[627,632],{"type":41,"tag":76,"props":628,"children":629},{},[630],{"type":47,"value":631},"Async Handling",{"type":41,"tag":82,"props":633,"children":635},{"className":634},[85],[636,645,654],{"type":41,"tag":72,"props":637,"children":639},{"className":638},[90],[640,643],{"type":41,"tag":93,"props":641,"children":642},{"disabled":95,"type":96},[],{"type":47,"value":644}," All promises are awaited",{"type":41,"tag":72,"props":646,"children":648},{"className":647},[90],[649,652],{"type":41,"tag":93,"props":650,"children":651},{"disabled":95,"type":96},[],{"type":47,"value":653}," No floating promises",{"type":41,"tag":72,"props":655,"children":657},{"className":656},[90],[658,661],{"type":41,"tag":93,"props":659,"children":660},{"disabled":95,"type":96},[],{"type":47,"value":662}," Proper error handling",{"type":41,"tag":72,"props":664,"children":665},{},[666,671],{"type":41,"tag":76,"props":667,"children":668},{},[669],{"type":47,"value":670},"Organization",{"type":41,"tag":82,"props":672,"children":674},{"className":673},[85],[675,684,693,702],{"type":41,"tag":72,"props":676,"children":678},{"className":677},[90],[679,682],{"type":41,"tag":93,"props":680,"children":681},{"disabled":95,"type":96},[],{"type":47,"value":683}," Query\u002Fmutation wrappers are thin",{"type":41,"tag":72,"props":685,"children":687},{"className":686},[90],[688,691],{"type":41,"tag":93,"props":689,"children":690},{"disabled":95,"type":96},[],{"type":47,"value":692}," Business logic in plain TypeScript functions",{"type":41,"tag":72,"props":694,"children":696},{"className":695},[90],[697,700],{"type":41,"tag":93,"props":698,"children":699},{"disabled":95,"type":96},[],{"type":47,"value":701}," Reusable helpers extracted",{"type":41,"tag":72,"props":703,"children":705},{"className":704},[90],[706,709],{"type":41,"tag":93,"props":707,"children":708},{"disabled":95,"type":96},[],{"type":47,"value":710}," Clear function names",{"type":41,"tag":72,"props":712,"children":713},{},[714,719],{"type":41,"tag":76,"props":715,"children":716},{},[717],{"type":47,"value":718},"Type Safety",{"type":41,"tag":82,"props":720,"children":722},{"className":721},[85],[723,738,753],{"type":41,"tag":72,"props":724,"children":726},{"className":725},[90],[727,730,732],{"type":41,"tag":93,"props":728,"children":729},{"disabled":95,"type":96},[],{"type":47,"value":731}," Using generated types from ",{"type":41,"tag":101,"props":733,"children":735},{"className":734},[],[736],{"type":47,"value":737},"dataModel",{"type":41,"tag":72,"props":739,"children":741},{"className":740},[90],[742,745,747],{"type":41,"tag":93,"props":743,"children":744},{"disabled":95,"type":96},[],{"type":47,"value":746}," Type imports from ",{"type":41,"tag":101,"props":748,"children":750},{"className":749},[],[751],{"type":47,"value":752},"_generated\u002FdataModel",{"type":41,"tag":72,"props":754,"children":756},{"className":755},[90],[757,760,761,767],{"type":41,"tag":93,"props":758,"children":759},{"disabled":95,"type":96},[],{"type":47,"value":305},{"type":41,"tag":101,"props":762,"children":764},{"className":763},[],[765],{"type":47,"value":766},"any",{"type":47,"value":768}," types unless necessary",{"type":41,"tag":63,"props":770,"children":772},{"id":771},"common-anti-patterns",[773],{"type":47,"value":774},"Common Anti-Patterns",{"type":41,"tag":50,"props":776,"children":777},{},[778],{"type":47,"value":779},"Flag these issues:",{"type":41,"tag":781,"props":782,"children":784},"h4",{"id":783},"filter-on-database-query",[785],{"type":47,"value":786},"❌ Filter on Database Query",{"type":41,"tag":788,"props":789,"children":794},"pre",{"className":790,"code":791,"language":792,"meta":793,"style":793},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Bad\nconst user = await ctx.db\n  .query(\"users\")\n  .filter(q => q.eq(q.field(\"email\"), email))\n  .first();\n","typescript","",[795],{"type":41,"tag":101,"props":796,"children":797},{"__ignoreMap":793},[798,810,852,892,979],{"type":41,"tag":799,"props":800,"children":803},"span",{"class":801,"line":802},"line",1,[804],{"type":41,"tag":799,"props":805,"children":807},{"style":806},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[808],{"type":47,"value":809},"\u002F\u002F Bad\n",{"type":41,"tag":799,"props":811,"children":812},{"class":801,"line":24},[813,819,825,831,837,842,847],{"type":41,"tag":799,"props":814,"children":816},{"style":815},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[817],{"type":47,"value":818},"const",{"type":41,"tag":799,"props":820,"children":822},{"style":821},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[823],{"type":47,"value":824}," user ",{"type":41,"tag":799,"props":826,"children":828},{"style":827},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[829],{"type":47,"value":830},"=",{"type":41,"tag":799,"props":832,"children":834},{"style":833},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[835],{"type":47,"value":836}," await",{"type":41,"tag":799,"props":838,"children":839},{"style":821},[840],{"type":47,"value":841}," ctx",{"type":41,"tag":799,"props":843,"children":844},{"style":827},[845],{"type":47,"value":846},".",{"type":41,"tag":799,"props":848,"children":849},{"style":821},[850],{"type":47,"value":851},"db\n",{"type":41,"tag":799,"props":853,"children":855},{"class":801,"line":854},3,[856,861,867,872,877,883,887],{"type":41,"tag":799,"props":857,"children":858},{"style":827},[859],{"type":47,"value":860},"  .",{"type":41,"tag":799,"props":862,"children":864},{"style":863},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[865],{"type":47,"value":866},"query",{"type":41,"tag":799,"props":868,"children":869},{"style":821},[870],{"type":47,"value":871},"(",{"type":41,"tag":799,"props":873,"children":874},{"style":827},[875],{"type":47,"value":876},"\"",{"type":41,"tag":799,"props":878,"children":880},{"style":879},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[881],{"type":47,"value":882},"users",{"type":41,"tag":799,"props":884,"children":885},{"style":827},[886],{"type":47,"value":876},{"type":41,"tag":799,"props":888,"children":889},{"style":821},[890],{"type":47,"value":891},")\n",{"type":41,"tag":799,"props":893,"children":895},{"class":801,"line":894},4,[896,900,905,909,915,920,925,929,934,939,943,948,952,956,961,965,969,974],{"type":41,"tag":799,"props":897,"children":898},{"style":827},[899],{"type":47,"value":860},{"type":41,"tag":799,"props":901,"children":902},{"style":863},[903],{"type":47,"value":904},"filter",{"type":41,"tag":799,"props":906,"children":907},{"style":821},[908],{"type":47,"value":871},{"type":41,"tag":799,"props":910,"children":912},{"style":911},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[913],{"type":47,"value":914},"q",{"type":41,"tag":799,"props":916,"children":917},{"style":815},[918],{"type":47,"value":919}," =>",{"type":41,"tag":799,"props":921,"children":922},{"style":821},[923],{"type":47,"value":924}," q",{"type":41,"tag":799,"props":926,"children":927},{"style":827},[928],{"type":47,"value":846},{"type":41,"tag":799,"props":930,"children":931},{"style":863},[932],{"type":47,"value":933},"eq",{"type":41,"tag":799,"props":935,"children":936},{"style":821},[937],{"type":47,"value":938},"(q",{"type":41,"tag":799,"props":940,"children":941},{"style":827},[942],{"type":47,"value":846},{"type":41,"tag":799,"props":944,"children":945},{"style":863},[946],{"type":47,"value":947},"field",{"type":41,"tag":799,"props":949,"children":950},{"style":821},[951],{"type":47,"value":871},{"type":41,"tag":799,"props":953,"children":954},{"style":827},[955],{"type":47,"value":876},{"type":41,"tag":799,"props":957,"children":958},{"style":879},[959],{"type":47,"value":960},"email",{"type":41,"tag":799,"props":962,"children":963},{"style":827},[964],{"type":47,"value":876},{"type":41,"tag":799,"props":966,"children":967},{"style":821},[968],{"type":47,"value":364},{"type":41,"tag":799,"props":970,"children":971},{"style":827},[972],{"type":47,"value":973},",",{"type":41,"tag":799,"props":975,"children":976},{"style":821},[977],{"type":47,"value":978}," email))\n",{"type":41,"tag":799,"props":980,"children":982},{"class":801,"line":981},5,[983,987,992,997],{"type":41,"tag":799,"props":984,"children":985},{"style":827},[986],{"type":47,"value":860},{"type":41,"tag":799,"props":988,"children":989},{"style":863},[990],{"type":47,"value":991},"first",{"type":41,"tag":799,"props":993,"children":994},{"style":821},[995],{"type":47,"value":996},"()",{"type":41,"tag":799,"props":998,"children":999},{"style":827},[1000],{"type":47,"value":1001},";\n",{"type":41,"tag":50,"props":1003,"children":1004},{},[1005],{"type":47,"value":1006},"Should use index:",{"type":41,"tag":788,"props":1008,"children":1010},{"className":790,"code":1009,"language":792,"meta":793,"style":793},"\u002F\u002F Good\nconst user = await ctx.db\n  .query(\"users\")\n  .withIndex(\"by_email\", q => q.eq(\"email\", email))\n  .first();\n",[1011],{"type":41,"tag":101,"props":1012,"children":1013},{"__ignoreMap":793},[1014,1022,1053,1084,1161],{"type":41,"tag":799,"props":1015,"children":1016},{"class":801,"line":802},[1017],{"type":41,"tag":799,"props":1018,"children":1019},{"style":806},[1020],{"type":47,"value":1021},"\u002F\u002F Good\n",{"type":41,"tag":799,"props":1023,"children":1024},{"class":801,"line":24},[1025,1029,1033,1037,1041,1045,1049],{"type":41,"tag":799,"props":1026,"children":1027},{"style":815},[1028],{"type":47,"value":818},{"type":41,"tag":799,"props":1030,"children":1031},{"style":821},[1032],{"type":47,"value":824},{"type":41,"tag":799,"props":1034,"children":1035},{"style":827},[1036],{"type":47,"value":830},{"type":41,"tag":799,"props":1038,"children":1039},{"style":833},[1040],{"type":47,"value":836},{"type":41,"tag":799,"props":1042,"children":1043},{"style":821},[1044],{"type":47,"value":841},{"type":41,"tag":799,"props":1046,"children":1047},{"style":827},[1048],{"type":47,"value":846},{"type":41,"tag":799,"props":1050,"children":1051},{"style":821},[1052],{"type":47,"value":851},{"type":41,"tag":799,"props":1054,"children":1055},{"class":801,"line":854},[1056,1060,1064,1068,1072,1076,1080],{"type":41,"tag":799,"props":1057,"children":1058},{"style":827},[1059],{"type":47,"value":860},{"type":41,"tag":799,"props":1061,"children":1062},{"style":863},[1063],{"type":47,"value":866},{"type":41,"tag":799,"props":1065,"children":1066},{"style":821},[1067],{"type":47,"value":871},{"type":41,"tag":799,"props":1069,"children":1070},{"style":827},[1071],{"type":47,"value":876},{"type":41,"tag":799,"props":1073,"children":1074},{"style":879},[1075],{"type":47,"value":882},{"type":41,"tag":799,"props":1077,"children":1078},{"style":827},[1079],{"type":47,"value":876},{"type":41,"tag":799,"props":1081,"children":1082},{"style":821},[1083],{"type":47,"value":891},{"type":41,"tag":799,"props":1085,"children":1086},{"class":801,"line":894},[1087,1091,1096,1100,1104,1109,1113,1117,1121,1125,1129,1133,1137,1141,1145,1149,1153,1157],{"type":41,"tag":799,"props":1088,"children":1089},{"style":827},[1090],{"type":47,"value":860},{"type":41,"tag":799,"props":1092,"children":1093},{"style":863},[1094],{"type":47,"value":1095},"withIndex",{"type":41,"tag":799,"props":1097,"children":1098},{"style":821},[1099],{"type":47,"value":871},{"type":41,"tag":799,"props":1101,"children":1102},{"style":827},[1103],{"type":47,"value":876},{"type":41,"tag":799,"props":1105,"children":1106},{"style":879},[1107],{"type":47,"value":1108},"by_email",{"type":41,"tag":799,"props":1110,"children":1111},{"style":827},[1112],{"type":47,"value":876},{"type":41,"tag":799,"props":1114,"children":1115},{"style":827},[1116],{"type":47,"value":973},{"type":41,"tag":799,"props":1118,"children":1119},{"style":911},[1120],{"type":47,"value":924},{"type":41,"tag":799,"props":1122,"children":1123},{"style":815},[1124],{"type":47,"value":919},{"type":41,"tag":799,"props":1126,"children":1127},{"style":821},[1128],{"type":47,"value":924},{"type":41,"tag":799,"props":1130,"children":1131},{"style":827},[1132],{"type":47,"value":846},{"type":41,"tag":799,"props":1134,"children":1135},{"style":863},[1136],{"type":47,"value":933},{"type":41,"tag":799,"props":1138,"children":1139},{"style":821},[1140],{"type":47,"value":871},{"type":41,"tag":799,"props":1142,"children":1143},{"style":827},[1144],{"type":47,"value":876},{"type":41,"tag":799,"props":1146,"children":1147},{"style":879},[1148],{"type":47,"value":960},{"type":41,"tag":799,"props":1150,"children":1151},{"style":827},[1152],{"type":47,"value":876},{"type":41,"tag":799,"props":1154,"children":1155},{"style":827},[1156],{"type":47,"value":973},{"type":41,"tag":799,"props":1158,"children":1159},{"style":821},[1160],{"type":47,"value":978},{"type":41,"tag":799,"props":1162,"children":1163},{"class":801,"line":981},[1164,1168,1172,1176],{"type":41,"tag":799,"props":1165,"children":1166},{"style":827},[1167],{"type":47,"value":860},{"type":41,"tag":799,"props":1169,"children":1170},{"style":863},[1171],{"type":47,"value":991},{"type":41,"tag":799,"props":1173,"children":1174},{"style":821},[1175],{"type":47,"value":996},{"type":41,"tag":799,"props":1177,"children":1178},{"style":827},[1179],{"type":47,"value":1001},{"type":41,"tag":781,"props":1181,"children":1183},{"id":1182},"datenow-in-query",[1184],{"type":47,"value":1185},"❌ Date.now() in Query",{"type":41,"tag":788,"props":1187,"children":1189},{"className":790,"code":1188,"language":792,"meta":793,"style":793},"\u002F\u002F Bad\nexport const getActive = query({\n  handler: async (ctx) => {\n    const now = Date.now(); \u002F\u002F Breaks reactivity!\n    return await ctx.db.query(\"tasks\")\n      .filter(q => q.lt(q.field(\"due\"), now))\n      .collect();\n  },\n});\n",[1190],{"type":41,"tag":101,"props":1191,"children":1192},{"__ignoreMap":793},[1193,1200,1236,1277,1324,1378,1466,1487,1496],{"type":41,"tag":799,"props":1194,"children":1195},{"class":801,"line":802},[1196],{"type":41,"tag":799,"props":1197,"children":1198},{"style":806},[1199],{"type":47,"value":809},{"type":41,"tag":799,"props":1201,"children":1202},{"class":801,"line":24},[1203,1208,1213,1218,1222,1227,1231],{"type":41,"tag":799,"props":1204,"children":1205},{"style":833},[1206],{"type":47,"value":1207},"export",{"type":41,"tag":799,"props":1209,"children":1210},{"style":815},[1211],{"type":47,"value":1212}," const",{"type":41,"tag":799,"props":1214,"children":1215},{"style":821},[1216],{"type":47,"value":1217}," getActive ",{"type":41,"tag":799,"props":1219,"children":1220},{"style":827},[1221],{"type":47,"value":830},{"type":41,"tag":799,"props":1223,"children":1224},{"style":863},[1225],{"type":47,"value":1226}," query",{"type":41,"tag":799,"props":1228,"children":1229},{"style":821},[1230],{"type":47,"value":871},{"type":41,"tag":799,"props":1232,"children":1233},{"style":827},[1234],{"type":47,"value":1235},"{\n",{"type":41,"tag":799,"props":1237,"children":1238},{"class":801,"line":854},[1239,1244,1249,1254,1259,1264,1268,1272],{"type":41,"tag":799,"props":1240,"children":1241},{"style":863},[1242],{"type":47,"value":1243},"  handler",{"type":41,"tag":799,"props":1245,"children":1246},{"style":827},[1247],{"type":47,"value":1248},":",{"type":41,"tag":799,"props":1250,"children":1251},{"style":815},[1252],{"type":47,"value":1253}," async",{"type":41,"tag":799,"props":1255,"children":1256},{"style":827},[1257],{"type":47,"value":1258}," (",{"type":41,"tag":799,"props":1260,"children":1261},{"style":911},[1262],{"type":47,"value":1263},"ctx",{"type":41,"tag":799,"props":1265,"children":1266},{"style":827},[1267],{"type":47,"value":364},{"type":41,"tag":799,"props":1269,"children":1270},{"style":815},[1271],{"type":47,"value":919},{"type":41,"tag":799,"props":1273,"children":1274},{"style":827},[1275],{"type":47,"value":1276}," {\n",{"type":41,"tag":799,"props":1278,"children":1279},{"class":801,"line":894},[1280,1285,1290,1295,1300,1304,1309,1314,1319],{"type":41,"tag":799,"props":1281,"children":1282},{"style":815},[1283],{"type":47,"value":1284},"    const",{"type":41,"tag":799,"props":1286,"children":1287},{"style":821},[1288],{"type":47,"value":1289}," now",{"type":41,"tag":799,"props":1291,"children":1292},{"style":827},[1293],{"type":47,"value":1294}," =",{"type":41,"tag":799,"props":1296,"children":1297},{"style":821},[1298],{"type":47,"value":1299}," Date",{"type":41,"tag":799,"props":1301,"children":1302},{"style":827},[1303],{"type":47,"value":846},{"type":41,"tag":799,"props":1305,"children":1306},{"style":863},[1307],{"type":47,"value":1308},"now",{"type":41,"tag":799,"props":1310,"children":1312},{"style":1311},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1313],{"type":47,"value":996},{"type":41,"tag":799,"props":1315,"children":1316},{"style":827},[1317],{"type":47,"value":1318},";",{"type":41,"tag":799,"props":1320,"children":1321},{"style":806},[1322],{"type":47,"value":1323}," \u002F\u002F Breaks reactivity!\n",{"type":41,"tag":799,"props":1325,"children":1326},{"class":801,"line":981},[1327,1332,1336,1340,1344,1349,1353,1357,1361,1365,1370,1374],{"type":41,"tag":799,"props":1328,"children":1329},{"style":833},[1330],{"type":47,"value":1331},"    return",{"type":41,"tag":799,"props":1333,"children":1334},{"style":833},[1335],{"type":47,"value":836},{"type":41,"tag":799,"props":1337,"children":1338},{"style":821},[1339],{"type":47,"value":841},{"type":41,"tag":799,"props":1341,"children":1342},{"style":827},[1343],{"type":47,"value":846},{"type":41,"tag":799,"props":1345,"children":1346},{"style":821},[1347],{"type":47,"value":1348},"db",{"type":41,"tag":799,"props":1350,"children":1351},{"style":827},[1352],{"type":47,"value":846},{"type":41,"tag":799,"props":1354,"children":1355},{"style":863},[1356],{"type":47,"value":866},{"type":41,"tag":799,"props":1358,"children":1359},{"style":1311},[1360],{"type":47,"value":871},{"type":41,"tag":799,"props":1362,"children":1363},{"style":827},[1364],{"type":47,"value":876},{"type":41,"tag":799,"props":1366,"children":1367},{"style":879},[1368],{"type":47,"value":1369},"tasks",{"type":41,"tag":799,"props":1371,"children":1372},{"style":827},[1373],{"type":47,"value":876},{"type":41,"tag":799,"props":1375,"children":1376},{"style":1311},[1377],{"type":47,"value":891},{"type":41,"tag":799,"props":1379,"children":1381},{"class":801,"line":1380},6,[1382,1387,1391,1395,1399,1403,1407,1411,1416,1420,1424,1428,1432,1436,1440,1445,1449,1453,1457,1461],{"type":41,"tag":799,"props":1383,"children":1384},{"style":827},[1385],{"type":47,"value":1386},"      .",{"type":41,"tag":799,"props":1388,"children":1389},{"style":863},[1390],{"type":47,"value":904},{"type":41,"tag":799,"props":1392,"children":1393},{"style":1311},[1394],{"type":47,"value":871},{"type":41,"tag":799,"props":1396,"children":1397},{"style":911},[1398],{"type":47,"value":914},{"type":41,"tag":799,"props":1400,"children":1401},{"style":815},[1402],{"type":47,"value":919},{"type":41,"tag":799,"props":1404,"children":1405},{"style":821},[1406],{"type":47,"value":924},{"type":41,"tag":799,"props":1408,"children":1409},{"style":827},[1410],{"type":47,"value":846},{"type":41,"tag":799,"props":1412,"children":1413},{"style":863},[1414],{"type":47,"value":1415},"lt",{"type":41,"tag":799,"props":1417,"children":1418},{"style":1311},[1419],{"type":47,"value":871},{"type":41,"tag":799,"props":1421,"children":1422},{"style":821},[1423],{"type":47,"value":914},{"type":41,"tag":799,"props":1425,"children":1426},{"style":827},[1427],{"type":47,"value":846},{"type":41,"tag":799,"props":1429,"children":1430},{"style":863},[1431],{"type":47,"value":947},{"type":41,"tag":799,"props":1433,"children":1434},{"style":1311},[1435],{"type":47,"value":871},{"type":41,"tag":799,"props":1437,"children":1438},{"style":827},[1439],{"type":47,"value":876},{"type":41,"tag":799,"props":1441,"children":1442},{"style":879},[1443],{"type":47,"value":1444},"due",{"type":41,"tag":799,"props":1446,"children":1447},{"style":827},[1448],{"type":47,"value":876},{"type":41,"tag":799,"props":1450,"children":1451},{"style":1311},[1452],{"type":47,"value":364},{"type":41,"tag":799,"props":1454,"children":1455},{"style":827},[1456],{"type":47,"value":973},{"type":41,"tag":799,"props":1458,"children":1459},{"style":821},[1460],{"type":47,"value":1289},{"type":41,"tag":799,"props":1462,"children":1463},{"style":1311},[1464],{"type":47,"value":1465},"))\n",{"type":41,"tag":799,"props":1467,"children":1469},{"class":801,"line":1468},7,[1470,1474,1479,1483],{"type":41,"tag":799,"props":1471,"children":1472},{"style":827},[1473],{"type":47,"value":1386},{"type":41,"tag":799,"props":1475,"children":1476},{"style":863},[1477],{"type":47,"value":1478},"collect",{"type":41,"tag":799,"props":1480,"children":1481},{"style":1311},[1482],{"type":47,"value":996},{"type":41,"tag":799,"props":1484,"children":1485},{"style":827},[1486],{"type":47,"value":1001},{"type":41,"tag":799,"props":1488,"children":1490},{"class":801,"line":1489},8,[1491],{"type":41,"tag":799,"props":1492,"children":1493},{"style":827},[1494],{"type":47,"value":1495},"  },\n",{"type":41,"tag":799,"props":1497,"children":1499},{"class":801,"line":1498},9,[1500,1505,1509],{"type":41,"tag":799,"props":1501,"children":1502},{"style":827},[1503],{"type":47,"value":1504},"}",{"type":41,"tag":799,"props":1506,"children":1507},{"style":821},[1508],{"type":47,"value":364},{"type":41,"tag":799,"props":1510,"children":1511},{"style":827},[1512],{"type":47,"value":1001},{"type":41,"tag":50,"props":1514,"children":1515},{},[1516],{"type":47,"value":1517},"Should pass time as argument or use status field.",{"type":41,"tag":781,"props":1519,"children":1521},{"id":1520},"missing-auth-check",[1522],{"type":47,"value":1523},"❌ Missing Auth Check",{"type":41,"tag":788,"props":1525,"children":1527},{"className":790,"code":1526,"language":792,"meta":793,"style":793},"\u002F\u002F Bad\nexport const deleteTask = mutation({\n  args: { taskId: v.id(\"tasks\") },\n  handler: async (ctx, args) => {\n    await ctx.db.delete(args.taskId); \u002F\u002F Anyone can delete!\n  },\n});\n",[1528],{"type":41,"tag":101,"props":1529,"children":1530},{"__ignoreMap":793},[1531,1538,1571,1637,1681,1740,1747],{"type":41,"tag":799,"props":1532,"children":1533},{"class":801,"line":802},[1534],{"type":41,"tag":799,"props":1535,"children":1536},{"style":806},[1537],{"type":47,"value":809},{"type":41,"tag":799,"props":1539,"children":1540},{"class":801,"line":24},[1541,1545,1549,1554,1558,1563,1567],{"type":41,"tag":799,"props":1542,"children":1543},{"style":833},[1544],{"type":47,"value":1207},{"type":41,"tag":799,"props":1546,"children":1547},{"style":815},[1548],{"type":47,"value":1212},{"type":41,"tag":799,"props":1550,"children":1551},{"style":821},[1552],{"type":47,"value":1553}," deleteTask ",{"type":41,"tag":799,"props":1555,"children":1556},{"style":827},[1557],{"type":47,"value":830},{"type":41,"tag":799,"props":1559,"children":1560},{"style":863},[1561],{"type":47,"value":1562}," mutation",{"type":41,"tag":799,"props":1564,"children":1565},{"style":821},[1566],{"type":47,"value":871},{"type":41,"tag":799,"props":1568,"children":1569},{"style":827},[1570],{"type":47,"value":1235},{"type":41,"tag":799,"props":1572,"children":1573},{"class":801,"line":854},[1574,1579,1583,1588,1593,1597,1602,1606,1611,1615,1619,1623,1627,1632],{"type":41,"tag":799,"props":1575,"children":1576},{"style":1311},[1577],{"type":47,"value":1578},"  args",{"type":41,"tag":799,"props":1580,"children":1581},{"style":827},[1582],{"type":47,"value":1248},{"type":41,"tag":799,"props":1584,"children":1585},{"style":827},[1586],{"type":47,"value":1587}," {",{"type":41,"tag":799,"props":1589,"children":1590},{"style":1311},[1591],{"type":47,"value":1592}," taskId",{"type":41,"tag":799,"props":1594,"children":1595},{"style":827},[1596],{"type":47,"value":1248},{"type":41,"tag":799,"props":1598,"children":1599},{"style":821},[1600],{"type":47,"value":1601}," v",{"type":41,"tag":799,"props":1603,"children":1604},{"style":827},[1605],{"type":47,"value":846},{"type":41,"tag":799,"props":1607,"children":1608},{"style":863},[1609],{"type":47,"value":1610},"id",{"type":41,"tag":799,"props":1612,"children":1613},{"style":821},[1614],{"type":47,"value":871},{"type":41,"tag":799,"props":1616,"children":1617},{"style":827},[1618],{"type":47,"value":876},{"type":41,"tag":799,"props":1620,"children":1621},{"style":879},[1622],{"type":47,"value":1369},{"type":41,"tag":799,"props":1624,"children":1625},{"style":827},[1626],{"type":47,"value":876},{"type":41,"tag":799,"props":1628,"children":1629},{"style":821},[1630],{"type":47,"value":1631},") ",{"type":41,"tag":799,"props":1633,"children":1634},{"style":827},[1635],{"type":47,"value":1636},"},\n",{"type":41,"tag":799,"props":1638,"children":1639},{"class":801,"line":894},[1640,1644,1648,1652,1656,1660,1664,1669,1673,1677],{"type":41,"tag":799,"props":1641,"children":1642},{"style":863},[1643],{"type":47,"value":1243},{"type":41,"tag":799,"props":1645,"children":1646},{"style":827},[1647],{"type":47,"value":1248},{"type":41,"tag":799,"props":1649,"children":1650},{"style":815},[1651],{"type":47,"value":1253},{"type":41,"tag":799,"props":1653,"children":1654},{"style":827},[1655],{"type":47,"value":1258},{"type":41,"tag":799,"props":1657,"children":1658},{"style":911},[1659],{"type":47,"value":1263},{"type":41,"tag":799,"props":1661,"children":1662},{"style":827},[1663],{"type":47,"value":973},{"type":41,"tag":799,"props":1665,"children":1666},{"style":911},[1667],{"type":47,"value":1668}," args",{"type":41,"tag":799,"props":1670,"children":1671},{"style":827},[1672],{"type":47,"value":364},{"type":41,"tag":799,"props":1674,"children":1675},{"style":815},[1676],{"type":47,"value":919},{"type":41,"tag":799,"props":1678,"children":1679},{"style":827},[1680],{"type":47,"value":1276},{"type":41,"tag":799,"props":1682,"children":1683},{"class":801,"line":981},[1684,1689,1693,1697,1701,1705,1710,1714,1718,1722,1727,1731,1735],{"type":41,"tag":799,"props":1685,"children":1686},{"style":833},[1687],{"type":47,"value":1688},"    await",{"type":41,"tag":799,"props":1690,"children":1691},{"style":821},[1692],{"type":47,"value":841},{"type":41,"tag":799,"props":1694,"children":1695},{"style":827},[1696],{"type":47,"value":846},{"type":41,"tag":799,"props":1698,"children":1699},{"style":821},[1700],{"type":47,"value":1348},{"type":41,"tag":799,"props":1702,"children":1703},{"style":827},[1704],{"type":47,"value":846},{"type":41,"tag":799,"props":1706,"children":1707},{"style":863},[1708],{"type":47,"value":1709},"delete",{"type":41,"tag":799,"props":1711,"children":1712},{"style":1311},[1713],{"type":47,"value":871},{"type":41,"tag":799,"props":1715,"children":1716},{"style":821},[1717],{"type":47,"value":190},{"type":41,"tag":799,"props":1719,"children":1720},{"style":827},[1721],{"type":47,"value":846},{"type":41,"tag":799,"props":1723,"children":1724},{"style":821},[1725],{"type":47,"value":1726},"taskId",{"type":41,"tag":799,"props":1728,"children":1729},{"style":1311},[1730],{"type":47,"value":364},{"type":41,"tag":799,"props":1732,"children":1733},{"style":827},[1734],{"type":47,"value":1318},{"type":41,"tag":799,"props":1736,"children":1737},{"style":806},[1738],{"type":47,"value":1739}," \u002F\u002F Anyone can delete!\n",{"type":41,"tag":799,"props":1741,"children":1742},{"class":801,"line":1380},[1743],{"type":41,"tag":799,"props":1744,"children":1745},{"style":827},[1746],{"type":47,"value":1495},{"type":41,"tag":799,"props":1748,"children":1749},{"class":801,"line":1468},[1750,1754,1758],{"type":41,"tag":799,"props":1751,"children":1752},{"style":827},[1753],{"type":47,"value":1504},{"type":41,"tag":799,"props":1755,"children":1756},{"style":821},[1757],{"type":47,"value":364},{"type":41,"tag":799,"props":1759,"children":1760},{"style":827},[1761],{"type":47,"value":1001},{"type":41,"tag":50,"props":1763,"children":1764},{},[1765],{"type":47,"value":1766},"Should verify ownership:",{"type":41,"tag":788,"props":1768,"children":1770},{"className":790,"code":1769,"language":792,"meta":793,"style":793},"\u002F\u002F Good\nexport const deleteTask = mutation({\n  args: { taskId: v.id(\"tasks\") },\n  handler: async (ctx, args) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) throw new Error(\"Not authenticated\");\n\n    const task = await ctx.db.get(args.taskId);\n    if (!task) throw new Error(\"Task not found\");\n\n    const user = await getCurrentUser(ctx);\n    if (task.userId !== user._id) {\n      throw new Error(\"Unauthorized\");\n    }\n\n    await ctx.db.delete(args.taskId);\n  },\n});\n",[1771],{"type":41,"tag":101,"props":1772,"children":1773},{"__ignoreMap":793},[1774,1781,1812,1871,1914,1964,2030,2038,2103,2164,2172,2214,2265,2307,2316,2324,2376,2384],{"type":41,"tag":799,"props":1775,"children":1776},{"class":801,"line":802},[1777],{"type":41,"tag":799,"props":1778,"children":1779},{"style":806},[1780],{"type":47,"value":1021},{"type":41,"tag":799,"props":1782,"children":1783},{"class":801,"line":24},[1784,1788,1792,1796,1800,1804,1808],{"type":41,"tag":799,"props":1785,"children":1786},{"style":833},[1787],{"type":47,"value":1207},{"type":41,"tag":799,"props":1789,"children":1790},{"style":815},[1791],{"type":47,"value":1212},{"type":41,"tag":799,"props":1793,"children":1794},{"style":821},[1795],{"type":47,"value":1553},{"type":41,"tag":799,"props":1797,"children":1798},{"style":827},[1799],{"type":47,"value":830},{"type":41,"tag":799,"props":1801,"children":1802},{"style":863},[1803],{"type":47,"value":1562},{"type":41,"tag":799,"props":1805,"children":1806},{"style":821},[1807],{"type":47,"value":871},{"type":41,"tag":799,"props":1809,"children":1810},{"style":827},[1811],{"type":47,"value":1235},{"type":41,"tag":799,"props":1813,"children":1814},{"class":801,"line":854},[1815,1819,1823,1827,1831,1835,1839,1843,1847,1851,1855,1859,1863,1867],{"type":41,"tag":799,"props":1816,"children":1817},{"style":1311},[1818],{"type":47,"value":1578},{"type":41,"tag":799,"props":1820,"children":1821},{"style":827},[1822],{"type":47,"value":1248},{"type":41,"tag":799,"props":1824,"children":1825},{"style":827},[1826],{"type":47,"value":1587},{"type":41,"tag":799,"props":1828,"children":1829},{"style":1311},[1830],{"type":47,"value":1592},{"type":41,"tag":799,"props":1832,"children":1833},{"style":827},[1834],{"type":47,"value":1248},{"type":41,"tag":799,"props":1836,"children":1837},{"style":821},[1838],{"type":47,"value":1601},{"type":41,"tag":799,"props":1840,"children":1841},{"style":827},[1842],{"type":47,"value":846},{"type":41,"tag":799,"props":1844,"children":1845},{"style":863},[1846],{"type":47,"value":1610},{"type":41,"tag":799,"props":1848,"children":1849},{"style":821},[1850],{"type":47,"value":871},{"type":41,"tag":799,"props":1852,"children":1853},{"style":827},[1854],{"type":47,"value":876},{"type":41,"tag":799,"props":1856,"children":1857},{"style":879},[1858],{"type":47,"value":1369},{"type":41,"tag":799,"props":1860,"children":1861},{"style":827},[1862],{"type":47,"value":876},{"type":41,"tag":799,"props":1864,"children":1865},{"style":821},[1866],{"type":47,"value":1631},{"type":41,"tag":799,"props":1868,"children":1869},{"style":827},[1870],{"type":47,"value":1636},{"type":41,"tag":799,"props":1872,"children":1873},{"class":801,"line":894},[1874,1878,1882,1886,1890,1894,1898,1902,1906,1910],{"type":41,"tag":799,"props":1875,"children":1876},{"style":863},[1877],{"type":47,"value":1243},{"type":41,"tag":799,"props":1879,"children":1880},{"style":827},[1881],{"type":47,"value":1248},{"type":41,"tag":799,"props":1883,"children":1884},{"style":815},[1885],{"type":47,"value":1253},{"type":41,"tag":799,"props":1887,"children":1888},{"style":827},[1889],{"type":47,"value":1258},{"type":41,"tag":799,"props":1891,"children":1892},{"style":911},[1893],{"type":47,"value":1263},{"type":41,"tag":799,"props":1895,"children":1896},{"style":827},[1897],{"type":47,"value":973},{"type":41,"tag":799,"props":1899,"children":1900},{"style":911},[1901],{"type":47,"value":1668},{"type":41,"tag":799,"props":1903,"children":1904},{"style":827},[1905],{"type":47,"value":364},{"type":41,"tag":799,"props":1907,"children":1908},{"style":815},[1909],{"type":47,"value":919},{"type":41,"tag":799,"props":1911,"children":1912},{"style":827},[1913],{"type":47,"value":1276},{"type":41,"tag":799,"props":1915,"children":1916},{"class":801,"line":981},[1917,1921,1926,1930,1934,1938,1942,1947,1951,1956,1960],{"type":41,"tag":799,"props":1918,"children":1919},{"style":815},[1920],{"type":47,"value":1284},{"type":41,"tag":799,"props":1922,"children":1923},{"style":821},[1924],{"type":47,"value":1925}," identity",{"type":41,"tag":799,"props":1927,"children":1928},{"style":827},[1929],{"type":47,"value":1294},{"type":41,"tag":799,"props":1931,"children":1932},{"style":833},[1933],{"type":47,"value":836},{"type":41,"tag":799,"props":1935,"children":1936},{"style":821},[1937],{"type":47,"value":841},{"type":41,"tag":799,"props":1939,"children":1940},{"style":827},[1941],{"type":47,"value":846},{"type":41,"tag":799,"props":1943,"children":1944},{"style":821},[1945],{"type":47,"value":1946},"auth",{"type":41,"tag":799,"props":1948,"children":1949},{"style":827},[1950],{"type":47,"value":846},{"type":41,"tag":799,"props":1952,"children":1953},{"style":863},[1954],{"type":47,"value":1955},"getUserIdentity",{"type":41,"tag":799,"props":1957,"children":1958},{"style":1311},[1959],{"type":47,"value":996},{"type":41,"tag":799,"props":1961,"children":1962},{"style":827},[1963],{"type":47,"value":1001},{"type":41,"tag":799,"props":1965,"children":1966},{"class":801,"line":1380},[1967,1972,1976,1981,1986,1990,1995,2000,2005,2009,2013,2018,2022,2026],{"type":41,"tag":799,"props":1968,"children":1969},{"style":833},[1970],{"type":47,"value":1971},"    if",{"type":41,"tag":799,"props":1973,"children":1974},{"style":1311},[1975],{"type":47,"value":1258},{"type":41,"tag":799,"props":1977,"children":1978},{"style":827},[1979],{"type":47,"value":1980},"!",{"type":41,"tag":799,"props":1982,"children":1983},{"style":821},[1984],{"type":47,"value":1985},"identity",{"type":41,"tag":799,"props":1987,"children":1988},{"style":1311},[1989],{"type":47,"value":1631},{"type":41,"tag":799,"props":1991,"children":1992},{"style":833},[1993],{"type":47,"value":1994},"throw",{"type":41,"tag":799,"props":1996,"children":1997},{"style":827},[1998],{"type":47,"value":1999}," new",{"type":41,"tag":799,"props":2001,"children":2002},{"style":863},[2003],{"type":47,"value":2004}," Error",{"type":41,"tag":799,"props":2006,"children":2007},{"style":1311},[2008],{"type":47,"value":871},{"type":41,"tag":799,"props":2010,"children":2011},{"style":827},[2012],{"type":47,"value":876},{"type":41,"tag":799,"props":2014,"children":2015},{"style":879},[2016],{"type":47,"value":2017},"Not authenticated",{"type":41,"tag":799,"props":2019,"children":2020},{"style":827},[2021],{"type":47,"value":876},{"type":41,"tag":799,"props":2023,"children":2024},{"style":1311},[2025],{"type":47,"value":364},{"type":41,"tag":799,"props":2027,"children":2028},{"style":827},[2029],{"type":47,"value":1001},{"type":41,"tag":799,"props":2031,"children":2032},{"class":801,"line":1468},[2033],{"type":41,"tag":799,"props":2034,"children":2035},{"emptyLinePlaceholder":95},[2036],{"type":47,"value":2037},"\n",{"type":41,"tag":799,"props":2039,"children":2040},{"class":801,"line":1489},[2041,2045,2050,2054,2058,2062,2066,2070,2074,2079,2083,2087,2091,2095,2099],{"type":41,"tag":799,"props":2042,"children":2043},{"style":815},[2044],{"type":47,"value":1284},{"type":41,"tag":799,"props":2046,"children":2047},{"style":821},[2048],{"type":47,"value":2049}," task",{"type":41,"tag":799,"props":2051,"children":2052},{"style":827},[2053],{"type":47,"value":1294},{"type":41,"tag":799,"props":2055,"children":2056},{"style":833},[2057],{"type":47,"value":836},{"type":41,"tag":799,"props":2059,"children":2060},{"style":821},[2061],{"type":47,"value":841},{"type":41,"tag":799,"props":2063,"children":2064},{"style":827},[2065],{"type":47,"value":846},{"type":41,"tag":799,"props":2067,"children":2068},{"style":821},[2069],{"type":47,"value":1348},{"type":41,"tag":799,"props":2071,"children":2072},{"style":827},[2073],{"type":47,"value":846},{"type":41,"tag":799,"props":2075,"children":2076},{"style":863},[2077],{"type":47,"value":2078},"get",{"type":41,"tag":799,"props":2080,"children":2081},{"style":1311},[2082],{"type":47,"value":871},{"type":41,"tag":799,"props":2084,"children":2085},{"style":821},[2086],{"type":47,"value":190},{"type":41,"tag":799,"props":2088,"children":2089},{"style":827},[2090],{"type":47,"value":846},{"type":41,"tag":799,"props":2092,"children":2093},{"style":821},[2094],{"type":47,"value":1726},{"type":41,"tag":799,"props":2096,"children":2097},{"style":1311},[2098],{"type":47,"value":364},{"type":41,"tag":799,"props":2100,"children":2101},{"style":827},[2102],{"type":47,"value":1001},{"type":41,"tag":799,"props":2104,"children":2105},{"class":801,"line":1498},[2106,2110,2114,2118,2123,2127,2131,2135,2139,2143,2147,2152,2156,2160],{"type":41,"tag":799,"props":2107,"children":2108},{"style":833},[2109],{"type":47,"value":1971},{"type":41,"tag":799,"props":2111,"children":2112},{"style":1311},[2113],{"type":47,"value":1258},{"type":41,"tag":799,"props":2115,"children":2116},{"style":827},[2117],{"type":47,"value":1980},{"type":41,"tag":799,"props":2119,"children":2120},{"style":821},[2121],{"type":47,"value":2122},"task",{"type":41,"tag":799,"props":2124,"children":2125},{"style":1311},[2126],{"type":47,"value":1631},{"type":41,"tag":799,"props":2128,"children":2129},{"style":833},[2130],{"type":47,"value":1994},{"type":41,"tag":799,"props":2132,"children":2133},{"style":827},[2134],{"type":47,"value":1999},{"type":41,"tag":799,"props":2136,"children":2137},{"style":863},[2138],{"type":47,"value":2004},{"type":41,"tag":799,"props":2140,"children":2141},{"style":1311},[2142],{"type":47,"value":871},{"type":41,"tag":799,"props":2144,"children":2145},{"style":827},[2146],{"type":47,"value":876},{"type":41,"tag":799,"props":2148,"children":2149},{"style":879},[2150],{"type":47,"value":2151},"Task not found",{"type":41,"tag":799,"props":2153,"children":2154},{"style":827},[2155],{"type":47,"value":876},{"type":41,"tag":799,"props":2157,"children":2158},{"style":1311},[2159],{"type":47,"value":364},{"type":41,"tag":799,"props":2161,"children":2162},{"style":827},[2163],{"type":47,"value":1001},{"type":41,"tag":799,"props":2165,"children":2167},{"class":801,"line":2166},10,[2168],{"type":41,"tag":799,"props":2169,"children":2170},{"emptyLinePlaceholder":95},[2171],{"type":47,"value":2037},{"type":41,"tag":799,"props":2173,"children":2175},{"class":801,"line":2174},11,[2176,2180,2185,2189,2193,2198,2202,2206,2210],{"type":41,"tag":799,"props":2177,"children":2178},{"style":815},[2179],{"type":47,"value":1284},{"type":41,"tag":799,"props":2181,"children":2182},{"style":821},[2183],{"type":47,"value":2184}," user",{"type":41,"tag":799,"props":2186,"children":2187},{"style":827},[2188],{"type":47,"value":1294},{"type":41,"tag":799,"props":2190,"children":2191},{"style":833},[2192],{"type":47,"value":836},{"type":41,"tag":799,"props":2194,"children":2195},{"style":863},[2196],{"type":47,"value":2197}," getCurrentUser",{"type":41,"tag":799,"props":2199,"children":2200},{"style":1311},[2201],{"type":47,"value":871},{"type":41,"tag":799,"props":2203,"children":2204},{"style":821},[2205],{"type":47,"value":1263},{"type":41,"tag":799,"props":2207,"children":2208},{"style":1311},[2209],{"type":47,"value":364},{"type":41,"tag":799,"props":2211,"children":2212},{"style":827},[2213],{"type":47,"value":1001},{"type":41,"tag":799,"props":2215,"children":2217},{"class":801,"line":2216},12,[2218,2222,2226,2230,2234,2239,2244,2248,2252,2257,2261],{"type":41,"tag":799,"props":2219,"children":2220},{"style":833},[2221],{"type":47,"value":1971},{"type":41,"tag":799,"props":2223,"children":2224},{"style":1311},[2225],{"type":47,"value":1258},{"type":41,"tag":799,"props":2227,"children":2228},{"style":821},[2229],{"type":47,"value":2122},{"type":41,"tag":799,"props":2231,"children":2232},{"style":827},[2233],{"type":47,"value":846},{"type":41,"tag":799,"props":2235,"children":2236},{"style":821},[2237],{"type":47,"value":2238},"userId",{"type":41,"tag":799,"props":2240,"children":2241},{"style":827},[2242],{"type":47,"value":2243}," !==",{"type":41,"tag":799,"props":2245,"children":2246},{"style":821},[2247],{"type":47,"value":2184},{"type":41,"tag":799,"props":2249,"children":2250},{"style":827},[2251],{"type":47,"value":846},{"type":41,"tag":799,"props":2253,"children":2254},{"style":821},[2255],{"type":47,"value":2256},"_id",{"type":41,"tag":799,"props":2258,"children":2259},{"style":1311},[2260],{"type":47,"value":1631},{"type":41,"tag":799,"props":2262,"children":2263},{"style":827},[2264],{"type":47,"value":1235},{"type":41,"tag":799,"props":2266,"children":2268},{"class":801,"line":2267},13,[2269,2274,2278,2282,2286,2290,2295,2299,2303],{"type":41,"tag":799,"props":2270,"children":2271},{"style":833},[2272],{"type":47,"value":2273},"      throw",{"type":41,"tag":799,"props":2275,"children":2276},{"style":827},[2277],{"type":47,"value":1999},{"type":41,"tag":799,"props":2279,"children":2280},{"style":863},[2281],{"type":47,"value":2004},{"type":41,"tag":799,"props":2283,"children":2284},{"style":1311},[2285],{"type":47,"value":871},{"type":41,"tag":799,"props":2287,"children":2288},{"style":827},[2289],{"type":47,"value":876},{"type":41,"tag":799,"props":2291,"children":2292},{"style":879},[2293],{"type":47,"value":2294},"Unauthorized",{"type":41,"tag":799,"props":2296,"children":2297},{"style":827},[2298],{"type":47,"value":876},{"type":41,"tag":799,"props":2300,"children":2301},{"style":1311},[2302],{"type":47,"value":364},{"type":41,"tag":799,"props":2304,"children":2305},{"style":827},[2306],{"type":47,"value":1001},{"type":41,"tag":799,"props":2308,"children":2310},{"class":801,"line":2309},14,[2311],{"type":41,"tag":799,"props":2312,"children":2313},{"style":827},[2314],{"type":47,"value":2315},"    }\n",{"type":41,"tag":799,"props":2317,"children":2319},{"class":801,"line":2318},15,[2320],{"type":41,"tag":799,"props":2321,"children":2322},{"emptyLinePlaceholder":95},[2323],{"type":47,"value":2037},{"type":41,"tag":799,"props":2325,"children":2327},{"class":801,"line":2326},16,[2328,2332,2336,2340,2344,2348,2352,2356,2360,2364,2368,2372],{"type":41,"tag":799,"props":2329,"children":2330},{"style":833},[2331],{"type":47,"value":1688},{"type":41,"tag":799,"props":2333,"children":2334},{"style":821},[2335],{"type":47,"value":841},{"type":41,"tag":799,"props":2337,"children":2338},{"style":827},[2339],{"type":47,"value":846},{"type":41,"tag":799,"props":2341,"children":2342},{"style":821},[2343],{"type":47,"value":1348},{"type":41,"tag":799,"props":2345,"children":2346},{"style":827},[2347],{"type":47,"value":846},{"type":41,"tag":799,"props":2349,"children":2350},{"style":863},[2351],{"type":47,"value":1709},{"type":41,"tag":799,"props":2353,"children":2354},{"style":1311},[2355],{"type":47,"value":871},{"type":41,"tag":799,"props":2357,"children":2358},{"style":821},[2359],{"type":47,"value":190},{"type":41,"tag":799,"props":2361,"children":2362},{"style":827},[2363],{"type":47,"value":846},{"type":41,"tag":799,"props":2365,"children":2366},{"style":821},[2367],{"type":47,"value":1726},{"type":41,"tag":799,"props":2369,"children":2370},{"style":1311},[2371],{"type":47,"value":364},{"type":41,"tag":799,"props":2373,"children":2374},{"style":827},[2375],{"type":47,"value":1001},{"type":41,"tag":799,"props":2377,"children":2379},{"class":801,"line":2378},17,[2380],{"type":41,"tag":799,"props":2381,"children":2382},{"style":827},[2383],{"type":47,"value":1495},{"type":41,"tag":799,"props":2385,"children":2387},{"class":801,"line":2386},18,[2388,2392,2396],{"type":41,"tag":799,"props":2389,"children":2390},{"style":827},[2391],{"type":47,"value":1504},{"type":41,"tag":799,"props":2393,"children":2394},{"style":821},[2395],{"type":47,"value":364},{"type":41,"tag":799,"props":2397,"children":2398},{"style":827},[2399],{"type":47,"value":1001},{"type":41,"tag":781,"props":2401,"children":2403},{"id":2402},"deep-nesting",[2404],{"type":47,"value":2405},"❌ Deep Nesting",{"type":41,"tag":788,"props":2407,"children":2409},{"className":790,"code":2408,"language":792,"meta":793,"style":793},"\u002F\u002F Bad\nusers: defineTable({\n  posts: v.array(v.object({\n    comments: v.array(v.object({ text: v.string() }))\n  }))\n})\n",[2410],{"type":41,"tag":101,"props":2411,"children":2412},{"__ignoreMap":793},[2413,2420,2445,2492,2572,2584],{"type":41,"tag":799,"props":2414,"children":2415},{"class":801,"line":802},[2416],{"type":41,"tag":799,"props":2417,"children":2418},{"style":806},[2419],{"type":47,"value":809},{"type":41,"tag":799,"props":2421,"children":2422},{"class":801,"line":24},[2423,2428,2432,2437,2441],{"type":41,"tag":799,"props":2424,"children":2426},{"style":2425},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2427],{"type":47,"value":882},{"type":41,"tag":799,"props":2429,"children":2430},{"style":827},[2431],{"type":47,"value":1248},{"type":41,"tag":799,"props":2433,"children":2434},{"style":863},[2435],{"type":47,"value":2436}," defineTable",{"type":41,"tag":799,"props":2438,"children":2439},{"style":821},[2440],{"type":47,"value":871},{"type":41,"tag":799,"props":2442,"children":2443},{"style":827},[2444],{"type":47,"value":1235},{"type":41,"tag":799,"props":2446,"children":2447},{"class":801,"line":854},[2448,2453,2457,2461,2465,2470,2475,2479,2484,2488],{"type":41,"tag":799,"props":2449,"children":2450},{"style":1311},[2451],{"type":47,"value":2452},"  posts",{"type":41,"tag":799,"props":2454,"children":2455},{"style":827},[2456],{"type":47,"value":1248},{"type":41,"tag":799,"props":2458,"children":2459},{"style":821},[2460],{"type":47,"value":1601},{"type":41,"tag":799,"props":2462,"children":2463},{"style":827},[2464],{"type":47,"value":846},{"type":41,"tag":799,"props":2466,"children":2467},{"style":863},[2468],{"type":47,"value":2469},"array",{"type":41,"tag":799,"props":2471,"children":2472},{"style":821},[2473],{"type":47,"value":2474},"(v",{"type":41,"tag":799,"props":2476,"children":2477},{"style":827},[2478],{"type":47,"value":846},{"type":41,"tag":799,"props":2480,"children":2481},{"style":863},[2482],{"type":47,"value":2483},"object",{"type":41,"tag":799,"props":2485,"children":2486},{"style":821},[2487],{"type":47,"value":871},{"type":41,"tag":799,"props":2489,"children":2490},{"style":827},[2491],{"type":47,"value":1235},{"type":41,"tag":799,"props":2493,"children":2494},{"class":801,"line":894},[2495,2500,2504,2508,2512,2516,2520,2524,2528,2532,2537,2542,2546,2550,2554,2559,2564,2568],{"type":41,"tag":799,"props":2496,"children":2497},{"style":1311},[2498],{"type":47,"value":2499},"    comments",{"type":41,"tag":799,"props":2501,"children":2502},{"style":827},[2503],{"type":47,"value":1248},{"type":41,"tag":799,"props":2505,"children":2506},{"style":821},[2507],{"type":47,"value":1601},{"type":41,"tag":799,"props":2509,"children":2510},{"style":827},[2511],{"type":47,"value":846},{"type":41,"tag":799,"props":2513,"children":2514},{"style":863},[2515],{"type":47,"value":2469},{"type":41,"tag":799,"props":2517,"children":2518},{"style":821},[2519],{"type":47,"value":2474},{"type":41,"tag":799,"props":2521,"children":2522},{"style":827},[2523],{"type":47,"value":846},{"type":41,"tag":799,"props":2525,"children":2526},{"style":863},[2527],{"type":47,"value":2483},{"type":41,"tag":799,"props":2529,"children":2530},{"style":821},[2531],{"type":47,"value":871},{"type":41,"tag":799,"props":2533,"children":2534},{"style":827},[2535],{"type":47,"value":2536},"{",{"type":41,"tag":799,"props":2538,"children":2539},{"style":1311},[2540],{"type":47,"value":2541}," text",{"type":41,"tag":799,"props":2543,"children":2544},{"style":827},[2545],{"type":47,"value":1248},{"type":41,"tag":799,"props":2547,"children":2548},{"style":821},[2549],{"type":47,"value":1601},{"type":41,"tag":799,"props":2551,"children":2552},{"style":827},[2553],{"type":47,"value":846},{"type":41,"tag":799,"props":2555,"children":2556},{"style":863},[2557],{"type":47,"value":2558},"string",{"type":41,"tag":799,"props":2560,"children":2561},{"style":821},[2562],{"type":47,"value":2563},"() ",{"type":41,"tag":799,"props":2565,"children":2566},{"style":827},[2567],{"type":47,"value":1504},{"type":41,"tag":799,"props":2569,"children":2570},{"style":821},[2571],{"type":47,"value":1465},{"type":41,"tag":799,"props":2573,"children":2574},{"class":801,"line":981},[2575,2580],{"type":41,"tag":799,"props":2576,"children":2577},{"style":827},[2578],{"type":47,"value":2579},"  }",{"type":41,"tag":799,"props":2581,"children":2582},{"style":821},[2583],{"type":47,"value":1465},{"type":41,"tag":799,"props":2585,"children":2586},{"class":801,"line":1380},[2587,2591],{"type":41,"tag":799,"props":2588,"children":2589},{"style":827},[2590],{"type":47,"value":1504},{"type":41,"tag":799,"props":2592,"children":2593},{"style":821},[2594],{"type":47,"value":891},{"type":41,"tag":50,"props":2596,"children":2597},{},[2598],{"type":47,"value":2599},"Should use separate tables with relationships.",{"type":41,"tag":781,"props":2601,"children":2603},{"id":2602},"scheduling-api-functions",[2604],{"type":47,"value":2605},"❌ Scheduling API Functions",{"type":41,"tag":788,"props":2607,"children":2609},{"className":790,"code":2608,"language":792,"meta":793,"style":793},"\u002F\u002F Bad\nawait ctx.scheduler.runAfter(0, api.tasks.process, args);\n",[2610],{"type":41,"tag":101,"props":2611,"children":2612},{"__ignoreMap":793},[2613,2620],{"type":41,"tag":799,"props":2614,"children":2615},{"class":801,"line":802},[2616],{"type":41,"tag":799,"props":2617,"children":2618},{"style":806},[2619],{"type":47,"value":809},{"type":41,"tag":799,"props":2621,"children":2622},{"class":801,"line":24},[2623,2628,2632,2636,2641,2645,2650,2654,2660,2664,2669,2673,2677,2681,2686,2690,2695],{"type":41,"tag":799,"props":2624,"children":2625},{"style":833},[2626],{"type":47,"value":2627},"await",{"type":41,"tag":799,"props":2629,"children":2630},{"style":821},[2631],{"type":47,"value":841},{"type":41,"tag":799,"props":2633,"children":2634},{"style":827},[2635],{"type":47,"value":846},{"type":41,"tag":799,"props":2637,"children":2638},{"style":821},[2639],{"type":47,"value":2640},"scheduler",{"type":41,"tag":799,"props":2642,"children":2643},{"style":827},[2644],{"type":47,"value":846},{"type":41,"tag":799,"props":2646,"children":2647},{"style":863},[2648],{"type":47,"value":2649},"runAfter",{"type":41,"tag":799,"props":2651,"children":2652},{"style":821},[2653],{"type":47,"value":871},{"type":41,"tag":799,"props":2655,"children":2657},{"style":2656},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2658],{"type":47,"value":2659},"0",{"type":41,"tag":799,"props":2661,"children":2662},{"style":827},[2663],{"type":47,"value":973},{"type":41,"tag":799,"props":2665,"children":2666},{"style":821},[2667],{"type":47,"value":2668}," api",{"type":41,"tag":799,"props":2670,"children":2671},{"style":827},[2672],{"type":47,"value":846},{"type":41,"tag":799,"props":2674,"children":2675},{"style":821},[2676],{"type":47,"value":1369},{"type":41,"tag":799,"props":2678,"children":2679},{"style":827},[2680],{"type":47,"value":846},{"type":41,"tag":799,"props":2682,"children":2683},{"style":821},[2684],{"type":47,"value":2685},"process",{"type":41,"tag":799,"props":2687,"children":2688},{"style":827},[2689],{"type":47,"value":973},{"type":41,"tag":799,"props":2691,"children":2692},{"style":821},[2693],{"type":47,"value":2694}," args)",{"type":41,"tag":799,"props":2696,"children":2697},{"style":827},[2698],{"type":47,"value":1001},{"type":41,"tag":50,"props":2700,"children":2701},{},[2702],{"type":47,"value":2703},"Should use internal:",{"type":41,"tag":788,"props":2705,"children":2707},{"className":790,"code":2706,"language":792,"meta":793,"style":793},"\u002F\u002F Good\nawait ctx.scheduler.runAfter(0, internal.tasks.process, args);\n",[2708],{"type":41,"tag":101,"props":2709,"children":2710},{"__ignoreMap":793},[2711,2718],{"type":41,"tag":799,"props":2712,"children":2713},{"class":801,"line":802},[2714],{"type":41,"tag":799,"props":2715,"children":2716},{"style":806},[2717],{"type":47,"value":1021},{"type":41,"tag":799,"props":2719,"children":2720},{"class":801,"line":24},[2721,2725,2729,2733,2737,2741,2745,2749,2753,2757,2762,2766,2770,2774,2778,2782,2786],{"type":41,"tag":799,"props":2722,"children":2723},{"style":833},[2724],{"type":47,"value":2627},{"type":41,"tag":799,"props":2726,"children":2727},{"style":821},[2728],{"type":47,"value":841},{"type":41,"tag":799,"props":2730,"children":2731},{"style":827},[2732],{"type":47,"value":846},{"type":41,"tag":799,"props":2734,"children":2735},{"style":821},[2736],{"type":47,"value":2640},{"type":41,"tag":799,"props":2738,"children":2739},{"style":827},[2740],{"type":47,"value":846},{"type":41,"tag":799,"props":2742,"children":2743},{"style":863},[2744],{"type":47,"value":2649},{"type":41,"tag":799,"props":2746,"children":2747},{"style":821},[2748],{"type":47,"value":871},{"type":41,"tag":799,"props":2750,"children":2751},{"style":2656},[2752],{"type":47,"value":2659},{"type":41,"tag":799,"props":2754,"children":2755},{"style":827},[2756],{"type":47,"value":973},{"type":41,"tag":799,"props":2758,"children":2759},{"style":821},[2760],{"type":47,"value":2761}," internal",{"type":41,"tag":799,"props":2763,"children":2764},{"style":827},[2765],{"type":47,"value":846},{"type":41,"tag":799,"props":2767,"children":2768},{"style":821},[2769],{"type":47,"value":1369},{"type":41,"tag":799,"props":2771,"children":2772},{"style":827},[2773],{"type":47,"value":846},{"type":41,"tag":799,"props":2775,"children":2776},{"style":821},[2777],{"type":47,"value":2685},{"type":41,"tag":799,"props":2779,"children":2780},{"style":827},[2781],{"type":47,"value":973},{"type":41,"tag":799,"props":2783,"children":2784},{"style":821},[2785],{"type":47,"value":2694},{"type":41,"tag":799,"props":2787,"children":2788},{"style":827},[2789],{"type":47,"value":1001},{"type":41,"tag":56,"props":2791,"children":2793},{"id":2792},"review-process",[2794],{"type":47,"value":2795},"Review Process",{"type":41,"tag":68,"props":2797,"children":2798},{},[2799,2809,2819,2829],{"type":41,"tag":72,"props":2800,"children":2801},{},[2802,2807],{"type":41,"tag":76,"props":2803,"children":2804},{},[2805],{"type":47,"value":2806},"First Pass",{"type":47,"value":2808},": Check security (auth, validation, authorization)",{"type":41,"tag":72,"props":2810,"children":2811},{},[2812,2817],{"type":41,"tag":76,"props":2813,"children":2814},{},[2815],{"type":47,"value":2816},"Second Pass",{"type":47,"value":2818},": Check performance (indexes, queries, reactivity)",{"type":41,"tag":72,"props":2820,"children":2821},{},[2822,2827],{"type":41,"tag":76,"props":2823,"children":2824},{},[2825],{"type":47,"value":2826},"Third Pass",{"type":47,"value":2828},": Check code quality (organization, types, patterns)",{"type":41,"tag":72,"props":2830,"children":2831},{},[2832,2837],{"type":41,"tag":76,"props":2833,"children":2834},{},[2835],{"type":47,"value":2836},"Final Pass",{"type":47,"value":2838},": Suggest improvements and alternatives",{"type":41,"tag":56,"props":2840,"children":2842},{"id":2841},"providing-feedback",[2843],{"type":47,"value":2844},"Providing Feedback",{"type":41,"tag":82,"props":2846,"children":2847},{},[2848,2858,2868,2878],{"type":41,"tag":72,"props":2849,"children":2850},{},[2851,2856],{"type":41,"tag":76,"props":2852,"children":2853},{},[2854],{"type":47,"value":2855},"Critical Issues",{"type":47,"value":2857},": Security vulnerabilities, data loss risks",{"type":41,"tag":72,"props":2859,"children":2860},{},[2861,2866],{"type":41,"tag":76,"props":2862,"children":2863},{},[2864],{"type":47,"value":2865},"Important",{"type":47,"value":2867},": Performance problems, broken reactivity",{"type":41,"tag":72,"props":2869,"children":2870},{},[2871,2876],{"type":41,"tag":76,"props":2872,"children":2873},{},[2874],{"type":47,"value":2875},"Suggestions",{"type":47,"value":2877},": Better patterns, code organization",{"type":41,"tag":72,"props":2879,"children":2880},{},[2881,2886],{"type":41,"tag":76,"props":2882,"children":2883},{},[2884],{"type":47,"value":2885},"Praise",{"type":47,"value":2887},": Good patterns, clever solutions",{"type":41,"tag":50,"props":2889,"children":2890},{},[2891,2893,2899,2901,2906],{"type":47,"value":2892},"Always explain ",{"type":41,"tag":2894,"props":2895,"children":2896},"em",{},[2897],{"type":47,"value":2898},"why",{"type":47,"value":2900}," something should change, not just ",{"type":41,"tag":2894,"props":2902,"children":2903},{},[2904],{"type":47,"value":2905},"what",{"type":47,"value":2907}," to change.",{"type":41,"tag":56,"props":2909,"children":2911},{"id":2910},"example-review",[2912],{"type":47,"value":2913},"Example Review",{"type":41,"tag":788,"props":2915,"children":2917},{"className":790,"code":2916,"language":792,"meta":793,"style":793},"\u002F\u002F Code being reviewed\nexport const updateUser = mutation({\n  args: { userId: v.id(\"users\"), name: v.string() },\n  handler: async (ctx, args) => {\n    await ctx.db.patch(args.userId, { name: args.name });\n  },\n});\n",[2918],{"type":41,"tag":101,"props":2919,"children":2920},{"__ignoreMap":793},[2921,2929,2961,3050,3093,3179,3186],{"type":41,"tag":799,"props":2922,"children":2923},{"class":801,"line":802},[2924],{"type":41,"tag":799,"props":2925,"children":2926},{"style":806},[2927],{"type":47,"value":2928},"\u002F\u002F Code being reviewed\n",{"type":41,"tag":799,"props":2930,"children":2931},{"class":801,"line":24},[2932,2936,2940,2945,2949,2953,2957],{"type":41,"tag":799,"props":2933,"children":2934},{"style":833},[2935],{"type":47,"value":1207},{"type":41,"tag":799,"props":2937,"children":2938},{"style":815},[2939],{"type":47,"value":1212},{"type":41,"tag":799,"props":2941,"children":2942},{"style":821},[2943],{"type":47,"value":2944}," updateUser ",{"type":41,"tag":799,"props":2946,"children":2947},{"style":827},[2948],{"type":47,"value":830},{"type":41,"tag":799,"props":2950,"children":2951},{"style":863},[2952],{"type":47,"value":1562},{"type":41,"tag":799,"props":2954,"children":2955},{"style":821},[2956],{"type":47,"value":871},{"type":41,"tag":799,"props":2958,"children":2959},{"style":827},[2960],{"type":47,"value":1235},{"type":41,"tag":799,"props":2962,"children":2963},{"class":801,"line":854},[2964,2968,2972,2976,2981,2985,2989,2993,2997,3001,3005,3009,3013,3017,3021,3026,3030,3034,3038,3042,3046],{"type":41,"tag":799,"props":2965,"children":2966},{"style":1311},[2967],{"type":47,"value":1578},{"type":41,"tag":799,"props":2969,"children":2970},{"style":827},[2971],{"type":47,"value":1248},{"type":41,"tag":799,"props":2973,"children":2974},{"style":827},[2975],{"type":47,"value":1587},{"type":41,"tag":799,"props":2977,"children":2978},{"style":1311},[2979],{"type":47,"value":2980}," userId",{"type":41,"tag":799,"props":2982,"children":2983},{"style":827},[2984],{"type":47,"value":1248},{"type":41,"tag":799,"props":2986,"children":2987},{"style":821},[2988],{"type":47,"value":1601},{"type":41,"tag":799,"props":2990,"children":2991},{"style":827},[2992],{"type":47,"value":846},{"type":41,"tag":799,"props":2994,"children":2995},{"style":863},[2996],{"type":47,"value":1610},{"type":41,"tag":799,"props":2998,"children":2999},{"style":821},[3000],{"type":47,"value":871},{"type":41,"tag":799,"props":3002,"children":3003},{"style":827},[3004],{"type":47,"value":876},{"type":41,"tag":799,"props":3006,"children":3007},{"style":879},[3008],{"type":47,"value":882},{"type":41,"tag":799,"props":3010,"children":3011},{"style":827},[3012],{"type":47,"value":876},{"type":41,"tag":799,"props":3014,"children":3015},{"style":821},[3016],{"type":47,"value":364},{"type":41,"tag":799,"props":3018,"children":3019},{"style":827},[3020],{"type":47,"value":973},{"type":41,"tag":799,"props":3022,"children":3023},{"style":1311},[3024],{"type":47,"value":3025}," name",{"type":41,"tag":799,"props":3027,"children":3028},{"style":827},[3029],{"type":47,"value":1248},{"type":41,"tag":799,"props":3031,"children":3032},{"style":821},[3033],{"type":47,"value":1601},{"type":41,"tag":799,"props":3035,"children":3036},{"style":827},[3037],{"type":47,"value":846},{"type":41,"tag":799,"props":3039,"children":3040},{"style":863},[3041],{"type":47,"value":2558},{"type":41,"tag":799,"props":3043,"children":3044},{"style":821},[3045],{"type":47,"value":2563},{"type":41,"tag":799,"props":3047,"children":3048},{"style":827},[3049],{"type":47,"value":1636},{"type":41,"tag":799,"props":3051,"children":3052},{"class":801,"line":894},[3053,3057,3061,3065,3069,3073,3077,3081,3085,3089],{"type":41,"tag":799,"props":3054,"children":3055},{"style":863},[3056],{"type":47,"value":1243},{"type":41,"tag":799,"props":3058,"children":3059},{"style":827},[3060],{"type":47,"value":1248},{"type":41,"tag":799,"props":3062,"children":3063},{"style":815},[3064],{"type":47,"value":1253},{"type":41,"tag":799,"props":3066,"children":3067},{"style":827},[3068],{"type":47,"value":1258},{"type":41,"tag":799,"props":3070,"children":3071},{"style":911},[3072],{"type":47,"value":1263},{"type":41,"tag":799,"props":3074,"children":3075},{"style":827},[3076],{"type":47,"value":973},{"type":41,"tag":799,"props":3078,"children":3079},{"style":911},[3080],{"type":47,"value":1668},{"type":41,"tag":799,"props":3082,"children":3083},{"style":827},[3084],{"type":47,"value":364},{"type":41,"tag":799,"props":3086,"children":3087},{"style":815},[3088],{"type":47,"value":919},{"type":41,"tag":799,"props":3090,"children":3091},{"style":827},[3092],{"type":47,"value":1276},{"type":41,"tag":799,"props":3094,"children":3095},{"class":801,"line":981},[3096,3100,3104,3108,3112,3116,3121,3125,3129,3133,3137,3141,3145,3149,3153,3157,3161,3166,3171,3175],{"type":41,"tag":799,"props":3097,"children":3098},{"style":833},[3099],{"type":47,"value":1688},{"type":41,"tag":799,"props":3101,"children":3102},{"style":821},[3103],{"type":47,"value":841},{"type":41,"tag":799,"props":3105,"children":3106},{"style":827},[3107],{"type":47,"value":846},{"type":41,"tag":799,"props":3109,"children":3110},{"style":821},[3111],{"type":47,"value":1348},{"type":41,"tag":799,"props":3113,"children":3114},{"style":827},[3115],{"type":47,"value":846},{"type":41,"tag":799,"props":3117,"children":3118},{"style":863},[3119],{"type":47,"value":3120},"patch",{"type":41,"tag":799,"props":3122,"children":3123},{"style":1311},[3124],{"type":47,"value":871},{"type":41,"tag":799,"props":3126,"children":3127},{"style":821},[3128],{"type":47,"value":190},{"type":41,"tag":799,"props":3130,"children":3131},{"style":827},[3132],{"type":47,"value":846},{"type":41,"tag":799,"props":3134,"children":3135},{"style":821},[3136],{"type":47,"value":2238},{"type":41,"tag":799,"props":3138,"children":3139},{"style":827},[3140],{"type":47,"value":973},{"type":41,"tag":799,"props":3142,"children":3143},{"style":827},[3144],{"type":47,"value":1587},{"type":41,"tag":799,"props":3146,"children":3147},{"style":1311},[3148],{"type":47,"value":3025},{"type":41,"tag":799,"props":3150,"children":3151},{"style":827},[3152],{"type":47,"value":1248},{"type":41,"tag":799,"props":3154,"children":3155},{"style":821},[3156],{"type":47,"value":1668},{"type":41,"tag":799,"props":3158,"children":3159},{"style":827},[3160],{"type":47,"value":846},{"type":41,"tag":799,"props":3162,"children":3163},{"style":821},[3164],{"type":47,"value":3165},"name",{"type":41,"tag":799,"props":3167,"children":3168},{"style":827},[3169],{"type":47,"value":3170}," }",{"type":41,"tag":799,"props":3172,"children":3173},{"style":1311},[3174],{"type":47,"value":364},{"type":41,"tag":799,"props":3176,"children":3177},{"style":827},[3178],{"type":47,"value":1001},{"type":41,"tag":799,"props":3180,"children":3181},{"class":801,"line":1380},[3182],{"type":41,"tag":799,"props":3183,"children":3184},{"style":827},[3185],{"type":47,"value":1495},{"type":41,"tag":799,"props":3187,"children":3188},{"class":801,"line":1468},[3189,3193,3197],{"type":41,"tag":799,"props":3190,"children":3191},{"style":827},[3192],{"type":47,"value":1504},{"type":41,"tag":799,"props":3194,"children":3195},{"style":821},[3196],{"type":47,"value":364},{"type":41,"tag":799,"props":3198,"children":3199},{"style":827},[3200],{"type":47,"value":1001},{"type":41,"tag":50,"props":3202,"children":3203},{},[3204],{"type":41,"tag":76,"props":3205,"children":3206},{},[3207],{"type":47,"value":3208},"Review:",{"type":41,"tag":50,"props":3210,"children":3211},{},[3212,3214,3219],{"type":47,"value":3213},"🔴 ",{"type":41,"tag":76,"props":3215,"children":3216},{},[3217],{"type":47,"value":3218},"Critical - Security",{"type":47,"value":3220},": Missing authentication and authorization checks",{"type":41,"tag":82,"props":3222,"children":3223},{},[3224,3229,3241],{"type":41,"tag":72,"props":3225,"children":3226},{},[3227],{"type":47,"value":3228},"Any user can update any other user's name",{"type":41,"tag":72,"props":3230,"children":3231},{},[3232,3234,3239],{"type":47,"value":3233},"Should verify ",{"type":41,"tag":101,"props":3235,"children":3237},{"className":3236},[],[3238],{"type":47,"value":106},{"type":47,"value":3240}," is authenticated",{"type":41,"tag":72,"props":3242,"children":3243},{},[3244],{"type":47,"value":3245},"Should verify the authenticated user is updating their own profile",{"type":41,"tag":50,"props":3247,"children":3248},{},[3249,3251,3256,3258,3263],{"type":47,"value":3250},"🟡 ",{"type":41,"tag":76,"props":3252,"children":3253},{},[3254],{"type":47,"value":3255},"Missing",{"type":47,"value":3257},": No ",{"type":41,"tag":101,"props":3259,"children":3261},{"className":3260},[],[3262],{"type":47,"value":207},{"type":47,"value":3264}," validator defined",{"type":41,"tag":50,"props":3266,"children":3267},{},[3268],{"type":41,"tag":76,"props":3269,"children":3270},{},[3271],{"type":47,"value":3272},"Suggested fix:",{"type":41,"tag":788,"props":3274,"children":3276},{"className":790,"code":3275,"language":792,"meta":793,"style":793},"export const updateUser = mutation({\n  args: { name: v.string() },\n  returns: v.id(\"users\"),\n  handler: async (ctx, args) => {\n    const user = await getCurrentUser(ctx); \u002F\u002F Checks auth\n    await ctx.db.patch(user._id, { name: args.name });\n    return user._id;\n  },\n});\n",[3277],{"type":41,"tag":101,"props":3278,"children":3279},{"__ignoreMap":793},[3280,3311,3354,3403,3446,3490,3574,3597,3604],{"type":41,"tag":799,"props":3281,"children":3282},{"class":801,"line":802},[3283,3287,3291,3295,3299,3303,3307],{"type":41,"tag":799,"props":3284,"children":3285},{"style":833},[3286],{"type":47,"value":1207},{"type":41,"tag":799,"props":3288,"children":3289},{"style":815},[3290],{"type":47,"value":1212},{"type":41,"tag":799,"props":3292,"children":3293},{"style":821},[3294],{"type":47,"value":2944},{"type":41,"tag":799,"props":3296,"children":3297},{"style":827},[3298],{"type":47,"value":830},{"type":41,"tag":799,"props":3300,"children":3301},{"style":863},[3302],{"type":47,"value":1562},{"type":41,"tag":799,"props":3304,"children":3305},{"style":821},[3306],{"type":47,"value":871},{"type":41,"tag":799,"props":3308,"children":3309},{"style":827},[3310],{"type":47,"value":1235},{"type":41,"tag":799,"props":3312,"children":3313},{"class":801,"line":24},[3314,3318,3322,3326,3330,3334,3338,3342,3346,3350],{"type":41,"tag":799,"props":3315,"children":3316},{"style":1311},[3317],{"type":47,"value":1578},{"type":41,"tag":799,"props":3319,"children":3320},{"style":827},[3321],{"type":47,"value":1248},{"type":41,"tag":799,"props":3323,"children":3324},{"style":827},[3325],{"type":47,"value":1587},{"type":41,"tag":799,"props":3327,"children":3328},{"style":1311},[3329],{"type":47,"value":3025},{"type":41,"tag":799,"props":3331,"children":3332},{"style":827},[3333],{"type":47,"value":1248},{"type":41,"tag":799,"props":3335,"children":3336},{"style":821},[3337],{"type":47,"value":1601},{"type":41,"tag":799,"props":3339,"children":3340},{"style":827},[3341],{"type":47,"value":846},{"type":41,"tag":799,"props":3343,"children":3344},{"style":863},[3345],{"type":47,"value":2558},{"type":41,"tag":799,"props":3347,"children":3348},{"style":821},[3349],{"type":47,"value":2563},{"type":41,"tag":799,"props":3351,"children":3352},{"style":827},[3353],{"type":47,"value":1636},{"type":41,"tag":799,"props":3355,"children":3356},{"class":801,"line":854},[3357,3362,3366,3370,3374,3378,3382,3386,3390,3394,3398],{"type":41,"tag":799,"props":3358,"children":3359},{"style":1311},[3360],{"type":47,"value":3361},"  returns",{"type":41,"tag":799,"props":3363,"children":3364},{"style":827},[3365],{"type":47,"value":1248},{"type":41,"tag":799,"props":3367,"children":3368},{"style":821},[3369],{"type":47,"value":1601},{"type":41,"tag":799,"props":3371,"children":3372},{"style":827},[3373],{"type":47,"value":846},{"type":41,"tag":799,"props":3375,"children":3376},{"style":863},[3377],{"type":47,"value":1610},{"type":41,"tag":799,"props":3379,"children":3380},{"style":821},[3381],{"type":47,"value":871},{"type":41,"tag":799,"props":3383,"children":3384},{"style":827},[3385],{"type":47,"value":876},{"type":41,"tag":799,"props":3387,"children":3388},{"style":879},[3389],{"type":47,"value":882},{"type":41,"tag":799,"props":3391,"children":3392},{"style":827},[3393],{"type":47,"value":876},{"type":41,"tag":799,"props":3395,"children":3396},{"style":821},[3397],{"type":47,"value":364},{"type":41,"tag":799,"props":3399,"children":3400},{"style":827},[3401],{"type":47,"value":3402},",\n",{"type":41,"tag":799,"props":3404,"children":3405},{"class":801,"line":894},[3406,3410,3414,3418,3422,3426,3430,3434,3438,3442],{"type":41,"tag":799,"props":3407,"children":3408},{"style":863},[3409],{"type":47,"value":1243},{"type":41,"tag":799,"props":3411,"children":3412},{"style":827},[3413],{"type":47,"value":1248},{"type":41,"tag":799,"props":3415,"children":3416},{"style":815},[3417],{"type":47,"value":1253},{"type":41,"tag":799,"props":3419,"children":3420},{"style":827},[3421],{"type":47,"value":1258},{"type":41,"tag":799,"props":3423,"children":3424},{"style":911},[3425],{"type":47,"value":1263},{"type":41,"tag":799,"props":3427,"children":3428},{"style":827},[3429],{"type":47,"value":973},{"type":41,"tag":799,"props":3431,"children":3432},{"style":911},[3433],{"type":47,"value":1668},{"type":41,"tag":799,"props":3435,"children":3436},{"style":827},[3437],{"type":47,"value":364},{"type":41,"tag":799,"props":3439,"children":3440},{"style":815},[3441],{"type":47,"value":919},{"type":41,"tag":799,"props":3443,"children":3444},{"style":827},[3445],{"type":47,"value":1276},{"type":41,"tag":799,"props":3447,"children":3448},{"class":801,"line":981},[3449,3453,3457,3461,3465,3469,3473,3477,3481,3485],{"type":41,"tag":799,"props":3450,"children":3451},{"style":815},[3452],{"type":47,"value":1284},{"type":41,"tag":799,"props":3454,"children":3455},{"style":821},[3456],{"type":47,"value":2184},{"type":41,"tag":799,"props":3458,"children":3459},{"style":827},[3460],{"type":47,"value":1294},{"type":41,"tag":799,"props":3462,"children":3463},{"style":833},[3464],{"type":47,"value":836},{"type":41,"tag":799,"props":3466,"children":3467},{"style":863},[3468],{"type":47,"value":2197},{"type":41,"tag":799,"props":3470,"children":3471},{"style":1311},[3472],{"type":47,"value":871},{"type":41,"tag":799,"props":3474,"children":3475},{"style":821},[3476],{"type":47,"value":1263},{"type":41,"tag":799,"props":3478,"children":3479},{"style":1311},[3480],{"type":47,"value":364},{"type":41,"tag":799,"props":3482,"children":3483},{"style":827},[3484],{"type":47,"value":1318},{"type":41,"tag":799,"props":3486,"children":3487},{"style":806},[3488],{"type":47,"value":3489}," \u002F\u002F Checks auth\n",{"type":41,"tag":799,"props":3491,"children":3492},{"class":801,"line":1380},[3493,3497,3501,3505,3509,3513,3517,3521,3526,3530,3534,3538,3542,3546,3550,3554,3558,3562,3566,3570],{"type":41,"tag":799,"props":3494,"children":3495},{"style":833},[3496],{"type":47,"value":1688},{"type":41,"tag":799,"props":3498,"children":3499},{"style":821},[3500],{"type":47,"value":841},{"type":41,"tag":799,"props":3502,"children":3503},{"style":827},[3504],{"type":47,"value":846},{"type":41,"tag":799,"props":3506,"children":3507},{"style":821},[3508],{"type":47,"value":1348},{"type":41,"tag":799,"props":3510,"children":3511},{"style":827},[3512],{"type":47,"value":846},{"type":41,"tag":799,"props":3514,"children":3515},{"style":863},[3516],{"type":47,"value":3120},{"type":41,"tag":799,"props":3518,"children":3519},{"style":1311},[3520],{"type":47,"value":871},{"type":41,"tag":799,"props":3522,"children":3523},{"style":821},[3524],{"type":47,"value":3525},"user",{"type":41,"tag":799,"props":3527,"children":3528},{"style":827},[3529],{"type":47,"value":846},{"type":41,"tag":799,"props":3531,"children":3532},{"style":821},[3533],{"type":47,"value":2256},{"type":41,"tag":799,"props":3535,"children":3536},{"style":827},[3537],{"type":47,"value":973},{"type":41,"tag":799,"props":3539,"children":3540},{"style":827},[3541],{"type":47,"value":1587},{"type":41,"tag":799,"props":3543,"children":3544},{"style":1311},[3545],{"type":47,"value":3025},{"type":41,"tag":799,"props":3547,"children":3548},{"style":827},[3549],{"type":47,"value":1248},{"type":41,"tag":799,"props":3551,"children":3552},{"style":821},[3553],{"type":47,"value":1668},{"type":41,"tag":799,"props":3555,"children":3556},{"style":827},[3557],{"type":47,"value":846},{"type":41,"tag":799,"props":3559,"children":3560},{"style":821},[3561],{"type":47,"value":3165},{"type":41,"tag":799,"props":3563,"children":3564},{"style":827},[3565],{"type":47,"value":3170},{"type":41,"tag":799,"props":3567,"children":3568},{"style":1311},[3569],{"type":47,"value":364},{"type":41,"tag":799,"props":3571,"children":3572},{"style":827},[3573],{"type":47,"value":1001},{"type":41,"tag":799,"props":3575,"children":3576},{"class":801,"line":1468},[3577,3581,3585,3589,3593],{"type":41,"tag":799,"props":3578,"children":3579},{"style":833},[3580],{"type":47,"value":1331},{"type":41,"tag":799,"props":3582,"children":3583},{"style":821},[3584],{"type":47,"value":2184},{"type":41,"tag":799,"props":3586,"children":3587},{"style":827},[3588],{"type":47,"value":846},{"type":41,"tag":799,"props":3590,"children":3591},{"style":821},[3592],{"type":47,"value":2256},{"type":41,"tag":799,"props":3594,"children":3595},{"style":827},[3596],{"type":47,"value":1001},{"type":41,"tag":799,"props":3598,"children":3599},{"class":801,"line":1489},[3600],{"type":41,"tag":799,"props":3601,"children":3602},{"style":827},[3603],{"type":47,"value":1495},{"type":41,"tag":799,"props":3605,"children":3606},{"class":801,"line":1498},[3607,3611,3615],{"type":41,"tag":799,"props":3608,"children":3609},{"style":827},[3610],{"type":47,"value":1504},{"type":41,"tag":799,"props":3612,"children":3613},{"style":821},[3614],{"type":47,"value":364},{"type":41,"tag":799,"props":3616,"children":3617},{"style":827},[3618],{"type":47,"value":1001},{"type":41,"tag":50,"props":3620,"children":3621},{},[3622],{"type":47,"value":3623},"Changes:",{"type":41,"tag":82,"props":3625,"children":3626},{},[3627,3639,3650,3661],{"type":41,"tag":72,"props":3628,"children":3629},{},[3630,3632,3637],{"type":47,"value":3631},"Removed ",{"type":41,"tag":101,"props":3633,"children":3635},{"className":3634},[],[3636],{"type":47,"value":2238},{"type":47,"value":3638}," arg - users can only update themselves",{"type":41,"tag":72,"props":3640,"children":3641},{},[3642,3644],{"type":47,"value":3643},"Added auth check via ",{"type":41,"tag":101,"props":3645,"children":3647},{"className":3646},[],[3648],{"type":47,"value":3649},"getCurrentUser()",{"type":41,"tag":72,"props":3651,"children":3652},{},[3653,3655,3660],{"type":47,"value":3654},"Added ",{"type":41,"tag":101,"props":3656,"children":3658},{"className":3657},[],[3659],{"type":47,"value":207},{"type":47,"value":192},{"type":41,"tag":72,"props":3662,"children":3663},{},[3664],{"type":47,"value":3665},"Users automatically update their own profile",{"type":41,"tag":3667,"props":3668,"children":3669},"style",{},[3670],{"type":47,"value":3671},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3673,"total":3853},[3674,3689,3704,3719,3734,3751,3765,3777,3796,3809,3826,3840],{"slug":8,"name":8,"fn":3675,"description":3676,"org":3677,"tags":3678,"stars":3686,"repoUrl":3687,"updatedAt":3688},"guide Convex project setup and usage","Routes general Convex requests to the right project skill. Use when the user asks which Convex skill to use or gives an underspecified Convex app task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3679,3682,3683],{"name":3680,"slug":3681,"type":16},"Backend","backend",{"name":9,"slug":8,"type":16},{"name":3684,"slug":3685,"type":16},"Database","database",34,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills","2026-07-12T08:00:45.091281",{"slug":3690,"name":3690,"fn":3691,"description":3692,"org":3693,"tags":3694,"stars":3686,"repoUrl":3687,"updatedAt":3703},"convex-create-component","build reusable Convex components","Builds reusable Convex components with isolated tables and app-facing APIs. Use for new components, reusable backend modules, integrations, or component boundary work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3695,3698,3701,3702],{"name":3696,"slug":3697,"type":16},"API Development","api-development",{"name":3699,"slug":3700,"type":16},"Architecture","architecture",{"name":3680,"slug":3681,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T08:00:39.428577",{"slug":3705,"name":3705,"fn":3706,"description":3707,"org":3708,"tags":3709,"stars":3686,"repoUrl":3687,"updatedAt":3718},"convex-migration-helper","plan Convex schema and data migrations","Plans Convex schema and data migrations with widen-migrate-narrow and @convex-dev\u002Fmigrations. Use for breaking schema changes, backfills, table reshaping, or zero-downtime rollouts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3710,3711,3712,3715],{"name":3680,"slug":3681,"type":16},{"name":9,"slug":8,"type":16},{"name":3713,"slug":3714,"type":16},"Data Engineering","data-engineering",{"name":3716,"slug":3717,"type":16},"Migration","migration","2026-07-12T08:00:51.27967",{"slug":3720,"name":3720,"fn":3721,"description":3722,"org":3723,"tags":3724,"stars":3686,"repoUrl":3687,"updatedAt":3733},"convex-performance-audit","audit Convex application performance","Audits Convex performance for reads, subscriptions, write contention, and function limits. Use for slow features, insights findings, OCC conflicts, or read amplification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3725,3726,3729,3732],{"name":9,"slug":8,"type":16},{"name":3727,"slug":3728,"type":16},"Debugging","debugging",{"name":3730,"slug":3731,"type":16},"Monitoring","monitoring",{"name":18,"slug":19,"type":16},"2026-07-12T08:00:50.02928",{"slug":3735,"name":3735,"fn":3736,"description":3737,"org":3738,"tags":3739,"stars":3686,"repoUrl":3687,"updatedAt":3750},"convex-quickstart","initialize Convex in applications","Creates or adds Convex to an app. Use for new Convex projects, npm create convex@latest, frontend setup, env vars, or the first npx convex dev run.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3740,3743,3744,3747],{"name":3741,"slug":3742,"type":16},"CLI","cli",{"name":9,"slug":8,"type":16},{"name":3745,"slug":3746,"type":16},"Frontend","frontend",{"name":3748,"slug":3749,"type":16},"Onboarding","onboarding","2026-07-12T08:00:43.436152",{"slug":3752,"name":3752,"fn":3753,"description":3754,"org":3755,"tags":3756,"stars":3686,"repoUrl":3687,"updatedAt":3764},"convex-setup-auth","set up authentication and access control","Sets up Convex auth, identity mapping, and access control. Use for login, auth providers, users tables, protected functions, or roles in a Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3757,3760,3762,3763],{"name":3758,"slug":3759,"type":16},"Access Control","access-control",{"name":3761,"slug":1946,"type":16},"Auth",{"name":3680,"slug":3681,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T08:00:48.652641",{"slug":3766,"name":3766,"fn":3767,"description":3768,"org":3769,"tags":3770,"stars":24,"repoUrl":25,"updatedAt":3776},"add","add capabilities to Convex applications","Add a capability to the CURRENT Convex + Next.js project — consults the served Convex capability catalog for always-current procedures (billing, crons, auth, agent, search, …); falls back to built-in hosting or @convex-dev component search. TRIGGER when the user runs $add, or asks to add hosting\u002Fpublishing or any backend capability to an existing Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3771,3772,3773],{"name":3680,"slug":3681,"type":16},{"name":9,"slug":8,"type":16},{"name":3774,"slug":3775,"type":16},"Next.js","next-js","2026-07-12T07:59:59.358004",{"slug":3778,"name":3778,"fn":3779,"description":3780,"org":3781,"tags":3782,"stars":24,"repoUrl":25,"updatedAt":3795},"agent","build AI agents with Convex","Build an AI agent \u002F RAG feature on Convex (@convex-dev\u002Fagent: threads, tools, vector search). TRIGGER on an AI-agent\u002Fchatbot\u002FRAG request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3783,3786,3789,3792],{"name":3784,"slug":3785,"type":16},"Agents","agents",{"name":3787,"slug":3788,"type":16},"Engineering","engineering",{"name":3790,"slug":3791,"type":16},"RAG","rag",{"name":3793,"slug":3794,"type":16},"Search","search","2026-07-12T08:00:01.921824",{"slug":1946,"name":1946,"fn":3797,"description":3798,"org":3799,"tags":3800,"stars":24,"repoUrl":25,"updatedAt":3808},"add authentication to Convex applications","Add sign-in (passkeys by default, OAuth\u002Fpassword optional) to the current Convex app, wired correctly incl. auth.config.ts. TRIGGER on a login\u002Fauth request for an existing app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3801,3802,3804,3805],{"name":3761,"slug":1946,"type":16},{"name":80,"slug":3803,"type":16},"authentication",{"name":9,"slug":8,"type":16},{"name":3806,"slug":3807,"type":16},"OAuth","oauth","2026-07-18T05:12:54.443056",{"slug":3810,"name":3810,"fn":3811,"description":3812,"org":3813,"tags":3814,"stars":24,"repoUrl":25,"updatedAt":3825},"billing","integrate Stripe billing in Convex apps","Add Stripe billing to a Convex app via @convex-dev\u002Fstripe (checkout + auto-verified webhook + subscription gating). TRIGGER on a payments\u002Fbilling\u002Fsubscription request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3815,3816,3819,3822],{"name":9,"slug":8,"type":16},{"name":3817,"slug":3818,"type":16},"Payments","payments",{"name":3820,"slug":3821,"type":16},"Stripe","stripe",{"name":3823,"slug":3824,"type":16},"Webhooks","webhooks","2026-07-12T08:00:08.123246",{"slug":3827,"name":3827,"fn":3828,"description":3829,"org":3830,"tags":3831,"stars":24,"repoUrl":25,"updatedAt":3839},"check-updates","upgrade Convex component versions","Check the CURRENT Convex app's pinned components against the latest recommended versions and offer to upgrade them — e.g. the passkey auth component's new email-first sign-in. TRIGGER when the user runs \u002Fcheck-updates or $check-updates, asks 'are my components up to date', 'any updates', 'upgrade auth', 'upgrade my components', or wants the newest features after a quickstart. Applies each upgrade behind a build gate (verify-or-revert) with the user's consent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3832,3835,3836],{"name":3833,"slug":3834,"type":16},"Configuration","configuration",{"name":9,"slug":8,"type":16},{"name":3837,"slug":3838,"type":16},"Maintenance","maintenance","2026-07-12T08:00:03.236862",{"slug":3841,"name":3841,"fn":3842,"description":3843,"org":3844,"tags":3845,"stars":24,"repoUrl":25,"updatedAt":3852},"convex-authz","audit and harden Convex authorization","Audit and harden a Convex app's authorization: identity-from-arg impersonation, missing per-document ownership checks, and public queries leaking PII\u002Ffinancial data by a client-supplied id — the single largest real-defect cluster measured against generated Convex backends (44 of 214). Runs a deterministic scan for the 3 shapes, then applies the canonical requireIdentity\u002FrequireOwner pattern, then verifies with tsc. TRIGGER on 'secure my app', 'audit auth', 'add login', 'who can access this data', or an explicit 'audit my authz'. NOT always-on. SKIP when there is no convex\u002F directory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3846,3847,3850,3851],{"name":3761,"slug":1946,"type":16},{"name":3848,"slug":3849,"type":16},"Code Analysis","code-analysis",{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},"2026-07-12T08:00:04.516752",26,{"items":3855,"total":3908},[3856,3862,3869,3876,3883,3889,3896],{"slug":3766,"name":3766,"fn":3767,"description":3768,"org":3857,"tags":3858,"stars":24,"repoUrl":25,"updatedAt":3776},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3859,3860,3861],{"name":3680,"slug":3681,"type":16},{"name":9,"slug":8,"type":16},{"name":3774,"slug":3775,"type":16},{"slug":3778,"name":3778,"fn":3779,"description":3780,"org":3863,"tags":3864,"stars":24,"repoUrl":25,"updatedAt":3795},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3865,3866,3867,3868],{"name":3784,"slug":3785,"type":16},{"name":3787,"slug":3788,"type":16},{"name":3790,"slug":3791,"type":16},{"name":3793,"slug":3794,"type":16},{"slug":1946,"name":1946,"fn":3797,"description":3798,"org":3870,"tags":3871,"stars":24,"repoUrl":25,"updatedAt":3808},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3872,3873,3874,3875],{"name":3761,"slug":1946,"type":16},{"name":80,"slug":3803,"type":16},{"name":9,"slug":8,"type":16},{"name":3806,"slug":3807,"type":16},{"slug":3810,"name":3810,"fn":3811,"description":3812,"org":3877,"tags":3878,"stars":24,"repoUrl":25,"updatedAt":3825},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3879,3880,3881,3882],{"name":9,"slug":8,"type":16},{"name":3817,"slug":3818,"type":16},{"name":3820,"slug":3821,"type":16},{"name":3823,"slug":3824,"type":16},{"slug":3827,"name":3827,"fn":3828,"description":3829,"org":3884,"tags":3885,"stars":24,"repoUrl":25,"updatedAt":3839},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3886,3887,3888],{"name":3833,"slug":3834,"type":16},{"name":9,"slug":8,"type":16},{"name":3837,"slug":3838,"type":16},{"slug":3841,"name":3841,"fn":3842,"description":3843,"org":3890,"tags":3891,"stars":24,"repoUrl":25,"updatedAt":3852},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3892,3893,3894,3895],{"name":3761,"slug":1946,"type":16},{"name":3848,"slug":3849,"type":16},{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},{"slug":3897,"name":3897,"fn":3898,"description":3899,"org":3900,"tags":3901,"stars":24,"repoUrl":25,"updatedAt":3907},"convex-expert","develop Convex backend applications","Convex backend rules — consult this whenever writing or editing any code inside a convex\u002F directory (schemas, queries, mutations, actions, HTTP endpoints, crons, file storage, auth, component installation). TRIGGER before touching convex\u002F functions, so the code uses the object-form syntax, validators, indexes, and component patterns that generic models get wrong.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3902,3903,3904,3905],{"name":3680,"slug":3681,"type":16},{"name":9,"slug":8,"type":16},{"name":3684,"slug":3685,"type":16},{"name":3906,"slug":792,"type":16},"TypeScript","2026-07-18T05:12:50.448833",19]