[{"data":1,"prerenderedAt":658},["ShallowReactive",2],{"repo-tree":3,"repo-\u002Fworking-with-ai":283},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,69,72,75,78,81,84,86,88,90,93,96,99,102,105,108,111,114,117,120,123,125,127,129,131,133,135,138,141,143,146,149,152,155,158,161,164,167,169,172,175,178,180,183,186,189,192,195,198,201,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281],{"path":5,"title":6},"\u002Fagents\u002Fbackend-code-style","Backend Conventions",{"path":8,"title":9},"\u002Fagents\u002Fdatabase","Database",{"path":11,"title":12},"\u002Fagents\u002Fportal-code-style","Portal Conventions",{"path":14,"title":15},"\u002Fagents\u002Ftranslation","Translation",{"path":17,"title":18},"\u002Fconventions\u002Fbackend-coding","Backend coding conventions",{"path":20,"title":21},"\u002Fconventions\u002Ffrontend-coding","Frontend coding conventions",{"path":23,"title":24},"\u002Fdevelopment-process","Development process",{"path":26,"title":27},"\u002Flearning-api-preview-hetzner-setup","Learning API Preview on Hetzner + Cloudflare",{"path":29,"title":30},"\u002Flearning-api-preview-vm-plan","Learning API Preview VM Plan",{"path":32,"title":33},"\u002Fmonorepo-structure","Monorepo structure",{"path":35,"title":36},"\u002Foperations","Operations — bugs and support",{"path":38,"title":39},"\u002Fpostmortems\u002F2026-03-16_onboarding-currency-regression","Onboarding Zod transform silently broken — web signups assigned wrong checkout currency",{"path":41,"title":42},"\u002Fpostmortems\u002Freadme","Postmortems",{"path":44,"title":45},"\u002Fpostmortems\u002F_template","TEMPLATE",{"path":47,"title":48},"\u002Fpostmortems\u002Fposthog-comparison","Postmortem practice — comparison with PostHog",{"path":50,"title":51},"\u002Fpreview-environment-plan","Preview Environment Plan",{"path":53,"title":54},"\u002Fprinciples","Engineering principles",{"path":56,"title":57},"\u002Fworking-with-ai","Working with AI",{"path":59,"title":60},"\u002F.claude\u002Fskills\u002Feval-playground\u002Fskill","Eval Playground — Co-development Skill",{"path":62,"title":63},"\u002F.claude\u002Fskills\u002Ffigma-diff-section\u002Fskill","Figma Diff Section Pipeline",{"path":65,"title":66},"\u002Fagents","AGENTS.md",{"path":68,"title":66},"\u002Fclaude",{"path":70,"title":71},"\u002Freadme","Studyflash",{"path":73,"title":74},"\u002Fapps\u002Fcore-api\u002Fagents","Core API (apps\u002Fcore-api)",{"path":76,"title":77},"\u002Fapps\u002Fcore-api\u002Freadme","README",{"path":79,"title":80},"\u002Fapps\u002Femail-previews\u002Fagents","Email Previews (apps\u002Femail-previews)",{"path":82,"title":83},"\u002Fapps\u002Flanding-page\u002Fagents","Landing Page (apps\u002Flanding-page)",{"path":85,"title":83},"\u002Fapps\u002Flanding-page\u002Fclaude",{"path":87,"title":66},"\u002Fapps\u002Flearning-api\u002Fagents",{"path":89,"title":77},"\u002Fapps\u002Flearning-api\u002Freadme",{"path":91,"title":92},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Feval_metrics_design","Surface-Specific Eval Metrics Design",{"path":94,"title":95},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ftest_set","Quiz Eval Test Set",{"path":97,"title":98},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ffrontend\u002Freadme","React + TypeScript + Vite",{"path":100,"title":101},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fcontent-pillar-shallow-coverage\u002Freadme","Content pillar misses subtopics in dense documents",{"path":103,"title":104},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-empty-section-headers\u002Freadme","Empty section headers dropped by docling chunker",{"path":106,"title":107},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-table-reading-order\u002Freadme","Table\u002Fbox layout causes wrong reading order",{"path":109,"title":110},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fmetrics\u002Freadme","Quiz eval metrics — canonical rubrics",{"path":112,"title":113},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-12-quiz-summary-feedback-current-state","Quiz and Summary Feedback Current State",{"path":115,"title":116},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-24-quiz-eval-metrics","Quiz Evaluation Metrics",{"path":118,"title":119},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-05-01-quiz-eval-current-state","Quiz Eval Current State",{"path":121,"title":122},"\u002Fapps\u002Flearning-api\u002Fmonitoring\u002Freadme","Monitoring Stack",{"path":124,"title":77},"\u002Fapps\u002Flearning-api\u002Fshared\u002Freadme",{"path":126,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fflashcard_agent\u002Freadme",{"path":128,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fingestion_agent\u002Freadme",{"path":130,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fquiz_agent\u002Freadme",{"path":132,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fsummary_agent\u002Freadme",{"path":134,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Fparser\u002Freadme",{"path":136,"title":137},"\u002Fapps\u002Fmarketing-emails-preview\u002Fagents","Marketing Emails Preview (apps\u002Fmarketing-emails-preview)",{"path":139,"title":140},"\u002Fapps\u002Fmobile-app\u002Fagents","StudyFlash Mobile App - Claude Code Configuration",{"path":142,"title":140},"\u002Fapps\u002Fmobile-app\u002Fclaude",{"path":144,"title":145},"\u002Fapps\u002Fmountain-max\u002Fagents","Mountain Max (apps\u002Fmountain-max)",{"path":147,"title":148},"\u002Fapps\u002Fmountain-max\u002Fgame\u002Freadme","Mountain Max Game",{"path":150,"title":151},"\u002Fapps\u002Fportal\u002Fagents","Portal (apps\u002Fportal)",{"path":153,"title":154},"\u002Fapps\u002Fportal\u002Freadme","Nuxt Minimal Starter",{"path":156,"title":157},"\u002Fapps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002Freadme","File Upload Composables",{"path":159,"title":160},"\u002Fapps\u002Fportal\u002Fdocs\u002Flibrary-routing","Library Routing Documentation",{"path":162,"title":163},"\u002Fapps\u002Fsupabase\u002Fagents","Supabase (apps\u002Fsupabase)",{"path":165,"title":166},"\u002Fapps\u002Fwrapped\u002Fagents","Wrapped (apps\u002Fwrapped)",{"path":168,"title":98},"\u002Fapps\u002Fwrapped\u002Freadme",{"path":170,"title":171},"\u002Finfra\u002Freadme","infra\u002F",{"path":173,"title":174},"\u002Finfra\u002Fdns\u002Freadme","DNS Infrastructure",{"path":176,"title":177},"\u002Finfra\u002Fdokploy\u002Freadme","studyflash-dokploy",{"path":179,"title":77},"\u002Finfra\u002Fdokploy\u002Fsdk\u002Fnodejs\u002Freadme",{"path":181,"title":182},"\u002Finfra\u002Finfisical\u002Freadme","Infisical Infrastructure",{"path":184,"title":185},"\u002Finfra\u002Flearning-api\u002Freadme","Pulumi GCP TypeScript Template",{"path":187,"title":188},"\u002Finfra\u002Fopenreplay\u002Freadme","OpenReplay on Hetzner",{"path":190,"title":191},"\u002Finfra\u002Fscripts\u002Freadme","infra\u002Fscripts\u002F",{"path":193,"title":194},"\u002Finfra\u002Fturborepo-cache\u002Freadme","Turborepo Remote Cache Infrastructure",{"path":196,"title":197},"\u002Finternal\u002Fchatwoot\u002Freadme","Chatwoot Infrastructure",{"path":199,"title":200},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Freadme","studyflash-chatwoot-provider",{"path":202,"title":77},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Fsdk\u002Fnodejs\u002Freadme",{"path":204,"title":205},"\u002Finternal\u002Fdocs\u002Freadme","internal\u002Fdocs",{"path":207,"title":208},"\u002Finternal\u002Fsupport-bot\u002Fclaude","Support Bot (Maximilian)",{"path":210,"title":211},"\u002Finternal\u002Fsupport-bot\u002Freadme","Studyflash Customer Support Bot (Maximilian)",{"path":213,"title":214},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Faccount_issues","Account Issues",{"path":216,"title":217},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fbilling_invoice","Billing Invoice",{"path":219,"title":220},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fcontent_upload","Content Upload",{"path":222,"title":223},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fdata_loss","Data Loss",{"path":225,"title":226},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fflashcard_issues","Flashcard Issues",{"path":228,"title":229},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgarbage","Garbage",{"path":231,"title":232},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgeneral_how_to","General How To",{"path":234,"title":235},"\u002Finternal\u002Fsupport-bot\u002Fkb","Knowledge Base Index",{"path":237,"title":238},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Flanguage_issues","Language Issues",{"path":240,"title":241},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmindmap_issues","Mindmap Issues",{"path":243,"title":244},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmisunderstanding","Misunderstanding",{"path":246,"title":247},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmock_exam_issues","Mock Exam Issues",{"path":249,"title":250},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fpodcast_issues","Podcast Issues",{"path":252,"title":253},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fquiz_issues","Quiz Issues",{"path":255,"title":256},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Frefund_request","Refund Request",{"path":258,"title":259},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_cancellation","Subscription Cancellation",{"path":261,"title":262},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_info","Subscription Info",{"path":264,"title":265},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsummary_issues","Summary Issues",{"path":267,"title":268},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Ftechnical_errors","Technical Errors",{"path":270,"title":271},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fvideo_issues","Video Issues",{"path":273,"title":274},"\u002Fpackages\u002Fcommon\u002Fdocs\u002Fearly-access-features","Declarative Early Access Features",{"path":276,"title":277},"\u002Fpackages\u002Fcommon\u002Fscripts\u002Freadme","Common Package Scripts",{"path":279,"title":280},"\u002Fpackages\u002Fdevtools\u002Ffigma-plugins\u002Freadme","Figma plugins",{"path":282,"title":77},"\u002Fpackages\u002Fpulumi-infisical\u002Freadme",{"id":284,"title":57,"body":285,"description":644,"extension":645,"lastReviewed":646,"meta":647,"navigation":648,"owner":649,"path":56,"seo":650,"status":651,"stem":652,"tags":653,"__hash__":657},"handbook\u002Fworking-with-ai.md",{"type":286,"value":287,"toc":632},"minimark",[288,299,304,309,312,349,384,387,391,394,397,400,411,414,418,421,424,426,444,446,457,461,527,531,534,549,553,556,589,593,596,611,615],[289,290,291],"blockquote",{},[292,293,294,298],"p",{},[295,296,297],"strong",{},"Status: draft scaffold."," Captures how we actually use Claude Code, Cursor, and ad-hoc agents in day-to-day work. Two parts: the workflow modes, and the cultural rule about output ownership.",[300,301,303],"h2",{"id":302},"the-slop-rule-non-negotiable","The slop rule (non-negotiable)",[289,305,306],{},[292,307,308],{},"You own everything you commit. The AI is a tool; the slop is yours.",[292,310,311],{},"What this means in practice:",[313,314,315,322,328,334],"ul",{},[316,317,318,321],"li",{},[295,319,320],{},"No \"the AI wrote it\" defense."," If you open a PR, you signed off. Reviewer pushback is on you, not the model.",[316,323,324,327],{},[295,325,326],{},"You read every line before staging."," No exceptions. If the diff is too big to read carefully, it's too big to merge.",[316,329,330,333],{},[295,331,332],{},"You do not hand unread output to teammates."," Not to reviewers, not in tickets, not in Slack threads. If you didn't read it, neither will they.",[316,335,336,348],{},[295,337,338,339,343,344,347],{},"Slop is not a noun for ",[340,341,342],"em",{},"AI-generated"," — it's a noun for ",[340,345,346],{},"unread","."," Hand-written code you didn't think about is also slop.",[292,350,351,354,355,359,360,363,364,367,368,371,372,379,380,383],{},[295,352,353],{},"PH analogue: none."," Their ",[356,357,358],"code",{},"\u002Fengineering\u002Fai\u002F*"," handbook pages are about ",[340,361,362],{},"building"," AI products, not about engineers using AI to write code. They codify AI guardrails in ",[356,365,366],{},".cursor\u002Frules"," and ",[356,369,370],{},"CLAUDE.md"," files at the repo level, not in narrative docs. Closest cultural artifact is a ",[373,374,378],"a",{"href":375,"rel":376},"https:\u002F\u002Fnewsletter.posthog.com\u002Fp\u002Favoid-these-ai-coding-mistakes",[377],"nofollow","PostHog newsletter post by Ian Vanagas",": ",[340,381,382],{},"\"Ultimately, you are responsible for the end product of what you create. This is true whether you use AI or not.\""," That's the slop rule in one sentence, but off-handbook.",[292,385,386],{},"This doc is net-new territory.",[300,388,390],{"id":389},"pair-programming-with-ai","Pair programming with AI",[292,392,393],{},"You drive, the AI watches. Tight feedback loop, you stay in the driver's seat.",[292,395,396],{},"When: small targeted changes, debugging, exploring an unfamiliar area, anything you'd want a second pair of eyes on while typing.",[292,398,399],{},"Shape:",[313,401,402,405,408],{},[316,403,404],{},"Claude Code or Cursor in your editor.",[316,406,407],{},"You type \u002F prompt → AI suggests → you accept \u002F edit \u002F reject.",[316,409,410],{},"Conversation lives in your head; the artifact is the diff.",[292,412,413],{},"Studyflash-specific tips: TODO.",[300,415,417],{"id":416},"peer-programming-with-ai","Peer programming with AI",[292,419,420],{},"You delegate, the AI works alone, you review. Async, batch-able.",[292,422,423],{},"When: well-scoped tasks where you can specify the contract clearly, parallel work, things you'd otherwise put off.",[292,425,399],{},[313,427,428,435,438,441],{},[316,429,430,431,434],{},"Spawn an agent (Claude Code background task, ",[356,432,433],{},"\u002Floop",", worktree agent, \u002Fschedule for a recurring task).",[316,436,437],{},"Brief it like a smart colleague who walked into the room — context, intent, success criteria.",[316,439,440],{},"Come back, review the diff like any other PR.",[316,442,443],{},"Trust but verify: an agent's summary describes what it intended; check what it actually did.",[292,445,413],{},[313,447,448,451,454],{},[316,449,450],{},"\u002Fworktree for isolated work (defaults to opening a PR).",[316,452,453],{},"\u002Fultrareview for a multi-agent review pass on a branch \u002F PR.",[316,455,456],{},"Background agents for long-running scoped tasks (eval runs, migration sweeps, doc audits).",[300,458,460],{"id":459},"mode-picking-heuristic","Mode-picking heuristic",[462,463,464,477],"table",{},[465,466,467],"thead",{},[468,469,470,474],"tr",{},[471,472,473],"th",{},"Situation",[471,475,476],{},"Mode",[478,479,480,489,497,504,511,519],"tbody",{},[468,481,482,486],{},[483,484,485],"td",{},"Bug fix in code you don't fully understand",[483,487,488],{},"Pair",[468,490,491,494],{},[483,492,493],{},"\"Touch all the files matching X pattern\"",[483,495,496],{},"Peer",[468,498,499,502],{},[483,500,501],{},"Stuck on a hard problem",[483,503,488],{},[468,505,506,509],{},[483,507,508],{},"Routine refactor with a clear pattern",[483,510,496],{},[468,512,513,516],{},[483,514,515],{},"Net-new feature with unclear shape",[483,517,518],{},"Pair (until the shape's clear, then maybe split off pieces to peer)",[468,520,521,524],{},[483,522,523],{},"Eval runs \u002F long-running batch",[483,525,526],{},"Peer (background)",[300,528,530],{"id":529},"memory-and-durable-instructions","Memory and durable instructions",[292,532,533],{},"TODO. Capture:",[313,535,536,543,546],{},[316,537,538,539,542],{},"Where global Claude memory lives (",[356,540,541],{},"~\u002F.claude\u002Fprojects\u002F...\u002Fmemory\u002F",").",[316,544,545],{},"When to add a CLAUDE.md \u002F AGENTS.md to a directory.",[316,547,548],{},"When to update a skill vs ask in-the-moment.",[300,550,552],{"id":551},"skills-hooks-commands","Skills, hooks, commands",[292,554,555],{},"TODO. Inventory what's set up across the team:",[313,557,558,564,567,570],{},[316,559,560,563],{},[356,561,562],{},".claude\u002Fskills\u002F*"," checked into this repo.",[316,565,566],{},"User-level skills via Skill Store.",[316,568,569],{},"Hooks (pre-commit AI checks, etc. — none yet?).",[316,571,572,573,576,577,576,579,576,582,576,585,588],{},"Slash commands we lean on (",[356,574,575],{},"\u002Fultrareview",", ",[356,578,433],{},[356,580,581],{},"\u002Fschedule",[356,583,584],{},"\u002Fworktree",[356,586,587],{},"\u002Ftriage-and-note",", etc.).",[300,590,592],{"id":591},"things-we-explicitly-dont-do","Things we explicitly don't do",[292,594,595],{},"TODO. Candidates:",[313,597,598,605,608],{},[316,599,600,601,542],{},"Auto-merging PRs without review (",[373,602,604],{"href":603},"#","memory: never merge without explicit approval",[316,606,607],{},"Letting agents write commits without human-readable messages.",[316,609,610],{},"Using agents for security-sensitive code reviews as the sole reviewer.",[300,612,614],{"id":613},"open-questions","Open questions",[313,616,617,620,623],{},[316,618,619],{},"Do we want a shared agent prompt library? Where?",[316,621,622],{},"How do we share learnings (\"this prompt shape worked great for X\")? Slack? This handbook?",[316,624,625,626,628,629,631],{},"When does a recurring agent task become a ",[356,627,581],{}," cron vs a manual ",[356,630,433],{},"?",{"title":633,"searchDepth":634,"depth":634,"links":635},"",2,[636,637,638,639,640,641,642,643],{"id":302,"depth":634,"text":303},{"id":389,"depth":634,"text":390},{"id":416,"depth":634,"text":417},{"id":459,"depth":634,"text":460},{"id":529,"depth":634,"text":530},{"id":551,"depth":634,"text":552},{"id":591,"depth":634,"text":592},{"id":613,"depth":634,"text":614},"How we use Claude \u002F Cursor \u002F agents at studyflash — pair vs peer programming, and the rule that you own your slop.","md",null,{},true,"rajiv",{"title":57,"description":644},"draft","working-with-ai",[654,655,656],"process","ai","engineering","VX9MsqtAGmPqwLu78P2VxZt_1sOfh05WzQPHr7cE6pQ",1779007962944]