메뉴
HN
Hacker News 28일 전

스펙 극대화: AI 코딩 정신착란을 극복하는 법

IMP
8/10
핵심 요약

AI 코딩 에이전트가 발생시키는 잦은 오류와 컨텍스트 제한 문제를 극복하기 위해 체계적인 문서화(Spec)의 중요성을 강조하는 글입니다. 저자는 단순한 마크다운 문서를 넘어, YAML 기반의 구조화된 스펙을 작성하고 이를 오픈소스 툴킷(Acai.sh)과 결합하여 에이전트를 통제하는 '스펙 주도 개발' 방식을 제안합니다.

번역된 본문

메인 콘텐츠로 건너뛰기 Acai.sh 홈페이지 문서 API 레퍼런스 블로그 검색... 검색... 탐색 Specsmaxxing 앱 (로그인) GitHub 블로그 블로그 블로그 홈 이 페이지에서 이 광경이 익숙한가요?

최악의 슬롭(Slop) 비행기를 타고 날아가면서 비행기를 조립하기 마크다운(Markdown) 속에서 꿈꾸기 AI를 위한 인수 기준 (ACAI) Acai.sh - 오픈소스 툴킷 어떻게 작동하나요 1단계 - 명세(Specify) 2단계 - 배포(Ship) 3단계 - 검토(Review) 4단계 - 반복(Iterate / repeat) 미래 내다보기 사고 실험 -> Specsmaxxing에서 Testmaxxing으로 -> Testmaxxing에서 반응형 소프트웨어 팩토리까지 다른 스펙 주도 개발 도구들과의 비교 GitHub SpecKit OpenSpec Kiro Traycer.ai Acai.sh가 마음에 들지 않을 수 있는 이유 별로냐고요? 문서 색인 https://acai.sh/llms.txt 에서 전체 문서 색인을 가져오세요. 더 자세히 살펴보기 전에 이 파일을 사용하여 사용 가능한 모든 페이지를 확인하세요.

이 광경이 익숙한가요? "우와. 클로드(Claude). 놀랍네. 전체 기능이 훌륭하게 작동해. 하지만 내가 아주 중요한 엣지 케이스(예외 상황)를 언급하는 걸 깜빡했네." "맞습니다! 바로 수정하겠습니다." "아, 그리고 방금 눈치챘는데. 테이블 UI에 오프셋 기반 페이지네이션(offset pagination)을 사용했네. 당연히 여기서는 커서 기반 페이지네이션(cursor pagination)이 더 적합하지 않나?" "맞습니다! 바로 수정하겠습니다." "또, 저거 혹시 N+1 쿼리인가? 테이블의 모든 행을 가져오기 위해? 왜 한 번의 통신으로 처리하지 않나?" "맞습니다! 바로 수정하겠습니다." 이게 바로 내가 여전히 직장을 유지할 수 있는 이유겠지, 그치? …

최악의 슬롭(Slop) 나는 이런 광경이 펼쳐지는 걸 여러 번 지켜봤지만, 그 빈도는 줄어들고 있다. 내가 사용하는 도구들과 그 도구를 활용하는 방법론 모두 계속해서 발전하고 있기 때문이다. 나는 '최악의 슬롭(Peak Slop)' 시대가 이미 왔다 지나갔다고 생각한다. 우리는 포스트 슬롭(post-slop) 시대에 진입하고 있다. 내 소프트웨어는 그 어느 때보다 견고하고, 테스트가 잘 되어 있으며, 통합도 잘 되어 있고, 관측 가능성(observability)도 뛰어나다. 그리고 내 개발 속도(velocity)는 계속해서 빨라지고 있다! 어떤 날은 하늘이 한계라고(기회가 무한하다고) 느껴진다. 하지만 다른 날에는 뼈저리게 깨닫곤 한다. 하늘이 한계가 아니라는 것을. 컨텍스트 윈도우(context window)가 한계라는 것을.

그렇다면 내가 컨텍스트 윈도우를 꽉 채우면 어떻게 될까? 아니면 세션을 종료하면? 컴퓨터를 바꾸면? 프로젝트를 다른 사람에게 넘기면? 어떻게 되는지 우리는 이미 알고 있다. 에이전트가 통제력을 잃거나, 요구사항이 유실되거나, 지극히 중요한 세부 사항이 무시된다. 그래서 우리는 적응하고 이를 완화하려 노력한다. 우리는 문서화한다. 요구사항을 나열한다. 그렇다, 수백만 명의 개발자들이 같은 깨달음에 도달하고 있다. 우리는 더 많은 요구사항을 문서로 남겨야 한다는 것을. 요구사항이 변경되면 그 문서를 업데이트해야 한다는 것을. 보라! 내가 스펙(Spec)을 작성했다! 내가 스펙 주도 개발(spec-driven development)을 하고 있는 걸까? 어쩌면 그럴 수도 있지만, 이것은 전혀 새로운 것이 아니다. 우리의 멘토들은 수십 년 전부터 우리에게 이런 습관을 가르치려 했을 뿐이다.

비행기를 타고 날아가면서 비행기를 조립하기 당신이 가장 좋아하는 스펙의 형태는 무엇인가? README.md 와 AGENTS.md 로 시작하는 것은 좋은 출발점이다. testing-guide.md 도 잊지 마라. 어쩌면 architecture.md , PRD.md , 그리고 디자인 문서도 있을 수 있다. 에이전트에게 .md 파일을 작성하는 방법을 가르치기 위해 md.md 를 고려해 본 적이 있나? .md 파일이 많으면 많을수록 좋은 거 아니야? 아이러니하게도, 그렇다. 문서와 비구조화된 스펙만으로도 아주, 아주 멀리 갈 수 있다. 단순한 프롬프트만 사용하는 것보다 훨씬 더 말이다. 아직 문서를 작성하고 있지 않다면, 이 글 읽기를 멈추고 당장 그 작업부터 시작해야 한다. 그리고 명심해라. 쓰레기가 들어가면 쓰레기가 나온다(Slop in, slop out). 유기농, 목장 방목, 수작업으로 정성껏 작성된 스펙을 따를만한 건 없다. 소프트웨어 엔지니어링이라는 행위는 바로 이 스펙을 작성하는 곳에서 진정으로 일어난다. 그래서 몇 주 전, 나는 스스로에게 질문을 던졌다. 이걸 어디까지 밀어붙일 수 있을까? 어디까지 밀어붙여야 할까?

마크다운(Markdown) 속에서 꿈꾸기 이야기가 전해지듯이, 나는 AI 정신착란(psychosis)에 빠졌고, '스펙 맥시(Spec maxxi)'가 되었으며, 내가 본 것 중 가장 아름다운 PRD(제품 요구사항 문서)와 TRD를 작성하기 위해 수없이 많은 시간을 보냈다. 어쩌면 내 에이전트들도 스펙을 작성할 수 있을지 모른다는 생각에 템플릿, 스킬, 역할을 구상했다. 나는 미니 다크 팩토리(dark factory)처럼 함께 일하는 에이전트 대군을 구성하여 내 스펙을 현실로 구현하려 했다. 내 작업은 더욱 야심차졌고, 어느 순간 나는 바이브 코딩(vibe-coding)의 음속 장벽을 돌파했다. 감시 없이 1.5시간 동안이나 혼자 작동하는 에이전트를 만든 것이다! 정말 흥미로웠다. 하지만 그 에이전트 군단은 나를 위해 무엇을 배포(Ship)해 주었을까? 글쎄, 그건 슬롭(Slop, 쓰레기 코드)이 아니었다. 사실 제대로 작동했다. 이건 내가 매일 다른 회사들이 억지로 쓰게 만드는 형편없는 소프트웨어들에 대해 할 수 있는 말보다 훨씬 낫다. 하지만 여전히 약간은 엉성(sloppy)했다. 나는 완벽주의자와 거리가 멀고 cu

원문 보기
원문 보기 (영어)
Skip to main content Acai.sh home page Docs API Reference Blog Search... Search... Navigation Specsmaxxing App (login) GitHub Blog Blog Blog Home On this page Does this look familiar? Peak Slop Specifying the plane while we fly it Dreaming in markdown Acceptance Criteria for AI (ACAI) Acai.sh - an open-source toolkit How it works Step 1 - Specify Step 2 - Ship Step 3 - Review Step 4 - Iterate / repeat Future Gazing Thought Experiment -> From Specsmaxxing to Testmaxxing -> From Testmaxxing to reactive software factories Comparison to other spec-driven development tools GitHub SpecKit OpenSpec Kiro Traycer.ai Reasons you might not like acai.sh Hate it? Documentation Index Fetch the complete documentation index at: https://acai.sh/llms.txt Use this file to discover all available pages before exploring further. ​ Does this look familiar? Wow. Claude. Mind-blowing. The whole feature works great. But I forgot to mention one very important edge case. You’re absolutely right! Let me fix that. Ah, and I just noticed. You used offset pagination for the table UI. Obviously cursor pagination is a better fit here? You’re absolutely right! Let me fix that. Also, is that an N+1 query? Fetching for every row in the table? Why not do a single round-trip? You’re absolutely right! Let me fix that. This is why I still have a job, right? … ​ Peak Slop I’ve watched this scene play out many times, but the frequency is decreasing. Both my tools, and my methods for using them, continue to improve. I think Peak Slop has already come and gone. We are entering the post-slop era. My software is more robust, better tested, better integrated, and more observable than ever before. And my velocity keeps increasing! Some days it feels like the sky is the limit. Other days, I am painfully reminded, the sky is not the limit. The context window is the limit. And what happens when I fill the context window? Or kill a session? Switch machines? Hand off the project to someone else? We already know what happens. The agent goes off the rails, or requirements get lost, and critically important detail gets squashed. So we adapt and mitigate. We document. We list requirements. Yes, millions of us are coming to the same realization: we should put more requirements in writing. We should update those requirements when they change. Look! I wrote a spec! Am I doing spec-driven development? Perhaps, but it is nothing new. Our mentors tried to teach us these habits decades ago. ​ Specifying the plane while we fly it What’s your favorite flavor of spec? A README.md and AGENTS.md is a good start. Don’t forget a testing-guide.md . Maybe an architecture.md , a PRD.md , and a design doc too. Have you considered md.md (to teach your agents how to write .md )? The more .md the better, right? Unironically, yes. Docs and unstructured specs can get you very, very far. Much farther than prompts alone. If you aren’t writing any docs yet, you should just stop reading this and start there. And remember, slop in, slop out. Nothing beats an organic, pasture-raised, hand-written spec. Spec-writing is where the act of software engineering really happens. So a few weeks ago, I started asking myself, how far can I take this? How far should I take this? ​ Dreaming in markdown As the story goes, I fell into an AI psychosis, I became a “spec maxxi”, and I spent hours and hours writing the most beautiful PRDs and TRDs you’ve ever seen. I drafted templates and skills and roles, thinking that maybe my agents can write specs too! I assembled an army, working together like a mini dark factory, to turn my specs into reality. My tasks grew more ambitious, and at one point I broke the vibe-coding sound barrier: an agent that ran for 1.5 hours unsupervised! Exciting. But what did that army ship for me? Well, it wasn’t slop, in fact it worked , which is more than I can say about the garbage that other companies force me to use every day. But it was still a bit sloppy. I’m far from a perfectionist and I love cutting corners more than most, but this somehow wasn’t good enough. One hallmark symptom of AI psychosis is using AI to build AI harnesses for building products , rather than just using AI to build the damn product. I embraced my illness, threw out the branch, scrapped all my markdown, and started all over again. ​ Acceptance Criteria for AI (ACAI) A few days later, I noticed an ambitious little sub-agent doing something unexpected. # Requirements AUTH-1: Accepts `Authorization: Bearer <token>` header AUTH-2: Tokens are user-scoped, providing access to any of the user&#x27;s resources AUTH-3: Rejects with 401 Unauthorized // AUTH-1 const authHeader = req . headers [ "authorization" ]; // AUTH-2 const isAuthorized = verifyBearerToken ( authHeader ); // AUTH-3 if ( ! isValid ) return res . status ( 401 ). json ({ error: "Unauthorized" }); The little guy just went and numbered my requirements and then referenced them all over my codebase. Why? I did not ask for this! I was disgusted. This is a tight coupling of code to spec, and spec to code, which is bad right? You really expect me to refactor all my code every time I change my spec? Oh. I suppose that’s a good thing? Interesting. I wonder… Perhaps these tags can help me navigate these massive PRs? Perhaps they can point me to where, exactly, a requirement is satisfied or tested! Perhaps I can annotate them with notes and states (todo, assigned, completed)! Perhaps I can start tracking acceptance coverage instead of test coverage! I leaned in. I named these tags ACIDs (Acceptance Criteria IDs). But a few questions remained. Can my ACIDs number and label themselves? Is it cumbersome to keep them aligned? How do I share specs and progress across sandboxes, branches, features and implementations? ​ Acai.sh - an open-source toolkit I built Acai.sh to solve some of these newly invented problems. And I’m very excited about the results. A simple and flexible template for feature specs, called feature.yaml . Feature.yaml makes it possible to reference each requirement by ACID. Tiny CLI to power your CI and your agent (available on npm or via github release). Webapp that serves a dashboard, and a JSON REST API (Elixir, Phoenix, Postgres). I will keep the hosted version free for a while, or maybe forever depending on how popular or expensive this gets. The source code is on GitHub under an Apache 2.0 license. ​ How it works ​ Step 1 - Specify Start by writing a spec for a feature. Be ambitious— something that adds real value. Don’t put nitpicky UI and nail polish stuff in your specs. Keep the requirements concrete, testable, and focused on what really matters (functional behavior + critical constraints). Rather than markdown, use acai’s feature.yaml format instead. A spec in Acai is just a numbered list of requirements. feature.yaml feature : name : imaginary-api-endpoint product : api description : This is an example feature spec for an imaginary REST API endpoint, using the feature.yaml format components : AUTH : name : Authn and Authz requirements : 1 : Accepts Authorization header with `Bearer <token>` 1-1 : Token must be non-expired, non-revoked 2 : Respects the scopes configured for the owner 2-note : See `access-tokens.SCOPES.1` for complete list of supported scopes constraints : ENG : description : Constraints are for cross-cutting or under-the-hood requirements. Here are some example engineering constraints; requirements : 1 : All actions are idempotent 2 : All HTTP 2xx JSON responses wrap their payload in a root `data` key Of course you could also have LLMs assist you with spec writing, but I enjoy the process of writing them myself, because I like to maintain some illusion of self-worth as a software developer. ​ Step 2 - Ship Copy and paste the prompt below. Copied Copy prompt Note: In addition to the npm package, there are Linux and MacOS releases for the CLI available on GitHub . If all goes well, your agent will embrace ACIDs, referencing them in code and tests, so you can m