Fair Upstream Comparison 55 KO - teamswyg/laya-tools GitHub Wiki

์™ธ๋ถ€ Go ์ž‘์—…์˜ ๊ณต์ •ํ•œ ๋น„๊ต ์ค€๋น„์™€ ๊ฐœ๋ฐœ ๊ด€์ธก

English ยท ๋‘ ์›์ฒœ ๊ณ„์•ฝ ยท ๊ทœ๋ชจ์™€ ๋ถ„ํ•  ์›์น™

์ด ๋ฌธ์„œ๋Š” PDCA55์˜ ํ‰๊ฐ€ framework ์ค€๋น„์™€ ํ›„์† ๊ฐœ๋ฐœ ๊ด€์ธก์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์›๋ณธ ์ฝ”๋“œ์— ์–ด๋–ค ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ•˜๋Š”์ง€ ๋ชจ๋ธ์— ์ถฉ๋ถ„ํžˆ ์•Œ๋ฆฌ๊ณ , ๋ชจ๋ธ์˜ ์ž์ฒด ๊ฒ€์‚ฌ์™€ ๋…๋ฆฝ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ™์€ Go ์–ธ์–ด ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ค€๋น„ ์‹œ์ ์˜ ์™ธ๋ถ€ ๋ชจ๋ธ ์‹คํ–‰์€ 0ํšŒ์˜€์œผ๋ฉฐ, ์ดํ›„ ๊ธฐ์กด ๋‘ ๋…ผ๋ฆฌ ์š”์ฒญ์— ์‹ค์ œ CLI ์‹œ๋„ 4ํšŒ๋ฅผ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ˆ˜๋ฝ๊ธฐ ๊ฒ€์‚ฌ์™€ ๊ฐ€์งœ ์‹คํ–‰๊ธฐ ์˜ˆ์‚ฐ ๊ฒ€์‚ฌ๋Š” ์‹ค์ œ ๋ชจ๋ธ ๊ด€์ธก๊ณผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ˆ„์  ์‹ค์ œ ๊ฐœ๋ฐœ ๋ฒ”์œ„๋Š” ๊ณ ์œ  ์š”์ฒญ 7๊ฐœยท๊ธฐ๋ก 20๊ฐœยท์‹œ๋„ํ•œ ์ฝ”๋“œ ๊ฐ€์กฑ 5๊ฐœยท์ €์žฅ์†Œ 3๊ฐœ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ 55, ๊ธฐ๊ณ„ ํŒ๋… ๊ฒฐ๊ณผ

์ˆ˜๋ฅผ ๋จผ์ € ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค

24๊ฐœ ํ•ฉ์„ฑ ์˜๋ฏธ ๊ฒ€์ƒ‰ probe๋Š” ์ดˆ๊ธฐ ๋™์ž‘์„ ํ™•์ธํ•œ ๊ฐœ๋ฐœ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ฑ๋Šฅ ์ฃผ์žฅ์„ ์œ„ํ•œ ๋ชฉํ‘œ๋Š” ํ‰๊ฐ€ ๋„๋ฉ”์ธ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋ณดํ˜ธ๋œ ์ตœ์ข… ์š”์ฒญ ์ตœ์†Œ 2,400๊ฐœ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰, ์‹ค์ œ ๋ชจ๋ธ ๋ผ์šฐํŒ…, ์ €์žฅ์†Œ ์„ ํƒ, ์ž‘์—… ๋ถ„ํ• ์€ ๊ฐ์ž ๋‹ค๋ฅธ ์ •๋‹ต๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ฐœ๋ฐœ์— ์ฝ์€ ์š”์ฒญ์„ ๋ณดํ˜ธ๋œ ์ตœ์ข… ์ž๋ฃŒ๋กœ ์ด๋ฆ„๋งŒ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฒ”์œ„ ์ค€๋น„ ์‹œ์ ๊ณผ ํ˜„์žฌ์˜ ์ˆ˜ยท์˜๋ฏธ
์ค€๋น„ ์‹œ์ ๊นŒ์ง€์˜ ์‹ค์ œ ์ฝ”๋”ฉ ๊ฐœ๋ฐœ ๊ด€์ธก ๊ณ ์œ  ์š”์ฒญ 5๊ฐœ, CLI ๊ธฐ๋ก 16๊ฐœ, ์„ธ ์ฝ”๋“œ ๊ฐ€์กฑ, laya-tools ํ•œ ์ €์žฅ์†Œ
์ปดํŒŒ์ผ๋œ ๋…ผ๋ฆฌ ๊ฒ€์‚ฌ ์ž‘์—… ์„œ๋กœ ๋‹ค๋ฅธ ๋…ผ๋ฆฌ ์ž‘์—… 7๊ฐœ, ์›์ฒœ ์ €์žฅ์†Œ 3๊ฐœ. v2 ๋ฒ„์ „ ์ถ”๊ฐ€๋กœ ๋Š˜์ง€ ์•Š์œผ๋ฉฐ ์‹คํ–‰ ๊ธฐ๋ก๊ณผ ๋ณ„๋„ ๋ฒ”์œ„
๋ณด์กดํ•œ ์™ธ๋ถ€ ์›์ฒœ inventory ์›๋ณธ ํ›„๋ณด 120๊ฐœ. ์ •๋‹ต์ด๋‚˜ 120๊ฐœ์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ณ„์•ฝ์ด ์•„๋‹˜
์ด๋ฒˆ v2 ๊ธฐ์กด ์™ธ๋ถ€ ์š”์ฒญ 2๊ฐœ์˜ ์„ค๋ช…ยทํ‰๊ฐ€ ๋ฒ„์ „. ์ƒˆ ๊ณ ์œ  ์š”์ฒญ 2๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด ์•„๋‹˜
์™ธ๋ถ€ ๋‘ ์š”์ฒญ์˜ ์‹ค์ œ ๋ชจ๋ธ ์‹œ๋„ ์ค€๋น„ ์‹œ์  0ํšŒ โ†’ 55์—์„œ CLI ์‹œ๋„ 4ํšŒ, ์„œ๋กœ ๋‹ค๋ฅธ ๋…ผ๋ฆฌ ์š”์ฒญ 2๊ฐœ
ํ˜„์žฌ ๋ˆ„์  ์‹ค์ œ ์ฝ”๋”ฉ ๊ฐœ๋ฐœ ๊ด€์ธก ๊ณ ์œ  ์š”์ฒญ 7๊ฐœยท๊ธฐ๋ก 20๊ฐœยท์‹œ๋„ํ•œ ์ฝ”๋“œ ๊ฐ€์กฑ 5๊ฐœยท์ €์žฅ์†Œ 3๊ฐœ
์ด๋ฒˆ ์™ธ๋ถ€ ๋‘ ์š”์ฒญ์˜ ํ•™์Šต ์‹คํ–‰ยทํ•™์Šต ๋ผ๋ฒจยท์ตœ์ข… ์ ๊ฒฉ ์š”์ฒญ ๊ฐ๊ฐ 0
์ด๋ฒˆ ์ค€๋น„์—์„œ ์ƒˆ๋กœ ํ•™์Šตํ•˜๊ฑฐ๋‚˜ ๋ฐฐํฌํ•œ ๊ฐ€์ค‘์น˜ 0

๋ชจ๋ธ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๊ฐ™์€ ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ž…๋ ฅ์ด๋‚˜ ๋ฒˆ์—ญ์„ ๋Š˜๋ ค๋„ ๊ณ ์œ  ์š”์ฒญ ์ˆ˜๋Š” ๋Š˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. v1๊ณผ v2๋Š” logical_task_id์™€ previous_task_id๋กœ ๊ฐ™์€ ์›์ฒœ ์š”์ฒญ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. registry์˜ ๋ฒ„์ „ ID๊ฐ€ ๋‘ ๊ฐœ ๋Š˜์–ด๋„ ๊ธฐ์กด 7๊ฐœ ๋…ผ๋ฆฌ ์ž‘์—…์˜ ์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํ›„๋ณด ๊ธฐ๋ก๊ณผ ์›์ฒœ 120๊ฐœ ๋ชฉ๋ก์€ ์„œ๋กœ ํ•ฉ์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

55์˜ ์‹ค์ œ ๊ฐœ๋ฐœ ๊ด€์ธก

์‚ฌ์ „์— ๋ด‰์ธํ•œ ๋‘ child plan๊ณผ ๋„ค ์Šฌ๋กฏ ์ˆœ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์š”์ฒญ์œผ๋กœ ์Šฌ๋กฏ 2์™€ 3 ์‚ฌ์ด์— upstream ๊ฒ€ํ† ๋ฅผ ์œ„ํ•œ ์ผ์‹œ์ •์ง€๊ฐ€ ์žˆ์—ˆ๊ณ , ๋ช…์‹œ์  ์žฌ๊ฐœ ํ›„ ๋ฏธ์‹คํ–‰ ์Šฌ๋กฏ 3ยท4๋งŒ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šฌ๋กฏ 1ยท2์˜ ์‹คํŒจ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‹œ๋„๋กœ ๊ต์ฒดํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์Šฌ๋กฏ ์š”์ฒญ ํ”„๋กœํ•„ยท์ž‘์—… ๋…๋ฆฝ ๊ฒ€์ฆ ๋ณธ ์‹คํ–‰ / ๋…๋ฆฝ ๊ฒ€์‚ฌ ์‹œ๊ฐ„
1 Sol low ยท humanize accepted, ์ข…๋ฃŒ pass 6๊ฐœ 76.404์ดˆ / 4.170์ดˆ
2 Luna low ยท UUID rejected, pass ์ˆ˜ ๋ฏธ์ง‘๊ณ„ 98.471์ดˆ / 5.852์ดˆ
3 Luna low ยท humanize accepted, ์ข…๋ฃŒ pass 6๊ฐœ 20.836์ดˆ / 4.646์ดˆ
4 Sol low ยท UUID accepted, ์ข…๋ฃŒ pass 218๊ฐœ 43.474์ดˆ / 5.421์ดˆ

๋„ค ์‹คํ–‰ ๋ชจ๋‘ ์ •์ƒ ์ข…๋ฃŒยท์ „์ฒด ์‚ฌ์šฉ๋Ÿ‰ยท์ธ์ฆ ์ œ๊ฑฐยทํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน ์ •๋ฆฌ์™€ terminal receipt๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ํ”„๋กœํ•„์€ ์‹คํ–‰๊ธฐ์— ๋ช…์‹œํ•œ ์„ค์ •์ด๋ฉฐ ์ œ๊ณต์ž๊ฐ€ ํ™•์ธํ•œ ๋ชจ๋ธ ์ •์ฒด๋Š” ๋ชจ๋‘ unknown์ž…๋‹ˆ๋‹ค. UUID ์‹คํŒจ ํ›„๋ณด๋Š” ๋’ค์ชฝ์˜ ์ž˜๋ชป๋œ ์ž…๋ ฅ์—์„œ ์ด๋ฏธ ์ฑ„์šด UUID๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์˜ค๋ฅ˜ ์‹œ ์ „์ฒด๋ฅผ 0์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ๋ฅผ ์–ด๊น๋‹ˆ๋‹ค. ์ด๋Š” ๋ด‰์ธํ•œ ํ›„๋ณด ์†Œ์Šค์˜ ์ •์  ๊ฒ€ํ† ์ด๋ฉฐ ์žฌ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‹คํŒจ ๊ธฐ๋ก์˜ pass ์ˆ˜ 0์€ ๊ฒ€์‚ฌ ๋ฏธ์‹คํ–‰์ด๋‚˜ 218๊ฐœ ์ „๋ถ€ ์‹คํŒจ๋ผ๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค.

์‚ฌ์ „ native ์˜ˆ์ธก์€ ์ „์ฒด Prompt๋ฅผ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅํ–ˆ๊ณ  ๋‘ ๊ฑด ๋ชจ๋‘ ์ž…๋ ฅ์ด ์ž˜๋ ค ๋ณด๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ผ์šฐํŒ… ํšจ์šฉ์ด๋‚˜ ๋ณด์ •๋œ ๋‚œ์ด๋„ ์ •๋‹ต์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฒˆ์— ์ฒ˜์Œ ์‹ค์ œ ๊ด€์ธกํ•œ ๊ธฐ์กด ๋‘ ์š”์ฒญ ๋•Œ๋ฌธ์— ๊ด€์ธก ๋ฒ”์œ„๊ฐ€ 5๊ฐœ์—์„œ 7๊ฐœ๋กœ ๋Š˜์—ˆ์ง€๋งŒ, ์ปดํŒŒ์ผ๋œ registry์˜ ์ƒˆ ๋…ผ๋ฆฌ ์š”์ฒญ์€ 0๊ฐœ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ๋งˆ๋‹ค ํ”„๋กœํ•„๋ณ„ ํ•œ ๊ด€์ธก, ์ผ์‹œ์ •์ง€์™€ ์„œ๋กœ ๋‹ค๋ฅธ ์บ์‹œ ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ ๋ชจ๋ธ ์ˆœ์œ„ยท๊ธˆ์•กยท๊ตฌ๋… ์†Œ๋ชจ์œจ ์ ˆ๊ฐ์„ ์ž…์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•™์Šตยทprotected final ์ฑ„์ ยท๊ฐ€์ค‘์น˜ ๋ฐฐํฌยท๊ธฐ๋ณธ ๋ผ์šฐํŒ… ๋ณ€๊ฒฝ์€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์›๋ณธ ๊ฒฐ๊ณผ์™€ ํ•œ๊ณ„, ๊ณต๊ฐœ ์˜์ˆ˜์ฆ

์™œ v2๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”

๊ธฐ์กด humanize์˜ Prompt๋Š” ํ•œ ๋ฌธ์žฅ์ด์–ด์„œ legacy ๋ณด์กด, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ํŒŒ์ผ๊ณผ ์ง€์›ํ•˜๋Š” ์ฝ”๋“œ ํ˜•ํƒœ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ „๋‹ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. UUID์—๋Š” ๋งŽ์€ ์ œ์•ฝ์ด ์žˆ์—ˆ์ง€๋งŒ ์ •ํ™•ํ•œ ํ—ˆ์šฉ ํ•จ์ˆ˜ ๋ชฉ๋ก๊นŒ์ง€ ๊ณต๊ฐœํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋…๋ฆฝ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์กฐ๊ฑด์„ ๋ชจ๋ธ์ด ์‹ค์ œ๋กœ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ๊ณต์ •ํ•œ ๋น„๊ต๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ƒˆ v2๋Š” ์ „์ฒด ์š”๊ตฌ๋ฅผ Spec.Prompt์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์— ๋ณด๋‚ด๋Š” stdin์€ ์ด Prompt ๊ทธ๋Œ€๋กœ์ด๋ฉฐ ๋ณ„๋„ Acceptance ํ•ญ๋ชฉ์ด๋‚˜ GitHub ๋ฌธ์„œ๋ฅผ ๋ชจ๋ธ์ด ์ฝ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ Prompt bytes์˜ SHA, Spec, Definition, ๋…๋ฆฝ Contract์™€ ์‹คํ–‰ recipe๋ฅผ ๊ณ„ํš ๋ฐ ๊ธฐ๋ก์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ 7๊ฐœ ์ž‘์—…์˜ SpecยทDefinitionยทPromptยทContract์™€ ์›๋ณธ fixture ํ•ด์‹œ๋Š” ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ๊ณ„ํš๊ณผ ์‹คํ–‰ ๊ธฐ๋ก๋„ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์š”์ฒญ v2 ID ๊ธฐ์กด ๋…ผ๋ฆฌ์š”์ฒญ ์ƒˆ ํ–‰๋™ ์š”๊ตฌ์˜ ์˜ˆ
์ „์ฒด int64 ์„œ์ˆ˜ go55-humanize-ordinal64-v2 go53-humanize-ordinal64 ์ƒˆ API์˜ -21st์™€ ๊ธฐ์กด Ordinal(-21)์˜ -21th๋ฅผ ํ•จ๊ป˜ ๋ณด์กด
์†Œ๋ฌธ์ž UUID ํŒŒ์„œ go55-uuid-canonical-parse-v2 go53-uuid-canonical-parse ์ƒˆ API๋Š” ์—„๊ฒฉํ•œ ์†Œ๋ฌธ์ž 36๋ฐ”์ดํŠธ๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ๊ธฐ์กด broad Parse/ParseBytes๋Š” ์œ ์ง€

humanize ๊ณ„์•ฝ์€ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํƒ€์ž… func(int64) string์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„ ์–ธ๋œ ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ๊ฐ’ ๋ณ€์ˆ˜์˜ ์ฐจ์ด๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ณ„์•ฝ์€ ์•„๋‹™๋‹ˆ๋‹ค. UUID๋Š” ๊ธฐ์กด prefix ๋’ค์— ์ •ํ™•ํžˆ func ParseCanonical(s string) (UUID, error) ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ œํ•œ๋œ ํ˜•ํƒœ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Go ์‹คํ–‰ ํŒŒ์ผ๊ณผ ์–ธ์–ด ๋ฒ„์ „์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค

Go 1.27.1 ์‹คํ–‰ ํŒŒ์ผ์„ ์“ฐ๋”๋ผ๋„ go.mod์˜ go ์ค„์ด ์ปดํŒŒ์ผ ์–ธ์–ด ์กฐ๊ฑด์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. go ์ค„์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ ์–ธ์–ด ๋ฒ„์ „์€ 1.16์ž…๋‹ˆ๋‹ค. Go ๊ณต์‹ toolchain ์„ค๋ช…, go.mod ์„ค๋ช…

์›์ฒœ ๊ณ ์ • revision ์›๋ณธ ๋ชจ๋“ˆ ์–ธ์–ด ์‹คํ–‰ ํŒŒ์ผ
dustin/go-humanize a1b4e66b9a6d890e9e15e7091cf16c8032367d6e ๋ช…์‹œ๋œ Go 1.21 go1.27.1
google/uuid 2d3c2a9cc518326daf99a383f07c4d3c44317e4d go directive๊ฐ€ ์—†์–ด ์•”๋ฌต์  Go 1.16 go1.27.1

v2 ๋…๋ฆฝ ๊ฒ€์‚ฌ๊ธฐ๋Š” ๋‚ด๋ถ€์— ๊ณ ์ •ํ•œ ์›๋ณธ go.mod bytes๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์›๋ณธ ํŒŒ์ผ SHA, ๋ชจ๋“ˆ ์ด๋ฆ„, ์˜์กด์„ฑ์ด ์—†๋Š” module/go directive ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•˜๋ฉฐ ํ›„๋ณด์˜ ๋ชจ๋“ˆ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ›„๋ณด๊ฐ€ go.mod๋ฅผ ๋ฐ”๊พธ๋ฉด ๊ฒ€์‚ฌ ๋Œ€์ƒ ๋ฐ– ์†Œ์Šค ๋ณ€๊ฒฝ์œผ๋กœ ๊ฑฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ํ›„๋ณด ํ…Œ์ŠคํŠธยทgo.work ์„ค์ •๋„ ๋…๋ฆฝ compiler ์ž…๋ ฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‹คํ–‰ ํ›„ ์ž„์‹œ ์›๋ณธ ๋ชจ๋“ˆ์ด ๊ทธ๋Œ€๋กœ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด v1์˜ ์ž„์‹œ minimal module์€ ์–ธ์–ด 1.27.1์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. v2์—๋งŒ ์›๋ณธ ์–ธ์–ด recipe๋ฅผ ์ ์šฉํ•˜๋ฉฐ, ๋ชจ๋“ˆ SHAยท์–ธ์–ด ๋ฒ„์ „ยท์‹คํ–‰ ํŒŒ์ผ ๋ฒ„์ „ยทrecipe SHA๋ฅผ ๊ฐ๊ฐ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. actor์— ์ƒˆ -modfile ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋กœ์ปฌ ๋Œ€์กฐ ๊ฒ€์‚ฌ์—์„œ ๋‘ v2 ์ •๋‹ต์€ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. humanize๋Š” 6๊ฐœ, UUID๋Š” ์›๋ณธ suite๋ฅผ ํฌํ•จํ•œ 218๊ฐœ terminal pass๋ฅผ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…๋ณ„ ์˜ค๋‹ต ํ•œ ์ข…๋ฅ˜๋Š” ๊ฑฐ์ ˆ๋๊ณ , UUID์˜ ๋‚œ์ˆ˜ ํ˜ธ์ถœยท์›๋ณธ ํ—ค๋” ๋ณ€๊ฒฝยท์ถ”๊ฐ€ helper์™€ humanize์˜ import ๋ณ€๊ฒฝ์€ ์‹คํ–‰ ์ „์— unknown์ด ๋์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์— Go 1.22์˜ ์ •์ˆ˜-range ๋ฌธ๋ฒ•์„ ๋„ฃ์œผ๋ฉด ๊ธฐ์กด v1์—์„œ๋Š” ํ†ต๊ณผํ•˜๊ณ  ์ƒˆ v2์—์„œ๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๊ฑฐ์ ˆ๋์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์–ธ์–ด ์กฐ๊ฑด ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฐœ๋ฐœ ๋Œ€์กฐ๊ตฐ์ด๋ฉฐ ๋ชจ๋ธ ์‹คํ–‰์ด ์•„๋‹™๋‹ˆ๋‹ค.

accepted์™€ unknown์˜ ๋ฒ”์œ„

๋…๋ฆฝ ๊ฒ€์‚ฌ๊ธฐ๋Š” ํ›„๋ณด๊ฐ€ ๋งŒ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณต ๊ทผ๊ฑฐ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๋ณธ ํ…Œ์ŠคํŠธ์™€ ๋ณ„๋„ ๊ณ ์ • ๊ณ„์•ฝ์ด ์‹คํ–‰๋˜์–ด ์š”๊ตฌํ•œ ์ด๋ฆ„์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์ •ํ™•ํ•œ ํŒจํ‚ค์ง€์—์„œ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™„์ „ํ•œ ํŒŒ์ผ์€ trusted Go 1.27.1 gofmt์— ๋งž์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

UUID checker๋Š” ์ •ํ™•ํ•œ ์›๋ณธ prefix ๋˜๋Š” ๊ณ ์ • formatter ๊ฒฐ๊ณผ ๋’ค์˜ ํ•จ์ˆ˜ ํ•˜๋‚˜, ์ง€์—ญ ๊ฐ’ ์“ฐ๊ธฐ์™€ ๋ช…์‹œ๋œ ์ˆœ์ˆ˜ ํ˜ธ์ถœ ๋ชฉ๋ก๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋ณ„์นญ์„ ํ†ตํ•œ ํ˜ธ์ถœ, ํฌ์ธํ„ฐ, ์ถ”๊ฐ€ helper, ๋™์‹œ์„ฑ, ์ „์—ญ ๋ณ€๊ฒฝ ๋“ฑ์€ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋”๋ผ๋„ verifier_unknown์ž…๋‹ˆ๋‹ค. humanize์— ์ด UUID ์ „์šฉ ์ œํ•œ์„ ์ ์šฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์› ๋ฐ– ํ˜•ํƒœ, ๊ฒ€์ฆ ํ™˜๊ฒฝ ์˜ค๋ฅ˜, ์„œ๋น„์Šค ์˜ค๋ฅ˜์™€ ์‚ฌ์šฉ๋Ÿ‰ ๋ˆ„๋ฝ์„ ๋ชจ๋ธ์˜ ํ–‰๋™ ์‹คํŒจ๋‚˜ ์‚ฌ์šฉ๋Ÿ‰ 0์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์›๋ณธ MITยทBSD-3-Clause LICENSE๋Š” ๋ณ„๋„๋กœ SHA๋ฅผ ํ™•์ธํ•œ ๋’ค ๊ฒ€์ฆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๊ณ ์ • ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ›„๋ณด LICENSE์˜ ๋‚ด์šฉ์€ ์„ฑ๊ณต ๋ผ๋ฒจ์ด ํ‰๊ฐ€ํ•˜๋Š” ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. accepted๋Š” ํ›„๋ณด ๋˜๋Š” ํ›„์† ๋ฐฐํฌ์˜ attribution ์ค€์ˆ˜๋ฅผ ์ธ์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UUID์˜ ์›๋ณธ copyright header๋Š” ํ‰๊ฐ€ ๋Œ€์ƒ ์†Œ์Šค prefix์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ strict shape ๊ฒ€์‚ฌ๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ”์œ„์˜ ์†Œ์Šค ๋ผ์ด์„ ์Šค ํ™•์ธ์„ ๋ชจ๋ธ ํ•™์Šตยท๊ฐ€์ค‘์น˜ยท๋ฐ์ดํ„ฐ ๋ฐฐํฌ ํ—ˆ๊ฐ€๋กœ ํ™•๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ์ž‘์—… ๊ณ„ํš๊ณผ ์ „์ฒด ๋„ค ์Šฌ๋กฏ

๋‘ ์›์ฒœ์˜ revision์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ž‘์—…๋งˆ๋‹ค ๋ณ„๋„์˜ child plan์„ ๋‘ก๋‹ˆ๋‹ค. ๊ฐ child plan์—๋Š” ๋‘ ํ”„๋กœํ•„์˜ ์‹œ๋„ ํ•˜๋‚˜์”ฉ์„ ๋„ฃ๊ณ  parent manifest๊ฐ€ ๋‘ child plan SHA์™€ ์ด ๋„ค ์Šฌ๋กฏ์˜ ์ˆœ์„œ๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ parent๋Š” ์‹คํ–‰ ์˜ˆ์‚ฐ์„ ๋ฌถ๋Š” ๊ณ„ํš์ด๋ฉฐ ์ƒˆ ๋ถ€๋ชจยท์ž์‹ ๋ชจ๋ธ์„ ํ•™์Šตํ•œ๋‹ค๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค. parent๊ฐ€ ์ž์‹ SHA๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ์ˆœํ™˜ ํ•ด์‹œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ๊ณ ์ • manifest์™€ ํ•˜๋‚˜์˜ private durable ledger์—์„œ ์˜ˆ์•ฝ์€ ์ตœ๋Œ€ 4๊ฐœ์ด๊ณ  ๋™์‹œ์— ํ™œ์„ฑ controller๋Š” 1๊ฐœ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ ์‹œ์ž‘ ์ „์— ์Šฌ๋กฏ์„ ์˜ˆ์•ฝํ•˜๋ฉฐ ์ค‘๋ณต, ์ˆœ์„œ ์˜ค๋ฅ˜, ๋‹ค๋ฅธ task/profile/Prompt/recipe ์—ฐ๊ฒฐ๊ณผ ๋‹ค์„ฏ ๋ฒˆ์งธ ์˜ˆ์•ฝ์„ ๊ฑฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ์Šฌ๋กฏ๋„ ํ™˜๋ถˆํ•˜๊ฑฐ๋‚˜ ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. crash๋‚˜ ์‹œ์ž‘ ์ฆ๊ฑฐ ๋ˆ„๋ฝ ๋“ฑ ๋ถˆ๋ช…ํ™•ํ•œ ์ƒํƒœ๋Š” ์ถ”์ธกํ•ด ๋ณต๊ตฌํ•˜์ง€ ์•Š๊ณ  fail closed๋กœ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์•ฝ ์ˆ˜, durable ์‹œ์ž‘ marker, terminal receipt์™€ ์‹œ์ž‘ ์ƒํƒœ ๋ฏธํ™•์ธ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด ์ œํ•œ์€ ํ•ด๋‹น ledger์˜ ์‹คํ–‰์—๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ledger๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ํ˜ธ์ŠคํŠธ ์ „์ฒดยท๊ณ„์ • ์ „์ฒด ์˜ˆ์‚ฐ์ด ์•„๋‹ˆ๋ฉฐ, provider ๋‚ด๋ถ€ ์š”์ฒญยท์žฌ์‹œ๋„ ํšŸ์ˆ˜๋„ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ์ธก์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•œ ์‹คํ—˜์„ ๋‹ค๋ฅธ ledger๋กœ ์žฌ์‹คํ–‰ํ•ด cap์„ ์šฐํšŒํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์•ฝยทleaseยทstop ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ledger๋ฅผ ์ˆ˜๋™ resetํ•ด ์žฌ๊ฐœํ•˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ณต๊ตฌ ๊ฒฝ๋กœ๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋ชจ๋ธ ์‹คํ–‰ ์ „ gate

  1. ์ƒˆ source์˜ ๊ณต๊ฐœ CI์™€ ๋…๋ฆฝ ๊ฒ€ํ† ๋ฅผ ํ™•์ธํ•˜๊ณ  clean executorยทGoยทCLI hashes๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ค€๋น„ ๋ฌธ์„œ๋งŒ์œผ๋กœ ํ†ต๊ณผ๋ฅผ ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์›๋ณธ closureยท๋ผ์ด์„ ์Šค์™€ v1 ๋ณด์กด ํšŒ๊ท€๋ฅผ ํ™•์ธํ•˜๊ณ  v2 Specยท์ „์ฒด stdinยทContractยทrecipe๋ฅผ ๋ด‰์ธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ์ž์ฒด ๊ฒ€์‚ฌ๋„ ์›๋ณธ ์–ธ์–ด๋กœ ์‹คํ–‰๋˜๊ณ  go.mod๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‘ child plans์™€ parent manifest๋ฅผ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ „์— ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ledger์˜ ์ค‘๋ณตยท๋™์‹œ ์‹คํ–‰ยท์ˆœ์„œยทํ™˜๋ถˆ ๊ธˆ์ง€๋ฅผ ๋ชจ๋ธ ์—†๋Š” ๊ฒ€์‚ฌ๋กœ ํ™•์ธํ•˜๊ณ  ์‹ค์ œ CLI ์—ฐ๊ฒฐ๋„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ณ ์ • ์ž…๋ ฅ์˜ ์‚ฌ์ „ ๋ผ์šฐํ„ฐ ๊ด€์ธก๊ณผ ์š”์ฒญ ํ”„๋กœํ•„์„ ๊ธฐ๋กํ•œ ๋’ค์—๋งŒ ์ œํ•œ๋œ ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์„ค์ •๊ณผ ์‹ค์ œ ์ œ๊ณต๋œ ๋ชจ๋ธ, ์ „์ฒด ์‚ฌ์šฉ๋Ÿ‰ยท์‹œ๊ฐ„ยท์‹คํŒจ ์ƒํƒœยท๊ฒ€์ฆ ์ƒํƒœ๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ด gate ์ดํ›„ ๋‘ ์š”์ฒญ์˜ ์‹ค์ œ ๋„ค ๊ด€์ธก์„ ํ™•๋ณดํ–ˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ๋น„๊ต ์„ฑ๋Šฅ, ์ ˆ๊ฐ ๊ธˆ์•ก, ๊ตฌ๋… ์†Œ๋ชจ์œจ์ด๋‚˜ ์ดˆ์ €์ž์› ๋ชฉํ‘œ ๋‹ฌ์„ฑ์€ ํ™•์ธํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ํ•œํ•œ ๊ฐœ๋ฐœ ๋Œ€์กฐ๊ตฐ๊ณผ ๋„ค ๊ด€์ธก์œผ๋กœ ๋„๋ฉ”์ธ๋ณ„ 2,400๊ฐœ์˜ ๋…๋ฆฝ ์ตœ์ข… ์š”์ฒญ์„ ๋Œ€์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋น„์šฉยท์„ฑ๊ณต ๊ฐ€๋Šฅ ๋ชจ๋ธ ์ง‘ํ•ฉ์˜ ํ•™์Šต ๋ผ๋ฒจ์€ ๋ณ„๋„ ์ ๊ฒฉ์„ฑ ๊ฒ€ํ†  ์ดํ›„์—๋งŒ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋‚ด์šฉ ํ™•์ธํ•˜๊ธฐ

mkdir -p .cache/bin
go build -trimpath -o .cache/bin/riido-taskverify ./cmd/riido-taskverify
.cache/bin/riido-taskverify --task go55-humanize-ordinal64-v2 --spec
.cache/bin/riido-taskverify --task go55-uuid-canonical-parse-v2 --spec

์ „์ฒด Prompt์™€ ๋ฒ„์ „ ์—ฐ๊ฒฐ์€ v2 definitions, recipe๋Š” evaluation recipe, ๊ณ ์ • ํ•ด์‹œ์™€ ๋กœ์ปฌ ๋Œ€์กฐ ๊ฒ€์‚ฌ๋Š” v2 tests์— ์žˆ์Šต๋‹ˆ๋‹ค. ledger ์—ฐ๊ฒฐ์€ parent budget๊ณผ executor์˜ ๋ณ„๋„ ๊ฒ€์ฆ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์—๋Š” ๋ชจ๋ธ ์›๋ฌธ traceยท์ธ์ฆยท๊ฐœ์ธ ์ฝ”๋“œยท๊ฐ€์ค‘์น˜๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.