Error 한 줄만 남는 구조로는 장기 운영이 어렵습니다.Task 시작
↓
Context 생성
↓
AI 작업
↓
QA
↓
AI Review
↓
Report 생성
각 단계에서:
성공 / 실패 / 실행시간 / 원인 기록
AI 작업은 평균 얼마나 걸리는가?
어떤 단계에서 가장 자주 실패하는가?
자동 재작업은 몇 번 발생하는가?
어떤 Task가 비용을 많이 쓰는가?
어떤 Context Pack이 너무 큰가?
AI Review가 실제 문제를 얼마나 발견하는가?
QA에서 가장 자주 막히는 이유는 무엇인가?
Logs:
무슨 일이 발생했는가?
Metrics:
얼마나 자주/얼마나 오래 발생했는가?
Trace:
한 Task가 어떤 단계를 거쳤는가?
Log:
Task #142 AI Review 시작
Metric:
평균 AI Review 시간 18초
Trace:
Task #142
→ Context
→ Codex
→ QA
→ Retry
→ QA
→ Review
→ Done
Task #142
├─ Run #1 → 실패
├─ Run #2 → QA 실패
└─ Run #3 → 성공
run_20260911_093210_a82f
| 구분 | 의미 |
|---|---|
| Task | 해결해야 하는 업무 |
| Run | 해당 Task를 실행한 한 번의 시도 |
| Step | Run 내부의 개별 처리 단계 |
Task
↓
Run
↓
Steps
CREATED
RUNNING
SUCCEEDED
FAILED
BLOCKED
CANCELED
PENDING
RUNNING
PASSED
FAILED
SKIPPED
WARNING
Task #142
Run:
SUCCEEDED
Steps:
Context PASSED
AI_WORK PASSED
TYPECHECK PASSED
LINT PASSED
UNIT_TEST PASSED
INTEGRATION PASSED
AI_REVIEW WARNING
REPORT PASSED
TASK_LOAD
CONTEXT_BUILD
CONTEXT_SANITIZE
AI_WORK
AI_REWORK
AI_REVIEW
TYPECHECK
LINT
UNIT_TEST
INTEGRATION_TEST
E2E_TEST
BUILD
SECRET_SCAN
SCOPE_CHECK
MIGRATION_REVIEW
CONTRACT_REVIEW
TASK_REPORT
DAILY_REPORT
NOTION_UPLOAD
"테스트 실패"
"Test fail"
"unit failed"
이렇게 제각각 남기기보다:
step=UNIT_TEST
status=FAILED
형태로 관리하면 집계하기 쉽습니다.
{
"timestamp": "2026-09-11T00:32:15.125Z",
"runId": "run_20260911_093210_a82f",
"taskId": "142",
"project": "togethermall",
"step": "INTEGRATION_TEST",
"status": "FAILED",
"durationMs": 8421,
"errorCode": "TEST_FAILED"
}
timestamp
runId
taskId
project
step
status
durationMs
errorCode
branch
commit
model
attempt
risk
contextSize
testSuite
Prompt 전체
Git diff 전체
고객 개인정보
API Key
Token
DATABASE_URL
Authorization Header
운영 DB 결과
.env 내용
promptHash
promptTemplateVersion
contextFileCount
contextSize
changedFileCount
errorCode
예:
{
"promptTemplate": "backend-task-v3",
"promptHash": "e91f...",
"contextFiles": 6,
"contextChars": 38214
}
backend-task-v1
backend-task-v2
backend-task-v3
prompt:
name: backend-task
version: 3
v1:
기본 작업 요청
v2:
Scope 제한 추가
v3:
API Contract와 transaction 규칙 추가
0910에서 만든 Context 체계를 연결합니다.
Task #142
Context:
backend@4
database@2
security@5
api-contract@3
contextCommit:
8ae219f
과거 실행 당시 어떤 규칙이 적용됐는지 확인
Context 변경 이후 품질 비교
실패 원인 분석
{
"provider": "ollama",
"model": "shn-coder",
"operation": "DAILY_REPORT"
}
또는:
{
"provider": "external",
"model": "coding-model",
"operation": "AI_REVIEW"
}
어떤 모델이 특정 작업에 잘 맞는지 비교
실패율 비교
속도 비교
비용 비교
startedAt, finishedAt, durationMs를 기록하면 좋습니다.Context Build:
1.2초
AI Work:
38초
Typecheck:
5초
Integration:
14초
AI Review:
21초
Total:
79초
AI Work:
48%
AI Review:
27%
Tests:
20%
Task 하나 실행:
7분
간단한 수정:
직접 하면 3분
이런 경우 자동화가 오히려 방해가 될 수 있습니다.
자동화 시간
vs
사람이 직접 처리하는 시간
자동화가 줄여주는 검토 시간
자동화가 방지하는 사고 비용
Local checks:
8초
CI:
61초
AI:
42초
CI가 느리다면 테스트 병렬화
AI가 느리다면 Context 축소
Local이 느리다면 Pre-commit 검사 축소
Input Tokens:
18,420
Output Tokens:
3,120
Total:
21,540
AI Work:
15,000 input
AI Review:
8,000 input
Report:
3,000 input
Context 50,000 tokens
실제로 관련된 파일:
5개
AI 출력:
500 tokens
Context File Count
Context Token Count
Selected Pack Count
Retrieved Troubleshooting Count
Retrieved ADR Count
관련 없는 Pack 제거
Compact Context 활용
오래된 Troubleshooting 제외
중복 규칙 제거
Task #142
AI Work:
$0.18
AI Review:
$0.06
Report:
Local LLM → $0
Total:
$0.24
inputTokens
outputTokens
estimatedCost
currency
비용 값은 추정치일 수 있음
Provider별 단가가 바뀔 수 있음
정확한 청구는 실제 Provider Billing 기준
예상 Context:
90,000 tokens
설정 Limit:
50,000
결과:
WARNING
LOW Risk:
20k
MEDIUM:
40k
HIGH:
60k
CRITICAL:
사람 확인 후 실행
Task #142
AI_WORK:
1
AI_REWORK:
2
AI_REVIEW:
1
REPORT:
1
Total:
5 calls
평균:
0.3회
특정 Task:
3회
이 경우 확인:
Task Spec이 애매했는가?
Context가 부족했는가?
테스트가 부족했는가?
AI가 반복적으로 같은 실수를 했는가?
최근 30 Runs
SUCCESS:
24
FAILED/BLOCKED:
6
Success Rate:
80%
TYPECHECK:
12%
UNIT_TEST:
4%
INTEGRATION:
18%
SCOPE_CHECK:
3%
SECRET_SCAN:
0%
TYPECHECK_FAILED
LINT_FAILED
UNIT_TEST_FAILED
INTEGRATION_TEST_FAILED
BUILD_FAILED
SCOPE_VIOLATION
SECRET_DETECTED
CONTEXT_TOO_LARGE
CONTEXT_MISSING
REQUIREMENT_MISMATCH
AI_TIMEOUT
AI_RATE_LIMIT
AI_INVALID_OUTPUT
NOTION_UPLOAD_FAILED
REPORT_WRITE_FAILED
월별 실패 사유 집계
반복 문제 감지
Runbook 연결
자동 대응 분기
TYPECHECK_FAILED
→ 제한적 자동 재작업
SECRET_DETECTED
→ 즉시 BLOCK
CONTEXT_TOO_LARGE
→ Compact Context 재생성
AI_TIMEOUT
→ 제한적 Retry
MIGRATION 위험
→ Human Review
REQUIREMENT_MISMATCH
→ 사람 확인
{
"runId": "run_x",
"step": "AI_WORK",
"attempt": 2,
"previousError": "AI_TIMEOUT"
}
첫 시도 성공률
2회차 성공률
3회 이상 Retry 비율
QA 첫 통과율
자동 Retry 횟수
Scope Violation 비율
Human Review 수정 횟수
Revert 발생 여부
배포 후 관련 Incident 발생 여부
총 Task:
20
첫 시도 PASS:
14
First Pass Success:
70%
Task Spec 품질
Context 품질
AI 작업 정확도
테스트 기준 적절성
AI 완료 Tasks:
20
사람 추가 수정:
8
Human Correction Rate:
40%
FUNCTIONAL
ARCHITECTURE
STYLE
SECURITY
REQUIREMENT
Task 30개 중
범위 밖 파일 수정:
4개
Scope Violation:
13.3%
Task Spec allowedPaths 개선
Prompt의 수정 범위 강조
대규모 Task 더 작게 분리
failureCategory:
CONTEXT_MISSING
missingContext:
api-contract
Task type:
API DTO
api-contract pack 누락
↓
context-manifest 수정
처음에는 Markdown으로 충분하지만, 나중에는 간단한 Dashboard도 만들 수 있습니다.
최근 30일 Task
성공/실패율
평균 실행시간
AI 호출 횟수
평균 Retry
First Pass Success
Human Correction Rate
실패 Top 5
Domain별 Task 수
Tasks
Success Rate
Average Duration
Retry Rate
Top Failures
~/.llm-work/logs/
runs/
2026-09.jsonl
내용:
{"runId":"run_1","taskId":"142","step":"CONTEXT_BUILD","status":"PASSED","durationMs":810}
{"runId":"run_1","taskId":"142","step":"AI_WORK","status":"PASSED","durationMs":31521}
{"runId":"run_1","taskId":"142","step":"TYPECHECK","status":"FAILED","durationMs":4921}
구현 간단
append만 하면 됨
grep/jq 사용 가능
나중에 DB migration 가능
각 Run마다 하나의 Summary도 남길 수 있습니다.
{
"runId": "run_20260911_093210_a82f",
"taskId": "142",
"project": "togethermall",
"status": "SUCCEEDED",
"risk": "HIGH",
"durationMs": 82411,
"aiCalls": 3,
"retryCount": 1,
"changedFiles": 5,
"qaResult": "PASS_WITH_WARNINGS",
"startedAt": "2026-09-11T00:32:10Z",
"finishedAt": "2026-09-11T00:33:32Z"
}
~/.llm-work/
logs/
runs/
2026-09.jsonl
runs/
run_20260911_093210_a82f/
metadata.json
steps.json
qa-summary.json
context.json
report.md
Raw Prompt 저장 지양
Raw Diff 저장 지양
Secret 저장 금지
0909의 Task Report에 추가:
## Automation
- Run ID: run_20260911_093210_a82f
- Total Duration: 82.4s
- AI Calls: 3
- Automatic Retries: 1
- QA: PASS_WITH_WARNINGS
- Scope Violation: No
## AI/자동화 작업
- Task #142 완료
- QA 첫 실행에서 TypeScript 오류 발견
- Codex 자동 재작업 1회 후 정상 통과
- AI Review에서 API contract 확인 경고 발생
- 최종 수동 검토 후 완료
## AI 개발 자동화
- 처리 Task: 9건
- First Pass Success: 6건
- 자동 재작업: 3건
- 최종 BLOCK: 0건
- 주요 실패 원인: Typecheck 2건, Integration Test 1건
# 2026년 9월 AI 개발 자동화 리뷰
## 처리량
- 총 Task: 32
- AI 사용 Task: 24
## 품질
- First Pass Success: 71%
- Human Correction Rate: 29%
- Scope Violation: 8%
## 주요 실패
1. TYPECHECK_FAILED
2. CONTEXT_MISSING
3. INTEGRATION_TEST_FAILED
## 개선
- API 변경 Task에 api-contract Pack 강제
- Repository transaction 규칙 추가
- Integration Test 선택 기준 보강
AI Task 30건 처리
이 숫자 자체는 회사 성과가 아닙니다.
반복 작업 시간이 줄었는가?
리뷰 누락이 줄었는가?
배포 전 오류를 더 많이 발견했는가?
문서 누락이 줄었는가?
Secret 감지 → BLOCK
결과:
Run FAILED?
운영 관점:
안전장치 성공
Task Outcome:
BLOCKED
Safety Outcome:
SUCCESS
초기에는 실시간 알림까지 만들 필요는 없지만 다음 상황은 나중에 경고 대상으로 볼 수 있습니다.
Secret 감지
CRITICAL Task QA 실패
같은 Step 3회 연속 실패
AI Retry Limit 초과
Context Size Limit 초과
CI 반복 실패
터미널 강조 메시지
exit code
Markdown Report
정도로 충분합니다.
0907과 연결합니다.
같은 ErrorCode 3회 발생
↓
Troubleshooting 후보 생성
TYPECHECK_FAILED:
일반적으로 문서화 필요 없음
CONTEXT_MISSING 반복:
자동화 Troubleshooting 작성 가치 있음
SCOPE_VIOLATION 반복:
AI Rule 개선 필요
최근 30일:
Repository tx 누락 3회
결과:
⚠️ 반복 실패 패턴 발견
common-mistakes.md에 추가할 후보:
"Transaction 내부 Repository는 반드시 전달된 tx를 사용한다."
규칙을 추가했다면 실제 효과를 확인할 수 있습니다.
Rule 추가 전:
Transaction 관련 실패 5/20
Rule 추가 후:
1/20
현재 단계에서 필요 없는 것:
Prometheus
Grafana Cluster
분산 Trace 플랫폼
대규모 데이터 Warehouse
실시간 비용 Dashboard
JSONL Run Log
Task Report
주간 집계
실패 ErrorCode
durationMs
retryCount
type AutomationRun = {
runId: string;
taskId?: string;
project: string;
status:
| 'CREATED'
| 'RUNNING'
| 'SUCCEEDED'
| 'FAILED'
| 'BLOCKED'
| 'CANCELED';
risk?: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
startedAt: string;
finishedAt?: string;
durationMs?: number;
aiCalls: number;
retryCount: number;
changedFileCount?: number;
contextSize?: number;
qaResult?: 'PASS' | 'PASS_WITH_WARNINGS' | 'BLOCK';
};
type AutomationStep = {
runId: string;
type: string;
status:
| 'PENDING'
| 'RUNNING'
| 'PASSED'
| 'FAILED'
| 'WARNING'
| 'SKIPPED';
attempt: number;
startedAt: string;
finishedAt?: string;
durationMs?: number;
errorCode?: string;
};
llm-work stats
llm-work stats --month 2026-09
llm-work stats --project togethermall
llm-work runs
llm-work runs --failed
llm-work show-run <run-id>
September 2026
Runs 18
Succeeded 14
Blocked 2
Failed 2
First Pass 72%
Avg Duration 68s
Avg AI Calls 2.4
Avg Retry 0.4
Top Failure
1. TYPECHECK_FAILED 4
2. CONTEXT_MISSING 2
3. SCOPE_VIOLATION 1
show-runllm-work show-run run_20260911_093210_a82f
출력:
Task #142
Status: SUCCEEDED
Risk: HIGH
Duration: 82.4s
Steps
✓ Context Build 1.2s
✓ AI Work 31.5s
✗ Typecheck 4.9s
✓ AI Rework 18.2s
✓ Typecheck 4.7s
✓ Integration 13.8s
! AI Review 8.1s
Warnings:
- API contract 수동 확인 권장
Run Metadata:
장기 보관 가능
상세 Step Logs:
3~6개월
임시 AI 응답:
작업 완료 후 삭제 가능
Raw Diff/Prompt:
기본 미보관
저장공간
보안
불필요한 오래된 데이터
기존 Ollama 기반 보고 자동화에도 활용할 수 있습니다.
Model:
shn-coder
평균 생성시간:
12.8초
최근 성공률:
96%
실패:
Ollama not running 2회
모델 교체 효과
Prompt 변경 효과
입력 크기 증가 영향
속도
첫 QA 통과율
Human Correction
Retry 횟수
Context 처리 능력
비용
실제 Togethermall Task 10개
같은 고정된 내부 평가 세트를 만들어 비교하는 것이 더 실용적입니다.
TASK-TEST-01:
상담 상태 변경 구조 리뷰
TASK-TEST-02:
Permission 누락 찾기
TASK-TEST-03:
Prisma migration 위험 분석
TASK-TEST-04:
알림톡 retry 코드 리뷰
TASK-TEST-05:
일일 보고서 생성
모델 변경 전
vs
모델 변경 후
runId
taskId
step
status
duration
errorCode
완료 기준:
어떤 작업이 어느 단계에서 실패했는지 확인 가능
Run 수
성공률
평균 실행시간
Retry
실패 ErrorCode
완료 기준:
llm-work stats로 최근 자동화 상태 확인
Context Size
Context Packs
Prompt Version
Model
AI Calls
완료 기준:
Context와 Prompt 변경이 결과에 미치는 영향 추적 가능
First Pass Success
Human Correction Rate
Scope Violation Rate
Context Missing
완료 기준:
AI 자동화가 실제로 점점 나아지는지 판단 가능
반복 실패
↓
Troubleshooting/Common Mistakes 후보
완료 기준:
실패 데이터가 AI Rule 개선으로 연결
기존 llm-work CLI에 AI 자동화 실행 Observability 기능을 추가해줘.
목표:
Task → Context → AI Work → QA → AI Review → Report 전체 실행 과정의 성공/실패와 실행시간을 추적하고 싶다.
조건:
1. Task 실행마다 고유 runId를 생성해줘
2. 하나의 Task가 여러 번 실행될 수 있으므로 Task와 Run을 분리해줘
3. Run 내부에는 Step을 기록해줘
4. Run 상태는 CREATED, RUNNING, SUCCEEDED, FAILED, BLOCKED, CANCELED를 사용해줘
5. Step 상태는 PENDING, RUNNING, PASSED, FAILED, WARNING, SKIPPED를 지원해줘
6. Step에는 startedAt, finishedAt, durationMs, attempt, errorCode를 기록해줘
7. CONTEXT_BUILD, AI_WORK, AI_REWORK, AI_REVIEW, TYPECHECK, LINT, UNIT_TEST, INTEGRATION_TEST, E2E_TEST, SECRET_SCAN, SCOPE_CHECK, TASK_REPORT 등의 Step type을 정의해줘
8. 로그는 구조화된 JSONL 형식으로 ~/.llm-work/logs/runs/<YYYY-MM>.jsonl에 저장해줘
9. 각 Run은 ~/.llm-work/runs/<runId>/metadata.json에도 Summary를 저장해줘
10. 실제 Prompt 전체, Git diff 전체, Secret, 전화번호, DATABASE_URL, Authorization header는 로그에 저장하지 마
11. 대신 promptTemplateVersion, promptHash, contextSize, contextFileCount, contextPacks 정도만 저장해줘
12. AI 호출 시 model/provider/operation과 사용 가능하면 input/output token 정보를 기록해줘
13. 외부 모델은 estimatedCost를 저장할 수 있게 하되 추정값임을 구분해줘
14. QA first-pass success 여부와 retryCount를 저장해줘
15. TYPECHECK_FAILED, TEST_FAILED, SCOPE_VIOLATION, SECRET_DETECTED, CONTEXT_MISSING, AI_TIMEOUT 등 ErrorCode를 표준화해줘
16. llm-work runs, llm-work runs --failed, llm-work show-run <runId>, llm-work stats 명령을 추가해줘
17. stats에는 총 Runs, 성공/실패/Blocked, 평균 실행시간, 평균 Retry, First Pass Success, 실패 ErrorCode Top 목록을 보여줘
18. Task Report에 Run ID, Duration, AI Calls, Retry Count, QA 결과를 자동 추가해줘
19. 반복 실패 패턴을 발견하면 Troubleshooting 또는 common-mistakes 후보를 제안할 수 있게 구조를 열어줘
20. 로그 Retention 정책을 설정 가능하게 해줘
21. 테스트와 사용 방법을 문서화해줘
Task와 Run을 구분하는가?
Step 단위 실행시간을 확인할 수 있는가?
로그가 구조화되어 있는가?
민감한 Prompt/Diff를 저장하지 않는가?
실패 ErrorCode가 표준화되어 있는가?
Retry 기록을 덮어쓰지 않는가?
통계가 실제 Run 데이터를 기반으로 하는가?
Dashboard 같은 과한 구조부터 만들지 않는가?
Node.js CLI 기반 AI 개발 작업 자동화 시스템의 Observability를 설계하려고 해.
현재 구조:
1. Task Spec을 기반으로 Codex 작업을 실행함
2. Task마다 Context Pack과 ADR/Troubleshooting을 자동으로 선택함
3. 이후 typecheck, lint, unit/integration test, scope check, AI Review를 실행함
4. 일부 명확한 오류는 최대 2회 정도 AI 재작업을 수행함
5. 마지막에 Task Report와 Daily Report를 생성함
6. 모든 코드는 1인 개발 환경에서 운영하고 있으므로 과한 인프라는 피하고 싶음
추적하고 싶은 것:
- Task/Run 상태
- 각 Step 실행시간
- 실패 단계와 ErrorCode
- AI 호출 횟수
- Retry 횟수
- Context 크기와 사용 Pack
- Prompt Version
- Model
- Token/비용이 제공되면 해당 값
- First Pass Success
- Human Correction
- Scope Violation
- Context Missing 사례
보안:
- Raw Prompt 전체 저장 금지
- Git diff 전체 저장 금지
- Secret/API Key/JWT/DATABASE_URL 저장 금지
- 고객 개인정보 저장 금지
요청:
- Task/Run/Step 데이터 모델
- JSONL 기반 로컬 로그 구조
- ErrorCode 표준
- duration/retry 기록 방식
- Prompt/Context version 추적
- Token/비용 추적 기준
- First Pass Success/Human Correction 같은 품질 지표
- llm-work runs/stats/show-run CLI 구조
- Task/Daily/Weekly Report 연결
- 반복 실패를 Knowledge Rule 개선으로 연결하는 방법
- Retention 정책
- 구현 우선순위
를 실무적으로 정리해줘.
Task와 Run을 구분하는가?
Step 단위 추적을 제안하는가?
단순 성공률만 품질로 보지 않는가?
First Pass/Human Correction 같은 실제 결과 지표를 사용하는가?
Prompt와 Context Version을 추적하는가?
Raw Prompt/Diff 저장 위험을 지적하는가?
처음부터 대규모 Observability Stack을 요구하지 않는가?
기존 QA/Context/Report 흐름과 연결하는가?
llm-work stats 정도로 시작하는 것이 1인 개발 환경에 더 적합합니다.