Skip to content

Latest commit

ย 

History

History
375 lines (311 loc) ยท 36.9 KB

development.md

File metadata and controls

375 lines (311 loc) ยท 36.9 KB

RunTime ๊ฐœ๋ฐœ ๊ธฐ๋ก

RunTime(์˜› ์ด๋ฆ„ TokenCat)์„ ๋งŒ๋“ค๋ฉด์„œ ์ •ํ•œ ์„ค๊ณ„, ์žฐ ์ˆซ์ž, ๊ฒช์€ ๋ฌธ์ œ๋ฅผ ๋ชจ์•˜๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ README์— ์žˆ๋‹ค.

  • ๊ธฐ๊ฐ„: 2026.07๋ถ€ํ„ฐ. ์ดํ‹€ ๋™์•ˆ ๊ธฐํš์•ˆ ์ž‘์„ฑ, M0~M3, v1.1, ์˜คํ”ˆ์†Œ์Šค ๋ฐฐํฌ๊นŒ์ง€ ํ–ˆ๊ณ  ์ดํ›„ ๋Ÿฌ๋„ˆยท๋ฏธ๋‹ˆ๊ฒŒ์ž„ยท์ˆœ์œ„ยท์—…๋ฐ์ดํŠธ๋ฅผ ๋”ํ–ˆ๋‹ค.
  • ์Šคํƒ: Swift 5.9, SwiftUI + AppKit(NSStatusItem), SPM, macOS 13+
  • UX ์ฐธ๊ณ : RunCat(๋ฉ”๋‰ด๋ฐ” ๋Ÿฌ๋„ˆ์™€ ๋‹คํฌ ํŒ์˜ค๋ฒ„), ๋ƒฅ์บฃ(๋ฌด์ง€๊ฐœ ๊ผฌ๋ฆฌ)

1. ๋ชฉํ‘œ์™€ ํ•˜์ง€ ์•Š์€ ๊ฒƒ

  • ์ฝ”๋”ฉํ•˜๋‹ค๊ฐ€ ์‹œ์„ ์„ ์˜ฎ๊ธฐ์ง€ ์•Š๊ณ ๋„ ์ง€๊ธˆ ํ† ํฐ์„ ์–ผ๋งˆ๋‚˜ ์“ฐ๊ณ  ์žˆ๋Š”์ง€ ๋Ÿฌ๋„ˆ ์†๋„๋กœ ๋А๋ผ๊ฒŒ ํ•œ๋‹ค.
  • ํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ 5์‹œ๊ฐ„ ์„ธ์…˜ ์‚ฌ์šฉ๋Ÿ‰, ์ฃผ๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰, ์˜ค๋Š˜ ํ† ํฐ๊ณผ ์ถ”์ • ๋น„์šฉ, ์ดˆ๊ธฐํ™” ์‹œ๊ฐ์„ ๋ณธ๋‹ค.
  • ํ•œ๋„๊ฐ€ ๊ฐ€๊นŒ์›Œ์ง€๋ฉด(80%/95%) ๋Ÿฌ๋„ˆ ๋ชจ์Šต๊ณผ macOS ์•Œ๋ฆผ์œผ๋กœ ๋ฏธ๋ฆฌ ์•Œ๋ฆฐ๋‹ค.
  • ํ•˜์ง€ ์•Š์€ ๊ฒƒ: Windows/Linux ์ง€์›, ํŒ€ ๋‹จ์œ„ ์ง‘๊ณ„, ๊ณผ๊ฑฐ ํ†ต๊ณ„ ์ฐจํŠธ, App Store ๋ฐฐํฌ

2. ํ•ต์‹ฌ ์„ฑ๊ณผ ์š”์•ฝ

ํ•ญ๋ชฉ ๊ฒฐ๊ณผ
์ง‘๊ณ„ ์ •ํ™•๋„ ๊ฒ€์ฆ ๋„๊ตฌ ccusage blocks์™€ ๋™์‹œ์  ๋Œ€์กฐ ์˜ค์ฐจ 0.00% (์ƒŒ๋“œ์œ„์น˜ ๊ฒ€์ฆ: ์ธก์ •โ†’๋Œ€์กฐโ†’์ธก์ •)
๊ณต์‹ ๊ฒŒ์ด์ง€ ๋น„๋ฌธ์„œํ™” OAuth usage ์—”๋“œํฌ์ธํŠธ ์‹ค์ธก ์—ฐ๋™ โ€” ๊ฒŒ์ด์ง€๋Š” ๊ณต์‹ ๊ฐ’๋งŒ ํ‘œ์‹œํ•ด /usage์™€ ๋™์ผ ๊ฐ’
์„ฑ๋Šฅ ์œ ํœด CPU 0.05%, 30fps ์งˆ์ฃผ 0.5% (์˜ˆ์‚ฐ 0.5%), ๋ฉ”๋ชจ๋ฆฌ 17~21MB (์˜ˆ์‚ฐ 50MB) โ€” ์‹ค์ธก
ํ’ˆ์งˆ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ 102๊ฐœ (swift-testing, ./scripts/test.sh) โ€” ํŒŒ์„œยท์ค‘๋ณต์ œ๊ฑฐยท๋ธ”๋กยท๊ฒŒ์ด์ง€ยท์•Œ๋ฆผยทํ‹ฑ ํŒ๋‹จ, ๊ฒŒ์ž„ ๊ทœ์น™
๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์‹ค๋ฌผ JSONL 1,432๊ฑด ๋ถ„์„ โ†’ ์ค‘๋ณต ๊ธฐ๋ก(์ตœ๋Œ€ 6์ค„) ๋ฐœ๊ฒฌ, ์ค‘๋ณต์ œ๊ฑฐ ๋ฏธ์ ์šฉ ์‹œ 2.9๋ฐฐ ๊ณผ๋Œ€์ง‘๊ณ„ ํ™•์ธ
๋ฐฐํฌ git clone + ./install.sh 3์ค„ ์„ค์น˜ (๋กœ์ปฌ ๋นŒ๋“œ โ†’ Gatekeeper ์ฐจ๋‹จ ์—†์Œ), MIT ์˜คํ”ˆ์†Œ์Šค

3. ๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ค๊ณ„ โ€” ์‹ค๋ฌผ ์šฐ์„  ๊ฒ€์ฆ

์›์น™: ๋ฌธ์„œยท์ถ”์ธก๋ณด๋‹ค ์‹ค๋ฌผ ๋ฐ์ดํ„ฐ ์šฐ์„ . ๊ตฌํ˜„ ์ฒซ๋‚ (M0)์— ์ŠคํŒŒ์ดํฌ๋กœ ์žฌ๊ฒ€์ฆํ–ˆ๋‹ค.

ํ•ญ๋ชฉ ๋‚ด์šฉ
์›์ฒœ ๋ฐ์ดํ„ฐ ~/.claude/projects/**/*.jsonl โ€” Claude Code๊ฐ€ ์„ธ์…˜๋ณ„ ๋Œ€ํ™”ยทusage ๊ธฐ๋ก. assistant ๋ฉ”์‹œ์ง€์— message.usage(input/output/cache_creation/cache_read tokens), timestamp, message.model, requestId
๊ฒ€์ฆ๋œ ์„ ๋ก€ ccusage(CLI)๊ฐ€ ๋™์ผ JSONL์„ ํŒŒ์‹ฑํ•ด ์ผ๋ณ„/์„ธ์…˜/5์‹œ๊ฐ„ ๋ธ”๋ก ๋ฆฌํฌํŠธ ์ œ๊ณต โ€” ํŒŒ์‹ฑยท์ค‘๋ณต์ œ๊ฑฐยท๋‹จ๊ฐ€ ๋กœ์ง ์ฐธ์กฐ
5์‹œ๊ฐ„ ๋ธ”๋ก ์ฒซ ํ™œ๋™ ์‹œ๊ฐ์„ UTC ์ •์‹œ๋กœ ๋‚ด๋ฆผ(floor)ํ•œ ์‹œ์ ๋ถ€ํ„ฐ 5์‹œ๊ฐ„ ์ฐฝ (ccusage์™€ ๋™์ผ ๊ทœ์น™)
์ฃผ๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰ ๊ณต์‹ ๋ฆฌ์…‹ ์‹œ๊ฐ์„ ์•Œ๋ฉด ๊ทธ ์ฃผ๊ฐ„ ์ฐฝ, ๋ชจ๋ฅด๋ฉด ์ตœ๊ทผ 7์ผ ๋กค๋ง ํ•ฉ๊ณ„ (๋ชจ๋ธ ๋น„์ค‘ ํ‘œ์‹œ์šฉ)
๊ณต์‹ ์‚ฌ์šฉ๋Ÿ‰ % (๊ฒŒ์ด์ง€) ๋น„๋ฌธ์„œํ™” OAuth usage ์—”๋“œํฌ์ธํŠธ โ€” Claude Code๊ฐ€ ๋กœ์ปฌ์— ์ €์žฅํ•œ OAuth ํ† ํฐ์œผ๋กœ ์กฐํšŒํ•˜๋ฉด /usage์™€ ๋™์ผํ•œ ์„ธ์…˜ยท์ฃผ๊ฐ„ %์™€ ๋ฆฌ์…‹ ์‹œ๊ฐ ์‘๋‹ต. ์›น/๋ฐ์Šคํฌํ†ฑ ์‚ฌ์šฉ๋Ÿ‰๊นŒ์ง€ ํ•ฉ์‚ฐ๋œ ๊ณ„์ • ๋‹จ์œ„ ๊ณต์‹ ๋ฐ์ดํ„ฐ๋ผ ํ”Œ๋žœ ์„ ํƒยท์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์—†์ด ์ •ํ™•. ์šด์šฉ ๊ทœ์น™: ํด๋ง 180์ดˆ, ์˜ฌ๋ฐ”๋ฅธ User-Agent ํ•„์ˆ˜(์—†์œผ๋ฉด 429 ์ง€์†), ํ† ํฐ ๋งŒ๋ฃŒ ๋Œ€์‘
๊ณต์‹ ๊ฐ’์ด ์—†์„ ๋•Œ ์—ฐ๋™์„ ๋„๊ฑฐ๋‚˜ ์กฐํšŒ์— ์‹คํŒจํ•˜๋ฉด ์„ธ์…˜ยท์ฃผ๊ฐ„ ๊ฒŒ์ด์ง€๋ฅผ --๋กœ ๋น„์šฐ๊ณ  ์ด์œ ๋ฅผ ํ‘œ์‹œ. ๋กœ์ปฌ ๊ธฐ๋ก์œผ๋กœ %๋ฅผ ์ถ”์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค (์‚ฌ๋ก€ 4)
์ฃผ์˜ 2026-06-15๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ์‚ฌ์šฉ(Agent SDK, claude -p)์€ ๋ณ„๋„ ํฌ๋ ˆ๋”ง ํ’€ โ€” v1์€ entrypoint์˜ "sdk" ๋งˆ์ปค๋กœ ๋ถ„๋ฆฌ ํ‘œ์‹œ

์—ญํ•  ๋ถ„๋‹ด(ํ•˜์ด๋ธŒ๋ฆฌ๋“œ): ์„ธ์…˜/์ฃผ๊ฐ„ ๊ฒŒ์ด์ง€ % = ๊ณต์‹ ์—”๋“œํฌ์ธํŠธ(๊ณ„์ • ๋‹จ์œ„, ์›น ํฌํ•จ), ๊ณ ์–‘์ด ์†๋„ยท์˜ค๋Š˜ ํ† ํฐยท์ŠคํŒŒํฌ๋ผ์ธ = ๋กœ์ปฌ JSONL(์ดˆ ๋‹จ์œ„ ์‹ค์‹œ๊ฐ„, Claude Code๋ถ„). ๊ณต์‹ ๊ฐ’์ด ์—†์œผ๋ฉด ๊ฒŒ์ด์ง€๋ฅผ ๋น„์šฐ๊ณ  ๋กœ์ปฌ ๊ฐ’์œผ๋กœ ์ฑ„์šฐ์ง€ ์•Š๋Š”๋‹ค.

M0 ์ŠคํŒŒ์ดํฌ์—์„œ ๋ฐœ๊ฒฌํ•œ ๊ฒƒ (๋ฌธ์„œ์™€ ์‹ค๋ฌผ์˜ ์ฐจ์ด)

  • ๊ฐ™์€ ์‘๋‹ต์ด ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒญํฌ ๋‹จ์œ„๋กœ ์ตœ๋Œ€ 6์ค„ ์ค‘๋ณต ๊ธฐ๋ก โ†’ message.id + requestId ์กฐํ•ฉ์œผ๋กœ ์ค‘๋ณต ์ œ๊ฑฐ ํ•„์ˆ˜ (๋ฏธ์ ์šฉ ์‹œ 2.9๋ฐฐ ๊ณผ๋Œ€์ง‘๊ณ„). 1,432๊ฑด โ†’ ๊ณ ์œ  497๊ฑด ์‹ค์ธก.
  • usage๊ฐ€ ์ „๋ถ€ 0์ธ <synthetic> ๋ชจ๋ธ ๋ ˆ์ฝ”๋“œ ์กด์žฌ โ†’ ๋ช…์‹œ์  ์Šคํ‚ต.
  • ๊ณต์‹ ์„ธ์…˜ ๋ฆฌ์…‹ ์‹œ๊ฐ์€ UTC ์ •์‹œ๊ฐ€ ์•„๋‹˜(์‹ค์ธก 11:50Z) โ†’ ๊ฒŒ์ด์ง€ ๋ฆฌ์…‹์€ ๊ณต์‹ resets_at, ๋กœ์ปฌ ๋ธ”๋ก ๊ณ„์‚ฐ์€ ์†๋„ยทํ† ํฐ๋Ÿ‰ ์ „์šฉ์œผ๋กœ ๋ถ„๋ฆฌ.
  • ์‘๋‹ต์— ์ ˆ๋Œ€๊ฐ’(ํ•œ๋„ ๋‹ฌ๋Ÿฌ/ํ† ํฐ) ์—†์Œ โ†’ ๋กœ์ปฌ ํ† ํฐ์œผ๋กœ %๋ฅผ ํ™˜์‚ฐํ•  ์ˆ˜ ์—†๋‹ค (ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์‚ฌ๋ก€ 2, 4).

4. ํ•ต์‹ฌ ๊ธฐ๋Šฅ

F1. ๋ฉ”๋‰ด๋ฐ” ๋Ÿฌ๋„ˆ (NSStatusItem)

  • ๋Ÿฌ๋„ˆ 22์ข…: ๋™๋ฌผ 15์ข…(๊ณ ์–‘์ดยท๊ฐ•์•„์ง€ยทํ† ๋ผยท์—ฌ์šฐยทํŽญ๊ท„ยท์˜ค๋ฆฌยท๊ณต๋ฃกยท๊ณ ์Šด๋„์น˜ยท๋ณ‘์•„๋ฆฌยท๊ฐœ๊ตฌ๋ฆฌยทํŒ๋‹คยท๊ฑฐ๋ถ์ดยท๋‹ฌํŒฝ์ดยท๋ฌธ์–ดยท๊ณ ๋ž˜) ๊ณผ ํŒํƒ€์ง€ 7์ข…(์œ ๋ นยท์Šฌ๋ผ์ž„ยท๋กœ๋ด‡ยทUFOยท๋‹Œ์žยท์œ ๋‹ˆ์ฝ˜ยท๋“œ๋ž˜๊ณค). ๋ชจ๋‘ ์ง์ ‘ ๊ทธ๋ฆฐ ๋ฒกํ„ฐ ์บ๋ฆญํ„ฐ๋‹ค.
  • ๋„ํ˜•(ํƒ€์›, 2๊ด€์ ˆ ๋‹ค๋ฆฌ, ๋์ด ๊ฐ€๋Š˜์–ด์ง€๋Š” ๊ผฌ๋ฆฌ)์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ๋ฐœ์€ ๋•…์„ ์งš์—ˆ๋‹ค ๋“ค๋ฆฌ๋Š” ๊ถค์ ์„ ๊ณ„์‚ฐํ•œ๋‹ค (Characters/). ๋ฉ”๋‰ด๋ฐ”๋Š” ๋‹จ์ƒ‰ ์‹ค๋ฃจ์—ฃ, ํŒ์˜ค๋ฒ„ยท์„ค์ •์€ ์™ธ๊ณฝ์„ ๊ณผ ๋ช…์•”์„ ๋„ฃ์€ ์ปฌ๋Ÿฌ.
  • ๋Ÿฌ๋„ˆ๋งˆ๋‹ค ์„  ์ž์„ธ์˜ ํ‚ค์™€ ๋‹ฌ๋ฆฌ๋Š” ๋™์•ˆ์˜ ํญ์„ ์žฌ์„œ 36ร—22 ์„ค๊ณ„ ์นธ์„ ๋น„์Šทํ•˜๊ฒŒ ์ฑ„์šฐ๋„๋ก ์ž๋™์œผ๋กœ ํ‚ค์šด๋‹ค. ๋ณ‘์•„๋ฆฌยทํŽญ๊ท„์ฒ˜๋Ÿผ ์ž‘๊ฒŒ ๊ทธ๋ฆฐ ๋Ÿฌ๋„ˆ๋„ ๋ฉ”๋‰ด๋ฐ”์—์„œ ์ž˜ ๋ณด์ธ๋‹ค.
  • ๋ฉ”๋‰ด๋ฐ” ํฌ๊ธฐ: ์ƒํƒœ ๋ฒ„ํŠผ(22pt)๋ณด๋‹ค ๋†’์€ ๋ฉ”๋‰ด๋ฐ” ์ฐฝ(macOS 27์—์„œ 30pt)๊นŒ์ง€ ๋Ÿฌ๋„ˆ ์นธ์„ ๋„“ํ˜€ ๊ทธ๋ฆฐ๋‹ค. (30pt ์ฐฝ์ด๋ฉด ์•ฝ 49ร—30pt.) ์„ค์ •์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ฒŒ(๊ธฐ๋ณธ)๋ฉด ๋จธ๋ฆฌ ์œ„ ํšจ๊ณผ ์ž๋ฆฌ๋ฅผ ์ค„์—ฌ ์ตœ๋Œ€ 1.1๋ฐฐ๋กœ ํ‚ค์šฐ๊ณ  (์„œ ์žˆ๋Š” ๋ชธ๊ณผ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์นธ ๋†’์ด์— ๋“ค์–ด๊ฐ€๋Š” ๋งŒํผ๊นŒ์ง€) ์นธ์„ ๊ทธ๋งŒํผ ์˜†์œผ๋กœ ๋„“ํžŒ๋‹ค. ํ”„๋ ˆ์ž„์€ ๋ ˆ์ด์–ด์˜ ํ”ฝ์…€ ํฌ๊ธฐ ๊ทธ๋Œ€๋กœ ๊ทธ๋ ค ๋Š˜๋ ค ๋ถ™์ด๋ฉฐ ํ๋ ค์ง€์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.
  • ์ž˜๋ฆผ ๋ฐฉ์ง€: ๊ณต์ค‘์ œ๋น„ยท๊นก์ถฉยท๊พธ๋ฒ…์ฒ˜๋Ÿผ ์นธ ์œ„์•„๋ž˜๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์žฅ๋‚œ์€ ๋ฐ”๋‹ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์ค„์—ฌ ์นธ ์•ˆ์— ๋„ฃ๋Š”๋‹ค (๋›ฐ๋Š” ๋†’์ด๋„ ํ•จ๊ป˜ ์ค„์–ด ์ œ์ž๋ฆฌ์— ๋ถ™์ง€ ์•Š๋Š”๋‹ค. ํŒ์˜ค๋ฒ„ ๋ฌด๋Œ€๋„ ๊ฐ™๋‹ค). ๋ฐ˜๋ณต ๋™์ž‘์€ ํ•œ ์ฃผ๊ธฐ ์ „์ฒด์— ๊ฐ™์€ ๋งž์ถค์„ ๊ฑธ์–ด ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ ์ถœ๋ ์ด์ง€ ์•Š๋Š”๋‹ค. ์ปฌ๋Ÿฌ ๋Ÿฌ๋„ˆ๋Š” ๋ฉ”๋‰ด๋ฐ”์™€ ๋ฐ˜๋Œ€ ๋ฐ๊ธฐ์˜ 1pt ํ…Œ๋‘๋ฆฌ๋ฅผ ๋‘˜๋Ÿฌ ๊ฒ€์€ ๋จธ๋ฆฌยท์˜ท์ด ๋ฌปํžˆ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.
  • ๊ทธ๋ฆผ ๋Ÿฌ๋„ˆ๋Š” ํˆฌ๋ช…ํ•œ ์—ฌ๋ฐฑ์„ ๋บ€ ์‹ค์ œ ๊ทธ๋ฆผ ์˜์—ญ์œผ๋กœ ํฌ๊ธฐ๋ฅผ ๋งž์ถ˜๋‹ค.
  • ๋™์ž‘ ํ•œ ์ฃผ๊ธฐ๋ฅผ fps๋กœ ์ž˜๊ฒŒ ๋‚˜๋ˆ  ๋ฏธ๋ฆฌ ๊ทธ๋ฆฐ๋‹ค. ์„ค์ •์˜ ์›€์ง์ž„: ์ ˆ์•ฝ 12 / ๋ถ€๋“œ๋Ÿฝ๊ฒŒ 30 / ์ตœ๊ณ  60fps.
  • ํ”„๋ ˆ์ž„์€ Core Animation ํ‚คํ”„๋ ˆ์ž„์œผ๋กœ ์žฌ์ƒํ•ด ์•ฑ์€ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ ๊นจ์–ด๋‚œ๋‹ค (์‚ฌ๋ก€ 5).
  • ์ƒ‰์ƒ 9์ข…: ์ž๋™(๋ฉ”๋‰ด๋ฐ” ๊ธ€์ž์ƒ‰)ยท๋ณธ๋ž˜ ์ƒ‰(์บ๋ฆญํ„ฐ ๊ณ ์œ ์ƒ‰)ยท์ฃผํ™ฉยทํ•˜๋Š˜ยท๋ถ„ํ™ยท์ดˆ๋กยท๋ณด๋ผยท๋…ธ๋ž‘ยท๋ฌด์ง€๊ฐœ.
  • ์žฅ๋‚œ 22์ข…: ๊นก์ถฉยท๊ณต์ค‘์ œ๋น„ยท๋น™๊ธ€ยท๋‘๋ฆฌ๋ฒˆยทํ•˜ํŠธยท๋…ธ๋ž˜ยท์ถคยท๊ธฐ์ง€๊ฐœยท๊นœ๋นกยท๋ถ€๋ฅด๋ฅดยท์—์ทจยท๋ฐ˜์งยท๊พธ๋ฒ…ยท์–ด์งˆ์–ด์งˆยท์Šยท์‹ค๋ฃฉ์‹ค๋ฃฉ (25~70์ดˆ๋งˆ๋‹ค ํ•˜๋‚˜), ๊ธฐ์ƒยทํ•˜ํ’ˆยท์‹ ๋‚จ(์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ), ๋’ค์ฒ™ยท์ฝ”ํ’์„ ยท๊ฟˆ(์ž˜ ๋•Œ). ์„ค์ •์—์„œ ๋Œ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด ๋Ÿฌ๋„ˆ: GIF๋‚˜ PNG(์—ฌ๋Ÿฌ ์žฅ์ด๋ฉด ํŒŒ์ผ ์ด๋ฆ„ ์ˆœ์„œ)๋ฅผ ๋ถˆ๋Ÿฌ์™€ ๋Ÿฌ๋„ˆ๋กœ ์“ด๋‹ค. ํ…Œ๋‘๋ฆฌ์— ๋ถ™์€ ๋‹จ์ƒ‰ ๋ฐฐ๊ฒฝ์€ ์ง€์šฐ๊ณ  ์ด Mac์˜ Application Support์—๋งŒ ์ €์žฅํ•œ๋‹ค. ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๋นจ๋ผ์ง€๊ณ  ์žฅ๋‚œ๋„ ๋˜‘๊ฐ™์ด ํ•œ๋‹ค.
  • Petdex: ์„ค์ • โ†’ ๋Ÿฌ๋„ˆ โ†’ Petdex์—์„œ ์ฐพ๊ธฐ๋กœ petdex.dev์˜ Codex ํŽซ(์•ฝ 4,900๊ฐœ)์„ ๊ฒ€์ƒ‰ํ•ด ๊ณ ๋ฅธ ํŽซ๋งŒ ๋‚ด๋ ค๋ฐ›๋Š”๋‹ค. ์‹œํŠธ์—์„œ ์„œ ์žˆ๊ธฐยท๋‹ฌ๋ฆฌ๊ธฐยท์Šฌํ””ยท๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์ค„์„ ์ž˜๋ผ ๊ฐ๊ฐ ์„  ์ž์„ธยท๋‹ฌ๋ฆฌ๊ธฐยท์ง€์นจยท์ž ์— ์“ฐ๊ณ , ์† ํ”๋“ค๊ธฐ ์ค„์€ ํ•˜ํŠธยท๋…ธ๋ž˜ยท์ถคยท๋ฐ˜์ง ์žฅ๋‚œ์— ์“ด๋‹ค. ์† ํ”๋“ค๊ธฐ๋ฅผ ์“ฐ๊ธฐ ์ „์— ๋ฐ›์€ ํŽซ์€ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋ฐ›์œผ๋ฉด ์ƒ๊ธด๋‹ค. ํŽซ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ฌ๋ฆฐ ํŒฌ์•„ํŠธ๋ผ ์•ฑ์— ์‹ฃ์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐœ์ธ ํŒฉ: Sources/RunTime/LocalPack/(.gitignore)์— LocalRunnerPack์„ ๋”ฐ๋ฅด๋Š” ๋Ÿฌ๋„ˆ๋ฅผ ๋‘๋ฉด ๊ทธ Mac์—์„œ ๋นŒ๋“œํ•œ ์•ฑ์—๋งŒ ๋”ํ•ด์ง„๋‹ค. ๊ทธ๋ฆผ ๋Ÿฌ๋„ˆ์˜ ํ”„๋ ˆ์ž„์€ Sources/RunTime/Assets/LocalPack/(์—ญ์‹œ .gitignore)์— ๋‘๋ฉด ์•ฑ ๋ฒˆ๋“ค์— ํ•จ๊ป˜ ๋“ค์–ด๊ฐ„๋‹ค. ์ €์ž‘๊ถŒ์ด ์žˆ๋Š” ์บ๋ฆญํ„ฐ๋ฅผ ๊ณต๊ฐœ ์ €์žฅ์†Œ์— ์‹ฃ์ง€ ์•Š๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์“ฐ๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ๋‹ค.
  • ๋‹คํฌ/๋ผ์ดํŠธ ๋ฉ”๋‰ด๋ฐ” ๋Œ€์‘: ๋™์  ์ƒ‰์ƒ์œผ๋กœ ๊ทธ๋ฆฐ ํ”„๋ ˆ์ž„์„ ์ƒํƒœ ์ „ํ™˜ ์‹œ 1ํšŒ ๋ž˜์Šคํ„ฐ๋ผ์ด์ฆˆ(ํ…Œ๋งˆ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์‹œ ์žฌ์ƒ์„ฑ).
  • ๋Ÿฌ๋„ˆ ์˜† ์‚ฌ์šฉ๋ฅ  ํ‘œ์‹œ(์˜ต์…˜, ๊ธฐ๋ณธ ๋”): ์„ธ์…˜ยท์ฃผ๊ฐ„ยท๋†’์€ ์ชฝ ์ค‘ ์„ ํƒ. ๊ณต์‹ ๊ฐ’์ด ์—†์œผ๋ฉด --%, 80%/95% ์ด์ƒ์€ ์ฃผํ™ฉ/๋นจ๊ฐ•.

F2. ์†๋„ ๋งคํ•‘ (ํ•ต์‹ฌ ์žฌ๋ฏธ ์š”์†Œ)

  • ์‹ ํ˜ธ: burn rate = ์ตœ๊ทผ 60์ดˆ ํ† ํฐ ์†Œ๋ชจ๋Ÿ‰(tokens/min), EMA(ฮฑ=0.3) ์Šค๋ฌด๋”ฉ.
  • 5๋‹จ๊ณ„ ์ƒํƒœ ๋จธ์‹ :
์ƒํƒœ ์กฐ๊ฑด (tokens/min) ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ•œ ์ฃผ๊ธฐ
์‰ฌ๋Š” ์ค‘ 0 (5๋ถ„ ์ด์ƒ ๋ฌดํ™œ๋™) ์›…ํฌ๋ ค ์ž , ์ˆจ์‰ฌ๊ธฐ + Z 2.6์ดˆ
๊ฑท๋Š” ์ค‘ 1 ~ 2,000 ๊ฑท๊ธฐ 1.25์ดˆ
๋‹ฌ๋ฆฌ๋Š” ์ค‘ 2,000 ~ 10,000 ๋‹ฌ๋ฆฌ๊ธฐ + ๋จผ์ง€ 0.72์ดˆ
์งˆ์ฃผ ์ค‘ 10,000 ~ 30,000 ๋ณดํญ ์ปค์ง + ๋ฐ”๋žŒ 0.54์ดˆ
์ „๋ ฅ ์งˆ์ฃผ 30,000+ ๋‹ฌ๋ฆฌ๊ธฐ + ๋ฌด์ง€๊ฐœ ๊ผฌ๋ฆฌ + ๋ฐ˜์ง์ด 0.44์ดˆ
  • ์ž„๊ณ„๊ฐ’์€ Thresholds.swift ์ƒ์ˆ˜ + ์„ค์ •์—์„œ ๋ฏผ๊ฐ๋„(๋‚ฎ์Œ/๋ณดํ†ต/๋†’์Œ) 3๋‹จ ์กฐ์ ˆ.
  • ํ•œ๋„ ์ž„๋ฐ• ์˜ค๋ฒ„๋ผ์ด๋“œ: ์‚ฌ์šฉ๋ฅ  80% ์ด์ƒ์ด๋ฉด ์ƒํƒœ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ง€์ณ ์•‰์€ ๋Ÿฌ๋„ˆ (ํ—๋–ก์ž„+๋•€๋ฐฉ์šธ), 95% ์ด์ƒ์ด๋ฉด ๋นจ๊ฐ„ ๋Ÿฌ๋„ˆ์™€ ๊นœ๋นก์ด๋Š” ๋А๋‚Œํ‘œ.

F3. ์‚ฌ์šฉ๋Ÿ‰ ํŒ์˜ค๋ฒ„

๋Ÿฌ๋„ˆ ํด๋ฆญ โ†’ NSPopover(๋‹คํฌ, ํญ 376pt).

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   ๋Ÿฌ๋„ˆ๊ฐ€ ๋‹ฌ๋ฆฌ๋Š” ๋ฌด๋Œ€ (์‹œ๊ฐ„๋Œ€๋ณ„ ํ•˜๋Š˜)  [๊ฒŒ์ž„] โ”‚  โ† ๋ˆ„๋ฅด๋ฉด ์žฅ๋‚œ + ๋งํ’์„ , [๊ฒŒ์ž„]์€ ๋ฏธ๋‹ˆ๊ฒŒ์ž„
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
๊ณ ์–‘์ด ยท ๋‹ฌ๋ฆฌ๋Š” ์ค‘ โŒ„            8,420 ํ† ํฐ/๋ถ„   โ† ์ด๋ฆ„์„ ๋ˆ„๋ฅด๋ฉด ๋Ÿฌ๋„ˆยท์ƒ‰์ƒยท๋™์ž‘ ๋ฉ”๋‰ด
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
์„ธ์…˜ 5์‹œ๊ฐ„               ์ฃผ๊ฐ„
42 %                     61 %
โ”โ”โ”โ”โ”โ”โ”โ”โ”‚โ”€โ”€โ”€โ”€โ”€โ”€          โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”‚โ”
2์‹œ๊ฐ„ 18๋ถ„ ๋’ค ์ดˆ๊ธฐํ™”       ๋ชฉ 16:44 ์ดˆ๊ธฐํ™”
์•ฝ 1์‹œ๊ฐ„ 12๋ถ„ ๋’ค ํ•œ๋„      Claude Code 92% ยท ์ฑ„ํŒ… 8%
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
์ตœ๊ทผ 30๋ถ„                       ์ตœ๊ณ  62K/๋ถ„
โˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟโˆฟ
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
์˜ค๋Š˜                   3.1M ํ† ํฐ  ์•ฝ $12.40
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ— ๊ณต์‹ ์‚ฌ์šฉ๋Ÿ‰ ยท 2๋ถ„ ์ „ ๊ฐฑ์‹         โ–ฅ  โ†ป  โš™  โป
  • ๊ฒŒ์ด์ง€ %๋Š” ๊ณต์‹ ๊ฐ’๋งŒ ์“ด๋‹ค. ์ •์ˆ˜๋กœ ์˜ค๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ ์ฃผ๊ณ  ๋กœ์ปฌ ๊ธฐ๋ก์„ ์–น์ง€ ์•Š๋Š”๋‹ค (์‚ฌ๋ก€ 4). ๊ณต์‹ ๊ฐ’์„ ๋ชป ๋ฐ›์œผ๋ฉด --๋กœ ๋น„์šฐ๊ณ , ๋น„์šฉ์€ "์•ฝ $" โ€” ์ •์งํ•œ UI๊ฐ€ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ์ƒ‰์€ ์ƒํƒœ๋ฅผ ์•Œ๋ฆด ๋•Œ๋งŒ: 80% ์ „๊นŒ์ง€ ๋ฌด์ฑ„์ƒ‰, 80% ์ฃผํ™ฉ, 95% ๋นจ๊ฐ•. ์ด๋ชจ์ง€ ์—†์ด ์ˆซ์ž์™€ ์งง์€ ๋ฌธ๊ตฌ๋งŒ ๋‘”๋‹ค.
  • ๋ฌด๋Œ€: ์‹œ๊ฐ„๋Œ€๋ณ„ ํ•˜๋Š˜(์•„์นจยท๋‚ฎยท๋…ธ์„ยท๋ฐค), ์†๋„์— ๋งž์ถฐ ์‚ฐยท๊ตฌ๋ฆ„ยท๋•…์ด ๊ฒน๊ฒน์ด ํ๋ฅด๊ณ  ์ „๋ ฅ ์งˆ์ฃผ ๋•Œ๋Š” ์šฐ์ฃผ ๋ฐฐ๊ฒฝ. ๋Ÿฌ๋„ˆ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์žฅ๋‚œ์„ ์น˜๊ณ  ๋ฉ”๋‰ด๋ฐ” ๋Ÿฌ๋„ˆ๋„ ๊ฐ™์€ ์žฅ๋‚œ์„ ํ•œ๋‹ค. ํ™”๋ฉด ์ฃผ์‚ฌ์œจ๋Œ€๋กœ ๊ทธ๋ฆฌ๊ณ  ํŒ์˜ค๋ฒ„๊ฐ€ ๋‹ซํžˆ๋ฉด ๋ฉˆ์ถ˜๋‹ค.
  • ๋ฏธ๋‹ˆ๊ฒŒ์ž„ "ํ† ํฐ ๋Ÿฌ๋„ˆ": ๋ฌด๋Œ€ ์˜ค๋ฅธ์ชฝ ์œ„ ๊ฒŒ์ž„ ๋‹จ์ถ”๋กœ ์ผ ๋‹ค. ๊ณ ๋ฅธ ๋Ÿฌ๋„ˆ๊ฐ€ ์žฅ์• ๋ฌผ(๊ฐ€์‹œยท๋ฒ„์„ฏยท์„ ์ธ์žฅยท๋‚˜๋ฌดยท๊ฑธ์–ด์˜ค๋Š” ๊ฒŒ์™€ ๋“œ๋ฆดยท๋ฐ•์ฅ)์„ ๋›ฐ์–ด๋„˜๊ฑฐ๋‚˜ ์ˆ™์—ฌ ํ”ผํ•˜๊ณ  ์ฝ”์ธ์„ ๋ชจ์€๋‹ค. ์ŠคํŽ˜์ด์Šคยทโ†‘ยทํด๋ฆญ์œผ๋กœ ์ ํ”„(๊ธธ๊ฒŒ ๋ˆ„๋ฅด๋ฉด ๋†’์ด), โ†“๋กœ ์ˆ™์ด๊ธฐ, esc๋กœ ๋‚˜๊ฐ„๋‹ค. ์†๋„๊ฐ€ ์ ์  ๋นจ๋ผ์ง€๊ณ  100์ ๋งˆ๋‹ค ์ ์ˆ˜๊ฐ€ ๋ฐ˜์ง์ด๋ฉฐ, ์ตœ๊ณ  ์ ์ˆ˜๋Š” ์ด Mac์— ์ €์žฅํ•œ๋‹ค.
    • ์ˆœ์œ„: ๋ฌด๋Œ€์˜ ํŠธ๋กœํ”ผ ๋‹จ์ถ”๋กœ ์ˆœ์œ„ํ‘œ(์ „์ฒดยท์ด๋ฒˆ ์ฃผ)๋ฅผ ์—ฐ๋‹ค. ์ˆœ์œ„ํ‘œ ์ฐฝ์—์„œ ์ฐธ์—ฌ๋ฅผ ์ผœ๊ณ  ๋‹‰๋„ค์ž„์„ ์ •ํ•˜๋ฉด, ์ด Mac์—์„œ ์ตœ๊ทผ 7์ผ ๋™์•ˆ ์˜ฌ๋ฆฐ ์ ์ˆ˜๋ณด๋‹ค ๋†’์„ ๋•Œ ์ ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๊ณ (์ด๋ฒˆ ์ฃผ ์ˆœ์œ„๊ฐ€ ๋น„์ง€ ์•Š๊ฒŒ) ๊ฒŒ์ž„ ์˜ค๋ฒ„ ํ™”๋ฉด์— "์ „์ฒด N์œ„"๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค. ์ฐธ์—ฌ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๊บผ์ ธ ์žˆ๋‹ค.
    • ์ˆœ์œ„ ์†Œ์‹: ํŒ์˜ค๋ฒ„๊ฐ€ ์—ด๋ ค ์žˆ์œผ๋ฉด 30์ดˆ๋งˆ๋‹ค, ์ฐธ์—ฌ ์ค‘์ด๋ฉด ๋‹ซํ˜€ ์žˆ์–ด๋„ 10๋ถ„๋งˆ๋‹ค ์š”์•ฝ(/v1/summary)์„ ๋ฐ›์•„ ์ง€๋‚œ๋ฒˆ๊ณผ ๊ฒฌ์ค€๋‹ค. ์ƒˆ 1์œ„, 1์œ„์˜ ๊ธฐ๋ก ๊ฒฝ์‹ , ๋‚ด๊ฐ€ 1์œ„๊ฐ€ ๋จ, ์ด๋ฒˆ ์ฃผ 1์œ„ ๊ต์ฒด, ๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ์ถ”์›”ํ•จ์„ ๋Ÿฌ๋„ˆ๊ฐ€ ๋งํ’์„ ์œผ๋กœ ์•Œ๋ ค ์ฃผ๊ณ , ์ž๋ฆฌ๋ฅผ ๋น„์šด ์‚ฌ์ด ์ƒ๊ธด ์†Œ์‹์€ ๋‹ค์Œ์— ํŒ์˜ค๋ฒ„๋ฅผ ์—ด ๋•Œ ์ฐจ๋ก€๋กœ ๋“ค๋ ค์ค€๋‹ค. ๊ฒŒ์ž„ ์ค‘์—๋Š” ํŒ์ด ๋๋‚œ ๋’ค์— ๋งํ•œ๋‹ค. ์ฐธ์—ฌํ•˜์ง€ ์•Š์œผ๋ฉด ์„ค์น˜ ID ์—†์ด ๊ณต๊ฐœ ์ •๋ณด(1์œ„์™€ ์ƒ์œ„ ์ ์ˆ˜)๋งŒ ๋ฐ›๋Š”๋‹ค.
    • ๋ผ์ด๋ฒŒ: ๊ฒŒ์ž„ ์ค‘ ๋‚ด ์œ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ฐจ๋ก€๋กœ ๋ชฉํ‘œ๊ฐ€ ๋œ๋‹ค. ์œ„์ชฝ์— "๋‹ค์Œ ๋ชฉํ‘œ ์ด๋ฆ„ ์ ์ˆ˜ (-๋‚จ์€ ์ ์ˆ˜)"๊ฐ€ ๋œจ๊ณ , ๊ทธ ์ ์ˆ˜์— ๋‹ฟ๋Š” ์ง€์ ์— ๊นƒ๋ฐœ์ด ๋‹ค๊ฐ€์˜ค๋ฉฐ, ๋„˜์œผ๋ฉด "์ด๋ฆ„ ์ถ”์›”!" ๋ฐฐ๋„ˆ๊ฐ€ ๋œฌ๋‹ค. ์ˆœ์œ„ํ‘œ ์ฐฝ์€ ์—ด๋ ค ์žˆ๋Š” ๋™์•ˆ 30์ดˆ๋งˆ๋‹ค ์ƒˆ๋กœ ๋ฐ›๋Š”๋‹ค.
    • ์ˆœ์œ„ ์„œ๋ฒ„๋Š” server/leaderboard/(Cloudflare Workers + D1). ์•ฑ์ด ์˜คํ”ˆ์†Œ์Šค๋ผ ์กฐ์ž‘์„ ์™„์ „ํžˆ ๋ง‰์„ ์ˆ˜๋Š” ์—†์–ด์„œ, ํ”Œ๋ ˆ์ด ์‹œ๊ฐ„ ์•ˆ์— ๊ทœ์น™์ƒ ๋‚ผ ์ˆ˜ ์—†๋Š” ์ ์ˆ˜(์ตœ๊ณ  ์†๋„ยท์ ์ˆ˜์œจยท์ฝ”์ธ ์ƒํ•œ์œผ๋กœ ๊ณ„์‚ฐ), ๊ฐ™์€ ์‚ฌ๋žŒ์ด 3์ดˆ ์•ˆ์— ๋‹ค์‹œ ์˜ฌ๋ฆฌ๋Š” ์š”์ฒญ, ๊ฐ™์€ IP์—์„œ 1๋ถ„์— 6๋ฒˆ ๋„˜๊ฒŒ ์˜ฌ๋ฆฌ๋Š” ์š”์ฒญ์„ ๊ฑฐ๋ฅธ๋‹ค. IP๋Š” ๋‚ ๋งˆ๋‹ค ๋ฐ”๋€Œ๋Š” ๊ฐ’๊ณผ ํ•จ๊ป˜ ํ•ด์‹œํ•ด ํšŸ์ˆ˜๋งŒ ์„ธ๊ณ  1์‹œ๊ฐ„ ๋’ค ์ง€์šด๋‹ค. ๊ทœ์น™ ์ˆซ์ž๋Š” ์•ฑ(RunnerGame.rulesVersion)๊ณผ ์„œ๋ฒ„(rules.js)์— ๊ฐ™์ด ๋‘๊ณ  ์–‘์ชฝ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ํ™•์ธํ•œ๋‹ค.
    • ๊ทœ์น™์€ GameCore ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํ™”๋ฉด๊ณผ ๋–ผ์–ด ๋‘์—ˆ๋‹ค. 1/120์ดˆ ๊ณ ์ • ๊ฐ„๊ฒฉ ๋ฌผ๋ฆฌ, ์ฐฉ์ง€ ์ง์ „ยท์ด๋ฅ™ ์งํ›„ ์ž…๋ ฅ ๋ณด์ •, ์ตœ์†Œ ์ ํ”„ ๋†’์ด, ๋„ˆ๊ทธ๋Ÿฌ์šด ํŒ์ • ์ƒ์ž. ํŒ์ • ์ƒ์ž๋Š” ์บ๋ฆญํ„ฐ์™€ ์ƒ๊ด€์—†์ด ๊ฐ™์•„ ์–ด๋–ค ๋Ÿฌ๋„ˆ๋กœ ํ•ด๋„ ์กฐ๊ฑด์ด ๊ฐ™๋‹ค.
    • ์žฅ์• ๋ฌผ ๊ฐ„๊ฒฉ์€ Chromium T-Rex Runner(BSD 3-Clause) ๊ณต์‹์„ ๋”ฐ๋ฅด๊ณ , ์ ํ”„ ์‹œ๊ฐ„์œผ๋กœ ์žฐ ํ•˜ํ•œ์„ ๋”ํ–ˆ๋‹ค. ๋ฌด์ž‘์œ„ ์”จ์•— 40๊ฐœ๋กœ ๋ชจ๋“  ์žฅ์• ๋ฌผ์„ ๋„˜๊ฑฐ๋‚˜ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
    • ๊ทธ๋ฆผ๊ณผ ํšจ๊ณผ์Œ์€ Kenney์˜ CC0 ์—์…‹(Pixel Platformer, Digital Audio). ์ถœ์ฒ˜๋Š” Assets/Game/CREDITS.txt.
  • ๊ฒŒ์ด์ง€ ๋ˆˆ๊ธˆ์€ ์ฐฝ(5์‹œ๊ฐ„/์ฃผ๊ฐ„)์˜ ๊ฒฝ๊ณผ ์‹œ๊ฐ„ โ€” ๋ง‰๋Œ€๊ฐ€ ๋ˆˆ๊ธˆ๋ณด๋‹ค ์•ž์„œ๋ฉด ์‹œ๊ฐ„๋ณด๋‹ค ๋นจ๋ฆฌ ์“ฐ๋Š” ์ค‘.
  • "์•ฝ N๋ถ„ ๋’ค ํ•œ๋„"๋Š” ์ตœ๊ทผ 30๋ถ„ ๊ณต์‹ ์„ธ์…˜ %์˜ ์˜ค๋ฆ„์„ธ๋กœ ๊ณ„์‚ฐํ•˜๊ณ , ์ดˆ๊ธฐํ™”๊ฐ€ ๋จผ์ € ์˜ค๋ฉด "์ดˆ๊ธฐํ™” ์ „๊นŒ์ง€ ์—ฌ์œ ".
  • ์ฃผ๊ฐ„ ์•„๋ž˜๋Š” ์‚ฌ์šฉ์ฒ˜๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๊ณต์‹ ์‚ฌ์šฉ์ฒ˜ ๋น„์ค‘(Claude Codeยท์ฑ„ํŒ…โ€ฆ), ์•„๋‹ˆ๋ฉด ์ด ๊ธฐ๊ธฐ์˜ ๋ชจ๋ธ ๋น„์ค‘.
  • ์ŠคํŒŒํฌ๋ผ์ธ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๊ทธ ๋ถ„์˜ tokens/min, ์ผ๋ณ„ ์ƒ์„ธ๋Š” ๋ชจ๋ธ ๊ณ„์—ด(OpusยทSonnetยทHaikuยทFable)๋ณ„ ๋ง‰๋Œ€.

๊ฐฑ์‹  ์ „๋žต

  • ๊ณต์‹ % ํด๋ง 180์ดˆ(429 ๋ฐฉ์ง€ ์•ˆ์ „ ๊ฐ„๊ฒฉ) + ํŒ์˜ค๋ฒ„ ์—ฌ๋Š” ์ˆœ๊ฐ„ ์ฆ‰์‹œ 1ํšŒ ์žฌ์กฐํšŒ (์ง์ „ 30์ดˆ ์ด๋‚ด๋ฉด ์ƒ๋žต).
  • ์กฐํšŒ ๋’ค ๊ณต์‹ ์ฐฝ์˜ ๋ฆฌ์…‹ ์‹œ๊ฐ์ด ์ง€๋‚˜๋ฉด ์ด์ „ %๋ฅผ ๋ณด์—ฌ ์ฃผ์ง€ ์•Š๊ณ  0%๋กœ ๋‘๊ณ , ์ƒˆ ๊ฐ’์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ 30์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๋‹ค์‹œ ์กฐํšŒํ•œ๋‹ค.

F4. ์•Œ๋ฆผ

  • ์„ธ์…˜/์ฃผ๊ฐ„ 80%ยท95% ๋„๋‹ฌ ์‹œ ๊ฐ 1ํšŒ macOS ์•Œ๋ฆผ. ์˜ˆ: "์„ธ์…˜ ์‚ฌ์šฉ๋Ÿ‰ 80%" / "ํ˜„์žฌ ์†๋„๋กœ ์•ฝ 1์‹œ๊ฐ„ 12๋ถ„ ๋’ค ํ•œ๋„์— ๋‹ฟ์Šต๋‹ˆ๋‹ค." ์ฐฝ ๋ฆฌ์…‹ ์‹œ ๋ฐœ์†ก ๊ธฐ๋ก ์ดˆ๊ธฐํ™”, 70โ†’96% ๊ฑด๋„ˆ๋›ฐ๋ฉด 95๋งŒ ๋ฐœ์†ก(์ŠคํŒธ ๋ฐฉ์ง€) โ€” ์ •์ฑ…์„ ์ˆœ์ˆ˜ ๋กœ์ง์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ.
  • 5์‹œ๊ฐ„ ๋ธ”๋ก ๋ฆฌ์…‹ ์‹œ "์„ธ์…˜ ์ดˆ๊ธฐํ™”" ์•Œ๋ฆผ (์˜ต์…˜, ๊ธฐ๋ณธ off).
  • ์•Œ๋ฆผ๊ณผ ์ง€์นœ ๊ณ ์–‘์ด๋Š” ๊ณต์‹ ๊ฐ’์œผ๋กœ๋งŒ ํŒ๋‹จํ•œ๋‹ค. ๊ณต์‹ ๊ฐ’์ด ์—†์œผ๋ฉด(์‹œ์ž‘ ์งํ›„ยท์‹คํŒจ) ํ‰๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

F5. ์„ค์ • (UserDefaults)

  • ๊ณต์‹ ์—ฐ๋™ on/off (๋„๊ฑฐ๋‚˜ ์กฐํšŒ์— ์‹คํŒจํ•˜๋ฉด ์„ธ์…˜ยท์ฃผ๊ฐ„ ๊ฒŒ์ด์ง€๋ฅผ ๋น„์šด๋‹ค)
  • ๋ฏผ๊ฐ๋„ 3๋‹จ / ๋Ÿฌ๋„ˆ(22์ข… + Petdex ํŽซ + ๋‚ด ๋Ÿฌ๋„ˆ, ์›€์ง์ด๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํƒ€์ผ, ์ด๋ฆ„ ๊ฒ€์ƒ‰)ยท๋ฉ”๋‰ด๋ฐ” ํฌ๊ธฐ 2๋‹จยท์ƒ‰์ƒ 9์ข… / ์›€์ง์ž„(12ยท30ยท60fps) / ๊ฐ€๋” ์žฅ๋‚œ์น˜๊ธฐ / ๋ฉ”๋‰ด๋ฐ” ์‚ฌ์šฉ๋ฅ  / ํ•œ๋„ยท์ƒˆ ์„ธ์…˜ ์•Œ๋ฆผ / ๋กœ๊ทธ์ธ ์‹œ ์ž๋™ ์‹œ์ž‘(SMAppService) / ํด๋ง ์ฃผ๊ธฐ(๊ธฐ๋ณธ 3์ดˆ)
  • ์ •๋ณด: ๋ฒ„์ „๊ณผ ๋นŒ๋“œ ์ปค๋ฐ‹(์„ค์น˜๋œ ์•ฑ์ด ์–ด๋А ์ปค๋ฐ‹์ธ์ง€ ํ™•์ธ์šฉ), ๋ฐ์ดํ„ฐ ํด๋” ์—ด๊ธฐ

5. ๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜

์Šคํƒ: Swift 5.9+ ยท SwiftUI(ํŒ์˜ค๋ฒ„/์„ค์ •) + AppKit(NSStatusItem) ยท macOS 13+ ยท SPM. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”์–ด(UsageCore ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์™€ ์•ฑ ๊ณ„์ธต ๋ถ„๋ฆฌ.

RunTime/
โ”œโ”€โ”€ Sources/GameCore/           # ๋ฏธ๋‹ˆ๊ฒŒ์ž„ ๊ทœ์น™ (๋ฌผ๋ฆฌยท์žฅ์• ๋ฌผยท์ ์ˆ˜) โ€” ๊ฒŒ์ž„ ํ…Œ์ŠคํŠธ 32๊ฐœ์˜ ๋Œ€์ƒ
โ”œโ”€โ”€ server/leaderboard/         # ๋ฏธ๋‹ˆ๊ฒŒ์ž„ ์ˆœ์œ„ ์„œ๋ฒ„ (Cloudflare Worker + D1, ๊ทœ์น™ยทํ†ตํ•ฉ ํ…Œ์ŠคํŠธ)
โ”œโ”€โ”€ Sources/UsageCore/          # ์ˆœ์ˆ˜ ๋กœ์ง โ€” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ 70๊ฐœ์˜ ๋Œ€์ƒ
โ”‚   โ”œโ”€โ”€ JSONLWatcher.swift      #   ~/.claude/projects ์žฌ๊ท€ ๊ฐ์‹œ, ํŒŒ์ผ๋ณ„ ์˜คํ”„์…‹ ์ฆ๋ถ„ ํŒŒ์‹ฑ
โ”‚   โ”œโ”€โ”€ JSONLParser.swift       #   ์Šคํ‚ค๋งˆ-๊ด€์šฉ ํŒŒ์‹ฑ, <synthetic> ์Šคํ‚ต
โ”‚   โ”œโ”€โ”€ UsageStore.swift        #   ์ค‘๋ณต์ œ๊ฑฐ(message.id+requestId) + ์ง‘๊ณ„(์˜ค๋Š˜/์ฃผ๊ฐ„/๋ชจ๋ธ/์ŠคํŒŒํฌ๋ผ์ธ)
โ”‚   โ”œโ”€โ”€ BlockCalculator.swift   #   5์‹œ๊ฐ„ ๋ธ”๋ก(UTC floor)
โ”‚   โ”œโ”€โ”€ BurnRateMeter.swift     #   60์ดˆ ์ฐฝ tokens/min + EMA
โ”‚   โ”œโ”€โ”€ OAuthUsageProvider.swift#   ๊ณต์‹ % ํด๋ง: ํ† ํฐ ์บ์‹œ + security ์„œ๋ธŒํ”„๋กœ์„ธ์Šค + ํŒŒ์ผ ํด๋ฐฑ
โ”‚   โ”œโ”€โ”€ GaugeMath.swift         #   ๊ณต์‹ ๊ฐ’ ๊ฒŒ์ด์ง€ยท์ฐฝ ์ดˆ๊ธฐํ™” ์ฒ˜๋ฆฌ, ๊ณต์‹ ์˜ค๋ฆ„์„ธ๋กœ ํ•œ๋„ ๋„๋‹ฌ ์‹œ๊ฐ„
โ”‚   โ”œโ”€โ”€ UsageEvaluator.swift    #   ํ‹ฑ ํŒ๋‹จ: ๊ณต์‹ ๊ฐ’ ์œ ํšจ์„ฑ(์œ ์˜ˆ 15๋ถ„)ยท๊ฒŒ์ด์ง€ยทํ•œ๋„ ๋‹จ๊ณ„
โ”‚   โ”œโ”€โ”€ WeeklyWindow.swift      #   ๋กค๋ง 7์ผ / ๊ณต์‹ ๋ฆฌ์…‹ ์‹œ๊ฐ์„ 7์ผ ๋‹จ์œ„๋กœ ๊ตด๋ฆฌ๊ธฐ
โ”‚   โ””โ”€โ”€ UsageAlerts.swift       #   80/95% ์•Œ๋ฆผ ์ •์ฑ… (์ฐฝ๋ณ„ 1ํšŒ)
โ”œโ”€โ”€ Sources/RunTime/
โ”‚   โ”œโ”€โ”€ App/                    #   AppDelegate(NSStatusItem), UsageEngine, AppSettings
โ”‚   โ”œโ”€โ”€ Characters/             #   ๋Ÿฌ๋„ˆ 22์ข… ๋ฒกํ„ฐ ๊ณจ๊ฒฉ(QuadrupedยทBirdยทReptileโ€ฆ), ์žฅ๋‚œ 22์ข…, ํšจ๊ณผ, ๋‚ด ๋Ÿฌ๋„ˆยทPetdexยท๊ฐœ์ธ ํŒฉ
โ”‚   โ”œโ”€โ”€ SpriteEngine/           #   SpriteAnimator(Core Animation ์žฌ์ƒ), MenuBarCanvas(์นธ ํฌ๊ธฐ), ํ”„๋ ˆ์ž„ ์ƒ์„ฑ, ๋ž˜์Šคํ„ฐ๋ผ์ด์ €, ์ ๊ฒ€ ์‹œํŠธยท๋ฉ”๋‰ด๋ฐ” ์ ๊ฒ€
โ”‚   โ”œโ”€โ”€ UI/                     #   PopoverView, RunnerStage(๋ฌด๋Œ€), Theme, GaugeBar, Sparkline, SettingsView, RunnerPicker, PetdexBrowser
โ”‚   โ”œโ”€โ”€ Game/                   #   GameSession(๋ฌด๋Œ€ ์œ„ ํ•œ ํŒ: ์ž…๋ ฅยทํšจ๊ณผยท์ ์ˆ˜ํŒ), GameAssets, GameSound, GameShots(์ ๊ฒ€)
โ”‚   โ”œโ”€โ”€ Services/               #   Notifier(UserNotifications), LaunchAtLogin(SMAppService)
โ”‚   โ””โ”€โ”€ Assets/                 #   PNG ๋„ฃ์œผ๋ฉด ์ž๋™ ๊ต์ฒด๋˜๋Š” ์Šคํ”„๋ผ์ดํŠธ ํด๋”
โ”œโ”€โ”€ docs/                       #   ๊ฐœ๋ฐœ ๊ธฐ๋ก (์ด ๋ฌธ์„œ)
โ””โ”€โ”€ scripts/                    #   build-app.sh, setup-signing.sh, install.sh, make-icon.sh, test.sh

์„ฑ๋Šฅ ์˜ˆ์‚ฐ vs ์‹ค์ธก: ์œ ํœด CPU < 0.5% โ†’ 0.05%(์ž ์ž๋Š” ๋Ÿฌ๋„ˆ, ๊ธฐ๋ณธ 30fps ์„ค์ •), ์ „๋ ฅ ์งˆ์ฃผ 30fps 0.5%, ๋ฉ”๋ชจ๋ฆฌ(phys_footprint) < 50MB โ†’ 17MB(๋นˆ ๋ฐ์ดํ„ฐ) / 21MB(ํ•˜๋ฃจ 5์ฒœ๋งŒ ํ† ํฐ ์‹ค์‚ฌ์šฉ). ํŒŒ์‹ฑ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ, ํ’€์Šค์บ”์€ ์‹œ์ž‘ ์‹œ 1ํšŒ, ์ดํ›„ ํŒŒ์ผ ์˜คํ”„์…‹ ๊ธฐ์–ต ์ฆ๋ถ„. ์œ ํœด ์ธก์ •์€ CLAUDE_CONFIG_DIR๋กœ ๋นˆ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•œ ๊ฒฉ๋ฆฌ ์ธ์Šคํ„ด์Šค๋กœ, CPU๋Š” 30์ดˆ ๋ˆ„์  CPU ์‹œ๊ฐ„์œผ๋กœ ์žฐ๋‹ค.

๋Œ€์•ˆ ์Šคํƒ ๊ฒ€ํ† : Python + rumps๋กœ ๋ฐ˜๋‚˜์ ˆ MVP ๊ฐ€๋Šฅํ•˜๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ fpsยท๋ฐฐํฌ์— ํ•œ๊ณ„ โ†’ Swift ์ฑ„ํƒ. Electron์€ ๋Ÿฌ๋„ˆ ์•ฑ ์šฉ๋„๋กœ ๋ฆฌ์†Œ์Šค ๊ณผ๋‹ค๋ผ ๋ฐฐ์ œ.

6. ๋ณด์•ˆ ์„ค๊ณ„ โ€” macOS ํ‚ค์ฒด์ธ ์ ‘๊ทผ (ํ•„์ˆ˜ ์ค€์ˆ˜ ๊ทœ์น™)

Claude Code๋Š” macOS์—์„œ OAuth ํ† ํฐ์„ ํ‚ค์ฒด์ธ ํ•ญ๋ชฉ Claude Code-credentials(๋กœ๊ทธ์ธ ํ‚ค์ฒด์ธ)์— ์ €์žฅํ•œ๋‹ค. ์ด ํ•ญ๋ชฉ์€ ACL๋กœ ๋ณดํ˜ธ๋˜์–ด ๋‹ค๋ฅธ ์•ฑ์ด ์ฝ์œผ๋ฉด macOS๊ฐ€ ์•”ํ˜ธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋„์šฐ๋Š” ๊ฒƒ์ด ์ •์ƒ ๋™์ž‘์ด๋‹ค. ๋ฐ˜๋ณต ์›์ธ๊ณผ ๋Œ€์‘:

์›์ธ ๋Œ€์‘ ๊ทœ์น™
๋งค ํด๋ง(3๋ถ„)๋งˆ๋‹ค ํ‚ค์ฒด์ธ ์ฝ๊ธฐ ๊ธˆ์ง€. ํ† ํฐ์„ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ, ๋งŒ๋ฃŒ(~60๋ถ„) ์‹œ์—๋งŒ ์žฌ์ฝ๊ธฐ โ†’ ๋นˆ๋„ 1/20
"ํ—ˆ์šฉ"๋งŒ ํด๋ฆญ(1ํšŒ์„ฑ) ์ฒซ ์‹คํ–‰ ์•ˆ๋‚ด์—์„œ "ํ•ญ์ƒ ํ—ˆ์šฉ(Always Allow)" ๋ˆ„๋ฅด๋„๋ก ์•ˆ๋‚ด
๋นŒ๋“œ๋งˆ๋‹ค ์ฝ”๋“œ์„œ๋ช… ๋ณ€๊ฒฝ(ad-hoc) โ†’ "ํ•ญ์ƒ ํ—ˆ์šฉ" ๋ฌดํšจํ™” ๊ฐœ๋ฐœ ์ค‘์—๋„ ๊ณ ์ • ์„œ๋ช… identity ์‚ฌ์šฉ (self-signed ์ธ์ฆ์„œ ์ƒ์„ฑยท๊ณ ์ • ์Šคํฌ๋ฆฝํŠธ ์ œ๊ณต)
์•ฑ์ด Security.framework ์ง์ ‘ ํ˜ธ์ถœ /usr/bin/security find-generic-password ... ์„œ๋ธŒํ”„๋กœ์„ธ์Šค โ€” ACL ๋Œ€์ƒ์ด Apple ์„œ๋ช… ๋ถˆ๋ณ€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋˜์–ด ๋ฆฌ๋นŒ๋“œํ•ด๋„ ํ”„๋กฌํ”„ํŠธ ์žฌ๋ฐœ ์—†์Œ (ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” README ํ•œ๊ณ„์— ์ ์Œ)
๊ทธ๋ž˜๋„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์‹ซ์€ ๊ฒฝ์šฐ ํด๋ฐฑ ์ˆœ์„œ: โ‘ด ~/.claude/.credentials.json ํŒŒ์ผ ์šฐ์„ (ํ”„๋กฌํ”„ํŠธ ์—†์Œ) โ‘ต ํ‚ค์ฒด์ธ โ‘ถ ์‹คํŒจ ์‹œ ๊ฒŒ์ด์ง€๋ฅผ ๋น„์šฐ๊ณ  ์ด์œ  ํ‘œ์‹œ

์ ˆ๋Œ€ ๊ธˆ์ง€: security unlock-keychain ์ž๋™ํ™”, ํ‚ค์ฒด์ธ ์•”ํ˜ธ ์ €์žฅยท์ž๋™์ž…๋ ฅ โ€” ํŽธํ•˜์ž๊ณ  ๋ณด์•ˆ์„ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š” ์•ˆํ‹ฐํŒจํ„ด. OAuth ํ† ํฐ์€ ์ฝ๊ธฐ ์ „์šฉ, Anthropic ์™ธ ์–ด๋””์—๋„ ์ „์†กยท์ €์žฅยท๋กœ๊น…ํ•˜์ง€ ์•Š๋Š”๋‹ค. (Petdex ๋ชฉ๋ก๊ณผ ํŽซ ๊ทธ๋ฆผ์€ Petdex์—์„œ ์ฐพ๊ธฐ๋ฅผ ์—ด ๋•Œ๋งŒ petdex.dev์—์„œ ๋ฐ›๊ณ , ์ด๋•Œ ํ† ํฐ์ด๋‚˜ ์‚ฌ์šฉ๋Ÿ‰์€ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค. ๋ฏธ๋‹ˆ๊ฒŒ์ž„ ์ˆœ์œ„๋Š” ์ฐธ์—ฌ๋ฅผ ์ผ  ๊ฒฝ์šฐ์—๋งŒ ๋ฌด์ž‘์œ„ ์„ค์น˜ IDยท๋‹‰๋„ค์ž„ยท์ ์ˆ˜ยท์ฝ”์ธ ์ˆ˜ยทํ”Œ๋ ˆ์ด ์‹œ๊ฐ„ยท์•ฑ ๋ฒ„์ „์„ ์ˆœ์œ„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ , ์ˆœ์œ„ ์†Œ์‹์„ ๋ฐ›์œผ๋ ค๊ณ  10๋ถ„๋งˆ๋‹ค ID์™€ ํ•จ๊ป˜ ์ˆœ์œ„ ์š”์•ฝ์„ ๋ฐ›๋Š”๋‹ค. ์ฐธ์—ฌํ•˜์ง€ ์•Š์•„๋„ ํŒ์˜ค๋ฒ„๋ฅผ ์—ด๋ฉด 30์ดˆ๋งˆ๋‹ค ID ์—†์ด ๊ณต๊ฐœ ์ˆœ์œ„ ์š”์•ฝ์„ ๋ฐ›๋Š”๋‹ค. ์ˆœ์œ„ํ‘œ ์ฐฝ์˜ "๋‚ด ๊ธฐ๋ก ์ง€์šฐ๊ธฐ"๋กœ ์„œ๋ฒ„์—์„œ ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค. ์—…๋ฐ์ดํŠธ ํ™•์ธ์€ 30๋ถ„๋งˆ๋‹ค GitHub API์— ๊ณต๊ฐœ ์ €์žฅ์†Œ์˜ ์ปค๋ฐ‹ ๋น„๊ต๋งŒ ๋ฌป๊ณ , ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค.)

7. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ธฐ๋ก (5๊ฑด)

์‚ฌ๋ก€ 1. macOS ํ‚ค์ฒด์ธ ์•”ํ˜ธ ํ”„๋กฌํ”„ํŠธ ๋ฐ˜๋ณต

TL;DR โ€” ํ† ํฐ์„ ์ฝ์„ ๋•Œ๋งˆ๋‹ค ํ‚ค์ฒด์ธ ์•”ํ˜ธ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ฐ˜๋ณต๋๋‹ค. ์›์ธ์„ "๋ฒ„๊ทธ"๊ฐ€ ์•„๋‹Œ ํ‚ค์ฒด์ธ ACL์˜ ์ •์ƒ ๋ณด์•ˆ ๋™์ž‘์œผ๋กœ ๊ทœ์ •ํ•˜๊ณ , ์ ‘๊ทผ ๋นˆ๋„(๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ)ยท์Šน์ธ ๋ฐฉ์‹(ํ•ญ์ƒ ํ—ˆ์šฉ ์•ˆ๋‚ด)ยท์ฝ”๋“œ์„œ๋ช…(๊ณ ์ • identity + security ์„œ๋ธŒํ”„๋กœ์„ธ์Šค) 3๊ฐœ ์ถ•์œผ๋กœ ๋ถ„ํ•ดํ•ด ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ตœ์ดˆ 1ํšŒ๋กœ ์ค„์˜€๋‹ค. ํ•ต์‹ฌ ๋ฐœ๊ฒฌ: ACL์€ ์ฝ”๋“œ์„œ๋ช… ๋‹จ์œ„๋กœ ์‹ ๋ขฐ๋ฅผ ๊ธฐ์–ตํ•˜๋ฏ€๋กœ ad-hoc ์„œ๋ช…์€ ๋นŒ๋“œ๋งˆ๋‹ค ์Šน์ธ์ด ๋ฌดํšจํ™”๋œ๋‹ค โ€” ์„œ๋ช… ์ „๋žต์€ ๋ฐฐํฌ๋ฟ ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„ UX ๋ฌธ์ œ๋‹ค. unlock-keychain ์ž๋™ํ™”๋ฅ˜๋Š” ์˜๋„์ ์œผ๋กœ ๋ฐฐ์ œ. (์›์ธยท๋Œ€์‘ ์ƒ์„ธ ํ‘œ๋Š” ยง6 ์ฐธ์กฐ)

์‚ฌ๋ก€ 2. ์‹ค์‹œ๊ฐ„ ๋ณด๊ฐ„ ๊ฒŒ์ด์ง€ ํญ์ฃผ โ€” ์˜คํƒ "100% ๊ฒฝ๊ณ "

TL;DR โ€” ๊ณต์‹ % ์œ„์— ๋กœ์ปฌ ์†Œ๋ชจ๋ถ„์„ ์–น๋Š” ๋ณด๊ฐ„ ๊ฒŒ์ด์ง€๊ฐ€ ๋ช‡ ๋ถ„ ๋งŒ์— 100%๋กœ ํญ์ฃผํ•˜๋ฉฐ ๋นจ๊ฐ„ ๊ณ ์–‘์ดยท95% ์˜คํƒ ์•Œ๋ฆผ์„ ๋ƒˆ๊ณ , ํŒ์˜ค๋ฒ„๋ฅผ ์—ด๋ฉด(์žฌ์กฐํšŒ) ์ž ๊น ์ •์ƒ์œผ๋กœ ๋Œ์•„์™€ "ํด๋ฆญํ•ด์•ผ ๊ฐฑ์‹ ๋˜๋Š” ๋ฒ„๊ทธ"์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค.

์ฝ”๋“œ์˜ ๊ฐ€์ • ์‹ค์ธก
๊ณต์‹ 1%์— ํ•ด๋‹นํ•˜๋Š” ๋กœ์ปฌ ํ† ํฐ 5,000 (ํ”Œ๋žœ ํ•œ๋„ 500Kรท100) ์•ฝ 60,000 (๋ธ”๋ก 4M รท ๊ณต์‹ 63%)
5๋ถ„๊ฐ„ 30๋งŒ ํ† ํฐ ์†Œ๋ชจ ์‹œ ๋ณด๊ฐ„ +60%p (ํญ์ฃผ) +5.1%p

์›์ธ์€ ๋‹จ์œ„๊ฐ€ ๋‹ค๋ฅธ ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ • ์ƒ์ˆ˜๋กœ ํ™˜์‚ฐํ•œ ๊ฒƒ โ€” ๋กœ์ปฌ ๋กœ๊ทธ ํ† ํฐ์€ ์บ์‹œ ์ฝ๊ธฐ๊ฐ€ ์ง€๋ฐฐํ•ด ์‹ค์ œ ํ•œ๋„ ์†Œ์ง„์˜ ์ˆ˜์‹ญ ๋ฐฐ ์Šค์ผ€์ผ์ด์—ˆ๋‹ค. ํ™˜์‚ฐ ๋น„์œจ์„ ์‹ค์ธก ์—ญ์‚ฐ(์กฐํšŒ ์‹œ์  ์ฐฝ ํ† ํฐ รท ๊ณต์‹ %)์œผ๋กœ ๋ฐ”๊พธ๊ณ , ์—ญ์‚ฐ์ด ๋ถˆ์•ˆ์ •ํ•œ ๊ตฌ๊ฐ„(๊ณต์‹ 5% ๋ฏธ๋งŒ)์€ ๋ณด๊ฐ„์„ ์ƒ๋žตํ•˜๋ฉฐ, ์•Œ๋ฆผ์˜ ์ž”์—ฌ ์‹œ๊ฐ„ ์ถ”์ •๋„ ๊ฐ™์€ ์Šค์ผ€์ผ๋กœ ์ผ์›ํ™”(GaugeMath ๋ชจ๋“ˆ + ํ…Œ์ŠคํŠธ 6๊ฐœ). ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ 123%โ†’100% ํญ์ฃผ๊ฐ€ **68.1%**๋กœ ์ •ํ™•ํ•ด์กŒ๋‹ค. ๋ฐฐ์šด ์ : ์ด์ข… ์†Œ์Šค๋ฅผ ์„ž์„ ๋•Œ๋Š” ๋‹จ์œ„๋ถ€ํ„ฐ ๊ฒ€์ฆํ•˜๊ณ , ๋ชจ๋ฅด๋Š” ํ™˜์‚ฐ ๋น„์œจ์€ ์ƒ์ˆ˜๋กœ ๊ฐ€์ •ํ•˜์ง€ ๋ง๊ณ  ์‹œ์Šคํ…œ์ด ์ฃผ๋Š” ์‹ค์ธก์œผ๋กœ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ํ•˜๋ผ. (์ดํ›„ ์‚ฌ๋ก€ 4์—์„œ ๋ณด๊ฐ„๊ณผ ์ถ”์ • ๋ชจ๋“œ๋ฅผ ๋นผ๊ณ  ๊ฒŒ์ด์ง€๋Š” ๊ณต์‹ ๊ฐ’๋งŒ ์“ฐ๊ฒŒ ํ–ˆ๋‹ค.)

์‚ฌ๋ก€ 3. "์ƒˆ๋กœ๊ณ ์นจ์ด ์•ˆ ๋ผ์š”" โ€” ์Šค๋กœํ‹€๊ณผ App Nap

TL;DR โ€” ๋‘ ๊ฐˆ๋ž˜ ์ฆ์ƒ. โ‘  ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Œ: ํŒ์˜ค๋ฒ„๋ฅผ ์—ฌ๋Š” ์ˆœ๊ฐ„ ๊ณต์‹ %๋ฅผ ์ด๋ฏธ ์กฐํšŒํ•˜๊ณ  30์ดˆ ์Šค๋กœํ‹€(429 ๋ฐฉ์ง€)์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ, ์งํ›„ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ํ•ญ์ƒ ์ƒ๋žต๋๋‹ค โ†’ ์‚ฌ์šฉ์ž ๋ช…์‹œ ๋™์ž‘์€ ์Šค๋กœํ‹€์„ ์šฐํšŒ(์—ฐํƒ€ ๋ฐฉ์ง€ 5์ดˆ๋งŒ ์œ ์ง€)ํ•˜๋„๋ก ๊ฒฝ๋กœ๋ฅผ ๋ถ„๋ฆฌ. โ‘ก ์žฅ์‹œ๊ฐ„ ์‹คํ–‰ ์ค‘ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ์ •์ง€ ์˜์‹ฌ: ๋ฉ”๋‰ด๋ฐ” ์ „์šฉ ์•ฑ์€ App Nap ๋Œ€์ƒ์ด๋ผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํƒ€์ด๋จธ๊ฐ€ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ํƒ€์ด๋จธ(๋ฉ”์ธ ์Šค๋ ˆ๋“œ)๋Š” ๊ณ„์† ๋Œ์•„ "์‚ด์•„์žˆ๋Š”๋ฐ ๋ฐ์ดํ„ฐ๋งŒ ๋ฉˆ์ถ˜" ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค โ†’ ProcessInfo.beginActivity๋กœ ๋ƒ… ๋ฐฉ์ง€ + os.log ๊ธฐ๋ฐ˜ ์ง„๋‹จ(3์ดˆ ํ‹ฑ ์š”์•ฝ, ๊ณต์‹ ์กฐํšŒ ๊ฒฐ๊ณผ, ํ‹ฑ ์ง€์—ฐ ๊ฒฝ๊ณ )์„ ๋‚ด์žฅํ•ด ์žฌ๋ฐœ ์‹œ log stream ํ•œ ์ค„๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ๋‹ค. ๋ฐฐ์šด ์ : ์ž๋™ ํด๋ง์˜ ๋ณดํ˜ธ ์žฅ์น˜(์Šค๋กœํ‹€)๊ฐ€ ์‚ฌ์šฉ์ž ๋ช…์‹œ ๋™์ž‘๊นŒ์ง€ ์‚ผํ‚ค๋ฉด "๊ณ ์žฅ"์œผ๋กœ ์ธ์‹๋œ๋‹ค โ€” ๊ฒฝ๋กœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ(logging)์„ ์ œํ’ˆ์— ๋‚ด์žฅํ•˜๋ผ.

์‚ฌ๋ก€ 4. ์„ธ์…˜ยท์ฃผ๊ฐ„ %๊ฐ€ /usage์™€ ๊ฐ€๋” ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž„

TL;DR โ€” ๊ฒŒ์ด์ง€๋Š” ๊ณต์‹ % ์œ„์— ์ด ๊ธฐ๊ธฐ์˜ ๋กœ์ปฌ ์‚ฌ์šฉ๋ถ„์„ ์–น์–ด ๋ณด๊ฐ„ํ–ˆ๋‹ค. ์›์ธ์„ ๋‹ค์„ฏ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ  ๊ณ ์ณ ๋ณด๋‹ค๊ฐ€, ๋ณด๊ฐ„ ์ž์ฒด๋ฅผ ๋นผ๊ณ  ๊ณต์‹ ๊ฐ’๋งŒ ์“ฐ๋Š” ์ชฝ์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

์›์ธ ์ฆ์ƒ ๋Œ€์‘
๋ณด๊ฐ„ ๋น„์œจ์„ ๋กœ์ปฌ 5์‹œ๊ฐ„ ๋ธ”๋ก(UTC ์ •์‹œ ๋‚ด๋ฆผ)์œผ๋กœ ๊ณ„์‚ฐ ๊ณต์‹ ์ฐฝ(์˜ˆ: 12:10~17:10)๊ณผ ์–ด๊ธ‹๋‚˜ ๋ณด๊ฐ„์ด ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง ๋ณด๊ฐ„ ์ œ๊ฑฐ
์กฐํšŒ ๋’ค ์ฐฝ์ด ์ดˆ๊ธฐํ™”๋ผ๋„ ๋‹ค์Œ ์กฐํšŒ๊นŒ์ง€ ์ด์ „ %๋ฅผ ์œ ์ง€ ์ดˆ๊ธฐํ™” ์งํ›„ ์ตœ๋Œ€ 3๋ถ„(์‹คํŒจ ์‹œ 15๋ถ„) 97% ๊ฐ™์€ ์˜› ๊ฐ’๊ณผ ๋นจ๊ฐ„ ๊ฒฝ๊ณ  ๋ฆฌ์…‹ ์‹œ๊ฐ์ด ์ง€๋‚˜๋ฉด 0%, 30์ดˆ ๊ฐ„๊ฒฉ ์žฌ์กฐํšŒ
ํ† ํฐ ์ˆ˜๋กœ ํ™˜์‚ฐ (๋Œ€๋ถ€๋ถ„ ๋‹จ๊ฐ€๊ฐ€ ๋‚ฎ์€ ์บ์‹œ ์ฝ๊ธฐ) ์ž‘์—… ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋ณด๊ฐ„์ด ํ”๋“ค๋ฆผ ๋ณด๊ฐ„ ์ œ๊ฑฐ
์ด ๊ธฐ๊ธฐ ๊ธฐ๋ก์— ์—†๋Š” ์‚ฌ์šฉ๋ถ„ (๋‹ค๋ฅธ ๊ธฐ๊ธฐยท์›น) ์‹ค์ธก 17๋ถ„ ๋™์•ˆ ์‹ค์ œ 1%p๋‹น ๋น„์šฉ์ด ์ฐฝ ํ‰๊ท ์˜ ์„ธ์…˜ 1.3๋ฐฐ, ์ฃผ๊ฐ„ 4.4๋ฐฐ ๋ณด๊ฐ„ ์ œ๊ฑฐ
resets_at์ด ์กฐํšŒ๋งˆ๋‹ค 1์ดˆ ์•ˆ์ชฝ์œผ๋กœ ํ”๋“ค๋ฆผ (17:09:59.75 โ†’ 17:10:00.47) ์•Œ๋ฆผ ์ถ”์ ๊ธฐ๊ฐ€ ๋งค ์กฐํšŒ๋ฅผ ์ƒˆ ์ฐฝ์œผ๋กœ ๋ด 80%/95% ์•Œ๋ฆผ์ด ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Œ ์ฐฝ ์‹๋ณ„์ž๋ฅผ ๋ถ„ ๋‹จ์œ„๋กœ ๋ฐ˜์˜ฌ๋ฆผ

๋น„์šฉ ํ™˜์‚ฐ๊ณผ ๊ณต์‹ ์ฐฝ ์ •๋ ฌ๋กœ ๋ณด๊ฐ„ ์˜ค์ฐจ๋ฅผ ์„ธ์…˜ 4%p โ†’ 1%p ์ˆ˜์ค€๊นŒ์ง€ ์ค„์˜€์ง€๋งŒ, ๊ณต์‹ ๊ฐ’์€ ์กฐํšŒ ์‹œ์ ์— ๋Š˜ ์ •ํ™•ํ•˜๊ณ  ์กฐํšŒ ์‚ฌ์ด ์ง€์—ฐ์€ ์ตœ๋Œ€ 3๋ถ„์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒŒ์ด์ง€๋Š” ๊ณต์‹ ๊ฐ’๋งŒ ์“ฐ๊ณ , "์•ฝ N๋ถ„ ๋’ค ํ•œ๋„"๋„ ์ตœ๊ทผ ๊ณต์‹ ๊ฐ’์˜ ์˜ค๋ฆ„์„ธ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ ๊ณต์‹ ๊ฐ’์ด ์—†์„ ๋•Œ ํ”Œ๋žœ ํ•œ๋„๋กœ ๊ณ„์‚ฐํ•˜๋˜ ์ถ”์ • ๋ชจ๋“œ๋„ ์ง€์› ๋‹ค. ๊ฐ’์ด ์—†์œผ๋ฉด --๋กœ ๋น„์šด๋‹ค. ๋ฐฐ์šด ์ : ์ •ํ™•ํ•œ ์›์ฒœ์ด ์žˆ์œผ๋ฉด, ๊ทธ ์‚ฌ์ด๋ฅผ ๋ฉ”์šฐ๋Š” ์ถ”์ •์€ ์›์ฒœ๊ณผ ๋ฒ”์œ„ยท๋‹จ์œ„๊ฐ€ ๊ฐ™๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๋งŒ ์“ด๋‹ค.

์‚ฌ๋ก€ 5. ๋ฉ”๋‰ด๋ฐ” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด CPU 18%๋ฅผ ์”€

TL;DR โ€” ํ”„๋ ˆ์ž„์„ ์ž˜๊ฒŒ ๋‚˜๋ˆ„์ž 30fps์—์„œ CPU 18%(60fps 26%)๊ฐ€ ๋‚˜์™”๋‹ค. ์„ค์น˜๋ผ ์žˆ๋˜ ์ด์ „ ๋นŒ๋“œ๋„ 42%์˜€๋‹ค. ํ”„๋ ˆ์ž„๋งˆ๋‹ค NSStatusBarButton.image๋ฅผ ๋ฐ”๊พธ๋ฉด ๋ฒ„ํŠผ ์…€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค. ํ”„๋ ˆ์ž„์„ ๋ฏธ๋ฆฌ ๋ž˜์Šคํ„ฐ๋ผ์ด์ฆˆํ•ด CAKeyframeAnimation(keyPath: "contents")๋กœ ๋„˜๊ธฐ์ž ์žฌ์ƒ์„ ์‹œ์Šคํ…œ ๋ Œ๋” ์„œ๋ฒ„๊ฐ€ ๋งก์•„ 0.5%(์ž ์ž˜ ๋•Œ 0.05%)๋กœ ๋‚ด๋ ค๊ฐ”๋‹ค. ๋ฒ„ํŠผ ํฌ๊ธฐ์™€ ์‚ฌ์šฉ๋ฅ  ๊ธ€์ž ๋ฐฐ์น˜๋Š” ํˆฌ๋ช…ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ ์ด๋ฏธ์ง€๋กœ ์žก๊ณ  ๋Ÿฌ๋„ˆ๋Š” ๊ทธ ์œ„ ๋ ˆ์ด์–ด์—์„œ ๋ˆ๋‹ค. ๋ฐฐ์šด ์ : ๋ฐ˜๋ณต ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์•ฑ์ด ๋งค ํ”„๋ ˆ์ž„ ๊ทธ๋ฆฌ์ง€ ๋ง๊ณ  ๋ Œ๋” ์„œ๋ฒ„์— ๋งก๊ธด๋‹ค.

8. ๋งˆ์ผ์Šคํ†ค & ๊ฒฐ๊ณผ

๋‹จ๊ณ„ ๊ณ„ํš ์™„๋ฃŒ ๊ธฐ์ค€ ๊ฒฐ๊ณผ
M0 (0.5์ผ) JSONL ์Šคํ‚ค๋งˆ ์‹ค๋ฌผ ๊ฒ€์ฆ, ccusage ๋ธ”๋ก ๋กœ์ง ๋Œ€์กฐ, OAuth ์—”๋“œํฌ์ธํŠธ ์‹ค์ธก JSONL ์Šคํ‚ค๋งˆ ์ •๋ฆฌ + ํŒŒ์„œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ โœ… ์ค‘๋ณต 6์ค„ยทsynthetic ๋ฐœ๊ฒฌ, ์—”๋“œํฌ์ธํŠธ HTTP 200 ์‹ค์ธก
M1 MVP (2์ผ) ๋ฉ”๋‰ด๋ฐ” ๋Ÿฌ๋„ˆ + burn rate ์—ฐ๋™ + ์ตœ์†Œ ํŒ์˜ค๋ฒ„ ์‹ค์‚ฌ์šฉ ์ค‘ ๊ณ ์–‘์ด ์†๋„ ์ฒด๊ฐ ์ผ์น˜ โœ…
M2 (2์ผ) ๊ณต์‹/์ฃผ๊ฐ„ ๊ฒŒ์ด์ง€, ํ”Œ๋žœ ์„ค์ •ยท์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜, ์ŠคํŒŒํฌ๋ผ์ธ ccusage ์˜ค์ฐจ < 2% โœ… ์˜ค์ฐจ 0.00%
M3 (1~2์ผ) ์•Œ๋ฆผ, ์ง€์นœ ๊ณ ์–‘์ด, ์ž๋™ ์‹œ์ž‘, ์„œ๋ช…, README dmg ๋ฐฐํฌ ๊ฐ€๋Šฅ โœ… + ์†Œ์Šค ๋ฐฐํฌ(install.sh) ์ฑ„ํƒ
v1.1 ๋Ÿฌ๋„ˆ ํ…Œ๋งˆ 3์ข…, ์ผ๋ณ„ ์ƒ์„ธ, ๋ฌด์ง€๊ฐœ ์ „์šฉ ์—์…‹ ๊ฒฝ๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ถ„๋ฆฌ ํ‘œ์‹œ โ€” โœ…
v1.2 ๋ฒกํ„ฐ ๋Ÿฌ๋„ˆ 22์ข…ยท์žฅ๋‚œ 22์ข…ยทํŒ์˜ค๋ฒ„ ๋ฌด๋Œ€ยท๋‚ด ๋Ÿฌ๋„ˆ, ๊ฒŒ์ด์ง€ ๊ณต์‹ ๊ฐ’ ์ „์šฉ /usage ์ผ์น˜, ์งˆ์ฃผ CPU < 0.5% โœ… CPU 0.5%, ํ…Œ์ŠคํŠธ 70๊ฐœ

9. ์ˆ˜์šฉ ๊ธฐ์ค€ (Acceptance Criteria) โ€” ์ตœ์ข… ์ฒดํฌ

  • Claude Code์—์„œ ๋Œ€ํ™” ์‹œ 3์ดˆ ์ด๋‚ด์— ๊ณ ์–‘์ด ์†๋„๊ฐ€ ๋ฐ˜์‘ํ•œ๋‹ค (3์ดˆ ์ฆ๋ถ„ ํด๋ง)
  • 5๋ถ„ ๋ฌดํ™œ๋™ ์‹œ ๊ณ ์–‘์ด๊ฐ€ ์ž ๋“ ๋‹ค (์ƒํƒœ๋จธ์‹  ํ…Œ์ŠคํŠธ + ์‹ค์ธก)
  • ๊ณต์‹ ์—ฐ๋™ ์ƒํƒœ์—์„œ ์„ธ์…˜/์ฃผ๊ฐ„ %๊ฐ€ /usage ํ‘œ์‹œ๊ฐ’๊ณผ ์ผ์น˜ (๋™์ผ ์—”๋“œํฌ์ธํŠธ, ๋ณด๊ฐ„ ์—†์Œ)
  • ๊ณต์‹ ์—ฐ๋™ offยท์‹คํŒจ ์‹œ ๊ฒŒ์ด์ง€๋ฅผ --๋กœ ๋น„์šฐ๊ณ  ์ด์œ  ํ‘œ์‹œ (๋กœ์ปฌ ์ถ”์ • ์—†์Œ)
  • ์„ธ์…˜ ํ† ํฐ ํ•ฉ๊ณ„๊ฐ€ ccusage blocks ํ˜„์žฌ ๋ธ”๋ก๊ณผ ์˜ค์ฐจ 2% ์ด๋‚ด โ†’ 0.00%
  • 80%/95% ์•Œ๋ฆผ์ด ๊ฐ 1ํšŒ๋งŒ ๋ฐœ์†ก (์ •์ฑ… ๋‹จ์œ„ํ…Œ์ŠคํŠธ 7๊ฐœ)
  • ์œ ํœด CPU < 0.5% โ†’ 0.05% ์‹ค์ธก (30fps ์งˆ์ฃผ 0.5%)

10. ๋ฆฌ์Šคํฌ & ๋Œ€์‘

๋ฆฌ์Šคํฌ ๋Œ€์‘
๋น„๋ฌธ์„œํ™” usage ์—”๋“œํฌ์ธํŠธ ๋ณ€๊ฒฝยท์ฐจ๋‹จ ๊ฒŒ์ด์ง€๋ฅผ ๋น„์šฐ๊ณ  ์ด์œ  ํ‘œ์‹œ(์•ฑ์ด ์ฃฝ์ง€ ์•Š์Œ), ํด๋ง 180์ดˆยทUser-Agent ์ค€์ˆ˜, ์‘๋‹ต ์Šคํ‚ค๋งˆ ๊ด€์šฉ ํŒŒ์‹ฑ(limits[] ๋ฐฐ์—ด ํด๋ฐฑ ํฌํ•จ). ํ† ํฐ์€ ๋กœ์ปฌ ์ฝ๊ธฐ ์ „์šฉ
Claude Code์˜ JSONL ํฌ๋งท ๋ณ€๊ฒฝ ํŒŒ์„œ ์Šคํ‚ค๋งˆ-๊ด€์šฉ(ํ•„๋“œ ๋ˆ„๋ฝ ์‹œ skip), ๋ฒ„์ „ ๊ฐ์ง€
๊ณต์‹ ๊ฐ’์ด ์—†์„ ๋•Œ ์‚ฌ์šฉ๋ฅ ์„ ๋ชจ๋ฆ„ ๊ฒŒ์ด์ง€๋ฅผ --๋กœ ๋น„์šฐ๊ณ  ์ƒํƒœ ์ค„์— ์ด์œ  ํ‘œ์‹œ. ์†๋„ยท์˜ค๋Š˜ ์‚ฌ์šฉ๋Ÿ‰์€ ๋กœ์ปฌ ๊ธฐ๋ก์œผ๋กœ ๊ณ„์† ํ‘œ์‹œ
์บ๋ฆญํ„ฐ ์ €์ž‘๊ถŒ ๋Ÿฌ๋„ˆ๋Š” ์ „๋ถ€ ์ง์ ‘ ๊ทธ๋ฆฐ ๋ฒกํ„ฐ(์žฅ๋ฅด ์ „ํ˜•๋งŒ ์ฐธ๊ณ ), ๋ƒฅ์บฃยท์œ ๋ช… ์บ๋ฆญํ„ฐ ๋ฏธ์‚ฌ์šฉ. ๋‚ด ๋Ÿฌ๋„ˆ ๊ทธ๋ฆผ์€ ์•ฑ์— ์‹ฃ์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž Mac์—๋งŒ ์ €์žฅ
ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ์‚ฌ์šฉ(๋ณ„๋„ ํฌ๋ ˆ๋”ง ํ’€) ํ˜ผ์ž… entrypoint "sdk" ๋งˆ์ปค๋กœ ๋ถ„๋ฆฌ ํ‘œ์‹œ + ๊ด€์šฉ ํŒ๋ณ„์ž„์„ ๋ฌธ์„œ ๋ช…์‹œ
๋‹ค์ˆ˜ ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์‹œ์ž‘ ํ’€์Šค์บ” ์ง€์—ฐ ํŒŒ์ผ mtime ํ•„ํ„ฐ(์ตœ๊ทผ 8์ผ) + ์˜คํ”„์…‹ ์ฆ๋ถ„ ํŒŒ์‹ฑ

11. ๋ฐฐ์šด ์  ์ข…ํ•ฉ

  1. ์‹ค๋ฌผ ์šฐ์„ : ๋ฌธ์„œยทํ†ต๋… ๋Œ€์‹  ์‹ค์ œ JSONL 1,432๊ฑด์„ ๋จผ์ € ๋ถ„์„ํ•ด ์ค‘๋ณต ๊ธฐ๋ก์ด๋ผ๋Š” ๊ฒฐ์ •์  ํ•จ์ •์„ ์ฒซ๋‚  ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์ŠคํŒŒ์ดํฌ ๋น„์šฉ ๋ฐ˜๋‚˜์ ˆ์ด ์ดํ›„ ๋ชจ๋“  ์ง‘๊ณ„์˜ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
  2. ๋ณด์•ˆ ๋™์ž‘๊ณผ ๋ฒ„๊ทธ์˜ ๊ตฌ๋ถ„: ํ‚ค์ฒด์ธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์šฐํšŒํ•˜์ง€ ์•Š๊ณ  OS ๊ทœ์น™ ์•ˆ์—์„œ ์ ‘๊ทผ ๋นˆ๋„ยท์‹ ๋ขฐ ๋‹จ์œ„๋ฅผ ์žฌ์„ค๊ณ„ํ–ˆ๋‹ค. ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌธ์„œํ™”๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„ ํƒ๊ถŒ์„ ์คฌ๋‹ค.
  3. ์ด์ข… ๋ฐ์ดํ„ฐ ๊ฒฐํ•ฉ์€ ๋‹จ์œ„ ๊ฒ€์ฆ๋ถ€ํ„ฐ: ๊ฐ™์€ "ํ† ํฐ"์ด๋ผ๋„ ๊ณ„์ • ํ•œ๋„์™€ ๋กœ๊ทธ์˜ ํ† ํฐ์€ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ๋Ÿ‰ โ€” ๊ณ ์ • ์ƒ์ˆ˜๋กœ ํ™˜์‚ฐํ•˜์ง€ ์•Š๊ณ , ์ •ํ™•ํ•œ ์›์ฒœ์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ๋งŒ ์“ด๋‹ค.
  4. ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ์€ ์ œํ’ˆ ๊ธฐ๋Šฅ: "๊ฐฑ์‹ ์ด ์•ˆ ๋œ๋‹ค"๋Š” ๋ชจํ˜ธํ•œ ์ œ๋ณด๋ฅผ ์œ„ํ•ด ์ง„๋‹จ ๋กœ๊น…์„ ๋‚ด์žฅํ–ˆ๋‹ค โ€” ๋‹ค์Œ ์ œ๋ณด๋Š” log stream ํ•œ ์ค„๋กœ ์›์ธ์ด ์ขํ˜€์ง„๋‹ค.
  5. ์ •์งํ•œ UI: ๊ณต์‹ ๊ฐ’์ด ์—†์œผ๋ฉด ์ˆซ์ž๋ฅผ ์ง€์–ด๋‚ด์ง€ ์•Š๊ณ  --๋กœ ๋น„์šด๋‹ค. ์ •ํ™•๋„์˜ ํ•œ๊ณ„๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

12. ์ฐธ๊ณ  ์ž๋ฃŒ