agent-coach-cli 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,561 @@
1
+ {
2
+ "id": "official-guides-2026-11",
3
+ "title": "Claude·OpenAI 공식 가이드와 아카데미 기반 기본 채점표",
4
+ "version": 2,
5
+ "updated": "2026-11-12",
6
+ "scale": {
7
+ "0": "빠뜨림: 가이드가 권하는 정보·행동이 없음",
8
+ "1": "부분: 일부만 있거나 늦게(교정 후에) 나옴",
9
+ "2": "잘함: 처음부터 가이드대로 함",
10
+ "null": "해당 없음: 이 대화에서는 이 항목이 필요 없었음"
11
+ },
12
+ "sources": {
13
+ "claude-best-practices": {
14
+ "title": "Best practices for Claude Code (Anthropic Docs)",
15
+ "url": "https://code.claude.com/docs/en/best-practices"
16
+ },
17
+ "claude-ai-fluency": {
18
+ "title": "AI 역량: 프레임워크 및 기초 (Claude Academy)",
19
+ "url": "https://academy.claude.com/ko/courses/ai-fluency-framework-foundations",
20
+ "title_en": "AI Fluency: Framework & Foundations (Claude Academy)",
21
+ "url_en": "https://academy.claude.com/courses/ai-fluency-framework-foundations"
22
+ },
23
+ "claude-code-101": {
24
+ "title": "Claude Code 101 (Claude Academy)",
25
+ "url": "https://academy.claude.com/ko/courses/claude-code-101",
26
+ "title_en": "Claude Code 101 (Claude Academy)",
27
+ "url_en": "https://academy.claude.com/courses/claude-code-101"
28
+ },
29
+ "claude-code-in-action": {
30
+ "title": "Claude Code 실전 활용 (Claude Academy)",
31
+ "url": "https://academy.claude.com/ko/courses/claude-code-in-action",
32
+ "title_en": "Claude Code in Action (Claude Academy)",
33
+ "url_en": "https://academy.claude.com/courses/claude-code-in-action"
34
+ },
35
+ "claude-101": {
36
+ "title": "Claude 101 (Claude Academy)",
37
+ "url": "https://academy.claude.com/ko/courses/claude-101",
38
+ "title_en": "Claude 101 (Claude Academy)",
39
+ "url_en": "https://academy.claude.com/courses/claude-101"
40
+ },
41
+ "claude-opus-5-5-guide": {
42
+ "title": "Getting the most out of Opus 5.5 in Claude and Claude Code (claude.dev)",
43
+ "url": "https://claude.dev/blog/getting-the-most-out-of-opus-5-5/"
44
+ },
45
+ "codex-best-practices": {
46
+ "title": "Codex Best practices (OpenAI)",
47
+ "url": "https://learn.chatgpt.com/guides/best-practices"
48
+ },
49
+ "codex-prompting": {
50
+ "title": "Codex Prompting (OpenAI)",
51
+ "url": "https://learn.chatgpt.com/docs/prompting"
52
+ },
53
+ "openai-get-started-codex": {
54
+ "title": "Get Started with Codex (OpenAI Academy)",
55
+ "url": "https://academy.openai.com/public/courses/get-started-with-codex-jkhsq"
56
+ },
57
+ "openai-agents-workflows": {
58
+ "title": "Agents and Workflows (OpenAI Academy)",
59
+ "url": "https://academy.openai.com/public/courses/agents-and-workflows-y0qoc"
60
+ },
61
+ "openai-extend-codex": {
62
+ "title": "Extend Codex Workflows (OpenAI Academy)",
63
+ "url": "https://academy.openai.com/public/courses/extend-codex-workflows-4e61p"
64
+ }
65
+ },
66
+ "dimensions": [
67
+ {
68
+ "id": "specific_context",
69
+ "name": "구체적인 맥락",
70
+ "short": "맥락",
71
+ "summary": "목표와 함께 어떤 파일·화면·기능인지, 증상이 무엇인지 처음부터 짚어 준다.",
72
+ "look_for": "States the goal and names the file/module/screen, describes the symptom or current behavior, gives repro steps or relevant background. Missing when the prompt is a bare goal like 'fix the login bug' and the agent had to guess or ask.",
73
+ "applies_when": "Any task that changes or investigates something concrete. Not applicable to open-ended exploration or casual questions.",
74
+ "guide": [
75
+ {
76
+ "source": "codex-best-practices",
77
+ "section": "Strong first use: Context and prompts",
78
+ "quote": "프롬프트에 목표(Goal)와 맥락(Context)을 넣는다. 관련 파일·폴더·문서·예시·에러를 짚고 @로 붙인다.",
79
+ "quote_en": "Put the Goal and Context in the prompt: the files, folders, docs, examples or errors that matter; @-mention them."
80
+ },
81
+ {
82
+ "source": "claude-best-practices",
83
+ "section": "Write a specific prompt",
84
+ "quote": "파일을 지목하고 증상을 설명하고 '고쳐진 상태'가 무엇인지 처음에 말하면 교정 한 바퀴를 아낀다.",
85
+ "quote_en": "Name the file, describe the symptom and say what 'fixed' looks like up front, and you save a round of corrections."
86
+ },
87
+ {
88
+ "source": "claude-ai-fluency",
89
+ "section": "효과적인 프롬프팅 기법",
90
+ "quote": "맥락 제공: 원하는 내용, 그 이유, 관련 배경을 구체적으로 설명한다.",
91
+ "quote_en": "Provide context: say specifically what you want, why, and the relevant background.",
92
+ "section_en": "Effective prompting techniques"
93
+ }
94
+ ],
95
+ "example": {
96
+ "before": "로그인 버그 고쳐줘",
97
+ "after": "세션이 만료된 뒤 로그인이 실패한다는 제보가 있어. src/auth/ 의 토큰 갱신 부분을 보고, 재현하는 실패 테스트를 먼저 쓴 다음 고쳐줘."
98
+ },
99
+ "en": {
100
+ "name": "Specific context",
101
+ "short": "Context",
102
+ "summary": "State the goal and point at the file, screen or feature and the symptom from the start.",
103
+ "example": {
104
+ "before": "fix the login bug",
105
+ "after": "users report login fails after the session times out. look at token refresh in src/auth/, write a failing test that reproduces it, then fix it"
106
+ }
107
+ }
108
+ },
109
+ {
110
+ "id": "done_criteria",
111
+ "name": "완료 기준과 검증 방법",
112
+ "short": "검증",
113
+ "summary": "무엇이 통과하면 끝인지(테스트·빌드·린트·스크린샷) 알려 주고 스스로 돌려 보게 한다.",
114
+ "look_for": "States 'done when': a test, build, lint, script, screenshot, repro rerun, or 'keep going until X passes'. Missing when the user ends up being the test suite, discovering breakage themselves turns later.",
115
+ "applies_when": "Any task that produces a change whose correctness can be checked. Not applicable to pure Q&A.",
116
+ "guide": [
117
+ {
118
+ "source": "codex-best-practices",
119
+ "section": "Strong first use / Improve reliability with testing and review",
120
+ "quote": "완료 조건(Done when)을 적는다: 테스트 통과, 동작 변경, 버그 재현 안 됨 등. Codex는 '좋은 상태'가 뭔지 알아야 스스로 검증 루프를 돈다.",
121
+ "quote_en": "Write 'Done when': tests pass, behavior changes, the bug no longer reproduces. Codex can only run its own check loop if it knows what good looks like."
122
+ },
123
+ {
124
+ "source": "claude-best-practices",
125
+ "section": "Give Claude a check to run",
126
+ "quote": "통과/실패로 돌아오는 확인 수단을 주면 Claude가 스스로 고치고 다시 돌린다. 없으면 사용자가 테스트 역할을 하게 된다.",
127
+ "quote_en": "Give Claude something that comes back pass or fail and it fixes and reruns on its own. Without it, you become the test suite."
128
+ },
129
+ {
130
+ "source": "claude-opus-5-5-guide",
131
+ "section": "Say what “done” looks like, then let it run",
132
+ "quote": "한 메시지에 작업 전체와 결승선('테스트 통과', '모든 엔드포인트 이전')을 말하고 맡긴다.",
133
+ "quote_en": "Hand over the whole task in one message with the finish line ('the tests pass', 'every endpoint is migrated') and let it run."
134
+ },
135
+ {
136
+ "source": "openai-get-started-codex",
137
+ "section": "Overview",
138
+ "quote": "Codex에게 저장소 맥락과 완료 기준을 주고, 변경을 검증하는 습관을 기른다.",
139
+ "quote_en": "Build the habit of giving Codex repository context and completion criteria, and verifying the change."
140
+ }
141
+ ],
142
+ "example": {
143
+ "before": "결제 모듈 리팩터링해줘",
144
+ "after": "결제 모듈을 리팩터링해줘. 끝나면 pytest tests/payment 를 돌리고, 전부 통과할 때까지 계속 고쳐줘."
145
+ },
146
+ "en": {
147
+ "name": "Done criteria and verification",
148
+ "short": "Verify",
149
+ "summary": "Say what has to pass for the work to count as done (tests, build, lint, screenshot) and let the agent run it.",
150
+ "example": {
151
+ "before": "refactor the payment module",
152
+ "after": "refactor the payment module. when you're done run pytest tests/payment and keep fixing until everything passes."
153
+ }
154
+ }
155
+ },
156
+ {
157
+ "id": "constraints",
158
+ "name": "제약과 선호",
159
+ "short": "제약",
160
+ "summary": "건드리면 안 되는 것, 쓰지 말아야 할 것, 두 방법 중 원하는 쪽을 미리 말한다.",
161
+ "look_for": "Explicit constraints or preferences: no new libraries, keep API shape, follow pattern X, minimal diff, don't touch folder Y, prefer approach A over B, styles to avoid. Missing when the user later corrects a choice the agent could not have known (e.g. 'no, don't use that library').",
162
+ "applies_when": "Tasks where reasonable alternatives exist or something must stay unchanged.",
163
+ "guide": [
164
+ {
165
+ "source": "codex-best-practices",
166
+ "section": "Strong first use: Context and prompts",
167
+ "quote": "제약(Constraints): 따라야 할 표준, 구조, 안전 요구, 관례를 적는다.",
168
+ "quote_en": "Constraints: list the standards, architecture, safety requirements and conventions to follow."
169
+ },
170
+ {
171
+ "source": "claude-best-practices",
172
+ "section": "Write a specific prompt",
173
+ "quote": "두 가지 합리적인 방법 중 선호가 있다면 Claude는 코드에서 그걸 읽을 수 없으니 처음에 말한다.",
174
+ "quote_en": "If you prefer one of two reasonable approaches, Claude can't read that from the code, so say it up front."
175
+ },
176
+ {
177
+ "source": "claude-opus-5-5-guide",
178
+ "section": "For design work, name the styles you don’t want",
179
+ "quote": "'뻔하지 않게' 같은 막연한 말보다 원하지 않는 패턴을 구체적으로 나열한다.",
180
+ "quote_en": "Instead of a vague 'make it not generic', list the specific patterns you don't want."
181
+ }
182
+ ],
183
+ "example": {
184
+ "before": "캘린더 위젯 추가해줘",
185
+ "after": "HotDogWidget.php 패턴을 따라서 월을 고르고 연도를 넘길 수 있는 캘린더 위젯을 만들어줘. 새 라이브러리는 쓰지 마."
186
+ },
187
+ "en": {
188
+ "name": "Constraints and preferences",
189
+ "short": "Limits",
190
+ "summary": "Say up front what must not change, what not to use, and which of two approaches you prefer.",
191
+ "example": {
192
+ "before": "add a calendar widget",
193
+ "after": "follow the pattern in HotDogWidget.php and build a calendar widget that lets you pick a month and page between years. no new libraries."
194
+ }
195
+ }
196
+ },
197
+ {
198
+ "id": "hand_over",
199
+ "name": "자료 직접 건네기",
200
+ "short": "자료",
201
+ "summary": "설명하는 대신 파일(@경로), 스크린샷, 에러 로그 원문을 그대로 붙인다.",
202
+ "look_for": "Attaches or pastes the real thing: @file references, screenshots, full error output, logs, links to the exact spec. Missing when the user paraphrases an error ('it shows some error') or retypes numbers from a chart instead of attaching it.",
203
+ "applies_when": "When an error message, file, design, chart, or log existed that the agent needed.",
204
+ "guide": [
205
+ {
206
+ "source": "claude-best-practices",
207
+ "section": "Write a specific prompt",
208
+ "quote": "필요한 게 이미 있으면 설명하지 말고 건네라: @파일, 스크린샷 붙여넣기, 명령 출력 파이프.",
209
+ "quote_en": "If you already have what Claude needs, hand it over: @file, paste the screenshot, pipe in the command output."
210
+ },
211
+ {
212
+ "source": "claude-opus-5-5-guide",
213
+ "section": "Share the chart or screenshot itself",
214
+ "quote": "숫자를 옮겨 적지 말고 차트·도표·스크린샷 자체를 첨부한다.",
215
+ "quote_en": "Attach the chart, diagram or screenshot itself instead of retyping the numbers."
216
+ },
217
+ {
218
+ "source": "codex-prompting",
219
+ "section": "Explain a codebase / Prototype from a screenshot",
220
+ "quote": "@로 파일을 붙이거나 경로를 명시하고, 화면은 스크린샷을 첨부한다.",
221
+ "quote_en": "Attach files with @ or name their paths, and attach a screenshot for UI."
222
+ }
223
+ ],
224
+ "example": {
225
+ "before": "빌드하면 이상한 에러 나는데 고쳐줘",
226
+ "after": "npm run build 하면 아래 에러가 나. 원인 찾아서 고쳐줘.\n```\n(에러 전문 붙여넣기)\n```"
227
+ },
228
+ "en": {
229
+ "name": "Hand over the real material",
230
+ "short": "Material",
231
+ "summary": "Attach the file (@path), screenshot or full error output instead of describing it.",
232
+ "example": {
233
+ "before": "the build shows some weird error, fix it",
234
+ "after": "npm run build fails with the error below. find the cause and fix it.\n```\n(paste the full error)\n```"
235
+ }
236
+ }
237
+ },
238
+ {
239
+ "id": "scope_signal",
240
+ "name": "범위와 결과물 형태",
241
+ "short": "범위",
242
+ "summary": "최소한으로 할지 넉넉히 할지, 결과물을 어떤 형태(파일·표·길이)로 받을지 알려 준다.",
243
+ "look_for": "Signals intended scope and output shape: 'be ambitious / handle empty and error states' or 'minimal, just Y'; the deliverable's format, length, audience (a file, a table, two paragraphs). Missing when the user later asks for obvious follow-ons one by one or reshapes the output format after the fact.",
244
+ "applies_when": "Building features, documents or UI where scope or output shape could reasonably vary.",
245
+ "guide": [
246
+ {
247
+ "source": "claude-best-practices",
248
+ "section": "Write a specific prompt",
249
+ "quote": "Claude는 요청을 보수적으로 읽고 가장 작게 만든다. 넉넉한 버전을 원하면 'be ambitious'처럼 범위를 말한다.",
250
+ "quote_en": "Claude reads requests conservatively and builds the smallest thing. If you want the fuller version, say so ('be ambitious')."
251
+ },
252
+ {
253
+ "source": "claude-ai-fluency",
254
+ "section": "설명 자세히 살펴보기",
255
+ "quote": "결과물 설명: 원하는 결과물, 형식, 대상 독자, 스타일을 명확히 정의한다.",
256
+ "quote_en": "Product description: define the output, its format, audience and style.",
257
+ "section_en": "A closer look at description"
258
+ },
259
+ {
260
+ "source": "claude-101",
261
+ "section": "더 나은 결과 얻기",
262
+ "quote": "길이를 추측하게 두지 말고 '두 문단으로', '100단어 이내로'처럼 말한다. 형식은 설명보다 예시로 보여 준다.",
263
+ "quote_en": "Don't make it guess the length: say 'two paragraphs' or 'under 100 words'. Show the format with an example rather than describing it.",
264
+ "section_en": "Getting better results"
265
+ }
266
+ ],
267
+ "example": {
268
+ "before": "목업 보고 설정 페이지 만들어줘",
269
+ "after": "목업 보고 설정 페이지 만들어줘. 넉넉하게: 빈 상태·에러 상태, 저장 흐름 연결, 키보드 이동까지. 레이아웃만 말고."
270
+ },
271
+ "en": {
272
+ "name": "Scope and output shape",
273
+ "short": "Scope",
274
+ "summary": "Say whether you want the minimal or the fuller version, and what shape the result should take (file, table, length).",
275
+ "example": {
276
+ "before": "build the settings page from the mockup",
277
+ "after": "build the settings page from the mockup. be ambitious: empty and error states, the save flow wired up, keyboard navigation, not just the layout"
278
+ }
279
+ }
280
+ },
281
+ {
282
+ "id": "plan_first",
283
+ "name": "계획·인터뷰 먼저",
284
+ "short": "계획",
285
+ "summary": "크거나 아직 정리 안 된 일은 바로 시키지 않고, 계획을 세우거나 질문을 받게 한다.",
286
+ "look_for": "For large or fuzzy tasks: asks for a plan before edits, uses /plan or plan mode, asks the agent to interview them and write a spec, or splits into milestones. Missing when a big ambiguous request was fired off directly and then reshaped through many corrections.",
287
+ "applies_when": "Multi-step, multi-file, or still-ambiguous work. Not applicable to small well-defined edits.",
288
+ "guide": [
289
+ {
290
+ "source": "codex-best-practices",
291
+ "section": "Plan first for difficult tasks",
292
+ "quote": "복잡하거나 모호한 작업은 코딩 전에 계획부터: Plan 모드(/plan), 나를 인터뷰하게 하기, PLANS.md 템플릿.",
293
+ "quote_en": "For complex or ambiguous tasks, plan before coding: Plan mode (/plan), ask it to interview you, or a PLANS.md template."
294
+ },
295
+ {
296
+ "source": "claude-code-in-action",
297
+ "section": "긴 세션 조율하기",
298
+ "quote": "코드 한 줄 쓰기 전에 플랜 모드로 범위를 정하고, 받은 계획은 훑지 말고 실제로 읽고 다듬는다.",
299
+ "quote_en": "Scope the work in plan mode before a single line is written, then actually read the plan and refine it.",
300
+ "section_en": "Steering long sessions"
301
+ },
302
+ {
303
+ "source": "claude-code-101",
304
+ "section": "탐색 → 계획 → 코드 작성 → 커밋 워크플로우",
305
+ "quote": "작업을 쪼개고, Claude가 접근 방식을 제안하게 한 뒤 검토하고 진행한다.",
306
+ "quote_en": "Break the work down, let Claude propose an approach, review it, then proceed.",
307
+ "section_en": "The explore → plan → code → commit workflow"
308
+ },
309
+ {
310
+ "source": "claude-best-practices",
311
+ "section": "Brainstorm with Claude first",
312
+ "quote": "원하는 게 아직 불분명하면 Claude에게 인터뷰를 시켜 스펙을 쓰게 하고, 새 세션에서 그 스펙으로 만든다.",
313
+ "quote_en": "If you don't know what you want yet, have Claude interview you and write a spec, then build from it in a fresh session."
314
+ }
315
+ ],
316
+ "example": {
317
+ "before": "공개 API에 rate limit 붙여줘",
318
+ "after": "공개 API에 rate limit을 붙이고 싶은데 아직 정리를 못 했어. 스펙을 쓸 수 있을 때까지 나한테 질문하고, 다 되면 SPEC.md 로 써줘."
319
+ },
320
+ "en": {
321
+ "name": "Plan or interview first",
322
+ "short": "Plan",
323
+ "summary": "For big or still-fuzzy work, have the agent plan or interview you before it builds.",
324
+ "example": {
325
+ "before": "add rate limiting to the public API",
326
+ "after": "I want to add rate limiting to the public API but haven't thought it through. interview me until you could write the spec, then write it to SPEC.md."
327
+ }
328
+ }
329
+ },
330
+ {
331
+ "id": "stop_conditions",
332
+ "name": "멈출 지점과 진행 방식",
333
+ "short": "멈춤",
334
+ "summary": "어디까지 알아서 하고 어디서 멈춰 물어볼지, 어떤 방식으로 일하고 보고할지 정해 준다.",
335
+ "look_for": "Tells the agent when to keep going vs. stop and ask (e.g. 'ask only if a test fails for a reason you can't explain', 'confirm before submitting/deleting/paying'), and how to behave or report (concise vs detailed, keep a checklist file, end with what's blocked on me). Missing when the agent kept stopping to ask permission, or went past a point the user wanted to approve, or the user had to say 'continue' repeatedly.",
336
+ "applies_when": "Longer or autonomous tasks, and any task with irreversible or outward-facing steps (submit, send, delete, pay, publish).",
337
+ "guide": [
338
+ {
339
+ "source": "claude-opus-5-5-guide",
340
+ "section": "Tell it which stops you want",
341
+ "quote": "언제 멈추고 물어볼지, 언제 계속할지를 짧은 규칙으로 정한다. 되돌리기 어려운 작업 앞에서는 반드시 멈추게 한다.",
342
+ "quote_en": "Write a short rule for when to stop and ask and when to keep going. Always stop before anything hard to undo."
343
+ },
344
+ {
345
+ "source": "claude-ai-fluency",
346
+ "section": "설명 자세히 살펴보기",
347
+ "quote": "수행 설명: 간결할지 상세할지, 도전적일지 조력할지 등 협업 중 AI가 어떻게 수행하길 원하는지 정한다.",
348
+ "quote_en": "Performance description: say how you want the AI to behave while you work together, concise or detailed, challenging or supportive.",
349
+ "section_en": "A closer look at description"
350
+ },
351
+ {
352
+ "source": "openai-agents-workflows",
353
+ "section": "Overview",
354
+ "quote": "에이전트와 일할 때는 맥락을 주고, 결과물을 정의하고, 경계(boundaries)를 정한다.",
355
+ "quote_en": "When working with agents, give context, define the output, and set boundaries."
356
+ }
357
+ ],
358
+ "example": {
359
+ "before": "사람인이랑 원티드로 자동 지원 시스템 만들어줘",
360
+ "after": "사람인·원티드 자동 지원 시스템을 만들어줘. 공고 수집과 지원서 작성까지는 묻지 말고 진행하고, 최종 제출 직전에는 입력값을 표로 보여주고 멈춰. 진행 상황은 TASKS.md 체크리스트로 남겨."
361
+ },
362
+ "en": {
363
+ "name": "Stop points and working style",
364
+ "short": "Stops",
365
+ "summary": "Say how far the agent should go on its own, where it must stop and ask, and how it should work and report.",
366
+ "example": {
367
+ "before": "build an auto-apply system for the job sites",
368
+ "after": "build the auto-apply system for the two job sites. collect postings and fill in applications without asking, but stop right before the final submit and show me the values in a table. keep progress in a TASKS.md checklist."
369
+ }
370
+ }
371
+ },
372
+ {
373
+ "id": "evidence",
374
+ "name": "증거 요구와 결과 검토",
375
+ "short": "증거",
376
+ "summary": "'다 됐어요'를 그대로 믿지 않고 실행한 명령과 출력, diff, 스크린샷을 보여 달라고 한다.",
377
+ "look_for": "Asks for proof: the command run and its output, screenshots, the diff, links; asks the agent to mark what it couldn't confirm; or asks for an independent review (fresh session/subagent, /review, /code-review). Score 2 if the user asked for evidence or verified; 0 if they accepted an unverified claim that turned out wrong.",
378
+ "applies_when": "When the agent reported completion of something checkable, especially after unattended runs.",
379
+ "guide": [
380
+ {
381
+ "source": "claude-code-in-action",
382
+ "section": "신뢰하기: 감독 없는 실행 검증하기",
383
+ "quote": "덜 지켜볼수록 더 검증한다. 요약이 아니라 diff부터 읽고, 코드 작성 과정을 모르는 새 세션에 두 번째 의견을 구한다.",
384
+ "quote_en": "The less you watched, the more you verify. Start from the diff, not the summary, and get a second opinion from a fresh session.",
385
+ "section_en": "Trust it: verifying unsupervised runs"
386
+ },
387
+ {
388
+ "source": "claude-best-practices",
389
+ "section": "Give Claude a check to run",
390
+ "quote": "어떤 방식이든 증거를 요구하라: 실행한 명령과 출력, 또는 스크린샷. '테스트 다 통과'만으로는 알 수 있는 게 거의 없다.",
391
+ "quote_en": "Whichever way you check, ask for evidence: the command and its output, or a screenshot. 'All tests pass' alone tells you very little."
392
+ },
393
+ {
394
+ "source": "claude-opus-5-5-guide",
395
+ "section": "Ask it to mark what it couldn’t confirm",
396
+ "quote": "확인하지 못한 것은 표시하고 어디를 찾아봤는지 말하게 한다.",
397
+ "quote_en": "Ask it to mark anything it couldn't confirm, and to say where it looked."
398
+ },
399
+ {
400
+ "source": "codex-best-practices",
401
+ "section": "Improve reliability with testing and review",
402
+ "quote": "변경을 요청하는 데서 멈추지 말고 테스트·검사를 돌려 결과를 확인하고, /review 로 diff를 검토한 뒤 받아들인다.",
403
+ "quote_en": "Don't stop at asking for a change: run the checks, confirm the result, and review the diff with /review before accepting it."
404
+ }
405
+ ],
406
+ "example": {
407
+ "before": "다 고쳤으면 알려줘",
408
+ "after": "고친 다음 테스트를 실제로 돌리고, 실행한 명령과 출력 마지막 20줄, 바뀐 파일 목록을 같이 보여줘. 확인 못 한 건 따로 표시해."
409
+ },
410
+ "en": {
411
+ "name": "Ask for evidence, review the result",
412
+ "short": "Evidence",
413
+ "summary": "Don't take 'done' at face value: ask for the command and its output, the diff, or a screenshot.",
414
+ "example": {
415
+ "before": "let me know when it's fixed",
416
+ "after": "after the fix, actually run the tests and show me the command, the last 20 lines of output and the list of changed files. mark anything you couldn't confirm."
417
+ }
418
+ }
419
+ },
420
+ {
421
+ "id": "steering",
422
+ "name": "방향 바로잡기",
423
+ "short": "교정",
424
+ "summary": "엇나가면 일찍 멈추고, 같은 교정을 두 번 해도 안 되면 새로 시작해 더 나은 프롬프트를 쓴다.",
425
+ "look_for": "Healthy: stops drift early, gives one clear and specific correction, uses rewind, or after two failed corrections starts fresh (/clear, new session) with a better prompt folding in what was learned. Also tells the agent about manual edits/reverts. Unhealthy: three or more rounds of vague 'no, still wrong / again' in the same thread.",
426
+ "applies_when": "Sessions with at least one correction from the user.",
427
+ "guide": [
428
+ {
429
+ "source": "claude-best-practices",
430
+ "section": "Steer the session",
431
+ "quote": "처음 1분을 지켜보다 엇나가면 바로 Esc. 두 번 교정해도 안 되면 세 번째 대신 /clear 후 더 나은 프롬프트를 쓴다.",
432
+ "quote_en": "Watch the first minute and press Esc the moment it drifts. After two failed corrections, /clear and write a better prompt instead of a third."
433
+ },
434
+ {
435
+ "source": "claude-code-in-action",
436
+ "section": "긴 세션 조율하기",
437
+ "quote": "잘못된 방향이면 프롬프트로 되돌리려 하지 말고 rewind로 체크포인트로 돌아간다.",
438
+ "quote_en": "If it's heading the wrong way, rewind to a checkpoint instead of steering it back with prompts.",
439
+ "section_en": "Steering long sessions"
440
+ },
441
+ {
442
+ "source": "claude-101",
443
+ "section": "더 나은 결과 얻기",
444
+ "quote": "'더 짧게'보다 '처음 두 단락을 자르고 결론을 행동 중심으로'처럼 구체적으로 피드백하고, 엇나간 대화는 새 채팅이 더 빠를 수 있다.",
445
+ "quote_en": "Give specific feedback ('cut the first two paragraphs and make the conclusion action-oriented' beats 'shorter'); a derailed chat is often faster to restart.",
446
+ "section_en": "Getting better results"
447
+ },
448
+ {
449
+ "source": "codex-prompting",
450
+ "section": "Iterate on UI with live updates",
451
+ "quote": "직접 되돌린 부분이 있으면 Codex에게 알려서 덮어쓰지 않게 한다.",
452
+ "quote_en": "If you reverted something by hand, tell Codex so it doesn't overwrite your edits."
453
+ }
454
+ ],
455
+ "example": {
456
+ "before": "아니 그게 아니라 다시 해봐 (세 번째)",
457
+ "after": "(/clear 후) 버튼 정렬을 고쳐줘. 앞서 시도한 flex 방식은 Safari에서 깨졌으니 grid로 해줘. 기준은 첨부한 스크린샷이야."
458
+ },
459
+ "en": {
460
+ "name": "Course correction",
461
+ "short": "Steer",
462
+ "summary": "Stop drift early, and if the same correction fails twice, start fresh with a better prompt.",
463
+ "example": {
464
+ "before": "no that's not it, try again (third time)",
465
+ "after": "(after /clear) fix the button alignment. the flex approach broke in Safari, so use grid. the target is the attached screenshot."
466
+ }
467
+ }
468
+ },
469
+ {
470
+ "id": "reusable_guidance",
471
+ "name": "반복 지시는 규칙 파일로",
472
+ "short": "규칙",
473
+ "summary": "매번 되풀이하는 규칙이나 절차는 CLAUDE.md·AGENTS.md·스킬로 옮겨 다음 대화에서도 지켜지게 한다.",
474
+ "look_for": "When the user states a durable rule ('always', 'from now on', 'every time', '무조건', '앞으로') or repeats the same instruction/correction, do they get it recorded where future sessions load it (CLAUDE.md, AGENTS.md, memory, a skill, a hook)? Score 2 if they ask to record it or it was clearly already recorded; 1 if stated once without recording; 0 if they repeat the same rule or correction several times in the session.",
475
+ "applies_when": "Only when the user states or repeats a rule meant to outlive the current task.",
476
+ "guide": [
477
+ {
478
+ "source": "codex-best-practices",
479
+ "section": "Make guidance reusable with AGENTS.md / Common mistakes",
480
+ "quote": "통하는 프롬프트 패턴은 손으로 되풀이하지 말고 AGENTS.md로 옮긴다. 같은 실수를 두 번 하면 회고를 시켜 AGENTS.md를 고친다.",
481
+ "quote_en": "Once a prompting pattern works, stop repeating it by hand and move it into AGENTS.md. When Codex makes the same mistake twice, ask for a retrospective and update AGENTS.md."
482
+ },
483
+ {
484
+ "source": "claude-best-practices",
485
+ "section": "Keep CLAUDE.md short / Enforce the rules that can't have exceptions",
486
+ "quote": "Claude가 코드로 알 수 없는 것만 CLAUDE.md에 적고, 예외가 없어야 하는 규칙은 훅으로 강제한다.",
487
+ "quote_en": "Only put in CLAUDE.md what Claude can't learn from the code, and enforce rules that can't have exceptions with hooks."
488
+ },
489
+ {
490
+ "source": "openai-extend-codex",
491
+ "section": "Overview",
492
+ "quote": "효과 있는 개인 습관을 공유 지침과 재사용 스킬로 만들어 팀 관행으로 바꾼다.",
493
+ "quote_en": "Turn effective personal habits into shared guidance and reusable skills the team can follow."
494
+ }
495
+ ],
496
+ "example": {
497
+ "before": "아 그리고 탐사는 무조건 x1로 돌아야한다 (세 번째 대화에서 또)",
498
+ "after": "탐사는 무조건 x1이야. 이 규칙을 CLAUDE.md 금지 사항에 추가하고, 다음부터는 묻지 말고 지켜."
499
+ },
500
+ "en": {
501
+ "name": "Move repeated rules into files",
502
+ "short": "Rules",
503
+ "summary": "Rules and procedures you keep repeating belong in CLAUDE.md, AGENTS.md or a skill so later sessions follow them too.",
504
+ "example": {
505
+ "before": "remember, always run the import with --dry-run first (said again in a third session)",
506
+ "after": "always run the import with --dry-run first. add this rule to CLAUDE.md and follow it from now on without asking."
507
+ }
508
+ }
509
+ },
510
+ {
511
+ "id": "focused_session",
512
+ "name": "한 대화에 한 가지 결과",
513
+ "short": "집중",
514
+ "summary": "서로 다른 일을 한 대화에 계속 이어 붙이지 않고, 결과물 단위로 대화를 나누거나 정리한다.",
515
+ "look_for": "One chat per coherent outcome: when the user switches to an unrelated task, do they start a new session, /clear, fork, or hand off? For long chats, do they compact with a focus? Score 0 when one session piles up several unrelated projects; 1 when related but sprawling without any compaction or reset; 2 when the session stays on one outcome or the user resets at topic changes.",
516
+ "applies_when": "Sessions long enough to drift (roughly 15+ user turns) or containing a clear topic switch.",
517
+ "guide": [
518
+ {
519
+ "source": "codex-best-practices",
520
+ "section": "Organize long-running chats / Common mistakes",
521
+ "quote": "결과 하나에 대화 하나. 프로젝트 전체를 한 대화로 끌고 가면 컨텍스트가 부풀고 결과가 나빠진다.",
522
+ "quote_en": "One chat per coherent outcome. Running a whole project in one chat bloats the context and makes results worse over time."
523
+ },
524
+ {
525
+ "source": "claude-code-101",
526
+ "section": "컨텍스트 관리",
527
+ "quote": "/compact, /clear, /context로 컨텍스트 창을 관리해 긴 세션의 생산성을 유지한다.",
528
+ "quote_en": "Manage the context window with /compact, /clear and /context to keep long sessions productive.",
529
+ "section_en": "Context management"
530
+ },
531
+ {
532
+ "source": "claude-code-in-action",
533
+ "section": "긴 세션 조율하기",
534
+ "quote": "/compact는 단독으로 쓰지 말고 무엇을 남길지 지시를 붙인다.",
535
+ "quote_en": "Don't run /compact bare; tell it what the summary must keep.",
536
+ "section_en": "Steering long sessions"
537
+ }
538
+ ],
539
+ "example": {
540
+ "before": "(오사카 일정 대화에 이어서) 이제 경력증명서 양식 만들어줘",
541
+ "after": "(새 세션에서) 경력증명서 Word 양식을 만들어줘. 회사·근무기간·담당업무는 아래와 같아."
542
+ },
543
+ "en": {
544
+ "name": "One outcome per conversation",
545
+ "short": "Focus",
546
+ "summary": "Don't keep stacking unrelated work onto one conversation; split or tidy it per outcome.",
547
+ "example": {
548
+ "before": "(continuing the travel-planning chat) now make me an employment certificate template",
549
+ "after": "(in a new session) make an employment certificate Word template. company, dates and role are below."
550
+ }
551
+ }
552
+ }
553
+ ],
554
+ "title_en": "Default rubric grounded in Claude and OpenAI official guides and academies",
555
+ "scale_en": {
556
+ "0": "Missed: what the guide recommends is absent",
557
+ "1": "Partial: only some of it, or only after a correction",
558
+ "2": "Good: done as the guide says from the start",
559
+ "null": "N/A: this conversation didn't need it"
560
+ }
561
+ }
agentcoach/rubric.py ADDED
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+
3
+ import copy
4
+ import json
5
+ from importlib import resources
6
+ from pathlib import Path
7
+
8
+
9
+ def load_rubric(path: str | None = None, lang: str = "ko") -> dict:
10
+ if path:
11
+ raw = json.loads(Path(path).read_text(encoding="utf-8"))
12
+ else:
13
+ raw = json.loads(resources.files("agentcoach").joinpath("rubric/default.json").read_text(encoding="utf-8"))
14
+ return localize(raw, lang)
15
+
16
+
17
+ def localize(rubric: dict, lang: str) -> dict:
18
+ """Return a copy whose user-facing fields are in `lang`.
19
+
20
+ Korean is the base text; any `*_en` field or per-dimension `en` block overrides it for English.
21
+ A custom rubric with no English fields simply stays as written.
22
+ """
23
+ r = copy.deepcopy(rubric)
24
+ r["lang"] = lang
25
+ for g in (g for d in r["dimensions"] for g in d.get("guide", [])):
26
+ g.setdefault("quote", g.pop("quote_ko", ""))
27
+ if lang != "en":
28
+ return r
29
+ r["title"] = r.get("title_en", r["title"])
30
+ r["scale"] = r.get("scale_en", r.get("scale"))
31
+ for src in r.get("sources", {}).values():
32
+ src["title"] = src.get("title_en", src["title"])
33
+ src["url"] = src.get("url_en", src["url"])
34
+ for d in r["dimensions"]:
35
+ en = d.get("en") or {}
36
+ for k in ("name", "short", "summary", "example"):
37
+ if k in en:
38
+ d[k] = en[k]
39
+ for g in d.get("guide", []):
40
+ g["quote"] = g.get("quote_en", g["quote"])
41
+ g["section"] = g.get("section_en", g["section"])
42
+ return r
43
+
44
+
45
+ def dim_ids(rubric: dict) -> list[str]:
46
+ return [d["id"] for d in rubric["dimensions"]]