Files

85 lines
6.2 KiB
Markdown
Raw Permalink Normal View History

# 7교시 바이브 코딩 · `tlog` 정답본
> **강사용 정답본** · 학생 저장소에는 수업 뒤에 올립니다. 학생용: [VIBE-REQ-TLOG.md](VIBE-REQ-TLOG.md) → [VIBE-Q-TLOG.md](VIBE-Q-TLOG.md).
> 강사가 직접 만든 본: [tlog/](tlog/README.md) (테스트 23개, `uv tool install --editable .`). 아래 숫자는 2026-10-31 강사 Mac에서 77일차 데이터 API와 n8n `my-log-report`(Lab 03 예제 2 정답)에 실제로 돌린 값입니다. 68일차부터 바이브 코딩은 CLI 에이전트로 다시 만들어 재지 않습니다 (요청문은 예시).
## 1. TODO 예 (요청의 말 → 할 일)
| # | 요청의 말 | 할 일 (내 말) | 꼭 · 나중 |
| --- | --- | --- | --- |
| ① | 파일 · API, 기간 · 태그, 끝날 포함 | `--file` · `--url`, `--from` · `--to`(포함) · `--tag` · `--source` | 꼭 |
| ② | n8n과 똑같은 숫자 | AGENTS.md 3절 정의 그대로, 반올림까지 JavaScript와 같게, 0건이면 0 | 꼭 |
| ③ | 원인으로 묶기 · 넘긴 주제 · 다시 묻는 주제 | `problems`: failures · unanswered_topics · repeat_topics | 꼭 |
| ④ | 평소보다 나빴던 시간 | 5건 · 3배 · 1건 이상, 시간순 | 꼭 |
| ⑤ | JSON, 같은 칸 이름 | `--json` = `my-log-report` 응답과 같은 칸 | 꼭 |
| ⑥ | 단계 · 비용 | `steps`(값 > 0만) · `cost_usd` · `cost_per_run` · `llm_calls` | 나중 |
| ⑦ | SLO · 종료 코드 | `slo`, 기준 바꾸기, 위반이면 4 | 꼭 |
| ⑧ | 지난주와 나란히 | `compare` | 나중 |
| ⑨ | tretry 기록 | 시도 줄 → 실행 한 줄 | 나중 |
| ⑩ | 주간 보고 마크다운 | `weekly` (LLM 없음) | 나중 |
| ⑪ | 화면 | `ui`: 요약 · 묶음 · 그 실행들 · `[t]` | 꼭 |
| ⑫ | 종료 코드 | 0 · 1 · 2 · 4 | 꼭 |
| 끝 | n8n 없이 시험 · 같은 숫자 확인 | 두 주 사본 · 가짜 데이터 API | 꼭 |
## 2. 요청문 (처음 한 번 + 다음 단계 한 줄)
단계마다 긴 요청문을 쓰지 않습니다. 할 일은 이미 `Doc/SPEC.md` · `Doc/IMP-PLAN.md`에 있으니, 에이전트가 그 파일을 읽게 하면 됩니다.
### 처음 한 번
```text
Doc/SPEC.md 와 Doc/IMP-PLAN.md 를 읽고 체크 안 된 첫 단계만 만들어 줘. uv 프로젝트, 명령 이름 tlog, 코드와 화면 글자는 영어.
끝나면 IMP-PLAN 체크를 표시하고 확인 명령을 알려 줘. 다음 단계는 내가 말할 때까지 하지 마.
```
### 그다음 단계마다 (같은 한 줄)
```text
확인했고 commit 했어. 다음 단계.
```
- 그냥 "계속"만 치면 단계 두세 개를 한꺼번에 하거나 체크 · 확인 명령을 빼먹기 쉽습니다. 이 한 줄은 처음 요청의 약속(한 단계만 · 체크 · 확인 명령 · 멈춤)을 이어 가게 합니다.
- 대화가 길어지면 새 세션에서 **처음 요청**을 다시 보냅니다. "체크 안 된 첫 단계"부터 이어집니다.
- 에이전트가 단계 내용을 잘못 알았다면, 요청문을 길게 쓰기보다 **SPEC · IMP-PLAN을 고치고** 다시 시킵니다.
### 틀렸을 때만 · 고쳐 달라는 요청문 예
무엇이 틀렸나(보인 것) · SPEC의 어느 요구인가 · 어디만 고치나 · 무엇으로 확인하나, 넷을 적습니다.
```text
tlog summary 가 두 주(10/19~10/30)를 602 runs 라고 해. n8n my-log-report 는 666 이야. SPEC R1 대로 끝날도 넣어야 해 (from <= started_at[:10] <= to).
load.py 의 날짜 거르기만 고치고, 10/30 하루만 물으면 64 runs, 두 주 666 인 테스트를 넣어 줘. 다른 파일은 건드리지 마.
```
## 3. 확인 기준과 강사 실측 (10/31, 77일차 데이터 API)
| 요구 | 기준 | 실측 |
| --- | --- | --- |
| R1 | 파일 · API, 날짜 포함 | API 10/26 하루 → 70 · 16, `--source live` → 오늘 기록만 (가짜 서버 테스트) |
| R2 | 두 주 | `666 runs · errors 21 (3.15%) · p50 1205ms · p95 2537ms`, 갈래 591 · 34 · 20 · 21 |
| R2 | 빈 기간 11/02~11/06 | 0 · 0 · 0 (n8n과 같음) |
| R3 · R4 | `tlog problems` 두 주 | 16 Search FAQ timeout · 5 Answer 429 · 와이파이 34 · 09시 16/16 · 15시 5/7 · 프린터 9.88% (8/81) |
| R5 | 같은 기간 `my-log-report`와 칸 비교 | 두 주 · 둘째 주 · 10/26 · 빈 기간 네 번 모두 **18칸 중 다른 칸 0개** |
| R6 | 단계 · 비용 | FAQ p95 39 (646) · 답 p95 2509 (596) · 0.07836달러 · 0.000118 · 596 |
| R7 | `tlog slo` 둘째 주 | `SLO breach: error_rate, unanswered_rate` · **종료 코드 4**, 첫 주 `--unanswered 0.06` → `SLO ok` · 0 |
| R8 | `tlog compare` 첫 주 → 둘째 주 | total 309 → 357 (+48), error_rate 0 → 0.0588, p50 1252 → 1171 (−81), p95 2525 → 2598 (+73) |
| R9 | tretry 기록 (scratch 파일, 시도 7줄) | `3 runs · errors 1 (33.33%)`, 갈래 오류 1 · 성공 1 · 대체 1, 실패 묶음 `command · exit 1` |
| R10 | `tlog weekly` | 숫자 표가 n8n `my-weekly`와 같음 (`\| 요청 \| 309 \| 357 \|` · 0% → 5.88% · SLO 못 지킴 둘) |
| R11 | `run_test` | 요약 줄 `666 runs · errors 21`, 묶음 2줄(16 · 5), 오른쪽 16 → 5줄, `t` → `2026-10-26T09` |
| R12 | 인자 없음 · 출처 없음 · 없는 파일 | 2 · 2 · 1 |
| R13 | `uv run pytest -q` | 23 passed in 1.7s |
| R14 | `/tmp`에서 `tlog --help` | `usage: tlog [-h] {summary,problems,slo,compare,weekly,ui} ...`, `tlog summary --url …` 0.08초 |
- 수업 준비 때 찾은 실수 둘 (학생도 겪기 쉬움): ① Python `round`는 짝수 쪽으로 반올림해 n8n(JavaScript `Math.round`)과 반에 걸린 값이 달라질 수 있어 `js_round`로 맞춤. ② `$TLOG_URL`을 정해 둔 채 `--file`을 주면 API를 읽던 것 → 파일이 먼저.
## 4. 7교시에 볼 것
| 볼 것 | 막혔을 때 한마디 |
| --- | --- |
| 숫자가 n8n과 다름 | "어느 칸이 · 얼마로 다른지 붙여 주고, AGENTS.md 3절 정의 그대로" |
| 빈 기간에 오류 | "0건이면 0" |
| 파일 · API의 숫자가 다름 | "거르기 규칙을 데이터 API와 같게 (끝날 포함)" |
| 테스트가 진짜 API를 부름 | "가짜 서버로, 진짜는 확인 단계에서만" |
| 세는 코드가 여기저기 | "metrics.py 한 곳" |
| `slo`가 늘 0 | "크면 위반, 위반이면 4" |
| tretry 시도를 실행으로 셈 | "final 줄까지 묶기" |