Writing a Repair Program - kimjooyoon/meta-ontology-go GitHub Wiki

Gooo ์ˆ˜์ • ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑํ•˜๊ธฐ

2026-10-03 ์•ˆ๋‚ด: ์•„๋ž˜ ์˜ˆ์ œ์™€ ๊ด€์ธก์€ ๊ฐ ์ ˆ์— ๊ณ ์ •๋œ ์†Œ์Šคยท๋„๊ตฌ์ฒด์ธ์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฐ”๋”” ์ƒ์„ฑ๊ณผ ์ž์ฒด ์†Œํ˜• ๋ชจ๋ธ์˜ ํ๋ฆ„์€ ๋ชจ๋ธ๊ณผ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์ง€๊ธˆ ์‚ฌ์šฉํ•  ๋ฒ„์ „์€ ํ˜„์žฌ ์ƒํƒœ์™€ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Gooo ์ˆ˜์ • ํ”„๋กœ๊ทธ๋žจ์€ ์–ด๋А ์ž…๋ ฅ์— ์–ด๋–ค ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ• ์ง€๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์„ ์–ธ์— ์—ฐ๊ฒฐ๋œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์ง€๋งŒ, ๊ทธ ์ฝ”๋“œ์˜ ์ฑ„ํƒ๊นŒ์ง€ ์Šค์Šค๋กœ ์Šน์ธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ •์ฑ… ์ƒ์„ฑ ํ”„๋กœํ•„์˜ ์‚ฌ๋žŒ์šฉ ์ถœ๋ ฅ์ด ์‹คํŒจํ–ˆ๋Š”๋ฐ๋„ ์„ฑ๊ณต์œผ๋กœ ๋๋‚˜๋˜ ๋™์ž‘์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ฐ™์€ ํ•จ์ˆ˜์— ์ด๋ฏธ ์žˆ๋Š” ์ถœ๋ ฅ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ธ”๋ก์„ ์„ ํƒํ•ด ์ˆ˜์ • ํ›„๋ณด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž„์˜์˜ Go ์ฝ”๋“œ๋ฅผ ์•Œ์•„์„œ ๊ณ ์น˜๋Š” ๋ฒ”์šฉ ๋„๊ตฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ด ์‹ค์Šต์˜ ๊ธฐ์ค€์€ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋œ #854์˜ ๋ฒ„์ „ 1c0d251๊ณผ Go 1.27.0์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ๋ฆด๋ฆฌ์Šค ์ „์ฒด์˜ ์ง€์› ์•ฝ์†๊ณผ๋Š” ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์•Œ์•„๋‘˜ ์„ธ ๊ฐ€์ง€

์งˆ๋ฌธ ์ด ์‹ค์Šต์˜ ๋‹ต
๋ฌด์—‡์„ ์ž…๋ ฅํ•˜๋‚˜์š”? Gooo ์ˆ˜์ • ์„ ์–ธ๊ณผ ๊ณ ์ •๋œ ์›๋ณธ Go ํŒŒ์ผ
๋ฌด์—‡์„ ์–ป๋‚˜์š”? ์ƒ์„ฑ๋œ Go ์ฝ”๋“œ์™€ ๊ทธ ์ถœ์ฒ˜๋ฅผ ๋‹ด์€ JSON
์›๋ณธ์ด ์ž๋™์œผ๋กœ ๋ฐ”๋€Œ๋‚˜์š”? ์•„๋‹™๋‹ˆ๋‹ค. ์ ์šฉยท์‹คํ–‰ยท์ฑ„ํƒ์€ ๋ณ„๋„ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ•œ ํ๋ฆ„์„ ์ฝ๊ณ  ์‹ถ๋‹ค๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ƒ์„ฑ ์‹ค์Šต์„ ๋จผ์ € ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์„ ์–ธ์„ ์–ด๋–ป๊ฒŒ ์„ ํƒํ•˜๊ณ  ํ•ด์„ํ•˜๋Š”๊ฐ€์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค.

1. ์ง€์› ๋ฒ„์ „๊ณผ ์‹ค์Šต ์ž…๋ ฅ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค

๋‹ค๋ฅธ ์ž‘์—…๊ณผ ๋ถ„๋ฆฌ๋œ ์ฒดํฌ์•„์›ƒ์—์„œ ๋‹ค์Œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

git clone https://github.com/kimjooyoon/meta-ontology-go.git gooo-repair-lab
cd gooo-repair-lab
git checkout 1c0d2519c6c80da127b57b932e1b280ef4676c77

์ž…๋ ฅ์€ internal/meta/policycompilation/testdata/go-error-guard/profile-original.go.golden์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๊ณผ๊ฑฐ ๊ณต๊ฐœ CLI ๊ตฌํ˜„์„ ๋ณด์กดํ•œ ์›๋ณธ์ด๋ฉฐ, ํ˜„์žฌ ์ฝ”๋“œ๋ฅผ ์ผ๋ถ€๋Ÿฌ ๋ง๊ฐ€๋œจ๋ ค ๋งŒ๋“  ์ž…๋ ฅ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด ํŒŒ์ผ์— ์—ฐ๊ฒฐ๋œ ์›๋ณธ ์‹๋ณ„๊ฐ’์€ sha256:7ee9cec15457d359c3df81d5ea54131c72a5eb909496500bbfdb91ac1bdfbc7a์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒŒ์ผ์„ ๋„ฃ๊ณ  ์ด ์‹๋ณ„๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์›๋ณธ ๋ถˆ์ผ์น˜๋กœ ๊ฑฐ์ ˆ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ์ˆ˜์ • ์„ ํƒ์„ Gooo๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค

work="$(mktemp -d)"
cat > "$work/guard.gooo" <<'GOOO'
package goerrorguard
namespace goerrorguard
entity Source id "gooo://error-guard/source"
entity Candidate id "gooo://error-guard/candidate"
activity GuardWrite(Source) -> Candidate computes "go-error-guard:v2;function=runMetaPolicyGenerationProfile;writer=stdout;writer-type=interfaceWriter;source=sha256:7ee9cec15457d359c3df81d5ea54131c72a5eb909496500bbfdb91ac1bdfbc7a;handler=sha256:bc804b799d7c744cba976e1c83f66751fc4485ccc2840129d6fe35782e8affdb"
GOOO

๋ฌธ์ž์—ด์ด ๊ธธ์ง€๋งŒ, ์„ ์–ธํ•˜๋Š” ์„ ํƒ์€ ๋‹ค์„ฏ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์„ ํƒ ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ’ ์™œ ํ•„์š”ํ•œ๊ฐ€์š”?
ํ•จ์ˆ˜ runMetaPolicyGenerationProfile ๋‹ค๋ฅธ ํ•จ์ˆ˜๊นŒ์ง€ ๊ณ ์น˜์ง€ ์•Š๋„๋ก ๋Œ€์ƒ์„ ํ•œ์ •ํ•ฉ๋‹ˆ๋‹ค.
์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜ stdout ์–ด๋–ค ์ถœ๋ ฅ์˜ ๋ฒ„๋ ค์ง„ ์˜ค๋ฅ˜๋ฅผ ๋‹ค๋ฃฐ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค.
๋กœ์ปฌ writer ํƒ€์ž… interfaceWriter ์ด๋ฆ„๋งŒ ๋น„์Šทํ•œ ์ž„์˜ ํƒ€์ž…์„ ์ถœ๋ ฅ ๋Œ€์ƒ์œผ๋กœ ์ถ”์ธกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์›๋ณธ ์‹๋ณ„๊ฐ’ source ์–ด๋–ค ์›๋ณธ ๋ฐ”์ดํŠธ๋ฅผ ์ „์ œ๋กœ ํ•œ ์š”์ฒญ์ธ์ง€ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์กด ์ฒ˜๋ฆฌ ๋ธ”๋ก ์‹๋ณ„๊ฐ’ handler ๊ฐ€์ ธ์˜ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ธ”๋ก์„ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

Source์™€ Candidate๋Š” ์ž…๋ ฅ๊ณผ ์ƒ์„ฑ๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๊ณ , GuardWrite ํ™œ๋™์ด ๋‘˜์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Gooo ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” ์ด๋ฅผ ์˜๋ฏธ ๋ชจ๋ธ์ธ IR๋กœ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ๋ชจ๋ธ์˜ ์ž…๋ ฅ ์‚ฌ์šฉยท๊ฒฐ๊ณผ ์ƒ์„ฑ ๊ด€๊ณ„์™€ ์‹ค์ œ ์ˆ˜์ • ํ™œ๋™์ด ๋งž๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

go-error-guard:v2๋Š” ์•„๋ฌด ๋ฒ„์ „ ๋ฒˆํ˜ธ๋‚˜ ๋ถ™์ด๋Š” ํ‘œ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๊ทœ์น™์˜ ์˜๋ฏธ์™€ ์ง€์› ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋ ค๊ณ  v1์˜ ์˜๋ฏธ๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋Œ€์‹ , ๋ณ„๋„ ํ”„๋กœํ•„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

3. ํ›„๋ณด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค

go run ./examples/meta-policy-compilation/go-error-guard \
  -program "$work/guard.gooo" \
  -source ./internal/meta/policycompilation/testdata/go-error-guard/profile-original.go.golden \
  > "$work/proposal.json"

์ด ์–ด๋Œ‘ํ„ฐ๋Š” ์ž…๋ ฅ์„ ์ฝ๊ณ  JSON์„ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์—์„œ๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ์ž„์‹œ ๊ฒฐ๊ณผ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์›๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

jq๊ฐ€ ์žˆ๋‹ค๋ฉด ํฐ Go ์ฝ”๋“œ ๋ฌธ์ž์—ด์„ ํŽผ์น˜๊ธฐ ์ „์— ๋‹ค์Œ ํ•„๋“œ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

jq '{state, reason, activity_id, program_digest, semantic_digest,
     source_digest, candidate_digest, edit_start, edit_end,
     admission, mutation_authority, promotion_authority}' "$work/proposal.json"
๊ฒฐ๊ณผ ์ฝ๋Š” ๋ฐฉ๋ฒ•
state: PROPOSED ์„ ํƒํ•œ ๊ทœ์น™์œผ๋กœ ํ›„๋ณด๊ฐ€ ์ƒ์„ฑ๋์Šต๋‹ˆ๋‹ค.
candidate_source ์‹ค์ œ ์ƒ์„ฑ๋œ Go ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
edit_start, edit_end ์›๋ณธ์˜ ์„ ํƒ ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค. 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ขŒํ‘œ์ด๋ฉฐ ๋์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
admission.state: UNKNOWN ์ด ์ƒ์„ฑ ๊ฒฐ๊ณผ ์ž์ฒด์—๋Š” ๋…๋ฆฝ๋œ ์ฑ„ํƒ ํŒ์ •์ด ์—†์Šต๋‹ˆ๋‹ค.
์ˆ˜์ •ยท์Šน๊ฒฉ ๊ถŒํ•œ 0 ํ›„๋ณด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ์น˜๊ฑฐ๋‚˜ ์Šน๊ฒฉํ•  ๊ถŒํ•œ์„ ์–ป์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๋ฒ„์ „์€ ์›์‹œ ํ›„๋ณด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ๋ณด๊ธฐ ์ข‹์€ ํ˜•์‹ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋’ค์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๋‘ ํ™œ๋™ ํŒŒ์ดํ”„๋ผ์ธ์˜ ํ˜•์‹ ์ •๋ฆฌ ๊ธฐ๋Šฅ๊นŒ์ง€ ์ด ๋ณ‘ํ•ฉ ๋ฒ„์ „์— ๋“ค์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ๋งˆ์„ธ์š”.

์ด ๋ฌธ์„œ์˜ ํ˜ธ์ถœ ํ˜•์‹์€ ๋ณ‘ํ•ฉ๋œ ์–ด๋Œ‘ํ„ฐ์™€ CI์˜ ์‹ค์ œ ์ƒ์„ฑ ์ž…๋ ฅ์— ๊ทผ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์˜ ์…ธ ์ ˆ์ฐจ ์ „์ฒด๋ฅผ ๋ณ„๋„ ์‚ฌ์šฉ์ž ์„ธ์…˜์—์„œ ์‹คํ–‰ํ–ˆ๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค.

4. ์ฝ”๋“œ์—์„œ๋Š” ๋ฌด์—‡์ด ๋ฐ”๋€Œ๋‚˜์š”?

๊ธฐ์กด ์‚ฌ๋žŒ์šฉ ์ถœ๋ ฅ์€ ์“ฐ๊ธฐ ํ˜ธ์ถœ์„ ํ•œ ๋’ค ๊ทธ ์˜ค๋ฅ˜๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ํ›„๋ณด๋Š” ๊ฐ™์€ ํ˜ธ์ถœ์— ๊ธฐ์กด ์‹คํŒจ ๋ฐ˜ํ™˜์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ค„๋ฐ”๊ฟˆํ•œ ์„ค๋ช…์šฉ Go ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ƒ์„ฑ ๋ฐ”์ดํŠธ๋Š” candidate_source์™€ ๊ทธ ์‹๋ณ„๊ฐ’์œผ๋กœ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

if _, err := fmt.Fprintf(
    stdout,
    "generated profile: %s\npolicy: %s\nartifact: %s\njudge: %s\nmanifest: %s\n",
    policycompilation.PublicProfileID,
    artifacts.paths[0], artifacts.paths[1], artifacts.paths[2], artifacts.paths[3],
); err != nil {
    return exitFailure
}
return exitOK

๋ชฉํ‘œ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์„ฑ๊ณต์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ถœ๋ ฅ ์‹คํŒจ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹คํŒจ๋กœ ๋ณด๊ณ ํ•˜๋ฉด์„œ, ์ด๋ฏธ ์ƒ์„ฑํ•œ ์™ธ๋ถ€ ํŒŒ์ผ๊ณผ ์ •์ƒ ์ถœ๋ ฅ์€ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ณ€๊ฒฝ์€ ๋ชจ๋“  ์ž…๋ ฅ์—์„œ ์›๋ณธ๊ณผ ๋™์ž‘์ด ๊ฐ™์•„์•ผ ํ•˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์ด ์•„๋‹™๋‹ˆ๋‹ค. ํŠน์ • ์‹คํŒจ ์ƒํ™ฉ์˜ ๋™์ž‘์„ ๋ฐ”๊พธ๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • ํ›„๋ณด์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ณ€ํ™˜๊ณผ ํšจ๊ณผ์—์„œ ๋‘ ์ข…๋ฅ˜์˜ ๊ฒ€์ฆ ๊ธฐ์ค€์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

5. ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ž…๋ ฅ์€ ์–ด๋–ป๊ฒŒ ์ฝ๋‚˜์š”?

์ƒํƒœ ์˜ˆ ๋‹ค์Œ ํŒ๋‹จ
UNKNOWN / DIRECT_MISSING ์„ ํƒํ•œ ํ•จ์ˆ˜๊ฐ€ ์—†์Œ ์–ด๋–ค ์ž…๋ ฅ์ด๋‚˜ ๋Œ€์ƒ ์„ ์–ธ์ด ๋น ์กŒ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
UNKNOWN / AMBIGUOUS ๋Œ€์ƒ์ด ํ•˜๋‚˜๋กœ ์ •ํ•ด์ง€์ง€ ์•Š์Œ ํ›„๋ณด๊ฐ€ ๋ฌด์—‡์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค.
UNKNOWN / UNBOUNDED ๊ทœ์น™์ด ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…ยท์ œ์–ด ํ๋ฆ„ ์ง€์› ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅธ ์‹œ๋„๋ฅผ ๋ณ„๋„๋กœ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
REFUTED ์›๋ณธ ๋˜๋Š” ์ฒ˜๋ฆฌ ๋ธ”๋ก์˜ pin์ด ์‹ค์ œ ์ž…๋ ฅ๊ณผ ๋‹ค๋ฆ„ ๋ชจ์ˆœ๋œ ์—ฐ๊ฒฐ์„ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ๊ฑฐ ๋ถ€์กฑ๊ณผ ์„ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

stage, step, reason, unknown_class, next_operation, blocked_by๋ฅผ ํ•จ๊ป˜ ์ฝ์Šต๋‹ˆ๋‹ค. UNKNOWN์€ ์›๋ณธ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋ฏธ๊ฐ€ ํ‹€๋ ธ๋‹ค๋Š” ์„ ์–ธ๋„, ๋ชจ๋“  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๋ผ๋Š” ๋œป๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‹œ๋„๋ฅผ ์œ„ํ•ด ์„ ํƒ์„ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์›๋ณธยท์„ ํƒยทํ‰๊ฐ€ ๊ธฐ์ค€์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์‹œ๋„๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ „ ์‹คํŒจ๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ๊ธฐ๋Œ€๊ฐ’์„ ๋‚ฎ์ถฐ ๊ฐ™์€ ๊ฐœ์„ ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๊ณ  ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6. ์–ด๋–ค ์ฆ๊ฑฐ๊ฐ€ ์‹ค์ œ๋กœ ์žˆ๋‚˜์š”?

๊ฐ™์€ ๊ณ ์ • ๊ธฐ๋Œ€๊ฐ’์œผ๋กœ ์›๋ณธ๊ณผ ์ƒ์„ฑ ํ›„๋ณด๋ฅผ ์‹คํ–‰ํ•œ #854์˜ CI์—์„œ ๋‹ค์Œ์ด ๊ด€์ธก๋์Šต๋‹ˆ๋‹ค.

๊ณต๊ฐœ ์ •์ฑ… ์ƒ์„ฑ ํ”„๋กœํ•„์˜ ๊ณ ์ • ์‚ฌ๋ก€ ์›๋ณธ ์ƒ์„ฑ ํ›„๋ณด
์‚ฌ๋žŒ์šฉ ์ถœ๋ ฅ ๊ฑฐ์ ˆ FAIL PASS
JSON ์ถœ๋ ฅ ๊ฑฐ์ ˆ PASS PASS
์‚ฌ๋žŒ์šฉ ์ •์ƒ ์ถœ๋ ฅ PASS PASS
JSON ์ •์ƒ ์ถœ๋ ฅ PASS PASS
์ •ํ™•ํ•œ ์™ธ๋ถ€ ์ƒ์„ฑ ํŒŒ์ผ 4๊ฐœ ์œ ์ง€ PASS PASS
ํ•ฉ๊ณ„ 4 PASS / 1 FAIL 5 PASS / 0 FAIL

์ฒซ ํ–‰์˜ PASS๋Š” ์ถœ๋ ฅ์ด ์ „๋‹ฌ๋๋‹ค๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ถœ๋ ฅ ๊ฑฐ์ ˆ์„ ์ฃผ์ž…ํ–ˆ์„ ๋•Œ CLI๊ฐ€ ์‹คํŒจ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด๊ณ ํ–ˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด ๋‹ค์„ฏ ์‚ฌ๋ก€๋Š” ์ •์ฑ… ์ƒ์„ฑ ํ”„๋กœํ•„์˜ ๋ฒ”์œ„์ด๋ฉฐ, ์ผ๋ฐ˜ ์ƒ์„ฑ ๋ช…๋ น์ด๋‚˜ ์ •์ฑ… ์ˆ˜์ • ํ”„๋กœํ•„์˜ ๋ชจ๋“  ๋™์ž‘๊นŒ์ง€ ๋Œ€์‹  ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅยทIRยท์ƒ์„ฑ ์ฝ”๋“œ์™€ ์ˆ˜์šฉ ๊ทผ๊ฑฐ ์ถ”์ ํ•˜๊ธฐ

์ด ํ•ด์‹œ๋“ค์€ ์ž…๋ ฅ๊ณผ ์‚ฐ์ถœ๋ฌผ์˜ ๋™์ผ์„ฑ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž ์‹ ๋ขฐ, ๋ชจ๋“  ์˜์กด์„ฑ์˜ ๋ฌด๊ฒฐ์„ฑ, ์˜๋ฏธ์  ์˜ฌ๋ฐ”๋ฆ„ ๋˜๋Š” ์‚ฌ์šฉ์ž ํšจ์šฉ๊นŒ์ง€ ๋Œ€์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CI artifact๋Š” ๋ณด์กด ๊ธฐ๊ฐ„์ด ์žˆ์œผ๋ฏ€๋กœ ์˜๊ตฌ ๋ฆด๋ฆฌ์Šค ํŒŒ์ผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

7. ์ƒ์„ฑยท๊ฒ€์ฆยท์ฑ„ํƒ์„ ์™œ ๋ถ„๋ฆฌํ•˜๋‚˜์š”?

ํ›„๋ณด๋ฅผ ๋งŒ๋“  ์ฃผ์ฒด๊ฐ€ ์ž๊ธฐ ํ‰๊ฐ€ ๊ธฐ์ค€๋„ ๋ฐ”๊ฟ” ์„ฑ๊ณต์„ ์„ ์–ธํ•˜๋ฉด, ๋ฌด์—‡์ด ์‹ค์ œ๋กœ ์ข‹์•„์กŒ๋Š”์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Gooo ์„ ์–ธ์€ ์„ ํƒ์„ ๋ช…์‹œํ•˜๊ณ , ์ƒ์„ฑ ๊ฒฐ๊ณผ๋Š” ๊ทธ ์„ ํƒ๊ณผ ๋ฐ”์ดํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ •๋œ ๊ฒ€์‚ฌ๋Š” ์‹ค์ œ ๋™์ž‘์„ ๋น„๊ตํ•˜๊ณ , ์ฑ„ํƒ์€ ์ •ํ•ด์ง„ ๊ถŒํ•œ ์•ˆ์—์„œ ๋”ฐ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์Œ ์‹คํ–‰์ด ์ฑ„ํƒ๋œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์ผํšŒ์„ฑ ํ›„๋ณด ์ƒ์„ฑ ์ด์ƒ์˜ ๊ฒฝ๋กœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด ์–ด๋Œ‘ํ„ฐ๋Š” ์™ธ๋ถ€ CI ๊ฒฐ๊ณผ๋ฅผ ์›๋ž˜ ํ›„๋ณด JSON์— ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณผ๊ฑฐ ํ›„๋ณด์˜ ์ฑ„ํƒ ์ƒํƒœ UNKNOWN๊ณผ ๊ทธ ๋’ค์˜ ์‹คํ–‰ ๊ทผ๊ฑฐ๊ฐ€ ํ•จ๊ป˜ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ๋„ ํ›„๋ณด ์ปค๋ฐ‹, ํ…Œ์ŠคํŠธ ์ž…๋ ฅ, CI ์‹คํ–‰, ๋ณ‘ํ•ฉ, ํ›„์† ์‹คํ–‰์„ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ๊ฑด์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

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

Provenance์™€ ๊ฒฐ์ • ยท ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๊ธฐ์—ฌ ยท ํ…Œ์ŠคํŠธยท์‹คํ–‰ ๋น„์šฉยท์žฌ์‚ฌ์šฉ

์ง€์› ๋ฒ”์œ„์™€ ํ›„์† ์‹คํ—˜

๋ฒ”์œ„ ์„ ํƒ๊ณผ ๊ฒฝ๊ณ„
์ด ์‹ค์Šต ๋ฒ„์ „์˜ v1 ์„œ๋กœ ๋‹ค๋ฅธ io.Writer, ์ธ์ ‘ํ•œ ๋ถ„๊ธฐ, ์ง„๋‹จ ์ถœ๋ ฅ๊ณผ ๋ฐ˜ํ™˜์ด ์žˆ๋Š” ์ฒ˜๋ฆฌ๊ธฐ
์ด ์‹ค์Šต ๋ฒ„์ „์˜ v2 ๋ช…์‹œํ•œ ๋กœ์ปฌ writer ์ธํ„ฐํŽ˜์ด์Šค, ๋จผ์ € ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ถ„๊ธฐ, ๋ฐ˜ํ™˜๋งŒ ํ•˜๋Š” ์ฒ˜๋ฆฌ๊ธฐ
๋ณ„๋„ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ—˜ Source -> RawCandidate -> Candidate๋กœ ์ƒ์„ฑ๊ณผ ํ˜•์‹ ์ •๋ฆฌ ์—ฐ๊ฒฐ
์ผ๋ฐ˜ ์ƒ์„ฑ ๋ช…๋ น์šฉ v3 ์ค€๋น„ ์ค‘์ฒฉ๋œ ์‚ฌ๋žŒ์šฉ ์ถœ๋ ฅ ์ง€์ ๊ณผ ์ฒซ ์‹คํŒจ์—์„œ ์ค‘๋‹จํ•˜๋Š” ๋™์ž‘์„ ๋ช…์‹œ

์•„๋ž˜ ๋‘ ํ•ญ๋ชฉ์€ ์œ„์—์„œ ๊ณ ์ •ํ•œ ๋ณ‘ํ•ฉ ๋ฒ„์ „์˜ ์‹ค์Šต์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์€ #855์™€ #856, ์ผ๋ฐ˜ ์ƒ์„ฑ ๋ช…๋ น์˜ ํ›„์† ์‚ฌ๋ก€๋Š” #857์—์„œ ์ˆ˜์šฉ ์—ฌ๋ถ€์™€ ์‹ค์ œ ์ฆ๊ฑฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ค€๋น„๋œ v3์˜ ์—ฌ๋Ÿ ์‚ฌ๋ก€๋ฅผ ์ด๋ฏธ ํ†ต๊ณผํ•œ ์‚ฌ๋ก€๋กœ ์„ธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ