[{"data":1,"prerenderedAt":389},["ShallowReactive",2],{"blog-\u002Fblogs\u002Fthe-issue-is-the-prompt":3},{"id":4,"title":5,"body":6,"description":379,"extension":380,"meta":381,"navigation":384,"path":385,"seo":386,"stem":387,"__hash__":388},"content\u002Fblogs\u002Fthe-issue-is-the-prompt.md","The issue is the prompt",{"type":7,"value":8,"toc":368},"minimark",[9,19,22,27,30,41,54,60,82,85,91,94,97,101,104,107,110,121,128,144,147,154,172,176,185,239,242,246,254,257,263,266,274,286,290,343,347,350,353,356,359,362],[10,11,12,13,18],"p",{},"In the ",[14,15,17],"a",{"href":16},"\u002Fblogs\u002Fwe-stopped-coding-in-march","last post"," I said that on one afternoon in August I started three pieces of\nwork in nine minutes, and each prompt was a single line pointing at a Github issue. This post is about why that not only\nworks, but works exceptionally well.",[10,20,21],{},"This is because the issue is the prompt.",[23,24,26],"h2",{"id":25},"what-i-actually-type","What I actually type",[10,28,29],{},"The most common way I start a piece of work is either this:",[31,32,38],"pre",{"className":33,"code":35,"language":36,"meta":37},[34],"language-text","Do https:\u002F\u002Fgithub.com\u002Fautobutler-org\u002Fquark\u002Fissues\u002F1782\n","text","",[39,40,35],"code",{"__ignoreMap":37},[10,42,43,44,53],{},"or, once I had written my\n",[14,45,49,52],{"href":46,"rel":47},"https:\u002F\u002Fgithub.com\u002Fautobutler-org\u002Fquark\u002Fblob\u002F48a76aea65717d9968f1608fa84c2df34a5a1d93\u002F.claude\u002Fskills\u002Fresolve-issue\u002FSKILL.md",[48],"nofollow",[39,50,51],{},"resolve-issue"," skill",":",[31,55,58],{"className":56,"code":57,"language":36,"meta":37},[34],"\u002Fresolve-issue https:\u002F\u002Fgithub.com\u002Fautobutler-org\u002Fquark\u002Fissues\u002F1782\n",[39,59,57],{"__ignoreMap":37},[10,61,62,63,66,67,70,71,66,74,77,78,81],{},"After that, most of what I type is simple steering commands: ",[39,64,65],{},"Rebase",", ",[39,68,69],{},"PR up?",", etc. As of writing this, 117 of my\nprompts were 12 characters or shorter, including ",[39,72,73],{},"yes",[39,75,76],{},"merged.",", or ",[39,79,80],{},"thanks",".",[10,83,84],{},"When something breaks, I paste the evidence and nothing else. One bug report was a single Gin access log line:",[31,86,89],{"className":87,"code":88,"language":36,"meta":37},[34],"[GIN] 2026\u002F08\u002F29 - 14:00:59 | 500 | 6.39s | ::1 | POST \"\u002Fapi\u002Fv0\u002Ffiles\u002Fextract?...\"\n",[39,90,88],{"__ignoreMap":37},[10,92,93],{},"Another was the whole App Store Connect rejection email. Another was a CI job URL as the entire message. Another was\nthree Flutter exceptions pasted verbatim. I don't often attach a diagnosis. Diagnosis is, de facto, the agent's job.",[10,95,96],{},"If you were to read only my terminal prompts, it looks like I'm barely involved, but that's the wrong reading.",[23,98,100],{"id":99},"where-the-thinking-went","Where the thinking went",[10,102,103],{},"The expensive conversation happens before any code exists, in a session whose only output is tickets.",[10,105,106],{},"Brandon and I spend a lot of time talking to our agents about the work to be done, splitting it up in the planning\nsession, and only filing tickets once the entire scope is considered. If we don't know the shape of the work yet, we\nkeep talking to the agent until we do, and then we have the agent write it down into an issue.",[10,108,109],{},"My long prompts almost all end the same way, by keeping the agent away from code. One ends: \"Don't fix it. Write an\nissue.\"",[10,111,112,113,81],{},"Epics are the largest planning units. Sub-issues are the units that we dispatch the agent to work on.\n",[14,114,117,118],{"href":115,"rel":116},"https:\u002F\u002Fgithub.com\u002Fautobutler-org\u002Fquark\u002Fpull\u002F1922",[48],"This is encoded in our ",[39,119,120],{},"AGENTS.md",[10,122,123,124,127],{},"So by the time I type ",[39,125,126],{},"Do \u003Curl>",", three things are already written down somewhere:",[129,130,131,135,138],"ul",{},[132,133,134],"li",{},"the acceptance criteria, in the issue body",[132,136,137],{},"the procedure, in the issue body or as a checked-in skill",[132,139,140,141,143],{},"the conventions, in ",[39,142,120],{},", which are more static and non-specific",[10,145,146],{},"We are pretty strict about this. An audit log provides great value over time.",[10,148,149,150,153],{},"Sometimes, Claude finds an issue and still tries to fix it on the ",[39,151,152],{},"main"," branch. The fix is often correct, however, it\ndoesn't follow the procedure. The procedure does not make it more correct, but the procedure produces a permanent remote\nmemory for any agent to reference later, so I correct it in-place.",[10,155,156,157,159,160,165,166,171],{},"An example, when it fixed a bug in ",[39,158,152],{}," without an issue, I told it: \"No, so file a ticket first, then put this change\non a branch and push that up with a PR.\" The ticket became ",[14,161,164],{"href":162,"rel":163},"https:\u002F\u002Fgithub.com\u002Fautobutler-org\u002Fquark\u002Fissues\u002F2114",[48],"#2114","\nand the fix became ",[14,167,170],{"href":168,"rel":169},"https:\u002F\u002Fgithub.com\u002Fautobutler-org\u002Fquark\u002Fpull\u002F2117",[48],"PR #2117",". The issue is the record of why a\nchange exists, and we want that record even when the change comes first.",[23,173,175],{"id":174},"the-loop-is-a-file","The loop is a file",[10,177,178,179,184],{},"The refined procedure an agent follows once it has an issue now lives in the\n",[14,180,182,52],{"href":46,"rel":181},[48],[39,183,51],{},".\nWhen we started this series, it contained 10 steps:",[186,187,188,191,204,207,210,213,216,223,226,236],"ol",{},[132,189,190],{},"Read the issue and check whether a PR for it already exists.",[132,192,193,194,197,198,201,202,81],{},"Branch ",[39,195,196],{},"fix\u002F\u003CN>-slug"," or ",[39,199,200],{},"feat\u002F\u003CN>-slug"," off a fresh ",[39,203,152],{},[132,205,206],{},"Diagnose before editing. For a bug, write the failing test or scripted repro first and show it failing.",[132,208,209],{},"Find the siblings: grep for every other call site with the same defect and fix it in the shared place.",[132,211,212],{},"Decide on a single PR, or a stack, defaulting to a stack.",[132,214,215],{},"Make the minimal fix. \"No new abstractions, dependencies, or forks without asking first.\"",[132,217,218,219,222],{},"Run ",[39,220,221],{},"gmake check"," and the relevant test targets.",[132,224,225],{},"Make one signed-off commit.",[132,227,228,229,232,233,81],{},"Open the PR with ",[39,230,231],{},"gh pr create"," and ",[39,234,235],{},"Closes #N",[132,237,238],{},"Report. List exactly what you ran and what it showed. Never claim a manual check you did not perform.",[10,240,241],{},"Because the loop is a checked-in file, every session gets it, and when we learn something new the file changes and every\nfuture session now receives the same guidance.",[23,243,245],{"id":244},"stacks-are-how-i-review","Stacks are how I review",[10,247,248,249,81],{},"Most real work doesn't fit in one PR, so we use\n",[14,250,253],{"href":251,"rel":252},"https:\u002F\u002Fdev.to\u002Fehrbhein\u002Fmastering-stacked-pull-requests-prs-25n3",[48],"stacks",[10,255,256],{},"This is the prompt that kicked off our backend cleanup epic on 2026-08-29:",[258,259,260],"blockquote",{},[10,261,262],{},"Use Opus for sub-agents and orchestrate their work... Do all of this in one massive Github stack, using the gh-stack\nextension of course... I want to be able to test the full result of this work on a single branch and then merge it all\ntogether.",[10,264,265],{},"That one prompt produced a 17-PR stack. I could check out the top of it, run the whole thing, and merge the layers in\norder.",[10,267,268,269,81],{},"For a while, this was the part that still annoyed me the most. I had to keep telling the model to stack PRs,\n",[14,270,273],{"href":271,"rel":272},"https:\u002F\u002Fgithub.blog\u002Fchangelog\u002F2026-07-30-stacked-pull-requests-are-now-in-public-preview\u002F",[48],"which was likely because they had just been released in public preview in Github",[10,275,276,277,282,283,285],{},"So we wrote it down, not waiting for the models to be trained. During the research for this series,\n",[14,278,281],{"href":279,"rel":280},"https:\u002F\u002Fgithub.com\u002Fautobutler-org\u002Fquark\u002Fpull\u002F2275",[48],"PR #2275"," added the fifth step to ",[39,284,51],{},": \"Decide: stack or\none PR. Default to a stack.\"",[23,287,289],{"id":288},"copy-this","Copy this",[129,291,292,298,329,332,337],{},[132,293,294,295,297],{},"Something like the ",[39,296,51],{}," skill, adapted to your repo. If you take only two lines.",[132,299,300,305,306,66,309,66,312,66,315,318,319,66,322,325,326,81],{},[14,301,304],{"href":302,"rel":303},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcommunities\u002Fusing-templates-to-encourage-useful-issues-and-pull-requests\u002Fconfiguring-issue-templates-for-your-repository",[48],"Issue templates",",\nso the acceptance criteria have somewhere to live. We currently have seven: ",[39,307,308],{},"bug",[39,310,311],{},"chore",[39,313,314],{},"epic",[39,316,317],{},"feature",",\n",[39,320,321],{},"performance",[39,323,324],{},"question",", and ",[39,327,328],{},"security",[132,330,331],{},"A rule that a spike is never dispatched. Talk it down to known scope with the agent, then file the tickets for\ndispatch.",[132,333,334,335,81],{},"Epics for planning, sub-issues for dispatch, and that rule written somewhere in ",[39,336,120],{},[132,338,339,342],{},[39,340,341],{},"gh stack"," or another equivalent, with guidance given to the AI on how to do this. PR stacks have existed for a long\ntime, but are not as well documented on the public internet as one would hope.",[23,344,346],{"id":345},"whats-next","What's next",[10,348,349],{},"Next time: why our main branch requires zero approvals, has a plethora of mandatory checks, and our pre-commit hooks.",[10,351,352],{},"As always, we love you all and we want to build stuff for you. Feel free to reach out anytime.",[10,354,355],{},"Grace and peace, James",[357,358],"hr",{},[10,360,361],{},"This is part 2 of 9 in our series on how we build Quark with AI agents.",[10,363,364,365],{},"← Previous: ",[14,366,367],{"href":16},"We stopped coding in March",{"title":37,"searchDepth":369,"depth":370,"links":371},6,5,[372,374,375,376,377,378],{"id":25,"depth":373,"text":26},2,{"id":99,"depth":373,"text":100},{"id":174,"depth":373,"text":175},{"id":244,"depth":373,"text":245},{"id":288,"depth":373,"text":289},{"id":345,"depth":373,"text":346},"Our instructions to an agent average about 65 characters, because the planning already happened in a conversation whose output was a Github issue.","md",{"date":382,"author":383},"2026-10-07","James Orson",true,"\u002Fblogs\u002Fthe-issue-is-the-prompt",{"title":5,"description":379},"blogs\u002Fthe-issue-is-the-prompt","F05R8M51LwC0FnvfWDF4WRBvnC7x2_3GTBtdkP-6Svc",1791940975750]