Files

86 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 줄까지 묶기" |