Parts 1–6 stacked tools, vibe coding, roles, harnesses, loops, and graphs. Theory still leaves one question: so what does it look like in our repo?
Takeaway: At PapaCoder Labs we pinned that ladder into specs, a board, an Internal API, and Admin publish. Agents draft. Humans publish.
This is part 7 (finale) of Coding Is Conversation. The field notes are patterns already written into papacoder-labs. Sibling projects stay out unless Owner-approved and non-secret—per the series plan—so we omit them here on purpose.
Earlier: tools · vibe · multi-agent · harness · loops · graphs
Where the ladder lands in the repo
| Part | Idea | Where it shows up in PapaCoder Labs |
|---|---|---|
| 01 | Surface & billing | Cursor for build/editorial runs; ship on Vercel BFF |
| 02 | Vibe → ship | Small slices + Admin/public URL; re-read code when secrets appear |
| 03 | Roles & handoffs | agents/editorial/*, agents/development/* cards + typed artifacts |
| 04 | Harness | Internal API key, no DATABASE_URL for agents, draft-only |
| 05 | Loops & WIP | Dev board Now=1, one series slug per run, quality/accuracy gates |
| 06 | Graphs | Editorial stage DAG + series-draft-run.md orchestrator |
| 07 | Field | The story below — ADR-0005 through Admin Publish |
Rendering diagram…
Decision 1 — Simplify the boundary for cost (ADR-0005)
For MVP we skipped a separate NestJS/Railway API and run one Next.js app on Vercel as the BFF. Bodies live in Neon post_translations.markdown, not Git MDX; history in revisions. Locales ko/en are independently optimized (ADR-0005).
Agent writes go Cursor → POST /api/internal/... → Application use-cases → Prisma. No direct DB access for agents. The ADR’s platform cost band (~US$10–20/month excl. LLM) is an estimate; tokens are separate.
Lesson: “agent-friendly” is not “give agents the database.” A thin Internal API + human publish is the harness.
Decision 2 — Editorial is a DAG; publish is human
The runbook’s mental model is two doors (editorial-draft-publish):
| Door | Auth | Allowed |
|---|---|---|
| Cursor / agents | INTERNAL_API_KEY | Create/update drafts only |
| Owner / Admin | Better Auth session | Edit + Publish |
Stages live in agents/editorial/workflow.md. This series uses packages/agents/prompts/editorial/series-draft-run.md to pick one queued slug and run that DAG end-to-end. Artifacts land under packages/agents/runs/<date>-<slug>/; Neon is the draft SSOT after upsert.
Quality: agent-side eligibility is roughly ≥85 plus accuracyFail blocks. Eligibility does not replace publish — constitution: AI drafts; human publishes.
We once nearly “finished” with pretty Markdown only in chat and nothing in Admin. “Done” became Internal API 201/200 + Admin URL.
Decision 3 — Development uses the same grammar (WIP=1 board)
Platform work treats agents/development/board.md as the Single Source of Progress. Exactly one card in Now. Two cards means an orchestrator bug (agents/development/workflow.md). Loops/resume sessions re-read the board, not chat folklore.
Editorial WIP=1 (slug) and development WIP=1 (card) are the same muscle on different surfaces—where parts 5–6 stop being philosophy and become ops.
Decision 4 — Split secrets from write authority
Field checklist we repeat:
[ ] Agents: INTERNAL_API_KEY only — no DATABASE_URL in agent env
[ ] Draft upsert via POST /api/internal/drafts (never a 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
Parts 4–5 collapse into this list. If the only control is “don’t touch .env” in a prompt, you’ve already lost on a real team.
Practice: the minimum set to port elsewhere
You don’t need to clone PapaCoder. Four file habits carry most of the ladder:
# 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
Then in Cursor:
- Run the orchestrator on one ticket only
- Pin Research/Implement/Review as artifact files
- Forbid “done” before automated gates (tests/lint) pass
- Only humans merge/deploy to main/prod
This very series run uses the same contract: draft upsert → Admin Publish.
Cursor notes (this repo)
- Series: when Owner says “next part,” execute all of
series-draft-run.md— no trend hunting. - Dev: read only
board.mdNowfor the cycle — don’t trust chat summaries. - Parallelize read-only research via Task/subagents; serialize writes.
- When stuck, don’t add goals—move the card to Blocked or escalate to a human.
Honest trade-offs
| We gained | We pay |
|---|---|
| Simple agent write path | Design cost for Internal API, auth, audit |
| Independent KR/EN drafts | Double write/review cost |
| Resume via board/DAG | Doc hygiene debt if neglected |
| Smaller blast radius (draft-only) | Publish latency (human bottleneck—on purpose) |
| Lower MVP platform cost (single BFF) | May need workers/queues later (ADR defers) |
No silver bullet. Choosing not to operate on prompts alone is already encoded in this repo’s code and runbooks.
FAQ
Q. Why no sibling project stories?
A. The series plan requires Owner-approved, non-secret scope. This finale closes on Labs’ public patterns only.
Q. Does score ≥85 auto-publish?
A. No. It’s an eligibility gate. Publish is Admin.
Q. We already run Nest—must we follow ADR-0005?
A. It’s an MVP cost/complexity choice. The patterns (agent→API→human publish, WIP=1) travel across stacks.
Q. Is the series over?
A. This ladder’s queued posts end here. New topics need a new plan and Owner priority.
Sources
- 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
Closing the series
| # | One line |
|---|---|
| 01 | Prefer surface & billing over model arguments |
| 02 | Ship by talking; re-read code when risk appears |
| 03 | Quality from roles and contracts |
| 04 | Build walls outside the prompt |
| 05 | Design how it stops |
| 06 | When a line fails, draw a map |
| 07 | At Labs, we live it as repo rules |
Reader next step: sketch WIP=1 and the two doors (draft API / human publish) on your repo.
Owner next step: review/publish drafts #01–#07 in Admin.
Thanks for reading to the end. Coding is still conversation—but conversation needs walls, maps, and humans.