claude-token-saver 3.43.0 โ 3.44.0
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.
- package/README.ko.md +53 -572
- package/README.md +103 -1261
- package/bin/cli.js +1 -1
- package/package.json +1 -1
- package/presets/ratchet-rules.json +2 -2
- package/src/brief.js +1 -1
- package/src/commands/brief.js +1 -1
- package/src/commands/route-scan.js +3 -3
- package/src/commands/upgrade.js +27 -3
- package/src/harness-templates.js +5 -4
- package/src/route-scan.js +1 -1
- package/src/seed-rules.js +4 -0
- package/src/update-check.js +20 -3
package/README.md
CHANGED
|
@@ -28,26 +28,28 @@
|
|
|
28
28
|
<details>
|
|
29
29
|
<summary><strong>๐ฐ๐ท ํ๊ตญ์ด๋ก ๋ณด๊ธฐ (ํด๋ฆญํ๋ฉด ํ๊ตญ์ด ์ ๋ฌธ์ด ํผ์ณ์ง๋๋ค)</strong></summary>
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
---
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
# Sprag
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
**AI ์ฝ๋ฉ ์์ด์ ํธ์ ๊ฑฐ๋ ํ์ง ๋์นซ์
๋๋ค. ์์ด์ ํธ๋ ๊ทธ๋๋ก ์ผํ๊ณ , ํดํ๋ง ๋ง์ต๋๋ค.** ์ด๋ฆ์ ์คํ๋๊ทธ ํด๋ฌ์น์์ ์์ต๋๋ค. ์์ผ๋ก ๋๋ ํ์ ๊ทธ๋๋ก ํต๊ณผ์ํค๊ณ , ์ญํ์ ํ๋ ์๊ฐ ์ ๊ธฐ๋ ๋ถํ์
๋๋ค. Sprag๋ Claude Code๊ฐ ์ด๋ฏธ ๋จ๊ธฐ๋ ์ธ์
๊ธฐ๋ก์ ์ฝ์ด ๋์ ๋๋ ์ด๋์ผ๋ก ๋ฐ๊ฟ๋๋ค. ๋ํ์ด๋ ์คํจ๋ ์ธ์
๋ง๋ค ์ฌ๋ผ์ค๋ ๊ท์น์ด ๋๊ณ , ์ ๋ ดํ ํฐ์ด๊ฐ ๊ฐ๋นํ๋ค๊ณ ์ฆ๋ช
๋ ์์
์ ์ ๊ฐ์ก ์์ฅ์ ์์์ฆ ์ผ์ ๊ทธ์ชฝ์ผ๋ก ์์๋๋ฉฐ, ์บ์์ ์ฌ์ฉ๋ ํ๋ ๋ฌธ์ ๋ ์์ง ์์ธ ์ ์์ ๋ statusline์ ๋ํ๋ฉ๋๋ค.
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
์์กด์ฑ 0, API ํค ๋ถ์, ๋ฐ์ดํฐ๋ ์ปดํจํฐ ๋ฐ์ผ๋ก ๋๊ฐ์ง ์์ต๋๋ค.
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
|
-
npm i -g sprag-cli #
|
|
41
|
-
# already have claude-token-saver? switching names needs a swap (same bins):
|
|
42
|
-
# npm uninstall -g claude-token-saver && npm i -g sprag-cli
|
|
40
|
+
npm i -g sprag-cli # ์์ ์ด๋ฆ claude-token-saver ์ ๊ฐ์ ํจํค์ง์
๋๋ค
|
|
43
41
|
```
|
|
44
42
|
|
|
45
|
-
|
|
43
|
+

|
|
44
|
+
|
|
45
|
+
## ์ซ์ ๋ค ๊ฐ
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
| ์งํ | ๊ฒฐ๊ณผ | | ๊ทผ๊ฑฐ |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| ๊ณต๊ฐ ๋ฒค์น๋งํฌ ์ ํ๋ | **59.1%** ยท ๋จ์ผ ์ต๊ณ ๋ชจ๋ธ 57.9% | `โฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐ` | [๋ฒค์น๋งํฌ](https://github.com/rootstudioyaml/sprag/blob/main/docs/BENCHMARK.md) |
|
|
50
|
+
| ๊ฐ์ ๋ฌธํญ ์ด๋น์ฉ | **$268** ยท gpt-5 $388 ยท gemini-2.5-pro $734 | `โฐโฐโฐโฐโฐโฑโฑโฑโฑโฑโฑโฑ` | [๋ฒค์น๋งํฌ](https://github.com/rootstudioyaml/sprag/blob/main/docs/BENCHMARK.md) |
|
|
51
|
+
| ๋ฌธ์ ํ ํฐ | **โ95.8%** ยท 540,429 โ 22,610 | `โฐโฑโฑโฑโฑโฑโฑโฑโฑโฑโฑโฑ` | [doc2md](https://github.com/rootstudioyaml/sprag/blob/main/docs/DOC2MD.md) |
|
|
52
|
+
| ๋ฉ์์ง๋น ๋น์ฉ | **โ18.6%** ยท $2.345 โ $1.910 | `โฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฑโฑ` | [์ค์ธก ๋ฆฌํฌํธ](#์ค์ -ํจ๊ณผ-๋์
-์ ํ-๋ฆฌํฌํธ) |
|
|
51
53
|
|
|
52
54
|
```text
|
|
53
55
|
์ ํ๋ ์ด๋น์ฉ (11,696๋ฌธํญ)
|
|
@@ -56,547 +58,35 @@ gpt-5 57.8% $388 โฐโฐโฐโฐโฐโฐโฐโฐโฑโฑโฑ
|
|
|
56
58
|
gemini-2.5-pro 57.9% $734 โฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐ
|
|
57
59
|
```
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
๋ผ์ฐํ
์ ๊ฐ์ก์ ์ถ์ ์น๊ฐ ์๋๋ผ ์์ ํ ๊ฑด ํ ๊ฑด์ ์ฐจ์ก์ ์ ์ ์์ฅ์
๋๋ค. `sprag route-scan savings` ๊ฐ ๋ชจ๋ ๊ธ์ก์ ๋ฃฐ ๋จ์๊น์ง ์ญ์ถ์ ํด ๋ณด์ฌ ์ค๋๋ค. ์ง๊ณ์์ ๋ฌด์์ ๋นผ๋์ง๊น์ง [์์ฅ ๋ฌธ์](https://github.com/rootstudioyaml/sprag/blob/main/docs/COMMANDS.md)์ ์ ์ด ๋์์ต๋๋ค.
|
|
60
62
|
|
|
61
63
|
## ์ค์น ํ ๋ฒ์ ์ ๋ถ ๋ค์ด ์๊ณ , ์ฒซ๋ ๋ถํฐ ๋์ํฉ๋๋ค
|
|
62
64
|
|
|
63
|
-
| | ํ๋ ์ผ |
|
|
64
|
-
|---|---|
|
|
65
|
-
| โ๏ธ **๋์นซ ๊ท์น** | ๋ํ์ด๋ ์คํจ๊ฐ ํ ์ค์ง๋ฆฌ ๊ท์น์ด ๋์ด ๋งค ์ธ์
์ ์ฌ๋ผ์ต๋๋ค. ํ๋ณด๋ ๊ธฐ๋ก์์ ์๋์ผ๋ก ์ฐพ์ ์ฃผ๊ณ , ํ๋ก์ ํธ ๋ฒ์์ ์ ์ญ ๋ฒ์ ์ค ์ด๋ ์ชฝ์ ๋ฃ์์ง๋ ์ฌ์ฉ์๊ฐ ๊ณ ๋ฆ
๋๋ค. |
|
|
66
|
-
| ๐ **๋ชจ๋ธ ํผํ
** | ๊ธฐ๋ก์์ ๋ฝ์ ์์ ๊ท์น์ ์ธก์ ํ ์ค๋ฅ์จ๊ณผ ์ ๊ฐ์ก์ ๋ถ์ฌ `ratchet-model.md`์ ์ ์ต๋๋ค. ํ๋ณ ๊ธฐ์ค์ ๊ณต๊ฐ ๋ฐ์ดํฐ๋ก [๋ฒค์น๋งํฌ](https://github.com/rootstudioyaml/sprag/blob/main/docs/BENCHMARK.md)ํ์ต๋๋ค. |
|
|
67
|
-
| ๐
ท **ํ๋ค์ค ์ ์** | ๋ค์ฏ ๊ฐ์ง ์ด์ ์์น์ ์ค์๊ฐ์ผ๋ก ์ ๊ฒํฉ๋๋ค ([๋น์ฉ โ18.6% ์ค์ธก](#์ค์ -ํจ๊ณผ-๋์
-์ ํ-๋ฆฌํฌํธ)). ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๋ฉด ์๋ฃ๋ฅผ ๋ณด๊ณ ํ๊ธฐ ์ ์ `๐
ท 4/5`๊ฐ ๋จผ์ ์๋ ค ์ค๋๋ค. |
|
|
68
|
-
| ๐ **ํ ํฐ ํ
๋ ๋ฉํธ๋ฆฌ** | ์บ์ ์ ์ค๋ฅ ๊ณผ TTL, ์ปจํ
์คํธ ํฌ๊ธฐ, ์ถ๋ ฅ ๊ธ์ฆ, ๋ ๊ฐ์ง ์ฌ์ฉ๋ ํ๋๋ฅผ ๋งค ํด ํ๋กฌํํธ์ ํ์ํฉ๋๋ค. |
|
|
69
|
-
| ๐ **doc2md** | pptx์ xlsx, pdf, docx, fig๋ฅผ ํ์ํ ๋ ๋ณํํฉ๋๋ค. ๋ฌธ์๋ฅผ ํต์งธ๋ก ๋ถ์ด๋ ๋์ ๋ณํ๋ณธ๋ง ์ฝ์ผ๋ฉด ๋ฉ๋๋ค ([๋ฐํ์๋ฃ ํ ๊ฑด์ 51๋ง ํ ํฐ ์ ์ฝ](#-doc2md-๋ฌธ์๋ฅผ-์ฝ๊ธฐ-์ ์-markdown-์ผ๋ก-๋ฐ๊ฟ๋๋ค)). |
|
|
70
|
-
| ๐ฐ๐ท **๋ฌธ์ฒด ๊ฒ์ดํธ** | ์ฐ๋ ์์ ์ hook์ผ๋ก ๊ฒ์ฌํฉ๋๋ค. ์ง๊ธ์ ํ๊ตญ์ด ๊ธฐ์ ๋ฌธ์๋ฅผ ์ง์ํ๋ฉฐ ์ด์ค ํผ๋๊ณผ ๋ฒ์ญํฌ, ๋ฌธ์ฅ ์ฐ๊ฒฐ์ ์ดํ๋๋ค. |
|
|
71
|
-
|
|
72
|
-
์ค์ธก โ18.6%๋ ํ๋ค์ค์ ๋์นซ์ ๋ชซ์ด๊ณ , ๋ผ์ฐํ
๊ณผ ๋ฌธ์ ๋ณํ ์ ๊ฐ์ก์ ๊ทธ ์์ ์นํ๋๋ค. ๋ ์ ๊ฐ์ก์ ์ฑ๊ฒฉ์ด ๋ฌ๋ผ์ ํ ์ซ์๋ก ํฉ์น์ง ์๊ณ , statusline์ด ๊ฐ๊ฐ์ ์ค๋ก ๋ณด์ฌ ์ฃผ๋ฉฐ ๊ธ์ก์ด ํฐ ์ชฝ์ ์์ ๋์ต๋๋ค.
|
|
73
|
-
|
|
74
|
-
## ๋ชฉ์ฐจ
|
|
75
|
-
|
|
76
|
-
- **๋จผ์ ๋ณผ ๊ฒ**: [์์ํ๊ธฐ](#์์ํ๊ธฐ) ยท [statusline ์ฝ๋ ๋ฒ](#statusline-์ฝ๋-๋ฒ) ยท [์ฃผ์ ๋ช
๋ น](#์ฃผ์-๋ช
๋ น)
|
|
77
|
-
- **์ ๊ฐ ๊ธฐ๋ฅ**: [๋ผ์ฐํ
์ ๊ฐ ์์ฅ](#-์ ๊ฐ์ก์-์ถ์ ์ด-์๋๋ผ-์์ฅ-๊ธฐ๋ก์
๋๋ค) ยท [route-scan](#-route-scan-์ด-๋ฐ๋ณต-์์
์-๋-์ผ-ํฐ์ด๋ก-๋ด๋ ค๋-๋ฉ๋๋ค) ยท [doc2md](#-doc2md-๋ฌธ์๋ฅผ-์ฝ๊ธฐ-์ ์-markdown-์ผ๋ก-๋ฐ๊ฟ๋๋ค) ยท [seed](#-seed-์ค์น-์งํ๋ถํฐ-์์์ด-๊ฑธ๋ฆฌ๊ฒ-ํ๋-์์-๋ฃฐ) ยท [๋ฒค์น๋งํฌ](https://github.com/rootstudioyaml/sprag/blob/main/docs/BENCHMARK.md)
|
|
78
|
-
- **๊ฐ๋๋ ์ผ**: [Harness](#-harness-๋ชจ๋) ยท [compact-window](#-compact-window-1m-์ปจํ
์คํธ์-์๋-์์ถ-์ง์ -๊ณ ์ ) ยท [ํ๊ตญ์ด ๋ฌธ์ฒด](#-ํ๊ตญ์ด-๋ฌธ์ฒด-์ง์นจ)
|
|
79
|
-
- **๋น์ฉ ๊ฐ์ํยทํ๊ฒฝ**: [์ด๋ฒ ๋ฌ ์ง์ถยทLiteLLM ํค ์์ฐ](#litellm-5h7d-cap-๋์ -ํค-์์ฐ์-๋ณด์ฌ-์ค๋๋ค-v3350) ยท [๊ฒ์ดํธ์จ์ด(BedrockยทVertex)](#-bedrockvertex-๊ฒฝ์ -ํ๊ฒฝ) ยท [ํ ํฐ ๊ธ์ฆ ์์ธ ์ฝ๋](#ํ ํฐ-๊ธ์ฆ-์์ธ-์ฝ๋) ยท [์ค์ธก ํจ๊ณผ](#์ค์ -ํจ๊ณผ-๋์
-์ ํ-๋ฆฌํฌํธ)
|
|
80
|
-
|
|
81
|
-
## ์์ํ๊ธฐ
|
|
82
|
-
|
|
83
|
-
**์ฌ์ ์ค๋น:** Node.js โฅ 18 (`node -v`๋ก ํ์ธ ยท macOS `brew install node` ยท Windows `winget install OpenJS.NodeJS.LTS` ยท Linux/WSL์ [nvm](https://github.com/nvm-sh/nvm) ๊ถ์ฅ)
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
npm i -g sprag-cli
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
์ค์นํ๋ฉด Claude Code ํ๋ฉด ํ๋จ์ statusline์ด ๊ณง๋ฐ๋ก ๋ํ๋ฉ๋๋ค. `--ignore-scripts` ์ต์
์ด๋ sudo ์ฌ์ฉ ๋ฑ์ผ๋ก ์๋ ๋ฑ๋ก์ด ๋์ง ์์๋ค๋ฉด `sprag install`์ ์คํํด ์ง์ ๋ฑ๋กํ์ญ์์ค.
|
|
90
|
-
|
|
91
|
-
์ค์น ํ ๋ฒ์ผ๋ก **statusline๊ณผ Skill, SessionStart ํ
, ๐
ท Harness(5์์น), ์ต์ด route-scan์ด** ๋ชจ๋ ์ค๋น๋ฉ๋๋ค. Harness์ ํ๊ตญ์ด ๋ฌธ์ฒด ์ง์นจ์ **๋ฌด์์ด ์ถ๊ฐ๋๋์ง ๋ณด์ฌ ์ค ๋ค ์ผค์ง ๋ฌผ์ด๋ด
๋๋ค.** Harness๋ `~/.claude/CLAUDE.md`์ ํ์๊ฐ ๋ถ์ ๋ธ๋ก์ผ๋ก **์ถ๊ฐ๋๋ฉฐ**, ๊ธฐ์กด์ ์์ฑํด ๋ ๋ด์ฉ์ ๋ฐฑ์
ํ ๋ค ๊ทธ๋๋ก ๋ณด์กดํฉ๋๋ค. ์ด๋ฏธ ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ์๋ ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์์ต๋๋ค.
|
|
92
|
-
|
|
93
|
-
ํฐ๋ฏธ๋์ด ์๋ ํ๊ฒฝ(npm์ `postinstall`, CI, ํ์ดํ ์
๋ ฅ)์์๋ ์ง๋ฌธ์ ๊ฑด๋๋ฐ๊ณ ๊ธฐ์กด ๊ธฐ๋ณธ๊ฐ์ ์ ์ฉํฉ๋๋ค. ์ง๋ฌธ ์์ด ์งํํ๋ ค๋ฉด `--yes`๋ `--no-input`, ์์ ๊ฑด๋๋ฐ๋ ค๋ฉด `CTS_NO_HARNESS=1 npm i -g sprag-cli`๋ฅผ ์ฐ์ญ์์ค. ์ด๋ฏธ ์ ์ฉํ ์ค์ ์ ๋๋๋ฆฌ๋ ค๋ฉด `sprag harness uninit --global`์ ์คํํ์ญ์์ค.
|
|
94
|
-
|
|
95
|
-
> โ ๏ธ sudo๋ก ๊ธ๋ก๋ฒ ์ค์น๋ฅผ ํ๋ฉด Skill์ด ์ฌ์ฉ์ ๊ณ์ ์ด ์๋๋ผ root์ `~/.claude`์ ๋ฑ๋ก๋๋ ํจ์ ์ด ์์ต๋๋ค. nvm์ด๋ fnm, Volta๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์ ์์ญ์ ์ค์นํ๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค.
|
|
96
|
-
|
|
97
|
-
### ์ค์นํ๋ฉด ์ผ์ง๋ ๊ธฐ๋ฅ๊ณผ ์ง์ ์ผ์ผ ํ๋ ๊ธฐ๋ฅ
|
|
98
|
-
|
|
99
|
-
์ค์น ์์ ์ ๋น์ฉ์ด ๋ค์ง ์๋ ๊ธฐ๋ฅ์ ์ ๋ถ ์๋์ผ๋ก ์ผ์ง๋๋ค. ์๋์ผ๋ก ๋จ๊ฒจ ๋ ํญ๋ชฉ์ Claude Code ์์ฒด์ ์ค์ ์ ๋ฐ๊พธ๊ฑฐ๋, ์ ์ฉ ๋ฒ์๋ฅผ ์ฌ๋์ด ์ ํด ์ฃผ์ด์ผ ํ๋ ๊ฒ๋ค๋ฟ์
๋๋ค.
|
|
100
|
-
|
|
101
|
-
| ๊ธฐ๋ฅ | ์ค์น ์งํ ์ํ | ๋๋ ๋ฐฉ๋ฒ |
|
|
102
|
-
|---|---|---|
|
|
103
|
-
| statusline (์ง๋จ ์นฉยท์ ๊ฐ ์์ฅ) | ์ผ์ง | `sprag uninstall` |
|
|
104
|
-
| `/claude-token-saver` Skill | ์ผ์ง | ์์ ๊ฐ์ต๋๋ค |
|
|
105
|
-
| SessionStart ํ
(route-scan ์ฌ๋ถ์) | ์ผ์ง | ์์ ๊ฐ์ต๋๋ค |
|
|
106
|
-
| UserPromptSubmit ํ
(brief ์ฃผ์
) | ์ผ์ง | ์์ ๊ฐ์ต๋๋ค |
|
|
107
|
-
| ์ต์ด route-scan (์ต๊ทผ 14์ผ ๋ก๊ทธ ๋ถ์) | ์ค์น ์ค ์ฆ์ 1ํ ์คํ | ํด๋น ์์ต๋๋ค |
|
|
108
|
-
| ๐
ท Harness 5์์น (`~/.claude/CLAUDE.md`) | ์ผ์ง (ํฐ๋ฏธ๋์์๋ ๋ด์ฉ์ ๋ณด์ฌ ์ฃผ๊ณ ํ ๋ฒ ๋ฌป์ต๋๋ค) | `harness uninit --global` ยท `CTS_NO_HARNESS=1` |
|
|
109
|
-
| doc2md ํ
(ReadยทEditยทWriteยทํ๋กฌํํธ) | ์ผ์ง | `doc2md off` ยท `CTS_NO_DOC2MD=1` |
|
|
110
|
-
| doc2md ๋ณํ๊ธฐ(markitdown venv) | ํฐ๋ฏธ๋์์ ์ค์น ์ฌ๋ถ๋ฅผ ๋ฌป๊ณ , ๋น๋ํํ ์ค์น์์๋ ๋ช
๋ น๋ง ์๋ดํฉ๋๋ค | `doc2md install-converter` ๋ก ๋์ค์ ์ค์น |
|
|
111
|
-
| ํ๊ตญ์ด ๋ฌธ์ฒด ์ง์นจ | ์์คํ
๋ก์ผ์ผ์ด ํ๊ตญ์ด๋ฉด ์ผ์ง (ํฐ๋ฏธ๋์์๋ ๋ฌป์ต๋๋ค) | `korean off` ยท `CTS_NO_KOREAN=1` |
|
|
112
|
-
| compact-window ๊ฒฝ๊ณ ์นฉ | ์ผ์ง | `compact-window off` |
|
|
113
|
-
| ์
๋ฐ์ดํธ ์๋ด ์นฉ | ์ผ์ง | `CTS_NO_UPDATE_CHECK=1` |
|
|
114
|
-
| **compact-window ๊ฐ ๊ณ ์ ** (`autoCompactWindow` 500k) | **๊บผ์ง โ ์ง์ ์คํํด์ผ ํฉ๋๋ค** | `compact-window set --global` ๋๋ `--project` |
|
|
115
|
-
| **๋ชจ๋ธ ํผํ
๋ฃฐ ์น์ธ** (`ratchet-model.md` ์์ ๋ฃฐ) | **ํ๋ณด๋ง ์ ์ํฉ๋๋ค** | `route-scan rules` ๋ก ํ์ธํ๊ณ ์น์ธยท์ญ์ |
|
|
116
|
-
| `handoff` (ํ๋ ์๋ฐ ์ ์์
๋ฐฑ์
) | ํ์ํ ๋ ์ง์ ์คํํ๋ ๋ช
๋ น์
๋๋ค | ํด๋น ์์ต๋๋ค |
|
|
117
|
-
|
|
118
|
-
`compact-window set` ์ Claude Code ์ `settings.json` ์ ๊ฐ์ ์ ๊ณ , ์ ์ญ๊ณผ ํ๋ก์ ํธ ์ค ์ด๋์ ์ ์์ง๋ ์ฌ๋์ด ์ ํด์ผ ํ๋ฏ๋ก ์๋์ผ๋ก ์คํํ์ง ์์ต๋๋ค. ๋ชจ๋ธ ํผํ
๋ฃฐ๋ ๊ฐ์ ์ด์ ๋ก ์น์ธ ๋จ๊ณ๋ฅผ ๋จ๊ฒจ ๋์์ต๋๋ค. ์ด๋ค ์์
์ ๋ ์ผ ํฐ์ด์ ๋งก๊ธธ์ง๋ ์ฌ์ฉ์์ ํ๋จ์ด ํ์ํฉ๋๋ค.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
## ๐ ์ ๊ฐ์ก์ ์ถ์ ์ด ์๋๋ผ ์์ฅ ๊ธฐ๋ก์
๋๋ค
|
|
122
|
-
|
|
123
|
-
์์๋ ์คํ ํ๋ํ๋๋ฅผ ์ด๋ ๊ฒ ๊ธฐ๋กํฉ๋๋ค.
|
|
124
|
-
|
|
125
|
-
```
|
|
126
|
-
๊ธฐ์ค ๋ชจ๋ธ ์คํ ๋ชจ๋ธ ์ฐจ์ก
|
|
127
|
-
claude-opus-5 โ haiku-4-5 = $0.57
|
|
128
|
-
(๋ฃฐ ์น๊ฒฉ ์ (์ค์ ๋ก (๊ฐ์ ํ ํฐ๋์
|
|
129
|
-
์ด ์ ํ์ ์ฒ๋ฆฌํ ๋ ๋ชจ๋ธ ๊ฐ๊ฒฉํ๋ฅผ
|
|
130
|
-
์ฒ๋ฆฌํ๋ ๋ชจ๋ธ) ๋ชจ๋ธ) ๊ฐ๊ฐ ์ ์ฉ)
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
$ sprag route-scan savings # ๋ชจ๋ ๊ธ์ก์ ๋ฃฐ ๋จ์๊น์ง ์ญ์ถ์
|
|
135
|
-
|
|
136
|
-
๐ ๋ผ์ฐํ
์ ๊ฐ ๋์ $2.09 (์ต๊ทผ 7์ผ $1.40 ยท 30์ผ $2.09)
|
|
137
|
-
|
|
138
|
-
๋ชจ๋ธ ์ด๋๋ณ:
|
|
139
|
-
claude-fable-5 โ claude-sonnet-5 โ 1ํ, $0.72
|
|
140
|
-
claude-opus-5 โ claude-haiku-4-5 โ 1ํ, $0.57
|
|
141
|
-
|
|
142
|
-
์คํ๋ณ (์ต๊ทผ์):
|
|
143
|
-
2026-08-22 $0.51 claude-fable-5 โ claude-haiku-4-5
|
|
144
|
-
๋ฃฐ: T2|paste|-Users-me-projects-my-app
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
**์ง๊ณ์์ ๋นผ๋ ๊ฒ๋ค**: ์ ์งํ ์ซ์๊ฐ ์์ ์ซ์๋ณด๋ค ๋ซ๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
148
|
-
|
|
149
|
-
- ๋ฑ๋ก๋ ๋ฃฐ์ด ๋ด๋นํ์ง ์๋ ์์(`Explore`, ์ง์ ๋ง๋ ์์ด์ ํธ, ํ๋ฌ๊ทธ์ธ ์์ด์ ํธ): ์ด ๋๊ตฌ๊ฐ ๋ผ์ฐํ
ํ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค.
|
|
150
|
-
- ๊ฐ๊ฒฉํ๊ฐ ์ธ์ํ์ง ๋ชปํ๋ ๋ชจ๋ธ๋ช
: ํ๋ฆฐ ๊ธ์ก์ ์ฐ๋๋ ๊ทธ ์คํ์ ๋บ๋๋ค.
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## โก ๊ทธ ๋ฐ์ statusline์ด ์ก์ ์ฃผ๋ ๊ฒ
|
|
155
|
-
|
|
156
|
-
| | |
|
|
157
|
-
|---|---|
|
|
158
|
-
| ๐จ **ํ๋ ์ด๊ณผ ์๋ฐฉ** | 5์๊ฐยท7์ผ rate-limit ์๋๊ฐ 90%์ ๋ฟ์ผ๋ฉด ๊ฒฝ๊ณ ํ๊ณ , `handoff`๋ก ์์
์ ๋ฐฑ์
ํฉ๋๋ค |
|
|
159
|
-
| ๐ง **์บ์ ๋ญ๋น ๊ฐ์ง** | ํํธ์จยทTTLยท1M ์ปจํ
์คํธ๋ฅผ ๊ฐ์งํด ํ ํฐ ๊ธ์ฆ ์์ธ์ ์ฝ๋๋ก ์ง๋จํฉ๋๋ค |
|
|
160
|
-
| ๐ต **๋น์ฉ ๊ฐ์ํ** | ์ด๋ฒ ๋ฌ ์ง์ถ(`๐ต Sep $42`)์ ์์ ํ์ํ๊ณ , LiteLLM ๊ฒ์ดํธ์จ์ด์์๋ ํค ์์ฐ ๊ฒ์ด์ง(`๐ budget 34% $34/$100`)๋ก 5h/7d cap ์ ๋์ ํฉ๋๋ค ([์๋](#litellm-5h7d-cap-๋์ -ํค-์์ฐ์-๋ณด์ฌ-์ค๋๋ค-v3350)) |
|
|
161
|
-
| ๐ฐ๐ท **ํ๊ตญ์ด ๋ฌธ์ฒด ๊ต์ ** | ํ๊ตญ์ด ํ๊ฒฝ์ด๋ฉด ์๋์ผ๋ก ์ผ์ง๋๋ค ([์๋](#-ํ๊ตญ์ด-๋ฌธ์ฒด-์ง์นจ)) |
|
|
162
|
-
|
|
163
|
-
## ๋ผ์ฐํฐ๊ฐ ์๋๋๋ค: 60์ด ์ค๋ช
|
|
164
|
-
|
|
165
|
-
์ค์น๋ ํ ๋ฒ์ด๋ฉด ๋ฉ๋๋ค. ์ด๋ฏธ ์ฐ๊ณ ์๋ ์ธ์
์ ๊ทธ๋๋ก ์ฝ์ผ๋ฏ๋ก, ํ๋กฌํํธ๋ฅผ ์ฐ๋ ๋ฐฉ์์ ๋ฐ๊พธ๋ผ๊ณ ์๊ตฌํ์ง ์์ต๋๋ค. ์์ฒญ์ ์ค์๊ฐ์ผ๋ก ๊ฐ๋ก์ฑ๊ฑฐ๋ ๋ชจ๋ธ์ ๋ฐ๊ฟ์น๊ธฐํ์ง๋ ์์ต๋๋ค.
|
|
166
|
-
|
|
167
|
-
1. **๋ํ์ด๋ ์คํจ๊ฐ ๊ท์น์ด ๋ฉ๋๋ค.** ์ฒ์ ๊ฒช๋ ์คํจ๋ ๊ทธ๋ฅ ์์
์
๋๋ค. ๊ฐ์ ์คํจ๊ฐ ๋ ๋ฒ์งธ๋ก ๋ํ๋๋ฉด Sprag๊ฐ ๊ท์น ํ๋ณด๋ก ์๋ฆฝ๋๋ค. ์ ์ฉ ๋ฒ์๋ฅผ ์น์ธํ๋ฉด ๊ทธ ๋ค๋ก๋ ์ธ์
์ด ์์๋ ๋๋ง๋ค ๊ท์น์ด ํจ๊ป ์ฌ๋ผ์ต๋๋ค.
|
|
168
|
-
2. **์์ ํ ์์
์ ํ์ ์์ด์ ํธ๊ฐ ๋งก์ต๋๋ค.** ์ด๋ ฅ์ ์์ ํ๋ค๊ณ ํ์ธ๋ ์์
๊ณผ ๋ง์๋จ์ด์ง๋ฉด, ๋ ์ ๋ ดํ ํฐ์ด๋ก ํ์ ์์ด์ ํธ๋ฅผ ๋์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ์๊ฒ ๋๋ ค ๊ฒ์ํ๊ฒ ํฉ๋๋ค. ํ๋ ค๋ ๊ฒ์ผ๋ก ๋๋ฌ๋์ง ์๋ ์์
์ ๋ฉ์ธ ์์ด์ ํธ๊ฐ ๊ณ์ ๋งก์ต๋๋ค.
|
|
169
|
-
3. **๋น์ฉ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ฆฌ ์๋ ค ์ค๋๋ค.** ์บ์ ์ ์ค๋ฅ ๊ณผ TTL ๋ง๋ฃ, ์ปจํ
์คํธ ์ฆ๊ฐ, ๋ ๊ฐ์ง ์ฌ์ฉ๋ ํ๋๋ฅผ ๋งค ํด ์ฝ์ด statusline์ ๋์๋๋ค. ์์ง ์์ธ ์ ์์ ๋ ๋ณด์
๋๋ค.
|
|
170
|
-
|
|
171
|
-
### ์ค์๊ฐ ๋ชจ๋ธ ๋ผ์ฐํ
์ด ์คํ๋ ค ๋น์ฉ์ ํค์ฐ๋ ์ด์
|
|
172
|
-
|
|
173
|
-
์ธ์
๋์ค์ ๋ชจ๋ธ์ ๋ฐ๊พธ์ง ์๋๋ค๋ ์ ์ด ์ด ๋๊ตฌ์ ํต์ฌ์
๋๋ค.
|
|
174
|
-
|
|
175
|
-
ํ๋กฌํํธ ์บ์๋ **๋ชจ๋ธ๋ณ๋ก ๋ฐ๋ก ์ ์ง๋ฉ๋๋ค.** ๊ทธ๋์ ์ธ์
์ค๊ฐ์ ๋ ์ผ ๋ชจ๋ธ๋ก ์ ํํ๋ฉด ์ ๋ชจ๋ธ์ ๋น ์บ์์์ ์์ํ๊ณ , ๊ทธ๋๊น์ง ์์ธ ๋ํ ์ ์ฒด๋ฅผ ์ ๊ฐ๋ก ๋ค์ ์ฝ์ด์ผ ํฉ๋๋ค. ์บ์ ํํธ๋ ์๋ ์
๋ ฅ๊ฐ์ 10๋ถ์ 1 ์์ค์ด๋ฏ๋ก, ๋ํ๊ฐ 2๋ง ํ ํฐ๋ง ๋์ด๊ฐ๋ **์ ํ ํ ๋ฒ์ ๊ทธ๋ ์๋ ๊ธ์ก์ด ํต์งธ๋ก ์ฌ๋ผ์ง๋๋ค.** ์ผ ๋ชจ๋ธ๋ก ์ฎ๊ฒผ๋๋ฐ ์ฒญ๊ตฌ์๋ ๋ ์ปค์ง๋, ์ค์๊ฐ ๋ผ์ฐํ
์ ๋ํ์ ์ธ ์ญ์ค์
๋๋ค.
|
|
176
|
-
|
|
177
|
-
์ค์ ๋ก ๋ผ์ฐํ
์ ํ์ ๋ง๋ค๋ ํ๋ค์ด ๊ฐ์ ์ด์ ๋ก ๊ธฐ๋ฅ์ ๊ป์ต๋๋ค: [LLM ๋ผ์ฐํฐ๋ฅผ ๋ง๋ ์ฌ๋๋ค์ด ์ง์ ๊ป์ต๋๋ค #Shorts](https://www.youtube.com/shorts/SK-GoAABjbg)
|
|
178
|
-
|
|
179
|
-
์ด ๋๊ตฌ๋ ๊ทธ๋์ ๋ฉ์ธ ์ธ์
์ ๋ชจ๋ธ์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค. **์๋ธ์์ด์ ํธ ์์๋ง ์ฌ์ฉํ๋ฏ๋ก** ๋ฉ์ธ ์ธ์
์ ์บ์๋ ๊ทธ๋๋ก ์ ์ง๋๊ณ , ์์๋ ์์
๋ง ๋ณ๋ ์ปจํ
์คํธ์์ ์ผ ๋ชจ๋ธ์ด ์ฒ๋ฆฌํฉ๋๋ค. ์ ๊ฐ์ก์ด ์บ์ ์์ค๋ก ์์๋์ง ์๋ ์ด์ ๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค.
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
npm i -g sprag-cli@latest
|
|
183
|
-
sprag route-scan # ์ง๋ ์ธ์
์์ ์์ ํ๋ณด ์ถ์ถ (LLM ํธ์ถ ์์)
|
|
184
|
-
sprag route-scan rules # ์น๊ฒฉ๋ ๋ฃฐ ํ์ธ ยท rm <N> ์ผ๋ก ์ญ์
|
|
185
|
-
sprag route-scan savings # ์์์ผ๋ก ์ ๊ฐํ ๊ธ์ก์ ๊ทผ๊ฑฐ๋ฅผ ์ ์ ํ์ธ
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
ํ์ ๊ธฐ์ค์ ์ ๋ค๋ฅธ ์ฌ๋์ ๋ฒค์น๋งํฌ๊ฐ ์๋๋ผ **์ฌ์ฉ์ ๋ณธ์ธ์ ์ต๊ทผ 14์ผ ๋ถํฌ(p25/p75)** ๋ก ์ก์ต๋๋ค.
|
|
189
|
-
์์ํ ๋ค์ ์ค์ ๋ก ์ฑ๊ณตํ๋์ง๊น์ง ์ธก์ ํ๋ rule-health๋ [v3.9.0](#v390-2026-08-01)์ ๋ค์ด๊ฐ์ต๋๋ค.
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## statusline ์ฝ๋ ๋ฒ
|
|
194
|
-
|
|
195
|
-
์ ๊ฐ ์์ฅ์ ๊ธฐ๋ก์ด ์์ด๋ฉด statusline์ด **๋ ์ค๋ก** ์ถ๋ ฅ๋ฉ๋๋ค. ์ฒซ์งธ ์ค์๋ ๋ผ์ฐํ
์ ๊ฐ์ก๋ง ํ์ํ๊ณ , ๋์งธ ์ค์๋ ์ง๋จ ์นฉ์ ํ์ํฉ๋๋ค.
|
|
196
|
-
|
|
197
|
-
```
|
|
198
|
-
๐ Routing saved $2.09 | fableโsonnet 1ร $0.72 ยท opusโhaiku 1ร $0.57
|
|
199
|
-
โ Ctx 500k+ ยท ๐
ท 5/5 ยท ๐ค Opus 5 ยท ๐ง Cache hit 98.8% ยท โณ Cache expires 59:46 ยท โฆ current โโโโโโ 62% ๐ 21:33 ยท ๐
weekly โโโโโโ 38% ๐ Tue 19:33 ยท ๐ฆ Ctx 47% of 1M ยท ๐ฐ Cache saved $1.0K ยท last 1d
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
์์ฅ์ด ๋น์ด ์์ผ๋ฉด, ๋ค์ ๋งํด ์์ง ์ค์ธก๋ ์์์ด ์์ผ๋ฉด ์ฒซ์งธ ์ค์ ๊ทธ๋ฆฌ์ง ์๊ณ ์ข
์ ์ฒ๋ผ ํ ์ค๋ก ์ถ๋ ฅํฉ๋๋ค. ์ผ๋ถ ํ๊ฒฝ(๊ตฌ๋ฒ์ macOS Claude Code)์์ ์ฒซ์งธ ์ค๋ง ํ์๋๋ค๋ฉด `--single-line` ์ต์
์ผ๋ก ํ ์ค ๋ ์ด์์์ ์ ์งํ์ญ์์ค.
|
|
203
|
-
|
|
204
|
-
| ์ธ๊ทธ๋จผํธ | ์๋ฏธ |
|
|
205
|
-
|---|---|
|
|
206
|
-
| `๐` **์ฒซ์งธ ์ค** | ๋ผ์ฐํ
์ผ๋ก ์ ๊ฐํ ๋์ ๊ธ์ก๊ณผ ๋ชจ๋ธ ์ด๋ ๋ด์ญ์
๋๋ค. ๋ด์ญ ํฉ๊ณ๋ ๋์ ๊ธ์ก๊ณผ ์ ํํ ์ผ์นํ๊ณ , ๋ชจ๋ธ๋ช
์ ๊ณ์ด๋ง ๋จ๊น๋๋ค(`opusโhaiku`). ๊ทผ๊ฑฐ๋ `route-scan savings` ๋ก ์ ๋ถ ํ์ธํ ์ ์์ต๋๋ค |
|
|
207
|
-
| `๐` **๋์งธ ์ค** | doc2md ๋ฌธ์ ๋ณํ์ด ์ ๊ฐํ ๋์ ๊ธ์ก๊ณผ ํ์๋ณ ๋ด์ญ์
๋๋ค. ๋ผ์ฐํ
๊ณผ ๋ฌธ์ ๋ณํ ์ค ๊ธ์ก์ด ํฐ ์ชฝ์ด ์ฒซ์งธ ์ค์ ์ฐจ์งํฉ๋๋ค |
|
|
208
|
-
| `๐ค` | ํ์ฌ ๋ชจ๋ธ |
|
|
209
|
-
| `๐
ท 5/5` | harness ์์น ์ ์ ([Harness ๋ชจ๋](#-harness-๋ชจ๋)) |
|
|
210
|
-
| `๐ง ` | ์บ์ ํํธ์จ (85%+ ๋
น์) |
|
|
211
|
-
| `โณ` | ์บ์ TTL ์นด์ดํธ๋ค์ด์
๋๋ค. ๋ง๋ฃ๋๊ธฐ ์ ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ์บ์๊ฐ ์ ์ง๋ฉ๋๋ค. ์
๋ ฅ์ด ์์ ๋๋ ์ด ๋จ์๋ก ์ค์ด๋๋ ํ์๋ Claude Code v2.1.97 ์ด์์์ ๋์ํฉ๋๋ค (์๋ [์นด์ดํธ๋ค์ด์ด ๋ฉ์ถฐ ๋ณด์ผ ๋](#๋์-์๋ฆฌ--ํ๊ฒฝ) ์ฐธ๊ณ ) |
|
|
212
|
-
| `โฆ current` / `๐
weekly` | 5์๊ฐ / 7์ผ rate-limit ์๋ ์ฌ์ฉ๋ฅ + ๋ฆฌ์
์๊ฐ |
|
|
213
|
-
| `๐ฆ` | ์ปจํ
์คํธ ์ฌ์ฉ๋ฅ ์
๋๋ค(์: `Ctx 68% of 1M`). ์ฌ์ฉ๋ฅ ์ ๋ฐ๋ผ ๋
น์ยท๋
ธ๋์ยท๋นจ๊ฐ์์ผ๋ก ํ์ํฉ๋๋ค. ์ต์ ๋ชจ๋ธ์ 1M ์ปจํ
์คํธ๊ฐ ๊ธฐ๋ณธ์ด๊ณ ๋ณ๋ ์๊ธ์ด ๋ถ์ง ์์ง๋ง, ํ ํฐ๋ ์์ฒด๊ฐ ํด๋น ๋น์ฉ๊ณผ 5์๊ฐยท7์ผ ํ๋๋ฅผ ๋น ๋ฅด๊ฒ ์๋ชจ์ํต๋๋ค |
|
|
214
|
-
| `๐ต Sep $42` | **์ด๋ฒ ๋ฌ 1์ผ 00์(๋ก์ปฌ) ์ดํ ์ง์ถ ์ถ์ ์น**์
๋๋ค. ์ธ์
๋ก๊ทธ์ ์ธ์
๋ณ ๋ชจ๋ธ ๋จ๊ฐ๋ฅผ ์ ์ฉํด ํฉ์ฐํ๋ฉฐ, 5h/7d cap ์ด ์๋ ๊ฒ์ดํธ์จ์ด ํ๊ฒฝ์์๋ ํญ์ ํ์๋ฉ๋๋ค (v3.35.0) |
|
|
215
|
-
| `๐ budget` | **LiteLLM ๊ฒ์ดํธ์จ์ด ํค์ ์์ฐ ๊ฒ์ด์ง**์
๋๋ค. stdin ์ rate_limits ๊ฐ ์ค์ง ์๋ ํ๊ฒฝ์์ ํค์ `max_budget` ๋๋น `spend` ๋ฅผ `๐ budget โฐโฑ 34% $34/$100` ํํ๋ก ๋ณด์ฌ ์ค๋๋ค (v3.35.0, [์๋](#-bedrockvertex-๊ฒฝ์ -ํ๊ฒฝ)) |
|
|
216
|
-
| `๐ฐ` | ํ๋กฌํํธ ์บ์๊ฐ ์ ์ฝํด ์ค ๋์ ๊ธ์ก์
๋๋ค. ์ฒซ์งธ ์ค์ `๐`(๋ชจ๋ธ ๋ผ์ฐํ
์ ๊ฐ์ก)์๋ **์๋ก ๋ค๋ฅธ ์์น์
๋๋ค** |
|
|
217
|
-
| `v3.24.0` | ์ง๊ธ ์คํ ์ค์ธ sprag์ ๋ฒ์ ์
๋๋ค. ์ต์ ์ด๋ฉด ํ์์ผ๋ก ์ค ๋์ ์กฐ์ฉํ ๋์
๋๋ค |
|
|
218
|
-
| `โฌ v3.24.0 โ 3.25.0` | ์ ๋ฒ์ ์ด ๋ฐฐํฌ๋์ด ์๋ค๋ ํ์์
๋๋ค. ์กฐ์น๊ฐ ํ์ํ ์นฉ์ด๋ฏ๋ก ์ค ์์ชฝ์ผ๋ก ์ฌ๋ผ์ต๋๋ค ([์
๋ฐ์ดํธ ์๋ด](#-์
๋ฐ์ดํธ-์๋ด)) |
|
|
219
|
-
|
|
220
|
-
๋ฌธ์ ๊ฐ ๊ฐ์ง๋๋ฉด **๊ฒฝ๊ณ ์นฉ์ ์ค ๋งจ ์์** ๋ถ์
๋๋ค.
|
|
221
|
-
|
|
222
|
-
```
|
|
223
|
-
๐จ 5H โโโโโโ 94% ๐ 12:36 ยท ๐
ท 5/5 ยท ๐ค Opus 4.8 ยท ๐ง Cache hit 72.1% ยท โ Cache miss ยท ๐
weekly โโโโโโ 12% ๐ Sun 14:26 ยท ๐ฆ Ctx 200k ยท last 1d
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
์นฉ์ ์ข
๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. `๐จ 5H/7D NN%`(ํ๋ ์๋ฐ) ยท `โ Ctx 500k+`(๋จ์ผ ์์ฒญ์ด ์ค์ ๋ก 500k๋ฅผ ์ด๊ณผ) ยท `โ Cache miss` ยท `โ Input spike` ยท `โ Output heavy` ยท `โ Call surge` ยท `โ Rebuild churn` ยท `โ 5m TTL`. ๋ ์๋๊ฐ ๋์์ 90%๋ฅผ ๋์ผ๋ฉด ๋ฆฌ์
์ด ๋ ์๋ฐํ ์ชฝ์ ๐จ๋ก ์ฌ๋ฆฌ๊ณ , ๋๋จธ์ง ํ๋๋ ๋นจ๊ฐ ์ธ๊ทธ๋จผํธ๋ก ๊ณ์ ํ์ํฉ๋๋ค (v2.16.0 ์ด์).
|
|
227
|
-
|
|
228
|
-
### ๊ฒฝ๊ณ ์นฉ์ด ๋ด์ ๋
|
|
229
|
-
|
|
230
|
-
Claude Code ์์์ `/claude-token-saver` Skill์ ์คํํ๊ฑฐ๋, ์นฉ์ ์ ํ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ๋งํ๊ธฐ๋ง ํด๋("5H cap ๋ด์ด", "cache miss") Skill์ด ์๋์ผ๋ก ํ์ฑํ๋์ด **์์ธ ์ฝ๋์ ๋จ๊ณ๋ณ ํด๊ฒฐ ๋ช
๋ น์** ๋ณด์ฌ ์ค๋๋ค. ํ๋๊ฐ ์๋ฐํ ์ํฉ์์๋ `sprag handoff`๋ก ์งํ ์ค์ธ ์์
์ ๋งํฌ๋ค์ด ํ์ผ์ ๋ฐฑ์
ํ ๋ค ์ ์ธ์
์์ ์ด์ด๊ฐ๋ ๋ฐฉ์์ ๊ถ์ฅํฉ๋๋ค.
|
|
231
|
-
|
|
232
|
-
## ์ฃผ์ ๋ช
๋ น
|
|
233
|
-
|
|
234
|
-
์
ธ์์ ์ง์ ์คํํฉ๋๋ค (Claude Code ์์์๋ `/claude-token-saver` Skill ํ๋๋ง ์ฌ์ฉ):
|
|
235
|
-
|
|
236
|
-
| ๋ช
๋ น | ์ค๋ช
|
|
|
237
|
-
|---|---|
|
|
238
|
-
| `sprag` | ์ต๊ทผ 1์ผ ์ง๋จ ๋ฆฌํฌํธ (`--days N` / `--hours N`) |
|
|
239
|
-
| `sprag last` | ๊ฐ์ฅ ์ต๊ทผ ๊ฒฝ๊ณ 1๊ฑด + ์ฒ๋ฐฉ |
|
|
240
|
-
| `sprag history` | ์ต๊ทผ 7์ผ ๊ฒฝ๊ณ ์ ์ด ๋ก๊ทธ |
|
|
241
|
-
| `sprag handoff` | ์์
์ํ๋ฅผ `HANDOFF-*.md`๋ก ๋ฐฑ์
(์บก ์๋ฐ ์) |
|
|
242
|
-
| `sprag mode [keywords...]` | ์ถ๋ ฅ ์ค์ (`icon`/`text`, `ko`/`en`, `1h`~`30d` ์๋ ๋ฑ) |
|
|
243
|
-
| `sprag harness ...` | ๐
ท Harness ๊ด๋ฆฌ (์๋ ์ฐธ๊ณ ) |
|
|
244
|
-
| `sprag route-scan` | ์์ ๋ชจ๋ธ์ด ๋ฐ๋ณต ์ฒ๋ฆฌํ ์ฌ์ด ์์
์ ๊ฐ์งํด haiku ์์ ๋์นซ ๋ฃฐ์ ์ ์ํฉ๋๋ค (์๋ ์ฐธ๊ณ ) |
|
|
245
|
-
| `sprag route-scan savings` | ๋ผ์ฐํ
์ ๊ฐ ์์ฅ์
๋๋ค. ๋ชจ๋ธ ์ด๋๋ณ ํฉ๊ณ์ ์คํ๋ณ ๋ด์ญ์ ํจ๊ป ๋ณด์ฌ ์ฃผ๋ฉฐ, ํ์๋๋ ๊ธ์ก์ ๊ทผ๊ฑฐ๊ฐ ๋ฉ๋๋ค |
|
|
246
|
-
| `sprag compact-window` | 1M ์ปจํ
์คํธ๋ฅผ ์ฐ๋ฉด์ ์๋ ์์ถ ์ฐฝ์ด ์ค์ ๋์ง ์์์ผ๋ฉด ๊ฒฝ๊ณ ํ๊ณ , `set`์ผ๋ก 40๋ง์ ๊ณ ์ ํฉ๋๋ค (์๋ ์ฐธ๊ณ ) |
|
|
247
|
-
| `sprag korean on\|off\|status` | ํ๊ตญ์ด ๋ฌธ์ฒด ์ง์นจ์ ์ธ์
์์ ์ ์ฃผ์
ํ๊ณ , ์ฐ๊ธฐ ์์ ๊ฒ์ฌ๋ฅผ ํจ๊ป ์ค์นํฉ๋๋ค (์๋ ์ฐธ๊ณ ) |
|
|
248
|
-
| `sprag cohesion on\|off\|status\|show` | ์์ด ๋ฌธ์ฅ ์ฐ๊ฒฐ(์์ง์ฑ) ์ง์นจ์ ์ธ์
์์ ์ ์ฃผ์
ํฉ๋๋ค |
|
|
249
|
-
| `sprag korean lint block\|warn\|off` | ์ฐ๊ธฐ ์์ ๊ฒ์ฌ๊ฐ ์๋ฐ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ํฉ๋๋ค |
|
|
250
|
-
| `sprag korean lint scope all\|prose` | ๊ฒ์ฌ ๋ฒ์๋ฅผ ๋ชจ๋ ํ
์คํธ ํ์ผ๊ณผ ๋ฌธ์ ์ ์ฉ ์ฌ์ด์์ ๊ณ ๋ฆ
๋๋ค |
|
|
251
|
-
| `sprag doc2md on\|off` | ์ฒจ๋ถ ๋ฌธ์๋ฅผ ๋ชจ๋ธ์ด ์ฝ๊ธฐ ์ ์ Markdown ์ผ๋ก ๋ณํํฉ๋๋ค (์๋ ์ฐธ๊ณ ) |
|
|
252
|
-
| `sprag doc2md <ํ์ผ>` | ํ์ผ ํ๋๋ฅผ ์ง์ ๋ณํํฉ๋๋ค. ์ง๋จ ์ฉ๋์ด๋ฉฐ ์คํจ ์ด์ ๋ฅผ ๊ทธ๋๋ก ์ถ๋ ฅํฉ๋๋ค |
|
|
253
|
-
| `sprag mode ttl=5m\|1h\|auto` | ์บ์ TTL ๋ฒํท์ ์ง์ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ `auto`๋ ์ค์ธก๊ฐ์ ๋จผ์ ๋ณด๊ณ , ์ค์ธก๊ฐ์ด ์์ผ๋ฉด ๊ฒ์ดํธ์จ์ด ์ฌ๋ถ๋ก ํ์ ํฉ๋๋ค |
|
|
254
|
-
| `sprag --version` | ์ค์น๋ ๋ฒ์ ์ ์ถ๋ ฅํฉ๋๋ค |
|
|
255
|
-
| `sprag update-check` | ์ ๋ฒ์ ์ด ์๋์ง ํ์ธํฉ๋๋ค (`--refresh`๋ก ์ฆ์ ์กฐํ, `--dismiss`๋ก ๊ทธ ๋ฒ์ ์๋ด ๋๊ธฐ) |
|
|
256
|
-
| `sprag upgrade` | ์ค์น ๊ฒฝ๋ก์ ๋ง๋ ๋ช
๋ น์ผ๋ก ์ต์ ๋ฒ์ ์ ์ค์นํฉ๋๋ค (`--print`๋ก ์คํ ์์ด ๋ช
๋ น๋ง ํ์ธ) |
|
|
257
|
-
| `sprag install` | Skillยทstatusline ์๋ ๋ฑ๋ก |
|
|
258
|
-
| `sprag uninstall [--purge]` | ๋ฑ๋กํ ํ
ยทstatuslineยทSkill ์ ๊ฑฐ. ๊ธฐ๋ก๋ ์ ๊ฐ์ก์ ๋จ๊ธฐ๋ฉฐ, `--purge` ๋ฅผ ๋ถ์ด๋ฉด ์ํ ๋๋ ํฐ๋ฆฌ๊น์ง ์ง์๋๋ค |
|
|
259
|
-
|
|
260
|
-
์ถ๋ ฅ ์ธ์ด๋ ์ค์นํ ๋ ํ ๋ฒ ์ ํฉ๋๋ค. ํฐ๋ฏธ๋์์ ์ค์นํ๋ฉด ์์คํ
๋ก์ผ์ผ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์ํ๊ณ ํ๊ตญ์ด๋ฅผ ์ธ์ง ๋ฌผ์ด๋ณด๋ฉฐ, ๋น๋ํํ ์ค์น์์๋ ๋ก์ผ์ผ ํ์ ์ ๊ทธ๋๋ก ๊ธฐ๋กํฉ๋๋ค. ํ ๋ฒ ๊ธฐ๋ก๋๋ฉด ์
๊ทธ๋ ์ด๋ํด๋ ๋ค์ ๋ฌป์ง ์์ต๋๋ค. ๋์ค์ ๋ฐ๊ฟ ๋๋ `mode ko`๋ `mode en`์ ์ฐ๊ณ , ์คํฌ๋ฆฝํธ์์ ์ค์นํ ๋๋ `CTS_LANG=ko` ๋๋ `CTS_LANG=en`์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. statusline์ ์นฉ์ ์ธ์ ๋ ๊ธฐํธ๋ก ํ์ํฉ๋๋ค. ์ ์ฒด ์ต์
์ [์๋ฌธ README](./README.md#options)๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
|
|
261
|
-
|
|
262
|
-
## โฌ ์
๋ฐ์ดํธ ์๋ด
|
|
263
|
-
|
|
264
|
-
statusline์ ๋ํ ์์๋ฅผ ๋์ธ ์ ์๊ณ , 300๋ฐ๋ฆฌ์ด๋ง๋ค ๋ค์ ๊ทธ๋ ค์ง๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆฌ๋ ์์ ์ ๋คํธ์ํฌ๋ฅผ ์ธ ์๋ ์์ต๋๋ค. ๊ทธ๋์ ์๋ด๋ฅผ ๋ ์ง์ ์ผ๋ก ๋๋์์ต๋๋ค.
|
|
265
|
-
|
|
266
|
-
- **statusline์ ์๋ฆฌ๊ธฐ๋ง ํฉ๋๋ค.** ์ต์ ๋ฒ์ ์ด๋ฉด ์ค ๋์ `v3.24.0`์ ํ์์ผ๋ก ์กฐ์ฉํ ํ์ํ๊ณ , ์ ๋ฒ์ ์ด ์์ผ๋ฉด `โฌ v3.24.0 โ 3.25.0`์ ์ค ์์ชฝ์ ๋
ธ๋์์ผ๋ก ์ฌ๋ฆฝ๋๋ค. ๋นจ๊ฐ์์ ์ฐ์ง ์์ต๋๋ค. ๋ฌด์๋ ๊ณ ์ฅ ๋ ์ํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
267
|
-
- **๋ฌป๋ ์ผ์ ์ธ์
์์์์ ํฉ๋๋ค.** ์ ์ธ์
์ด๋ `/clear` ์์ ์ SessionStart ํ
์ด "์ ๋ฒ์ ์ด ์์ผ๋ ์ฌ์ฉ์์๊ฒ ์
๊ทธ๋ ์ด๋ํ ์ง ๋ฌผ์ด๋ณด๋ผ"๋ ํ ์ค์ ๋ชจ๋ธ์๊ฒ ์ฃผ์
ํฉ๋๋ค. ๋ชจ๋ธ์ ์ฌ์ฉ์์๊ฒ ํ์ธํ ๋ค์๋ง `sprag upgrade`๋ฅผ ์คํํฉ๋๋ค. ๋ฌป์ง ์๊ณ ์ค์นํ์ง ์์ต๋๋ค.
|
|
268
|
-
- **๊ฑฐ์ ์ ๊ธฐ์ตํฉ๋๋ค.** ์ฌ์ฉ์๊ฐ ์์น ์์ผ๋ฉด `sprag update-check --dismiss`๋ก ๊ทธ ๋ฒ์ ์ ๋ฌป์ง ์๋๋ก ์ค์ ํฉ๋๋ค. ๋ ์๋ก์ด ๋ฒ์ ์ด ๋ฐฐํฌ๋๋ฉด ๋ค์ ๋ฌป์ต๋๋ค. statusline ์นฉ์ ๊ทธ๋๋ก ๋จ์ต๋๋ค. ๊ฑฐ์ ํ ๊ฒ์ ์ง๋ฌธ์ด์ง, ์ ๋ฒ์ ์ด ์๋ค๋ ์ฌ์ค์ด ์๋๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
269
|
-
|
|
270
|
-
๋ฒ์ ์กฐํ๋ 24์๊ฐ์ ํ ๋ฒ, ๋ถ๋ฆฌ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ง ํ์ผ์ ๋จ๊น๋๋ค(`update-check.json`). ์ด ๋ฐฉ์์ npm์ `update-notifier`๊ฐ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋คํธ์ํฌ๊ฐ ๋๊ฒจ ์์ด๋ ์คํจ ์๊ฐ์ ๊ธฐ๋กํด ๋๋ฏ๋ก ๋งค ๋ ๋๋ง๋ค ์ฌ์๋ํ์ง ์์ต๋๋ค. ํ์ธ ์์ฒด๋ฅผ ๋๋ ค๋ฉด ํ๊ฒฝ ๋ณ์ `CTS_NO_UPDATE_CHECK=1` ๋๋ `NO_UPDATE_NOTIFIER`๋ฅผ ์ค์ ํ์ญ์์ค.
|
|
271
|
-
|
|
272
|
-
## ๐
ท Harness ๋ชจ๋
|
|
273
|
-
|
|
274
|
-
๋ค์ฏ ์์น(Ratchet ยท Evidence ยท PEV ยท Structured Task ยท Default Safe Path)์ ํ ์ค ๋ช
๋ น์ผ๋ก `CLAUDE.md`์ ์
์
ํ๊ณ statusline์ด `๐
ท 5/5`๋ก ์ ์ํํฉ๋๋ค. ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ๋ณต๋๋ฉด `๐
ทโ ratchet?` ์๋ฆผ์ด ๋ ์ ๋ฃฐ๋ก ์น๊ฒฉํ ์ ์์ต๋๋ค.
|
|
275
|
-
|
|
276
|
-
```bash
|
|
277
|
-
sprag harness init # ์ด ํ๋ก์ ํธ์ ์
์
|
|
278
|
-
sprag harness init --global # ~/.claude/CLAUDE.md, ๋ชจ๋ ํ๋ก์ ํธ์ ์ ์ฉ
|
|
279
|
-
sprag harness check # ํ์ฌ ์ ์ (๊ธ๋ก๋ฒ fallback ์ธ์ )
|
|
280
|
-
sprag harness analyze # ํ
์์ด๋ ์๋์ผ๋ก ์ ์ฌ ๋ถ์์ ์คํํด harness-state.json ๊ฐฑ์
|
|
281
|
-
sprag harness promote <N> --project|--global # ๊ฒฝ๊ณ #N โ ratchet ๋ฃฐ (์ค์ฝํ ํ์)
|
|
282
|
-
sprag harness promote "<๋ฃฐ ํ
์คํธ>" --project|--global # ๋ด๊ฐ ์ง์ ์ ์ํ ๋ฃฐ๋ ๊ฐ์ ๋ช
๋ น์ผ๋ก ๋ฑ๋ก
|
|
283
|
-
sprag harness pull # ํจํค์ง ๋๋ด ํ๋ ์ด์
๋ฃฐ โ ๋ด ๊ธ๋ก๋ฒ ๋์นซ์ ๋ฑ๋ก (opt-in, ์ค๋ณต ์คํต)
|
|
284
|
-
sprag harness list / rm <N> # ๋ฃฐ ์กฐํ / ์ญ์ (์๋ .bak)
|
|
285
|
-
sprag harness off | on # ๐
ท ํ์ ํ ๊ธ
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
- `promote`๋ non-TTY ํ๊ฒฝ(์คํฌ๋ฆฝํธ๋ LLM ํธ์ถ)์์ `--project` ๋๋ `--global` ํ๋๊ทธ๊ฐ **๋ฐ๋์ ํ์ํฉ๋๋ค.** ์ ์ฉ ๋ฒ์๊ฐ ์ฌ์ฉ์์๊ฒ ๋ฌป์ง ์์ ์ฑ ๊ฒฐ์ ๋๋ ์ฌ๊ณ ๋ฅผ ๋ง๊ธฐ ์ํ ์ค๊ณ์
๋๋ค.
|
|
289
|
-
- `pull`์ ํจํค์ง์ ๋๋ด๋ **์ ์์ ํ๋ ์ด์
๋์นซ ๋ฃฐ**(`presets/ratchet-rules.json`, ์ค์ ๋ฐ๋ณต ์ฌ๊ณ ์์ ์น๊ฒฉ๋ ๋ฒ์ฉ ๋ฃฐ๋ง)์ ๋ด ๊ธ๋ก๋ฒ ๋์นซ(`~/.claude/ratchet.md`)์ ๋ฑ๋กํฉ๋๋ค. ์ค์น(`install`)๋ `init`์ ์๋ฌด๊ฒ๋ ์๋ ์ฃผ์
ํ์ง ์์ผ๋ฉฐ, `pull`์ ํญ์ opt-in์ด๊ณ ์ฌ์คํํด๋ ์ค๋ณต์ด ์์ต๋๋ค(๋ฉฑ๋ฑ). ๋ง์์ ์ ๋๋ ๋ฃฐ์ `harness rm`์ผ๋ก ์ ๊ฑฐํ๋ฉด ๋ฉ๋๋ค.
|
|
290
|
-
- `seed`๋ ๊ฐ์ ํ๋ฆฌ์
์ **ํ ๊ฑด์ฉ** ๋ฌผ์ด๋ณด๋ ๊ฒฝ๋ก์
๋๋ค. `pull`์ด ๋์นซ ๋ฃฐ ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๋ฑ๋กํ๋ ๋ช
๋ น์ธ ๋ฐ ๋ฐํด, `seed`๋ ๋ชจ๋ธ ํผํ
ํ๋ฆฌ์
๊น์ง ํฌํจํด ์ค์นยท์
๊ทธ๋ ์ด๋ ํ ์ฒซ ์ธ์
์์ ํ ๊ฑด์ฉ ์ ์ํฉ๋๋ค ([์๋](#-seed-์ค์น-์งํ๋ถํฐ-์์์ด-๊ฑธ๋ฆฌ๊ฒ-ํ๋-์์-๋ฃฐ)).
|
|
291
|
-
- ๐
ทโ ๋ฐํ์ ๊ฒฝ๊ณ (`ratchet?` `no-evidence` `PEV-skip`)๋ 30๋ถ ํ ์๋ ๋ง๋ฃ๋๊ณ , ํ์ ๋๋ ํฐ๋ฆฌ ์ธ์
๋ ํ๋ก์ ํธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋งค์นญ๋ฉ๋๋ค. PEV-skip์ ๋ณ๊ฒฝ์ฑ ๋๊ตฌ(Edit/Write/Bash)๋ง ์นด์ดํธํด ์ฝ๊ธฐ ์์ฃผ ์ธ์
์์๋ ๋ฐ๋ํ์ง ์์ต๋๋ค (v2.16.0+).
|
|
292
|
-
|
|
293
|
-
<details>
|
|
294
|
-
<summary>โ ๏ธ <code>harness rm</code>์ ์ ์คํ๊ฒ ์ฌ์ฉํ์ญ์์ค: ์ญ์ ์ ํ์ธ ์ฌํญ</summary>
|
|
295
|
-
|
|
296
|
-
ratchet์ ๊ฐ์น๋ **ํ ๋ฐฉํฅ ๋์ **์ ์์ต๋๋ค. ๋ฃฐ์ ๊ฐ๋ณ๊ฒ ์ง์ฐ๋ฉด ๊ฐ์ ์ค์๊ฐ ๋ค์ ์๊ธฐ ์์ํฉ๋๋ค.
|
|
297
|
-
|
|
298
|
-
- **๋ฃฐ์ด ๋๋ฌด ๊ด๋ฒ์ํด์ ์ ์ ์ผ์ด์ค๋ ๋ง๋?** โ โ ์ญ์ โ
์กฐ๊ฑด์ ์ขํ ๋ค๋ฌ๊ธฐ (์: `"ํ๋์ฝ๋ฉ ๊ธ์ง"` โ `"ํ
์คํธ ์ธ ์ฝ๋์์ ํ๋์ฝ๋ฉ ๊ธ์ง"`)
|
|
299
|
-
- **๋ฃฐ์ด ๋๋ฌด ์ข์ ๊ฑฐ์ ๋ฐ๋ ์ ๋๋?** โ โ ์ญ์ โ
๊ทธ๋ฅ ๋๊ธฐ (๋น์ฉ 0)
|
|
300
|
-
- **์ ๋ง ์๋ชป๋ ๋ฃฐ์ด๋ผ ํ์ ?** โ โ
๊ทธ๋๋ง ์ญ์
|
|
301
|
-
|
|
302
|
-
์ญ์ ์ `.bak`์ด ๋จ์ง๋ง **๊ทธ ๋ฃฐ์ด ๋ฐํ ์ธ์
์ปจํ
์คํธ(์)๋ ๋ณต์๋์ง ์์ต๋๋ค.**
|
|
303
|
-
</details>
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
## ๐ฆ compact-window: 1M ์ปจํ
์คํธ์ ์๋ ์์ถ ์ง์ ๊ณ ์
|
|
307
|
-
|
|
308
|
-
Claude Code๋ `min(autoCompactWindow, ๋ชจ๋ธ ์ต๋ ์ฐฝ)`์ ๊ฐ๊น์์ง๋ฉด ๋ํ๋ฅผ ์๋ ์์ถํฉ๋๋ค. 1M ์ฐฝ์ ์ฐ๋ฉด ์ด ๊ฐ์ด ์กํ ์์ง ์์ ํ 80๋ง ํ ํฐ ๊ทผ์ฒ๊น์ง ๊ฐ์์ผ ์์ถ์ด ๊ฑธ๋ฆฌ๊ณ , ๊ทธ์ ๊น์ง ๋ชจ๋ ์์ฒญ์ด ์ ์ฒด ์ปจํ
์คํธ๋ฅผ ํต์งธ๋ก ์ฌ๊ณผ๊ธํฉ๋๋ค. **1M์ ๋๋ฌด ํฌ๋ 40๋ง~70๋ง ๋ฒ์๋ฅผ ๊ถ์ฅํฉ๋๋ค.** ํฐ ๋ถ์ฌ๋ฃ๊ธฐ์ฉ ์ฌ์ ๋ 200k ์ธ์
์ 2~3.5๋ฐฐ๋ก ๋จ๊ธฐ๋ฉด์ ๊ผฌ๋ฆฌ๋ง ์๋ผ๋
๋๋ค.
|
|
309
|
-
|
|
310
|
-
**๊ถ์ฅ ๋ฒ์ ์์ด๋ฉด ๊ฒฝ๊ณ ํ์ง ์์ต๋๋ค.** 40๋ง์ ์ ๊ฐ์ด ์์ถ ํ์๋ฅผ ์ด๊ธฐ๋ ํํ์ด๊ณ , ๊ธด ์ธ์
์ ๊ทธ๋ณด๋ค ์ฌ์ ๊ฐ ๋ ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ฏธ์ค์ ์ด๊ฑฐ๋ 70๋ง์ ๋์ ๋๋ง ์๋ฆฝ๋๋ค(๊ทธ๋ณด๋ค ๋ฎ๊ฒ ์ก์ ๊ฑด ๋ ๊ณต๊ฒฉ์ ์ผ๋ก ์๋ผ๊ฒ ๋ค๋ ์ ํ์ด๋ผ ๊ทธ๋ฅ ๋ก๋๋ค).
|
|
311
|
-
|
|
312
|
-
**200k ์ปจํ
์คํธ๋ ๊ฒฝ๊ณ ๋์์ด ์๋๋๋ค.** ์ฐฝ์ด ์ด๋ฏธ 200k ์ดํ์ด๋ฏ๋ก ์ด ์ค์ ์ผ๋ก ๋ฌ๋ผ์ง๋ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
313
|
-
|
|
314
|
-
```bash
|
|
315
|
-
sprag compact-window # ํ์ฌ ์ํ (๋ชจ๋ธยท์ฐฝยท์ค์ ๊ฐยท์ถ์ฒ)
|
|
316
|
-
sprag compact-window set --global # ~/.claude/settings.json ์ 50๋ง ๊ณ ์ (๋ฒ์ ์ค๊ฐ)
|
|
317
|
-
sprag compact-window set --project # <root>/.claude/settings.json ์ ๊ณ ์
|
|
318
|
-
sprag compact-window set --global --value 600k # ๊ฐ ์ง์ ์ง์ (10๋ง~1M)
|
|
319
|
-
sprag compact-window off | on # ๊ฒฝ๊ณ ํ์ ํ ๊ธ
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
- 1M ๋ชจ๋ธ์ธ๋ฐ ๋ฏธ์ค์ ์ด๊ฑฐ๋ 40๋ง์ ๋์ผ๋ฉด statusline์ `๐
ทโ compact-window?`๊ฐ ๋จ๊ณ , ์ธ์
๋ธ๋ฆฌํ์ด ๋ฑ๋ก ๋ช
๋ น๊น์ง ์๋ ค์ค๋๋ค.
|
|
323
|
-
- ์ ์ฉ ๋ฒ์(`--global` ๋๋ `--project`)๋ `set`์์ **๋ฐ๋์ ์ง์ ํด์ผ ํฉ๋๋ค.** ๊ธ๋ก๋ฒ ์ค์ ํ์ผ์ ์ฌ์ฉ์์๊ฒ ๋ฌป์ง ์๊ณ ์์ ํ๋ ์ผ์ ๋ง๊ธฐ ์ํ ์ค๊ณ์
๋๋ค.
|
|
324
|
-
- ๊ธฐ์กด `settings.json`์ ๋ค๋ฅธ ํค๋ ๊ทธ๋๋ก ๋ณด์กดํ๊ณ `.bak`์ ๋จ๊น๋๋ค. JSON์ด ๊นจ์ ธ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ์ฐ์ง ์๊ณ ์ค๋จํฉ๋๋ค.
|
|
325
|
-
- ์
ธ์ `CLAUDE_CODE_AUTO_COMPACT_WINDOW`๊ฐ export๋ผ ์์ผ๋ฉด ๊ทธ์ชฝ์ด settings.json๋ณด๋ค ์ฐ์ ํฉ๋๋ค (`set`์ด ์ด ๊ฒฝ์ฐ๋ฅผ ๊ฐ์งํด ์๋ ค์ค๋๋ค).
|
|
326
|
-
|
|
327
|
-
## ๐ route-scan: "์ด ๋ฐ๋ณต ์์
์ ๋ ์ผ ํฐ์ด๋ก ๋ด๋ ค๋ ๋ฉ๋๋ค"
|
|
328
|
-
|
|
329
|
-
์ธ์
๋ก๊ทธ์์ ์์ ๋ชจ๋ธ(opus/fable)์ด ๋ฐ๋ณต ์ฒ๋ฆฌํด ์จ ์ฌ์ด ์์
์ ์ฐพ์ **haiku/sonnet ์์ ๋ฃฐ๋ก ์น๊ฒฉ**์ ์ ์ํฉ๋๋ค. ์ ๊ณผ์ ๋ก์ปฌ, ํ ํฐ ๋น์ฉ 0.
|
|
330
|
-
|
|
331
|
-
- **T2 โ haiku:** ํ์๊ณผ ์กฐํ, ๋จ์ ์คํ์ ํด๋นํฉ๋๋ค. ์๋ฌ๊ฐ ์๊ณ ๋ณ๊ฒฝ๋ ๊ฑฐ์ ์๋ ์์
์
๋๋ค.
|
|
332
|
-
- **T1 โ sonnet:** ๋น๋์ ์ํ ์ ๊ฒ์ ํด๋นํฉ๋๋ค. ๋ณ๊ฒฝ์ด ์ ๊ณ ์๋ฌ๊ฐ 1๊ฑด ์ดํ์ธ ์์
์
๋๋ค.
|
|
333
|
-
- **T0 ์ ์ง:** ์๋ฌ๊ฐ ๋ฐ๋ณต๋๊ฑฐ๋ ๋ณ๊ฒฝ์ด ๋ง๊ฑฐ๋ ์ค๊ณ์ ๋ถ์์ด ํ์ํ ์์
์
๋๋ค. ์ธ์
๋ชจ๋ธ์ด ๊ณ์ ๋ด๋นํฉ๋๋ค.
|
|
334
|
-
|
|
335
|
-
ํต์ฌ ์ค๊ณ๋ ์ธ ๊ฐ์ง์
๋๋ค:
|
|
336
|
-
1. ๋์ด๋๋ฅผ ํ
์คํธ๋ก ์ถ์ธกํ์ง ์๊ณ **์ค์ ๊ฒฐ๊ณผ๋ก ํ์ ํฉ๋๋ค.** ๋๊ตฌ ์๋ฌ์ ๋ณ๊ฒฝ์ ์ผ์ผํจ ๋๊ตฌ์ ์, ์ถ๋ ฅ ํ ํฐ์ ๊ทผ๊ฑฐ๋ก ์ผ์ต๋๋ค.
|
|
337
|
-
2. ์๊ณ๊ฐ์ **์ฌ์ฉ์์ ์ต๊ทผ 14์ผ ๋ก๊ทธ ๋ถํฌ์์ ์๋์ผ๋ก ๋ณด์ ํฉ๋๋ค.** ๊ณ ์ ๋ ์์๋ ์ํฌ๋ก๋๊ฐ ๋ฐ๋๋ฉด ๊ณง ์ด๊ธ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
338
|
-
3. ์น๊ฒฉ๋ ๋ฃฐ์ ๋๊ตฌ๊ฐ ๊ด๋ฆฌํ๋ ๋ณ๋ ํ์ผ(`.claude/ratchet-model.md`)์์ **์๋์ผ๋ก ๊ฐฑ์ ๋๋ฉฐ,** ์์ํ ๋ค ์๋ฌ์จ์ด ๋์์ง๋ฉด `โ rule-health`๋ก ๊ฒฝ๊ณ ํฉ๋๋ค. ๋ฃฐ์ด ๋ก์๋ค๋ ์ฌ์ค์ ์ค์ค๋ก ์๋ฆฌ๋ ์
์
๋๋ค.
|
|
339
|
-
|
|
340
|
-
```bash
|
|
341
|
-
sprag route-scan # ์ค์บ (24h ์บ์) + ํฐ์ด๋ณ ํ๋ณด ์ถ๋ ฅ
|
|
342
|
-
sprag harness promote R1 --project # ํ๋ณด R1์ ๋ชจ๋ธ ํผํ
๋ฃฐ๋ก ๋ฑ๋ก
|
|
343
|
-
sprag route-scan dismiss 1 # ๊ด์ฌ ์์ผ๋ฉด ๋ฌด์ (์ฌ์ค์บ์๋ ์ ๋ธ)
|
|
344
|
-
sprag route-scan rules # ๋ฑ๋ก๋ ๋ชจ๋ธ ํผํ
๋ฃฐ ๋ชฉ๋ก (rm <N>์ผ๋ก ์ ๊ฑฐ)
|
|
345
|
-
sprag route-scan savings # ์ ๊ฐ ์์ฅ: ์ด๋ ๋ฃฐ์ด ์ด๋ค ๋ชจ๋ธ์์ ์ด๋ค ๋ชจ๋ธ๋ก ์ฎ๊ฒผ๋์ง
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
`route-scan savings`๋ statusline์ `๐ Routing saved` ํ ์ค ๋ค์ ์๋ ๊ทผ๊ฑฐ๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ค๋๋ค. ๋ชจ๋ธ ์ด๋๋ณ ํฉ๊ณ์ ์คํ๋ณ ๋ด์ญ์ด ํจ๊ป ๋์ค๋ฏ๋ก, ๊ธ์ก์ด ์ด๋์ ๋์๋์ง ์ถ์ ํ ์ ์์ต๋๋ค.
|
|
349
|
-
|
|
350
|
-
```
|
|
351
|
-
๐ ๋ผ์ฐํ
์ ๊ฐ ๋์ $2.09 (์ต๊ทผ 7์ผ $1.40 ยท 30์ผ $2.09)
|
|
352
|
-
|
|
353
|
-
๋ชจ๋ธ ์ด๋๋ณ:
|
|
354
|
-
claude-fable-5 โ claude-sonnet-5 โ 1ํ, $0.72
|
|
355
|
-
claude-opus-5 โ claude-haiku-4-5 โ 1ํ, $0.57
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
๋ ์์๋ณด๊ธฐ: **ํฐ์ด ๊ธฐ์คยท๋ฆฌ์์น ๊ทผ๊ฑฐ** โ [docs/TIER_CRITERIA.md](./docs/TIER_CRITERIA.md) ยท **๋ฃฐ ํ์ผ ๊ตฌ์กฐยท์ค์บ ํธ๋ฆฌ๊ฑฐยท์๋ธ์์ด์ ํธ ์ค๋น** โ [docs/ROUTE_SCAN.md](./docs/ROUTE_SCAN.md)
|
|
359
|
-
|
|
360
|
-
### ๊ฒ์ดํธ์จ์ด(BedrockยทLiteLLM) ๊ฒฝ์ ํ๊ฒฝ
|
|
361
|
-
|
|
362
|
-
์ฌ๋ด ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ฑฐ์น๋ฉด ๋ก๊ทธ์ ๋ชจ๋ธ๋ช
ํ๋์ ์ถ๋ก ํ๋กํ์ผ ARN์ด ๊ธฐ๋ก๋ฉ๋๋ค. ๊ทธ ๋ฌธ์์ด์๋ `opus`ยท`haiku` ๊ฐ์ ๋จ์๊ฐ ์์ด์ ์์ ๋ฒ์ ์ ์ด๊ฒ์ ์ ๋ถ Sonnet์ผ๋ก ์ฝ์๊ณ , ๊ทธ ๊ฒฐ๊ณผ **T1(โsonnet) ์์ ๋ฃฐ์ด ํ๋๋ ์ ์๋์ง ์์์ผ๋ฉฐ ์ ๊ฐ ์ง๊ณ๊ฐ 0**์ด์์ต๋๋ค.
|
|
363
|
-
|
|
364
|
-
v3.10.0๋ถํฐ๋ ํ๋กํ์ผ ID๋ฅผ ์ญํ (mainยทopusยทsonnetยทhaiku)๋ก ๋๋๋ฆฐ ๋ค `ANTHROPIC_DEFAULT_*_MODEL` ํ๊ฒฝ๋ณ์๊ฐ ์ ์ธํ ๋ณ์นญ์ผ๋ก ์นํํฉ๋๋ค. ๋งคํ์ ๋ถ๋ชจ ์ธ์
์ `Task` ํธ์ถ๊ณผ ์๋ธ์์ด์ ํธ ๊ธฐ๋ก์ `toolUseId`๋ก ์กฐ์ธํด ์ค์ค๋ก ํ์ตํ๋ฉฐ, ๊ด์ธก์ด 3๊ฑด ๋ฏธ๋ง์ด๊ฑฐ๋ ์ญํ ํ์ ์ด 80% ๋ฏธ๋ง์ผ๋ก ๊ฐ๋ฆฌ๋ฉด **์ถ์ธกํ์ง ์๊ณ `unknown`์ผ๋ก ๋๊ณ ์์ ์ง๊ณ์์ ์ ์ธ**ํฉ๋๋ค.
|
|
365
|
-
|
|
366
|
-
์๋ ํ์ต์ด ๋ฟ์ง ์๋ ํ๊ฒฝ์์ ์ธ ์ ์๋ ์๋ ๊ฒฝ๋ก๋ ์์ต๋๋ค. `<userDataDir>/profile-map.json`์ ์๋์ฒ๋ผ ์ ์ผ๋ฉด ๋๊ณ , ๊ณ์ ID์ ๋ฆฌ์ ์ `*`๋ก ๊ฐ๋ ค๋ ๋งค์นญ๋ฉ๋๋ค.
|
|
367
|
-
|
|
368
|
-
```jsonc
|
|
369
|
-
{
|
|
370
|
-
"modelAliases": {
|
|
371
|
-
"arn:aws:bedrock:*:*:application-inference-profile/<PROFILE_ID>": "claude-opus-5",
|
|
372
|
-
"prod-large": "claude-opus-5", // ์ฌ๋ด ๋ณ์นญ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋งคํ๋ฉ๋๋ค
|
|
373
|
-
"team-*": "claude-haiku-4-5"
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
**๋ชจ๋ธ๋ช
์ `opus`ยท`sonnet`ยท`haiku`ยท`fable` ์ด ๋ค์ด ์์ง ์์ ์ฌ๋ด ๋ณ์นญ**(`prod-large`, `team-fast` ๋ฑ)๋ ์ด ํ๋ก ๋งคํํ์ญ์์ค. Bedrock(`anthropic.claude-opus-4-5-v1:0`)ยทVertex(`claude-opus-4-5@20251101`)ยท1M ์ ๋ฏธ์ฌ(`claude-sonnet-4-5[1m]`) ๊ฐ์ด ๊ณ์ด๋ช
์ด ๋จ์ ์๋ ํํ๋ ๊ทธ๋๋ก ์ธ์๋์ง๋ง, ๊ณ์ด๋ช
์ด ์ฌ๋ผ์ง ๋ณ์นญ์ ๊ฐ๊ฒฉํ๊ฐ ์์๋ณผ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ผ์ฐํ
์ ๊ฐ ๊ณ์ฐ์ **ํ๋ฆฐ ๊ธ์ก์ ๋ด๋๋ ๋์ ๊ทธ ์คํ์ ์ง๊ณ์์ ์ ์ธ**ํ๋ฉฐ(๋น๊ต ์์ชฝ ๋ชจ๋ ์ธ์ ๊ฐ๋ฅํ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค), ์ ํ์ ํ ์ค ์ถ๊ฐํ๋ฉด ๋ค์ ์ง๊ณ์ ๋ค์ด์ต๋๋ค.
|
|
379
|
-
|
|
380
|
-
์ด ํ์ผ์๋ ์ฌ๋ด ์๋ณ์๊ฐ ํ๋ฌธ์ผ๋ก ๋จ์ผ๋ฏ๋ก ์ ์ฅ์์ ์ปค๋ฐํ์ง ๋ง์ญ์์ค. ๊ฒ์ดํธ์จ์ด๋ฅผ ์ฐ์ง ์๋ ํ๊ฒฝ์์๋ ํ์ผ์ด ์์ ๋ง๋ค์ด์ง์ง ์๊ณ ๊ธฐ์กด ๋์์ด ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
|
|
381
|
-
|
|
382
|
-
## ๐ฑ seed: ์ค์น ์งํ๋ถํฐ ์์์ด ๊ฑธ๋ฆฌ๊ฒ ํ๋ ์์ ๋ฃฐ
|
|
383
|
-
|
|
384
|
-
๋ชจ๋ธ ํผํ
๋์นซ(`ratchet-model.md`)์ **๋น ํ์ผ๋ก ์์ํฉ๋๋ค.** route-scan์ด ์ฌ์ฉ์์ ๋ก๊ทธ์์ ๊ฐ์ ์ ํ์ ์์
์ ์ฌ๋ฌ ๋ฒ ๊ด์ธกํ๊ณ , ์ฌ์ฉ์๊ฐ ๊ทธ ํ๋ณด๋ฅผ ์น์ธํด์ผ ๋ฃฐ์ด ์๊น๋๋ค. ์ฆ ๊ฐ ์ค์นํ ์ํ์์๋ ์์์ด ํ ๊ฑด๋ ๊ฑธ๋ฆฌ์ง ์๊ณ , ๊ทธ ์ํ๊ฐ ๋ฉฐ์น ์ด์ด์ง๋๋ค. ์ ์ ์ ๊ฐ ํจ๊ณผ๊ฐ ๊ฐ์ฅ ํด ์๊ธฐ์
๋๋ค.
|
|
385
|
-
|
|
386
|
-
`seed`๋ ํจํค์ง์ ๋๋ด๋ ํ๋ฆฌ์
์ผ๋ก ๊ทธ ๊ณต๋ฐฑ์ ๋ฉ์๋๋ค.
|
|
387
|
-
|
|
388
|
-
| ํ๋ฆฌ์
| ๋ด์ฉ | ํ์ผ |
|
|
65
|
+
| | ํ๋ ์ผ | ๋ ๋ณด๊ธฐ |
|
|
389
66
|
|---|---|---|
|
|
390
|
-
|
|
|
391
|
-
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
sprag seed # ๋๊ธฐ ์ค์ธ ํ๋ฆฌ์
๊ณผ ์๋ต ๊ธฐ๋ก
|
|
397
|
-
sprag seed accept <id> --global|--project # ํ ๊ฑด ๋ฑ๋ก (์ ์ฉ ๋ฒ์ ํ์)
|
|
398
|
-
sprag seed accept all --global # ์ฌ์ฉ์๊ฐ "์ ๋ถ ๋ฑ๋ก"์ด๋ผ๊ณ ๋ตํ ๊ฒฝ์ฐ
|
|
399
|
-
sprag seed skip <id> # ๊ฑฐ์ โ ๋ค์ ๋ฌป์ง ์์ต๋๋ค
|
|
400
|
-
sprag seed reset # ์๋ต ๊ธฐ๋ก์ ์ง์ ์ ์ฒด๋ฅผ ๋ค์ ์ ์ ๋์์ผ๋ก
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
- **์น์ธ ์์ด๋ ์๋ฌด๊ฒ๋ ๊ธฐ๋ก๋์ง ์์ต๋๋ค.** ๊ฑฐ์ ํ ๋ฃฐ์ ์
๊ทธ๋ ์ด๋ ํ์๋ ๋ค์ ๋ฌป์ง ์๊ณ , ์ ๋ฆด๋ฆฌ์ค์์ ์ถ๊ฐ๋ ํ๋ฆฌ์
๋ง ๋ค์ ์ธ์
์ ์ ์๋ฉ๋๋ค.
|
|
404
|
-
- ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ๊ฐ์ ์ ํ(๊ฐ์ ํฐ์ดยท์นดํ
๊ณ ๋ฆฌ)์ ๋ฃฐ์ ์ง์ ์น์ธํด ๋์๋ค๋ฉด ๊ทธ ํ๋ฆฌ์
์ ์ ์ํ์ง ์์ต๋๋ค.
|
|
405
|
-
- ํ๋ฆฌ์
์ผ๋ก ๋ฑ๋กํ ๋ฃฐ์ **๋จ์ ํต๊ณ๋ฅผ ๋ด ๊ฒ์ฒ๋ผ ํ์ํ์ง ์์ต๋๋ค.** ๋ฑ๋ก ์งํ์๋ `preset (curated)`๋ก ์ ํ๊ณ , ์ดํ ์ค์บ์์ ์ค์ ๋ฐํ์ ์์ ๊ฒฐ๊ณผ๊ฐ ์ธก์ ๋๋ฉด ๊ทธ ์์น๋ก ๋์ฒด๋ฉ๋๋ค. ์์ ์๋ฌ์จ์ด ๊ธฐ์ค์ ๋์ผ๋ฉด ๋ค๋ฅธ ๋ฃฐ๊ณผ ๋๊ฐ์ด ์ฌ๊ฒํ ํ๋๊ทธ๊ฐ ๋ถ์ต๋๋ค.
|
|
406
|
-
- ์ ์ฉ ๋ฒ์๋ `--global`๊ณผ `--project` ์ค ๋ฐ๋์ ๋ช
์ํด์ผ ํฉ๋๋ค. ํ
ํ๊ฒฝ์ non-TTY๋ผ CLI๊ฐ ์ง์ ๋ฌผ์ ์ ์์ผ๋ฏ๋ก, ๋ชจ๋ธ์ด ์ฌ์ฉ์์๊ฒ ํ์ธํ ๋ค ํ๋๊ทธ๋ฅผ ๋ถ์ฌ ์คํํฉ๋๋ค.
|
|
407
|
-
|
|
408
|
-
## ๐ฐ๐ท ํ๊ตญ์ด ๋ฌธ์ฒด ์ง์นจ
|
|
409
|
-
|
|
410
|
-
Claude๊ฐ ํ๊ตญ์ด๋ก ์ธ ๋ ๋ํ๋๋ ๋ฌธ์ฒด ๊ฒฐํจ(๋ฌธ์ฅ ์ฑ๋ถ ์๋ต, ๋ช
์ฌํ ์ข
๊ฒฐ, ๋ฒ์ญ์ฒด, ์ ๋์ ๋จ์ฉ)์ ๊ต์ ํ๋ ์ง์นจ์ **์ธ์
์์ ์ ํ ๋ฒ ์ฃผ์
ํฉ๋๋ค.**
|
|
411
|
-
|
|
412
|
-
```bash
|
|
413
|
-
sprag korean on # ์ผ๊ธฐ (๋ชจ๋ ํ๋ก์ ํธ์ ์ ์ฉ)
|
|
414
|
-
sprag korean status # ์ํยท๋น์ฉยท์ถ์ฒ ํ์ธ
|
|
415
|
-
sprag korean show # ์ง์นจ ์๋ฌธ ์ถ๋ ฅ
|
|
416
|
-
sprag korean off # ๋๊ธฐ
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
Claude Code์ output style๋ก๋ ๊ฐ์ ์ผ์ ํ ์ ์์ง๋ง, output style์ **์ ์ญ ์ฌ๋กฏ ํ๋**๋ผ์ ์ผ๋ ์๊ฐ ๋ค๋ฅธ ์คํ์ผ์ ๋ชป ์ฐ๊ฒ ๋๊ณ ๋จธ์ ๋ง๋ค ๋ฐ๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ง์นจ์ ํจํค์ง์ ๋ด๊ณ ์ด๋ฏธ ์ค์น๋ SessionStart ํ
์ผ๋ก ์ ๋ฌํ๋ฏ๋ก, **CLI๊ฐ ์ค์น๋ ๋ชจ๋ ํ๋ก์ ํธ์ ์ ์ฉ๋๋ฉฐ output style ์ฌ๋กฏ์ ๋น์ ๋ก๋๋ค.** `/clear` ์ดํ์๋ ํ
์ด ๋ค์ ์คํ๋์ด ์ ์ง๋ฉ๋๋ค.
|
|
420
|
-
|
|
421
|
-
๋น์ฉ์ **์ธ์
๋น ์ฝ 1,500 ํ ํฐ์ด๋ฉฐ ๋งค ํด์ด ์๋๋ผ ์ธ์
์์์ ํ ๋ฒ๋ง** ์ฃผ์
๋ฉ๋๋ค. ๋ ๋ฒ์งธ ์์ฒญ๋ถํฐ๋ ํ๋กฌํํธ ์บ์์ ์ฌ๋ผ๊ฐ๋ฏ๋ก ์ถ๊ฐ ๋ถ๋ด์ด ๊ฑฐ์ ์์ต๋๋ค. ์ผ์ ธ ์์ผ๋ฉด statusline์ `โ๏ธ` ์นฉ์ด ํ์๋ฉ๋๋ค.
|
|
422
|
-
|
|
423
|
-
### ์ ์ฉ ์ ํ ๋น๊ต
|
|
424
|
-
|
|
425
|
-
์ฌ๋ ๋ด์ด `claude -p`๋ก ์ ์ฅ์๋ฅผ ์กฐ์ฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ ๋์ ๋ตํ๋ ์ค์ ํ์ดํ๋ผ์ธ(yaml-sns-agent)์์, ์ง์นจ๋ง ๊ป๋ค ์ผ๊ณ ๊ฐ์ ์ง๋ฌธ์ ๋์ง ๊ฒฐ๊ณผ์
๋๋ค. ์ง๋ฌธ์ "๋ ๋๊ฐ ์คํจํ์ ๋ ์์ธ์ ์ด๋ป๊ฒ ์ขํ๋์ง ํ๊ตญ์ด 3๋ฌธ์ฅ์ผ๋ก ์ค๋ช
ํด๋ผ"์์ต๋๋ค.
|
|
426
|
-
|
|
427
|
-
**์ด์ ** (์ง์นจ ๊บผ์ง)
|
|
428
|
-
|
|
429
|
-
> ๋ ๋ ์คํจ ์์ธ ์ขํ๊ธฐ 3๋จ๊ณ: ๋จผ์ `hn:still --check`๋ก ์คํธ์ด ๋ช
์ธ๋ณด๋ค ์ต์ ์ธ์ง(FRESH/STALE) ํ์ธํฉ๋๋ค. STALE์ด๋ฉด ์ฌ์์ฑ ์ ํด์ ์ ์์ฐ์ผ๋ก ๋ ๋ ์๋ํ ๊ฒ ์์ธ. ๋ค์ caption-blocks๊ฐ ์ต์ ๋๋ ์ด์
๊ณผ ๋จ์ด์ด ์ผ์นํ๋์ง ์ง์ ๋์กฐํฉ๋๋ค. TTS ์ฌ์์ฑ ํ blocks ์ฌ์์ฑ ๋น ์ง๋ฉด ์๋งยท์์ฑ ์ด๊ธ๋ ๋ ๋ ๊นจ์ง.
|
|
430
|
-
|
|
431
|
-
**์ดํ** (์ง์นจ ์ผ์ง)
|
|
432
|
-
|
|
433
|
-
> ๋จผ์ `hn:still --check` ๋๋ ค ์คํธ์ด ๋ช
์ธ๋ณด๋ค ์ต์ ์ธ์ง ํ์ธํ๋ค. STALE์ด๋ฉด ์ฌ์์ฑ ์ ํด์ ์๊ธด ๋ฌธ์ .
|
|
434
|
-
>
|
|
435
|
-
> ๋ค์ caption-blocks๊ฐ captions.json ๋จ์ด์ด๊ณผ ์ผ์นํ๋์ง ๋ณธ๋ค. ๋ด๋ ์ด์
์ฌTTS ํ blocks ์ฌ์์ฑ ๋น ์ง๋ฉด ์ ์๋ง์ด ์ ์์ฑ ์์ ๋ฌ๋ค.
|
|
436
|
-
|
|
437
|
-
๋ฐ๋ ์ง์ ์ ์ธ ๊ฐ์ง์
๋๋ค. ์ฒซ์งธ, ์ ๋์๋ก ์ด์ด ๋ถ์ด๋ ์ ์ด ๋ง์นจํ๋ก ๋์ด์ ธ ํ ๋ฌธ์ฅ์ด ํ ๊ฐ์ง ์ฌ์ค๋ง ์ ๋ฌํฉ๋๋ค. ๋์งธ, "ํ์ธ", "๋์กฐ", "๋ ๋ ๊นจ์ง" ๊ฐ์ ๋ช
์ฌํ ์ข
๊ฒฐ์ด "ํ์ธํ๋ค", "๋ณธ๋ค", "๋ฌ๋ค"์ฒ๋ผ ์์ ์ด๋ก ๋ฐ๋์ด ๋ฌด์์ ํ๋ผ๋ ๊ฒ์ธ์ง๊ฐ ๋ถ๋ช
ํด์ง๋๋ค. ์
์งธ, "์๋งยท์์ฑ ์ด๊ธ๋"์ฒ๋ผ ์กฐ์ฌ๊ฐ ๋น ์ก๋ ์ง์ ์ ์กฐ์ฌ๊ฐ ๋์์ ์ด๋ค ์ฑ๋ถ์ด ์ฃผ์ด์ด๊ณ ๋ชฉ์ ์ด์ธ์ง ์ฝ๋ ์ฆ์ ์กํ๋๋ค.
|
|
438
|
-
|
|
439
|
-
๊ธฐ์ ์ ๋ด์ฉ์ ์์ชฝ์ด ๋์ผํฉ๋๋ค. ์ง์นจ์ ํ๋จ์ด๋ ์ ํ๋๊ฐ ์๋๋ผ ๋ฌธ์ฅ์ ์์ฑ๋์๋ง ๊ด์ฌํ๋ฏ๋ก, ๋ต์ด ๋ฌ๋ผ์ง๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ๋ต์ ๋ค์ ์ฝ์ง ์์๋ ๋๋ ํํ๋ก ๋ง๋ค์ด ์ค๋๋ค. ์ฌ๋์ฒ๋ผ ์ฌ๋์ด ์คํฌ๋กคํ๋ฉฐ ์ฝ๋ ์ฑ๋์์๋ ์ด ์ฐจ์ด๊ฐ ๋๋ฌป๋ ํ์๋ฅผ ์ค์ด๊ณ , ๋๋ฌป์ง ์๋ ๋งํผ ํ ํฐ๋ ์๋๋๋ค.
|
|
440
|
-
|
|
441
|
-
### ๋ณด๊ฐ ์ง์นจ: ์์ง์ฑ๊ณผ ๋ณด์์ ๊ต์ ๊ท์น (v3.37.0)
|
|
442
|
-
|
|
443
|
-
๋ค์ฌ์จ fluent-korean ๋ณธ๋ฌธ์ ์ํ ๊ทธ๋๋ก ๋๊ณ , ๊ทธ ๋ค๋ก ์์งํ ์ง์นจ์ ๋ณ๋ ํ์ผ(`presets/korean-style/supplement.md`)์ ๋ด์ ๊ฐ์ ์ฃผ์
์ ์ด์ด ๋ถ์
๋๋ค. ์์ง ๊ธฐ์ค์ ๋ณด์์ ์
๋๋ค. ๊ฑฐ์ ํญ์ ๊ณ ์น๋ ํธ์ด ๋์ ์กฐํญ๋ง ์ค์๊ณ , ์ถ์ฒ๋ ๊ตญ๋ฆฝ๊ตญ์ด์ ๊ณต๊ณต์ธ์ด ์ง์นจ, ์ฟ ๋ฒ๋คํฐ์ค ๋ฌธ์ ํ๊ธํ ๊ฐ์ด๋, ๊ทธ๋ฆฌ๊ณ ํ๊ตญ์ด ํ
์คํธ ์์ง์ฑ์ ๋ค๋ฃฌ ํ์ ๋
ผ๋ฌธ ์ธ ํธ์
๋๋ค.
|
|
444
|
-
|
|
445
|
-
์ธ ์ธต์ด ๋ํด์ง๋๋ค.
|
|
446
|
-
|
|
447
|
-
- **๋ฒ์ญํฌ**: ์ด์ค ํผ๋, ์ผ๋ณธ์ด์์ ์จ ๊ตณ์ ํํ, `~์ ์์ด์`, ์์ด have๋ฅผ ์ง์ญํ '๊ฐ์ง๋ค' ๋จ์ฉ. ๊ธฐ๊ณ๊ฐ ํ์ ํ ์ ์๋ ๊ฒ์ ์ฐ๊ธฐ ์์ ๊ฒ์ฌ(์๋)์๋ ํจ๊ป ๋ค์ด๊ฐ๋๋ค.
|
|
448
|
-
- **์ํฌ ํจํด**: ์๋์ผ๋ก ๋ถ๋ ์์์ด("๋ค์ํ", "ํต์ฌ์ ์ธ"), ํ์งํ ๋ฌธ์ฅ, ์์ฌ์ ์ง๋ฌธ ๋ค ์ฆ๋ต, ๊ทผ๊ฑฐ ์๋ ๊ธ์ ๋ง๋ฌด๋ฆฌ.
|
|
449
|
-
- **์์ง์ฑ**: ๋ฌธ์ฅ์ด ์ด์ด์ง๋ ๋ฐฉ์์ด๋ผ ์ ๊ท์์ผ๋ก๋ ๊ฒ์ฌํ์ง ๋ชปํฉ๋๋ค. ์ด ์ ์ ๋ฐฉํฅ์ ์ ํ ์ฐ๊ตฌ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ์ ์์ดยท์ง์์ด ๊ฐ์ ํ์ธต ์ฐ๊ฒฐ ์ฅ์น๋ ๊ธ์ ํ์ง๊ณผ ์๊ด์ด ์๊ฑฐ๋ ์คํ๋ ค ๋ถ์ ์๊ด์ด๊ณ , ์ ๋ฌธ์ฅ์ด ๋ด๋์ ์ ๋ณด๋ฅผ ๋ค์ ๋ฌธ์ฅ์ด ๋ฐ์ ํ์ด ์ฃผ๋ ์์ ํ ์ฐ๊ฒฐ๋ง ์ ์ ์๊ด์ ๋ณด์์ต๋๋ค. ๊ทธ๋์ ์ง์นจ์ ์ฐ๊ฒฐ์ด ์ด์ํ ๋ ์ ์์ด๋ฅผ ๋ํ์ง ๋ง๊ณ ์ ๋ณด์ ๋ฐฐ์ด(์๋ ๊ฒ ๋จผ์ , ์ ๊ฒ ๋์ค)์ ๊ณ ์น๋ผ๊ณ ๋งํฉ๋๋ค.
|
|
450
|
-
|
|
451
|
-
์์ง์ฑ ์ธต์ ์์น ๋๋ถ๋ถ์ ํ๊ตญ์ด์๋ง ํด๋นํ์ง ์์ต๋๋ค. ๊ตฌ์ ๋ณด ์ฐ์ ๋ฐฐ์ด, ๋๋ช
์ฌ์ ๋จ์ผ ์ง์, ๋ฌธ๋จ ์ ์ฃผ์ด ์ ์ง, ๋น์ฝ์ ์๋ ๋ค๋ฆฌ ๋ฌธ์ฅ, ์งง์ ๋ฐ๋ณต ๋ฌธ์ฅ ๋ณํฉ์ ์์ด ์ฐ๋ฌธ์๋ ๊ทธ๋๋ก ์ ์ฉ๋ฉ๋๋ค. ๋
ผ๋ฌธ์ด ํ๊ตญ์ด ํ์ต์๋ฅผ ๋ค๋ค์ ๋ฟ, ๊ฒ์ฆ๋ ์์น์ ํ
์คํธ์ธ์ดํ์ ํ์ค ์์ง์ฑ ๋ชจํ์
๋๋ค. ์์ด ์ฐ์ถ๋ฌผ์๋ `sprag cohesion on`์ด ๊ฐ์ ๋ค์ฏ ์์น์ ์์ด ๋ธ๋ก์ผ๋ก ์ฃผ์
ํฉ๋๋ค (korean ์ง์นจ์ด ์ผ์ ธ ์์ผ๋ฉด ์ค๋ณต์ด๋ผ ์๋ต๋ฉ๋๋ค).
|
|
452
|
-
|
|
453
|
-
๋ง์ง๋ง ์ ์ ๊ณ ์น๋ฉด ์ ๋๋ ๊ฒ์ ๋ช
์ํฉ๋๋ค. ์ ์ฐฉ๋ ์ ๋ฌธ ์ฉ์ด, ๋ฌธ์ด์ฒด, ์๋ฌธ ์ธ์ฉ์ด ๊ทธ๊ฒ์ด๊ณ , ๊ฒ์ฌ๊ฐ ๋ด๋ ์ง์ ์ ํ์ ์ด ์๋๋ผ ํ์ธ ์์ฒญ์
๋๋ค.
|
|
454
|
-
|
|
455
|
-
### ์ฐ๊ธฐ ์์ ๊ฒ์ฌ (v3.24.0)
|
|
456
|
-
|
|
457
|
-
์ง์นจ์ ์ธ์
์์์ ํ ๋ฒ ๋ฃ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ถ์กฑํ์ต๋๋ค. ๋ชจ๋ธ์ ์ง์นจ์ ํ ๋ฒ ์ฝ๊ณ ๊ทธ ๋ค๋ก ํ์ผ ์์ญ ๊ฐ๋ฅผ ์ฐ๋๋ฐ, ๊ทธ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์ ์ฝ์ด ๋ณด๋ ๋จ๊ณ๊ฐ ์์์ต๋๋ค. ๊ทธ๋์ ์ง์นจ์ด ์ผ์ง ์ธ์
์ด ๊ท์ฝ์ ์ด๊ธ๋๋ ๋ฌธ์ฅ์ ๋ฌธ์์ ๊ทธ๋๋ก ์ค์ด ๋ณด๋๊ณ , ์ฌ๋์ด ์์ฑ๋ณธ์ ์ฝ์ ๋์์ผ ๋๋ฌ๋ฌ์ต๋๋ค. 2026๋
8์์ ์ ์ฉ ๋ฒ์ ๋ฌธ์ฅ์ ๊ณ ์ณ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ก์ผ๋ ค ํ์ง๋ง, ๋ฌธ์ฅ์ ๊ณ ์ณ๋ ๊ฒ์ฌ ๋จ๊ณ๊ฐ ์๋ค๋ ์กฐ๊ฑด์ ๊ทธ๋๋ก์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐํ์ต๋๋ค.
|
|
458
|
-
|
|
459
|
-
v3.24.0๋ถํฐ `korean on`์ด PostToolUse ํ
์ ํจ๊ป ์ค์นํฉ๋๋ค. ๋ชจ๋ธ์ด ๋ฐฉ๊ธ ์ด ํ์ผ์ ์ด์ด์ ๊ธฐ๊ณ๋ก ํ์ ํ ์ ์๋ ์กฐํญ์ ๊ฒ์ฌํ๊ณ , ์๋ฐ์ด ์์ผ๋ฉด ๋ชจ๋ธ์๊ฒ ๋๋๋ ค ๋ณด๋
๋๋ค. ํ์ผ์ ์ด๋ฏธ ์ ์ฅ๋ ๋ค์ด๋ฏ๋ก ์๋ ๊ฒ์ ์๊ณ , ๋ชจ๋ธ์ด ์ฆ์ ๊ณ ์นฉ๋๋ค.
|
|
67
|
+
| โ๏ธ **๋์นซ ๊ท์น** | ๋ํ์ด๋ ์คํจ๊ฐ ํ ์ค์ง๋ฆฌ ๊ท์น์ด ๋์ด ๋งค ์ธ์
์ ์ฌ๋ผ์ต๋๋ค. ํ๋ณด๋ ๊ธฐ๋ก์์ ์๋์ผ๋ก ์ฐพ์ ์ค๋๋ค. | [Harness](https://github.com/rootstudioyaml/sprag/blob/main/docs/HARNESS.md) |
|
|
68
|
+
| ๐ **๋ชจ๋ธ ํผํ
** | ๊ธฐ๋ก์์ ๋ฝ์ ์์ ๊ท์น์ ์ธก์ ํ ์ค๋ฅ์จ๊ณผ ์ ๊ฐ์ก์ ๋ถ์ฌ `ratchet-model.md`์ ์ ์ต๋๋ค. | [route-scan](https://github.com/rootstudioyaml/sprag/blob/main/docs/ROUTE_SCAN.md) |
|
|
69
|
+
| ๐
ท **ํ๋ค์ค ์ ์** | ๋ค์ฏ ๊ฐ์ง ์ด์ ์์น์ ์ค์๊ฐ์ผ๋ก ์ ๊ฒํฉ๋๋ค. ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๋ฉด `๐
ท 4/5`๊ฐ ๋จผ์ ์๋ ค ์ค๋๋ค. | [Harness](https://github.com/rootstudioyaml/sprag/blob/main/docs/HARNESS.md) |
|
|
70
|
+
| ๐ **ํ ํฐ ํ
๋ ๋ฉํธ๋ฆฌ** | ์บ์ ์ ์ค๋ฅ ๊ณผ TTL, ์ปจํ
์คํธ ํฌ๊ธฐ, ์ถ๋ ฅ ๊ธ์ฆ, ๋ ๊ฐ์ง ์ฌ์ฉ๋ ํ๋๋ฅผ ๋งค ํด ํ์ํฉ๋๋ค. | [statusline](https://github.com/rootstudioyaml/sprag/blob/main/docs/STATUSLINE.md) |
|
|
71
|
+
| ๐ **doc2md** | pptx์ xlsx, pdf, docx, fig๋ฅผ ํ์ํ ๋ Markdown ์ผ๋ก ๋ฐ๊ฟ ์ฝ์ต๋๋ค. | [doc2md](https://github.com/rootstudioyaml/sprag/blob/main/docs/DOC2MD.md) |
|
|
72
|
+
| ๐ฐ๐ท **๋ฌธ์ฒด ๊ฒ์ดํธ** | ์ฐ๋ ์์ ์ hook์ผ๋ก ๊ฒ์ฌํฉ๋๋ค. ์ด์ค ํผ๋๊ณผ ๋ฒ์ญํฌ, ๋ฌธ์ฅ ์ฐ๊ฒฐ์ ์ดํ๋๋ค. | [๋ฌธ์ฒด ์ง์นจ](https://github.com/rootstudioyaml/sprag/blob/main/docs/KOREAN-STYLE.md) |
|
|
460
73
|
|
|
461
|
-
|
|
462
|
-
sprag korean lint block # ๊ธฐ๋ณธ๊ฐ. ์๋ฐ์ ๋๋๋ ค ๋ณด๋ด ๊ณ ์น๊ฒ ํฉ๋๋ค
|
|
463
|
-
sprag korean lint warn # ์๋ฆฌ๊ธฐ๋ง ํ๊ณ ์งํ์ ๋ง์ง ์์ต๋๋ค
|
|
464
|
-
sprag korean lint off # ๊ฒ์ฌํ์ง ์์ต๋๋ค
|
|
74
|
+
์ค์ธก โ18.6%๋ ํ๋ค์ค์ ๋์นซ์ ๋ชซ์ด๊ณ , ๋ผ์ฐํ
๊ณผ ๋ฌธ์ ๋ณํ ์ ๊ฐ์ก์ ๊ทธ ์์ ์นํ๋๋ค. ๋ ์ ๊ฐ์ก์ ์ฑ๊ฒฉ์ด ๋ฌ๋ผ์ ํ ์ซ์๋ก ํฉ์น์ง ์์ต๋๋ค.
|
|
465
75
|
|
|
466
|
-
|
|
467
|
-
sprag korean lint scope prose # ๋งํฌ๋ค์ดยทํ
์คํธ ๋ฌธ์๋ง
|
|
76
|
+
## statusline ํ ์ค๋ก ๋ณด๋ ์ํ
|
|
468
77
|
|
|
469
|
-
sprag korean lint docs/*.md # ์ด๋ฏธ ์ ์ฅ๋ ํ์ผ์ ์ง์ ๊ฒ์ฌ
|
|
470
78
|
```
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
๊ฒ์ฌ ๋์์๋ Bash๋ก ์ด ํ์ผ๋ ๋ค์ด๊ฐ๋๋ค(v3.42.7). heredoc๊ณผ `tee`, `sed -i`๋ Write์ ๋๊ฐ์ด ํ๊ตญ์ด๋ฅผ ๋์คํฌ์ ๋จ๊ธฐ๊ณ , Write ๋๊ตฌ๊ฐ ์๋ ํ์ ์์ด์ ํธ๋ `cat > ํ์ผ`๋ถํฐ ์ง์ต๋๋ค. ๊ทธ๋์ Bash๋ฅผ ๋นผ ๋๋ฉด ์์ํด์ ๋ง๋ ๊ฒฐ๊ณผ๋ฌผ ์ ์ฒด๊ฐ ๊ฒ์ฌ๋ฅผ ๋น์ผ ๊ฐ์ต๋๋ค. ๋ฆฌ๋ค์ด๋ ์
๋์ ๊ฒฝ๋ก๋ง ์ธ์ํ๊ณ ๋ช
๋ น๋ฌธ ์์ฒด๋ ์ฝ์ง ์์ผ๋ฏ๋ก, `echo`์ ๋ด๊ธด ํ๊ตญ์ด๊ฐ ์๋ชป ๊ฑธ๋ฆฌ๋ ์ผ์ ์์ต๋๋ค.
|
|
475
|
-
|
|
476
|
-
๊ฒ์ฌ๊ธฐ๋ฅผ ์ํํ๋ ํ์ผ์ด๋ ๋ฌธ์ฒด ๋ณด๊ณ ์์ฒ๋ผ ๊ธ์ง๋ ํํ์ ์ผ๋ถ๋ฌ ๋ด์์ผ ํ๋ ํ์ผ์๋ `korean-lint: off` ํ ์ค์ ๋ฃ์ผ๋ฉด ๊ทธ ํ์ผ์ ๊ฑด๋๋๋๋ค.
|
|
477
|
-
|
|
478
|
-
๊ธฐ๋ณธ ๋ฒ์ `all`์ ๋ฌธ์๋ฟ ์๋๋ผ **์ฝ๋ ์ฃผ์๊ณผ ํ๋ฉด์ ๋๊ฐ๋ ๋ฌธ์์ด, ์๋งยทํ
ํ๋ฆฟ, ์์ฑ ๊ฒฐ๊ณผ๋ฌผ๊น์ง** ๊ฒ์ฌํฉ๋๋ค. ๋ฒค๋๋งํ ์ง์นจ ์๋ฌธ์ ์ฝ๋ ์ฃผ์์ ์์ธ๋ก ๋์ง๋ง, ์ฃผ์๋ ์ฌ๋์ด ์ฝ๊ณ PDFยทHTML ๊ฐ์ ์ฐ์ถ๋ฌผ์ ๊ทธ ๋ฌธ์์ด๋ค๋ก ์กฐ๋ฆฝ๋๊ธฐ ๋๋ฌธ์ ์์ธ๋ก ๋๋ฉด ์ ํํ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒฝ๋ก๊ฐ ๋ค์ ์ด๋ฆฝ๋๋ค. ๊ฒ์ฌ์์ ๋น ์ง๋ ๊ฒ์ ์ค์น๋ ์์กด์ฑ(`node_modules`), VCS ๋ด๋ถ, ๋ฝ ํ์ผ, ๊ทธ๋ฆฌ๊ณ ์ด์งยท์ด๋ฏธ์ง ํ์ผ๋ฟ์
๋๋ค. `dist`๋ `build` ๊ฐ์ ์ฐ์ถ๋ฌผ ๋๋ ํฐ๋ฆฌ๋ ๊ฒ์ฌํฉ๋๋ค. ์๋ฌธ ๊ท์ฝ๋๋ก ๋ฌธ์๋ง ๋ณด๊ณ ์ถ์ผ๋ฉด `korean lint scope prose`๋ก ๋๋๋ฆฝ๋๋ค.
|
|
479
|
-
|
|
480
|
-
์ฃผ์
๋ฌธ์ ์ ์ฉ ๋ฒ์ ์๋ด๋ ์ด ์ค์ ์์ ์์ฑํฉ๋๋ค. ๋ชจ๋ธ์๊ฒ ์๋ฆฌ๋ ๋ฒ์์ ๊ฒ์ฌํ๋ ๋ฒ์๊ฐ ๊ฐ๋ผ์ง๋ฉด 8์๊ณผ ๊ฐ์ ์ํ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
481
|
-
|
|
482
|
-
### ํจ๊ป ์ฃผ์
๋๋ ์ธ์ฝ๋ฉ ๊ท์น (v3.23.2)
|
|
483
|
-
|
|
484
|
-
๋ฌธ์ฒด ์ง์นจ๊ณผ ๋ณ๋๋ก, **๋๊ตฌ ํธ์ถ ์ธ์์ ๋ด๋ ๋นASCII ๋ฌธ์์ด์ ๋ฆฌํฐ๋ด UTF-8๋ก ์ฐ๊ณ `\uXXXX` ์ ๋์ฝ๋ ์ด์ค์ผ์ดํ๋ก๋ ์ฐ์ง ๋ง๋ผ**๋ ํ ์ค์ด ๊ฐ์ด ์ฃผ์
๋ฉ๋๋ค.
|
|
485
|
-
|
|
486
|
-
๋ชจ๋ธ์ด Write๋ Edit์ ์ธ์์ ํ๊ตญ์ด๋ฅผ ์ด์ค์ผ์ดํ๋ก ์ ์ผ๋ฉด, ๊ทธ ์ด์ค์ผ์ดํ๊ฐ ์ฝ๋ ํฌ์ธํธ๋ก ํด์๋์ง ์๊ณ `ํ` ๊ฐ์ ๋ฌธ์์ด ๊ทธ๋๋ก ํ์ผ์ ๊ธฐ๋ก๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ฌผ์๋ ๊นจ์ง ๊ธ์๊ฐ ๋จ๊ณ , ๋ชจ๋ธ์ ์๊ธฐ๊ฐ ์ด ๊ฐ๊ณผ ํ์ผ ๋ด์ฉ์ด ๋ค๋ฅด๋ค๋ ์ฌ์ค์ ์์์ฐจ๋ฆฌ์ง ๋ชปํ ์ฑ ๋ค์ ํธ์ง์ ์ด์ด ๊ฐ๋๋ค. ์ด์ค์ผ์ดํ๋ฅผ ์ฐ์ง ์์ผ๋ฉด ์ด ๊ฒฝ๋ก ์์ฒด๊ฐ ์๊ธฐ์ง ์์ผ๋ฏ๋ก, ์ฌํ์ ๋ณต๊ตฌํ๋ ๋์ ์
๋ ฅ ๋จ๊ณ์์ ๋ง์ต๋๋ค.
|
|
487
|
-
|
|
488
|
-
์ด ํ ์ค์ fluent-korean ์๋ฌธ์ด ์๋๋ผ sprag๊ฐ ์ง์ ์ฐ๋ ์๋ด ๋ฌธ๋จ์ ๋ค์ด๊ฐ๋๋ค. ๋ฌธ์ฒด๊ฐ ์๋๋ผ ํ๊ธฐ ๋ฐฉ์์ ์ ํ๋ ๊ท์น์ด๊ณ , ๋ฒค๋๋งํ ์๋ฌธ์ ์์ ํ์ง ์๋๋ค๋ ์์น์ ์ง์ผ์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ฐ์ ์ด์ ๋ก ์ฝ๋์ ์ปค๋ฐ ๋ฉ์์ง์ ์ ์ฉํ์ง ์๋ ๋ฌธ์ฒด ์์ธ์ ๋ฌ๋ฆฌ, ์ด ๊ท์น์๋ ์์ธ๋ฅผ ๋์ง ์์ต๋๋ค. ์ธ์
๋น ์ฝ 60 ํ ํฐ์ด ๋์ด๋ฉ๋๋ค.
|
|
489
|
-
|
|
490
|
-
> **๊ทผ๊ฑฐ**
|
|
491
|
-
> ๊ฐ์ ํ์์ด Claude Code ์ ์ฅ์์ ๋ณด๊ณ ๋์ด ์์ต๋๋ค: [#12417 ์ ๋์ฝ๋ ์ฒ๋ฆฌ ํ๊ท](https://github.com/anthropics/claude-code/issues/12417), [#26141 Edit ๋๊ตฌ๊ฐ ์ ๋์ฝ๋๋ฅผ ์กฐ์ฉํ ์์์ํค๋ ๋ฌธ์ ](https://github.com/anthropics/claude-code/issues/26141).
|
|
492
|
-
|
|
493
|
-
### ์ค์นํ ๋ ๋ฌผ์ด๋ด
๋๋ค
|
|
494
|
-
|
|
495
|
-
์ค์น ๊ณผ์ ์์ **์ง์นจ์ ๋ด์ฉ๊ณผ ์ธ์
๋น ๋น์ฉ, ์ถ์ฒ๋ฅผ ๋จผ์ ๋ณด์ฌ ์ค ๋ค์ ์ผค์ง ๋ฌผ์ด๋ด
๋๋ค.** ์์คํ
๋ก์บ์ด ํ๊ตญ์ด์ด๋ฉด(`ko_KR` ๋ฑ, macOS๋ ์์คํ
์ค์ ๊น์ง ํ์ธ) ์ง๋ฌธ์ ๊ธฐ๋ณธ๊ฐ์ด "์ผฌ"์ด ๋๊ณ , ํ๊ตญ์ด ํ๊ฒฝ์ด ์๋๋ฉด ๊ธฐ๋ณธ๊ฐ์ด "๋"์
๋๋ค. ๋ก์บ์ ๋ต์ด ์๋๋ผ ๊ธฐ๋ณธ๊ฐ์ผ ๋ฟ์ด๋ฏ๋ก ์์ด ๋ก์บ์์ ํ๊ตญ์ด๋ก ์์
ํ๋ ๊ฒฝ์ฐ์๋ ์ค์น ์ค์ ๋ฐ๋ก ์ผค ์ ์์ต๋๋ค.
|
|
496
|
-
|
|
497
|
-
npm์ `postinstall`์ด๋ CI์ฒ๋ผ ์ฌ๋์ด ๋ถ์ด ์์ง ์์ ์ค์น์์๋ ์ง๋ฌธ์ ๊ฑด๋๋ฐ๊ณ ๋ก์บ ๊ธฐ๋ณธ๊ฐ์ ๊ทธ๋๋ก ์ ์ฉํฉ๋๋ค. ํ๋กฌํํธ๊ฐ ๋ฉ์ถฐ ์๋ฉด ์ค์น ์์ฒด๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ ๋ก์บ์ด ํ๊ตญ์ด๊ฐ ์๋๋ฉด **์ค์ ์ ์ ์ฅํ์ง ์๊ณ ๋ฏธ๊ฒฐ์ ์ผ๋ก ๋จ๊ฒจ ๋๋ฏ๋ก**, ๋์ค์ ํฐ๋ฏธ๋์์ ๋ค์ ์ค์นํ๋ฉด ๊ทธ๋ ๋ฌผ์ด๋ด
๋๋ค. ์ง๋ฌธ ์์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๊ธฐ๋ ค๋ฉด `--yes`๋ `--no-input`์, ๊ธฐ๋ฅ ์์ฒด๋ฅผ ๊ฑด๋๋ฐ๋ ค๋ฉด `CTS_NO_KOREAN=1`์ ์ฐ์ญ์์ค. **ํ ๋ฒ์ด๋ผ๋ ์ง์ ์ผ๊ฑฐ๋ ๋ ๋ค์๋ ๊ทธ ์ ํ์ ์ ์งํ๋ฏ๋ก, ์
๋ฐ์ดํธ ์ค์น๊ฐ ์ฌ์ฉ์์ ๊ฒฐ์ ์ ๋๋๋ฆฌ์ง ์์ต๋๋ค.**
|
|
498
|
-
|
|
499
|
-
> **์ถ์ฒ์ ๋ผ์ด์ ์ค**
|
|
500
|
-
> ์ง์นจ ์๋ฌธ์ [fluent-korean](https://github.com/snflkd/fluent-korean)์์ ๊ฐ์ ธ์์ต๋๋ค. Copyright (c) 2026 snflkd, MIT License.
|
|
501
|
-
> ์๋ฌธ์ ์์ ํ์ง ์์๊ณ output style ํ๋ฐํธ๋งคํฐ๋ง ์ ๊ฑฐํ์ต๋๋ค. ๋ผ์ด์ ์ค ์ ๋ฌธ์ ํจํค์ง์ `presets/korean-style/LICENSE-fluent-korean`์ ํจ๊ป ๋ฐฐํฌํฉ๋๋ค.
|
|
502
|
-
|
|
503
|
-
## ๐ doc2md: ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์ Markdown ์ผ๋ก ๋ฐ๊ฟ๋๋ค
|
|
504
|
-
|
|
505
|
-
๊ธฐํ์์ ๋ณด๊ณ ์๋ ๋๋ถ๋ถ pptxยทxlsxยทpdfยทdocxยทfig ๋ก ์ต๋๋ค. ์ด ํ์๋ค์ ๊ทธ๋๋ก ๋ค๋ฃจ๋ฉด ๋ ๊ฐ์ง ์ค ํ๋๊ฐ ์ผ์ด๋ฉ๋๋ค. Claude Code ๊ฐ ์ด์ง ํ์ผ์ด๋ผ๋ฉฐ ๊ฑฐ๋ถํด์ ์๋ฌด๊ฒ๋ ๋ชป ์ฝ๊ฑฐ๋, ์์ถ์ ํ์ด ๋ณธ๋ฌธ XML ์ ์ฝ๋๋ผ ํ ํฐ์ ํ์ฐ๊ฑฐ๋. 30MB ์ง๋ฆฌ ๋ฐํ์๋ฃ ํ๋๊ฐ XML ๋ก๋ **54๋ง ํ ํฐ**์ด๊ณ , 200k ์ปจํ
์คํธ์๋ ๋ค์ด๊ฐ์ง๋ ์์ต๋๋ค.
|
|
506
|
-
|
|
507
|
-
doc2md ๋ ๊ทธ ํ์ผ์ ํ ๋ฒ ๋ณํํด ๋๊ณ ์๋ณธ ๋์ ๋ณํ๋ณธ์ ์ฝ๊ฒ ํฉ๋๋ค. ๊ฐ์ ๋ฐํ์๋ฃ๊ฐ 22,610 ํ ํฐ์ด ๋ฉ๋๋ค.
|
|
508
|
-
|
|
509
|
-
**์ด ๊ธฐ๋ฅ์ ์ตํธ์ธ์
๋๋ค.** ์ค์น๋ง์ผ๋ก๋ ์ผ์ง์ง ์๊ณ , ์๋ ๋ ๋ช
๋ น์ ๋ชจ๋ ์คํํด์ผ ๋์ํฉ๋๋ค. ํ
๋ง ๋ฑ๋กํ๊ณ ๋ณํ๊ธฐ๊ฐ ์์ผ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
|
|
510
|
-
|
|
511
|
-
์ธ ๊ฐ์ง ๊ฒฝ๋ก๋ฅผ ๋ฎ์ต๋๋ค. ๊ฐ๊ฐ ๊ฑธ๋ฆฌ๋ ์ง์ ์ด ๋ค๋ฆ
๋๋ค.
|
|
512
|
-
|
|
513
|
-
| ์ํฉ | ๊ฐ์
์ง์ |
|
|
514
|
-
|---|---|
|
|
515
|
-
| ํ๋กฌํํธ์ ๋ฌธ์ ๊ฒฝ๋ก๋ฅผ ์ ์ (`@๊ฒฝ๋ก`ยท๋ฐ์ดํยท์๋ ๊ฒฝ๋ก ๋ชจ๋) | `UserPromptSubmit`. ๋ณํํ ๋ค ๋ณํ๋ณธ ๊ฒฝ๋ก๋ฅผ ์ปจํ
์คํธ๋ก ๋ฃ์ต๋๋ค |
|
|
516
|
-
| ์์
๋์ค ๋ฌธ์๋ฅผ `Read` | pdf ๋ `PreToolUse(Read)` ๊ฐ ์ก์ต๋๋ค. pptxยทxlsxยทdocx ๋ Claude Code ๊ฐ ์ด์ง ํ์ผ์ด๋ผ๋ฉฐ ํ
๋ณด๋ค ๋จผ์ ๊ฑฐ๋ถํ๋ฏ๋ก, ์ธ์
์์ ์๋ด๋ฌธ์ด ๋ชจ๋ธ์๊ฒ `doc2md <๊ฒฝ๋ก>` ๋ฅผ ์คํํ๋๋ก ์ง์ํฉ๋๋ค |
|
|
517
|
-
| ๋ฌธ์๋ฅผ ๋ฉ์์ง์ ์ง์ ์ฒจ๋ถ | **ํ
์ผ๋ก ์ก์ ์ ์์ต๋๋ค.** ์ด๋ค ํ
์ด๋ฒคํธ๋ ์ฒจ๋ถ ๋ด์ฉ์ ๋ฐ์ง ๋ชปํฉ๋๋ค. ์ธ์
์์ ์๋ด๋ฌธ์ด ๋ค์๋ถํฐ ๊ฒฝ๋ก๋ก ๋ฌ๋ผ๊ณ ์ฌ์ฉ์์๊ฒ ์๋ดํ๋๋ก ๋ชจ๋ธ์๊ฒ ์ง์ํฉ๋๋ค |
|
|
518
|
-
|
|
519
|
-
๋ ๋ฒ์งธ ์ค์ ์ ์ฝ์ ์ค์ธก์ผ๋ก ํ์ธํ ๊ฒ์
๋๋ค. `.pdf` ๋ฅผ Read ํ๋ฉด ํ
์ด ์คํ๋๊ณ , ๊ฐ์ ์ธ์
์์ `.pptx` ๋ฅผ Read ํ๋ฉด ํ
๋ก๊ทธ์ ์๋ฌด ๊ธฐ๋ก๋ ๋จ์ง ์์ต๋๋ค.
|
|
520
|
-
|
|
521
|
-
```bash
|
|
522
|
-
sprag doc2md on # ํ
๋ฑ๋ก (๋ณํ๊ธฐ๋ ์ฒซ ๋ฌธ์์์ ์๋ ์ค์น)
|
|
523
|
-
sprag doc2md # ๋ณํ๊ธฐยทํ
๋ฑ๋ก ์ํ ํ์ธ
|
|
524
|
-
sprag doc2md ๋ณด๊ณ ์.pptx # ์ง์ ๋ณํํด ๊ฒฐ๊ณผ ํ์ธ
|
|
525
|
-
sprag doc2md install-converter # ์ค์น๋ฅผ ๋ฏธ๋ฆฌ ๋๋ด ๋๊ณ ์ถ์ ๋๋ง
|
|
79
|
+
๐ ๋ผ์ฐํ
์ ๊ฐ $2.09 | fableโsonnet 1ํ $0.72 ยท opusโhaiku 1ํ $0.57
|
|
80
|
+
๐จ 5H โโโโโโ 94% ๐ 12:36 ยท ๐
ท 5/5 ยท ๐ค Opus 5 ยท ๐ง Cache hit 98.8% ยท โณ Cache expires 59:46 ยท ๐
weekly โโโโโโ 38% ยท ๐ต Sep $42 ยท ๐ฆ Ctx 47% of 1M
|
|
526
81
|
```
|
|
527
82
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
์ค์น๋ `install` ๋จ๊ณ๊ฐ ์๋๋ผ ์ฒซ ์ฌ์ฉ ์์ ์ ํฉ๋๋ค. venv ๊ฐ 47MB ๋ผ์, ๋ฌธ์๋ฅผ ๋ค๋ฃจ์ง ์๋ ์ฌ๋์ ๋ผ ์ด์ ๊ฐ ์๋ ๋น์ฉ์
๋๋ค. ์๋ ์ค์น๋ฅผ ๋๋ ค๋ฉด `CTS_DOC2MD_NO_AUTOINSTALL=1` ์ ์ค์ ํ์ญ์์ค.
|
|
531
|
-
|
|
532
|
-
**ํ์ด์ฌ 3.10 ์ด์์ด ํ์ํฉ๋๋ค.** markitdown ์ ์๊ตฌ ์ฌํญ์ด๊ณ , macOS ๊ธฐ๋ณธ `/usr/bin/python3` ๋ 3.9 ์
๋๋ค. ์ด ๋๊ตฌ๋ PATH ์์๋ฅผ ๋ฐ๋ฅด์ง ์๊ณ 3.10 ์ด์์ธ ์ธํฐํ๋ฆฌํฐ๋ฅผ ๊ณจ๋ผ venv ๋ฅผ ๋ง๋ญ๋๋ค. 3.9 ๋ก ๋ง๋ค๋ฉด pip ๊ฐ markitdown ์ 2019 ๋
์๋ฆฌํ์์ ๋ฆด๋ฆฌ์ค(0.0.1a1)๋ก ํด์ํด์, ์ค์น๋ ์ฑ๊ณตํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ชจ๋ ๋ณํ์ด ์ํฌํธ ๋จ๊ณ์์ ์ฃฝ์ต๋๋ค. ์ค์ ๋ก ์ด ํจ์ ์ ๋ฐ๊ณ ์ก์์ต๋๋ค. 3.10 ์ด์์ด ์์ ์์ผ๋ฉด ์ค์น ๋ช
๋ น์ ์๋ดํ๋ ๋์ `brew install python` ์ ์๋ดํฉ๋๋ค.
|
|
533
|
-
|
|
534
|
-
๋ณํ๊ธฐ๋ ๋๊ตฌ ์ ์ฉ venv(`<์ํ ๋๋ ํฐ๋ฆฌ>/doc2md-venv`)์ ์ค์นํฉ๋๋ค. ์์คํ
ํ์ด์ฌ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ , CLI๋ฅผ ์ง์ฐ๋ฉด ํจ๊ป ์ฌ๋ผ์ง๋๋ค. ์ด๋ฏธ `uv tool` ์ด๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ markitdown ์ด ์์ผ๋ฉด ๊ทธ์ชฝ์ ๋จผ์ ์๋๋ค.
|
|
535
|
-
|
|
536
|
-
๋ณํ์ [markitdown](https://github.com/microsoft/markitdown)์ด ๋ด๋นํ๋ฉฐ, ์ฌ๋ผ์ด๋ ๋ฒํธ์ ์ ๋ชฉ ๊ณ์ธต, ํ, ๋ฐํ์ ๋
ธํธ, ์ํธ ๊ตฌ๋ถ์ด ๋ชจ๋ ๋จ์ต๋๋ค. ํ๊ธ๋ ๊นจ์ง์ง ์์ต๋๋ค.
|
|
537
|
-
|
|
538
|
-
๋ช ๊ฐ์ง๋ ์๋์ ์ผ๋ก ํ์ง ์์ต๋๋ค.
|
|
539
|
-
|
|
540
|
-
- **์ด๋ฏธ์ง๋ ๋ณํํ์ง ์์ต๋๋ค.** markitdown ์ด ๋น ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๊ณ , OCR ์ ์ค์ธก์์ ๋ฆฌ์์ค ์ด๋ฆ์ ํ๋ฆฌ๊ฒ ์ฝ์์ต๋๋ค(`c5.xlarge` ๋ฅผ `c.xlarge` ๋ก). ์ด๋ฆ ์์ฒด๊ฐ ๋ด์ฉ์ธ ๋ฌธ์์์๋ ํ
์คํธ๊ฐ ์๋๋๋ง ๋ชปํฉ๋๋ค. ๋ชจ๋ธ์ด ์ด๋ฏธ์ง๋ ์ง์ ์ฝ์ต๋๋ค.
|
|
541
|
-
- **๋ณํ๊ธฐ๊ฐ ์์ด๋ ์๋ฆฌ์ง ์๊ณ ์ง๋๊ฐ์ง ์์ต๋๋ค.** ์ค์น ๋ช
๋ น์ ํ ๋ฒ ์๋ดํ ๋ค ์๋ณธ `Read` ๋ฅผ ๊ทธ๋๋ก ํต๊ณผ์ํต๋๋ค. ๋งค๋ฒ ์๋ฆฌ๋ฉด ๊ทธ๊ฒ๋๋ก ๋ฐฉํด๊ฐ ๋๊ณ , ์๋ฌด ๋ง๋ ํ์ง ์์ผ๋ฉด ๊ณ ์ฅ์ ์จ๊ธฐ๊ฒ ๋ฉ๋๋ค. `doc2md` ๋ฅผ ์ธ์ ์์ด ์คํํ๋ฉด ๋ณํ๊ธฐ์ ํ
๋ฑ๋ก ์ํ๋ฅผ ํ ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
|
|
542
|
-
- **๋ณํ๋ณธ์ ํ๋ก์ ํธ ์์ ๋จ๊ธฐ์ง ์์ต๋๋ค.** ๋๊ตฌ์ ์ํ ๋๋ ํฐ๋ฆฌ ์๋ ๊ถํ `0700` ์ผ๋ก ์ ์ฅํ๋ฏ๋ก `.gitignore` ์ ๋ฌด์์ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ํ์ผ๋ช
์ด ๊ธ์ฌยท๊ณ์ฝยท๊ฐ์ธ์ ๋ณด ๊ฐ์ ํจํด์ ๊ฑธ๋ฆฌ๋ฉด ์์ ๋ณํํ์ง ์์ต๋๋ค.
|
|
543
|
-
- **์์ถ ํญํ์ ๋ง์ต๋๋ค.** pptxยทxlsxยทdocx ๋ zip ์ปจํ
์ด๋์
๋๋ค. ์ ์ธ๋ ํฌ๊ธฐ๋ฅผ ๋จผ์ ๊ฑธ๋ฌ ๋ด๊ณ , ์ ์ธ์ ์กฐ์๋ ์ ์์ผ๋ฏ๋ก ์ค์ ํด์ ๋ฐ์ดํธ๋ ์ํ๊ณผ ๋์กฐํฉ๋๋ค.
|
|
544
|
-
- **์์
์ ํ ์๋ก ์๋ฆ
๋๋ค.** ๋ณํ ์๊ฐ์ ํ์ผ ํฌ๊ธฐ๊ฐ ์๋๋ผ ํ ์๋ฅผ ๋ฐ๋ฆ
๋๋ค(์ค์ธก: PDF 6.3MB 0.9์ด, ์์
5.8MB 47.75์ด). 5๋ง ํ์ ๋์ผ๋ฉด ์๋ถ๋ถ๋ง ๋ณํํ๊ณ , **์๋๋ค๋ ์ฌ์ค๊ณผ ์ ์ฒด ํ ์๋ฅผ ์๋ด์ ํจ๊ป ์ ์ต๋๋ค.**
|
|
545
|
-
|
|
546
|
-
### ๋ ๊น์ ๋ด์ฉ์ ๋ณ๋ ๋ฌธ์์ ์์ต๋๋ค
|
|
547
|
-
|
|
548
|
-
์ ๊ฐ์ก์ ์ด๋ป๊ฒ ์ค์ธกํด ์ฐ์ ํ๋์ง(PDF ์ฒจ๋ถ ๋๋น, ์คํผ์ค XML ๋๋น, `.fig` ๊ณ ์ ๊ธฐ์ค์ ), ํผ๊ทธ๋ง `.fig` ๋ณํ, ๋ฌธ์๋ฅผ ์์ ํ ๋์ ๋ณต์ฌ๋ณธยท์คํฌ๋ฆฝํธ ์ ์ฐจ, DRMยท์ํธ ๋ฌธ์ ํ๋ณ, Windows ์ง์ ์ธ๋ถ๋ [docs/DOC2MD.md](./docs/DOC2MD.md)๋ก ์ฎ๊ฒผ์ต๋๋ค. ์์ง๋ ์ธ ๊ฐ์ง์
๋๋ค.
|
|
549
|
-
|
|
550
|
-
- ์ ๊ฐ ๊ธฐ์ค์ ์ ํญ์ ์ค์ธก์น๋ณด๋ค **๋ฎ๊ฒ** ์ก์ต๋๋ค. ๋๊ตฌ๋ฅผ ๋๋ณด์ด๊ฒ ํ๋ ์ซ์๋ณด๋ค ์ ๋ขฐํ ์ ์๋ ์ซ์๊ฐ ๊ฐ์น ์์ต๋๋ค.
|
|
551
|
-
- `.fig` ์ ๊ฐ์ด ๊ฐ์ฅ ํฝ๋๋ค. `Read` ๊ฐ ์ด์ง ํ์ผ์ ๊ฑฐ๋ถํ์ง ์๊ณ ๊ทธ๋๋ก ์ฝ์ด ํ๋น ์ฝ 44,000 ํ ํฐ์ ํ์ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
552
|
-
- ์ํธ ๋ฌธ์์ DRM ๋ฌธ์๋ ์ค๋ฅ๊ฐ ์๋๋ผ ์ํ๋ก ํ๋ณํด ์๋ดํฉ๋๋ค. ์๋ณธ `Read` ๋ฅผ ๋ง์ง ์์ผ๋ฏ๋ก ์์
์ด ์ค๋จ๋์ง ์์ต๋๋ค.
|
|
553
|
-
|
|
554
|
-
## ๐ BedrockยทVertex ๊ฒฝ์ ํ๊ฒฝ
|
|
555
|
-
|
|
556
|
-
๊ฒ์ดํธ์จ์ด๋ฅผ ๊ฑฐ์น๋ฉด ์๋ต์ด ์บ์ ์ฐ๊ธฐ ํฉ๊ณ๋ง ๋ด๋ ค๋ณด๋ด๊ณ 5๋ถยท1์๊ฐ ๋ฒํท๋ณ ๋ถํด ๊ฐ์ ์ฑ์ฐ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ด ๋๊ตฌ๊ฐ "์บ์ ์ฐ๊ธฐ๊ฐ ์์ง ์๋ค"์ "์ด ์ ๊ณต์๋ ์๋ ค ์ฃผ์ง ์๋๋ค"๋ฅผ ๊ตฌ๋ณํ์ง ๋ชปํ๊ณ , ํ์ ๋ถ๊ฐ์ผ ๋ 1์๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ก์์ต๋๋ค. Bedrock ์ 5๋ถ ๋ฒํท๋ง ์ ๊ณตํ๋ฏ๋ก ๋จ์ ์๊ฐ์ด ์ต๋ 12๋ฐฐ๋ก ๋ถํ์ด ๋ณด์์ต๋๋ค.
|
|
557
|
-
|
|
558
|
-
v3.26.0๋ถํฐ ํธ๋์คํฌ๋ฆฝํธ์ ๋ชจ๋ธ ID๋ก ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ฐ์งํด ๋ค์์ ๋ฐ๋ก์ก์ต๋๋ค.
|
|
559
|
-
|
|
560
|
-
- ํ์ ๋ถ๊ฐ์ผ ๋์ ์นด์ดํธ๋ค์ด ๊ธฐ๋ณธ๊ฐ์ด 5๋ถ์ด ๋๊ณ , ๋ฒํท ๋ผ๋ฒจ์ด `5m?` ๋ก ํ์๋ฉ๋๋ค. ์ค์ธก๊ฐ์ `5m`, ์ถ์ ์ `5m?`, ๊ทผ๊ฑฐ ์์์ `?` ๋ก ์ธ ๋จ๊ณ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
|
|
561
|
-
- 5๋ถ ๋ฒํท์์๋ ์นด์ดํธ๋ค์ด ์์ด ๋น์จ์ด ์๋๋ผ ์ ๋ ์๊ฐ์ ๋ฐ๋ฆ
๋๋ค. 5๋ถ์ 30%๋ 90์ด์ฌ์, ์ด๋ก์ด ์ฃผ๋ ์ฌ์ ๊ฐ ์ค์ ์ ์ด๊ธ๋ฌ์ต๋๋ค.
|
|
562
|
-
- `โ 5m TTL` ๊ฒฝ๊ณ ๊ฐ ์ด ํ๊ฒฝ์๋ ๋๋ฌํฉ๋๋ค. ๋ค๋ง ์กฐ์ธ ๋ฌธ๊ตฌ๋ ๋ค๋ฆ
๋๋ค. ๊ตฌ๋
ํ๋์ ๋ฐ๊ฟ๋ ํด์๋์ง ์๋ ํ๊ฒฝ์ด๋ฏ๋ก ํ๋ ์ ํ์ ๊ถํ์ง ์์ต๋๋ค.
|
|
563
|
-
- `Extra cost if 5m-only` ๋ 1์๊ฐ ์ฐ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๋ฌป์ต๋๋ค. ์ด๋ฏธ 5๋ถ ์ ์ฉ์ธ ํ๊ฒฝ์์๋ ์ง๋ฌธ ์์ฒด๊ฐ ์ฑ๋ฆฝํ์ง ์์ `+$0` ์ด ์๋ชป ์ฝํ์ต๋๋ค.
|
|
564
|
-
- ์์ ๊ฑด์ด ๋ชจ๋ธ ID ํด์ ์คํจ๋ก ๋ฒ๋ ค์ก์ผ๋ฉด statusline ์ `๐ N unresolved` ๋ก ์๋ฆฝ๋๋ค. ์ด์ ์๋ "์์ํ ์ ์์"๊ณผ ํ๋ฉด์ ๊ตฌ๋ณ๋์ง ์์์ต๋๋ค.
|
|
565
|
-
- ํ๊ฒฝ๋ณ์๋ฅผ `foundation-model` ARN ์ผ๋ก ์ง์ ํ ๊ฒฝ์ฐ์๋ ๋ชจ๋ธ์ ํด์ํฉ๋๋ค. ์ด๋ฆ์ ๋ด๊ณ ์์ง ์์ `application-inference-profile` ID ๋ ๊ทธ๋๋ก ๊ฑฐ๋ถํฉ๋๋ค. ๊ฐ์ ์ถ์ธกํด ๋ฃ์ผ๋ฉด ์์ฅ์ ํ๋ฆฐ ๊ธ์ก์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
566
|
-
|
|
567
|
-
๊ฐ์ง๊ฐ ํ๋ฆฌ๋ฉด `sprag mode ttl=5m`(๋๋ `ttl=1h`)๋ก ์ง์ ์ง์ ํ ์ ์์ต๋๋ค. ์ง์ ๊ฐ์ด ์ค์ธก๊ฐ๋ณด๋ค ์ฐ์ ํฉ๋๋ค.
|
|
568
|
-
|
|
569
|
-
### LiteLLM: 5h/7d cap ๋์ ํค ์์ฐ์ ๋ณด์ฌ ์ค๋๋ค (v3.35.0)
|
|
570
|
-
|
|
571
|
-
LiteLLM ํ๋ก์๋ก Bedrock ๋ฑ์ ์ฐ๋ฉด Claude Code stdin ์ `rate_limits` ๊ฐ ์ค์ง ์์ `โฆ current`ยท`๐
weekly` ๊ฒ์ด์ง๊ฐ ์์ ์์ต๋๋ค. ๋์ LiteLLM ์ ํค๋ณ `max_budget` ๊ณผ `spend` ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก, ๊ทธ ๊ฐ์ ๊ฐ์ ธ์ ๊ฐ์ ์ง์ ์ ์์ฐ ๊ฒ์ด์ง๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
|
|
572
|
-
|
|
573
|
-
- ๊ฐ์ง ์กฐ๊ฑด: `ANTHROPIC_BASE_URL` ์ด ๊ณต์ ์๋ํฌ์ธํธ๊ฐ ์๋ ํ๊ฒฝ. ํค๋ `ANTHROPIC_AUTH_TOKEN`(๋๋ `ANTHROPIC_API_KEY`)์์ ๋จผ์ ์ฐพ๊ณ , ์์ผ๋ฉด `settings.json` ์ `apiKeyHelper` ๋ฅผ ์คํํด ์ป์ต๋๋ค. ํฌํผ ์คํ์ 5๋ถ์ ํ ๋ฒ ๋จ๋ ๊ฐฑ์ ํ๋ก์ธ์ค ์์์๋ง ํ๋ฏ๋ก ํต๊ณ์ ๋ ๋๋ ๋๋ ค์ง์ง ์์ต๋๋ค (v3.43.0).
|
|
574
|
-
- `/key/info` ๊ฐ 404 ๋ฅผ ์ฃผ์ด๋ ๊ฐฑ์ ์ ๋ฉ์ถ์ง ์์ต๋๋ค. Okta JWT ๊ฐ์ ์ปค์คํ
์ธ์ฆ์ ์ฐ๋ ๋ฐฐํฌ์์๋ 404 ๊ฐ ์ ์์ด๊ณ , ์์ฐ์ `/user/info` ์ ๋ค์ด ์์ต๋๋ค. ๋ ์๋ํฌ์ธํธ๊ฐ ๋ชจ๋ ์คํจํ ๋๋ง ์คํจ๋ก ๋ด
๋๋ค (v3.43.0).
|
|
575
|
-
- ํ ๋ฉค๋ฒ์ญ์ด ์๋๋ผ internal user ํ๋๋ก ๊ฒ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๊ฒ ๋๋ฉด `budget (user)` ๋ก ์ถ์ฒ๋ฅผ ํจ๊ป ํ์ํฉ๋๋ค. LiteLLM ์ด ์ฐจ๋จ ์ฌ๋ถ๋ฅผ ํ์ ํ ๋ ๋ณด๋ ๊ฐ์ ํ ๋ฉค๋ฒ์ญ ํ๋๋ผ์, ๋ ๊ฐ์ด ์๋ฐฑ ๋ฐฐ ์ด๊ธ๋๋ ๋ฐฐํฌ๊ฐ ์์ต๋๋ค (v3.43.0).
|
|
576
|
-
- ์กฐํ๋ LiteLLM ์ `GET /key/info` ์ `GET /user/info` ๋ก ํ๊ณ , ํธ์ถ ํค ์์ ์ ์ ๋ณด๋ง ๋ฐ์ต๋๋ค. ์์ฐ ์ถ์ฒ๋ ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ **ํ ๋ฉค๋ฒ์ญ ์์ฐ**(team_memberships ์ spendยทmax_budget)์ ๋จผ์ ๋ณด๊ณ , ์์ผ๋ฉด ํค ์์ฒด์ max_budget, ๊ทธ๋ค์ internal user ์์ฐ ์์ผ๋ก ๊ณ ๋ฆ
๋๋ค. ๋ ๋๋ ์บ์ ํ์ผ๋ง ์ฝ์ผ๋ฉฐ, ๊ฐฑ์ ์ 5๋ถ์ ํ ๋ฒ ๋ถ๋ฆฌ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ์ํํฉ๋๋ค (update-check ์ ๊ฐ์ ๊ตฌ์กฐ๋ผ statusline ์ด ๋คํธ์ํฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค).
|
|
577
|
-
- `max_budget` ์ด ์๋ ๋ฌด์ ํ ํค๋ ๊ฒ์ด์ง๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ `๐ต` ์ ์ง์ถ ์ธ๊ทธ๋จผํธ๋ ์ธ์
๋ก๊ทธ ๊ธฐ๋ฐ์ด๋ผ ๊ทธ๋๋ก ํ์๋ฉ๋๋ค.
|
|
578
|
-
- ์ํ ํ์ธ: `sprag litellm-budget` (๊ฒ์ด์งยท์ฌ์ฉยท์์ฌ ๊ธ์ก ์ถ๋ ฅ) ยท `--json` (์บ์ ์๋ณธ) ยท `--refresh` (์ฆ์ ์กฐํ).
|
|
579
|
-
|
|
580
|
-
์ธ์
๊ธฐ๋ณธ ๋ชจ๋ธ์ด sonnet ์ด๋ฉด sonnet ์์ ๊ท์น(T1)์ ๊ตฌ์กฐ์ ์ผ๋ก ์ ๊ฐ์ด 0์
๋๋ค. ๊ฐ์ ๊ธ์ผ๋ก ๋ด๋ ค๋ณด๋ด ๋ด์ผ ์ฐจ์ก์ด ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ ์ด๋ ์ ์ ๋์์
๋๋ค. ๋ค๋ง `route-scan rules` ๊ฐ ์ด ๊ฒฝ์ฐ๋ฅผ "์์ง ์์ ์์"๊ณผ ๊ฐ์ ๋ฌธ๊ตฌ๋ก ํ์ํด ๊ณ ์ฅ์ฒ๋ผ ๋ณด์์ผ๋ฏ๋ก, ์ด์ ํ์ฌ ๊ธฐ๋ณธ ๋ชจ๋ธ ๊ธฐ์ค์ผ๋ก ์ ์ฉ๋์ง ์๋๋ค๋ ์ฌ์ค์ ๋ฐ๋ก ์ ์ต๋๋ค.
|
|
581
|
-
|
|
582
|
-
## ํ ํฐ ๊ธ์ฆ ์์ธ ์ฝ๋
|
|
583
|
-
|
|
584
|
-
| ์ฝ๋ | ์๋ฏธ |
|
|
585
|
-
|---|---|
|
|
586
|
-
| `LARGE_INPUT_PER_REQUEST` | ๋จ์ผ ์์ฒญ์ ์
๋ ฅ์ด 200k๋ฅผ ์ด๊ณผํ์ต๋๋ค. ํด๋ง๋ค ๋ค์ ๊ณผ๊ธ๋๊ณ ํ๋ ์๋ชจ๊ฐ ๊ธ๊ฒฉํ ๋์ด๋ฉ๋๋ค |
|
|
587
|
-
| `LOW_HIT_RATE` | ์บ์ ํํธ์จ 50% ๋ฏธ๋ง |
|
|
588
|
-
| `BUCKET_5M_DOMINANT` | ์บ์ ์ฐ๊ธฐ์ 70%+๊ฐ 5๋ถ ๋ฒํท (Pro ํ๋/Max ๋ค์ด๊ทธ๋ ์ด๋) |
|
|
589
|
-
| `HIGH_OUTPUT_RATIO` | ์ถ๋ ฅ/์
๋ ฅ ๋น์จ 0.15 ์ด๊ณผ (์ถ๋ ฅ ๋จ๊ฐ๋ ์
๋ ฅ์ 5๋ฐฐ) |
|
|
590
|
-
| `HIGH_REQUEST_COUNT` | ์์ฒญ ์๊ฐ ์ค์๊ฐ์ 3๋ฐฐ+ (๋๊ตฌ ํธ์ถ ๋ฃจํ ์์ฌ) |
|
|
591
|
-
| `FREQUENT_CACHE_REBUILD` | ์บ์ ์ฌ์์ฑ์ด ์ฝ๊ธฐ๋ณด๋ค ๋ง์ |
|
|
592
|
-
|
|
593
|
-
๊ฐ ์ฝ๋๋ง๋ค OS๋ณ ํด๊ฒฐ ๋ช
๋ น์ด ํจ๊ป ์ถ๋ ฅ๋ฉ๋๋ค.
|
|
83
|
+
๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๊ฒฝ๊ณ ์นฉ์ด ์ค ๋งจ ์์ผ๋ก ์ต๋๋ค. `๐จ 5H/7D NN%`, `โ Ctx 500k+`, `โ Cache miss`, `โ Input spike`, `โ Output heavy`, `โ Call surge`, `โ Rebuild churn`, `โ 5m TTL` ์ฌ๋ ๊ฐ์ง์ด๋ฉฐ, ์นฉ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ๋งํ๋ฉด Skill์ด ์์ธ ์ฝ๋์ ์กฐ์น ์์๋ฅผ ๊บผ๋ด ์ค๋๋ค. ์ธ๊ทธ๋จผํธ๋ณ ์๋ฏธ์ ์ ๊ธฐ์ค์ [statusline ๋ฌธ์](https://github.com/rootstudioyaml/sprag/blob/main/docs/STATUSLINE.md)์ ์ ๋ฆฌํ์ต๋๋ค.
|
|
594
84
|
|
|
595
85
|
## ์ค์ ํจ๊ณผ: ๋์
์ ํ ๋ฆฌํฌํธ
|
|
596
86
|
|
|
597
87
|

|
|
598
88
|
|
|
599
|
-
harness 5/5 + ratchet์ ์ค์ ์ ์ฉํ ์ ํ ๋น๊ต์
๋๋ค (์ ์ Claude Code ๋ก๊ทธ, **์ฌ์ฉ์ ๋ฉ์์ง 1๊ฑด๋น** ์ ๊ทํ, 2026-05-02 ๊ธฐ์ค, Opus 4.7 ๊ฐ๊ฒฉ)
|
|
89
|
+
harness 5/5 + ratchet์ ์ค์ ์ ์ฉํ ์ ํ ๋น๊ต์
๋๋ค (์ ์ Claude Code ๋ก๊ทธ, **์ฌ์ฉ์ ๋ฉ์์ง 1๊ฑด๋น** ์ ๊ทํ, 2026-05-02 ๊ธฐ์ค, Opus 4.7 ๊ฐ๊ฒฉ).
|
|
600
90
|
|
|
601
91
|
| ๋ฉํธ๋ฆญ | ๋์
์ (7์ผ/739msg) | ๋์
ํ (2์ผ/157msg) | ๋ณํ |
|
|
602
92
|
|---|---:|---:|---:|
|
|
@@ -605,45 +95,36 @@ harness 5/5 + ratchet์ ์ค์ ์ ์ฉํ ์ ํ ๋น๊ต์
๋๋ค (์ ์ Claude
|
|
|
605
95
|
| ๋ฉ์์ง๋น assistant ์๋ณต | 9.73 | 8.83 | โ9.2% |
|
|
606
96
|
| ๋ฉ์์ง๋น ๋๊ตฌ ํธ์ถ | 5.72 | 5.25 | โ8.2% |
|
|
607
97
|
|
|
608
|
-
๊ฐ์ ์์ฒญ์ ๋ ์ ์ ์๋ณต์ผ๋ก
|
|
609
|
-
|
|
610
|
-
<details>
|
|
611
|
-
<summary>์ธก์ ๋ฐฐ๊ฒฝ: ์บ์ ํํธ์จ์ ์ ์ธํ ์ด์ ์ ํ๋ณธ์ ๊ดํ ์ฃผ์ ์ฌํญ</summary>
|
|
612
|
-
|
|
613
|
-
- ์ ์๋ Max ํ๋(์บ์ TTL 1์๊ฐ)์ด๋ผ ํํธ์จ์ด ์ด๋ฏธ ~98%์ ์๋ ดํด ๊ฐ์ ์ฌ์ง๊ฐ ์์์ต๋๋ค. **Pro ํ๋(5๋ถ TTL) ์ฌ์ฉ์๋** ๋ง๋ฃ ์ง์ handoff ์ํฌํ๋ก ์กฐํฉ์ผ๋ก ํํธ์จ ์์ฒด๊ฐ ์ค๋ฅผ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
|
|
614
|
-
- ๋ง๋ฃ ์ง์ handoff ์ํฌํ๋ก: statusline TTL ์นด์ดํธ๋ค์ด์ ๋ณด๋ค๊ฐ ๋ง๋ฃ ์ง์ `sprag handoff`๋ก ์์
์ํ๋ฅผ ๋ฐฑ์
ํ๊ณ ์ ์บ์ ์ฌ์ดํด์ ์์. 1M ๊ฒฝ๊ณ ยทcap ์นฉ๋ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌ.
|
|
615
|
-
- โ ๏ธ ๋์
ํ ๋ฐ์ดํฐ๋ 2์ผ์น(157msg)๋ก ํต๊ณ์ ์๋ฏธ๊ฐ ์ฝํ๊ณ , ์ฃผ๋ณ ์์
ํ ํฝ ์ฐจ์ด๊ฐ ์์ฌ ์์ด ๋๊ตฌ ํจ๊ณผ๋ง ๊นจ๋์ด ๋ถ๋ฆฌ๋์ง ์์ต๋๋ค.
|
|
616
|
-
</details>
|
|
617
|
-
|
|
618
|
-
## FAQ
|
|
619
|
-
|
|
620
|
-
**claude-token-saver์ ๊ฐ์ ๋๊ตฌ์ธ๊ฐ์?** ๋ค. Sprag๊ฐ ์ ์ด๋ฆ์ด๊ณ npm ํจํค์ง๋ `sprag-cli`์
๋๋ค. `claude-token-saver` ํจํค์ง๋ ๊ฐ์ ๋ฆด๋ฆฌ์ค๋ฅผ ๊ณ์ ๋ฐ์ผ๋ฏ๋ก ๊ธฐ์กด ์ค์น๋ ๊ทธ๋๋ก ๋์ํฉ๋๋ค.
|
|
98
|
+
๊ฐ์ ์์ฒญ์ ๋ ์ ์ ์๋ณต์ผ๋ก ๋๋ด๋ฏ๋ก ์ฒซ ์๋ ์ ์ค๋ฅ ์ด ์ค๋ฆ
๋๋ค. PEV์ Structured Task๊ฐ ํ ๋ฒ์ ๊ฐ๊ฒ ๋ง๋ ํจ๊ณผ๋ก ๋ณด์
๋๋ค. ํ๋ณธ์ด 2์ผ์น(157msg)๋ผ ํต๊ณ์ ์๋ฏธ๋ ์ฝํ๊ณ , ์ฃผ๋ณ ์์
ํ ํฝ ์ฐจ์ด๋ ์์ฌ ์์ต๋๋ค.
|
|
621
99
|
|
|
622
|
-
|
|
100
|
+
## ์์ฃผ ์ฐ๋ ๋ช
๋ น
|
|
623
101
|
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
Node.js โฅ 18 ยท macOS / Linux / Windows / WSL ยท **์์กด์ฑ 0**.
|
|
633
|
-
|
|
634
|
-
<details>
|
|
635
|
-
<summary>์๋ ค์ง ํ๊ฒฝ ์ด์ ยท ๋ง์ด๊ทธ๋ ์ด์
</summary>
|
|
102
|
+
| ๋ช
๋ น | ํ๋ ์ผ |
|
|
103
|
+
|---|---|
|
|
104
|
+
| `sprag` | ์ต๊ทผ 1์ผ ์ง๋จ ๋ฆฌํฌํธ |
|
|
105
|
+
| `sprag handoff` | ํ๋์ ๋งํ๊ธฐ ์ ์ ์์
์ํ๋ฅผ ๋ฐฑ์
|
|
|
106
|
+
| `sprag route-scan` | ๋ด ๊ธฐ๋ก์์ ์์ ํ๋ณด ์ฐพ๊ธฐ (LLM ํธ์ถ 0ํ) |
|
|
107
|
+
| `sprag route-scan savings` | ๋ผ์ฐํ
์ ๊ฐ ์์ฅ ์กฐํ |
|
|
108
|
+
| `sprag harness check` | ๐
ท ํ๋ค์ค ์ ์ ํ์ธ |
|
|
109
|
+
| `sprag doc2md <ํ์ผ>` | ๋ฌธ์ ํ ๊ฑด์ Markdown ์ผ๋ก ๋ณํ |
|
|
636
110
|
|
|
637
|
-
|
|
111
|
+
์ ์ฒด ๋ช
๋ น๊ณผ ์ต์
, ์ถ๋ ฅ ์ธ์ด ์ค์ ์ [๋ช
๋ น ๋ฌธ์](https://github.com/rootstudioyaml/sprag/blob/main/docs/COMMANDS.md)์ ์์ต๋๋ค.
|
|
638
112
|
|
|
639
|
-
|
|
113
|
+
## ๋ ๊น์ ๋ด์ฉ
|
|
640
114
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
115
|
+
| ๋ฌธ์ | ๋ค๋ฃจ๋ ๋ด์ฉ |
|
|
116
|
+
|---|---|
|
|
117
|
+
| [์ค์น์ ๊ธฐ๋ณธ ์ค์ ](https://github.com/rootstudioyaml/sprag/blob/main/docs/INSTALL.md) | ์ค์น ์งํ ์ผ์ง๋ ๊ธฐ๋ฅ, ์ง์ ์ผ์ผ ํ๋ ๊ธฐ๋ฅ, ๋๋ ๋ฐฉ๋ฒ |
|
|
118
|
+
| [statusline](https://github.com/rootstudioyaml/sprag/blob/main/docs/STATUSLINE.md) | ์ธ๊ทธ๋จผํธ ์๋ฏธ, ๊ฒฝ๊ณ ์นฉ, ํ ํฐ ๊ธ์ฆ ์์ธ ์ฝ๋, ์
๋ฐ์ดํธ ์๋ด |
|
|
119
|
+
| [๋ช
๋ น](https://github.com/rootstudioyaml/sprag/blob/main/docs/COMMANDS.md) | ์ ์ฒด ์๋ธ์ปค๋งจ๋์ CLI ์ต์
|
|
|
120
|
+
| [Harness](https://github.com/rootstudioyaml/sprag/blob/main/docs/HARNESS.md) | 5์์น, ๋์นซ ์น๊ฒฉ, compact-window ๊ณ ์ , seed ํ๋ฆฌ์
|
|
|
121
|
+
| [route-scan](https://github.com/rootstudioyaml/sprag/blob/main/docs/ROUTE_SCAN.md) | ํฐ์ด ํ์ , ๋ฃฐ ํ์ผ ๊ตฌ์กฐ, ์ค์บ ์์ , ์๋ธ์์ด์ ํธ ์ค์ |
|
|
122
|
+
| [ํฐ์ด ํ๋ณ ๊ธฐ์ค](https://github.com/rootstudioyaml/sprag/blob/main/docs/TIER_CRITERIA.md) | T0ยทT1ยทT2 ๋ฅผ ๊ฐ๋ฅด๋ ๊ทผ๊ฑฐ์ ์ฐ๊ตฌ ์ถ์ฒ |
|
|
123
|
+
| [๋ฒค์น๋งํฌ](https://github.com/rootstudioyaml/sprag/blob/main/docs/BENCHMARK.md) | LLMRouterBench 11,696๋ฌธํญ ์ฌํ ๊ฒฐ๊ณผ |
|
|
124
|
+
| [doc2md](https://github.com/rootstudioyaml/sprag/blob/main/docs/DOC2MD.md) | ๋ณํ ๋์ ํฌ๋งท, ์ ๊ฐ ๊ทผ๊ฑฐ, ๋ฌธ์ ์์ ์ ์ฐจ, DRM ๋ฌธ์ |
|
|
125
|
+
| [ํ๊ตญ์ด ๋ฌธ์ฒด ์ง์นจ](https://github.com/rootstudioyaml/sprag/blob/main/docs/KOREAN-STYLE.md) | ์ฃผ์
๋ด์ฉ, ์ฐ๊ธฐ ์์ ๊ฒ์ฌ, ์ ์ฉ ์ ํ ๋น๊ต |
|
|
126
|
+
| [๋ผ์ฐํฐ๊ฐ ์๋ ์ด์ ](https://github.com/rootstudioyaml/sprag/blob/main/docs/NOT-A-ROUTER.md) | ์ค์๊ฐ ๋ผ์ฐํ
์ด ์บ์๋ฅผ ๊นจ์ ๋น์ฉ์ ํค์ฐ๋ ๊ตฌ์กฐ |
|
|
127
|
+
| [๊ฒ์ดํธ์จ์ด์ ํ๊ฒฝ](https://github.com/rootstudioyaml/sprag/blob/main/docs/GATEWAYS.md) | BedrockยทVertexยทLiteLLM, ๊ฐ๊ฒฉํ, FAQ, ๋์ ์๋ฆฌ |
|
|
647
128
|
|
|
648
129
|
## ๋ฆด๋ฆฌ์ค ๋
ธํธ
|
|
649
130
|
|
|
@@ -688,24 +169,24 @@ AI ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ๋ค๋ฃจ๋ ์ฑ๋ **DeepPulse**์์ ๋ง๋ค๊ณ ์๋๋ค.
|
|
|
688
169
|
|
|
689
170
|
# Sprag
|
|
690
171
|
|
|
691
|
-
**A quality ratchet for AI coding agents
|
|
172
|
+
**A quality ratchet for AI coding agents. Your agent keeps working, it just stops regressing.** Sprag is named after the sprag clutch: forward motion passes freely, backspin locks. It reads the sessions Claude Code already writes and turns them into gains that compound. Every repeated failure becomes a rule loaded at session start, work a cheaper tier has proven it can do is delegated there with a per-run savings ledger as the receipt, and cache or rate-limit trouble reaches your statusline while you can still act on it.
|
|
692
173
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-

|
|
174
|
+
Zero dependencies, no API key, nothing leaves your machine.
|
|
696
175
|
|
|
697
176
|
```bash
|
|
698
|
-
npm i -g sprag-cli #
|
|
699
|
-
# already have claude-token-saver? switching names needs a swap (same bins):
|
|
700
|
-
# npm uninstall -g claude-token-saver && npm i -g sprag-cli
|
|
177
|
+
npm i -g sprag-cli # same package as the old claude-token-saver name
|
|
701
178
|
```
|
|
702
179
|
|
|
703
|
-
|
|
180
|
+

|
|
704
181
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
182
|
+
## Four numbers
|
|
183
|
+
|
|
184
|
+
| Metric | Result | | Evidence |
|
|
185
|
+
|---|---|---|---|
|
|
186
|
+
| Public benchmark accuracy | **59.1%** vs 57.9% best single model | `โฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐ` | [benchmark](./docs/BENCHMARK.md) |
|
|
187
|
+
| Cost for the same queries | **$268** vs gpt-5 $388, gemini-2.5-pro $734 | `โฐโฐโฐโฐโฐโฑโฑโฑโฑโฑโฑโฑ` | [benchmark](./docs/BENCHMARK.md) |
|
|
188
|
+
| Tokens per document | **โ95.8%**, 540,429 โ 22,610 | `โฐโฑโฑโฑโฑโฑโฑโฑโฑโฑโฑโฑ` | [doc2md](./docs/DOC2MD.md) |
|
|
189
|
+
| Cost per user message | **โ18.6%**, $2.345 โ $1.910 | `โฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฑโฑ` | [report](#real-world-impact--beforeafter-report) |
|
|
709
190
|
|
|
710
191
|
```text
|
|
711
192
|
accuracy total cost, 11,696 queries
|
|
@@ -714,641 +195,35 @@ gpt-5 57.8% $388 โฐโฐโฐโฐโฐโฐโฐโฐโฑโฑโฑ
|
|
|
714
195
|
gemini-2.5-pro 57.9% $734 โฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐโฐ
|
|
715
196
|
```
|
|
716
197
|
|
|
717
|
-
|
|
198
|
+
Routing savings are a ledger, not an estimate: the price difference of each delegated run, traceable back to the rule that caused it with `sprag route-scan savings`. What the ledger deliberately excludes is documented in [the command reference](./docs/COMMANDS.md).
|
|
718
199
|
|
|
719
200
|
## Everything ships in one install, working from day one
|
|
720
201
|
|
|
721
|
-
| | What it does |
|
|
722
|
-
|---|---|
|
|
723
|
-
| โ๏ธ **Ratchet rules** | Repeated failures become one-line rules loaded every session. Candidates are detected from your logs; you choose project or global scope. |
|
|
724
|
-
| ๐ **Model fitting** | Log-driven delegation rules with measured error rates and reported savings, written to `ratchet-model.md`. Criteria [benchmarked](./docs/BENCHMARK.md) on public data. |
|
|
725
|
-
| ๐
ท **Harness score** | Five operating principles checked live ([โ18.6% cost, measured](#real-world-impact--beforeafter-report)). Skip the verify step and `๐
ท 4/5` says so before you report done. |
|
|
726
|
-
| ๐ **Token telemetry** | Cache hit rate, TTL, context size, output spikes and both rate-limit windows, in the prompt every turn. |
|
|
727
|
-
| ๐ **doc2md** | pptx, xlsx, pdf, docx and fig converted on demand, so a document costs a read instead of a context bomb ([510k tokens saved on one deck](#-doc2md--documents-become-markdown-before-the-model-reads-them)). |
|
|
728
|
-
| ๐ฐ๐ท **Style gates** | Write-time prose lint enforced by hook. Shipping today for Korean technical writing: double passives, translationese, cohesion. |
|
|
729
|
-
|
|
730
|
-
The measured โ18.6% comes from the harness and ratchet; routing and conversion savings sit on top of it. The two savings figures are never added together: routing says "the same work ran on a cheaper model", conversion says "a file became readable without pushing the original through the context window". The statusline gives each its own line and puts the larger one first.
|
|
731
|
-
|
|
732
|
-
## Contents
|
|
733
|
-
|
|
734
|
-
- **Start here**: [Getting started](#getting-started) ยท [Reading the statusline](#reading-the-statusline) ยท [Commands](#commands)
|
|
735
|
-
- **Savings**: [The routing ledger](#-the-savings-figure-is-a-ledger-entry-not-an-estimate) ยท [route-scan](#-route-scan--this-recurring-task-could-run-on-a-cheaper-tier) ยท [doc2md](#-doc2md--documents-become-markdown-before-the-model-reads-them) ยท [seed](#-seed-delegation-that-works-from-the-first-session) ยท [Benchmark](https://github.com/rootstudioyaml/sprag/blob/main/docs/BENCHMARK.md)
|
|
736
|
-
- **Guardrails**: [Harness](#-harness-mode) ยท [compact-window](#-compact-window--pin-where-a-1m-session-compacts) ยท [Korean writing guidance](#-korean-writing-guidance)
|
|
737
|
-
- **Spend & environments**: [Monthly spend ยท LiteLLM key budget](#litellm-your-key-budget-stands-in-for-the-missing-5h7d-caps-v3350) ยท [Gateways (Bedrock/Vertex)](#-behind-a-gateway-bedrock--vertex) ยท [Spike issue codes](#spike-issue-codes) ยท [Measured impact](#real-world-impact--beforeafter-report)
|
|
738
|
-
|
|
739
|
-
## Getting started
|
|
740
|
-
|
|
741
|
-
**Prerequisite:** Node.js โฅ 18 (`node -v` ยท macOS `brew install node` ยท Windows `winget install OpenJS.NodeJS.LTS` ยท Linux/WSL: [nvm](https://github.com/nvm-sh/nvm) recommended)
|
|
742
|
-
|
|
743
|
-
```bash
|
|
744
|
-
npm i -g sprag-cli
|
|
745
|
-
```
|
|
746
|
-
|
|
747
|
-
The statusline appears at the bottom of Claude Code right away. If auto-registration was skipped (`--ignore-scripts`, sudo, sandboxed installs), run `sprag install`.
|
|
748
|
-
|
|
749
|
-
One install sets up everything: **statusline, Skill, SessionStart hook, the ๐
ท Harness (5 principles), and a first route-scan.** The harness and the Korean writing guidance **show what they add and ask before enabling it.** The harness is **appended** to `~/.claude/CLAUDE.md` as a marked block (your existing content is backed up and preserved) and is left alone if one is already there.
|
|
750
|
-
|
|
751
|
-
Outside a terminal โ npm `postinstall`, CI, piped stdin โ the question is skipped and the old defaults apply. Use `--yes` or `--no-input` to skip it deliberately, `CTS_NO_HARNESS=1 npm i -g sprag-cli` to skip the harness entirely, and `sprag harness uninit --global` to undo it.
|
|
752
|
-
|
|
753
|
-
> โ ๏ธ Avoid `sudo` global installs โ the Skill lands in root's `~/.claude` instead of yours. Use nvm/fnm/Volta or `npm config set prefix ~/.npm-global`.
|
|
754
|
-
|
|
755
|
-
### What the install turns on, and what stays manual
|
|
756
|
-
|
|
757
|
-
Everything that costs nothing until it is needed is on after a plain install. The only manual items are the ones that change Claude Code's own settings or need a human to pick a scope.
|
|
758
|
-
|
|
759
|
-
| Feature | After install | How to turn it off |
|
|
202
|
+
| | What it does | More |
|
|
760
203
|
|---|---|---|
|
|
761
|
-
|
|
|
762
|
-
|
|
|
763
|
-
|
|
|
764
|
-
|
|
|
765
|
-
|
|
|
766
|
-
|
|
|
767
|
-
| doc2md hooks (Read, Edit/Write, prompt) | on | `doc2md off`, `CTS_NO_DOC2MD=1` |
|
|
768
|
-
| doc2md converter (markitdown venv) | offered at a terminal; an unattended install prints the command | install later with `doc2md install-converter` |
|
|
769
|
-
| Korean writing guidance | on when the locale is Korean (asked at a terminal) | `korean off`, `CTS_NO_KOREAN=1` |
|
|
770
|
-
| compact-window warning chip | on | `compact-window off` |
|
|
771
|
-
| Update-available chip | on | `CTS_NO_UPDATE_CHECK=1` |
|
|
772
|
-
| **Pinning compact-window** (`autoCompactWindow` 500k) | **off โ run it yourself** | `compact-window set --global` or `--project` |
|
|
773
|
-
| **Model-fitting rules** (`ratchet-model.md` delegations) | **candidates are proposed only** | review and approve with `route-scan rules` |
|
|
774
|
-
| `handoff` (back up work before a cap) | an on-demand command | n/a |
|
|
775
|
-
|
|
776
|
-
`compact-window set` writes into Claude Code's `settings.json` and a human has to choose global or project scope, so it is never run for you. Model-fitting rules keep an approval step for the same reason: which work belongs on a cheaper tier is your call.
|
|
777
|
-
|
|
204
|
+
| โ๏ธ **Ratchet rules** | Repeated failures become one-line rules loaded every session; candidates are detected from your logs. | [harness](./docs/HARNESS.md) |
|
|
205
|
+
| ๐ **Model fitting** | Log-driven delegation rules with measured error rates and savings, written to `ratchet-model.md`. | [route-scan](./docs/ROUTE_SCAN.md) |
|
|
206
|
+
| ๐
ท **Harness score** | Five operating principles checked live. Skip the verify step and `๐
ท 4/5` says so before you report done. | [harness](./docs/HARNESS.md) |
|
|
207
|
+
| ๐ **Token telemetry** | Cache hit rate, TTL, context size, output spikes and both rate-limit windows, every turn. | [statusline](./docs/STATUSLINE.md) |
|
|
208
|
+
| ๐ **doc2md** | pptx, xlsx, pdf, docx and fig converted on demand instead of pasted into context. | [doc2md](./docs/DOC2MD.md) |
|
|
209
|
+
| ๐ฐ๐ท **Style gates** | Write-time prose lint enforced by hook: double passives, translationese, cohesion. | [style](./docs/KOREAN-STYLE.md) |
|
|
778
210
|
|
|
779
|
-
|
|
211
|
+
The measured โ18.6% comes from the harness and ratchet; routing and conversion savings sit on top of it. The two savings figures are never added together, because they measure different things.
|
|
780
212
|
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
```
|
|
784
|
-
before after gap
|
|
785
|
-
claude-opus-5 โ haiku-4-5 = $0.57
|
|
786
|
-
(the model (what (same token counts,
|
|
787
|
-
handling this actually priced against
|
|
788
|
-
before the rule) ran it) both models)
|
|
789
|
-
```
|
|
790
|
-
|
|
791
|
-
```bash
|
|
792
|
-
$ sprag route-scan savings # trace every dollar back to its rule
|
|
793
|
-
|
|
794
|
-
๐ Routing saved, lifetime $2.09 (last 7d $1.40 ยท 30d $2.09)
|
|
795
|
-
|
|
796
|
-
By model change:
|
|
797
|
-
claude-fable-5 โ claude-sonnet-5 โ 1 run, $0.72
|
|
798
|
-
claude-opus-5 โ claude-haiku-4-5 โ 1 run, $0.57
|
|
799
|
-
|
|
800
|
-
By run (newest first):
|
|
801
|
-
2026-08-22 $0.51 claude-fable-5 โ claude-haiku-4-5
|
|
802
|
-
rule: T2|paste|-Users-me-projects-my-app
|
|
803
|
-
```
|
|
804
|
-
|
|
805
|
-
**What is excluded** โ an honest number beats a big one:
|
|
806
|
-
|
|
807
|
-
- Delegations no registered rule covers (`Explore`, your own agents, plugin subagents): this tool did not route them.
|
|
808
|
-
- Model ids the pricing table cannot recognize: the run is dropped rather than priced wrong.
|
|
809
|
-
|
|
810
|
-
---
|
|
811
|
-
|
|
812
|
-
## โก What else the statusline catches
|
|
813
|
-
|
|
814
|
-
| | |
|
|
815
|
-
|---|---|
|
|
816
|
-
| ๐จ **No surprise rate limits** | Warns when the 5H/7D window hits 90%; `handoff` backs up your work |
|
|
817
|
-
| ๐ง **Cache waste detection** | Hit rate, TTL, 1M-context detection โ spikes diagnosed with issue codes |
|
|
818
|
-
| ๐ต **Spend visibility** | Month-to-date spend (`๐ต Sep $42`) always on; behind a LiteLLM gateway the key budget gauge (`๐ budget 34% $34/$100`) stands in for the missing 5h/7d caps ([below](#litellm-your-key-budget-stands-in-for-the-missing-5h7d-caps-v3350)) |
|
|
819
|
-
| ๐ฐ๐ท **Korean writing guidance** | Offered at install time, defaulting to your locale ([below](#-korean-writing-guidance)) |
|
|
820
|
-
|
|
821
|
-
## Not a router โ 60 seconds
|
|
822
|
-
|
|
823
|
-
Sprag installs once, reads the sessions you already run, and does not ask you to change how you prompt. It never intercepts a request or swaps your model in realtime.
|
|
824
|
-
|
|
825
|
-
1. **A repeat becomes a rule.** The first failure is just work. On the second, Sprag surfaces it as a candidate; you approve the scope, and the rule loads at the start of every session after that.
|
|
826
|
-
2. **Safe work goes to a sub-agent.** When a task matches one your history shows is safe, Sprag spawns a sub-agent on a cheaper tier to do it and hands the result back for review. Anything that fails quietly stays with the main agent.
|
|
827
|
-
3. **Cost trouble shows up early.** Cache hit rate, TTL expiry, context growth and both rate-limit windows are read every turn and printed in your statusline, while you can still act on them.
|
|
828
|
-
|
|
829
|
-
### Why realtime model routing can cost more, not less
|
|
830
|
-
|
|
831
|
-
Never switching models mid-session is the point of this design.
|
|
832
|
-
|
|
833
|
-
Prompt caches are **kept per model.** Switch to a cheaper model mid-session and it starts from a cold cache, re-reading the whole conversation at full input price. A cache hit costs about a tenth of that, so past roughly 20k tokens of history **one switch can erase everything the cheaper model was going to save.** You moved the work down a tier and the bill went up: the central paradox of realtime routing.
|
|
834
|
-
|
|
835
|
-
Teams shipping routing products have turned the feature off for exactly this reason: [LLM ๋ผ์ฐํฐ๋ฅผ ๋ง๋ ์ฌ๋๋ค์ด ์ง์ ๊ป์ต๋๋ค #Shorts](https://www.youtube.com/shorts/SK-GoAABjbg) (Korean).
|
|
836
|
-
|
|
837
|
-
So this tool never touches the main session's model. It delegates to **subagents only**, which leaves the main session's cache intact and runs the delegated work on a cheap model in its own context. That is why the savings are not cancelled out by cache loss.
|
|
838
|
-
|
|
839
|
-
```bash
|
|
840
|
-
npm i -g sprag-cli@latest
|
|
841
|
-
sprag route-scan # find delegation candidates in your own history (0 LLM calls)
|
|
842
|
-
sprag route-scan rules # list promoted rules ยท rm <N> to remove
|
|
843
|
-
sprag route-scan savings # audit every dollar the routing saved
|
|
844
|
-
```
|
|
845
|
-
|
|
846
|
-
Thresholds come from **your own last-14-day distribution (p25/p75)**, not someone else's benchmark.
|
|
847
|
-
Measured rule-health โ whether a delegated run actually succeeded โ landed in [v3.9.0](#v390-2026-08-01).
|
|
848
|
-
|
|
849
|
-
---
|
|
850
|
-
|
|
851
|
-
## Reading the statusline
|
|
852
|
-
|
|
853
|
-
Once the savings ledger has entries it renders as **two rows** โ routing savings on row 1, diagnostics on row 2.
|
|
213
|
+
## The statusline in one line
|
|
854
214
|
|
|
855
215
|
```
|
|
856
216
|
๐ Routing saved $2.09 | fableโsonnet 1ร $0.72 ยท opusโhaiku 1ร $0.57
|
|
857
|
-
|
|
858
|
-
```
|
|
859
|
-
|
|
860
|
-
With an empty ledger (no measured delegation yet) row 1 is not drawn and the layout stays single-line. If your build renders only the first row (some macOS Claude Code versions), pass `--single-line`.
|
|
861
|
-
|
|
862
|
-
| Segment | Meaning |
|
|
863
|
-
|---|---|
|
|
864
|
-
| `๐` **row 1** | Lifetime routing savings + the model moves behind them. The breakdown sums exactly to the total, model names keep only the family (`opusโhaiku`). Full audit: `route-scan savings` |
|
|
865
|
-
| `๐` **row 2** | Lifetime doc2md conversion savings with a per-format breakdown. Whichever of routing/conversion saved more takes row 1 |
|
|
866
|
-
| `๐ค` | Active model |
|
|
867
|
-
| `๐
ท 5/5` | Harness principle score ([Harness mode](#-harness-mode)) |
|
|
868
|
-
| `๐ง ` | Cache hit rate (green at 85%+) |
|
|
869
|
-
| `โณ` | Cache TTL countdown โ send a message before expiry to keep the cache warm. Ticking while idle requires Claude Code v2.1.97+ (see [If the countdown looks frozen](#how-it-works--environment)) |
|
|
870
|
-
| `โฆ current` / `๐
weekly` | 5-hour / 7-day rate-limit window usage + reset time |
|
|
871
|
-
| `๐ฆ` | Context usage (e.g. `Ctx 68% of 1M`) โ colored by fill. Current models default to 1M with no premium, but token volume itself drives per-turn cost and 5H/7D burn |
|
|
872
|
-
| `๐ต Sep $42` | **Estimated spend since 00:00 on the 1st of this month** (local time). Summed per session with that session's model pricing; always shown, even on gateways with no 5h/7d caps (v3.35.0) |
|
|
873
|
-
| `๐ budget` | **LiteLLM key budget gauge.** When stdin carries no rate_limits, shows the key's `spend` against `max_budget` as `๐ budget โฐโฑ 34% $34/$100` (v3.35.0, [below](#-behind-a-gateway-bedrock--vertex)) |
|
|
874
|
-
| `๐ฐ` | Cumulative savings from prompt caching โ a **different** number from row 1's `๐` (model routing) |
|
|
875
|
-
| `v3.24.0` | The version you are running. Gray, at the tail, when it is the latest one |
|
|
876
|
-
| `โฌ v3.24.0 โ 3.25.0` | A newer release exists. Actionable, so it moves to the front of the line ([Update notifications](#-update-notifications)) |
|
|
877
|
-
|
|
878
|
-
When something is wrong, a **warning chip leads the line**:
|
|
879
|
-
|
|
880
|
-
```
|
|
881
|
-
๐จ 5H โโโโโโ 94% ๐ 12:36 ยท ๐
ท 5/5 ยท ๐ค Opus 4.8 ยท ๐ง Cache hit 72.1% ยท โ Cache miss ยท ๐
weekly โโโโโโ 12% ๐ Sun 14:26 ยท ๐ฆ Ctx 200k ยท last 1d
|
|
882
|
-
```
|
|
883
|
-
|
|
884
|
-
Chips โ `๐จ 5H/7D NN%` (cap imminent) ยท `โ Ctx 500k+` (a single request actually exceeded 500k) ยท `โ Cache miss` ยท `โ Input spike` ยท `โ Output heavy` ยท `โ Call surge` ยท `โ Rebuild churn` ยท `โ 5m TTL`. When both windows cross 90% at once, the sooner-resetting one is promoted to ๐จ and the other stays visible as a red segment (v2.16.0+).
|
|
885
|
-
|
|
886
|
-
### When a chip appears
|
|
887
|
-
|
|
888
|
-
Run the `/claude-token-saver` Skill inside Claude โ or just say the chip wording ("5H cap is up", "cache miss") and it auto-activates. The Skill surfaces the **root-cause code + step-by-step fix**. When a cap is imminent, run `sprag handoff` to back up your work state to markdown and continue in a fresh session.
|
|
889
|
-
|
|
890
|
-
## Commands
|
|
891
|
-
|
|
892
|
-
Run these in your shell (inside Claude Code, the `/claude-token-saver` Skill is the only entry point):
|
|
893
|
-
|
|
894
|
-
| Command | What it does |
|
|
895
|
-
|---|---|
|
|
896
|
-
| `sprag` | Last-1-day diagnostic report (`--days N` / `--hours N`) |
|
|
897
|
-
| `sprag last` | Most recent warning + remediation |
|
|
898
|
-
| `sprag history` | Last 7 days of warning transitions |
|
|
899
|
-
| `sprag handoff` | Back work up to `HANDOFF-*.md` before a cap blocks you |
|
|
900
|
-
| `sprag mode [keywords...]` | Output config (`icon`/`text`, `en`/`ko`, `1h`โ`30d` window, โฆ) |
|
|
901
|
-
| `sprag harness ...` | ๐
ท Harness management (below) |
|
|
902
|
-
| `sprag route-scan` | Detect recurring easy work on expensive models โ propose haiku-delegation ratchet rules (below) |
|
|
903
|
-
| `sprag route-scan savings` | The routing-savings ledger โ per-model-change rollup + per-run log (the evidence behind the figure) |
|
|
904
|
-
| `sprag compact-window` | Warn when a 1M-context session has no auto-compact cap โ pin 400k with `set` (below) |
|
|
905
|
-
| `sprag korean on\|off\|status` | Inject Korean writing guidance at session start and install the write-time check (below) |
|
|
906
|
-
| `sprag cohesion on\|off\|status\|show` | Inject English cohesion guidance (sentence-connection rules) at session start |
|
|
907
|
-
| `sprag korean lint block\|warn\|off` | How the write-time check handles findings |
|
|
908
|
-
| `sprag korean lint scope all\|prose` | Check every text file, or documents only |
|
|
909
|
-
| `sprag doc2md on\|off` | Convert attached documents to Markdown before the model reads them (below) |
|
|
910
|
-
| `sprag doc2md <file>` | Convert one file by hand. Diagnostic: it prints the refusal reason instead of swallowing it |
|
|
911
|
-
| `sprag mode ttl=5m\|1h\|auto` | Pin the cache TTL bucket. The default `auto` trusts the measured split, then falls back to gateway detection |
|
|
912
|
-
| `sprag --version` | Print the installed version |
|
|
913
|
-
| `sprag update-check` | Is a newer version out? (`--refresh` to ask now, `--dismiss` to mute this version's offer) |
|
|
914
|
-
| `sprag upgrade` | Install the latest release with the package manager that installed this copy (`--print` shows the command only) |
|
|
915
|
-
| `sprag install` | Manually register Skill + statusline |
|
|
916
|
-
| `sprag uninstall [--purge]` | Remove the hooks, statusline and skill it registered. Recorded savings are kept unless `--purge` is given |
|
|
917
|
-
|
|
918
|
-
The output language is decided once, at install time: a terminal install proposes the system locale and asks whether to use Korean, while an unattended install records what the locale says. Once recorded it is never asked again, not even on an upgrade. Change it later with `mode ko` / `mode en`, or pin it for a scripted install with `CTS_LANG=ko` / `CTS_LANG=en`. Statusline chips stay symbolic either way.
|
|
919
|
-
|
|
920
|
-
<details>
|
|
921
|
-
<summary>All CLI options</summary>
|
|
922
|
-
|
|
923
|
-
| Flag | Description | Default |
|
|
924
|
-
|------|-------------|---------|
|
|
925
|
-
| `--days, -d` | Analysis period in days | 30 |
|
|
926
|
-
| `--hours` | Analysis window in hours (overrides `--days`) | โ |
|
|
927
|
-
| `--format, -f` | `table` / `json` / `csv` | table |
|
|
928
|
-
| `--project, -p` | Filter by project directory | all |
|
|
929
|
-
| `--threshold` | Hit-rate alert threshold (0.0โ1.0) | 0.7 |
|
|
930
|
-
| `--statusline` | One-line statusline output | โ |
|
|
931
|
-
| `--icon` | Use ๐ง / โณ / ๐ฐ / ๐ฆ icons | text |
|
|
932
|
-
| `--verbose` | Longer labels | โ |
|
|
933
|
-
| `--no-timer` | Hide TTL countdown | show |
|
|
934
|
-
| `--no-color` | Strip ANSI codes | โ |
|
|
935
|
-
| `--segments=โฆ` | Limit statusline segments (e.g. `model,five_hour,seven_day,saved`) | all |
|
|
936
|
-
| `--install-hook` / `--uninstall-hook` | Manage the PostToolUse hook | โ |
|
|
937
|
-
</details>
|
|
938
|
-
|
|
939
|
-
## โฌ Update notifications
|
|
940
|
-
|
|
941
|
-
A statusline cannot open a dialog, and it re-renders every ~300ms, so it can never touch the network while drawing. The notification is therefore split in two:
|
|
942
|
-
|
|
943
|
-
- **The statusline tells you.** Up to date: a quiet gray `v3.24.0` at the tail. Newer release out: `โฌ v3.24.0 โ 3.25.0` in yellow, moved to the front. Never red โ nothing is broken.
|
|
944
|
-
- **Session start asks you.** On a new session or `/clear`, the SessionStart hook injects one line telling the model a newer version exists and to ask before installing anything. Only after you agree does it run `sprag upgrade`.
|
|
945
|
-
- **Declining sticks.** `sprag update-check --dismiss` mutes the offer for that version; the next release asks again. The statusline chip stays โ you declined the question, not the fact.
|
|
946
|
-
|
|
947
|
-
The registry lookup runs at most once every 24h in a detached background process and only ever writes a cache file (`update-check.json`) โ the same shape npm's `update-notifier` uses. A failed check still stamps its timestamp, so an offline machine backs off instead of retrying on every render. Turn checks off entirely with `CTS_NO_UPDATE_CHECK=1` or `NO_UPDATE_NOTIFIER`.
|
|
948
|
-
|
|
949
|
-
## ๐
ท Harness mode
|
|
950
|
-
|
|
951
|
-
Bootstrap five engineering principles (Ratchet ยท Evidence ยท PEV ยท Structured Task ยท Default Safe Path) into `CLAUDE.md` with one command; the statusline scores it as `๐
ท 5/5`. When the same error keeps recurring, a `๐
ทโ ratchet?` nudge appears so you can promote it to a rule.
|
|
952
|
-
|
|
953
|
-
```bash
|
|
954
|
-
sprag harness init # this project
|
|
955
|
-
sprag harness init --global # ~/.claude/CLAUDE.md โ every project
|
|
956
|
-
sprag harness check # current score (global fallback honored)
|
|
957
|
-
sprag harness analyze # run the transcript analysis manually (no hook needed); refreshes harness-state.json
|
|
958
|
-
sprag harness promote <N> --project|--global # warning #N โ ratchet rule (scope required)
|
|
959
|
-
sprag harness promote "<rule text>" --project|--global # register your own hand-written rules the same way
|
|
960
|
-
sprag harness pull # register the package's curated ratchet rules into your global ratchet (opt-in, dedupes)
|
|
961
|
-
sprag harness list / rm <N> # view / delete rules (auto .bak)
|
|
962
|
-
sprag harness off | on # toggle the ๐
ท chip
|
|
963
|
-
```
|
|
964
|
-
|
|
965
|
-
- `promote` **requires** `--project`/`--global` in non-TTY contexts (scripts, LLM calls) โ a scope choice is never silently made for the caller.
|
|
966
|
-
- `pull` registers the **author-curated ratchet rules** bundled with the package (`presets/ratchet-rules.json` โ only general-purpose rules promoted from real recurring mistakes) into your global ratchet (`~/.claude/ratchet.md`). `install`/`init` never auto-inject anything; `pull` is always opt-in and idempotent. Drop any rule you dislike with `harness rm`.
|
|
967
|
-
- `seed` offers the same presets **one at a time**. Where `pull` registers the whole ratchet set in one go, `seed` covers the model-fitting presets too and asks about each of them in the first session after an install or upgrade ([below](#-seed-delegation-that-works-from-the-first-session)).
|
|
968
|
-
- ๐
ทโ runtime warnings (`ratchet?` `no-evidence` `PEV-skip`) expire after 30 minutes, subdirectory sessions match their project correctly, and PEV-skip counts only mutating tools (Edit/Write/Bash) so read-only research sessions don't trip it (v2.16.0+).
|
|
969
|
-
|
|
970
|
-
<details>
|
|
971
|
-
<summary>โ ๏ธ <code>harness rm</code> โ checklist before deleting</summary>
|
|
972
|
-
|
|
973
|
-
The whole point of the ratchet is **one-direction accumulation**. Deleting rules casually means the same mistakes return.
|
|
974
|
-
|
|
975
|
-
- **Rule too broad, blocking valid cases?** โ โ delete โ
narrow the condition (e.g. `"no hardcoded values"` โ `"no hardcoded values outside tests"`)
|
|
976
|
-
- **Rule too narrow, almost never fires?** โ โ delete โ
leave it (zero cost)
|
|
977
|
-
- **Genuinely wrong?** โ โ
delete then
|
|
978
|
-
|
|
979
|
-
An auto `.bak` is kept, but **the session context that earned the rule its place is not recoverable.**
|
|
980
|
-
</details>
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
## ๐ฆ compact-window โ pin where a 1M session compacts
|
|
984
|
-
|
|
985
|
-
Claude Code compacts when usage approaches `min(autoCompactWindow, model max context)`. On a 1M window, with that value unset, compaction only fires near 800k โ and until then every request re-bills the whole context. **1M is too large; the recommendation is a 400kโ700k band** โ 2โ3.5x a 200k session's headroom for the genuinely large pastes, with the runaway tail cut off.
|
|
986
|
-
|
|
987
|
-
**Anything inside the band is left alone.** 400k is the floor where the saving beats the extra compactions, and long sessions often want more room than that. Only an unset window, or one above 700k, is warned about (a smaller one is a deliberate, more aggressive choice).
|
|
988
|
-
|
|
989
|
-
**200k sessions are never warned** โ their window is already at or below 200k, so the setting cannot change anything.
|
|
990
|
-
|
|
991
|
-
```bash
|
|
992
|
-
sprag compact-window # status (model, window, value, source)
|
|
993
|
-
sprag compact-window set --global # pin 500k (mid-band) in ~/.claude/settings.json
|
|
994
|
-
sprag compact-window set --project # pin it in <root>/.claude/settings.json
|
|
995
|
-
sprag compact-window set --global --value 600k # explicit value (100kโ1M)
|
|
996
|
-
sprag compact-window off | on # toggle the warning
|
|
997
|
-
```
|
|
998
|
-
|
|
999
|
-
- On a 1M model with the value unset or above 700k, the statusline shows `๐
ทโ compact-window?` and the session briefing hands the model the exact registration command.
|
|
1000
|
-
- Scope (`--global`/`--project`) is **required** for `set` โ a global settings file is never edited on a guess.
|
|
1001
|
-
- Every other key in `settings.json` is preserved and a `.bak` is written first. Malformed JSON aborts the write untouched.
|
|
1002
|
-
- An exported `CLAUDE_CODE_AUTO_COMPACT_WINDOW` beats settings.json; `set` detects that and says so.
|
|
1003
|
-
|
|
1004
|
-
## ๐ route-scan โ "this recurring task could run on a cheaper tier"
|
|
1005
|
-
|
|
1006
|
-
Finds the easy work your expensive model (opus/fable) keeps redoing in your session logs and proposes **haiku/sonnet delegation rules**. Fully local, zero token cost.
|
|
1007
|
-
|
|
1008
|
-
- **T2 โ haiku**: lookups, pasted-screen Q&A, simple runs โ zero errors, near-zero mutation
|
|
1009
|
-
- **T1 โ sonnet**: build pipelines, status checks โ few mutations, โค1 error
|
|
1010
|
-
- **T0 stays**: repeated errors, heavy mutation, design/analysis โ the session model keeps it
|
|
1011
|
-
|
|
1012
|
-
Three design pillars:
|
|
1013
|
-
1. Difficulty is judged by **outcome, not text guessing** โ tool errors, mutating tool calls, output tokens
|
|
1014
|
-
2. Thresholds **auto-calibrate to your own 14-day distribution** โ fixed constants drift with workload
|
|
1015
|
-
3. Promoted rules live in a tool-owned file (`.claude/ratchet-model.md`) that **refreshes itself every scan**, and a `โ rule-health` flag fires when a delegated category's error rate climbs โ rules report their own staleness
|
|
1016
|
-
|
|
1017
|
-
```bash
|
|
1018
|
-
sprag route-scan # scan (24h cache) + tiered candidates
|
|
1019
|
-
sprag harness promote R1 --project # promote candidate R1 to a model-fitting rule
|
|
1020
|
-
sprag route-scan dismiss 1 # not interested โ won't resurface
|
|
1021
|
-
sprag route-scan rules # list model-fitting rules (rm <N> to remove)
|
|
1022
|
-
sprag route-scan savings # the savings ledger โ which rule moved work off which model, onto which
|
|
1023
|
-
```
|
|
1024
|
-
|
|
1025
|
-
Dig deeper: **tier criteria & research evidence** โ [docs/TIER_CRITERIA.md](./docs/TIER_CRITERIA.md) (Korean) ยท **rule-file mechanics, scan triggers, subagent setup** โ [docs/ROUTE_SCAN.md](./docs/ROUTE_SCAN.md) (Korean + English)
|
|
1026
|
-
|
|
1027
|
-
### Behind a gateway (Bedrock / LiteLLM)
|
|
1028
|
-
|
|
1029
|
-
Through a corporate gateway the transcript records an inference-profile ARN where the model id belongs. That string says nothing about `opus` or `haiku`, so older versions read every session as Sonnet โ which made **T1 (โsonnet) rules unreachable and zeroed the savings figures**.
|
|
1030
|
-
|
|
1031
|
-
Since v3.10.0 the profile id is mapped back to a role (main, opus, sonnet, haiku) and then to the alias your `ANTHROPIC_DEFAULT_*_MODEL` variables declare. The mapping is learned by joining each parent `Task` call to the subagent run it spawned via `toolUseId`. Below three observations, or when the role votes agree less than 80% of the time, the id stays `unknown` and drops out of the delegation aggregate rather than being guessed at.
|
|
1032
|
-
|
|
1033
|
-
For environments the learner cannot reach, write the mapping yourself in `<userDataDir>/profile-map.json`. Account id and region may be wildcarded:
|
|
1034
|
-
|
|
1035
|
-
```jsonc
|
|
1036
|
-
{
|
|
1037
|
-
"modelAliases": {
|
|
1038
|
-
"arn:aws:bedrock:*:*:application-inference-profile/<PROFILE_ID>": "claude-opus-5",
|
|
1039
|
-
"prod-large": "claude-opus-5", // house aliases map the same way
|
|
1040
|
-
"team-*": "claude-haiku-4-5"
|
|
1041
|
-
}
|
|
1042
|
-
}
|
|
1043
|
-
```
|
|
1044
|
-
|
|
1045
|
-
**Map house aliases that carry no family name** (`prod-large`, `team-fast`) here too. Shapes that keep the family name are recognized as-is โ Bedrock (`anthropic.claude-opus-4-5-v1:0`), Vertex (`claude-opus-4-5@20251101`), and the 1M suffix (`claude-sonnet-4-5[1m]`) โ but an alias without one cannot be priced. Rather than report a wrong figure, routing-savings **drops those runs from the aggregate** (both sides of the comparison must be recognizable); one line in the table above brings them back.
|
|
1046
|
-
|
|
1047
|
-
That file holds internal identifiers in plain text โ do not commit it. On a direct-API machine it is never created and behaviour is unchanged.
|
|
1048
|
-
|
|
1049
|
-
## ๐ฑ seed: delegation that works from the first session
|
|
1050
|
-
|
|
1051
|
-
The model-fitting ratchet (`ratchet-model.md`) **starts empty.** A rule exists only after route-scan has seen the same kind of work recur in your own logs and you have approved that candidate. So a fresh install delegates nothing, and keeps delegating nothing for days โ precisely the stretch where the savings would matter most.
|
|
1052
|
-
|
|
1053
|
-
`seed` fills that gap from presets bundled with the package.
|
|
1054
|
-
|
|
1055
|
-
| Presets | What they cover | File |
|
|
1056
|
-
|---|---|---|
|
|
1057
|
-
| 9 model-fitting | running commands, lookup, status checks, questions about pasted logs, read-and-summarize โ each with a T2 (haiku) and a T1 (sonnet) rule | `presets/model-rules.json` |
|
|
1058
|
-
| 6 ratchet | general-purpose rules promoted from mistakes that actually recurred | `presets/ratchet-rules.json` |
|
|
1059
|
-
|
|
1060
|
-
**How they get registered:** in the first session after an install or upgrade, the SessionStart hook hands the pending presets to the model, which walks the user through them **one at a time**. Each answer runs one of these immediately:
|
|
1061
|
-
|
|
1062
|
-
```bash
|
|
1063
|
-
sprag seed # pending presets + recorded answers
|
|
1064
|
-
sprag seed accept <id> --global|--project # register one (scope required)
|
|
1065
|
-
sprag seed accept all --global # when the user says "register them all"
|
|
1066
|
-
sprag seed skip <id> # decline โ never offered again
|
|
1067
|
-
sprag seed reset # clear the answers and offer everything again
|
|
217
|
+
๐จ 5H โโโโโโ 94% ๐ 12:36 ยท ๐
ท 5/5 ยท ๐ค Opus 5 ยท ๐ง Cache hit 98.8% ยท โณ Cache expires 59:46 ยท ๐
weekly โโโโโโ 38% ยท ๐ต Sep $42 ยท ๐ฆ Ctx 47% of 1M
|
|
1068
218
|
```
|
|
1069
219
|
|
|
1070
|
-
|
|
1071
|
-
- A preset is withheld when you already approved a rule of the same shape (same tier and category).
|
|
1072
|
-
- A seeded rule **does not pass someone else's statistics off as yours.** It is recorded as `preset (curated)` until a scan measures real firings and delegations, and then those numbers replace it. If its delegated error rate crosses the threshold it gets the same review flag as any other rule.
|
|
1073
|
-
- The scope must be stated as `--global` or `--project`. The hook environment is non-TTY, so the CLI cannot ask โ the model confirms with the user and passes the flag.
|
|
1074
|
-
|
|
1075
|
-
## ๐ฐ๐ท Korean writing guidance
|
|
1076
|
-
|
|
1077
|
-
Injects guidance that corrects how Claude writes Korean (dropped sentence parts, noun-stopped sentences, translationese, em-dash overuse) **once per session.**
|
|
1078
|
-
|
|
1079
|
-
```bash
|
|
1080
|
-
sprag korean on # on, for every project
|
|
1081
|
-
sprag korean status # state, cost, provenance
|
|
1082
|
-
sprag korean show # print the guidance itself
|
|
1083
|
-
sprag korean off # off
|
|
1084
|
-
```
|
|
1085
|
-
|
|
1086
|
-
Claude Code's output styles can do the same thing, but an output style is **a single global slot**: turning it on takes that slot away from anything else and has to be configured per machine. This ships the guidance inside the package and delivers it through the SessionStart hook that is already installed, so it **applies wherever the CLI is installed and leaves the output-style slot free.** It survives `/clear`, because the hook fires again.
|
|
1087
|
-
|
|
1088
|
-
Cost is **~1.5k tokens per session, injected once at session start rather than per turn**, and covered by the prompt cache from the second request on. When it is on, a `โ๏ธ` chip appears in the statusline.
|
|
1089
|
-
|
|
1090
|
-
### Before and after
|
|
1091
|
-
|
|
1092
|
-
From a real pipeline (yaml-sns-agent), where a Slack bot shells out to `claude -p` to investigate the repository and answers in a thread. The guidance was toggled off and then on, with the same question both times: "explain in three Korean sentences how to narrow down a render failure."
|
|
1093
|
-
|
|
1094
|
-
**Before** (guidance off)
|
|
1095
|
-
|
|
1096
|
-
> ๋ ๋ ์คํจ ์์ธ ์ขํ๊ธฐ 3๋จ๊ณ: ๋จผ์ `hn:still --check`๋ก ์คํธ์ด ๋ช
์ธ๋ณด๋ค ์ต์ ์ธ์ง(FRESH/STALE) ํ์ธ โ STALE์ด๋ฉด ์ฌ์์ฑ ์ ํด์ ์ ์์ฐ์ผ๋ก ๋ ๋ ์๋ํ ๊ฒ ์์ธ. ๋ค์ caption-blocks๊ฐ ์ต์ ๋๋ ์ด์
๊ณผ ๋จ์ด์ด ์ผ์นํ๋์ง ์ง์ ๋์กฐ โ TTS ์ฌ์์ฑ ํ blocks ์ฌ์์ฑ ๋น ์ง๋ฉด ์๋งยท์์ฑ ์ด๊ธ๋ ๋ ๋ ๊นจ์ง.
|
|
1097
|
-
|
|
1098
|
-
**After** (guidance on)
|
|
1099
|
-
|
|
1100
|
-
> ๋จผ์ `hn:still --check` ๋๋ ค ์คํธ์ด ๋ช
์ธ๋ณด๋ค ์ต์ ์ธ์ง ํ์ธํ๋ค. STALE์ด๋ฉด ์ฌ์์ฑ ์ ํด์ ์๊ธด ๋ฌธ์ .
|
|
1101
|
-
>
|
|
1102
|
-
> ๋ค์ caption-blocks๊ฐ captions.json ๋จ์ด์ด๊ณผ ์ผ์นํ๋์ง ๋ณธ๋ค. ๋ด๋ ์ด์
์ฌTTS ํ blocks ์ฌ์์ฑ ๋น ์ง๋ฉด ์ ์๋ง์ด ์ ์์ฑ ์์ ๋ฌ๋ค.
|
|
1103
|
-
|
|
1104
|
-
Three things change. Clauses chained with em dashes become separate sentences, so one sentence carries one fact. Noun-stopped phrases (ํ์ธ, ๋์กฐ, ๋ ๋ ๊นจ์ง โ "check", "compare", "render breaks") become predicates (ํ์ธํ๋ค, ๋ณธ๋ค, ๋ฌ๋ค), which makes it explicit that these are steps to take. And the particles come back where they had been dropped, so subject and object are legible on the first read.
|
|
1105
|
-
|
|
1106
|
-
The technical content is identical in both. The guidance touches sentence construction only, not judgement or accuracy: the answer does not change, it just stops needing a second read. In a channel people scroll through, that difference cuts follow-up questions โ and the tokens those follow-ups would have cost.
|
|
1107
|
-
|
|
1108
|
-
### The supplement: cohesion and conservative correctness rules
|
|
1109
|
-
|
|
1110
|
-
The vendored fluent-korean text ships unmodified; everything collected since lives in a separate supplement (`presets/korean-style/supplement.md`) appended to the same injection. It was compiled conservatively โ only clauses that are nearly always an improvement, sourced from the National Institute of Korean Language's public-language guidelines, the Kubernetes Korean localization guide, and three peer-reviewed studies on text cohesion in Korean writing.
|
|
1111
|
-
|
|
1112
|
-
It adds three layers:
|
|
1113
|
-
|
|
1114
|
-
- **Translationese**: double passives, Japanese-derived calques, `~์ ์์ด์`, possession-verb renderings of English *have*. The machine-checkable ones also run in the write-time lint (below).
|
|
1115
|
-
- **AI-writing tics**: automatic intensifiers ("๋ค์ํ", "ํต์ฌ์ ์ธ"), signpost sentences, rhetorical question-then-answer, unconditionally upbeat endings.
|
|
1116
|
-
- **Cohesion** โ how sentences connect, which no regex can check. The research finding that shapes this section: surface connectives (conjunctions, demonstratives) correlate *negatively or not at all* with judged text quality, while elaboration โ the next sentence picking up and unpacking what the previous one introduced โ is the only connection type with a positive correlation. So the guidance says: when a transition feels rough, fix the information order (given before new), don't add a connective.
|
|
1117
|
-
|
|
1118
|
-
**Most of the cohesion layer is not Korean-specific.** Given-before-new ordering (the "given-new contract"), one clear referent per pronoun, keeping one subject per paragraph, bridging sentences instead of leaping, and merging choppy repetitive sentences into a modifier-plus-core structure apply to English prose the same way โ the studies happen to be about Korean learners, but the principles they validate are the standard cohesion model from text linguistics. If you write English deliverables with Claude, run `sprag cohesion on` โ it injects exactly those five rules as a standalone English block (~0.5k tokens per session), no Korean feature required. While `korean on` is active the block is suppressed, because the Korean supplement already carries the same rules.
|
|
1119
|
-
|
|
1120
|
-
A final subsection lists what must **not** be "corrected": settled domain terms, formal register, and verbatim quotations โ every lint finding is a request to confirm, not a verdict.
|
|
1121
|
-
|
|
1122
|
-
### The write-time check (v3.24.0)
|
|
1123
|
-
|
|
1124
|
-
Injecting the guidance once at session start turned out to be half the job. The model reads it, then writes dozens of files over the next hours with nothing re-reading the output. Sessions with the guidance active still shipped violations into documents, and it surfaced only when a human read the finished artifact. An August 2026 fix reworded the scope sentence to address this; it recurred, because rewording an instruction does not add a checkpoint.
|
|
1125
|
-
|
|
1126
|
-
From v3.24.0 `korean on` also installs a PostToolUse hook. It opens the file the model just wrote, runs the clauses a machine can decide, and hands any findings back. The file is already saved, so nothing is lost โ the model fixes it on the spot.
|
|
1127
|
-
|
|
1128
|
-
```bash
|
|
1129
|
-
sprag korean lint block # default: findings are handed back as blocking feedback
|
|
1130
|
-
sprag korean lint warn # print findings, do not block
|
|
1131
|
-
sprag korean lint off # disable the check
|
|
1132
|
-
|
|
1133
|
-
sprag korean lint scope all # default: every text file the session writes
|
|
1134
|
-
sprag korean lint scope prose # documents only
|
|
1135
|
-
|
|
1136
|
-
sprag korean lint docs/*.md # check files already on disk
|
|
1137
|
-
```
|
|
1138
|
-
|
|
1139
|
-
Checked: 15 figurative phrases, translationese markers, separators (`โ`ยท`ใ
ก`ยท`|`), three or more `์` particles in one phrase, a period after a nominal ending, and since v3.42.7 two consecutive sentences closing on the identical predicate. Clauses that genuinely need judgement โ dropped sentence elements, word choice, near-miss repetition โ stay with the guidance text.
|
|
1140
|
-
|
|
1141
|
-
Bash writes are checked too (v3.42.7). A heredoc, a `tee`, or a `sed -i` puts Korean on disk exactly like Write does, and a subagent handed Bash but not Write reaches for `cat > file` first โ so leaving Bash off the matcher exempted every artifact produced by delegated work. Only redirection targets are recognised, never the command body, so Korean inside an `echo` is not mistaken for prose.
|
|
1142
|
-
|
|
1143
|
-
A file that must quote the banned forms โ a fixture for this checker, a style report โ opts out with one `korean-lint: off` line anywhere in it.
|
|
1144
|
-
|
|
1145
|
-
The default `all` scope covers code comments, UI strings, subtitles, templates, and build output, not just documents. The vendored guidance exempts comments, but comments are read by people and generated artifacts (PDF, HTML) are assembled from those strings, so exempting them reopens the exact gap that was reported. Only installed dependencies, VCS internals, lockfiles, and binary or image files are skipped; `dist/` and `build/` are checked. `korean lint scope prose` restores the narrow reading.
|
|
1146
|
-
|
|
1147
|
-
The scope sentence in the injected guidance is generated from the same setting, so the model is never told one rule while being corrected against another.
|
|
1148
|
-
|
|
1149
|
-
### The encoding rule that ships with it (v3.23.2)
|
|
1150
|
-
|
|
1151
|
-
Alongside the writing guidance, one more line is injected: **non-ASCII strings in tool-call parameters must be written as literal UTF-8, never as `\uXXXX` unicode escapes.**
|
|
1152
|
-
|
|
1153
|
-
When the model puts Korean into a Write or Edit parameter as escapes, those escapes are sometimes not decoded into code points at all: the literal text `ํ` lands in the file. The artifact carries mojibake, and the model keeps editing on top of it without noticing that what it wrote and what the file holds have diverged. Not writing escapes in the first place removes the path entirely, so the rule blocks the input instead of repairing the output.
|
|
1154
|
-
|
|
1155
|
-
This line lives in sprag's own framing paragraph, not in the vendored fluent-korean text. It governs encoding rather than style, and the vendored wording is kept unmodified. For the same reason it carries no exceptions, unlike the style rules that skip code and commit messages. It adds roughly 60 tokens per session.
|
|
1156
|
-
|
|
1157
|
-
> **Evidence**
|
|
1158
|
-
> The same failure is reported against Claude Code: [#12417, unicode handling regression](https://github.com/anthropics/claude-code/issues/12417) and [#26141, Edit silently corrupting unicode](https://github.com/anthropics/claude-code/issues/26141).
|
|
1159
|
-
|
|
1160
|
-
### Asked at install time
|
|
1161
|
-
|
|
1162
|
-
The install **prints what the guidance changes, its per-session cost and its source, then asks.** A Korean system locale (`ko_KR` and friends; on macOS the system setting is checked too) makes the question default to yes; anything else defaults to no, so users who never write Korean are not billed 1.5k tokens a session. The locale is only a default, so an English-locale machine used for Korean work can still turn it on right there.
|
|
1163
|
-
|
|
1164
|
-
Installs with nobody attached โ npm `postinstall`, CI, piped stdin โ skip the question and apply the locale default, because a blocked prompt hangs the install. In that case, if the locale is not Korean the setting is **left undecided rather than recorded**, so a later run at a terminal still gets to ask. Use `--yes` or `--no-input` to force the non-interactive path, or `CTS_NO_KOREAN=1` to skip the feature entirely. **Once you have turned it on or off yourself, that choice sticks โ an upgrade never overrides it.**
|
|
1165
|
-
|
|
1166
|
-
> **Source and license**
|
|
1167
|
-
> The guidance text comes from [fluent-korean](https://github.com/snflkd/fluent-korean). Copyright (c) 2026 snflkd, MIT License.
|
|
1168
|
-
> The wording is unmodified; only the output-style frontmatter was removed. The full license ships with the package at `presets/korean-style/LICENSE-fluent-korean`.
|
|
1169
|
-
|
|
1170
|
-
## ๐ doc2md โ documents become Markdown before the model reads them
|
|
1171
|
-
|
|
1172
|
-
`Read` a pptx, xlsx, pdf or docx and the raw bytes go into the context window, where the model cannot read them. This intercepts that `Read`, converts the file once, and hands over the Markdown instead.
|
|
1173
|
-
|
|
1174
|
-
**This is opt-in.** Installing the CLI does not turn it on: both commands below are required, and a registered hook with no converter behind it does nothing at all.
|
|
1175
|
-
|
|
1176
|
-
Three situations, three different interception points:
|
|
1177
|
-
|
|
1178
|
-
| Situation | Where it is caught |
|
|
1179
|
-
|---|---|
|
|
1180
|
-
| A document path typed in the prompt (`@path`, quoted, or relative) | `UserPromptSubmit`: converted, and the conversion's path is handed back as context |
|
|
1181
|
-
| A document opened with `Read` mid-task | PDFs are caught by `PreToolUse(Read)`. pptx/xlsx/docx/fig are not: Claude Code refuses them as binary *before* any hook runs, so the session-start note tells the model to run `doc2md <path>` instead |
|
|
1182
|
-
| A document attached to the message | **Not catchable.** No hook event receives attachment content. The session-start note has the model ask for a path next time |
|
|
1183
|
-
|
|
1184
|
-
That second row is measured, not assumed: a `.pdf` Read fires the hook, and a `.pptx` Read in the same session leaves no hook log entry at all.
|
|
1185
|
-
|
|
1186
|
-
```bash
|
|
1187
|
-
sprag doc2md on # register the hooks (the converter installs itself)
|
|
1188
|
-
sprag doc2md # check converter + hook registration
|
|
1189
|
-
sprag doc2md report.pptx # convert by hand and see the result
|
|
1190
|
-
sprag doc2md install-converter # only to get the install out of the way early
|
|
1191
|
-
```
|
|
1192
|
-
|
|
1193
|
-
**The converter installs itself.** Any rollout step a person has to be told about is a step some of them skip, so the converter installs in the background the moment a document first shows up, and converts as soon as it is ready. Measured: about 30s for the first document (15s install plus markitdown's first import), then 3.7s for a new document and 0.1s on a cache hit. The `.fig` parser installs in half a second on the first Figma file.
|
|
1194
|
-
|
|
1195
|
-
It installs on first use rather than at `install` time: the venv is 47MB, and someone who never opens a document should not pay for it. Set `CTS_DOC2MD_NO_AUTOINSTALL=1` to turn the automatic install off.
|
|
1196
|
-
|
|
1197
|
-
**Python 3.10+ is required** โ markitdown's own floor, and macOS still ships 3.9 as `/usr/bin/python3`. The venv is built on an interpreter chosen by version rather than by PATH order. Built on 3.9, pip resolves markitdown to a 2019 placeholder release (0.0.1a1): the install looks like it worked and every conversion then dies at import. This was found by walking into it. When nothing on the machine is new enough, the message points at `brew install python` instead of at an install command that cannot succeed.
|
|
1198
|
-
|
|
1199
|
-
The converter goes into a venv this tool owns (`<state dir>/doc2md-venv`): no system interpreter is touched, and uninstalling the CLI takes it along. An existing markitdown on `uv tool` or `PATH` is preferred over building a new one.
|
|
1200
|
-
|
|
1201
|
-
Conversion is [markitdown](https://github.com/microsoft/markitdown). Slide numbers, heading levels, tables, speaker notes and per-sheet headings all survive, and non-Latin text comes through intact.
|
|
1202
|
-
|
|
1203
|
-
Several things it deliberately does not do:
|
|
1204
|
-
|
|
1205
|
-
- **Images are not converted.** markitdown returns nothing for them, and OCR misread resource names in testing (`c5.xlarge` as `c.xlarge`). In a document where those names *are* the content, wrong text is worse than none. The model reads images natively anyway.
|
|
1206
|
-
- **A missing converter never fails silently.** The install command is shown once, then the original `Read` proceeds untouched. Repeating the notice on every read would be its own nuisance; saying nothing is how a broken converter hides. Run `doc2md` with no arguments to see the converter and hook registration together.
|
|
1207
|
-
- **Conversions never land in your project.** They go under the tool's own state directory with mode `0700`, so there is nothing to add to `.gitignore`. Filenames matching payroll/contract/secret patterns are skipped entirely.
|
|
1208
|
-
- **Zip bombs are refused.** pptx/xlsx/docx are zip containers: the declared sizes are checked first, and since those are written by whoever built the file, the real decompressed bytes are counted against a ceiling too.
|
|
1209
|
-
- **Spreadsheets are capped by rows, not bytes.** Conversion time tracks row count (measured: a 6.3MB PDF in 0.9s, a 5.8MB workbook in 47.75s). Past 50,000 rows only the head is converted, and **the truncation and the true row count are both stated** in what the model is told.
|
|
1210
|
-
|
|
1211
|
-
### What a conversion saves
|
|
1212
|
-
|
|
1213
|
-
Every conversion is stamped with a provenance header: which original, when, how many tokens. Savings show up on the statusline's own `๐ Doc2md saved` line.
|
|
1214
|
-
|
|
1215
|
-
The baseline is what you would have done without a converter, and that differs by format. Both were measured on 2026-09-06.
|
|
1216
|
-
|
|
1217
|
-
**PDF is priced against attaching it.** The same one-line prompt was sent through `claude --print --input-format stream-json` with and without the file as a document block. The control turn cost 42,204 tokens, twice, to the token.
|
|
1218
|
-
|
|
1219
|
-
| Attached file | Size | Extra tokens | Per page |
|
|
1220
|
-
|---|---|---|---|
|
|
1221
|
-
| Rรฉsumรฉ PDF | 7 pages | +20,537 | 2,934 |
|
|
1222
|
-
| Rรฉsumรฉ PDF | 5 pages | +12,709 | 2,542 |
|
|
1223
|
-
|
|
1224
|
-
An attached PDF is read whole, but every page costs 2,500โ2,900 tokens against 5,531 for the conversion. The coefficient used is 2,500 per page โ below both measurements, so the figure understates rather than flatters.
|
|
1225
|
-
|
|
1226
|
-
**pptx/xlsx/docx are priced against unpacking the container.** These never reach the model as attachments at all: the same probe on a docx added 78 tokens and the model replied that it had no file, and `Read` refuses the format outright. What you actually do without a converter is unzip the archive and read its XML, where tags and style attributes outweigh the words.
|
|
1227
|
-
|
|
1228
|
-
| Original | Body XML | Conversion | Ratio |
|
|
1229
|
-
|---|---|---|---|
|
|
1230
|
-
| Deck, pptx (31.8MB) | ~540,429 tokens | ~22,610 tokens | 23.8ร |
|
|
1231
|
-
| Rรฉsumรฉ, docx (189KB) | ~79,621 tokens | ~1,684 tokens | 47.3ร |
|
|
1232
|
-
|
|
1233
|
-
This baseline is measured per file from the real XML size, not applied as a per-format ratio. `.xls` is not a zip container and has no markup to measure, so it claims nothing.
|
|
1234
|
-
|
|
1235
|
-
### Figma `.fig` converts too
|
|
1236
|
-
|
|
1237
|
-
Planning documents are moving from PowerPoint to Figma, so the same hook catches `.fig`. A `.fig` is a zip, but the `canvas.fig` inside it is Figma's private binary (kiwi format), which markitdown cannot open โ so this one format is converted in Node with [openfig-core](https://github.com/OpenFig-org/openfig-core) (MIT). `doc2md install-converter` places it beside markitdown in the tool's state directory; the package itself still ships zero dependencies.
|
|
1238
|
-
|
|
1239
|
-
The result is an outline: pages and frames become headings, text nodes become body lines, and shapes are counted rather than listed โ in a planning document the words are the content, and two hundred `Rectangle 173` lines would drown them. A file with no text at all is refused rather than dressed up as an empty document.
|
|
1240
|
-
|
|
1241
|
-
Verified against real files: a community Bootstrap UI kit (8.1MB, 4,155 nodes, 1,312 of them text) and a 52MB Tailwind kit, each converting in under a second. Both `.fig` vintages parse โ the current zip container and the older bare fig-kiwi stream.
|
|
1242
|
-
|
|
1243
|
-
**`.fig` saves the most of any format.** Unlike the Office containers, `Read` does not refuse a `.fig`: the extension means nothing to it, so it pulls the binary in as text and the context window fills with tokenised noise. Measured against the same 42,760-token control:
|
|
1244
|
-
|
|
1245
|
-
| File | Size | Extra tokens for a Read | Conversion |
|
|
1246
|
-
|---|---|---|---|
|
|
1247
|
-
| plan.fig | 26KB | +44,195 | 100 tokens |
|
|
1248
|
-
| bootstrap-kit.fig | 8.1MB | +43,994 | 18,397 tokens |
|
|
1249
|
-
|
|
1250
|
-
Two files three hundred times apart in size cost the same, because Read truncates long before the file ends โ you pay for a whole document and receive a fraction of one. The baseline is therefore a flat 44,000 tokens. For comparison, the same probe on a pptx cost +317 tokens and on a docx +185: a refusal message, and nothing else.
|
|
1251
|
-
|
|
1252
|
-
#### Why the baseline does not scale with file size
|
|
1253
|
-
|
|
1254
|
-
A baseline has to be what would actually have been spent without the converter. Intuition says a bigger file burns more, but the `Read` tool has a cap (2,000 lines by default, plus a per-line character limit), and a binary file hits it almost immediately: even the 26KB file was already truncated, which is why two files 300ร apart came out 201 tokens apart. Had the 8.1MB file gone in whole it would have been millions of tokens โ money nobody could have spent, since it does not fit in a 200k context window. Claiming to have saved unspendable money is flattery, not measurement.
|
|
1255
|
-
|
|
1256
|
-
The same principle runs through every baseline here:
|
|
1257
|
-
|
|
1258
|
-
- **`.fig`, flat 44,000** โ set below both measurements (44,195 and 43,994). A model could burn size-proportional tokens by re-Reading at successive offsets, but one Read is what a sane agent does once the bytes turn out to be binary noise, so one Read is the honest counterfactual.
|
|
1259
|
-
- **PDF, 2,500 per page** โ below both measured values (2,542 and 2,934).
|
|
1260
|
-
- **Office formats, the file's actual XML size** โ the one case where proportional is right, because a person really does end up reading that XML; it is measured per file rather than applied as a ratio.
|
|
1261
|
-
|
|
1262
|
-
The common rule: wherever an estimate and a measurement diverge, the lower number wins. A figure the user can trust is worth more than one that flatters the tool.
|
|
1263
|
-
|
|
1264
|
-
### Editing a document: copy, then script
|
|
1265
|
-
|
|
1266
|
-
Conversion is one-way โ editing the cached `.md` changes nothing in the source. The hook refuses `Edit`/`Write` on both the cache and the original binary, and points at the right path instead: copy the original, edit the copy with a script, re-convert the copy to verify.
|
|
1267
|
-
|
|
1268
|
-
`install-converter` puts the editing libraries (python-pptx, python-docx, openpyxl) in the same venv, so a structural request like "swap the chart on slide 23 for a line chart" is a short script the agent writes on the spot. `.fig` edits go through openfig-core, which encodes as well as parses.
|
|
1269
|
-
|
|
1270
|
-
All four formats were exercised end to end on 2026-09-06: 10 docx run replacements plus three consecutive re-saves, a pptx bar-to-line chart swap with an added data point, xlsx value edits and a new row, and a fig text edit with re-encode and re-parse. In every case the original was byte-identical afterwards and the re-converted copy showed the change. One caveat: removing a chart shape from a pptx leaves the old chart XML part orphaned โ PowerPoint ignores it, but delete the part and its rels for a clean file. Charts and images never appear in a conversion, so visual edits must be confirmed in the application itself.
|
|
1271
|
-
|
|
1272
|
-
### DRM-wrapped documents
|
|
1273
|
-
|
|
1274
|
-
Encryption and DRM are different problems with different answers. Enterprise DRM (Fasoo, MarkAny, SoftCamp and the like) does not password a document โ it wraps the whole file, and only processes the vendor's agent has whitelisted ever see plaintext. Python is not one of them, so what sits on disk is ciphertext behind a vendor header, and **no password will open it.**
|
|
1275
|
-
|
|
1276
|
-
The first bytes decide which story to tell: a zip header means a truncated download, an OLE container means a password, and neither means the file is not that format at all.
|
|
1277
|
-
|
|
1278
|
-
```
|
|
1279
|
-
โ bad-archive: File is not a zip file โ download it again
|
|
1280
|
-
โ encrypted: password-protected Office file โ ask for an unlocked copy
|
|
1281
|
-
โ drm-protected: DRM-wrapped file (FASOO) โ ask for a copy released from DRM
|
|
1282
|
-
```
|
|
1283
|
-
|
|
1284
|
-
Vendor names are matched only to say which client to go to; the classification stands without recognising the vendor. PDFs are judged the same way through their public DRM security-handler names (FOPN_foweb, EBX_HANDLER, Adobe.APS).
|
|
1285
|
-
|
|
1286
|
-
### Locked documents, and Windows
|
|
1287
|
-
|
|
1288
|
-
**A password-protected document is a state, not an error.** Office encrypts by wrapping the package in an OLE compound file rather than a zip, so opening one as a zip used to report "not a zip file" โ which reads as a broken download and sends the user after the wrong problem. It is now identified before conversion:
|
|
1289
|
-
|
|
1290
|
-
```
|
|
1291
|
-
โ encrypted: password-protected Office file (OLE-wrapped)
|
|
1292
|
-
โ encrypted: password-protected PDF
|
|
1293
|
-
```
|
|
1294
|
-
|
|
1295
|
-
The model is told to ask for an unlocked copy. This tool never asks for or stores a password, and never blocks the original `Read`, so work continues either way. A PDF that merely restricts printing still opens and still converts โ checked against a false positive โ and a legacy `.xls`, which is an OLE file by design, is not mistaken for an encrypted one.
|
|
1296
|
-
|
|
1297
|
-
**Windows is supported.** For teams with Windows machines:
|
|
1298
|
-
|
|
1299
|
-
- The Python search uses the `py -3` launcher. `python3` is rarely on PATH there, and a bare `python` may be the Store alias stub that opens a web page instead of running anything. Venv interpreters are looked for at `Scripts\python.exe`.
|
|
1300
|
-
- The `.fig` parser installs through `npm.cmd` via the shell, and the package spec dropped its caret (`openfig-core@0.4.x`): in cmd.exe `^` is the escape character and never reaches npm.
|
|
1301
|
-
- The background install and every child process set `windowsHide`, so no console window appears in the middle of someone's prompt.
|
|
1302
|
-
|
|
1303
|
-
`sprag doc2md --clean` empties the conversion cache; `doc2md off` removes the hook. Removal filters for this tool's own entry, so anything else you registered under `PreToolUse` stays.
|
|
1304
|
-
|
|
1305
|
-
## ๐ Behind a gateway (Bedrock / Vertex)
|
|
1306
|
-
|
|
1307
|
-
A gateway reports the cache-creation total but never the 5m/1h split. That left the tool unable to tell "nothing cached yet" from "this provider does not say", and the fallback assumed an hour โ for a window that is really five minutes on Bedrock, overstating it twelvefold.
|
|
1308
|
-
|
|
1309
|
-
Since v3.26.0 the gateway is detected from the model ids in the transcript, which fixes:
|
|
1310
|
-
|
|
1311
|
-
- The countdown falls back to 5 minutes, labelled `5m?`. Three grades of certainty get three labels: measured (`5m`), inferred (`5m?`), unknown (`?`).
|
|
1312
|
-
- In a 5-minute bucket the countdown colour follows absolute time rather than a percentage. 30% of five minutes is 90 seconds, and green there promised comfort that was not there.
|
|
1313
|
-
- The `โ 5m TTL` warning finally reaches these users โ with different advice, since no subscription plan changes a gateway's TTL.
|
|
1314
|
-
- `Extra cost if 5m-only` is only asked of sessions that have 1h writes to lose. Elsewhere the arithmetically honest `+$0` read as an endorsement of the bucket you are already stuck in.
|
|
1315
|
-
- Delegated runs dropped for an unpriceable model id show as `๐ N unresolved` instead of nothing, which used to be indistinguishable from never having delegated.
|
|
1316
|
-
- Environment variables set to a `foundation-model` ARN now resolve. An opaque `application-inference-profile` id still does not: guessing at it is how wrong prices enter the ledger.
|
|
1317
|
-
|
|
1318
|
-
If the detection is wrong, pin it with `sprag mode ttl=5m` (or `ttl=1h`). An explicit value outranks the measurement.
|
|
1319
|
-
|
|
1320
|
-
### LiteLLM: your key budget stands in for the missing 5h/7d caps (v3.35.0)
|
|
1321
|
-
|
|
1322
|
-
Behind a LiteLLM proxy (Bedrock and friends), Claude Code's stdin never carries `rate_limits`, so the `โฆ current` / `๐
weekly` gauges simply do not exist. LiteLLM does track per-key budgets, so the statusline draws a budget gauge in their place.
|
|
1323
|
-
|
|
1324
|
-
- Detection: `ANTHROPIC_BASE_URL` points somewhere other than the official endpoint. The key comes from `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_API_KEY`, or โ when neither is set โ from running the `apiKeyHelper` script in `settings.json`. The helper only runs inside the 5-minute refresh child, never on the render path (v3.43.0).
|
|
1325
|
-
- A 404 from `/key/info` no longer aborts the refresh: custom-auth deployments (Okta JWT and friends) always 404 there, and the budget lives in `/user/info`. Only a failure of both endpoints counts as a failure (v3.43.0).
|
|
1326
|
-
- When the gauge falls back to the internal-user budget it is labeled `budget (user)`. LiteLLM enforces the team-membership limit, which can differ from the user limit by orders of magnitude (v3.43.0).
|
|
1327
|
-
- The proxy is asked via `GET /key/info` and `GET /user/info` โ only the calling key's own data. Renders read a cache file; a detached background process refreshes it every 5 minutes (same shape as the update check), so the statusline never waits on the network.
|
|
1328
|
-
- Budget source priority follows real-world usage: the **team-membership budget** (`team_memberships[].spend` + its linked budget table row) first, then the key's own `max_budget`, then the internal-user budget. Verified against a Dockerized LiteLLM, including memberships whose budget diverges from the team max into a separate budget-table row.
|
|
1329
|
-
- Unlimited keys (no `max_budget`) get no gauge. The `๐ต` monthly-spend segment still shows, since it comes from session logs.
|
|
1330
|
-
- Inspect with `sprag litellm-budget` (gauge with used/remaining amounts), `--json` (raw cache), or `--refresh` (query now).
|
|
1331
|
-
|
|
1332
|
-
One related non-bug: if your session model is already sonnet, a sonnet-delegation (T1) rule can never save anything, because there is no price gap to capture. That is correct, but `route-scan rules` displayed it identically to "no delegations yet", so it now says outright that the rule does not apply at the current default model.
|
|
1333
|
-
|
|
1334
|
-
## Spike issue codes
|
|
1335
|
-
|
|
1336
|
-
| Code | Meaning |
|
|
1337
|
-
|---|---|
|
|
1338
|
-
| `LARGE_INPUT_PER_REQUEST` | single request > 200k input tokens โ per-turn re-billing and cap burn spike |
|
|
1339
|
-
| `LOW_HIT_RATE` | cache hit rate < 50% |
|
|
1340
|
-
| `BUCKET_5M_DOMINANT` | > 70% of cache writes hit the 5m bucket |
|
|
1341
|
-
| `HIGH_OUTPUT_RATIO` | output/input > 0.15 (output is 5ร input price) |
|
|
1342
|
-
| `HIGH_REQUEST_COUNT` | session made 3ร+ your median (tool loop?) |
|
|
1343
|
-
| `FREQUENT_CACHE_REBUILD` | `cache_creation` > `cache_read` |
|
|
1344
|
-
|
|
1345
|
-
Remediation commands are OS-aware (`~/.zshrc` for macOS/Linux/WSL, `setx` for Windows).
|
|
220
|
+
When something is wrong the warning chip leads the line: `๐จ 5H/7D NN%`, `โ Ctx 500k+`, `โ Cache miss`, `โ Input spike`, `โ Output heavy`, `โ Call surge`, `โ Rebuild churn`, `โ 5m TTL`. Say the chip wording inside Claude and the Skill surfaces the root-cause code and the fix. Segment-by-segment meanings live in [the statusline reference](./docs/STATUSLINE.md).
|
|
1346
221
|
|
|
1347
222
|
## Real-world impact โ before/after report
|
|
1348
223
|
|
|
1349
224
|

|
|
1350
225
|
|
|
1351
|
-
|
|
226
|
+
Harness 5/5 + ratchet applied to the author's own Claude Code work, normalized **per user message** (cutoff 2026-05-02, Opus 4.7 pricing):
|
|
1352
227
|
|
|
1353
228
|
| metric | before (7d / 739 msgs) | after (2d / 157 msgs) | ฮ |
|
|
1354
229
|
|---|---:|---:|---:|
|
|
@@ -1357,69 +232,36 @@ harness 5/5 + ratchet applied to the author's own Claude Code work, normalized *
|
|
|
1357
232
|
| assistant turns / message | 9.73 | 8.83 | โ9.2% |
|
|
1358
233
|
| tool calls / message | 5.72 | 5.25 | โ8.2% |
|
|
1359
234
|
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
<details>
|
|
1363
|
-
<summary>Measurement notes โ why cache hit rate isn't included ยท sample caveats</summary>
|
|
1364
|
-
|
|
1365
|
-
- The author is on the Max plan (1-hour cache TTL) with hit rate already converged near ~98%, so little headroom there. **Pro-plan users (5-minute TTL)** likely see hit rate itself rise with the handoff-before-expiry workflow.
|
|
1366
|
-
- Handoff-before-expiry: watch the TTL countdown, run `sprag handoff` just before expiry to dump work state into a markdown brief, start a fresh cache cycle. Same flow handles the 1M warning and cap chips.
|
|
1367
|
-
- โ ๏ธ POST window is only 2 days (157 msgs); statistical confidence is low, and week-to-week topic mix differs, so the tool effect isn't cleanly isolated.
|
|
1368
|
-
</details>
|
|
1369
|
-
|
|
1370
|
-
## Pricing (Jul 2026)
|
|
1371
|
-
|
|
1372
|
-
Per million tokens (USD), as used by the cost estimator:
|
|
1373
|
-
|
|
1374
|
-
| Tier | Models | Input | 5m Write | 1h Write | Read | Output |
|
|
1375
|
-
|---|---|---|---|---|---|---|
|
|
1376
|
-
| `claude-fable-5` | Fable 5 / Mythos 5 | $10 | $12.50 | $20 | $1 | $50 |
|
|
1377
|
-
| `claude-opus-new` | Opus 4.5 / 4.6 / 4.7 / 4.8 | $5 | $6.25 | $10 | $0.50 | $25 |
|
|
1378
|
-
| `claude-opus-legacy` | Opus 4 / 4.1 / 3 | $15 | $18.75 | $30 | $1.50 | $75 |
|
|
1379
|
-
| `claude-sonnet` | Sonnet 3.7 / 4 / 4.5 / 4.6 / 5 | $3 | $3.75 | $6 | $0.30 | $15 |
|
|
1380
|
-
| `claude-haiku-4-5` | Haiku 4.5 | $1 | $1.25 | $2 | $0.10 | $5 |
|
|
1381
|
-
|
|
1382
|
-
Source: [Anthropic pricing docs](https://platform.claude.com/docs/en/about-claude/pricing). Sonnet 5 has an introductory $2/$10 rate through 2026-08-31; the estimator uses the standard sticker. Versions โค 2.16.x priced Fable 5 at the Sonnet tier (~3ร under-estimate) โ upgrade to 2.17.0+.
|
|
1383
|
-
|
|
1384
|
-
### Cache TTL by plan
|
|
1385
|
-
|
|
1386
|
-
| Plan | TTL | Controlled by |
|
|
1387
|
-
|---|---|---|
|
|
1388
|
-
| Max ($100โ200/mo) | **1h auto** | `tengu_prompt_cache_1h_config` flag |
|
|
1389
|
-
| Pro ($20/mo) | **5m fixed** | not configurable |
|
|
1390
|
-
| API key | 5m default (1h via beta header) | `cache_control.ttl` |
|
|
1391
|
-
|
|
1392
|
-
## FAQ
|
|
235
|
+
The same request resolves in fewer round-trips, so first-try success goes up: the effect of PEV and Structured Task forcing one-shot delivery. The post window is only 2 days (157 msgs), so statistical confidence is low and week-to-week topic mix differs.
|
|
1393
236
|
|
|
1394
|
-
|
|
237
|
+
## Commands you will actually use
|
|
1395
238
|
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
Claude Code logs every API call to `~/.claude/projects/<dir>/<session>.jsonl`. This tool dedupes streaming chunks by `requestId` and aggregates `cache_read_input_tokens` / `cache_creation.ephemeral_5m/1h_input_tokens` by day and session.
|
|
1405
|
-
|
|
1406
|
-
Node.js โฅ 18 ยท macOS / Linux / Windows / WSL ยท **zero dependencies**.
|
|
1407
|
-
|
|
1408
|
-
<details>
|
|
1409
|
-
<summary>Known quirks ยท Migration ยท Background</summary>
|
|
239
|
+
| Command | What it does |
|
|
240
|
+
|---|---|
|
|
241
|
+
| `sprag` | Last-1-day diagnostic report |
|
|
242
|
+
| `sprag handoff` | Back work up to markdown before a cap blocks you |
|
|
243
|
+
| `sprag route-scan` | Find delegation candidates in your own history (0 LLM calls) |
|
|
244
|
+
| `sprag route-scan savings` | The routing-savings ledger |
|
|
245
|
+
| `sprag harness check` | Current ๐
ท harness score |
|
|
246
|
+
| `sprag doc2md <file>` | Convert one document to Markdown |
|
|
1410
247
|
|
|
1411
|
-
|
|
248
|
+
Every subcommand, flag and the output-language setting: [command reference](./docs/COMMANDS.md).
|
|
1412
249
|
|
|
1413
|
-
|
|
250
|
+
## Deeper reading
|
|
1414
251
|
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
252
|
+
| Doc | Covers |
|
|
253
|
+
|---|---|
|
|
254
|
+
| [Install](./docs/INSTALL.md) | What the install turns on, what stays manual, how to turn each part off |
|
|
255
|
+
| [Statusline](./docs/STATUSLINE.md) | Segments, warning chips, spike issue codes, update notifications |
|
|
256
|
+
| [Commands](./docs/COMMANDS.md) | Full CLI surface |
|
|
257
|
+
| [Harness](./docs/HARNESS.md) | The five principles, rule promotion, compact-window pinning, seed presets |
|
|
258
|
+
| [route-scan](./docs/ROUTE_SCAN.md) | Tier verdicts, rule-file mechanics, scan triggers, subagent setup |
|
|
259
|
+
| [Tier criteria](./docs/TIER_CRITERIA.md) | Why T0/T1/T2 split where they do, with sources (Korean) |
|
|
260
|
+
| [Benchmark](./docs/BENCHMARK.md) | The 11,696-instance LLMRouterBench run |
|
|
261
|
+
| [doc2md](./docs/DOC2MD.md) | Supported formats, savings evidence, editing documents, DRM cases |
|
|
262
|
+
| [Korean style](./docs/KOREAN-STYLE.md) | What gets injected, the write-time check, before/after |
|
|
263
|
+
| [Not a router](./docs/NOT-A-ROUTER.md) | Why realtime routing breaks the cache and costs more |
|
|
264
|
+
| [Gateways & environment](./docs/GATEWAYS.md) | Bedrock, Vertex, LiteLLM budgets, pricing table, FAQ, how it works |
|
|
1423
265
|
|
|
1424
266
|
## Release notes
|
|
1425
267
|
|