[{"data":1,"prerenderedAt":245},["ShallowReactive",2],{"page:\u002Fblog\u002Fai-in-open-source":3},{"_tag":4,"styles":5,"page":6},"Ok",[],{"id":7,"title":8,"body":9,"breadcrumbs":230,"description":231,"extension":232,"h1":230,"icon":233,"image":233,"layout":233,"meta":234,"navigation":230,"newsletter":235,"ogImage":233,"path":236,"prose":230,"publishedAt":237,"seo":238,"status":239,"stem":240,"tags":241,"wide":235,"__hash__":244},"pages\u002Fblog\u002Fai-in-open-source.md","How I use AI in open source",{"type":10,"value":11,"toc":218},"minimark",[12,16,19,22,33,38,87,92,111,115,124,132,136,145,148,166,169,173,181,184,187,199,202,206,209,212,215],[13,14,15],"p",{},"AI is here, and it is rightfully carving out how open source works.",[13,17,18],{},"Being an engineer means adapting to the underlying technology, so I'll be using AI heavily in my open-source work.",[13,20,21],{},"There's already enough AI slop in open source. AI-generated PR descriptions generally suck.",[13,23,24,25,32],{},"I don't want to add to it. ",[26,27,31],"a",{"href":28,"rel":29},"https:\u002F\u002Froe.dev\u002Fblog\u002Fusing-ai-in-open-source",[30],"nofollow","Daniel Roe's post on using AI in open source"," helped me settle my policy on working with AI in open source.",[34,35,37],"h2",{"id":36},"the-rules","The Rules",[39,40,41,45,53,62,70,78,81,84],"ul",{},[42,43,44],"li",{},"AI never speaks for me. Every public action says it came from an agent.",[42,46,47,48,52],{},"Agents may act autonomously only in selected repositories I own (",[49,50,51],"code",{},"harlan-zw\u002F*",") or am the only core contributor.",[42,54,55,56,61],{},"Other open-source projects including ",[26,57,60],{"href":58,"rel":59},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fnuxt",[30],"Nuxt"," will never receive an agent generated PR.",[42,63,64,69],{},[26,65,68],{"href":66,"rel":67},"https:\u002F\u002Fgithub.com\u002Fharlan-zw\u002Fharlan-agent-kit\u002Fblob\u002Fmain\u002Fharlan-agent-kit\u002Fskills\u002Fpr\u002FSKILL.md",[30],"AI-written pull request descriptions"," stay concise, link to this page and include the disclosure below.",[42,71,72,77],{},[26,73,76],{"href":74,"rel":75},"https:\u002F\u002Fgithub.com\u002Fharlan-zw\u002Fharlan-agent-kit\u002Fblob\u002Fmain\u002Fharlan-agent-kit\u002Fskills\u002Fadversarial-review\u002FSKILL.md",[30],"Automated reviews"," use one labelled bot comment. It names the reviewed commit and any uncertainty.",[42,79,80],{},"Agents never approve or merge pull requests.",[42,82,83],{},"Fixes use normal commits. Agents never hide or rewrite history.",[42,85,86],{},"Anything ambiguous comes back to me.",[88,89,91],"h3",{"id":90},"sites-i-own","Sites I own",[39,93,94,103],{},[42,95,96,97,102],{},"The ",[26,98,101],{"href":99,"rel":100},"https:\u002F\u002Fgithub.com\u002Fharlan-zw\u002Fharlan-agent-kit\u002Fblob\u002Fmain\u002Fharlan-agent-kit\u002Fskills\u002Fpr-owner\u002FSKILL.md",[30],"PR owner agent"," watches the deployment and runs relevant smoke tests against production.",[42,104,105,106,110],{},"Agents may ",[26,107,109],{"href":99,"rel":108},[30],"repair post-merge CI"," on the default branch.",[34,112,114],{"id":113},"workflow-issue-triaging","Workflow: Issue Triaging",[13,116,117,118,123],{},"On selected projects, Harlan Agent Kit ",[26,119,122],{"href":120,"rel":121},"https:\u002F\u002Fgithub.com\u002Fharlan-zw\u002Fharlan-agent-kit\u002Fblob\u002Fmain\u002Fharlan-agent-kit\u002Fskills\u002Fissue-triage\u002FSKILL.md",[30],"checks new issues"," before touching code. It tries to reproduce the problem, checks for duplicates and decides whether there is enough information to act.",[13,125,126,127,131],{},"If the issue looks valid, the agent starts in an isolated worktree. It writes a regression test, fixes the problem and ",[26,128,130],{"href":66,"rel":129},[30],"opens a pull request",". Anything ambiguous comes back to me.",[34,133,135],{"id":134},"workflow-opening-pull-requests","Workflow: Opening Pull Requests",[13,137,138,139,144],{},"On projects I maintain myself, I use AI to help write code and pull request descriptions. The descriptions are ",[26,140,143],{"href":141,"rel":142},"https:\u002F\u002Fgithub.com\u002Fharlan-zw\u002Fharlan-agent-kit\u002Fblob\u002Fmain\u002Fharlan-agent-kit\u002Fskills\u002Fpr\u002FSKILL.md#step-3-build-pr-content",[30],"tuned for my preferences",": explain why the change exists, capture useful context and cut the noise.",[13,146,147],{},"When Harlan Agent Kit drafts or edits a description, the pull request links back to this page and includes this:",[149,150,151],"blockquote",{},[13,152,153,154,159,160,165],{},"🤖 AI disclosure: ",[26,155,158],{"href":156,"rel":157},"https:\u002F\u002Fgithub.com\u002Fharlan-zw\u002Fharlan-agent-kit",[30],"Harlan Agent Kit"," modified this description. ",[26,161,164],{"href":162,"rel":163},"https:\u002F\u002Fharlanzw.com\u002Fblog\u002Fai-in-open-source",[30],"My AI open-source policy",".",[13,167,168],{},"The description still needs to help someone review the change. AI involvement is no excuse for a wall of text or claims that nobody checked.",[34,170,172],{"id":171},"workflow-adversarial-review","Workflow: Adversarial Review",[13,174,175,176,180],{},"When I or someone else opens a pull request on a selected project, my agent runs an ",[26,177,179],{"href":74,"rel":178},[30],"adversarial review",". Codex and Claude Code try to disprove the change. They read the full diff, look for missing tests and follow failures instead of stopping at the first green check.",[13,182,183],{},"If the agent finds a real problem and has permission to fix it, it pushes a normal commit. The history stays visible.",[13,185,186],{},"The final status is posted as one bot comment. It names the exact commit reviewed, says what remains uncertain and starts with:",[149,188,189],{},[13,190,191,192,195,196,165],{},"🤖 Bot review: ",[26,193,158],{"href":156,"rel":194},[30]," posted this comment. It is not Harlan's personal review or approval. ",[26,197,164],{"href":162,"rel":198},[30],[13,200,201],{},"Later runs update the same comment instead of adding more noise. The bot never approves or merges a pull request. That decision stays with a human.",[34,203,205],{"id":204},"misbehaving-ai","Misbehaving AI",[13,207,208],{},"AI does not like following instructions, so I know it will get this wrong eventually.",[13,210,211],{},"AI can write a convincing explanation for broken code. A passing test can miss the thing that matters. A confident review can still be wrong.",[13,213,214],{},"I still own the systems I choose to run and the changes they make to my projects.",[13,216,217],{},"If a bot gets something wrong, email me or open an issue. I'll work out what failed and make the process better.",{"title":219,"searchDepth":220,"depth":220,"links":221},"",2,[222,226,227,228,229],{"id":36,"depth":220,"text":37,"children":223},[224],{"id":90,"depth":225,"text":91},3,{"id":113,"depth":220,"text":114},{"id":134,"depth":220,"text":135},{"id":171,"depth":220,"text":172},{"id":204,"depth":220,"text":205},true,"My policy for AI-written code, pull request descriptions and automated reviews across the projects I maintain.","md",null,{"aside":235},false,"\u002Fblog\u002Fai-in-open-source","2026-08-13",{"title":8,"description":231},"published","blog\u002Fai-in-open-source",[242,243],"ai","open-source","4R9H4mGdHRLlFwmjtSmfOxM2ZxOQca5Ugr6j9stvQUc",1786613859078]