1–6편은 도구·바이브·역할·하네스·루프·그래프를 쌓았습니다. 이론만으로는 “그래서 우리 레포에는?”이 남습니다.
핵심 한 줄: PapaCoder Labs에서는 그 사다리를 스펙·보드·Internal API·Admin 발행으로 고정해 두었고, 에이전트는 초안만 쓰며 사람은 발행합니다.
이 글은 「코딩은 대화다」 7편(마무리)입니다. 형제는 이 레포(papacoder-labs)에 이미 적혀 있는 패턴입니다. 시리즈 플랜상 형제 프로젝트 사례는 Owner 승인·비비밀 범위에서만 다루므로, 여기서는 의도적으로 넣지 않았습니다.
이전 편: 도구 · 바이브 · 멀티에이전트 · 하네스 · 루프 · 그래프
사다리가 레포에 붙는 위치
| 편 | 개념 | PapaCoder Labs에서 보이는 곳 |
|---|---|---|
| 01 | 표면·비용 | Cursor로 개발·에디토리얼 런; 배포는 Vercel BFF |
| 02 | 바이브 → 출시 | 작은 슬라이스 + Admin/공개 URL; 시크릿 나오면 코드 다시 보기 |
| 03 | 역할·핸드오프 | agents/editorial/*, agents/development/* 카드 + typed 산출물 |
| 04 | 하네스 | Internal API 키, 에이전트에 DATABASE_URL 없음, draft-only |
| 05 | 루프·WIP | 개발 보드 Now=1, 시리즈 런 slug 하나, 품질/accuracy 게이트 |
| 06 | 그래프 | 에디토리얼 단계 DAG + series-draft-run.md 오케스트레이터 |
| 07 | 현장 | 아래 스토리 — ADR-0005부터 Admin Publish까지 |
Rendering diagram…
결정 1 — 비용을 위해 경계를 단순화했다 (ADR-0005)
MVP에서 별도의 NestJS/Railway API를 두지 않고, Next.js 하나(Vercel) 를 BFF로 씁니다. 본문은 Git MDX가 아니라 Neon post_translations.markdown, 이력은 revisions. 로케일 ko/en은 서로 독립 최적화입니다 (ADR-0005, as of 문서 기준).
에이전트 쓰기 경로는 Cursor → POST /api/internal/... → Application use-case → Prisma입니다. DB 직접 접속은 금지입니다. ADR에 적힌 플랫폼 비용 감( LLM 제외 대략 월 US$10–20대)은 추정치이며, 토큰 비용은 별도입니다.
교훈: “에이전트 친화적”이 곧 “에이전트에게 DB를 주는 것”이 아닙니다. 얇은 Internal API + 사람 발행이 하네스입니다.
결정 2 — 에디토리얼은 DAG이고, 발행은 사람이다
런북의 정신 모델은 두 개의 문입니다 (editorial-draft-publish):
| 문 | 인증 | 할 수 있는 일 |
|---|---|---|
| Cursor / agents | INTERNAL_API_KEY | draft 생성·갱신만 |
| Owner / Admin | Better Auth 세션 | 편집 + Publish |
파이프라인은 agents/editorial/workflow.md에 단계로 고정되어 있습니다. 이 시리즈는 packages/agents/prompts/editorial/series-draft-run.md가 queued slug 하나를 골라 같은 DAG를 끝까지 돌립니다. 산출물은 packages/agents/runs/<date>-<slug>/에 남고, Neon이 초안 SSOT가 됩니다.
품질: 에이전트 쪽 자격은 대략 ≥85 + accuracyFail면 블록. 자격은 발행을 대체하지 않습니다 — 헌장 그대로 AI drafts; human publishes.
한 번은 채팅에만 예쁜 마크다운이 있고 Admin에는 없는 상태를 만들 뻔했습니다. 그다음부터 “끝”의 정의는 Internal API 201/200 + Admin URL 로 바꿨습니다.
결정 3 — 개발도 같은 문법 (WIP=1 보드)
플랫폼 개발은 agents/development/board.md가 Single Source of Progress입니다. Now에는 카드 한 장만 올립니다. 두 장이면 오케스트레이터 버그입니다 (agents/development/workflow.md). Loop/연속 세션은 채팅 기억보다 보드를 다시 읽습니다.
에디토리얼 WIP=1(slug)과 개발 WIP=1(카드)은 같은 근육의 다른 표면입니다. 5편의 루프·6편의 그래프가 “문서 철학”이 아니라 운영 규칙이 되는 지점입니다.
결정 4 — 시크릿과 쓰기 권한을 분리한다
현장에서 반복하는 체크리스트:
[ ] Agents: INTERNAL_API_KEY only — no DATABASE_URL in agent env
[ ] Draft upsert via POST /api/internal/drafts (never publish endpoint)
[ ] Secrets in env / secret store — never commit production.env values
[ ] Human gate for Publish, force-push, prod migrate, credential edits
[ ] Run artifacts may mirror under docs/editorial/… but Neon is SSOT after upsert
4편의 하네스·5편의 정지 조건이 여기로 모입니다. 프롬프트에 “.env 건드리지 마”만 적고 끝내면, 현장에서는 이미 진 게임입니다.
실습: 다른 레포에 옮길 최소 세트
PapaCoder를 복제할 필요는 없습니다. 네 파일 습관이면 사다리의 80%를 이식할 수 있습니다.
# 1) AGENTS.md — harness policy (forbidden / required checks)
# 2) board.md or ISSUE template — WIP=1 Now column
# 3) prompts/orchestrator.md — one slug|ticket per run; stop budgets
# 4) runbook.md — “draft API vs human publish” two doors
그다음 Cursor에서:
- 오케스트레이터 프롬프트로 한 티켓만 진행
- Research/Implement/Review를 산출물 파일로 고정
- 자동 게이트(테스트·린트) 통과 전에는 “완료” 금지
- 사람만 메인/프로덕션에 머지·배포
시리즈 글을 쓰는 지금 이 런도 같은 계약입니다: 초안 upsert → Admin에서 Publish.
Cursor 사용 노트 (이 레포 기준)
- 시리즈: Owner가 “다음 편”이라고 하면
series-draft-run.md전체를 실행 — 트렌드 헌팅 없음. - 개발:
board.md의Now만 보고 사이클 — 채팅 요약에 의존하지 않기. - 병렬 조사는 Task/서브에이전트, 쓰기는 직렬.
- 막히면 새 목표를 추가하지 말고 보드를 Blocked로 옮기거나 사람에게 에스컬레이션.
정직하게 말하는 트레이드오프
| 얻은 것 | 치른 것 |
|---|---|
| 에이전트 쓰기 경로가 단순 | Internal API·권한·감사 설계 비용 |
| KR/EN 독립 초안 | 이중 작성·리뷰 비용 |
| 보드/DAG로 재개 가능 | 문서 갱신 규율 (안 지키면 즉시 빚) |
| draft-only로 사고 반경 축소 | 발행 지연(사람이 병목 — 의도된 병목) |
| 단일 BFF로 MVP 비용 억제 | 나중에 워커/큐가 필요해질 수 있음 (ADR가 defer) |
은탄환은 없습니다. 다만 프롬프트만으로 운영하지 않는다는 선택은, 이 레포에서는 이미 코드와 런북에 박혀 있습니다.
FAQ
Q. 형제 프로젝트 사례는 왜 없나요?
A. 시리즈 플랜이 Owner 승인·비비밀 범위로 제한합니다. 이 편은 Labs 공개 패턴만으로 닫습니다.
Q. 품질 85를 넘으면 자동 발행되나요?
A. 아니요. 자격 게이트일 뿐, Publish는 Admin입니다.
Q. 우리 팀은 Nest가 있는데 ADR-0005를 따라야 하나요?
A. MVP 비용·복잡도 선택입니다. 패턴(에이전트→API→사람 발행, WIP=1)은 스택과 무관하게 가져갈 수 있습니다.
Q. 시리즈는 여기서 끝인가요?
A. 이 사다리의 queued 편은 여기까지입니다. 이후 주제는 새 플랜·Owner 우선순위로 갑니다.
소스
- ADR-0005 — https://github.com/papacoder-work/papacoder-labs/blob/master/docs/adr/0005-cost-efficient-bff-database-first.md
- Editorial draft publish runbook — https://github.com/papacoder-work/papacoder-labs/blob/master/docs/runbooks/editorial-draft-publish.md
agents/editorial/workflow.md·agents/development/workflow.md·packages/agents/prompts/editorial/series-draft-run.md- Series plan —
docs/editorial/ai-dev-zero-to-hundred-series.md
시리즈를 덮으며
| # | 한 줄 |
|---|---|
| 01 | 모델보다 표면과 과금 |
| 02 | 대화로 만들고, 위험 앞에서 코드를 다시 본다 |
| 03 | 역할과 계약으로 품질 |
| 04 | 프롬프트 밖에 벽 |
| 05 | 멈추는 법을 설계 |
| 06 | 선이 안 되면 지도 |
| 07 | Labs에서는 그걸 레포 규칙으로 산다 |
다음에 할 일(독자): 자기 레포에 WIP=1 보드와 draft/human publish 두 문을 그려 보세요.
다음에 할 일(Owner): Admin에서 #01–#07 초안을 검토·발행하세요.
끝까지 읽어 주셔서 감사합니다. 코딩은, 여전히, 대화입니다 — 다만 대화에도 벽과 지도와 사람이 필요합니다.