@tienne/gestalt 0.122.0 โ†’ 0.124.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.
Files changed (89) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/plugin/.codex-plugin/plugin.json +1 -1
  3. package/dist/plugin/skills/_shared/pr-base.md +169 -0
  4. package/dist/plugin/skills/_shared/proactive-routing.md +1 -1
  5. package/dist/plugin/skills/jira-create/SKILL.md +39 -4
  6. package/dist/plugin/skills/pr/SKILL.md +32 -12
  7. package/dist/plugin/skills/review/SKILL.md +94 -29
  8. package/dist/plugin/skills/review/references/approve-when-no-blocking.md +7 -0
  9. package/dist/plugin/skills/review/references/post-confirm.md +30 -0
  10. package/dist/plugin/skills/review/references/result-lines.md +32 -0
  11. package/dist/plugin/skills/review/references/user-profile.md +19 -0
  12. package/dist/plugin/skills/review-loop/SKILL.md +83 -20
  13. package/dist/plugin/skills/review-reply/SKILL.md +4 -0
  14. package/dist/plugin/skills/ship/SKILL.md +276 -29
  15. package/dist/src/architecture/ir-schema.d.ts +26 -26
  16. package/dist/src/cli/commands/profile.d.ts +13 -0
  17. package/dist/src/cli/commands/profile.d.ts.map +1 -0
  18. package/dist/src/cli/commands/profile.js +26 -0
  19. package/dist/src/cli/commands/profile.js.map +1 -0
  20. package/dist/src/cli/commands/ship.d.ts +35 -0
  21. package/dist/src/cli/commands/ship.d.ts.map +1 -0
  22. package/dist/src/cli/commands/ship.js +146 -0
  23. package/dist/src/cli/commands/ship.js.map +1 -0
  24. package/dist/src/cli/index.d.ts.map +1 -1
  25. package/dist/src/cli/index.js +52 -0
  26. package/dist/src/cli/index.js.map +1 -1
  27. package/dist/src/core/config.d.ts +12 -12
  28. package/dist/src/core/types.d.ts +64 -0
  29. package/dist/src/core/types.d.ts.map +1 -1
  30. package/dist/src/core/user-profile.d.ts +29 -0
  31. package/dist/src/core/user-profile.d.ts.map +1 -0
  32. package/dist/src/core/user-profile.js +97 -0
  33. package/dist/src/core/user-profile.js.map +1 -0
  34. package/dist/src/digest/blocks.d.ts +34 -34
  35. package/dist/src/digest/comments.d.ts +6 -6
  36. package/dist/src/digest/lens-schema.d.ts +2 -2
  37. package/dist/src/digest/lint-lens-context.d.ts +4 -4
  38. package/dist/src/digest/schema.d.ts +55 -55
  39. package/dist/src/lens/attach.d.ts +10 -10
  40. package/dist/src/mcp/schemas.d.ts +238 -225
  41. package/dist/src/mcp/schemas.d.ts.map +1 -1
  42. package/dist/src/mcp/schemas.js +86 -16
  43. package/dist/src/mcp/schemas.js.map +1 -1
  44. package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -1
  45. package/dist/src/mcp/tools/review-passthrough.js +61 -2
  46. package/dist/src/mcp/tools/review-passthrough.js.map +1 -1
  47. package/dist/src/mcp/tools/status.d.ts +1 -1
  48. package/dist/src/research/schema.d.ts +66 -66
  49. package/dist/src/research/target.d.ts +6 -6
  50. package/dist/src/review/consensus-input.d.ts +11 -0
  51. package/dist/src/review/consensus-input.d.ts.map +1 -0
  52. package/dist/src/review/consensus-input.js +102 -0
  53. package/dist/src/review/consensus-input.js.map +1 -0
  54. package/dist/src/review/passthrough-engine.d.ts +9 -2
  55. package/dist/src/review/passthrough-engine.d.ts.map +1 -1
  56. package/dist/src/review/passthrough-engine.js +58 -10
  57. package/dist/src/review/passthrough-engine.js.map +1 -1
  58. package/dist/src/review/verification.d.ts +48 -7
  59. package/dist/src/review/verification.d.ts.map +1 -1
  60. package/dist/src/review/verification.js +109 -23
  61. package/dist/src/review/verification.js.map +1 -1
  62. package/dist/src/review/verifier-record.d.ts +55 -0
  63. package/dist/src/review/verifier-record.d.ts.map +1 -0
  64. package/dist/src/review/verifier-record.js +228 -0
  65. package/dist/src/review/verifier-record.js.map +1 -0
  66. package/dist/src/ship/checkpoint.d.ts +145 -0
  67. package/dist/src/ship/checkpoint.d.ts.map +1 -0
  68. package/dist/src/ship/checkpoint.js +282 -0
  69. package/dist/src/ship/checkpoint.js.map +1 -0
  70. package/dist/src/ship/ci.d.ts +110 -0
  71. package/dist/src/ship/ci.d.ts.map +1 -0
  72. package/dist/src/ship/ci.js +270 -0
  73. package/dist/src/ship/ci.js.map +1 -0
  74. package/package.json +1 -1
  75. package/plugin/.codex-plugin/plugin.json +1 -1
  76. package/plugin/.mcp.json +1 -1
  77. package/plugin/mcp.json +1 -1
  78. package/plugin/skills/_shared/pr-base.md +169 -0
  79. package/plugin/skills/_shared/proactive-routing.md +1 -1
  80. package/plugin/skills/jira-create/SKILL.md +39 -4
  81. package/plugin/skills/pr/SKILL.md +32 -12
  82. package/plugin/skills/review/SKILL.md +94 -29
  83. package/plugin/skills/review/references/approve-when-no-blocking.md +7 -0
  84. package/plugin/skills/review/references/post-confirm.md +30 -0
  85. package/plugin/skills/review/references/result-lines.md +32 -0
  86. package/plugin/skills/review/references/user-profile.md +19 -0
  87. package/plugin/skills/review-loop/SKILL.md +83 -20
  88. package/plugin/skills/review-reply/SKILL.md +4 -0
  89. package/plugin/skills/ship/SKILL.md +276 -29
@@ -14,7 +14,7 @@ inputs:
14
14
  base:
15
15
  type: string
16
16
  required: false
17
- description: "PR์˜ base ๋ธŒ๋žœ์น˜. ์ƒ๋žตํ•˜๋ฉด ๋ ˆํฌ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜"
17
+ description: "PR์˜ base ๋ธŒ๋žœ์น˜. ์ƒ๋žตํ•˜๋ฉด _shared/pr-base.md๋กœ ๊ณ ๋ฅธ๋‹ค (์Šคํƒ์ด ์•„๋‹ˆ๋ฉด ๋ ˆํฌ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜)"
18
18
  repoRoot:
19
19
  type: string
20
20
  required: false
@@ -32,8 +32,10 @@ outputs:
32
32
  - localRounds
33
33
  - prUrl
34
34
  - copilotRounds
35
+ - copilotStatus
35
36
  - unresolvedAtReady
36
37
  - prState
38
+ - ciStatus
37
39
  routing:
38
40
  note: "๋กœ์ปฌ PR โ†’ ๋ฆฌ๋ทฐ ์ˆ˜๋ ด ๋ฃจํ”„ โ†’ ์Šน์ธ โ†’ draft PR โ†’ Copilot ์ˆ˜๋ ด ๋ฃจํ”„ โ†’ ready. ๋ฆฌ๋ทฐ ํ•œ ๋ฒˆ๋งŒ์ด๋ฉด `review`"
39
41
  ---
@@ -85,7 +87,7 @@ routing:
85
87
  ## ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
86
88
 
87
89
  ```
88
- /ship # ํ˜„์žฌ ๋ธŒ๋žœ์น˜ โ†’ ๋ ˆํฌ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜
90
+ /ship # ํ˜„์žฌ ๋ธŒ๋žœ์น˜ โ†’ ์Šคํƒ์ด ์•„๋‹ˆ๋ฉด ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜, ์Šคํƒ์ด๋ฉด pr-base๋กœ ๊ณ ๋ฅธ ์ƒ์œ„ ๋ธŒ๋žœ์น˜
89
91
  /ship main # base ์ง€์ •
90
92
  /ship --max-local 3 # ๋กœ์ปฌ ๋ผ์šด๋“œ ์ƒํ•œ
91
93
  /ship --max-copilot 8 # Copilot ๋ผ์šด๋“œ ์ƒํ•œ
@@ -97,7 +99,7 @@ routing:
97
99
 
98
100
  - git ์ €์žฅ์†Œ
99
101
  - `gh` ์ธ์ฆ (Phase 3๋ถ€ํ„ฐ ํ•„์š” โ€” Phase 0์—์„œ ๋ฏธ๋ฆฌ ํ™•์ธํ•œ๋‹ค)
100
- - GitHub Enterprise Server๊ฐ€ ์•„๋‹ ๊ฒƒ (`@copilot` ๋ฆฌ๋ทฐ์–ด๊ฐ€ GHES์—์„œ๋Š” ์•ˆ ๋œ๋‹ค)
102
+ - GitHub Enterprise Server๊ฐ€ ์•„๋‹ ๊ฒƒ (Copilot ๋ฆฌ๋ทฐ์–ด ์š”์ฒญ์ด GHES์—์„œ๋Š” ์•ˆ ๋œ๋‹ค)
101
103
 
102
104
  ## ์—์ด์ „ํŠธ๋Š” ์ „๋ถ€ ์„œ๋ธŒ์—์ด์ „ํŠธ๋กœ ๋Œ๋ฆฐ๋‹ค
103
105
 
@@ -129,10 +131,10 @@ routing:
129
131
 
130
132
  | ์ž๋ฆฌ | ์‹œ์  | ๋ฌป๋Š” ๊ฒƒ |
131
133
  | --- | --- | --- |
132
- | โ“ฅ | Phase 0์—์„œ ํ•œ ๋ฒˆ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ •์˜๊ฐ€ ๋ฐ”๋€ ๋ผ์šด๋“œ | ๋ ˆํฌ์—์„œ ์ฐพ์€ ๊ฒ€์ฆ ๋ช…๋ น์ด ๋งž๋Š”์ง€ |
134
+ | โ“ฅ | Phase 0์—์„œ ํ•œ ๋ฒˆ, ์ด์–ด์„œ ํ•  ๋•Œ ํ•œ ๋ฒˆ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ •์˜๊ฐ€ ๋ฐ”๋€ ๋ผ์šด๋“œ | ๋ ˆํฌ์—์„œ ์ฐพ์€ ๊ฒ€์ฆ ๋ช…๋ น์ด ๋งž๋Š”์ง€ |
133
135
  | โ“ | Phase 3 ์ง์ „ | ๋กœ์ปฌ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ณ  ์ด ์ƒํƒœ๋กœ GitHub์— ์˜ฌ๋ฆด์ง€ |
134
136
  | โ“‘ | Phase 4 ๋ผ์šด๋“œ๋งˆ๋‹ค | Copilot ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์œ ํ˜•๋ณ„๋กœ ๋ถ„๋ฅ˜ํ•ด ๋ณด์ด๊ณ  ๋ฌด์—‡์„ ๋ฐ˜์˜ํ• ์ง€ |
135
- | โ“’ | Phase 5 | draft๋ฅผ ready๋กœ ๋ฐ”๊ฟ€์ง€ |
137
+ | โ“’ | Phase 5 | draft๋ฅผ ready๋กœ ๋ฐ”๊ฟ€์ง€. CI๊ฐ€ ์‹คํŒจํ–ˆ์œผ๋ฉด ๋Œ€์‹  ๊ณ ์น ์ง€ |
136
138
 
137
139
  ๋‚˜๋จธ์ง€๋Š” **๋ถ€๋ฅด๋Š” ์Šคํ‚ฌ์ด ์ž๊ธฐ ๊ณ„์•ฝ์œผ๋กœ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ**์ด๋ผ ์ด ์Šคํ‚ฌ์ด ํก์ˆ˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
138
140
 
@@ -218,6 +220,7 @@ Phase 3์€ Phase 1์—์„œ ์ง€์€ ๋ชฉ์ ์„ ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  ๊ทธ ๋’ค ๋ผ์šด๋“œ์—
218
220
  | "escalate๊ฐ€ ๋‚ฌ์–ด๋„ ๊ฒฐํ•จ ์ด์Šˆ๋ถ€ํ„ฐ ๊ณ ์น˜๊ณ  ๋‹ค์‹œ ํŒ์ •๋ฐ›์œผ๋ฉด ๋œ๋‹ค" | ์ •ํ•ฉ ์‹ฌ๊ธ‰์ด Block์ธ ์ฑ„๋กœ ๊ฒฐํ•จ๋งŒ ๊ณ ์น˜๋ฉด ๋‹ค์Œ ๋ผ์šด๋“œ๋„ Block์ด๋‹ค. 2.7์€ 2.3์œผ๋กœ ์•ˆ ๋‚ด๋ ค๊ฐ€๊ณ  ์‚ฌ๋žŒ์—๊ฒŒ ๋ฌป๋Š”๋‹ค. |
219
221
  | "Copilot ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์‚ฌ์†Œํ•˜๋‹ˆ โ“‘ ์—†์ด ready๋กœ ๊ฐ„๋‹ค" | 4.4์˜ ์ˆ˜๋ ด ์กฐ๊ฑด์€ ์ƒˆ ์ฝ”๋ฉ˜ํŠธ 0๊ฑด์ด๋‹ค. ์‚ฌ์†Œํ•ด ๋ณด์—ฌ๋„ โ“‘์— ์˜ฌ๋ ค ์˜คํƒ์ด๋ฉด ๋‹ต๊ธ€๋กœ ๋‚จ๊ธด๋‹ค. |
220
222
  | "์Šน์ธ์€ ์•ž์—์„œ ์ด๋ฏธ ๋ฐ›์•˜๋‹ค" | โ“์™€ โ“‘์™€ โ“’๋Š” ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” ์ˆœ๊ฐ„๋งˆ๋‹ค ๋”ฐ๋กœ ๋ฐ›๋Š”๋‹ค. ready ์ „ํ™˜์€ โ“’์—์„œ "๋ฐ”๊พผ๋‹ค"๋ฅผ ๊ณ ๋ฅธ ๊ฒฝ์šฐ์—๋งŒ ํ•œ๋‹ค. |
223
+ | "๋กœ์ปฌ ๊ฒ€์ฆ์„ ํ†ต๊ณผํ–ˆ์œผ๋‹ˆ CI๋Š” ์•ˆ ๊ธฐ๋‹ค๋ ค๋„ ๋œ๋‹ค" | CI์—์„œ๋งŒ ๋„๋Š” ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๋‹ค. ๋น„๋ฐ€ ๊ฐ’์œผ๋กœ ๋„๋Š” ๊ธˆ์ง€์–ด ๊ฒ€์‚ฌ๋‚˜ ๋‹ค๋ฅธ OS์—์„œ ๋„๋Š” ๊ฒ€์‚ฌ๊ฐ€ ๊ทธ๋ ‡๋‹ค. [CI ํ™•์ธ](#ci-ํ™•์ธ)์„ ๊ฑด๋„ˆ๋›ฐ๋ฉด โ“’์™€ ์™„๋ฃŒ ๋ณด๊ณ ์˜ `CI:` ์ค„์„ ์ฑ„์šธ ์ˆ˜ ์—†๋‹ค. |
221
224
 
222
225
  ## ์ง„ํ–‰ ํŒจ๋„
223
226
 
@@ -236,10 +239,80 @@ activeForm: "์ถœํ•˜ ๋ฃจํ”„ ์ง„ํ–‰ ์ค‘"
236
239
  ```
237
240
  description: "Phase 2/5 โ€” ๋กœ์ปฌ ๋ฆฌ๋ทฐ ๋ผ์šด๋“œ {N}/{์ƒํ•œ} | ์ด์Šˆ {M}๊ฑด | ํŒ์ • {Pass|Block}"
238
241
  description: "Phase 4/5 โ€” Copilot ๋ผ์šด๋“œ {N}/{์ƒํ•œ} | ์ƒˆ ์ฝ”๋ฉ˜ํŠธ {M}๊ฑด"
242
+ description: "Phase 4/5 โ€” CI ํ™•์ธ | {๋Œ€๊ธฐ ์ค‘|ํ†ต๊ณผ|์‹คํŒจ n๊ฐœ|์ง„ํ–‰ ์ค‘|CI ์—†์Œ|์ „๋ถ€ ๊ฑด๋„ˆ๋œ€}"
239
243
  ```
240
244
 
241
245
  `TaskCreate`๊ฐ€ ์—†๋Š” ๋Ÿฐํƒ€์ž„์ด๋ฉด ๋ผ์šด๋“œ ์‹œ์ž‘๋งˆ๋‹ค ํ•œ ์ค„๋กœ ๋Œ€์‹  ์•Œ๋ฆฐ๋‹ค.
242
246
 
247
+ ## ์ฒดํฌํฌ์ธํŠธ
248
+
249
+ ๋ผ์šด๋“œ๊ฐ€ ๊ธธ๋ฉด ๋Œ€ํ™”๊ฐ€ ์••์ถ•๋˜๊ฑฐ๋‚˜ ์„ธ์…˜์ด ๋Š๊ธด๋‹ค. ๊ทธ๋•Œ ๋‹ค์‹œ ๋ถ€๋ฅด๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋Œ์•„์„œ ์•ž์—์„œ ๋ฐ›์€ ๋ฆฌ๋ทฐ์™€ ์Šน์ธ์„ ๋˜ ๋ฐ›์•˜๋‹ค. ๋‹จ๊ณ„์™€ ๋ผ์šด๋“œ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ์–ด๋””๊นŒ์ง€ ์™”๋Š”์ง€ ๋‚จ๊ธฐ๊ณ  ๋‹ค์‹œ ๋ถ€๋ฅด๋ฉด ๊ทธ๊ฑธ ์ฝ์–ด ์ด์–ด์„œ ๋ˆ๋‹ค.
250
+
251
+ **์ž๋ฆฌ๋Š” [์ž„์‹œ ํŒŒ์ผ ์ž๋ฆฌ](#์ž„์‹œ-ํŒŒ์ผ-์ž๋ฆฌ)์˜ `checkpoint.json`์ด๋‹ค.** ์ƒˆ ์ž๋ฆฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. git ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜๋ผ ์–ด๋А ๋ ˆํฌ์—์„œ๋„ ์ถ”์ ๋˜์ง€ ์•Š๊ณ  ๋ธŒ๋žœ์น˜๋ณ„๋กœ ๊ฐˆ๋ฆฐ๋‹ค. Phase 5๊ฐ€ ์ด ์ž๋ฆฌ๋ฅผ ํ†ต์งธ๋กœ ์ง€์šฐ๋ฏ€๋กœ ๋๊นŒ์ง€ ๊ฐ„ ์‹คํ–‰์€ ์ฒดํฌํฌ์ธํŠธ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
252
+
253
+ | ์–ธ์ œ | `--phase` | ํ•จ๊ป˜ ๋„˜๊ธฐ๋Š” ๊ฐ’ |
254
+ | --- | --- | --- |
255
+ | Phase 0 ๋ | `0` | `--base`, `--verify-cmd` |
256
+ | Phase 1 ๋ | `1` | `--local-pr` |
257
+ | 2.2์—์„œ ์ˆ˜๋ ดํ–ˆ์„ ๋•Œ, 2.4 ๋ | `2` | `--round`, `--issues`(๊ทธ ๋ผ์šด๋“œ ๋ฆฌ๋ทฐ์˜ ์ด์Šˆ ์ˆ˜) |
258
+ | 2.5๋‚˜ 2.6์—์„œ ๋ฉˆ์ถœ ๋•Œ | `2` | `--stopped blocked` |
259
+ | 2.7์—์„œ ๋ฉˆ์ถœ ๋•Œ | `2` | `--stopped escalated` |
260
+ | โ“์—์„œ "์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค"๋ฅผ ๊ณจ๋ž์„ ๋•Œ | `a` | |
261
+ | Phase 3 ๋ | `3` | `--pr`, `--pr-url` |
262
+ | 4.4์—์„œ ์ˆ˜๋ ดํ–ˆ์„ ๋•Œ, 4.5 ๋ | `4` | `--round`, `--issues`(๊ทธ ๋ผ์šด๋“œ ์ƒˆ ์ฝ”๋ฉ˜ํŠธ ์ˆ˜) |
263
+ | [CI ํ™•์ธ](#ci-ํ™•์ธ) ๋ | `ci` | |
264
+ | 4.6์—์„œ ๋ฉˆ์ถœ ๋•Œ (CI ํ™•์ธ์„ ๋Œ๋ฆฐ ๋’ค) | `ci` | `--stopped blocked` |
265
+ | โ“’์—์„œ "๊ณ ์นœ๋‹ค"๋ฅผ ๊ณจ๋ผ pushํ•œ ์งํ›„ | `ci` | `--next "CI ํ™•์ธ ๋‹ค์‹œ"` |
266
+
267
+ ```bash
268
+ shipTmp=<Phase 0์—์„œ ์ถœ๋ ฅ๋œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ>
269
+
270
+ gestalt ship checkpoint save --dir "$shipTmp" --phase 2 --round 2 --issues 3 \
271
+ --next "2.1 ๋กœ์ปฌ ๋ฆฌ๋ทฐ ๋ผ์šด๋“œ 3"
272
+ ```
273
+
274
+ - **`--next`์—๋Š” ๋‹ค์Œ์— ํ•  ์ผ์„ ์ ˆ ๋ฒˆํ˜ธ์™€ ํ•จ๊ป˜ ํ•œ ์ค„๋กœ ์ ๋Š”๋‹ค.** ๋‹ค์‹œ ๋ถˆ๋ €์„ ๋•Œ ์ด ์ค„์„ ๋ณด๊ณ  ์–ด๋””์„œ ์ด์–ด๊ฐˆ์ง€ ์ •ํ•œ๋‹ค
275
+ - ์•ž์—์„œ ๋„˜๊ธด ๊ฐ’์€ ๋‹ค์Œ ์ €์žฅ์— ๋‹ค์‹œ ์•ˆ ๋„˜๊ฒจ๋„ ๋‚จ๋Š”๋‹ค. ๋ธŒ๋žœ์น˜์™€ HEAD, ์ €์žฅ ์‹œ๊ฐ์€ ๋ช…๋ น์ด ์ง์ ‘ ์ฑ„์šด๋‹ค
276
+ - `--dir`์€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋งŒ ๋ฐ›๋Š”๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ๋นˆ ์ฑ„๋กœ ํ’€๋ ค ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ๋˜๋ฉด ๊ฑฐ์ ˆํ•œ๋‹ค
277
+ - ์ €์žฅ์ด ์‹คํŒจํ•ด๋„ ์ถœํ•˜๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค. ์™„๋ฃŒ ๋ณด๊ณ ์— `์ฒดํฌํฌ์ธํŠธ ์ €์žฅ ์‹คํŒจ ({stderr ์ฒซ ์ค„})`๋ฅผ ์ ๋Š”๋‹ค
278
+
279
+ ### ์ด์–ด์„œ ํ•˜๊ธฐ
280
+
281
+ **Phase 0์˜ ์‚ฌ์ „ ์ ๊ฒ€ ๋ช…๋ น ๋‹ค์Œ, base๋ฅผ ๊ณ ๋ฅด๊ธฐ ์ „์— ์ฒดํฌํฌ์ธํŠธ๋ถ€ํ„ฐ ๋ณธ๋‹ค.** detached HEAD๋ฉด ๋ธŒ๋žœ์น˜๋ณ„ ์ž๋ฆฌ๊ฐ€ ์•ˆ ๊ฐˆ๋ฆฌ๋ฏ€๋กœ ์—ฌ๊ธฐ ์˜ค๊ธฐ ์ „์— ๋ฉˆ์ถ˜๋‹ค. [์ž„์‹œ ํŒŒ์ผ ์ž๋ฆฌ](#์ž„์‹œ-ํŒŒ์ผ-์ž๋ฆฌ)์˜ `rm -f`๋ณด๋‹ค๋„ ๋จผ์ €๋‹ค. ์ง€์šฐ๊ณ  ๋‚˜์„œ ๋ณด๋ฉด ์ด์–ด๊ฐˆ ๊ทผ๊ฑฐ๊ฐ€ ์—†๋‹ค.
282
+
283
+ ```bash
284
+ shipBranch=$(git rev-parse --abbrev-ref HEAD)
285
+ shipTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-ship/$shipBranch"
286
+ mkdir -p "$shipTmp"
287
+ gestalt ship checkpoint check --dir "$shipTmp" --json > "$shipTmp/resume.json"; echo "EXIT=$?"
288
+ echo "$shipTmp"
289
+ ```
290
+
291
+ ๋ช…๋ น์€ ์ฒดํฌํฌ์ธํŠธ์˜ ์ปค๋ฐ‹๊ณผ ์ง€๊ธˆ HEAD, ์ปค๋ฐ‹ ์•ˆ ํ•œ ๋ณ€๊ฒฝ, ๋กœ์ปฌ PR, GitHub PR์„ ๋งž์ถฐ ๋ณด๊ณ  `status`๋ฅผ ๋‚ธ๋‹ค.
292
+
293
+ | `status` | ํ•˜๋Š” ์ผ |
294
+ | --- | --- |
295
+ | `none` | ์ƒˆ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. Phase 0์„ ๊ทธ๋Œ€๋กœ ํƒ„๋‹ค |
296
+ | `match` | ์ฒดํฌํฌ์ธํŠธ์˜ `phase`์™€ `round`, `next`๋ฅผ ํ•œ ์ค„๋กœ ์•Œ๋ฆฌ๊ณ  `next` ์ž๋ฆฌ๋กœ ๊ฐ„๋‹ค. `round`๊ฐ€ `null`์ด๋ฉด ๋ผ์šด๋“œ๋Š” ๋นผ๊ณ  ์ ๋Š”๋‹ค |
297
+ | `mismatch` | `mismatches[].detail`์„ ๊ทธ๋Œ€๋กœ ๋ณด์ด๊ณ  "์ด์–ด์„œ ํ•œ๋‹ค / ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ๋‹ค / ๋ฉˆ์ถ˜๋‹ค"๋กœ ๋ฌป๋Š”๋‹ค. `kind`๊ฐ€ `unreadable`์ด๋ฉด ์ด์–ด๊ฐˆ ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ "์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ๋‹ค / ๋ฉˆ์ถ˜๋‹ค"๋งŒ ๋ฌป๋Š”๋‹ค |
298
+
299
+ - **์ด์–ด์„œ ํ•  ๋•Œ๋Š” base์™€ ๊ฒ€์ฆ ๋ช…๋ น์„ ์ฒดํฌํฌ์ธํŠธ ๊ฐ’์œผ๋กœ ์“ด๋‹ค.** base ์ธ์ž๋ฅผ ๋ฐ›์•˜์œผ๋ฉด ์•„๋ž˜ base ๊ทœ์น™์„ ๋จผ์ € ๋”ฐ๋ฅธ๋‹ค. pr-base๋Š” ๋‹ค์‹œ ๋Œ์ง€ ์•Š๋Š”๋‹ค. ๊ฒ€์ฆ ๋ช…๋ น์€ ์ฒดํฌํฌ์ธํŠธ์˜ `verifyCmd`๋ฅผ ํ•œ ์ค„๋กœ ๋ณด์ด๊ณ  โ“ฅ์™€ ๊ฐ™์€ ํ™•์ธ์„ ํ•œ ๋ฒˆ ๋ฐ›๋Š”๋‹ค. ํŒŒ์ผ์—์„œ ์ฝ์€ ๋ช…๋ น์„ ํ™•์ธ ์—†์ด ์…ธ๋กœ ๋Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ™•์ธ๋ฐ›์€ ๋’ค [๊ฒ€์ฆ ๋ช…๋ น ๋Œ€์กฐ](#๊ฒ€์ฆ-๋ช…๋ น-๋Œ€์กฐ--23๊ณผ-45๊ฐ€-์ด-์ ˆ์„-์“ด๋‹ค) ์ ˆ์€ ๊ทธ๋Œ€๋กœ ๋ˆ๋‹ค. ๊ทธ๋ž˜์„œ `rm -f`๋„ ๊ฑด๋„ˆ๋›ด๋‹ค โ€” ๋Œ€์กฐ๊ฐ€ ์ง€๋‚œ ์‹คํ–‰์˜ `verify-src-hash`์™€ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค
300
+ - **`stopped`๊ฐ€ ์žˆ์œผ๋ฉด ์ง€๋‚œ ์‹คํ–‰์ด ๊ฑฐ๊ธฐ์„œ ๋ฉˆ์ท„๋‹ค๋Š” ๋œป์ด๋‹ค.** ๊ทธ๋Œ€๋กœ ์ด์–ด๊ฐ€๋ฉด ๊ฐ™์€ ์ž๋ฆฌ์—์„œ ๋˜ ๋ฉˆ์ถ˜๋‹ค. ๋ฉˆ์ถ˜ ์ด์œ ๋ฅผ ๋ณด์ด๊ณ  ์ด์–ด๊ฐˆ์ง€ ๋ฌป๋Š”๋‹ค. ์ด์–ด๊ฐ€์„œ ๋‹ค์Œ ์ €์žฅ์„ ํ•˜๋ฉด ์ด ํ‘œ์‹œ๋Š” ์ €์ ˆ๋กœ ์ง€์›Œ์ง„๋‹ค
301
+ - ์ฒดํฌํฌ์ธํŠธ ๋’ค์— ์ปค๋ฐ‹์ด ์Œ“์˜€๋Š”๋ฐ ์ด์–ด์„œ ํ•˜๊ธฐ๋กœ ํ–ˆ์œผ๋ฉด 2.4์ฒ˜๋Ÿผ ๋กœ์ปฌ PR head๋ถ€ํ„ฐ ์˜ฎ๊ธด๋‹ค. 4๋‹จ๊ณ„ ์ดํ›„๋ฉด push๋ถ€ํ„ฐ ํ•œ๋‹ค
302
+ - 2.5์—์„œ ์„ผ ์—ฐ์† ํšŸ์ˆ˜๋Š” ์ด์–ด์„œ ํ•  ๋•Œ 0๋ถ€ํ„ฐ ๋‹ค์‹œ ์„ผ๋‹ค. ์ฒดํฌํฌ์ธํŠธ์—๋Š” ์ด์Šˆ ์ˆ˜๋งŒ ์žˆ๊ณ  ์ด์Šˆ ๋‚ด์šฉ์€ ์—†๋‹ค
303
+ - "์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ๋‹ค"๋ฅผ ๊ณ ๋ฅด๋ฉด `checkpoint.json`๊นŒ์ง€ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์•ˆ ๋๋‚œ ๋กœ์ปฌ PR์€ Phase 1์ด ๋‹ค์‹œ ์ฐพ์•„ ์“ด๋‹ค
304
+ - `EXIT=1`์ด๋ฉด ๋ช…๋ น ์ž์ฒด๊ฐ€ ์‹คํŒจํ•œ ๊ฒƒ์ด๋‹ค(git ์˜ค๋ฅ˜๋‚˜ `--dir` ์˜ค๋ฅ˜). ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ๊นจ์กŒ์œผ๋ฉด `EXIT=1`์ด ์•„๋‹ˆ๋ผ `mismatch`์˜ `unreadable`๋กœ ์˜จ๋‹ค. stderr๋ฅผ ๋ณด์ด๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ํ• ์ง€ ๋ฌป๋Š”๋‹ค
305
+
306
+ **base ์ธ์ž๋ฅผ ๋ฐ›์•˜๊ณ  ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ์žˆ์œผ๋ฉด `status`๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์ „์— base๋ถ€ํ„ฐ ๋งž์ถ˜๋‹ค.** ์ฒดํฌํฌ์ธํŠธ์—๋Š” base ๋Œ€์กฐ๊ฐ€ ์—†์–ด์„œ `match`๋กœ ๋‚˜์™€๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฒˆ์— ์ค€ base๋Š” ๋ฌด์‹œ๋˜๊ณ  ์ฒดํฌํฌ์ธํŠธ์˜ base๊ฐ€ ์“ฐ์ธ๋‹ค. ๊ทธ๋Œ€๋กœ ๊ฐ€๋ฉด PR์ด ์˜› base๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.
307
+
308
+ 1. [Phase 0](#phase-0--์‚ฌ์ „-์ ๊ฒ€)์˜ base ์ธ์ž ๊ทœ์น™๋Œ€๋กœ pr-base 0์ ˆ ์ด๋ฆ„ ๊ฒ€์‚ฌ๋ถ€ํ„ฐ ๊ฑด๋‹ค. ๊ฑธ๋ฆฌ๋ฉด ๊ฑฐ๊ธฐ์„œ ๋ฉˆ์ถ”๊ณ  ๋ฌป๋Š”๋‹ค
309
+ 2. ํ†ต๊ณผํ•œ ์ธ์ž๋ฅผ `checkpoint.base`์™€ ๋น„๊ตํ•œ๋‹ค. ๊ฐ™์œผ๋ฉด ์œ„ ํ‘œ๋Œ€๋กœ ๊ฐ„๋‹ค
310
+ 3. ๋‹ค๋ฅด๋ฉด `status`๊ฐ€ `match`์—ฌ๋„ `mismatch`์ฒ˜๋Ÿผ ๋‹ค๋ฃฌ๋‹ค. "์ฒดํฌํฌ์ธํŠธ base({checkpoint.base})๋กœ ์ด์–ด๊ฐ„๋‹ค / ์ƒˆ base({์ธ์ž})๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ๋‹ค / ๋ฉˆ์ถ˜๋‹ค"๋กœ ๋ฌป๋Š”๋‹ค
311
+ 4. ์ƒˆ base๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•˜๋ฉด `checkpoint.json`์„ ์ง€์šฐ๊ธฐ ์ „์— ์ฒดํฌํฌ์ธํŠธ์˜ ๋กœ์ปฌ PR์„ `gestalt pr close <localPrId> --reason "base ๋ณ€๊ฒฝ"`์œผ๋กœ ์ข…๋ฃŒํ•œ๋‹ค. ์ข…๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด Phase 1์ด ์˜› base๋กœ ๋งŒ๋“  ๋กœ์ปฌ PR์„ ๋‹ค์‹œ ์“ด๋‹ค
312
+ 5. ์ฒดํฌํฌ์ธํŠธ์— `prNumber`๊ฐ€ ์žˆ์œผ๋ฉด ์ƒˆ base ์„ ํƒ์ง€๋ฅผ ๋นผ๊ณ  "GitHub PR์ด ์ด๋ฏธ {checkpoint.base}๋กœ ์—ด๋ ค ์žˆ๋‹ค"๋ฅผ ๋ณด์ธ ๋’ค ์ด์–ด๊ฐ„๋‹ค์™€ ๋ฉˆ์ถ˜๋‹ค๋งŒ ๋ฌป๋Š”๋‹ค
313
+
314
+ `unreadable`์ด๋ฉด ๋น„๊ตํ•  base๊ฐ€ ์—†์œผ๋‹ˆ ์ด ๋น„๊ต๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.
315
+
243
316
  ---
244
317
 
245
318
  ## Phase 0 โ€” ์‚ฌ์ „ ์ ๊ฒ€
@@ -248,14 +321,19 @@ description: "Phase 4/5 โ€” Copilot ๋ผ์šด๋“œ {N}/{์ƒํ•œ} | ์ƒˆ ์ฝ”๋ฉ˜ํŠธ {M}
248
321
  git rev-parse --show-toplevel # ๋ ˆํฌ์ธ์ง€
249
322
  git status --porcelain # ์ปค๋ฐ‹ ์•ˆ ๋œ ๋ณ€๊ฒฝ
250
323
  git rev-parse --abbrev-ref HEAD # ํ˜„์žฌ ๋ธŒ๋žœ์น˜
251
- gh repo view --json defaultBranchRef --jq .defaultBranchRef.name # base ๊ธฐ๋ณธ๊ฐ’
252
324
  gh auth status
253
325
  ```
254
326
 
327
+ **detached HEAD๊ฐ€ ์•„๋‹ˆ๋ฉด base๋ฅผ ๊ณ ๋ฅด๊ธฐ ์ „์— [์ด์–ด์„œ ํ•˜๊ธฐ](#์ด์–ด์„œ-ํ•˜๊ธฐ)๋ถ€ํ„ฐ ๋ˆ๋‹ค.** ์ฒดํฌํฌ์ธํŠธ๋Œ€๋กœ ์ด์–ด๊ฐ€๋ฉด base๋ฅผ ๋‹ค์‹œ ๊ณ ๋ฅด์ง€ ์•Š๋Š”๋‹ค. base ์ธ์ž๋ฅผ ๋ฐ›์•˜์œผ๋ฉด ๊ทธ ์ ˆ์˜ base ๊ทœ์น™๋Œ€๋กœ ๋จผ์ € ๋งž์ถ˜๋‹ค.
328
+
329
+ **`base` ์ธ์ž๊ฐ€ ์—†์œผ๋ฉด [`../_shared/pr-base.md`](../_shared/pr-base.md)๋กœ ๊ณ ๋ฅธ๋‹ค.** ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์Šคํƒ ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋กœ ์˜ฌ๋ฆฌ๋ฉด ์ƒ์œ„ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์ด PR์— ์„ž์ธ๋‹ค. ๊ทธ ๋ฌธ์„œ์˜ "๋ณด๊ณ  ์ค„" ์ ˆ์— ํ•ด๋‹นํ•˜๋Š” ์ค„์„ ์ด ๋‹จ๊ณ„ ๋ณด๊ณ ์— ๊ทธ๋Œ€๋กœ ์‹ฃ๋Š”๋‹ค.
330
+
331
+ **`base` ์ธ์ž๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๋ฌธ์„œ์˜ 0์ ˆ ์ด๋ฆ„ ๊ฒ€์‚ฌ๋ถ€ํ„ฐ ๊ฑด๋‹ค.** ๊ฑธ๋ฆฌ๋ฉด ๋ฉˆ์ถ”๊ณ  ๋ฌป๋Š”๋‹ค. ๊ณ ๋ฅธ base๋“  ๋ฐ›์€ base๋“  ๊ทธ๋‹ค์Œ 4์ ˆ๋กœ ๋น„๊ต ๊ธฐ์ค€ ref์™€ ์ปค๋ฐ‹ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
332
+
255
333
  - **์ปค๋ฐ‹ ์•ˆ ๋œ ๋ณ€๊ฒฝ์ด ์žˆ์œผ๋ฉด ๋ฉˆ์ถ”๊ณ  ๋ฌป๋Š”๋‹ค.** ์ด ์Šคํ‚ฌ์€ head sha๋กœ ๋ผ์šด๋“œ๋ฅผ ๊ฐ€๋ฅด๋ฏ€๋กœ ์›Œํ‚น ํŠธ๋ฆฌ๊ฐ€ ๋”๋Ÿฌ์šฐ๋ฉด ๋ฌด์—‡์ด ๋ฆฌ๋ทฐ๋œ ๊ฑด์ง€ ํ๋ ค์ง„๋‹ค.
256
334
  - **ํ˜„์žฌ ๋ธŒ๋žœ์น˜๊ฐ€ base์™€ ๊ฐ™์œผ๋ฉด ๋ฉˆ์ถ˜๋‹ค.** ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜์—์„œ ๋ฐ”๋กœ ์ถœํ•˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
257
335
  - **detached HEAD๋ฉด ๋ฉˆ์ถ˜๋‹ค.** ๋ผ์šด๋“œ ์ƒํƒœ๋ฅผ ๋ธŒ๋žœ์น˜๋ณ„๋กœ ๊ฐ€๋ฅด๋ฏ€๋กœ ์ด๋ฆ„์ด ์—†์œผ๋ฉด ๋‹ค๋ฅธ ์„ธ์…˜์˜ ์ž๋ฆฌ๋ฅผ ๋ฎ๋Š”๋‹ค.
258
- - **base ๋Œ€๋น„ ์ปค๋ฐ‹์ด ์—†์œผ๋ฉด ๋ฉˆ์ถ˜๋‹ค.** ๋ฆฌ๋ทฐํ•  ๊ฒŒ ์—†๋‹ค.
336
+ - **base ๋Œ€๋น„ ์ปค๋ฐ‹์ด ์—†์œผ๋ฉด ๋ฉˆ์ถ˜๋‹ค.** ๋ฆฌ๋ทฐํ•  ๊ฒŒ ์—†๋‹ค. pr-base 4์ ˆ์ด ์ฐ์€ `commits`๊ฐ€ 0์ธ ๊ฒฝ์šฐ๋‹ค. `commits=error`๋Š” base๋ฅผ ๋ชป ์ฐพ์•˜๋‹ค๋Š” ๋œป์ด๋ผ ๋ฉˆ์ถ”๊ณ  base๋ฅผ ๋‹ค์‹œ ๋ฌป๋Š”๋‹ค. ๋‚ด ์ปค๋ฐ‹์ด ์ด๋ฏธ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜์— ๋“ค์–ด๊ฐ”์œผ๋ฉด 1์ ˆ์ด ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋ฅผ ์ˆ˜ 0์œผ๋กœ ๋Œ๋ ค์ฃผ๊ณ  4์ ˆ๋„ 0์„ ์ฐ๋Š”๋‹ค.
259
337
  - `gh` ์ธ์ฆ์ด ์•ˆ ๋ผ ์žˆ์œผ๋ฉด **์—ฌ๊ธฐ์„œ ์•Œ๋ฆฐ๋‹ค.** Phase 3์—์„œ ์ฒ˜์Œ ์•Œ๋ฉด ๋กœ์ปฌ ๋ฆฌ๋ทฐ ๋ผ์šด๋“œ๊ฐ€ ํ†ต์งธ๋กœ ํ—›๋ˆ๋‹ค.
260
338
 
261
339
  ํ™•์ •ํ•œ base๋ฅผ `base`๋กœ ๋ณด๊ด€ํ•œ๋‹ค. **Phase 3์˜ `gh pr create`๊ฐ€ ์ด ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.**
@@ -275,10 +353,12 @@ shipBranch=$(git rev-parse --abbrev-ref HEAD)
275
353
  shipTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-ship/$shipBranch"
276
354
  mkdir -p "$shipTmp"
277
355
  rm -f "$shipTmp"/verify-src "$shipTmp"/verify-src-hash \
278
- "$shipTmp"/round-start-head "$shipTmp"/requested-at
356
+ "$shipTmp"/round-start-head "$shipTmp"/requested-at "$shipTmp"/checkpoint.json
279
357
  echo "$shipTmp"
280
358
  ```
281
359
 
360
+ [์ด์–ด์„œ ํ•˜๊ธฐ](#์ด์–ด์„œ-ํ•˜๊ธฐ)์—์„œ ์ฒดํฌํฌ์ธํŠธ๋Œ€๋กœ ์ด์–ด๊ฐ€๊ธฐ๋กœ ํ–ˆ์œผ๋ฉด `rm -f` ์ค„์„ ๊ฑด๋„ˆ๋›ด๋‹ค.
361
+
282
362
  **์ถœ๋ ฅ๋œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ ์–ด๋‘”๋‹ค.** ์ด ์ž๋ฆฌ๋Š” git ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜๋ผ ์„ธ์…˜์ด ๋๋‚˜๋„ ๋‚จ๋Š”๋‹ค. ์ง€๋‚œ ์‹คํ–‰์ด ์ƒํ•œ์ด๋‚˜ escalate๋กœ ๋ฉˆ์ท„์œผ๋ฉด ๊ทธ๋•Œ ํŒŒ์ผ์ด ๊ทธ๋Œ€๋กœ ์žˆ์–ด์„œ ์ด๋ฒˆ ์‹คํ–‰์ด ๋‚จ์˜ ์ƒํƒœ๋ฅผ ๋Œ€์กฐํ•œ๋‹ค. ์‹œ์ž‘ํ•  ๋•Œ ํ•œ ๋ฒˆ ํ„ด๋‹ค.
283
363
 
284
364
  **ํŒŒ์ผ ์“ฐ๊ธฐ ๋„๊ตฌ์—๋Š” `$shipTmp`๋ฅผ ์ ์ง€ ์•Š๋Š”๋‹ค.** ๊ทธ ๋„๊ตฌ๋Š” ์…ธ ํ™•์žฅ์„ ์•ˆ ํ•˜๋ฏ€๋กœ ๋ฌธ์ž์—ด์ด ๊ทธ๋Œ€๋กœ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ๊ฑฐ์ ˆ๋œ๋‹ค. ์•„๋‹ˆ๋ฉด ์›Œํ‚นํŠธ๋ฆฌ ์•ˆ์— `$shipTmp`๋ผ๋Š” ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ๊ธด๋‹ค โ€” ์ด ์ ˆ์ด ํ”ผํ•˜๋ ค๋˜ ๋ฐ”๋กœ ๊ทธ ๊ฒฐ๊ณผ๋‹ค. ์œ„์—์„œ ์ถœ๋ ฅ๋œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ ๋Š”๋‹ค.
@@ -362,7 +442,7 @@ Phase 0์—์„œ 4๋ฒˆ(์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ค€ ๋ช…๋ น)์œผ๋กœ ์ •ํ–ˆ์œผ๋ฉด `verify-sr
362
442
 
363
443
  `agent:ship`์œผ๋กœ ๋‚จ๊ธฐ๋ ค๋ฉด **์ด ์Šคํ‚ฌ์ด ๋ถ€๋ฅด๋Š” ํ•˜์œ„ ์Šคํ‚ฌ์˜ `gestalt pr` ํ˜ธ์ถœ๊นŒ์ง€ ๊ทธ ๊ฐ’์ด ์‹ค๋ฆฐ๋‹ค๋Š” ํ™•์ฆ**์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์…ธ ์ƒํƒœ๊ฐ€ ๋„๊ตฌ ํ˜ธ์ถœ ์‚ฌ์ด์— ์•ˆ ๋‚จ๋Š” ๋Ÿฐํƒ€์ž„์ด๋ฉด `export` ํ•œ ์ค„๋กœ๋Š” ์•ˆ ๋œ๋‹ค. ํ™•์ฆ์ด ์—†์œผ๋ฉด ์•ˆ ์“ด๋‹ค โ€” **ํ•œ์ชฝ์—๋งŒ ๋ถ™์ด๋Š” ๊ฒŒ ์ œ์ผ ๋‚˜์˜๋‹ค.**
364
444
 
365
- **์ด ๋ฌธ์„œ์˜ `gestalt pr` ์˜ˆ์‹œ์—๋Š” ์•กํ„ฐ๊ฐ€ ์•ˆ ๋ถ™์–ด ์žˆ๋‹ค.** ๊ธฐ๋ณธ ํ˜•ํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด์ธ ๊ฒƒ์ด๋‹ค. `agent:ship`์„ ๊ณ ๋ฅด๋ฉด ๋„ค ์ž๋ฆฌ ์ „๋ถ€์— `GESTALT_ACTOR=agent:ship`์„ ์•ž์— ๋ถ™์ธ๋‹ค โ€” `pr create`, `pr update` ๋‘˜, `pr close`๋‹ค. **๋„ท ๋‹ค ๋ถ™์ด๊ฑฐ๋‚˜ ๋„ท ๋‹ค ์•ˆ ๋ถ™์ธ๋‹ค.**
445
+ **์ด ๋ฌธ์„œ์˜ `gestalt pr` ์˜ˆ์‹œ์—๋Š” ์•กํ„ฐ๊ฐ€ ์•ˆ ๋ถ™์–ด ์žˆ๋‹ค.** ๊ธฐ๋ณธ ํ˜•ํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด์ธ ๊ฒƒ์ด๋‹ค. `agent:ship`์„ ๊ณ ๋ฅด๋ฉด ์ด ์Šคํ‚ฌ์ด ๋ถ€๋ฅด๋Š” `gestalt pr` ์“ฐ๊ธฐ ๋ช…๋ น ์ „๋ถ€์— `GESTALT_ACTOR=agent:ship`์„ ์•ž์— ๋ถ™์ธ๋‹ค โ€” `pr create`, `pr update`(Phase 1, 2.4, [์ด์–ด์„œ ํ•˜๊ธฐ](#์ด์–ด์„œ-ํ•˜๊ธฐ)์—์„œ head๋ฅผ ์˜ฎ๊ธธ ๋•Œ), `pr close`(Phase 5, base๋ฅผ ๋ฐ”๊ฟ” ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•  ๋•Œ)๋‹ค. **์ „๋ถ€ ๋ถ™์ด๊ฑฐ๋‚˜ ์ „๋ถ€ ์•ˆ ๋ถ™์ธ๋‹ค.**
366
446
 
367
447
  ### ๋ช…๋ น ํ˜•ํƒœ
368
448
 
@@ -383,7 +463,7 @@ git merge-base --is-ancestor <PR์˜ headSha> HEAD # 0์ด๋ฉด ๋‚ด ๋ธŒ๋žœ์น˜์˜
383
463
  gestalt pr update <id> --head "$(git rev-parse HEAD)"
384
464
  ```
385
465
 
386
- ์—†์œผ๋ฉด `local-pr` ์Šคํ‚ฌ์˜ 1๋‹จ๊ณ„๋กœ ๋งŒ๋“ ๋‹ค. description์€ `pr` ์Šคํ‚ฌ์˜ 0~4.5๋‹จ๊ณ„ ๋ฐฉ์‹์œผ๋กœ ์ง“๋Š”๋‹ค โ€” ๊ทธ ์ ˆ์ฐจ๋ฅผ ์—ฌ๊ธฐ ๋‹ค์‹œ ์ ์ง€ ์•Š๋Š”๋‹ค.
466
+ ์—†์œผ๋ฉด `local-pr` ์Šคํ‚ฌ์˜ 1๋‹จ๊ณ„๋กœ ๋งŒ๋“ ๋‹ค. description์€ `pr` ์Šคํ‚ฌ์˜ 0~4.5๋‹จ๊ณ„ ๋ฐฉ์‹์œผ๋กœ ์ง“๋Š”๋‹ค โ€” ๊ทธ ์ ˆ์ฐจ๋ฅผ ์—ฌ๊ธฐ ๋‹ค์‹œ ์ ์ง€ ์•Š๋Š”๋‹ค. **`pr` ์Šคํ‚ฌ์— `target`์œผ๋กœ Phase 0์˜ base๋ฅผ ๋„˜๊ธด๋‹ค.** ์•ˆ ๋„˜๊ธฐ๋ฉด ๊ทธ ์Šคํ‚ฌ์ด pr-base๋กœ ๋‹ค์‹œ ๊ณ ๋ฅธ๋‹ค. ๊ทธ์‚ฌ์ด ์›๊ฒฉ์ด ๋ฐ”๋€Œ๋ฉด diff ๊ธฐ์ค€๊ณผ `--base`๊ฐ€ ๊ฐˆ๋ฆฐ๋‹ค.
387
467
 
388
468
  **์ง€์€ ๋ณธ๋ฌธ์„ ํŒŒ์ผ๋กœ ๋–จ๊ตฐ๋‹ค.** `pr` ์Šคํ‚ฌ 5๋‹จ๊ณ„๋Š” heredoc์œผ๋กœ ์ œ์ถœํ•˜๋ฏ€๋กœ ํŒŒ์ผ์„ ์•ˆ ๋‚จ๊ธด๋‹ค. ์ด ์Šคํ‚ฌ์€ ๊ทธ ๋ณธ๋ฌธ์„ Phase 3์—์„œ ๋‹ค์‹œ ์“ฐ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ €์žฅํ•ด ๋‘”๋‹ค.
389
469
 
@@ -558,20 +638,24 @@ gestalt pr update <id> --head "$(git rev-parse HEAD)"
558
638
  - ์—ฐ๊ด€ PR: owner/name#N ({ํ™•์ • ๊ทผ๊ฑฐ})
559
639
 
560
640
  GitHub์— draft PR๋กœ ์˜ฌ๋ฆด๊นŒ์š”?
561
- - ์˜ฌ๋ฆฐ๋‹ค / ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ๋ฆฌ๋ทฐ / ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค
641
+ - ์˜ฌ๋ฆฐ๋‹ค / Copilot ๋ฆฌ๋ทฐ ์—†์ด ์˜ฌ๋ฆฐ๋‹ค / ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ๋ฆฌ๋ทฐ / ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค
562
642
  ```
563
643
 
564
644
  **์—ฐ๊ด€ PR ์ค„์€ `$shipTmp/related.json`์—์„œ ๋งŒ๋“ ๋‹ค.** ์ƒˆ ๋ฉˆ์ถค ์ž๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด ๋ฉ”์‹œ์ง€์— ๋ถ™๋Š” ํ•œ ์ค„์ด๋ผ "์˜ฌ๋ฆฐ๋‹ค"๊ฐ€ ๊ณง ์ด ์ค„์˜ ํ™•์ธ์ด๋‹ค.
565
645
 
566
646
  - `confirmed`๋Š” "์—ฐ๊ด€ PR: owner/name#N (ํ™•์ • ๊ทผ๊ฑฐ)"๋กœ ์ ๋Š”๋‹ค. ๊ทผ๊ฑฐ๋Š” `evidence`๋ฅผ ์งง๊ฒŒ ์ค„์ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด "๊ฐ™์€ ์ž‘์„ฑ์ž, ๊ฐ™์€ ํ‹ฐ์ผ“ PROJ-123"์ด๋‹ค
567
- - `unconfirmed`๋Š” "์—ฐ๊ด€ PR ํ›„๋ณด: owner/name#N (ํ™•์ธ ํ•„์š”, {์ด์œ })"๋กœ ์ ๋Š”๋‹ค. **"์˜ฌ๋ฆฐ๋‹ค"๋ฅผ ๊ณ ๋ฅด๋ฉด ๊ทธ ํ›„๋ณด๋ฅผ ์Šน์ธํ•œ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค.** ํ›„๋ณด๋ฅผ ๋นผ๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์ค„์—์„œ ๋นผ๋ผ๊ณ  ๋‹ตํ•œ๋‹ค
647
+ - `unconfirmed`๋Š” "์—ฐ๊ด€ PR ํ›„๋ณด: owner/name#N (ํ™•์ธ ํ•„์š”, {์ด์œ })"๋กœ ์ ๋Š”๋‹ค. **"์˜ฌ๋ฆฐ๋‹ค"๋ฅผ ๊ณ ๋ฅด๋ฉด ๊ทธ ํ›„๋ณด๋ฅผ ์Šน์ธํ•œ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค.** "Copilot ๋ฆฌ๋ทฐ ์—†์ด ์˜ฌ๋ฆฐ๋‹ค"๋„ ๊ฐ™๋‹ค. ํ›„๋ณด๋ฅผ ๋นผ๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์ค„์—์„œ ๋นผ๋ผ๊ณ  ๋‹ตํ•œ๋‹ค
568
648
  - ํ›„๋ณด๊ฐ€ ์—ฌ๋Ÿฟ์ด๋ฉด ์ค„์„ ๋‚˜๋ˆ  ์ ๋Š”๋‹ค. ์—†์œผ๋ฉด ์ด ์ค„์„ ์•„์˜ˆ ์•ˆ ์“ด๋‹ค
569
649
  - ์Šน์ธ๋œ ํ›„๋ณด๋งŒ `--confirm owner/name#n`์œผ๋กœ ์ดํ›„ ๋‹จ๊ณ„์— ๋„˜๊ธด๋‹ค. ๋ชฉ๋ก์— ์—†๋˜ PR์€ ์—ฌ๊ธฐ์„œ ๋ชป ๋”ํ•œ๋‹ค
570
650
 
651
+ "Copilot ๋ฆฌ๋ทฐ ์—†์ด ์˜ฌ๋ฆฐ๋‹ค"๋ฅผ ๊ณ ๋ฅด๋ฉด Phase 3์€ ๊ทธ๋Œ€๋กœ ๋Œ๊ณ  Phase 4๋Š” [์ฒซ ๋ฌธ๋‹จ](#phase-4--copilot-๋ฆฌ๋ทฐ-๋ฃจํ”„)๋Œ€๋กœ ์š”์ฒญ์„ ์•ˆ ๋ณด๋‚ธ๋‹ค.
652
+
571
653
  ## Phase 3 โ€” GitHub draft PR
572
654
 
573
655
  description์€ `pr` ์Šคํ‚ฌ์˜ 0~4.5๋‹จ๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ํƒ„๋‹ค. **๋กœ์ปฌ PR ๋ณธ๋ฌธ์„ ๊ทธ๋ƒฅ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” ๋กœ์ปฌ ๋ผ์šด๋“œ์—์„œ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์œผ๋ฏ€๋กœ diff๊ฐ€ ๋‹ค๋ฅด๋‹ค.
574
656
 
657
+ **`pr` ์Šคํ‚ฌ์˜ `target`์— Phase 0์˜ `base`๋ฅผ ๋„˜๊ธด๋‹ค.** ์•ˆ ๋„˜๊ธฐ๋ฉด ๊ทธ ์Šคํ‚ฌ์ด base๋ฅผ ๋‹ค์‹œ ๊ณจ๋ผ diff ๊ธฐ์ค€๊ณผ `--base`๊ฐ€ ๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
658
+
575
659
  Phase 1๊ณผ ๊ฐ™์ด **์ง€์€ ๋ณธ๋ฌธ์„ ๋จผ์ € ํŒŒ์ผ๋กœ ๋–จ๊ตฐ๋‹ค.** `pr` ์Šคํ‚ฌ์€ ํŒŒ์ผ์„ ์•ˆ ๋‚จ๊ธฐ๋ฏ€๋กœ ์ด ์ž๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ž˜ `--body-file`์ด ์ฝ์„ ๊ฒŒ ์—†๋‹ค.
576
660
 
577
661
  ```
@@ -590,7 +674,7 @@ Write <Phase 0์—์„œ ์ถœ๋ ฅ๋œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ>/pr-body.md โ† 4.5๋‹จ๊ณ„์—์„œ
590
674
  - ์—ฐ๊ด€ PR์˜ ์ œ๋ชฉ์ด๋‚˜ ๋ณธ๋ฌธ์„ ์˜ฎ๊ฒจ ์ ์ง€ ์•Š๋Š”๋‹ค. ๋งํฌ๋งŒ ๋‘”๋‹ค
591
675
  - ์—ฐ๊ด€ PR์ด ์—†์œผ๋ฉด ์ด ์ ˆ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋นˆ ์ ˆ์„ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค
592
676
 
593
- ์ œ์ถœ๋งŒ ์ด ์Šคํ‚ฌ์ด ํ•œ๋‹ค. `pr` ์Šคํ‚ฌ๊ณผ ๊ฐˆ๋ฆฌ๋Š” ๊ฑด `--draft`์™€ `--base` ๋‘˜์ด๋‹ค.
677
+ ์ œ์ถœ๋งŒ ์ด ์Šคํ‚ฌ์ด ํ•œ๋‹ค. `pr` ์Šคํ‚ฌ๊ณผ ๊ฐˆ๋ฆฌ๋Š” ๊ฑด `--draft`์™€ ๋ณธ๋ฌธ์„ ํŒŒ์ผ๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ ๋‘˜์ด๋‹ค.
594
678
 
595
679
  ```bash
596
680
  shipTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-ship/$(git rev-parse --abbrev-ref HEAD)"
@@ -611,6 +695,8 @@ PR ๋ฒˆํ˜ธ๋ฅผ `prNumber`, URL์„ `prUrl`๋กœ ๋ณด๊ด€ํ•œ๋‹ค.
611
695
 
612
696
  `round = 1`๋ถ€ํ„ฐ `maxCopilotRounds`(๊ธฐ๋ณธ 5)๊นŒ์ง€ ๋ˆ๋‹ค.
613
697
 
698
+ **์‚ฌ์šฉ์ž๊ฐ€ Copilot ๋ฆฌ๋ทฐ๋ฅผ ๋นผ๋ผ๊ณ  ์ง์ ‘ ๋งํ–ˆ์œผ๋ฉด 4.1 ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค.** ๋ฐ›๋Š” ์ž๋ฆฌ๋Š” ์ด ์Šคํ‚ฌ์„ ๋ถ€๋ฅผ ๋•Œ์˜ ๋ฉ”์‹œ์ง€์™€ ์Šน์ธ ๋‹จ๊ณ„ โ“์˜ ๋‹ต, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ๋‹ค. `copilotRounds`๋ฅผ 0, `copilotStatus`๋ฅผ `skipped`๋กœ ์ ๊ณ  [CI ํ™•์ธ](#ci-ํ™•์ธ)์„ ๊ฑฐ์ณ ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ๊ฐ„๋‹ค. โ“’ ๋ฉ”์‹œ์ง€์˜ ์ฒซ ์ค„์€ `Copilot ๋ฆฌ๋ทฐ ๊ฑด๋„ˆ๋œ€ (์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๋žต, ๊ทผ๊ฑฐ: ๋Œ€ํ™”)`๋‚˜ `Copilot ๋ฆฌ๋ทฐ ๊ฑด๋„ˆ๋œ€ (์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๋žต, ๊ทผ๊ฑฐ: ๋ฉ”๋ชจ๋ฆฌ ship-skip-copilot.md)`์ฒ˜๋Ÿผ ๊ทผ๊ฑฐ๊ฐ€ ์–ด๋””์„œ ์™”๋Š”์ง€ ๋ถ™์—ฌ ๋ฐ”๊ฟ” ์“ด๋‹ค. ๋ฉ”์‹œ์ง€์˜ ๋‚˜๋จธ์ง€ ์ค„์€ [๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›๊ณ  ๋“ค์–ด์˜ฌ ๋•Œ](#๋ฆฌ๋ทฐ๋ฅผ-๋ชป-๋ฐ›๊ณ -๋“ค์–ด์˜ฌ-๋•Œ)๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๋ฌด์—‡์„ ๊ทผ๊ฑฐ๋กœ ์ธ์ •ํ•˜๋Š”์ง€๋Š” ์•„๋ž˜ `copilotStatus` ํ‘œ ๋ฐ‘์— ์žˆ๋‹ค.
699
+
614
700
  ### 4.1 ์š”์ฒญ
615
701
 
616
702
  **์š”์ฒญ ์ง์ „ ์‹œ๊ฐ๊ณผ ๋ผ์šด๋“œ ์‹œ์ž‘ head๋ฅผ ๋จผ์ € ๋ฐ•์•„๋‘”๋‹ค.** ์‹œ๊ฐ์ด ์—†์œผ๋ฉด ์ด์ „ ๋ผ์šด๋“œ์˜ ๋ฆฌ๋ทฐ๋ฅผ ์ด๋ฒˆ ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐํ•œ๋‹ค. head๊ฐ€ ์—†์œผ๋ฉด 4.5์˜ ๊ฒ€์ฆ ์กฐ๊ฑด์ด ๋ฌด์—‡๊ณผ ๋น„๊ตํ• ์ง€ ๋ชจ๋ฅธ๋‹ค.
@@ -620,28 +706,67 @@ shipTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-ship/$(git rev
620
706
 
621
707
  date -u +%Y-%m-%dT%H:%M:%SZ > "$shipTmp/requested-at"
622
708
  git rev-parse HEAD > "$shipTmp/round-start-head"
623
- gh pr edit <prNumber> --add-reviewer "@copilot"
709
+ gh api -X POST "repos/{owner}/{repo}/pulls/<prNumber>/requested_reviewers" \
710
+ -f 'reviewers[]=copilot-pull-request-reviewer[bot]' \
711
+ > "$shipTmp/request-cp{round}.json" 2> "$shipTmp/request-cp{round}.err"; echo "EXIT=$?"
712
+ ```
713
+
714
+ ๋‘ ๊ฐ’ ๋‹ค ํŒŒ์ผ๋กœ ๋‘”๋‹ค. ์ด์œ ๋Š” 2.1๊ณผ ๊ฐ™๋‹ค โ€” ์žก๋Š” ์ž๋ฆฌ์™€ ์“ฐ๋Š” ์ž๋ฆฌ ์‚ฌ์ด์— ๋Œ€๊ธฐ์™€ ์Šน์ธ์ด ๋‚€๋‹ค. ์‘๋‹ต ๋ณธ๋ฌธ๊ณผ ํ‘œ์ค€ ์—๋Ÿฌ๋„ ๋‚˜๋ˆ  ๋‘”๋‹ค. ํ•œ ํŒŒ์ผ์— ์„ž์œผ๋ฉด ์‹คํŒจํ–ˆ์„ ๋•Œ ์–ด๋А ์ค„์ด GitHub ์‘๋‹ต์ธ์ง€ ๊ฐ€๋ฆฌ๊ธฐ ์–ด๋ ต๋‹ค.
715
+
716
+ **`gh pr edit --add-reviewer`๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.** `gh pr edit`์€ ๋ฆฌ๋ทฐ์–ด๋ฅผ ๋ถ™์ด๊ธฐ ์ „์— PR์˜ classic Projects ์นด๋“œ๋ฅผ GraphQL๋กœ ์ฝ๋Š”๋‹ค. GitHub์ด ๊ทธ ํ•„๋“œ๋ฅผ ๋ง‰์•„์„œ ๋ฆฌ๋ทฐ์–ด ์š”์ฒญ๊นŒ์ง€ ๊ฐ€์ง€ ๋ชปํ•˜๊ณ  ์•„๋ž˜ ์—๋Ÿฌ๋กœ ๋๋‚œ๋‹ค.
717
+
718
+ ```
719
+ GraphQL: Projects (classic) is being deprecated in favor of the new Projects experience, see: https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/. (repository.pullRequest.projectCards)
624
720
  ```
625
721
 
626
- ๋‘ ๊ฐ’ ๋‹ค ํŒŒ์ผ๋กœ ๋‘”๋‹ค. ์ด์œ ๋Š” 2.1๊ณผ ๊ฐ™๋‹ค โ€” ์žก๋Š” ์ž๋ฆฌ์™€ ์“ฐ๋Š” ์ž๋ฆฌ ์‚ฌ์ด์— ๋Œ€๊ธฐ์™€ ์Šน์ธ์ด ๋‚€๋‹ค.
722
+ **๋ฆฌ๋ทฐ์–ด ๊ฐ’์€ `copilot-pull-request-reviewer[bot]`์ด๋‹ค.** GitHub ๋ฌธ์„œ์˜ Copilot code review ์‚ฌ์šฉ๋ฒ•์ด REST๋กœ ์š”์ฒญํ•  ๋•Œ ์ด ์ด๋ฆ„์„ ์“ฐ๋ผ๊ณ  ์ ๊ณ  ์žˆ๋‹ค. `Copilot`์ด๋‚˜ `@copilot`์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฆ„์ด ํ‹€๋ ค๋„ POST๋Š” ์„ฑ๊ณต ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค์ค˜์„œ ํ‹€๋ ธ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์—†๋‹ค.
627
723
 
628
- `@copilot`์€ `gh` 2.x์˜ ํŠน์ˆ˜๊ฐ’์ด๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ผ์šด๋“œ๋ถ€ํ„ฐ๋Š” ๊ฐ™์€ ๋ช…๋ น์ด ์žฌ์š”์ฒญ์ด ๋œ๋‹ค.
724
+ **๋‘ ๋ฒˆ์งธ ๋ผ์šด๋“œ๋ถ€ํ„ฐ๋„ ๊ฐ™์€ POST๋ฅผ ๋ณด๋‚ธ๋‹ค.** ์•ž ๋ผ์šด๋“œ์˜ ์š”์ฒญ์€ Copilot์ด ๋ฆฌ๋ทฐ๋ฅผ ์ œ์ถœํ•˜๋ฉด ๋๋‚˜๋ฏ€๋กœ ๋‹ค์‹œ ๋ณด๋‚ด๋ฉด ์ƒˆ ์š”์ฒญ์ด ๋œ๋‹ค. ๋ผ์šด๋“œ๋งˆ๋‹ค ํƒ€์ž„๋ผ์ธ์— `review_requested` ์ด๋ฒคํŠธ๊ฐ€ ์ƒˆ๋กœ ๋ถ™๊ณ  ๋ฆฌ๋ทฐ๋„ ์ƒˆ๋กœ ์˜จ๋‹ค.
629
725
 
630
- **์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ์„ฑ๊ณต์„ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.** `gh pr edit`์€ ์š”์ฒญ์ด ๋ฐ˜์˜ ์•ˆ ๋ผ๋„ exit 0์— PR URL์„ ์ฐ๋Š”๋‹ค. REST๋กœ ์ง์ ‘ POSTํ•ด๋„ 200์ด ์˜จ๋‹ค. ์‹ค์ œ๋กœ ๋ถ™์—ˆ๋Š”์ง€๋Š” ๋”ฐ๋กœ ํ™•์ธํ•œ๋‹ค.
726
+ **์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ์„ฑ๊ณต์„ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์š”์ฒญ์ด ๋ฐ˜์˜ ์•ˆ ๋ผ๋„ 201์ด ์˜จ๋‹ค. ์‘๋‹ต ๋ณธ๋ฌธ์˜ `requested_reviewers`์™€ `GET .../requested_reviewers`๋„ ํŒ๋‹จ ๊ทผ๊ฑฐ๊ฐ€ ๋ชป ๋œ๋‹ค. Copilot์€ ์‚ฌ๋žŒ ๋ฆฌ๋ทฐ์–ด์™€ ๋‹ฌ๋ฆฌ ์ด ๋ชฉ๋ก์— ์•ˆ ๋‚˜ํƒ€๋‚˜์„œ ์š”์ฒญ์ด ์ž˜ ๋“ค์–ด๊ฐ€๋„ `[]`๋‹ค. ์‹ค์ œ๋กœ ๋ถ™์—ˆ๋Š”์ง€๋Š” PR ํƒ€์ž„๋ผ์ธ์˜ `review_requested` ์ด๋ฒคํŠธ๋กœ ํ™•์ธํ•œ๋‹ค.
631
727
 
632
728
  ```bash
633
- gh api "repos/{owner}/{repo}/pulls/<prNumber>/requested_reviewers" --jq '[.users[].login]'
729
+ shipTmp=<Phase 0์—์„œ ์ถœ๋ ฅ๋œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ>
730
+ requestedAt=$(cat "$shipTmp/requested-at")
731
+ [[ $requestedAt =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ ]] \
732
+ || { echo "requested-at ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค โ€” ์กฐํšŒํ•˜์ง€ ์•Š๊ณ  ๋ฉˆ์ถฅ๋‹ˆ๋‹ค"; exit 1; }
733
+
734
+ accepted=none
735
+ for i in 1 2 3; do
736
+ [ "$i" -gt 1 ] && sleep 5
737
+ logins=$(gh api "repos/{owner}/{repo}/issues/<prNumber>/timeline?per_page=100" --paginate \
738
+ --jq ".[] | select(.event == \"review_requested\" and (.created_at | fromdateiso8601) >= ((\"$requestedAt\" | fromdateiso8601) - 10)) | .requested_reviewer.login // empty") \
739
+ || { echo "TIMELINE_ERR try=$i"; continue; }
740
+ printf '%s\n' "$logins" | grep -qx Copilot && { accepted=Copilot; break; }
741
+ done
742
+ echo "ACCEPTED=$accepted"
634
743
  ```
635
744
 
636
- ์—ฌ๊ธฐ Copilot์ด ์—†์œผ๋ฉด **์š”์ฒญ์ด ์ ‘์ˆ˜๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค.** ๊ธฐ๋‹ค๋ ค๋„ ๋ฆฌ๋ทฐ๋Š” ์•ˆ ์˜จ๋‹ค. ํ”ํ•œ ์›์ธ ์…‹์ด๋‹ค.
745
+ - **`requested-at`์ด `date -u` ํ˜•์‹์ด ์•„๋‹ˆ๋ฉด ์กฐํšŒํ•˜์ง€ ์•Š๊ณ  ๋ฉˆ์ถ˜๋‹ค.** ๋นˆ ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ฉด ๋ชจ๋“  ์ด๋ฒคํŠธ๊ฐ€ ๊ฑธ๋ ค ์•ž ๋ผ์šด๋“œ์˜ ์š”์ฒญ์„ ์ด๋ฒˆ ์ ‘์ˆ˜๋กœ ์ฝ๋Š”๋‹ค. ์ด ๊ฐ’์€ `--jq` ์‹์— ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ํ˜•์‹ ๋ฐ–์˜ ๊ธ€์ž๊ฐ€ ์„ž์ด๋ฉด ์‹์ด ๋ฐ”๋€๋‹ค
746
+ - **๋น„๊ต๋Š” ์ดˆ๋กœ ๋ฐ”๊ฟ”์„œ ํ•˜๊ณ  10์ดˆ ์—ฌ์œ ๋ฅผ ๋‘”๋‹ค.** ๊ธฐ๋กํ•œ ์‹œ๊ฐ์€ ์ด ๋จธ์‹ ์˜ ์‹œ๊ณ„์ด๊ณ  ์ด๋ฒคํŠธ ์‹œ๊ฐ์€ GitHub ์„œ๋ฒ„์˜ ์‹œ๊ณ„๋‹ค. ์ด ๋จธ์‹ ์ด ๋ช‡ ์ดˆ ๋น ๋ฅด๋ฉด ๋ฐฉ๊ธˆ ๋ถ™์€ ์ด๋ฒคํŠธ๊ฐ€ ์š”์ฒญ ์‹œ๊ฐ๋ณด๋‹ค ์ด๋ฅด๊ฒŒ ์ฐํ˜€ ๋น ์ง„๋‹ค
747
+ - `--jq`๋Š” ํŽ˜์ด์ง€๋งˆ๋‹ค ๋”ฐ๋กœ ๋Œ์ง€๋งŒ ์ด ์‹์€ ์ด๋ฒคํŠธ ํ•˜๋‚˜์”ฉ ๊ฑฐ๋ฅด๋ฏ€๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜๋‰˜์–ด๋„ ๋น ์ง€๋Š” ๊ฒŒ ์—†๋‹ค
748
+
749
+ `ACCEPTED=Copilot`์ด๋ฉด ์ ‘์ˆ˜๋๋‹ค. **์ด๋ฒคํŠธ๋Š” ๋ฐ”๋กœ ์•ˆ ๋ถ™์„ ์ˆ˜ ์žˆ์–ด์„œ 5์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์„ธ ๋ฒˆ๊นŒ์ง€ ์กฐํšŒํ•œ๋‹ค.** ๋ฃจํ”„์— `sleep`์ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ธ”๋ก์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ Bash๋กœ ๋Œ๋ฆฌ๊ณ  ๋๋‚˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋Š”๋‹ค. ์ „๊ฒฝ์—์„œ ์„ธ์…˜์„ ๋ถ™์žก์ง€ ์•Š๋Š”๋‹ค. `ACCEPTED=none`์ผ ๋•Œ๋งŒ ์ ‘์ˆ˜ ์•ˆ ๋จ์œผ๋กœ ๋ณธ๋‹ค. `TIMELINE_ERR`๊ฐ€ ์„ธ ๋ฒˆ ๋‹ค ์ฐํ˜”์œผ๋ฉด ์ ‘์ˆ˜ ์•ˆ ๋จ์ด ์•„๋‹ˆ๋ผ ์กฐํšŒ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค. ๊ทธ ์‚ฌ์‹ค์„ ์•Œ๋ฆฌ๊ณ  ๊ฐ™์€ ์„ ํƒ์ง€๋กœ ๋ฌป๋Š”๋‹ค.
750
+
751
+ **๋ฌป๊ธฐ ์ „์— ์ด๋ฒˆ ๋ผ์šด๋“œ์˜ ์ ‘์ˆ˜ ์•ˆ ๋จ ์ด์œ ๋ฅผ ์ •ํ•ด ๋‘”๋‹ค.** ๊ฒฝ์šฐ๋Š” ์…‹์ด๋‹ค.
637
752
 
638
- - GHES๋ผ `@copilot`์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค
753
+ - POST๊ฐ€ `EXIT=0`์ด ์•„๋‹ˆ๋ฉด `request-cp{round}.err`์˜ ์ฒซ ์ค„
754
+ - ํƒ€์ž„๋ผ์ธ ์กฐํšŒ๊ฐ€ ์„ธ ๋ฒˆ ๋‹ค ์‹คํŒจํ–ˆ์œผ๋ฉด `ํƒ€์ž„๋ผ์ธ ์กฐํšŒ ์‹คํŒจ, ์ ‘์ˆ˜ ์—ฌ๋ถ€ ํ™•์ธ ๋ชป ํ•จ: {๋งˆ์ง€๋ง‰ ์‹œ๋„์˜ gh ์—๋Ÿฌ ์ฒซ ์ค„}`
755
+ - POST๋Š” ์„ฑ๊ณตํ–ˆ๊ณ  ์กฐํšŒ๋„ ๋๋Š”๋ฐ ์ด๋ฒคํŠธ๊ฐ€ ์—†์œผ๋ฉด `POST๋Š” ์„ฑ๊ณต, ํƒ€์ž„๋ผ์ธ์— ์š”์ฒญ ์ด๋ฒคํŠธ ์—†์Œ`
756
+
757
+ "ํ•œ ๋ฒˆ ๋” ์กฐํšŒํ•œ๋‹ค"๋กœ ๋‹ค์‹œ ๋Œ๋ฉด ๊ทธ ํšŒ์ฐจ ๊ฒฐ๊ณผ๋กœ ์ด์œ ๋ฅผ ๋‹ค์‹œ ์ •ํ•œ๋‹ค. โ“’ ๋ฉ”์‹œ์ง€์˜ ์ฒซ ์ค„๊ณผ ์™„๋ฃŒ ๋ณด๊ณ ์˜ `Copilot:` ์ค„์—๋Š” ์ด ์ด์œ ๋ฅผ ๊ณ ์ณ ์“ฐ์ง€ ๋ง๊ณ  ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธด๋‹ค. ํŒŒ์ผ์€ Phase 5์—์„œ ์ง€์›Œ์ง€๋ฏ€๋กœ ์ด์œ ๋Š” ๋Œ€ํ™”์— ๋‚จ๊ฒจ ๋‘”๋‹ค.
758
+
759
+ **POST๋Š” `EXIT=0`์ธ๋ฐ ์ ‘์ˆ˜ ์•ˆ ๋จ์ด๋ฉด ๋ฌป๋Š”๋‹ค.** ์„ ํƒ์ง€๋Š” "ํ•œ ๋ฒˆ ๋” ์กฐํšŒํ•œ๋‹ค / ๋ฆฌ๋ทฐ ์—†์ด ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ๊ฐ„๋‹ค / ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค"๋‹ค. ํ•œ ๋ฒˆ ๋” ์กฐํšŒํ•˜๋ฉด ์œ„ ๋ธ”๋ก์„ ๋‹ค์‹œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋Šฆ๊ฒŒ ๋ถ™๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์„œ ๋ฐ”๋กœ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค.
760
+
761
+ **POST๊ฐ€ `EXIT=0`์ด ์•„๋‹ˆ๋ฉด ์š”์ฒญ ์ž์ฒด๊ฐ€ ์•ˆ ๋“ค์–ด๊ฐ”๋‹ค.** ๋‹ค์‹œ ์กฐํšŒํ•ด๋„ ์†Œ์šฉ์—†๊ณ  ๊ธฐ๋‹ค๋ ค๋„ ๋ฆฌ๋ทฐ๋Š” ์•ˆ ์˜จ๋‹ค. `request-cp{round}.json`๊ณผ `request-cp{round}.err`์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๋ณด์ด๊ณ  "๋ฆฌ๋ทฐ ์—†์ด ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ๊ฐ„๋‹ค / ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค"๋กœ ๋ฌป๋Š”๋‹ค.
762
+
763
+ ์–ด๋А ์ชฝ์ด๋“  ์•„๋ž˜ ์›์ธ ๋ชฉ๋ก์„ ํ•จ๊ป˜ ๋ณด์ธ๋‹ค. ํ”ํ•œ ์›์ธ ์…‹์ด๋‹ค.
764
+
765
+ - GHES๋ผ Copilot code review๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค
639
766
  - ๋ ˆํฌ๋‚˜ ์กฐ์ง์— Copilot code review๊ฐ€ ์•ˆ ์ผœ์ ธ ์žˆ๋‹ค
640
767
  - ๊ณ„์ •์— Copilot ๊ตฌ๋…์ด ์—†๋‹ค
641
768
 
642
- ๊ทธ๋•Œ๋Š” **๋ฉˆ์ถ”๊ณ  ์•Œ๋ฆฐ๋‹ค.** ๋ฌด์—‡์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”์ง€ ํ•จ๊ป˜ ์ ๋Š”๋‹ค โ€” ๋ ˆํฌ Settings์˜ Copilot ํ•ญ๋ชฉ๊ณผ ๊ณ„์ • ๊ตฌ๋…์ด๋‹ค. **Copilot ๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›์•˜๋Š”๋ฐ ๋ฐ›์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.** ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ๋ทฐ ์—†์ด ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ•˜๋ฉด ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ๊ฐ€๋˜ `copilotRounds`๋ฅผ 0์œผ๋กœ ์ ๊ณ  ์™„๋ฃŒ ๋ณด๊ณ ์— ๊ทธ ์‚ฌ์‹ค์„ ๋‚จ๊ธด๋‹ค.
643
-
644
- Copilot์ด ๋ฆฌ๋ทฐ๋ฅผ ์ด๋ฏธ ์‹œ์ž‘ํ•ด ์š”์ฒญ ๋ชฉ๋ก์—์„œ ๋น ์กŒ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ ๊ฒฝ์šฐ๋Š” 4.2์˜ ํŒ์ •์— ๊ฑธ๋ฆฌ๋ฏ€๋กœ, ๋ชฉ๋ก์ด ๋น„์—ˆ์œผ๋ฉด **ํ•œ ๋ฒˆ์€ 4.2๋กœ ๋‚ด๋ ค๊ฐ€ ๋ณด๊ณ ** ๊ฑฐ๊ธฐ์„œ๋„ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์˜ค๋ฉด ์œ„์˜ ๊ฒฝ์šฐ๋กœ ๊ฐ„๋‹ค.
769
+ ์•Œ๋ฆด ๋•Œ ๋ฌด์—‡์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”์ง€ ํ•จ๊ป˜ ์ ๋Š”๋‹ค โ€” ๋ ˆํฌ Settings์˜ Copilot ํ•ญ๋ชฉ๊ณผ ๊ณ„์ • ๊ตฌ๋…์ด๋‹ค. **Copilot ๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›์•˜๋Š”๋ฐ ๋ฐ›์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.** ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฆฌ๋ทฐ ์—†์ด ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ•˜๋ฉด `copilotStatus`๋ฅผ `not-accepted`๋กœ ์ ๊ณ  ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ๊ฐ„๋‹ค. `copilotRounds`๋Š” ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ณ  ๋๋‚ธ ๋ผ์šด๋“œ ์ˆ˜ ๊ทธ๋Œ€๋กœ๋ผ ์ฒซ ๋ผ์šด๋“œ๋ฉด 0์ด๋‹ค. โ“’ ๋ฉ”์‹œ์ง€๋Š” [๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›๊ณ  ๋“ค์–ด์˜ฌ ๋•Œ](#๋ฆฌ๋ทฐ๋ฅผ-๋ชป-๋ฐ›๊ณ -๋“ค์–ด์˜ฌ-๋•Œ)๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ์ ‘์ˆ˜๋ฅผ ํ™•์ธ ๋ชป ํ•œ ๋’ค์— ๋‚ด๋ฆฐ ๊ฒฐ์ •์ด๋ผ `skipped`๊ฐ€ ์•„๋‹ˆ๋‹ค.
645
770
 
646
771
  ### 4.2 ์™„๋ฃŒ ๋Œ€๊ธฐ
647
772
 
@@ -652,7 +777,7 @@ gh pr view <prNumber> --json reviews \
652
777
  --jq "[.reviews[] | select(.author.login | test(\"[Cc]opilot\")) | .submittedAt] | max"
653
778
  ```
654
779
 
655
- ์ด ๊ฐ’์ด `requestedAt`๋ณด๋‹ค ๋Šฆ์œผ๋ฉด ์™„๋ฃŒ๋‹ค. **`null`์ด๊ฑฐ๋‚˜ `requestedAt`๋ณด๋‹ค ์ด๋ฅด๋ฉด ์•„์ง์ด๋‹ค** โ€” ์•ž ๋ผ์šด๋“œ์˜ ์ž”์ƒ์ด๋‹ค.
780
+ ์ด ๊ฐ’์ด `requestedAt`๋ณด๋‹ค ๋Šฆ์œผ๋ฉด ์™„๋ฃŒ๋‹ค. **`null`์ด๊ฑฐ๋‚˜ `requestedAt`๋ณด๋‹ค ์ด๋ฅด๋ฉด ์•„์ง์ด๋‹ค** โ€” ์•ž ๋ผ์šด๋“œ์˜ ์ž”์ƒ์ด๋‹ค. 4.1๊ณผ ๋‹ฌ๋ฆฌ ์‹œ๊ณ„ ์—ฌ์œ ๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค. ๋ฆฌ๋ทฐ๋Š” ์š”์ฒญ ๋’ค 1๋ถ„ ๋„˜๊ฒŒ ์ง€๋‚˜์„œ ์˜ค๋ฏ€๋กœ ๋ช‡ ์ดˆ ์–ด๊ธ‹๋‚˜๋„ ํŒ์ •์ด ์•ˆ ๋ฐ”๋€๋‹ค. ์—ฌ์œ ๋ฅผ ๋นผ๋ฉด ์˜คํžˆ๋ ค ์š”์ฒญ ์ง์ „์— ๋๋‚œ ์•ž ๋ผ์šด๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.
656
781
 
657
782
  ๋Œ€๊ธฐ ๋ฐฉ์‹์€ ๋Ÿฐํƒ€์ž„์ด ์ฃผ๋Š” ๊ฒƒ์— ๋งž์ถ˜๋‹ค.
658
783
 
@@ -668,6 +793,8 @@ Copilot ๋ฆฌ๋ทฐ๊ฐ€ 10๋ถ„์งธ ์•ˆ ์˜ต๋‹ˆ๋‹ค. (์š”์ฒญ์€ ์ ‘์ˆ˜๋จ)
668
793
  - ๋” ๊ธฐ๋‹ค๋ฆฐ๋‹ค / ๋ฆฌ๋ทฐ ์—†์ด ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ๊ฐ„๋‹ค / ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค
669
794
  ```
670
795
 
796
+ ๋ฆฌ๋ทฐ ์—†์ด โ“’๋กœ ๊ฐ€๋ฉด `copilotStatus`๋ฅผ `requested`๋กœ ์ ๋Š”๋‹ค. `copilotRounds`๋Š” ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ณ  ๋๋‚ธ ๋ผ์šด๋“œ ์ˆ˜ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค. โ“’ ๋ฉ”์‹œ์ง€๋Š” [๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›๊ณ  ๋“ค์–ด์˜ฌ ๋•Œ](#๋ฆฌ๋ทฐ๋ฅผ-๋ชป-๋ฐ›๊ณ -๋“ค์–ด์˜ฌ-๋•Œ)๋ฅผ ๋”ฐ๋ฅธ๋‹ค.
797
+
671
798
  ์ด์Šˆ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ๋„ ๋ฆฌ๋ทฐ๋Š” ์ œ์ถœ๋œ๋‹ค. body๋งŒ ์žˆ๊ณ  ์ธ๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ 0์ธ ํ˜•ํƒœ๋‹ค. ๊ทธ๊ฑด **์™„๋ฃŒ์ด์ž ์ˆ˜๋ ด**์ด๋‹ค.
672
799
 
673
800
  ### 4.3 ์ฝ”๋ฉ˜ํŠธ ์ˆ˜์ง‘
@@ -695,6 +822,8 @@ gh api "repos/{owner}/{repo}/pulls/<prNumber>/comments?since=<๊ธฐ์ค€ ์‹œ๊ฐ>" \
695
822
  ์ด๋ฒˆ ๋ผ์šด๋“œ ์ƒˆ ์ฝ”๋ฉ˜ํŠธ 0๊ฑด โ†’ ์ˆ˜๋ ด. ๋ฃจํ”„ ํƒˆ์ถœ
696
823
  ```
697
824
 
825
+ ์ˆ˜๋ ดํ•œ ๋ผ์šด๋“œ๋„ ๋ฆฌ๋ทฐ๋Š” ์ œ์ถœ๋์œผ๋ฏ€๋กœ `copilotRounds`์— ์„ผ๋‹ค. ์ˆ˜๋ ดํ•ด ๋น ์งˆ ๋•Œ `copilotRounds`๋Š” ์ง€๊ธˆ `round`์™€ ๊ฐ™๋‹ค.
826
+
698
827
  ### 4.5 ์Šน์ธ ๋‹จ๊ณ„ โ“‘์™€ ๋Œ€์‘
699
828
 
700
829
  `review-reply` ์Šคํ‚ฌ์„ `prNumber` ๋Œ€์ƒ์œผ๋กœ ๋ถ€๋ฅธ๋‹ค. ์œ ํ˜• ๋ถ„๋ฅ˜ ์Šน์ธ์ด โ“‘๋‹ค.
@@ -738,7 +867,44 @@ git push
738
867
 
739
868
  2.5์™€ ๊ฐ™๋‹ค. ๊ฐ™์€ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์„ธ ๋ผ์šด๋“œ ์—ฐ์† ๋‚จ์œผ๋ฉด ์ƒํ•œ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฉˆ์ถ˜๋‹ค.
740
869
 
741
- `maxCopilotRounds`๋ฅผ ์ฑ„์› ๋Š”๋ฐ ์ƒˆ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ๊ณ„์† ๋‚˜์˜ค๋ฉด ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ์•ˆ ๋„˜์–ด๊ฐ„๋‹ค. ๋‚จ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ •๋ฆฌํ•ด ๋ณด๊ณ ํ•˜๊ณ  ๋ฉˆ์ถ˜๋‹ค. draft๋Š” draft๋กœ ๋‘”๋‹ค.
870
+ `maxCopilotRounds`๋ฅผ ์ฑ„์› ๋Š”๋ฐ ์ƒˆ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ๊ณ„์† ๋‚˜์˜ค๋ฉด ์Šน์ธ ๋‹จ๊ณ„ โ“’๋กœ ์•ˆ ๋„˜์–ด๊ฐ„๋‹ค. ๋‚จ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ •๋ฆฌํ•ด ๋ณด๊ณ ํ•˜๊ณ  ๋ฉˆ์ถ˜๋‹ค. draft๋Š” draft๋กœ ๋‘”๋‹ค. ๋ฉˆ์ถ”๊ธฐ ์ „์— [CI ํ™•์ธ](#ci-ํ™•์ธ)์„ ํ•œ ๋ฒˆ ๋Œ๋ ค ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์— ์‹ฃ๋Š”๋‹ค. ์‹คํŒจํ•ด๋„ ์—ฌ๊ธฐ์„œ๋Š” ๊ณ ์น˜์ง€ ์•Š๋Š”๋‹ค. [์ฒดํฌํฌ์ธํŠธ](#์ฒดํฌํฌ์ธํŠธ)๋Š” CI ํ™•์ธ ๋’ค์— `--stopped blocked`๋กœ ์ €์žฅํ•œ๋‹ค. ์•ž์— ์ €์žฅํ•˜๋ฉด CI ํ™•์ธ ๋์˜ ์ €์žฅ์ด ๋ฉˆ์ถค ํ‘œ์‹œ๋ฅผ ์ง€์šด๋‹ค.
871
+
872
+ ## CI ํ™•์ธ
873
+
874
+ draft PR์„ ์˜ฌ๋ฆฐ ๋’ค CI ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ ค โ“’์™€ ์™„๋ฃŒ ๋ณด๊ณ ์— ์‹ฃ๋Š”๋‹ค. ๋กœ์ปฌ ๊ฒ€์ฆ ๋ช…๋ น์„ ํ†ต๊ณผํ•ด๋„ CI์—์„œ๋งŒ ๋„๋Š” ๊ฒ€์‚ฌ๊ฐ€ push ๋’ค์— ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋น„๋ฐ€ ๊ฐ’์œผ๋กœ ๋„๋Š” ๊ธˆ์ง€์–ด ๊ฒ€์‚ฌ๋‚˜ ๋‹ค๋ฅธ OS์™€ Node ๋ฒ„์ „ ์กฐํ•ฉ์œผ๋กœ ๋„๋Š” ๊ฒ€์‚ฌ๊ฐ€ ๊ทธ๋ ‡๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ PR์„ ์—ด์–ด ๋ณด๊ณ ์„œ์•ผ ์‹คํŒจ๋ฅผ ์•Œ๋ฉด ์ถœํ•˜๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•œ ๋ณด๊ณ ๊ฐ€ ํ‹€๋ฆฐ ๋ง์ด ๋œ๋‹ค.
875
+
876
+ **Phase 4๊ฐ€ ์–ด๋–ป๊ฒŒ ๋๋‚˜๋“  โ“’ ์ „์— ์ด ์ ˆ์„ ๋ˆ๋‹ค.** 4.4์—์„œ ์ˆ˜๋ ดํ–ˆ๋“  `skipped`๋‚˜ `not-accepted`, `requested`๋กœ ๋„˜์–ด์™”๋“  ๊ฐ™๋‹ค. Phase 4์—์„œ "์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค"๋ฅผ ๊ณจ๋ž์„ ๋•Œ๋„ 4.6์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ ๋Œ๋ ค ๋ณด๊ณ ์—๋งŒ ์‹ฃ๋Š”๋‹ค.
877
+
878
+ ๋Œ€๊ธฐ๊ฐ€ ๊ธธ์–ด Bash๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ๋ฆฌ๊ณ  ๋๋‚˜๋ฉด ๊ฒฐ๊ณผ ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค.
879
+
880
+ ```bash
881
+ shipTmp=<Phase 0์—์„œ ์ถœ๋ ฅ๋œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ>
882
+
883
+ gestalt ship ci-wait --pr <prNumber> --head "$(git rev-parse HEAD)" --json \
884
+ > "$shipTmp/ci.json" 2> "$shipTmp/ci.err"; echo "EXIT=$?"
885
+ ```
886
+
887
+ - **`--head`๋ฅผ ๊ผญ ๋„˜๊ธด๋‹ค.** push ์งํ›„์—๋Š” PR์ด ์•„์ง ์•ž ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌ์ผœ์„œ ์•ž ์ปค๋ฐ‹์˜ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฒˆ ๊ฒƒ์œผ๋กœ ์ฝ๋Š”๋‹ค
888
+ - ๊ธฐ๋ณธ ์ƒํ•œ์€ 15๋ถ„(`--timeout 900`)์ด๋‹ค. ์ฒดํฌ๊ฐ€ ํ•˜๋‚˜๋„ ์•ˆ ๋ถ™์€ ์ฑ„ 2๋ถ„(`--grace 120`)์ด ์ง€๋‚˜๋ฉด CI๊ฐ€ ์—†๋‹ค๊ณ  ๋ณธ๋‹ค
889
+ - `EXIT=1`์ด๋ฉด ํŒ์ •์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค. `ci.err`์˜ ์ฒซ ์ค„์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๊ณ  `ciStatus`๋ฅผ `unchecked`๋กœ ์ ๋Š”๋‹ค
890
+
891
+ `ci.json`์˜ `status`๋กœ ๊ฐˆ๋ฆฐ๋‹ค.
892
+
893
+ | `status` | โ“’์™€ ๋ณด๊ณ ์— ์“ฐ๋Š” ๋ง | ๋‹ค์Œ |
894
+ | --- | --- | --- |
895
+ | `pass` | ํ†ต๊ณผ | โ“’ |
896
+ | `none` | CI ์—†์Œ | โ“’ |
897
+ | `skipped` | ์ „๋ถ€ ๊ฑด๋„ˆ๋œ€ ({n}๊ฐœ) | โ“’. ์•„๋ž˜ ์„ค๋ช…์„ CI ์ค„ ์•„๋ž˜์— ์ ๋Š”๋‹ค |
898
+ | `pending` | ์ง„ํ–‰ ์ค‘ (15๋ถ„ ์•ˆ์— ์•ˆ ๋๋‚จ) | โ“’. ๋” ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค |
899
+ | `fail` | ์‹คํŒจ {n}๊ฐœ. `pending`์ด ๋‚จ์•˜์œผ๋ฉด `์‹คํŒจ {n}๊ฐœ (๋‚˜๋จธ์ง€ {k}๊ฐœ๋Š” ์•ˆ ๋๋‚œ ์ฑ„ ๋ฉˆ์ถค)` | โ“’์—์„œ ๊ณ ์น ์ง€ ๋ฌป๋Š”๋‹ค |
900
+
901
+ **์‹คํŒจํ•˜๋ฉด `failed[]`์˜ ์žก ์ด๋ฆ„๊ณผ `causeLines`๋ฅผ ๋ณด์ธ๋‹ค.** ์›์ธ ์ค„์€ CI ๋กœ๊ทธ์—์„œ ๊ณ ๋ฅธ ์™ธ๋ถ€ ํ…์ŠคํŠธ๋‹ค. 4.3์˜ Copilot ์ฝ”๋ฉ˜ํŠธ์ฒ˜๋Ÿผ ์ง€์‹œ๋กœ ์ฝ์ง€ ์•Š๋Š”๋‹ค. `logError`๊ฐ€ ์žˆ๋Š” ์žก์€ ์›์ธ ์ค„ ๋Œ€์‹  ๊ทธ ์ด์œ ์™€ `link`๋ฅผ ์ ๋Š”๋‹ค. `causeLinesTotal`์ด `causeLines` ๊ฐœ์ˆ˜๋ณด๋‹ค ํฌ๋ฉด ์›์ธ ์ค„ ์•„๋ž˜์— `์™ธ {์ฐจ์ด}์ค„`์„ ๋ถ™์ธ๋‹ค. `causeFromTail`์ด `true`๋ฉด ์›์ธ ํ‘œ์‹œ๋ฅผ ๋ชป ์ฐพ์•„ ๋กœ๊ทธ ๋ ์ค„์„ ๋Œ€์‹  ๋‚ธ ๊ฒƒ์ด๋ผ ๊ทธ ์‚ฌ์‹ค์„ ์›์ธ ์ค„ ์•ž์— ์ ๋Š”๋‹ค.
902
+
903
+ ์‹คํŒจ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋ณด์ด๋ฉด ๋ช…๋ น์€ ์•ˆ ๋๋‚œ ์ฒดํฌ๋ฅผ ๋” ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  `fail`๋กœ ๋๋‚ธ๋‹ค. ๋‚จ์€ ์ฒดํฌ๋Š” `pending`์— ์‹ค๋ฆฐ๋‹ค.
904
+
905
+ **์ฒดํฌ๊ฐ€ ๋‹ค ๋๋‚ฌ๋Š”๋ฐ ํ†ต๊ณผํ•œ ๊ฒŒ ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด `skipped`๋‹ค.** `if: github.event.pull_request.draft == false`์ฒ˜๋Ÿผ draft์—์„œ ์žก์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๋ ˆํฌ์—์„œ ์ƒ๊ธด๋‹ค. ์ด ์Šคํ‚ฌ์€ PR์„ draft๋กœ ์˜ฌ๋ฆฌ๋ฏ€๋กœ ์•„๋ฌด ๊ฒ€์‚ฌ๋„ ์•ˆ ๋ˆ ์ฑ„ ๋๋‚œ ๊ฒƒ์ด๋ผ ํ†ต๊ณผ๋กœ ์ ์ง€ ์•Š๋Š”๋‹ค. โ“’์˜ CI ์ค„ ์•„๋ž˜์— "draft๋ผ์„œ ๊ฑด๋„ˆ๋›ด ์žก์ผ ์ˆ˜ ์žˆ์–ด์š”. ready๋กœ ๋ฐ”๊พผ ๋’ค CI๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์š”"๋ฅผ ์ ๋Š”๋‹ค. ํ†ต๊ณผํ•œ ์ฒดํฌ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๋‚˜๋จธ์ง€๊ฐ€ ๊ฑด๋„ˆ๋›ฐ์—ˆ์–ด๋„ `pass`๋‹ค.
906
+
907
+ โ“’์—์„œ "๊ณ ์นœ๋‹ค"๋ฅผ ๊ณ ๋ฅด๋ฉด 4.5์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ฐ„๋‹ค. [๊ฒ€์ฆ ๋ช…๋ น ๋Œ€์กฐ](#๊ฒ€์ฆ-๋ช…๋ น-๋Œ€์กฐ--23๊ณผ-45๊ฐ€-์ด-์ ˆ์„-์“ด๋‹ค) ์ ˆ์„ ๋จผ์ € ๋Œ๊ณ  ๊ฒ€์ฆ์„ ๋Œ๋ฆฐ ๋’ค pushํ•ด์„œ ์ด ์ ˆ๋กœ ๋Œ์•„์˜จ๋‹ค. pushํ•œ ์งํ›„ [์ฒดํฌํฌ์ธํŠธ](#์ฒดํฌํฌ์ธํŠธ)๋ฅผ `ci`๋กœ ์ €์žฅํ•œ๋‹ค. ๊ฐ™์€ ์žก์ด ์„ธ ๋ฒˆ ์—ฐ์† ์‹คํŒจํ•˜๋ฉด 2.5์ฒ˜๋Ÿผ ๋ฉˆ์ถ”๊ณ  ๋‚จ์€ ์‹คํŒจ๋ฅผ ๋ณด๊ณ ํ•œ๋‹ค. CI๋ฅผ ๊ณ ์นœ ์ปค๋ฐ‹์€ Copilot ๋ฆฌ๋ทฐ๋ฅผ ์•ˆ ๊ฑฐ์ณค์œผ๋ฏ€๋กœ โ“’์— ๊ทธ ์‚ฌ์‹ค์„ ์ ๋Š”๋‹ค.
742
908
 
743
909
  ## ์Šน์ธ ๋‹จ๊ณ„ โ“’ โ€” ready ์ „ํ™˜
744
910
 
@@ -747,6 +913,7 @@ Copilot ๋ฆฌ๋ทฐ ์ˆ˜๋ ด ({N}๋ผ์šด๋“œ)
747
913
  - ๋ฐ˜์˜: {M}๊ฑด / ์œ ์˜ˆ: {K}๊ฑด (์˜คํƒ {a}, ๊ทœ์น™ ์šฐ์„  {b})
748
914
  - ๋ฏธํ•ด๊ฒฐ ์Šค๋ ˆ๋“œ: {U}๊ฑด
749
915
  - ๊ฒ€์ฆ: {๋ˆ ๋ผ์šด๋“œ๋ฉด "{verifyCmd} PASS", ๊ฑด๋„ˆ๋›ด ๋ผ์šด๋“œ๋ฉด "์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†์–ด ๊ฑด๋„ˆ๋œ€ (๋งˆ์ง€๋ง‰ PASS: ๋ผ์šด๋“œ {R})"}
916
+ - CI: {CI ํ™•์ธ ์ ˆ์˜ ๋ง}
750
917
 
751
918
  {prUrl}์„ ready๋กœ ๋ฐ”๊ฟ€๊นŒ์š”?
752
919
  - ๋ฐ”๊พผ๋‹ค / draft๋กœ ๋‘”๋‹ค
@@ -754,6 +921,36 @@ Copilot ๋ฆฌ๋ทฐ ์ˆ˜๋ ด ({N}๋ผ์šด๋“œ)
754
921
 
755
922
  **๋ฏธํ•ด๊ฒฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‚จ์•˜์œผ๋ฉด ๊ทธ ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ ๋Š”๋‹ค.** ์œ ์˜ˆํ•œ ํ•ญ๋ชฉ์ด ์žˆ๋Š”๋ฐ ์ „๋ถ€ ๋ฐ˜์˜ํ–ˆ๋‹ค๊ณ  ๋ณด์ด๋ฉด ์•ˆ ๋œ๋‹ค.
756
923
 
924
+ **CI๊ฐ€ ์‹คํŒจํ–ˆ์œผ๋ฉด ready๋ฅผ ๋ฌป์ง€ ์•Š๋Š”๋‹ค.** CI ์ค„ ์•„๋ž˜์— ์‹คํŒจํ•œ ์žก๊ณผ ์›์ธ ์ค„, ๊ณ ์น˜๋ฉด ๋ฐ”๋€” ํŒŒ์ผ์„ ํŽผ์น˜๊ณ  ์งˆ๋ฌธ์„ ๋ฐ”๊พผ๋‹ค. 4.5์˜ โ“‘์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์Šน์ธ์˜ ๊ทผ๊ฑฐ๋Š” ๋กœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ”๋€” ์ฝ”๋“œ๋‹ค.
925
+
926
+ ```
927
+ - CI: ์‹คํŒจ 1๊ฐœ
928
+ - build (ubuntu-latest, 22) โ€” AssertionError: expected [ 'docs/a.md' ] to deeply equal []
929
+ ๊ณ ์น˜๋ฉด ๋ฐ”๋€” ํŒŒ์ผ: docs/a.md
930
+
931
+ CI ์‹คํŒจ๋ฅผ ๊ณ ์น ๊นŒ์š”?
932
+ - ๊ณ ์นœ๋‹ค / draft๋กœ ๋‘”๋‹ค
933
+ ```
934
+
935
+ ### ๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›๊ณ  ๋“ค์–ด์˜ฌ ๋•Œ
936
+
937
+ `copilotStatus`๊ฐ€ `skipped`๋‚˜ `not-accepted`, `requested`๋กœ โ“’์— ์˜ค๋ฉด ์œ„ ํ‹€์˜ ์ฒซ ์ค„์„ ๋ฐ”๊พผ๋‹ค. ์ˆ˜๋ ดํ–ˆ๋‹ค๊ณ  ์“ฐ๋ฉด ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์€ ๊ฒƒ์ฒ˜๋Ÿผ ์ฝํžŒ๋‹ค. `{N}`์€ `copilotRounds`, `{L}`์€ ๋ฆฌ๋ทฐ ์—†์ด ๋„˜์–ด์˜จ ๋ผ์šด๋“œ ๋ฒˆํ˜ธ๋‹ค. ์œ„ ํ‹€์˜ ๊ฒ€์ฆ ์ค„์— ์“ฐ๋Š” `{R}`๊ณผ ๋‹ค๋ฅธ ๊ฐ’์ด๋‹ค.
938
+
939
+ | `copilotStatus` | ์•ž ๋ผ์šด๋“œ ๋ฆฌ๋ทฐ | ์ฒซ ์ค„ |
940
+ | --- | --- | --- |
941
+ | `skipped` | โ€” | Phase 4 ์ฒซ ๋ฌธ๋‹จ์˜ ์ค„. ์˜ˆ: `Copilot ๋ฆฌ๋ทฐ ๊ฑด๋„ˆ๋œ€ (์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๋žต, ๊ทผ๊ฑฐ: ๋Œ€ํ™”)` |
942
+ | `not-accepted` | ์—†์Œ | `Copilot ๋ฆฌ๋ทฐ ์—†์Œ (์ ‘์ˆ˜ ์•ˆ ๋จ: {4.1์—์„œ ์ •ํ•œ ์ด์œ })` |
943
+ | `not-accepted` | ์žˆ์Œ | `Copilot ๋ฆฌ๋ทฐ {N}๋ผ์šด๋“œ ๋ฐ›์Œ, ๋ผ์šด๋“œ {L} ์ ‘์ˆ˜ ์•ˆ ๋จ ({4.1์—์„œ ์ •ํ•œ ์ด์œ })` |
944
+ | `requested` | ์—†์Œ | `Copilot ๋ฆฌ๋ทฐ ์•ˆ ์˜ด (์š”์ฒญ์€ ์ ‘์ˆ˜๋จ, ๋ผ์šด๋“œ {L}์—์„œ ๋Œ€๊ธฐ ์ค‘ ์ œ์ถœ ์—†์Œ)` |
945
+ | `requested` | ์žˆ์Œ | `Copilot ๋ฆฌ๋ทฐ {N}๋ผ์šด๋“œ ๋ฐ›์Œ, ๋ผ์šด๋“œ {L}์—์„œ๋Š” ๋ฆฌ๋ทฐ ์•ˆ ์˜ด (์š”์ฒญ์€ ์ ‘์ˆ˜๋จ, ๋Œ€๊ธฐ ์ค‘ ์ œ์ถœ ์—†์Œ)` |
946
+
947
+ ๋‚˜๋จธ์ง€ ์ค„์€ Copilot ๋ผ์šด๋“œ๋ฅผ ๋ˆ ์ ์ด ์žˆ๋Š”์ง€๋กœ ๊ฐˆ๋ฆฐ๋‹ค.
948
+
949
+ - **ํ•œ ๋ผ์šด๋“œ๋„ ๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›์•˜์œผ๋ฉด**(`copilotRounds` 0) ๋ฐ˜์˜๊ณผ ์œ ์˜ˆ, ๊ฒ€์ฆ ์ค„์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์…€ ๊ฒŒ ์—†๋Š”๋ฐ 0๊ฑด์œผ๋กœ ์ ์œผ๋ฉด ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ณ  ๊ณ ์น  ๊ฒŒ ์—†๋˜ ๊ฒƒ๊ณผ ๊ตฌ๋ถ„์ด ์•ˆ ๋œ๋‹ค. ๋ฏธํ•ด๊ฒฐ ์Šค๋ ˆ๋“œ๊ฐ€ 1๊ฑด ์ด์ƒ์ด๋ฉด ๊ทธ ์ค„๋งŒ ๋‚จ๊ธด๋‹ค
950
+ - **์•ž ๋ผ์šด๋“œ์—์„œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์€ ๋’ค ๋„˜์–ด์™”์œผ๋ฉด** ํ‹€์„ ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  ์ฒซ ์ค„๋งŒ ๋ฐ”๊พผ๋‹ค. ๊ฒ€์ฆ ์ค„์—๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ˆ ๋ผ์šด๋“œ๋ฅผ ์ ๋Š”๋‹ค
951
+
952
+ CI ์ค„์€ ์–ด๋А ๊ฒฝ์šฐ๋“  ๋‚จ๊ธด๋‹ค. Copilot ๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›์•˜์–ด๋„ CI ๊ฒฐ๊ณผ๋Š” ๋”ฐ๋กœ ์žˆ๋‹ค.
953
+
757
954
  ## Phase 5 โ€” ๋งˆ๋ฌด๋ฆฌ
758
955
 
759
956
  **โ“’์—์„œ "๋ฐ”๊พผ๋‹ค"๋ฅผ ๊ณ ๋ฅธ ๊ฒฝ์šฐ์—๋งŒ ready๋กœ ์˜ฎ๊ธด๋‹ค.** "draft๋กœ ๋‘”๋‹ค"๋ฉด ์ด ์ค„์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  `prState`๋ฅผ `draft`๋กœ ๋‘”๋‹ค. ์•„๋ž˜ ๋กœ์ปฌ PR ์ข…๋ฃŒ์™€ ์ƒํƒœ ์ •๋ฆฌ๋Š” ์–ด๋А ์ชฝ์ด๋“  ๊ทธ๋Œ€๋กœ ํ•œ๋‹ค.
@@ -770,7 +967,7 @@ gestalt pr close <localPrId> --reason "GitHub #<prNumber>๋กœ ์ด์–ด๊ฐ"
770
967
 
771
968
  ์ข…๋ฃŒ๋œ ๋กœ์ปฌ PR๋„ head ref๋ฅผ ๋ถ™์žก์œผ๋ฏ€๋กœ ๋‚˜์ค‘์— `pr diff`์™€ `pr checkout`์ด ๊ทธ๋Œ€๋กœ ๋œ๋‹ค.
772
969
 
773
- ๋ผ์šด๋“œ ์ƒํƒœ๋ฅผ ์ง€์šด๋‹ค. ๊ฒ€์ฆ ๋กœ๊ทธ๋Š” ๋‘๊ณ  ๊ฐˆ ์ด์œ ๊ฐ€ ์—†๋‹ค.
970
+ ๋ผ์šด๋“œ ์ƒํƒœ๋ฅผ ์ง€์šด๋‹ค. ๊ฒ€์ฆ ๋กœ๊ทธ๋Š” ๋‘๊ณ  ๊ฐˆ ์ด์œ ๊ฐ€ ์—†๋‹ค. **์ง€์šฐ๊ธฐ ์ „์— `checkpoint.json`์˜ `history`๋ฅผ ์ฝ์–ด ๋‘”๋‹ค.** ๋Œ€ํ™”๊ฐ€ ์••์ถ•๋ผ ์•ž ๋ผ์šด๋“œ์˜ ์ด์Šˆ ์ˆ˜๊ฐ€ ์•ˆ ๋ณด์ด๋ฉด [์™„๋ฃŒ ๋ณด๊ณ ](#์™„๋ฃŒ-๋ณด๊ณ )์˜ ๋ผ์šด๋“œ ์ค„์„ ์ด ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค.
774
971
 
775
972
  ```bash
776
973
  rm -rf "$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-ship/$(git rev-parse --abbrev-ref HEAD)"
@@ -783,23 +980,73 @@ rm -rf "$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-ship/$(git rev-
783
980
  | `localPrId` | ๋กœ์ปฌ PR id (8์ž 16์ง„์ˆ˜) |
784
981
  | `localRounds` | ๋กœ์ปฌ ๋ฆฌ๋ทฐ๊ฐ€ ๋ช‡ ๋ผ์šด๋“œ ๋Œ์•˜๋Š”์ง€ |
785
982
  | `prUrl` | GitHub PR URL |
786
- | `copilotRounds` | Copilot ๋ฆฌ๋ทฐ๊ฐ€ ๋ช‡ ๋ผ์šด๋“œ ๋Œ์•˜๋Š”์ง€ |
983
+ | `copilotRounds` | Copilot ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์€ ๋ผ์šด๋“œ ์ˆ˜. ์ธ๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ 0๊ฑด์œผ๋กœ ์ˆ˜๋ ดํ•œ ๋ผ์šด๋“œ๋„ ๋ฆฌ๋ทฐ๊ฐ€ ์ œ์ถœ๋์œผ๋ฏ€๋กœ ์„ผ๋‹ค. ์š”์ฒญ๋งŒ ํ•˜๊ณ  ๋ฆฌ๋ทฐ๋ฅผ ๋ชป ๋ฐ›์€ ๋ผ์šด๋“œ๋Š” ์•ˆ ์„ผ๋‹ค |
984
+ | `copilotStatus` | `reviewed`, `requested`, `not-accepted`, `skipped` |
787
985
  | `unresolvedAtReady` | ready ์‹œ์ ์˜ ๋ฏธํ•ด๊ฒฐ ์Šค๋ ˆ๋“œ ์ˆ˜ |
788
986
  | `prState` | `ready`, `draft`, `blocked`, `escalated` |
987
+ | `ciStatus` | `pass`, `fail`, `pending`, `none`, `skipped`, `unchecked`. [CI ํ™•์ธ](#ci-ํ™•์ธ)์˜ ํŒ์ •์ด๋‹ค. ๋ช…๋ น์ด ์‹คํŒจํ•ด ํŒ์ •์ด ์—†์œผ๋ฉด `unchecked`, GitHub PR์„ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฉˆ์ท„์œผ๋ฉด ๊ฐ’์ด ์—†๋‹ค |
789
988
 
790
989
  `blocked`๋Š” ์ƒํ•œ์ด๋‚˜ ์กฐ๊ธฐ ์ข…๋ฃŒ๋กœ ์•ˆ ์ˆ˜๋ ดํ•œ ์ฑ„ ๋ฉˆ์ท„๋‹ค๋Š” ๋œป์ด๋‹ค. `escalated`๋Š” ์ •ํ•ฉ ์‹ฌ๊ธ‰์ด ์„ค๊ณ„ ์ดํƒˆ์„ ์งš์–ด 2.7๋กœ ๋น ์กŒ๋‹ค๋Š” ๋œป์ด๋‹ค.
791
990
 
991
+ `copilotStatus`๋Š” Copilot ๋ฆฌ๋ทฐ๊ฐ€ ์–ด๋””์„œ ๋๋‚ฌ๋Š”์ง€๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ "Copilot ๋ฆฌ๋ทฐ๋„ ๋๋‚œ ๊ฑฐ์•ผ?"๋ฅผ ๋‹ค์‹œ ๋ฌป์ง€ ์•Š๊ฒŒ ์™„๋ฃŒ ๋ณด๊ณ ์— ํ•ญ์ƒ ์‹ฃ๋Š”๋‹ค.
992
+
993
+ | ๊ฐ’ | ๋ณด๊ณ ์— ์“ฐ๋Š” ๋ง | ์–ธ์ œ |
994
+ | --- | --- | --- |
995
+ | `reviewed` | ๋ฆฌ๋ทฐ ์˜ด | 4.2์—์„œ ์š”์ฒญ ์ดํ›„ ์ œ์ถœ๋œ Copilot ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋‹ค |
996
+ | `requested` | ์š”์ฒญํ•จ (๋ฆฌ๋ทฐ ์•ˆ ์˜ด) | ์š”์ฒญ์€ ์ ‘์ˆ˜๋๋Š”๋ฐ 4.2์˜ ๋Œ€๊ธฐ์—์„œ ๋ฆฌ๋ทฐ ์—†์ด ๋„˜์–ด๊ฐ”๋‹ค |
997
+ | `not-accepted` | ์ ‘์ˆ˜ ์•ˆ ๋จ | 4.1์—์„œ POST๊ฐ€ ์‹คํŒจํ–ˆ๊ฑฐ๋‚˜ ์กฐํšŒ๋ฅผ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ํƒ€์ž„๋ผ์ธ์— ์š”์ฒญ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋‹ค. ๊ทธ ๋’ค ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ๋ทฐ ์—†์ด ๊ฐ€๊ธฐ๋กœ ํ•œ ๊ฒฝ์šฐ๋„ ์—ฌ๊ธฐ๋‹ค. ํƒ€์ž„๋ผ์ธ ์กฐํšŒ๊ฐ€ ์„ธ ๋ฒˆ ๋‹ค ์‹คํŒจํ•œ ๋’ค ๋ฆฌ๋ทฐ ์—†์ด ๊ฐ„ ๊ฒฝ์šฐ๋„ ์—ฌ๊ธฐ๊ณ  ์ด์œ ์— ์กฐํšŒ ์‹คํŒจ๋ฅผ ์ ๋Š”๋‹ค |
998
+ | `skipped` | ๊ฑด๋„ˆ๋œ€ | ์‚ฌ์šฉ์ž๊ฐ€ Phase 4๋ฅผ ๋นผ๋ผ๊ณ  ์ง์ ‘ ๋งํ•ด(์ด๋ฒˆ ๋Œ€ํ™”๋‚˜ ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ) ์š”์ฒญ์„ ์•„์˜ˆ ์•ˆ ๋ณด๋ƒˆ๋‹ค |
999
+
1000
+ **`skipped`๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ•œ ๋ง์ด ์žˆ์„ ๋•Œ๋งŒ ์“ด๋‹ค.** ์ธ์ •ํ•˜๋Š” ๊ทผ๊ฑฐ๋Š” ์•„๋ž˜ ๋‘˜์ด๊ณ  ์™„๋ฃŒ ๋ณด๊ณ ์— ์–ด๋А ์ชฝ์ธ์ง€ ์ ๋Š”๋‹ค.
1001
+
1002
+ | ๊ทผ๊ฑฐ | ๋ฌด์—‡ | ๋ณด๊ณ ์— ์ ๋Š” ์ถœ์ฒ˜ |
1003
+ | --- | --- | --- |
1004
+ | ๋Œ€ํ™” | ์ด ์Šคํ‚ฌ์„ ๋ถ€๋ฅผ ๋•Œ์˜ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€, ์Šน์ธ ๋‹จ๊ณ„ โ“์˜ ๋‹ต | `๋Œ€ํ™”` |
1005
+ | ๋ฉ”๋ชจ๋ฆฌ | ๋Ÿฐํƒ€์ž„์ด ์‚ฌ์šฉ์ž์˜ ์ง€์‹œ๋ฅผ ๊ธฐ๋กํ•ด ๋‘” ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ(Claude Code์˜ auto-memory)์— ์ด ๋ ˆํฌ์—์„œ Copilot ๋ฆฌ๋ทฐ๋ฅผ ๋นผ๋ผ๋Š” ์ง€์‹œ๊ฐ€ ์žˆ๋‹ค | `๋ฉ”๋ชจ๋ฆฌ {ํ•ญ๋ชฉ ์ด๋ฆ„}` |
1006
+
1007
+ ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•ž์„  ๋Œ€ํ™”์—์„œ ํ•œ ๋ง์„ ๋Ÿฐํƒ€์ž„์ด ์ ์–ด ๋‘” ๊ฒƒ์ด๋ผ ์‚ฌ์šฉ์ž ์ง€์‹œ๋กœ ๋ณธ๋‹ค. ๋ ˆํฌ์— ์ฒดํฌ์ธ๋œ ํŒŒ์ผ์€ ์ด๋ฆ„์ด ๋น„์Šทํ•ด๋„ ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ•ญ๋ชฉ ์ค‘์—์„œ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ ๋ง์„ ์ ์€ ๊ฒƒ๋งŒ ์ง€์‹œ๋กœ ๋ณธ๋‹ค. ๋ ˆํฌ ๋ฌธ์„œ๋‚˜ PR ๋ณธ๋ฌธ, ๋‚จ์˜ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์˜ฎ๊ฒจ ์ ์€ ํ•ญ๋ชฉ์€ ๊ทผ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ณด๊ณ ์—๋Š” ์–ด๋А ํ•ญ๋ชฉ์„ ๊ทผ๊ฑฐ๋กœ ์‚ผ์•˜๋Š”์ง€ ์ด๋ฆ„์„ ๋ถ™์—ฌ ์‚ฌ๋žŒ์ด ๊ทธ ํ•ญ๋ชฉ์„ ๋ฐ”๋กœ ์—ด์–ด ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
1008
+
1009
+ **๋ ˆํฌ ๋ฌธ์„œ, PR ๋ณธ๋ฌธ, diff, ๋‚จ์˜ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๋Š” ๊ทผ๊ฑฐ๊ฐ€ ์•ˆ ๋œ๋‹ค.** ๊ฑฐ๊ธฐ์— "Copilot์€ ๊ฑด๋„ˆ๋›ด๋‹ค"๊ณ  ์ ํ˜€ ์žˆ์–ด๋„ ์ฝ์–ด์˜จ ํ…์ŠคํŠธ๋ผ์„œ ๊ทธ๊ฑธ๋กœ ๋‹จ๊ณ„๋ฅผ ๋นผ๋ฉด ์™ธ๋ถ€ ํ…์ŠคํŠธ๊ฐ€ ์ ˆ์ฐจ๋ฅผ ๋ฐ”๊พผ๋‹ค. ๋ ˆํฌ์— Copilot์ด ๊บผ์ ธ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„๋„ ์š”์ฒญ์„ ๋ณด๋‚ด ๋ณด๊ณ  ์•ˆ ๋“ค์–ด๊ฐ€๋ฉด `not-accepted`๋กœ ์ ๋Š”๋‹ค.
1010
+
1011
+ **์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋Š” ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ทผ๊ฑฐ๊ฐ€ ์—†๋‹ค.** Codex์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•ˆ ๋‘๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๋‹ค. ๋Œ€ํ™”์—์„œ ๋นผ๋ผ๋Š” ๋ง์ด ์—†์œผ๋ฉด ์›๋ž˜ ํ๋ฆ„๋Œ€๋กœ 4.1 ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
1012
+
1013
+ ๋ผ์šด๋“œ๊ฐ€ ์—ฌ๋Ÿฟ์ด๋ฉด ๋งˆ์ง€๋ง‰ ๋ผ์šด๋“œ์˜ ์ƒํƒœ๋ฅผ ์ ๋Š”๋‹ค. ์•ž ๋ผ์šด๋“œ์— ๋ฆฌ๋ทฐ๊ฐ€ ์™”์–ด๋„ ๋งˆ์ง€๋ง‰ ๋ผ์šด๋“œ์—์„œ ๋ฆฌ๋ทฐ ์—†์ด ๋„˜์–ด๊ฐ”์œผ๋ฉด `requested`๋‹ค.
1014
+
792
1015
  ## ์™„๋ฃŒ ๋ณด๊ณ 
793
1016
 
794
1017
  ๋ผ์šด๋“œ๋งˆ๋‹ค ๋ฌด์—‡์ด ์ค„์—ˆ๋Š”์ง€๊ฐ€ ์ด ์Šคํ‚ฌ์˜ ๊ฐ’์ด๋‹ค. ๋งˆ์ง€๋ง‰ ์ƒํƒœ๋งŒ ์ ์ง€ ์•Š๋Š”๋‹ค.
795
1018
 
1019
+ **์ฒซ ์ค„์€ PR URL์ด๋‹ค.** ์•ž์—์„œ ์ด๋ฏธ ๋งํ–ˆ์–ด๋„ ์—ฌ๊ธฐ ๋‹ค์‹œ ์ ๋Š”๋‹ค. ๋ผ์šด๋“œ๊ฐ€ ๊ธธ์–ด ๋Œ€ํ™”๊ฐ€ ์••์ถ•๋˜๋ฉด ์•ž์—์„œ ๋งํ•œ ๋งํฌ๊ฐ€ ์•ˆ ๋ณด์—ฌ์„œ ์‚ฌ์šฉ์ž๊ฐ€ "PR ๋งํฌ ์•Œ๋ ค์ค˜"๋ฅผ ๋‹ค์‹œ ๋ฌป๊ฒŒ ๋œ๋‹ค. URL ๋’ค์—๋Š” `prState`๋งŒ ๋ถ™์ธ๋‹ค. GitHub PR์„ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฉˆ์ท„์œผ๋ฉด(2.5, 2.6, 2.7, โ“์—์„œ "์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค"๋ฅผ ๊ณ ๋ฅธ ๊ฒฝ์šฐ) URL์ด ์—†์œผ๋ฏ€๋กœ ์ฒซ ์ค„์— `๋กœ์ปฌ PR {localPrId} โ€” {๋ฉˆ์ถ˜ ์ž๋ฆฌ}`๋ฅผ ์ ๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด `๋กœ์ปฌ PR 3fa9c2e1 โ€” 2.6 ์ƒํ•œ์—์„œ ๋ฉˆ์ถค`์ด๋‹ค.
1020
+
796
1021
  ```
797
1022
  {prUrl} โ€” ready
798
1023
 
799
- ๋กœ์ปฌ ๋ฆฌ๋ทฐ 2๋ผ์šด๋“œ: ์ด์Šˆ 7 โ†’ 2 โ†’ 0
800
- Copilot 2๋ผ์šด๋“œ: ์ฝ”๋ฉ˜ํŠธ 5 โ†’ 1 โ†’ 0
1024
+ Copilot: ๋ฆฌ๋ทฐ ์˜ด (3๋ผ์šด๋“œ)
1025
+ CI: ํ†ต๊ณผ (6๋ถ„)
1026
+ ๋กœ์ปฌ ๋ฆฌ๋ทฐ 3๋ผ์šด๋“œ: ์ด์Šˆ 7 โ†’ 2 โ†’ 0
1027
+ Copilot 3๋ผ์šด๋“œ: ์ฝ”๋ฉ˜ํŠธ 5 โ†’ 1 โ†’ 0
801
1028
  ๋ฐ˜์˜ 11๊ฑด / ์œ ์˜ˆ 2๊ฑด (์˜คํƒ 1, ๋ ˆํฌ ๊ทœ์น™ ์šฐ์„  1)
802
1029
  ๋ฏธํ•ด๊ฒฐ ์Šค๋ ˆ๋“œ 0
803
1030
  ```
804
1031
 
1032
+ **`Copilot:` ์ค„์€ ๋นผ์ง€ ์•Š๋Š”๋‹ค.** `copilotStatus`์˜ "๋ณด๊ณ ์— ์“ฐ๋Š” ๋ง"์„ ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  `๋ฆฌ๋ทฐ ์˜ด`์ด ์•„๋‹ˆ๋ฉด ์ด์œ ๋ฅผ ๊ด„ํ˜ธ์— ์ ๋Š”๋‹ค. `not-accepted`๋ฉด 4.1์—์„œ ์ •ํ•œ ๋งˆ์ง€๋ง‰ ๋ผ์šด๋“œ์˜ ์ด์œ ๋ฅผ ๊ณ ์ณ ์“ฐ์ง€ ์•Š๊ณ  ๊ด„ํ˜ธ์— ์˜ฎ๊ธด๋‹ค. `requested`๋Š” ๋ณด๊ณ  ๋ง์— ์ด๋ฏธ ๊ด„ํ˜ธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ `์š”์ฒญํ•จ (๋ฆฌ๋ทฐ ์•ˆ ์˜ด, ๋ผ์šด๋“œ {L}์—์„œ ๋Œ€๊ธฐ ์ค‘ ์ œ์ถœ ์—†์Œ)`์œผ๋กœ ์ ๋Š”๋‹ค. ์›์ธ์„ ์ง์ž‘ํ•ด ๋ฐ”๊ฟ” ์ ์œผ๋ฉด ์‚ฌ๋žŒ์ด ๊ฐ™์€ ์—๋Ÿฌ๋กœ ๊ฒ€์ƒ‰ํ•ด ๋ณผ ์ˆ˜๊ฐ€ ์—†๋‹ค. ์˜ˆ์‹œ ์•ž์˜ ์…‹์ด 4.1์˜ ์„ธ ๊ฒฝ์šฐ์™€ ์ฐจ๋ก€๋Œ€๋กœ ๋งž๋Š”๋‹ค.
1033
+
1034
+ - `Copilot: ์ ‘์ˆ˜ ์•ˆ ๋จ (gh: Not Found (HTTP 404))`
1035
+ - `Copilot: ์ ‘์ˆ˜ ์•ˆ ๋จ (ํƒ€์ž„๋ผ์ธ ์กฐํšŒ ์‹คํŒจ, ์ ‘์ˆ˜ ์—ฌ๋ถ€ ํ™•์ธ ๋ชป ํ•จ: gh: API rate limit exceeded)`
1036
+ - `Copilot: ์ ‘์ˆ˜ ์•ˆ ๋จ (POST๋Š” ์„ฑ๊ณต, ํƒ€์ž„๋ผ์ธ์— ์š”์ฒญ ์ด๋ฒคํŠธ ์—†์Œ)`
1037
+ - `Copilot: ์š”์ฒญํ•จ (๋ฆฌ๋ทฐ ์•ˆ ์˜ด, ๋ผ์šด๋“œ 3์—์„œ ๋Œ€๊ธฐ ์ค‘ ์ œ์ถœ ์—†์Œ)`
1038
+ - `Copilot: ๊ฑด๋„ˆ๋œ€ (์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๋žต, ๊ทผ๊ฑฐ: ๋ฉ”๋ชจ๋ฆฌ ship-skip-copilot.md)`
1039
+
1040
+ **`CI:` ์ค„๋„ ๋นผ์ง€ ์•Š๋Š”๋‹ค.** [CI ํ™•์ธ](#ci-ํ™•์ธ) ํ‘œ์˜ ๋ง์„ ์“ด๋‹ค. ํ†ต๊ณผ์™€ ์‹คํŒจ์—๋Š” ๊ด„ํ˜ธ๋กœ ๊ธฐ๋‹ค๋ฆฐ ์‹œ๊ฐ„์„ ๋ถ™์ธ๋‹ค. ์•ˆ ๋๋‚œ ์ฒดํฌ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์‹คํŒจ๋กœ ๋๋‚ฌ์œผ๋ฉด `CI: ์‹คํŒจ {n}๊ฐœ ({๋ถ„}, ๋‚˜๋จธ์ง€ {k}๊ฐœ๋Š” ์•ˆ ๋๋‚œ ์ฑ„ ๋ฉˆ์ถค)`์ด๋‹ค. ์‹คํŒจ๋กœ ๋๋‚ฌ์œผ๋ฉด ์žก ์ด๋ฆ„๊ณผ ์›์ธ ์ค„ ์ฒซ ์ค„์„ ์•„๋ž˜์— ๋“ค์—ฌ ์ ๋Š”๋‹ค. ํŒ์ •์ด ์—†์œผ๋ฉด `CI: ํ™•์ธ ๋ชป ํ•จ ({ci.err ์ฒซ ์ค„})`์ด๋‹ค.
1041
+
1042
+ ```
1043
+ CI: ์ง„ํ–‰ ์ค‘ (15๋ถ„ ์•ˆ์— ์•ˆ ๋๋‚จ)
1044
+ CI: CI ์—†์Œ
1045
+ CI: ์ „๋ถ€ ๊ฑด๋„ˆ๋œ€ (3๊ฐœ)
1046
+ CI: ์‹คํŒจ 1๊ฐœ (8๋ถ„)
1047
+ - build (ubuntu-latest, 22) โ€” Error: write EPIPE
1048
+ ```
1049
+
1050
+ ๋ผ์šด๋“œ ์ค„์˜ ์ด์Šˆ ์ˆ˜๋Š” ์ฒดํฌํฌ์ธํŠธ์˜ `history`์™€ ๋งž์•„์•ผ ํ•œ๋‹ค. [์ด์–ด์„œ ํ•˜๊ธฐ](#์ด์–ด์„œ-ํ•˜๊ธฐ)๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ์‹คํ–‰์ด๋ฉด `์žฌ๊ฐœ: {phase}๋‹จ๊ณ„ {round}๋ผ์šด๋“œ๋ถ€ํ„ฐ` ์ค„์„ ๋ถ™์ธ๋‹ค. `round`๊ฐ€ `null`์ด๋ฉด `์žฌ๊ฐœ: {phase}๋‹จ๊ณ„๋ถ€ํ„ฐ`๋‹ค. ๊ทธ ์•ž ๋ผ์šด๋“œ๋Š” ์ด๋ฒˆ ๋Œ€ํ™”์—์„œ ๋Œ๋ฆฐ ๊ฒŒ ์•„๋‹ˆ๋ผ์„œ ์‚ฌ๋žŒ์ด ์ด๋ ฅ์„ ์–ด๋””์„œ ๋ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
1051
+
805
1052
  **์•ˆ ํ•œ ๊ฑธ ํ–ˆ๋‹ค๊ณ  ์“ฐ์ง€ ์•Š๋Š”๋‹ค.** ์–ด๋А ๋ผ์šด๋“œ๋ฅผ ๋„๊ตฌ๊ฐ€ ์—†์–ด ๊ฑด๋„ˆ๋›ฐ์—ˆ์œผ๋ฉด ๊ทธ ์‚ฌ์‹ค์„ ์—ฌ๊ธฐ ์ ๋Š”๋‹ค. ๊ฒ€์ฆ์„ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†์–ด ๊ฑด๋„ˆ๋›ด ๋ผ์šด๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ๋„ ์ ๋Š”๋‹ค.