okstra 0.102.2 โ†’ 0.102.3

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 (161) hide show
  1. package/README.kr.md +5 -5
  2. package/README.md +5 -5
  3. package/docs/kr/architecture/storage-model.md +1 -1
  4. package/docs/kr/architecture.md +7 -11
  5. package/docs/kr/cli.md +4 -4
  6. package/docs/kr/container.md +1 -1
  7. package/docs/kr/performance-improvement-plan-v2.md +2 -2
  8. package/docs/project-structure-overview.md +2 -2
  9. package/package.json +7 -2
  10. package/runtime/BUILD.json +2 -2
  11. package/runtime/bin/okstra-antigravity-exec.sh +1 -2
  12. package/runtime/bin/okstra-codex-exec.sh +1 -2
  13. package/runtime/bin/okstra-render-final-report.py +2 -9
  14. package/runtime/bin/okstra-spawn-followups.py +4 -6
  15. package/runtime/bin/okstra-trace-cleanup.sh +24 -4
  16. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  17. package/runtime/prompts/lead/report-writer.md +1 -1
  18. package/runtime/prompts/profiles/_common-contract.md +9 -11
  19. package/runtime/python/okstra_ctl/codex_dispatch.py +4 -12
  20. package/runtime/python/okstra_ctl/consumers.py +35 -0
  21. package/runtime/python/okstra_ctl/container.py +4 -6
  22. package/runtime/python/okstra_ctl/dispatch_core.py +4 -12
  23. package/runtime/python/okstra_ctl/final_report_paths.py +24 -0
  24. package/runtime/python/okstra_ctl/handoff.py +2 -1
  25. package/runtime/python/okstra_ctl/implementation_stage.py +7 -11
  26. package/runtime/python/okstra_ctl/report_view_artifacts.py +14 -0
  27. package/runtime/python/okstra_ctl/report_views.py +7 -4
  28. package/runtime/python/okstra_ctl/run.py +3 -10
  29. package/runtime/python/okstra_ctl/stage_targets.py +18 -0
  30. package/runtime/python/okstra_ctl/wizard.py +24 -25
  31. package/runtime/python/okstra_ctl/wizard_stage_intent.py +54 -0
  32. package/runtime/python/okstra_token_usage/report.py +2 -5
  33. package/runtime/validators/validate-report-views.py +2 -1
  34. package/runtime/validators/validate-run.py +1 -11
  35. package/src/commands/lifecycle/install.mjs +5 -5
  36. package/src/commands/lifecycle/uninstall.mjs +4 -4
  37. package/docs/superpowers/plans/2026-05-12-ticket-id-in-reports.md +0 -638
  38. package/docs/superpowers/plans/2026-05-14-convergence-queue-pruning.md +0 -1568
  39. package/docs/superpowers/plans/2026-05-17-dual-format-final-report.md +0 -167
  40. package/docs/superpowers/plans/2026-05-20-final-report-language.md +0 -1501
  41. package/docs/superpowers/plans/2026-05-20-implementation-planning-multi-stage.md +0 -1267
  42. package/docs/superpowers/plans/2026-05-20-okstra-run-prompt-sot-b1.md +0 -1007
  43. package/docs/superpowers/plans/2026-05-20-wizard-messages-json-sot.md +0 -720
  44. package/docs/superpowers/plans/2026-05-20-wizard-prompt-json-sot-a1.md +0 -681
  45. package/docs/superpowers/plans/2026-05-21-improvement-discovery-task-type.md +0 -1691
  46. package/docs/superpowers/plans/2026-05-24-implementation-lead-context-slimming.md +0 -1700
  47. package/docs/superpowers/plans/2026-05-25-okstra-project-root-rename.md +0 -158
  48. package/docs/superpowers/plans/2026-05-26-wizard-3-option-picker.md +0 -860
  49. package/docs/superpowers/plans/2026-06-02-final-verification-protocol-hardening.md +0 -326
  50. package/docs/superpowers/plans/2026-06-02-okstra-run-branch-confirm-step.md +0 -337
  51. package/docs/superpowers/plans/2026-06-02-okstra-run-phase-pane-cleanup.md +0 -410
  52. package/docs/superpowers/plans/2026-06-02-requirements-discovery-fanout.md +0 -728
  53. package/docs/superpowers/plans/2026-06-04-adversarial-implementation-planning.md +0 -294
  54. package/docs/superpowers/plans/2026-06-04-adversarial-verification.md +0 -570
  55. package/docs/superpowers/plans/2026-06-04-coverage-critic.md +0 -516
  56. package/docs/superpowers/plans/2026-06-04-stage-cohesion-planner.md +0 -351
  57. package/docs/superpowers/plans/2026-06-04-stage-run-batching.md +0 -457
  58. package/docs/superpowers/plans/2026-06-05-acceptance-critic.md +0 -251
  59. package/docs/superpowers/plans/2026-06-05-compact-markdown-report-tables.md +0 -323
  60. package/docs/superpowers/plans/2026-06-05-wizard-batch-prompts.md +0 -559
  61. package/docs/superpowers/plans/2026-06-06-final-verification-whole-task-gate.md +0 -993
  62. package/docs/superpowers/plans/2026-06-06-stage-parallel-and-pending-fixes.md +0 -93
  63. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p1.md +0 -447
  64. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p2.md +0 -289
  65. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p3.md +0 -774
  66. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p4.md +0 -303
  67. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p5-multidep-base.md +0 -387
  68. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase2.md +0 -275
  69. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase3.md +0 -282
  70. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4a.md +0 -147
  71. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4b.md +0 -262
  72. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4c.md +0 -184
  73. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4d.md +0 -88
  74. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4e.md +0 -250
  75. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa.md +0 -409
  76. package/docs/superpowers/plans/2026-06-09-implementation-run-artifact-stage-isolation.md +0 -320
  77. package/docs/superpowers/plans/2026-06-10-concurrent-run-team-guard.md +0 -456
  78. package/docs/superpowers/plans/2026-06-10-git-reconcile-stale-sha-recovery.md +0 -1408
  79. package/docs/superpowers/plans/2026-06-10-lead-worker-completion-polling-PROBE.md +0 -42
  80. package/docs/superpowers/plans/2026-06-10-lead-worker-completion-polling.md +0 -337
  81. package/docs/superpowers/plans/2026-06-10-p6-token-usage-incremental.md +0 -1029
  82. package/docs/superpowers/plans/2026-06-10-stage-group-handoff.md +0 -1572
  83. package/docs/superpowers/plans/2026-06-11-fix-cycle.md +0 -1290
  84. package/docs/superpowers/plans/2026-06-11-wizard-whole-task-final-verification.md +0 -526
  85. package/docs/superpowers/plans/2026-06-12-html-plan-approval.md +0 -1000
  86. package/docs/superpowers/plans/2026-06-13-repo-risk-hardening.md +0 -493
  87. package/docs/superpowers/plans/2026-06-14-host-runtime-auto-execution.md +0 -1775
  88. package/docs/superpowers/plans/2026-06-15-coding-preflight-pack-dispatch-path.md +0 -504
  89. package/docs/superpowers/plans/2026-06-15-internal-skill-migration-final-fixups.md +0 -342
  90. package/docs/superpowers/plans/2026-06-15-internal-skill-migration-fixups.md +0 -258
  91. package/docs/superpowers/plans/2026-06-15-internal-skill-migration-remaining-fixups.md +0 -387
  92. package/docs/superpowers/plans/2026-06-15-internal-skill-resource-migration.md +0 -749
  93. package/docs/superpowers/plans/2026-06-15-worker-prompt-anchor-final-fixups.md +0 -828
  94. package/docs/superpowers/plans/2026-06-15-worker-prompt-header-error-contract.md +0 -490
  95. package/docs/superpowers/plans/2026-06-17-okstra-error-report.md +0 -724
  96. package/docs/superpowers/plans/2026-06-18-subagent-pane-reclaim.md +0 -483
  97. package/docs/superpowers/plans/2026-06-19-agent-operating-standard.md +0 -476
  98. package/docs/superpowers/plans/2026-06-19-okstra-inspect-recap-facet.md +0 -647
  99. package/docs/superpowers/plans/2026-06-20-error-feedback-loop.md +0 -1019
  100. package/docs/superpowers/plans/2026-06-20-run-index-row-normalization.md +0 -583
  101. package/docs/superpowers/plans/2026-06-20-stage-auto-integrate-teardown.md +0 -819
  102. package/docs/superpowers/plans/2026-06-21-okstra-container-local-user-test.md +0 -714
  103. package/docs/superpowers/plans/2026-06-21-release-handoff-local-checkout.md +0 -348
  104. package/docs/superpowers/plans/2026-06-23-implementation-stage-multiselect-chain.md +0 -630
  105. package/docs/superpowers/plans/2026-06-23-implementation-step-commit-granularity.md +0 -274
  106. package/docs/superpowers/plans/2026-06-23-phase-batch-cleanup-enforcement.md +0 -409
  107. package/docs/superpowers/plans/2026-06-24-cross-project-precondition.md +0 -542
  108. package/docs/superpowers/plans/2026-06-24-decision-drafts-render-gap.md +0 -568
  109. package/docs/superpowers/plans/2026-06-24-manual-user-test-section.md +0 -203
  110. package/docs/superpowers/plans/2026-06-24-okstra-container-build-rename.md +0 -525
  111. package/docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md +0 -131
  112. package/docs/superpowers/specs/2026-05-15-implementation-plan-verification-design.md +0 -254
  113. package/docs/superpowers/specs/2026-05-20-final-report-language-design.md +0 -383
  114. package/docs/superpowers/specs/2026-05-20-implementation-planning-multi-stage-design.md +0 -322
  115. package/docs/superpowers/specs/2026-05-20-okstra-run-prompt-sot-design.md +0 -299
  116. package/docs/superpowers/specs/2026-05-21-improvement-discovery-task-type-design.md +0 -335
  117. package/docs/superpowers/specs/2026-06-02-okstra-run-branch-confirm-step-design.md +0 -113
  118. package/docs/superpowers/specs/2026-06-02-okstra-run-phase-pane-cleanup-design.md +0 -173
  119. package/docs/superpowers/specs/2026-06-02-requirements-discovery-fanout-design.md +0 -154
  120. package/docs/superpowers/specs/2026-06-04-adversarial-implementation-planning-design.md +0 -90
  121. package/docs/superpowers/specs/2026-06-04-adversarial-verification-design.md +0 -176
  122. package/docs/superpowers/specs/2026-06-04-coverage-critic-design.md +0 -99
  123. package/docs/superpowers/specs/2026-06-04-stage-splitting-cost-aware-design.md +0 -98
  124. package/docs/superpowers/specs/2026-06-05-acceptance-critic-design.md +0 -90
  125. package/docs/superpowers/specs/2026-06-05-compact-markdown-report-tables-design.md +0 -87
  126. package/docs/superpowers/specs/2026-06-05-wizard-batch-prompts-design.md +0 -121
  127. package/docs/superpowers/specs/2026-06-06-final-verification-whole-task-gate-design.md +0 -126
  128. package/docs/superpowers/specs/2026-06-06-stage-worktree-isolation-design.md +0 -180
  129. package/docs/superpowers/specs/2026-06-06-vertical-slice-tdd-planning-design.md +0 -179
  130. package/docs/superpowers/specs/2026-06-07-stage-conformance-qa-design.md +0 -169
  131. package/docs/superpowers/specs/2026-06-09-executor-model-custom-id-cascade-design.md +0 -66
  132. package/docs/superpowers/specs/2026-06-09-implementation-run-artifact-stage-isolation-design.md +0 -87
  133. package/docs/superpowers/specs/2026-06-10-blocking-contract-posthoc-conformance-design.md +0 -168
  134. package/docs/superpowers/specs/2026-06-10-concurrent-run-team-guard-design.md +0 -107
  135. package/docs/superpowers/specs/2026-06-10-git-reconcile-stale-sha-recovery-design.md +0 -105
  136. package/docs/superpowers/specs/2026-06-10-lead-worker-completion-polling-design.md +0 -113
  137. package/docs/superpowers/specs/2026-06-10-stage-group-handoff-design.md +0 -156
  138. package/docs/superpowers/specs/2026-06-11-brief-entry-only-handoff-stage-entry-design.md +0 -158
  139. package/docs/superpowers/specs/2026-06-11-fix-cycle-design.md +0 -94
  140. package/docs/superpowers/specs/2026-06-11-wizard-whole-task-final-verification-design.md +0 -89
  141. package/docs/superpowers/specs/2026-06-12-codex-lead-adapter-design.md +0 -358
  142. package/docs/superpowers/specs/2026-06-12-html-plan-approval-design.md +0 -85
  143. package/docs/superpowers/specs/2026-06-12-stage-discipline-rule-design.md +0 -108
  144. package/docs/superpowers/specs/2026-06-13-forbidden-actions-ssot-design.md +0 -134
  145. package/docs/superpowers/specs/2026-06-13-neutral-tmux-lead-adapter-design.md +0 -284
  146. package/docs/superpowers/specs/2026-06-14-host-runtime-auto-execution-design.md +0 -404
  147. package/docs/superpowers/specs/2026-06-17-okstra-error-report-design.md +0 -123
  148. package/docs/superpowers/specs/2026-06-18-subagent-pane-reclaim-design.md +0 -150
  149. package/docs/superpowers/specs/2026-06-19-agent-operating-standard-design.md +0 -120
  150. package/docs/superpowers/specs/2026-06-19-okstra-inspect-recap-facet-design.md +0 -96
  151. package/docs/superpowers/specs/2026-06-20-error-feedback-loop-design.md +0 -171
  152. package/docs/superpowers/specs/2026-06-20-run-index-row-normalization-design.md +0 -112
  153. package/docs/superpowers/specs/2026-06-20-stage-auto-integrate-teardown-design.md +0 -145
  154. package/docs/superpowers/specs/2026-06-21-okstra-container-local-user-test-design.md +0 -125
  155. package/docs/superpowers/specs/2026-06-21-release-handoff-local-checkout-design.md +0 -113
  156. package/docs/superpowers/specs/2026-06-23-implementation-stage-multiselect-chain-design.md +0 -138
  157. package/docs/superpowers/specs/2026-06-23-implementation-step-commit-granularity-design.md +0 -120
  158. package/docs/superpowers/specs/2026-06-24-cross-project-precondition-design.md +0 -129
  159. package/docs/superpowers/specs/2026-06-24-decision-drafts-render-gap-design.md +0 -185
  160. package/docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md +0 -121
  161. package/docs/superpowers/specs/2026-06-24-okstra-container-build-rename-design.md +0 -110
@@ -1,156 +0,0 @@
1
- # release-handoff stage-group ๋ชจ๋“œ โ€” ์„ค๊ณ„
2
-
3
- - ์ž‘์„ฑ์ผ: 2026-06-10
4
- - ์ƒํƒœ: ์„ค๊ณ„ ์Šน์ธ๋จ (์‚ฌ์šฉ์ž ์Šน์ธ 2026-06-10)
5
- - ์„ ํ–‰: [stage-worktree-isolation-design.md](2026-06-06-stage-worktree-isolation-design.md), [final-verification-whole-task-gate-design.md](2026-06-06-final-verification-whole-task-gate-design.md)
6
-
7
- ## 1. ๋ฐฐ๊ฒฝ / ๋ฌธ์ œ
8
-
9
- stage-worktree-isolation ๋ชจ๋ธ์—์„œ implementation ์€ **1 run = 1 stage** ์ด๊ณ  stage ๋งˆ๋‹ค ๊ฒฉ๋ฆฌ ๋ธŒ๋žœ์น˜(`<prefix>-<task-id>-s<N>`)๊ฐ€ ์ƒ๊ธด๋‹ค. ์ •์‹ release ๊ฒฝ๋กœ๋Š” "๋ชจ๋“  stage ๋ฅผ task-key ๋ธŒ๋žœ์น˜์— ์ˆ˜๋™ ๋จธ์ง€ โ†’ whole-task final-verification `accepted` โ†’ release-handoff ๋กœ task ๋‹น PR 1๊ฐœ" ๋‹ค ([final-verification.md:40](../../../prompts/profiles/final-verification.md:40)).
10
-
11
- ๋ฌธ์ œ: stage ๋‹จ์œ„๊ฐ€ ์ž‘์„ ๋•Œ task ์ „์ฒด๊ฐ€ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค PR ํ•˜๋‚˜๋กœ ๋‚ด๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ stage ํ•˜๋‚˜์งœ๋ฆฌ PR ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚ด๋Š” ๊ฒƒ ๋‘˜ ๋‹ค ๋น„ํšจ์œจ์ด๋‹ค. ์‚ฌ์šฉ์ž๋Š” **ํ•œ task ์•ˆ์—์„œ stage ์ผ๋ถ€๋ฅผ ๊ณจ๋ผ ๋ฌถ์–ด ํ•˜๋‚˜์˜ PR** ๋กœ ๋‚ด๊ณ  ์‹ถ๋‹ค (์˜ˆ: stage 2+3 โ†’ PR 1, stage 4+5 โ†’ PR 2).
12
-
13
- ํ˜„์žฌ ๊ณ„์•ฝ์ด ์ด๋ฅผ ๋ง‰๋Š” ์ง€์  ์„ธ ๊ณณ:
14
-
15
- 1. release-handoff ์ง„์ž… ๊ฒŒ์ดํŠธ๊ฐ€ whole-task `accepted` ๋ณด๊ณ ์„œ 1๊ฐœ๋ฅผ ์š”๊ตฌ ([release-handoff.md:14](../../../prompts/profiles/release-handoff.md:14)).
16
- 2. ๋‹จ๋…-stage ๊ฒ€์ฆ์€ release-handoff ๋ผ์šฐํŒ… ๊ธˆ์ง€ ([final-verification.md:29](../../../prompts/profiles/final-verification.md:29), [final-verification.md:40](../../../prompts/profiles/final-verification.md:40)).
17
- 3. release-handoff ๋Š” ์ปค๋ฐ‹ ์ƒ์„ฑ ๊ธˆ์ง€ ([release-handoff.md:57](../../../prompts/profiles/release-handoff.md:57)) + "okstra ์ž๋™ ๋จธ์ง€ ์—†์Œ" ๋น„๋ชฉํ‘œ ([stage-worktree-isolation-design.md:7](2026-06-06-stage-worktree-isolation-design.md)) โ€” ๋…๋ฆฝ stage ๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์— ์žˆ์–ด ๋ฌถ์Œ PR ์˜ head ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค ์ฃผ์ฒด๊ฐ€ ์—†๋‹ค.
18
-
19
- ## 2. ๊ฒฐ์ • ์š”์•ฝ (๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ Q&A)
20
-
21
- | ๊ฒฐ์ •์  | ์„ ํƒ |
22
- |---|---|
23
- | ๋ฌถ์Œ ๋‹จ์œ„ | ํ•œ task ์•ˆ์˜ **stage ์ผ๋ถ€ ๊ทธ๋ฃน** โ†’ PR 1๊ฐœ |
24
- | ๊ทธ๋ฃน ๊ฒฐ์ • ์‹œ์  | **release-handoff ์‹คํ–‰ ์ค‘** ์‚ฌ์šฉ์ž๊ฐ€ PR ๊ฐ€๋Šฅ stage ๋ชฉ๋ก์—์„œ ์„ ํƒ |
25
- | ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜(๊ทธ๋ฃน ๋จธ์ง€) ์†Œ์œ  | **release-handoff** ๊ฐ€ ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ + stage ๋ธŒ๋žœ์น˜ merge |
26
- | ๊ฒ€์ฆ ๊ฒŒ์ดํŠธ | **stage ๋ณ„ ๋‹จ๋…-stage `accepted` ํ•ฉ์‚ฐ** โ€” ๊ทธ๋ฃน ๋‚ด ๋ชจ๋“  stage ๊ฐ€ ๊ฐ์ž accepted ๋ฉด ์ง„์ž… ํ—ˆ์šฉ. ๋จธ์ง€๋œ ์กฐํ•ฉ ์ž์ฒด๋Š” ๋ฏธ๊ฒ€์ฆ์ด๋ฉฐ ์ถฉ๋Œ ํ”„๋กœ๋ธŒ + PR CI ๊ฐ€ ๋ณด์™„ |
27
- | ์˜์กด ํํฌ ์œ„๋ฐ˜ ์‹œ | **์ฐจ๋‹จ + ์•ˆ๋‚ด** (์„ ํ–‰ ์ž๋™ ํฌํ•จ ์•„๋‹˜ โ€” ์กฐ์šฉํ•œ ๋ฒ”์œ„ ํ™•์žฅ ๋ฐฉ์ง€) |
28
-
29
- ## 3. ๋ชฉํ‘œ / ๋น„๋ชฉํ‘œ
30
-
31
- ๋ชฉํ‘œ:
32
- - release-handoff ์— **stage-group ๋ชจ๋“œ** ์ถ”๊ฐ€: done + ๋‹จ๋… ๊ฒ€์ฆ accepted + ๋ฏธ-PR stage ๋“ค์„ ๊ณจ๋ผ ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€ํ•˜๊ณ  PR 1๊ฐœ ์ƒ์„ฑ.
33
- - ์ž๊ฒฉ ํŒ์ •ยท์ˆ˜์ง‘ ๋จธ์ง€ยทPR ๊ธฐ๋ก์„ Python ํ—ฌํผ ํ•œ ๊ณณ์—์„œ **๊ฐ•์ œ** (์„ ์–ธ์ด ์•„๋‹ˆ๋ผ enforcement).
34
- - ๊ธฐ์กด whole-task ๊ฒฝ๋กœ๋Š” ๋ถˆ๋ณ€ โ€” stage-group ์€ ์ถ”๊ฐ€ ๋ชจ๋“œ๋‹ค.
35
-
36
- ๋น„๋ชฉํ‘œ:
37
- - ์—ฌ๋Ÿฌ task ๋ฅผ ํ•œ PR ๋กœ ๋ฌถ๊ธฐ (task-group ๋‹จ์œ„ PR).
38
- - ๊ทธ๋ฃน ์กฐํ•ฉ์— ๋Œ€ํ•œ ๋ณ„๋„ final-verification ๋ชจ๋“œ ์‹ ์„ค (๊ฒŒ์ดํŠธ๋Š” stage ๋ณ„ accepted ํ•ฉ์‚ฐ; ๋จธ์ง€ ํ›„ ์žฌ๊ฒ€์ฆ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋ฉด ๋‹จ๋…์œผ๋กœ ์ˆ˜ํ–‰).
39
- - PR ๋จธ์ง€ยท๋ฆด๋ฆฌ์Šค ๋ฐœํ–‰ (๊ธฐ์กด ๋น„๋ชฉํ‘œ ์œ ์ง€ โ€” [release-handoff.md:99](../../../prompts/profiles/release-handoff.md:99)).
40
- - implementation / planning ์˜ stage ๋ชจ๋ธยทworktree ๋ชจ๋ธ ๋ณ€๊ฒฝ.
41
-
42
- ## 4. ํ๋ฆ„
43
-
44
- ```
45
- stage 2 done โ”€โ”€ fv --stage 2 accepted โ”€โ”
46
- stage 3 done โ”€โ”€ fv --stage 3 accepted โ”€โ”ค
47
- โ–ผ
48
- release-handoff (stage-group ๋ชจ๋“œ)
49
- G1 PR base ์„ ํƒ (๊ธฐ์กด Q2 ์™€ ๋™์ผ โ€” ์˜์กด ํํฌ ํŒ์ •์— ํ•„์š”ํ•ด ๋งจ ์•ž์œผ๋กœ)
50
- G2 stage ์„ ํƒ (PR ๊ฐ€๋Šฅ ๋ชฉ๋ก์—์„œ multi-select)
51
- assemble: ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ + merge โ† okstra_ctl ํ—ฌํผ (๊ฐ•์ œ ์ง€์ )
52
- Q2b ์ถฉ๋Œ ํ”„๋กœ๋ธŒ (๊ธฐ์กด)
53
- Q3 PR ์ œ๋ชฉ/๋ณธ๋ฌธ ํ™•์ธ (๊ธฐ์กด)
54
- push + gh pr create (head = ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜)
55
- consumers ์— pr ํ–‰ ๊ธฐ๋ก
56
- ```
57
-
58
- stage-group ๋ชจ๋“œ์—์„œ๋Š” base ์„ ํƒ์ด stage ์„ ํƒ๋ณด๋‹ค **์•ž์„ ๋‹ค** โ€” G2 ์กฐ๊ฑด 4(์˜์กด ํํฌ)์˜ ancestor ํŒ์ •๊ณผ assemble ์ด `origin/<chosen-base>` ๋ฅผ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. whole-task ๋ชจ๋“œ์˜ ๊ธฐ์กด Q1โ†’Q2 ์ˆœ์„œ๋Š” ๋ถˆ๋ณ€.
59
-
60
- ### 4.1 ์ง„์ž… ๊ฒŒ์ดํŠธ (stage-group ๋ชจ๋“œ)
61
-
62
- - brief ๊ฐ€ ๊ทธ๋ฃน ํ›„๋ณด stage ๋“ค์˜ **๋‹จ๋…-stage final-verification ๋ณด๊ณ ์„œ N ๊ฐœ**๋ฅผ ์ธ์šฉํ•˜๊ณ , ๊ฐ๊ฐ์˜ `Verdict Token` ์ด `accepted` ์ธ์ง€ lead ๊ฐ€ ํ™•์ธํ•œ๋‹ค. whole-task ๋ชจ๋“œ์˜ ๋‹จ์ผ ๋ณด๊ณ ์„œ ๊ฒŒ์ดํŠธ([release-handoff.md:14](../../../prompts/profiles/release-handoff.md:14))์™€ ๋ณ‘๋ ฌ ๋ถ„๊ธฐ.
63
- - ์›Œํ‚นํŠธ๋ฆฌ clean / base ๋ธŒ๋žœ์น˜ ๊ธˆ์ง€ / ์ปค๋ฐ‹ ์กด์žฌ ๊ฒŒ์ดํŠธ๋Š” ๊ธฐ์กด ๊ทธ๋Œ€๋กœ ([release-handoff.md:16-18](../../../prompts/profiles/release-handoff.md:16)).
64
-
65
- ### 4.2 G2 โ€” stage ์„ ํƒ
66
-
67
- lead ๊ฐ€ ํ—ฌํผ(ยง6)์— G1 ์—์„œ ๊ณ ๋ฅธ base ๋ฅผ ๋„˜๊ฒจ **PR ๊ฐ€๋Šฅ stage ๋ชฉ๋ก**์„ ๋ฐ›์•„ multi-select ๋กœ ์ œ์‹œํ•œ๋‹ค. PR ๊ฐ€๋Šฅ ์กฐ๊ฑด(์ „๋ถ€ ํ—ฌํผ๊ฐ€ ํŒ์ •):
68
-
69
- 1. consumers `status:done` ([consumers.py:37](../../../scripts/okstra_ctl/consumers.py:37) `latest_done_by_stage`).
70
- 2. ํ•ด๋‹น stage ์˜ ๋‹จ๋…-stage final-verification `accepted` ๊ธฐ๋ก ์กด์žฌ (ยง5.2 `verified` ํ–‰).
71
- 3. ์•„์ง ์–ด๋–ค `pr` ํ–‰์—๋„ ํฌํ•จ๋˜์ง€ ์•Š์Œ (ยง5.3).
72
- 4. **์˜์กด ํํฌ**: ๋ชจ๋“  ์„ ํ–‰ stage ๊ฐ€ (a) ๊ฐ™์€ ๊ทธ๋ฃน์— ์„ ํƒ๋˜์—ˆ๊ฑฐ๋‚˜, (b) ์ด๋ฏธ PR ๋จธ์ง€๋˜์–ด `origin/<chosen-base>` ์˜ ancestor (`git merge-base --is-ancestor <์„ ํ–‰ done head_commit> origin/<base>`). ์œ„๋ฐ˜ ์‹œ ํ•ด๋‹น ์กฐํ•ฉ์„ **์ฐจ๋‹จ**ํ•˜๊ณ  "์„ ํ–‰ stage <N> ์„ ๊ทธ๋ฃน์— ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๋จผ์ € PR-๋จธ์ง€ ํ›„ ์žฌ์‹œ๋„" ์•ˆ๋‚ด. ๊ทผ๊ฑฐ: ๋‹จ์ผ-์˜์กด stage ๋ธŒ๋žœ์น˜๋Š” ์„ ํ–‰ ๋ธŒ๋žœ์น˜ ์œ„์— ์ ์ธต๋˜๋ฏ€๋กœ([stage-worktree-isolation-design.md ยง2.2](2026-06-06-stage-worktree-isolation-design.md)), ์„ ํ–‰์„ ๋นผ๊ณ  ํ›„ํ–‰๋งŒ PR ํ•˜๋ฉด ์„ ํ–‰ ์ปค๋ฐ‹์ด ๋ฌต์‹œ์ ์œผ๋กœ ๋”ฐ๋ผ๊ฐ„๋‹ค.
73
-
74
- ### 4.3 assemble โ€” ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ + ๋จธ์ง€
75
-
76
- - base: registry task-key ํ–‰์˜ `implementation_base_commit` ([worktree_registry.py:72](../../../scripts/okstra_ctl/worktree_registry.py:72), [worktree_registry.py:239](../../../scripts/okstra_ctl/worktree_registry.py:239) `get_implementation_base`).
77
- - ๋ธŒ๋žœ์น˜๋ช…: `<work-category-prefix>-<task-id>-g<stage๋“ค์„ -๋กœ ์—ฐ๊ฒฐ>` (์˜ˆ: `feat-dev-9184-g2-3`). ์ •๋ ฌ์€ stage ๋ฒˆํ˜ธ ์˜ค๋ฆ„์ฐจ์ˆœ.
78
- - ์›ŒํฌํŠธ๋ฆฌ: `~/.okstra/worktrees/<project>/<group>/<task-id>/group-<id>/`, registry ํ‚ค `<task-key>#group-<id>` ๋ฅผ flock ์˜ˆ์•ฝ โ€” stage-key ์˜ˆ์•ฝ๊ณผ ๋™์ผ ๋ฉ”์ปค๋‹ˆ์ฆ˜.
79
- - merge: ์„ ํƒ stage ๋ธŒ๋žœ์น˜๋“ค์„ stage ๋ฒˆํ˜ธ ์ˆœ์œผ๋กœ `git merge` (merge ์ปค๋ฐ‹ ํ—ˆ์šฉ). **์ถฉ๋Œ ์‹œ ์ฆ‰์‹œ ์ค‘๋‹จ**(`git merge --abort` ํ›„ ์ข…๋ฃŒ) + ์ถฉ๋Œ ๊ฒฝ๋กœ ๋ชฉ๋ก๊ณผ "stage ๊ฐ„ ์ถฉ๋Œ โ€” ์ˆ˜๋™ ํ•ด์†Œ ๋˜๋Š” ๊ทธ๋ฃน ์žฌ๊ตฌ์„ฑ" ์•ˆ๋‚ด. rebase / squash / force ๊ธˆ์ง€ ์œ ์ง€.
80
- - ๋ฉฑ๋“ฑ์„ฑ: ๋™์ผ ๊ทธ๋ฃน ํ‚ค์˜ ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด โ€” ๊ทธ HEAD ๊ฐ€ ๋™์ผ stage head ๋“ค์˜ merge ๊ฒฐ๊ณผ(๊ฐ stage `done.head_commit` ์ด ๋ชจ๋‘ ancestor)์ผ ๋•Œ๋งŒ ์žฌ์‚ฌ์šฉ, ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋กœ ์ค‘๋‹จํ•˜๊ณ  ์ •๋ฆฌ ์ ˆ์ฐจ ์•ˆ๋‚ด.
81
-
82
- ### 4.4 PR ์ดˆ์•ˆ / ๋ณด๊ณ ์„œ
83
-
84
- - PR ์ œ๋ชฉ/๋ณธ๋ฌธ ์ดˆ์•ˆ ๊ทœ์น™์€ ๊ธฐ์กด๊ณผ ๋™์ผํ•˜๋˜([release-handoff.md:44-49](../../../prompts/profiles/release-handoff.md:44)), ์†Œ์Šค๊ฐ€ stage ๋ณ„ implementation ๋ณด๊ณ ์„œ + ๋‹จ๋… ๊ฒ€์ฆ ๋ณด๊ณ ์„œ N ๊ฐœ๋กœ ๋Š˜์–ด๋‚œ๋‹ค. diff ๋ฒ”์œ„๋Š” `implementation_base_commit..<์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜ HEAD>`.
85
- - ์ตœ์ข… ๋ณด๊ณ ์„œ deliverable ์— **Stage Group** ์„น์…˜ ์ถ”๊ฐ€: ์„ ํƒ stage ๋ชฉ๋ก, ๊ฐ stage ์˜ ๊ฒ€์ฆ ๋ณด๊ณ ์„œ ๊ฒฝ๋กœยทVerdict Token, ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜๋ช…, merge ์ปค๋ฐ‹ SHA ๋ชฉ๋ก, ์˜์กด ํํฌ ํŒ์ • ๊ฒฐ๊ณผ.
86
-
87
- ## 5. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ
88
-
89
- ### 5.1 registry โ€” ๊ทธ๋ฃน ํ‚ค
90
-
91
- stage-key ์™€ ๋™ํ˜•์˜ ๊ทธ๋ฃน ํ‚ค ์—”ํŠธ๋ฆฌ:
92
-
93
- ```jsonc
94
- "<proj>/<group>/<task-id>#group-g2-3": {
95
- "branch": "feat-dev-9184-g2-3",
96
- "worktree_path": ".../<task-id>/group-g2-3",
97
- "base_ref": "<implementation_base_commit>",
98
- "stages": [2, 3],
99
- "status": "active"
100
- }
101
- ```
102
-
103
- ### 5.2 consumers โ€” `verified` ํ–‰ (์‹ ๊ทœ)
104
-
105
- ๋‹จ๋…-stage final-verification ์ด `accepted` ๋กœ ๋๋‚˜๋ฉด plan_run_root ์˜ consumers.jsonl ์— ๊ธฐ๋กํ•œ๋‹ค:
106
-
107
- ```jsonc
108
- {"impl_task_key": "...", "stage": 2, "status": "verified", "verdict": "accepted", "report_path": "...", "ts": "..."}
109
- ```
110
-
111
- - ํ˜„์žฌ [consumers.py:50](../../../scripts/okstra_ctl/consumers.py:50) ์˜ `append_consumer` ๋Š” `started|done` ๋งŒ ํ—ˆ์šฉ โ€” ํ—ˆ์šฉ ์ง‘ํ•ฉ์„ ํ™•์žฅํ•œ๋‹ค.
112
- - ์ด ํ–‰์ด G2 ์กฐ๊ฑด 2์˜ SSOT ๋‹ค. ๋ณด๊ณ ์„œ ํŒŒ์ผ์„ ์žฌํŒŒ์‹ฑํ•˜์ง€ ์•Š๊ณ  consumers ๋งŒ ์ฝ์–ด ์ž๊ฒฉ์„ ํŒ์ •ํ•œ๋‹ค.
113
-
114
- ### 5.3 consumers โ€” `pr` ํ–‰ (์‹ ๊ทœ)
115
-
116
- handoff ๊ฐ€ PR ์ƒ์„ฑ(๋˜๋Š” ์žฌ์‚ฌ์šฉ ํ™•์ธ)์— ์„ฑ๊ณตํ•˜๋ฉด ๊ธฐ๋กํ•œ๋‹ค:
117
-
118
- ```jsonc
119
- {"impl_task_key": "...", "stages": [2, 3], "status": "pr", "branch": "feat-dev-9184-g2-3", "url": "https://github.com/...", "ts": "..."}
120
- ```
121
-
122
- - "์ด๋ฏธ PR ๋œ stage" ํŒ์ •(G2 ์กฐ๊ฑด 3)์˜ SSOT. whole-task handoff ๋„ ๋™์ผ ํ–‰์„ ๊ธฐ๋กํ•œ๋‹ค(`stages` = ์ „์ฒด) โ€” ๋‘ ๊ฒฝ๋กœ์˜ ์ค‘๋ณต-PR ๋ฐฉ์ง€๊ฐ€ ํ•œ ๋ฐ์ดํ„ฐ๋กœ ์ˆ˜๋ ด.
123
-
124
- ## 6. ๊ฐ•์ œ ์ง€์  โ€” okstra_ctl ํ—ฌํผ
125
-
126
- ์ž๊ฒฉ ํŒ์ •ยทassembleยท๊ธฐ๋ก์€ lead ์˜ ์ž์œ  git ํ˜ธ์ถœ์ด ์•„๋‹ˆ๋ผ `scripts/okstra_ctl/` ์˜ ํ—ฌํผ ํ•จ์ˆ˜(์˜ˆ: `handoff_assemble`)์™€ CLI ์„œ๋ธŒ์ปค๋งจ๋“œ๋กœ ๋‹จ์ผํ™”ํ•œ๋‹ค. lead ๋Š” ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค:
127
-
128
- 1. `handoff-eligible --base <chosen-base>` โ€” PR ๊ฐ€๋Šฅ stage ๋ชฉ๋ก + ๊ฐ stage ์˜ ์ฐจ๋‹จ ์‚ฌ์œ (๋ฏธ๊ฒ€์ฆ/์ด๋ฏธ PR/์˜์กด ํํฌ)๋ฅผ JSON ์œผ๋กœ ๋ฐ˜ํ™˜. G2 ์˜ ํ‘œ์‹œ ๋ฐ์ดํ„ฐ.
129
- 2. `handoff-assemble --stages 2,3 --base <chosen-base>` โ€” ์กฐ๊ฑด ์žฌ๊ฒ€์ฆ(fail-fast, [run.py](../../../scripts/okstra_ctl/run.py) ์˜ `PrepareError` ํŒจํ„ด) โ†’ registry ๊ทธ๋ฃน ํ‚ค ์˜ˆ์•ฝ โ†’ ์ˆ˜์ง‘ ์›ŒํฌํŠธ๋ฆฌ/๋ธŒ๋žœ์น˜ ์ƒ์„ฑ โ†’ merge โ†’ ๊ฒฐ๊ณผ(๋ธŒ๋žœ์น˜๋ช…ยทHEADยทmerge SHA ๋ชฉ๋ก) JSON ๋ฐ˜ํ™˜. ์œ„๋ฐ˜ยท์ถฉ๋Œ ์‹œ ๋น„์ •์ƒ ์ข…๋ฃŒ + actionable ๋ฉ”์‹œ์ง€.
130
-
131
- `pr` ํ–‰ ๊ธฐ๋ก๋„ ํ—ฌํผ ์„œ๋ธŒ์ปค๋งจ๋“œ(`handoff-record-pr`)๋กœ ์ˆ˜ํ–‰ํ•ด lead ์˜ ์ˆ˜๊ธฐ JSON append ๋ฅผ ๊ธˆ์ง€ํ•œ๋‹ค.
132
-
133
- > declaration โ†” enforcement: ํ”„๋กœํŒŒ์ผ์˜ MUST ๋ฌธ๊ตฌ๋Š” ํ—ฌํผ๊ฐ€ ๋ณด์žฅํ•˜๋Š” ๋ถˆ๋ณ€์‹์˜ ์„œ์ˆ ์ด๊ณ , ๊ฒ€์‚ฌ ์ฑ…์ž„์€ Python ์— ์žˆ๋‹ค โ€” whole-task ๊ฒŒ์ดํŠธ ์„ค๊ณ„ ยง5 ์™€ ๋™์ผ ์›์น™ ([final-verification-whole-task-gate-design.md](2026-06-06-final-verification-whole-task-gate-design.md)).
134
-
135
- ## 7. ๊ณ„์•ฝ ๋ณ€๊ฒฝ์  (๋ฌธ์„œ/ํ”„๋กœํŒŒ์ผ)
136
-
137
- | ํŒŒ์ผ | ๋ณ€๊ฒฝ |
138
- |---|---|
139
- | [release-handoff.md](../../../prompts/profiles/release-handoff.md) | ์ง„์ž… ๊ฒŒ์ดํŠธ์— stage-group ๋ถ„๊ธฐ(ยง4.1), G1ยทG2 ์‹ ์„ค, allowed actions ์— ํ—ฌํผ ํ˜ธ์ถœยท์ˆ˜์ง‘ merge ์ถ”๊ฐ€, ์ปค๋ฐ‹ ๊ธˆ์ง€ ์กฐํ•ญ์„ "์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜ ์œ„ merge ์ปค๋ฐ‹๋งŒ ํ—ˆ์šฉ, ํŒŒ์ผ ๋ณ€๊ฒฝ ์ปค๋ฐ‹ยทhistory rewrite ๊ธˆ์ง€"๋กœ ์ •๋ฐ€ํ™”, deliverable ์— Stage Group ์„น์…˜ |
140
- | [final-verification.md](../../../prompts/profiles/final-verification.md) | line 29ยท40 ์˜ ๋‹จ๋…-stage ๋ผ์šฐํŒ… ๊ธˆ์ง€๋ฅผ "๋‹จ๋…-stage `accepted` ๋Š” `release-handoff(stage-group)` ๋ผ์šฐํŒ… ํ—ˆ์šฉ"์œผ๋กœ ์™„ํ™”. whole-task ์ „์šฉ ๋ฌธ๊ตฌ๋Š” "๋‹จ์ผ task ์ „์ฒด PR" ํ•œ์ •์œผ๋กœ ์ˆ˜์ •. accepted ์‹œ consumers `verified` ํ–‰ ๊ธฐ๋ก ์˜๋ฌด ์ถ”๊ฐ€ |
141
- | [stage-worktree-isolation-design.md](2026-06-06-stage-worktree-isolation-design.md) | ๋น„๋ชฉํ‘œ "okstra ์ž๋™ ๋จธ์ง€ ์—†์Œ"์— "release-handoff stage-group ์ˆ˜์ง‘ ๋จธ์ง€๋Š” ์˜ˆ์™ธ(๋ณธ ์„ค๊ณ„)" ์ฃผ์„ |
142
- | [docs/kr/architecture.md](../../kr/architecture.md) | release-handoff ์ ˆ์— stage-group ๋ชจ๋“œยทconsumers `verified`/`pr` ํ–‰ ๊ณ„์•ฝ ๋ฐ˜์˜ |
143
-
144
- ## 8. ํ…Œ์ŠคํŠธ
145
-
146
- - unit (`tests/`):
147
- - ์ž๊ฒฉ ๊ณ„์‚ฐ โ€” done/verified/pr/์˜์กด ํํฌ ๊ฐ ์กฐ๊ฑด์˜ ํฌํ•จยท์ œ์™ธ, ancestor ํŒ์ • ๋ถ„๊ธฐ.
148
- - `append_consumer` ํ—ˆ์šฉ ์ง‘ํ•ฉ ํ™•์žฅ (`verified`, `pr` ํ–‰ round-trip).
149
- - registry ๊ทธ๋ฃน ํ‚ค ์˜ˆ์•ฝ โ€” ๋™์‹œ ์˜ˆ์•ฝ ์ง๋ ฌํ™”, ๊ธฐ์กด stage-key ์™€ ๋น„์ถฉ๋Œ.
150
- - assemble โ€” ์ •์ƒ merge ๊ทธ๋ž˜ํ”„, ์ถฉ๋Œ ์‹œ ์ค‘๋‹จยท์ •๋ฆฌ, ๋ฉฑ๋“ฑ ์žฌ์‚ฌ์šฉ vs ๋ถˆ์ผ์น˜ ์—๋Ÿฌ.
151
- - e2e: `tests-e2e/scenario-<๋‹ค์Œ ๋นˆ ๋ฒˆํ˜ธ>-stage-group-handoff.sh` โ€” ๋…๋ฆฝ stage 2๊ฐœ done + verified โ†’ eligible ๋ชฉ๋ก ํ™•์ธ โ†’ assemble โ†’ ์ˆ˜์ง‘ ๋ธŒ๋žœ์น˜ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„(`git merge-base --is-ancestor` ์–‘๋ฐฉํ–ฅ) ๊ฒ€์ฆ โ†’ pr ํ–‰ ๊ธฐ๋ก ํ™•์ธ. ์ž„์‹œ `OKSTRA_HOME`(`mktemp -d`) + `trap` ์ •๋ฆฌ ๊ด€๋ก€ ์ค€์ˆ˜.
152
-
153
- ## 9. ๋ฏธํ•ด๊ฒฐ / ํ›„์†
154
-
155
- - ์ˆ˜์ง‘ ์›ŒํฌํŠธ๋ฆฌยท๋ธŒ๋žœ์น˜์˜ PR ๋จธ์ง€ ํ›„ ์ •๋ฆฌ๋Š” ๊ธฐ์กด ์ˆ˜๋™ ์ ˆ์ฐจ(`git worktree remove` โ†’ `branch -D` โ†’ registry ํ‚ค ์‚ญ์ œ)๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ์ž๋™ GC ๋Š” ํ›„์†.
156
- - ๊ทธ๋ฃน PR ์ด base ์— ๋จธ์ง€๋œ ๋’ค ๋‚จ์€ stage ๋“ค์˜ whole-task ๊ฒ€์ฆ base ์ •ํ•ฉ(์ด๋ฏธ ๋จธ์ง€๋œ stage diff ์˜ ์ค‘๋ณต ํ‘œ์‹œ)์€ whole-task ๊ฒŒ์ดํŠธ์˜ ๊ธฐ์กด ancestor ๊ฒ€์‚ฌ๋กœ ํก์ˆ˜๋˜๋Š”์ง€ ๊ตฌํ˜„ ๋‹จ๊ณ„์—์„œ ํ™•์ธํ•œ๋‹ค.
@@ -1,158 +0,0 @@
1
- # brief entry-phase ํ•œ์ • + release-handoff task-id ๊ธฐ๋ฐ˜ stage ์ง„์ž… โ€” ์„ค๊ณ„
2
-
3
- - ๋‚ ์งœ: 2026-06-11
4
- - ์ƒํƒœ: ๊ตฌํ˜„ ์™„๋ฃŒ (์‚ฌ์šฉ์ž ์Šน์ธ ํ›„ ๊ตฌํ˜„ โ€” ยง5.3 ์˜ manifest ๊ฐฑ์‹  ํ•ญ๋ชฉ๋งŒ ๊ตฌํ˜„ ์‹œ ์ˆ˜์ •)
5
- - ์„ ํ–‰ ์„ค๊ณ„: [2026-06-10-stage-group-handoff-design.md](2026-06-10-stage-group-handoff-design.md) (stage-group ๋ฐฑ์—”๋“œ), [2026-06-06-stage-worktree-isolation-design.md](2026-06-06-stage-worktree-isolation-design.md)
6
-
7
- ## 1. ๋ฐฐ๊ฒฝ / ๋ฌธ์ œ
8
-
9
- brief ๋Š” ๋น„๊ฐœ๋ฐœ์žยทํƒ€ ํŒ€ยท์•„์ด๋””์–ดยท์—๋Ÿฌ ์‹ ๊ณ  ์ดˆ์•ˆ์„ ๋‹ด๋Š” **entry-phase ์ž…๋ ฅ๋ฌผ**์ธ๋ฐ, ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ๋ชจ๋“  phase ์—์„œ brief ๋ฅผ ์˜์‹์ฒ˜๋Ÿผ ์š”๊ตฌํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ run ์—์„œ ํ™•์ธํ•œ ๋ฌธ์ œ ์„ธ ๊ฐ€์ง€:
10
-
11
- 1. **์œ„์ €๋“œ๊ฐ€ ์ „ task-type ์— brief ๋ฅผ ๋ฌป๋Š”๋‹ค.** brief ๋‹จ๊ณ„์— task-type ํ•„ํ„ฐ๊ฐ€ ์—†๊ณ ([wizard.py:2367-2382](../../../scripts/okstra_ctl/wizard.py:2367)), ๊ธฐ์กด task ๋ฉด `brief_keep` ์œผ๋กœ ์œ ์ง€/๋ณ€๊ฒฝ์„ ๋˜ ๋ฌป๋Š”๋‹ค([wizard.py:2418-2425](../../../scripts/okstra_ctl/wizard.py:2418)). downstream phase ์˜ brief ๋Š” task manifest ์˜ `taskBriefPath` ๋กœ ์ด๋ฏธ ์ž๋™ ํ•ด์†Œ ๊ฐ€๋Šฅํ•œ๋ฐ๋„([wizard.py:830-837](../../../scripts/okstra_ctl/wizard.py:830)) ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์š”๊ตฌํ•œ๋‹ค.
12
- 2. **release-handoff ์˜ ์‹ค์งˆ ์ž…๋ ฅ์€ final-verification final-report ์ธ๋ฐ ์œ„์ €๋“œ๋Š” brief ๊ฒฝ๋กœ๋ฅผ ์š”๊ตฌํ•œ๋‹ค.** stage-group ๋ชจ๋“œ ์ง„์ž… ์กฐ๊ฑด์ด "brief ๊ฐ€ ๋‹จ๋…-stage ๊ฒ€์ฆ ๋ณด๊ณ ์„œ N ๊ฐœ๋ฅผ ์ธ์šฉ"์ด๋ผ๋Š” ์ˆ˜๋™ ์˜์‹์ด๊ณ ([release-handoff.md:15](../../../prompts/profiles/release-handoff.md:15)), ๊ทธ brief ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์ž๋™ํ™”๋Š” ์—†๋‹ค โ€” [release-handoff-input.template.md](../../../templates/reports/release-handoff-input.template.md) ๋Š” ๋ Œ๋”๋Ÿฌ๊ฐ€ ์—†๋Š” ์ฃฝ์€ ํ…œํ”Œ๋ฆฟ์ด๋ฉฐ ๋‹จ์ˆ˜ ์ธ์šฉ ์Šฌ๋กฏ๋ฟ์ด๋‹ค. ๋ชจ๋“œ(whole-task/stage-group)๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์ง€์ ๋„ ์œ„์ €๋“œยทbriefยท๊ฒŒ์ดํŠธ ์–ด๋””์—๋„ ์—†๋‹ค.
13
- 3. **stage ์ž๊ฒฉ ํŒ์ • ์ธํ”„๋ผ๋Š” ์ด๋ฏธ ์žˆ๋‹ค.** `okstra_ctl.handoff.compute_eligibility` ๊ฐ€ approved plan ์˜ Stage Map + `consumers.jsonl`(done + `verified` accepted + ๋ฏธ-`pr`)๋กœ stage ๋ณ„ PR ์ž๊ฒฉ์„ ํŒ์ •ํ•œ๋‹ค([handoff.py:36-39](../../../scripts/okstra_ctl/handoff.py:36)). task-id ๋งŒ ์žˆ์œผ๋ฉด ๊ณ„์‚ฐ๋˜๋Š” ์ •๋ณด๋ฅผ brief ์ธ์šฉ์œผ๋กœ ์ค‘๋ณต ์„ ์–ธํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ผ ์ฐธ์กฐ์  ์œ„๋ฐ˜์ด๋‹ค.
14
-
15
- ## 2. ๊ฒฐ์ • ์š”์•ฝ (์‚ฌ์šฉ์ž Q&A)
16
-
17
- | ์งˆ๋ฌธ | ๊ฒฐ์ • |
18
- |---|---|
19
- | brief ๋Š” ์–ด๋А phase ์ž…๋ ฅ์ธ๊ฐ€ | entry phase(requirements-discovery / error-analysis / improvement-discovery) ์ „์šฉ. downstream ์€ task-id ๋กœ ์ž๋™ carry-in |
20
- | release-handoff ์ง„์ž… ์ž…๋ ฅ | brief ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ task-id. ๊ฒ€์ฆ ์™„๋ฃŒ(eligible) stage ๋ฅผ ๋ฉ€ํ‹ฐ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ „์ฒด ์„ ํƒ |
21
- | stage ์„ ํƒ ๊ทผ๊ฑฐ | implementation-planning final-report ์˜ Stage Map + consumers ์ƒํƒœ (`handoff eligible` ์žฌ์‚ฌ์šฉ) |
22
- | PR ์ƒ์„ฑ ํ›„ stage worktree ์ •๋ฆฌ | **๋ฒ”์œ„ ์ œ์™ธ** (์‚ฌ์šฉ์ž ๊ฒฐ์ • โ€” PR ๋ฆฌ๋ทฐ ์ˆ˜์ •์ด stage ๋ธŒ๋žœ์น˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ํ๋ฆ„๊ณผ ์ถฉ๋Œ ์œ„ํ—˜) |
23
-
24
- ## 3. ๋ชฉํ‘œ / ๋น„๋ชฉํ‘œ
25
-
26
- ๋ชฉํ‘œ:
27
-
28
- - ์œ„์ €๋“œ brief ๋‹จ๊ณ„(`brief_path_pick`/`brief_path`/`brief_keep`)๋ฅผ entry phase ์—๋งŒ ์ ์šฉํ•˜๊ณ , downstream phase ๋Š” manifest `taskBriefPath` ๋กœ ์ž๋™ ํ•ด์†Œํ•œ๋‹ค.
29
- - release-handoff ์œ„์ €๋“œ ์ง„์ž…์„ brief picker ๋Œ€์‹  **eligible stage picker** ๋กœ ๊ต์ฒดํ•œ๋‹ค. ๋ชจ๋“œ๋Š” ์„ ํƒ ๊ฒฐ๊ณผ๋กœ ์ž๋™ ๊ฒฐ์ •๋œ๋‹ค.
30
- - prepare ๊ฐ€ release-handoff ์˜ ์ž…๋ ฅ ๋ฌธ์„œ(๊ฒ€์ฆ ๋ณด๊ณ ์„œ ์ธ์šฉ ๋ž˜ํผ)๋ฅผ [release-handoff-input.template.md](../../../templates/reports/release-handoff-input.template.md) ๋กœ **์ž๋™ ์ƒ์„ฑ**ํ•œ๋‹ค โ€” ์ฃฝ์€ ํ…œํ”Œ๋ฆฟ์˜ ๋ถ€ํ™œ, ์ˆ˜๋™ brief ์ž‘์„ฑ ์ œ๊ฑฐ.
31
- - `--stage`(impl/fv ์˜ Stage Map ์‹คํ–‰/๊ฒ€์ฆ ์„ ํƒ)์™€ release-handoff ์˜ stage ๋ฌถ์Œ ์„ ํƒ์„ **๋ณ„๊ฐœ ์ฑ„๋„**๋กœ ์œ ์ง€ํ•˜๋˜, ํ›„์ž๋ฅผ ์œ„์ €๋“œ โ†’ render-bundle ๋กœ ์ „๋‹ฌํ•˜๋Š” `--stages` flag ๋ฅผ ์‹ ์„คํ•œ๋‹ค.
32
-
33
- ๋น„๋ชฉํ‘œ:
34
-
35
- - PR ์ƒ์„ฑ ํ›„ worktree/branch/registry ์ •๋ฆฌ (์‚ฌ์šฉ์ž ๊ฒฐ์ •์œผ๋กœ ์ œ์™ธ).
36
- - `handoff eligible / assemble / record-*` ๋ฐฑ์—”๋“œ ๋กœ์ง ๋ณ€๊ฒฝ โ€” ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
37
- - ๋‹ค๋ฅธ phase ์˜ ์ฃฝ์€ input ํ…œํ”Œ๋ฆฟ(`error-analysis-input` ๋“ฑ) ์ •๋น„ โ€” ํ›„์† ๊ณผ์ œ(ยง9).
38
- - okstra-brief ์Šคํ‚ฌ ๋ณ€๊ฒฝ โ€” entry phase ์šฉ๋„ ๊ทธ๋Œ€๋กœ.
39
- - prepare ์˜ `--task-brief` ํ•„์ˆ˜ ๊ณ„์•ฝ ๋ณ€๊ฒฝ โ€” ์œ„์ €๋“œ/prepare ๊ฐ€ ์ฑ„์›Œ ๋„ฃ๋Š” ๋ฐฉ์‹๋งŒ ๋ฐ”๋€๋‹ค.
40
-
41
- ## 4. ์„ค๊ณ„ A โ€” brief ๋ฅผ entry phase ์ „์šฉ์œผ๋กœ
42
-
43
- ### 4.1 task-type ๋ถ„๋ฅ˜ (SSOT ์ƒ์ˆ˜)
44
-
45
- `wizard.py` ์— ์ƒ์ˆ˜ ์‹ ์„ค (๊ธฐ์กด `_STAGE_SCOPED_TASK_TYPES` [wizard.py:89](../../../scripts/okstra_ctl/wizard.py:89) ์™€ ๋‚˜๋ž€ํžˆ):
46
-
47
- ```python
48
- _BRIEF_ENTRY_TASK_TYPES = ("requirements-discovery", "error-analysis",
49
- "improvement-discovery")
50
- ```
51
-
52
- downstream = ๊ทธ ์™ธ ์ „๋ถ€(implementation-planning, implementation, final-verification, release-handoff).
53
-
54
- ### 4.2 ์œ„์ €๋“œ ๋‹จ๊ณ„ ๋ณ€๊ฒฝ
55
-
56
- - `S_BRIEF_PATH_PICK` / `S_BRIEF_PATH` / `S_BRIEF_KEEP` ์˜ `applies` ์— `s.task_type in _BRIEF_ENTRY_TASK_TYPES` ๊ฒŒ์ดํŠธ ์ถ”๊ฐ€.
57
- - ์ฃผ์˜: ํ˜„์žฌ ์‹ ๊ทœ task ํ๋ฆ„์€ brief ์„ ํƒ์ด task-type ์„ ํƒ๋ณด๋‹ค **์•ž์„ ๋‹ค**([wizard.py:2373](../../../scripts/okstra_ctl/wizard.py:2373) `is_new_task is True and bool(task_group)`). ๊ฒŒ์ดํŠธ๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด ์‹ ๊ทœ task ์˜ ๋‹จ๊ณ„ ์ˆœ์„œ๋ฅผ task-type ๋จผ์ €๋กœ ์žฌ๋ฐฐ์—ดํ•ด์•ผ ํ•œ๋‹ค(ยง8 ํ…Œ์ŠคํŠธ๋กœ ๊ณ ์ •). ๊ธฐ์กด task ํ๋ฆ„์€ ์ด๋ฏธ task-type ์ดํ›„์— brief ๋ฅผ ๋ฌป๋Š”๋‹ค.
58
- - downstream + ๊ธฐ์กด task: `_existing_task_brief()` ๊ฒฐ๊ณผ๋ฅผ `state.brief_path` ์— **์ž๋™ ์ฃผ์ž…**ํ•˜๊ณ  brief ๊ด€๋ จ ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ๊ฑด๋„ˆ๋›ด๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ echo ํ•œ ์ค„๋กœ๋งŒ ์•Œ๋ฆฐ๋‹ค (`brief (carry-in): <path>`).
59
- - downstream + brief ๋ฏธ๋“ฑ๋ก (์‹ ๊ทœ task ๋กœ downstream type ์„ ๊ณ ๋ฅด๊ฑฐ๋‚˜ manifest ์— `taskBriefPath` ์—†์Œ): 3-์˜ต์…˜ picker (run-prompt ์ถ”์ฒœ ๊ทœ์น™ ์ค€์ˆ˜):
60
- 1. (์ถ”์ฒœ) entry phase ๋กœ task-type ๋ณ€๊ฒฝ โ€” picker ๊ฐ€ entry 3์ข…์„ ๋ณด์—ฌ์ฃผ๊ณ  task-type ๋‹จ๊ณ„๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.
61
- 2. brief ๊ฒฝ๋กœ ์ง์ ‘ ์ž…๋ ฅ โ€” ํƒˆ์ถœ๊ตฌ. ์†์œผ๋กœ ์“ด brief ๋กœ downstream ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ์กด ์›Œํฌํ”Œ๋กœ ๋ณด์กด.
62
- 3. ์ค‘๋‹จ.
63
- - release-handoff ๋Š” ยง5 ์˜ ์ž๋™ ์ƒ์„ฑ ์ž…๋ ฅ์ด brief ์—ญํ• ์„ ๋Œ€์ฒดํ•˜๋ฏ€๋กœ ์ด picker ๋Œ€์ƒ์—์„œ๋„ ์ œ์™ธ๋œ๋‹ค.
64
-
65
- ### 4.3 ๊ณ„์•ฝ ๋ถˆ๋ณ€ ์‚ฌํ•ญ
66
-
67
- - prepare ์˜ `--task-brief` ํ•„์ˆ˜ ๊ฒ€์ฆ([run.py:2209-2212](../../../scripts/okstra_ctl/run.py:2209))๊ณผ downstream profile ๋“ค์˜ brief ์ธ์šฉ(์˜ˆ: Requirement Coverage ๊ฐ€ brief heading ์ธ์šฉ โ€” [implementation-planning.md:86](../../../prompts/profiles/implementation-planning.md:86))์€ ๊ทธ๋Œ€๋กœ๋‹ค. brief ๋Š” ์—ฌ์ „ํžˆ ์ „ phase ์˜ ์š”๊ตฌ์‚ฌํ•ญ anchor ๋‹ค โ€” ๋ฐ”๋€Œ๋Š” ๊ฒƒ์€ "๋ˆ„๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋Œ€๋Š”๊ฐ€"(์‚ฌ์šฉ์ž โ†’ ์œ„์ €๋“œ ์ž๋™) ๋ฟ์ด๋‹ค.
68
-
69
- ## 5. ์„ค๊ณ„ B โ€” release-handoff: task-id ์ง„์ž… + eligible stage picker
70
-
71
- ### 5.1 ์œ„์ €๋“œ ํ๋ฆ„ (release-handoff ํ•œ์ •)
72
-
73
- ```
74
- task ์„ ํƒ(๊ธฐ์กด task ์ „์ œ) โ†’ task-type=release-handoff
75
- โ†’ approved-plan ์ž๋™ ํ•ด์†Œ (fv ์™€ ๋™์ผ: _latest_implementation_planning_report
76
- + frontmatter approved: true ํ™•์ธ; ์‹คํŒจ ์‹œ implementation-planning ์„ ํ–‰ ์•ˆ๋‚ด)
77
- โ†’ S_HANDOFF_STAGE_PICK (์‹ ๊ทœ):
78
- compute_eligibility ์ง์ ‘ ํ˜ธ์ถœ (python import โ€” shell-out ๊ธˆ์ง€, ๋‹จ์ผ ์ฐธ์กฐ์ )
79
- ์˜ต์…˜:
80
- - "์ „์ฒด task (whole-task ๊ฒ€์ฆ ๊ธฐ๋ฐ˜)" โ€” whole-task fv ๋ณด๊ณ ์„œ(accepted,
81
- verificationScope=whole-task)๊ฐ€ ์กด์žฌํ•  ๋•Œ๋งŒ ๋…ธ์ถœ โ†’ whole-task ๋ชจ๋“œ
82
- - eligible stage ๋ฉ€ํ‹ฐ์„ ํƒ (์ „์ฒด eligible ์„ ํƒ = "๋‹ค ๊ฐ™์ด") โ†’ stage-group ๋ชจ๋“œ
83
- - blocked stage ๋Š” reasons ์™€ ํ•จ๊ป˜ ๋น„์„ ํƒ ํ‘œ์‹œ
84
- โ†’ (์ดํ›„ ๊ธฐ์กด ๋‹จ๊ณ„: pr-template, ๋ชจ๋ธ/directive ๋“ฑ โ€” ๋ณ€๊ฒฝ ์—†์Œ)
85
- ```
86
-
87
- - brief ๋‹จ๊ณ„ ์—†์Œ, base-ref ๋‹จ๊ณ„ ์—†์Œ(ํ˜„ํ–‰ ์œ ์ง€ โ€” PR base ๋Š” run ์ค‘ G1/Q2 ๊ฐ€ ๋ฌป๋Š”๋‹ค).
88
- - ๋ชจ๋“œ ์งˆ๋ฌธ์€ ๋ณ„๋„ ๋‹จ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ **์ด picker ์˜ ์„ ํƒ์ง€๋กœ ํก์ˆ˜**๋œ๋‹ค.
89
-
90
- ### 5.2 ์ธ์ž ์ „๋‹ฌ โ€” `--stages` ์‹ ์„ค
91
-
92
- - `render_args()` ๊ฐ€ release-handoff ์ผ ๋•Œ ์‹ ๊ทœ ํ‚ค `stages` ๋ฅผ ์ฑ„์šด๋‹ค: whole-task = `""`, stage-group = `"2,3"` (csv).
93
- - `render-bundle` / `okstra.sh` / `okstra_ctl.run` argparse ์— `--stages` ์ถ”๊ฐ€. **release-handoff ์™ธ task-type ์—์„œ ๋น„์–ด ์žˆ์ง€ ์•Š์€ `--stages` ๋Š” PrepareError** (์–ด์ œ ๊ณ ์นœ `--stage` ๋นˆ ๊ฐ’ ๊ทœ์น™๊ณผ ๋™์ผํ•˜๊ฒŒ, ๋นˆ ๋ฌธ์ž์—ด์€ ๋ฏธ์ง€์ •์œผ๋กœ ํ†ต๊ณผ โ€” [run.py:1124](../../../scripts/okstra_ctl/run.py:1124) ํŒจํ„ด).
94
- - `--stage` ์™€ `--stages` ๋Š” ๋‹ค๋ฅธ ์ฑ„๋„์ด๋‹ค: ์ „์ž = impl/fv ์˜ Stage Map ์‹คํ–‰/๊ฒ€์ฆ ์„ ํƒ, ํ›„์ž = release-handoff ์˜ PR ๋ฌถ์Œ ์„ ํƒ. ๋„์›€๋ง์— ๋ช…์‹œํ•œ๋‹ค.
95
-
96
- ### 5.3 prepare โ€” ์ž…๋ ฅ ๋ฌธ์„œ ์ž๋™ ์ƒ์„ฑ
97
-
98
- release-handoff prepare ์‹œ:
99
-
100
- 1. `compute_eligibility` ๋กœ ์„ ํƒ stage ๋“ค์˜ ์ž๊ฒฉ์„ **์žฌ๊ฒ€์ฆ** (์œ„์ €๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์€ CLI ๊ฒฝ๋กœ๋„ ๊ฐ™์€ ๊ฐ•์ œ ์ง€์ ์„ ํ†ต๊ณผ).
101
- 2. ๊ฐ ์„ ํƒ stage ์˜ ๋‹จ๋… ๊ฒ€์ฆ ๋ณด๊ณ ์„œ ๊ฒฝ๋กœยทverdict ๋ฅผ `consumers.jsonl` ์˜ `verified` ํ–‰(last-wins, [consumers.py:107-111](../../../scripts/okstra_ctl/consumers.py:107))์—์„œ ์ˆ˜์ง‘. whole-task ๋ฉด ์ตœ์‹  whole-task fv final-report ์—์„œ ์ˆ˜์ง‘.
102
- 3. [release-handoff-input.template.md](../../../templates/reports/release-handoff-input.template.md) ๋ฅผ ๋ Œ๋”๋งํ•ด `<task_root>/release-handoff-input.md` ๋กœ ์ €์žฅ(๋งค run ๋ฎ์–ด์”€) โ†’ ์ด ํŒŒ์ผ์ด ๊ทธ run ์˜ brief ์ž๋ฆฌ(`inp.brief_path`)๋ฅผ ์ฑ„์šด๋‹ค. manifest `taskBriefPath` ๋Š” **๊ฐฑ์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” entry brief ํฌ์ธํ„ฐ๋ฅผ ๋ฎ์œผ๋ฉด ์ดํ›„ ๋‹ค๋ฅธ phase ์˜ carry-in ์ด handoff input ์„ brief ๋กœ ์˜ค์ธํ•˜๊ธฐ ๋•Œ๋ฌธ(๊ตฌํ˜„ ์‹œ ํ™•์ •ํ•œ spec ์ˆ˜์ •).
103
- 4. run-context ์— `HANDOFF_MODE` (`whole-task` | `stage-group`) ์™€ `HANDOFF_STAGES` ๋ฅผ ๊ธฐ๋ก.
104
-
105
- ### 5.4 ํ…œํ”Œ๋ฆฟ ๊ฐœ์ •
106
-
107
- `## Source Verification Report` ๋ฅผ ๋‹จ์ˆ˜/๋ณต์ˆ˜ ๊ฒธ์šฉ์œผ๋กœ ๊ต์ฒด:
108
-
109
- ```markdown
110
- ## Source Verification Report
111
-
112
- - Mode: `whole-task` | `stage-group`
113
- - Reports (one row per cited final-verification report):
114
-
115
- | Stage | Report path | Verdict Token (verbatim) | Run timestamp |
116
- |---|---|---|---|
117
- ```
118
-
119
- whole-task ๋ชจ๋“œ๋Š” Stage ์—ด์„ `(all)` ํ•œ ํ–‰์œผ๋กœ ์ฑ„์šด๋‹ค.
120
-
121
- ### 5.5 profile ๊ฐœ์ • ([release-handoff.md](../../../prompts/profiles/release-handoff.md))
122
-
123
- - ์ง„์ž… ๊ฒŒ์ดํŠธ(:13-15): "brief ๊ฐ€ ์ธ์šฉํ•ด์•ผ ํ•œ๋‹ค" โ†’ "prepare ๊ฐ€ ์ƒ์„ฑํ•œ input ๋ฌธ์„œ + run-context ์˜ `HANDOFF_MODE`/`HANDOFF_STAGES` ๋ฅผ ์ฝ๊ณ , ์ธ์šฉ๋œ ๊ฐ Verdict Token ์ด `accepted` ์ธ์ง€ ํ™•์ธํ•œ๋‹ค" ๋กœ ๊ต์ฒด.
124
- - G2(:27): ์œ„์ €๋“œ/CLI ์—์„œ stage ๊ฐ€ ์ด๋ฏธ ์„ ํƒ๋ผ ์žˆ์œผ๋ฏ€๋กœ **์žฌ์„ ํƒ์ด ์•„๋‹ˆ๋ผ ํ™•์ธ ํ‘œ์‹œ**๋กœ ์ถ•์†Œ โ€” ์„ ํƒ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๊ณ  ์ง„ํ–‰. `okstra handoff eligible` ์ง์ ‘ ํ˜ธ์ถœ ๋ถ„๊ธฐ๋Š” stage ์„ ํƒ ์—†์ด ์ง„์ž…ํ•œ ๋น„์ •์ƒ ๊ฒฝ๋กœ์˜ ๋ฐฉ์–ด๋กœ๋งŒ ๋‚จ๊ธด๋‹ค.
125
- - assemble(:28) ์ดํ›„ ํ๋ฆ„(G1 base โ†’ assemble โ†’ Q2b โ†’ Q3, record-pr)์€ ๋ถˆ๋ณ€.
126
-
127
- ## 6. ์„ค๊ณ„ C โ€” final-verification
128
-
129
- stage picker(done ๋งˆํ‚น + ์ „์ฒด task ๊ฒ€์ฆ)๋Š” ์ตœ๊ทผ ์ž‘์—…์œผ๋กœ ์ด๋ฏธ ์‚ฌ์šฉ์ž ๋ชจ๋ธ๊ณผ ์ผ์น˜ํ•œ๋‹ค. ์ด ์„ค๊ณ„์—์„œ๋Š” ยง4 ์˜ brief ์ž๋™ carry-in ๋งŒ ์ ์šฉ๋œ๋‹ค.
130
-
131
- ## 7. ์˜ํ–ฅ ํŒŒ์ผ
132
-
133
- | ํŒŒ์ผ | ๋ณ€๊ฒฝ |
134
- |---|---|
135
- | [scripts/okstra_ctl/wizard.py](../../../scripts/okstra_ctl/wizard.py) | `_BRIEF_ENTRY_TASK_TYPES`, brief ๋‹จ๊ณ„ ๊ฒŒ์ดํŠธยท์ž๋™ ์ฃผ์ž…ยท๋ฏธ๋“ฑ๋ก picker, ์‹ ๊ทœ task ๋‹จ๊ณ„ ์ˆœ์„œ ์žฌ๋ฐฐ์—ด, `S_HANDOFF_STAGE_PICK`, `render_args` `stages` ํ‚ค |
136
- | [scripts/okstra_ctl/run.py](../../../scripts/okstra_ctl/run.py) | `--stages` argparse + ๊ฒ€์ฆ + prepare ์˜ input ์ž๋™ ์ƒ์„ฑยท`HANDOFF_MODE`/`HANDOFF_STAGES` |
137
- | [scripts/okstra_ctl/handoff.py](../../../scripts/okstra_ctl/handoff.py) | (๋ณ€๊ฒฝ ์—†์Œ โ€” import ์žฌ์‚ฌ์šฉ) |
138
- | [templates/reports/release-handoff-input.template.md](../../../templates/reports/release-handoff-input.template.md) | Source Verification Report ๋ณต์ˆ˜ ์–‘์‹ |
139
- | [prompts/profiles/release-handoff.md](../../../prompts/profiles/release-handoff.md) | ์ง„์ž… ๊ฒŒ์ดํŠธยทG2 ๊ฐœ์ • |
140
- | [prompts/wizard/prompts.ko.json](../../../prompts/wizard/prompts.ko.json) | ์‹ ๊ทœ/๋ณ€๊ฒฝ prompt ๋ฌธ๊ตฌ |
141
- | [skills/okstra-run/SKILL.md](../../../skills/okstra-run/SKILL.md) | render-bundle ํ˜ธ์ถœ๋ถ€ `--stages`, brief ๋‹จ๊ณ„ ์„œ์ˆ  ๊ฐฑ์‹  |
142
- | [scripts/okstra.sh](../../../scripts/okstra.sh) | `--stages` ์ „๋‹ฌ |
143
- | [docs/kr/cli.md](../../../docs/kr/cli.md), [docs/kr/architecture.md](../../../docs/kr/architecture.md), [docs/task-process/release-handoff.md](../../../docs/task-process/release-handoff.md) | ๊ณ„์•ฝ ์„œ์ˆ  ๊ฐฑ์‹  |
144
-
145
- ## 8. ํ…Œ์ŠคํŠธ
146
-
147
- - ์œ„์ €๋“œ ๋‹จ๊ณ„ ์ ์šฉ ๋งคํŠธ๋ฆญ์Šค: entry 3์ข… = brief ๋‹จ๊ณ„ ๋…ธ์ถœ, downstream 4์ข… = ๋ฏธ๋…ธ์ถœ + ์ž๋™ ์ฃผ์ž… echo. ์‹ ๊ทœ task ๋‹จ๊ณ„ ์ˆœ์„œ(task-type ์ด brief ๋ณด๋‹ค ๋จผ์ €) ํšŒ๊ท€.
148
- - downstream + brief ๋ฏธ๋“ฑ๋ก โ†’ 3-์˜ต์…˜ picker ๋…ธ์ถœ, ๊ฐ ๋ถ„๊ธฐ ๋™์ž‘.
149
- - `S_HANDOFF_STAGE_PICK`: eligible/blocked ๊ตฌ์„ฑ, whole-task ์˜ต์…˜ ๋…ธ์ถœ ์กฐ๊ฑด, ๋ฉ€ํ‹ฐ์„ ํƒ โ†’ `render_args["stages"]` csv.
150
- - `--stages` ๊ฒŒ์ดํŠธ: release-handoff ์™ธ task-type ์˜ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฐ’ ๊ฑฐ๋ถ€, ๋นˆ ๊ฐ’ ํ†ต๊ณผ (๊ธฐ์กด [tests/test_prepare_stage_flag_gate.py](../../../tests/test_prepare_stage_flag_gate.py) ํŒจํ„ด).
151
- - prepare ์ž…๋ ฅ ์ž๋™ ์ƒ์„ฑ: verified ํ–‰ ์ธ์šฉ ์ •ํ™•์„ฑ(๋‹จ์œ„) + subprocess `--render-only` e2e ๋กœ ์ƒ์„ฑ ํŒŒ์ผยทmanifest ๊ฐฑ์‹  ํ™•์ธ.
152
- - profile ๊ณ„์•ฝ: validators ์˜ release-handoff ๊ด€๋ จ ์ฒดํฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐฑ์‹ ๋ถ„ ํ†ต๊ณผ.
153
-
154
- ## 9. ๋ฏธํ•ด๊ฒฐ / ํ›„์†
155
-
156
- - ๋‹ค๋ฅธ phase ์˜ ์ฃฝ์€ input ํ…œํ”Œ๋ฆฟ([render.py:113-118](../../../scripts/okstra_ctl/render.py:113) ํƒœ๊ทธ๋งŒ ์กด์žฌ) ์ •๋ฆฌ ๋˜๋Š” ๋ถ€ํ™œ โ€” ๋ณ„๋„ ๊ณผ์ œ.
157
- - PR ์ƒ์„ฑ ํ›„ stage worktree/branch/registry ์ •๋ฆฌ โ€” ์ด๋ฒˆ ๋ฒ”์œ„์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์™ธ(์‚ฌ์šฉ์ž ๊ฒฐ์ •). ์žฌ๋…ผ์˜ ์‹œ PR ๋ฆฌ๋ทฐ ์ˆ˜์ • ํ๋ฆ„([okstra-run SKILL.md:228](../../../skills/okstra-run/SKILL.md:228))๊ณผ์˜ ์ถฉ๋Œ์„ ๋จผ์ € ํ’€์–ด์•ผ ํ•œ๋‹ค.
158
- - okstra-brief ์ฒด์ธ ๋‹ค์ด์–ด๊ทธ๋žจ([SKILL.md:44-57](../../../skills/okstra-brief/SKILL.md:44))์˜ release-handoff ์ข…๋‹จ ํ‘œ๊ธฐ ์ •ํ•ฉํ™”.
@@ -1,94 +0,0 @@
1
- # Fix Cycle โ€” ์™„๋ฃŒ๋œ task ์˜ ์‚ฌํ›„ ๋ฒ„๊ทธ ํ•ซํ”ฝ์Šค ์ด๋ ฅ ์„ค๊ณ„
2
-
3
- - ๋‚ ์งœ: 2026-06-11
4
- - ์ƒํƒœ: ์„ค๊ณ„ ์Šน์ธ ๋Œ€๊ธฐ
5
- - ๋ฐฐ๊ฒฝ: okstra ๋กœ ์™„๋ฃŒ(release-handoff ๊นŒ์ง€)ํ•œ task ์˜ ์‚ฐ์ถœ๋ฌผ์—์„œ ์ดํ›„ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋Š” ๊ฒฝ์šฐ, ๊ฐ™์€ task-id ์œ„์—์„œ ํ•ซํ”ฝ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ์ˆ˜์ • ์ด๋ ฅ์„ 1๊ธ‰ ๋ ˆ์ฝ”๋“œ๋กœ ๋“ฑ๋กํ•˜๋ฉฐ, ์ดํ›„ brief / final-report / task ๋ธŒ๋ผ์šฐ์ง•์—์„œ ํ•ด๋‹น ์ด๋ ฅ์ด ์ธ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค.
6
-
7
- ## ๊ฒฐ์ • ์š”์•ฝ
8
-
9
- | ๊ฒฐ์ • ์ง€์  | ์„ ํƒ |
10
- |---|---|
11
- | lifecycle ํ˜•ํƒœ | ๊ธฐ์กด phase ์žฌ์ง„์ž… (error-analysis โ†’ planning โ†’ implementation โ†’ โ€ฆ) + ์ด๋ ฅ ๊ณ„์ธต๋งŒ ์‹ ์„ค. ์ „์šฉ hotfix task-type ์—†์Œ |
12
- | ์ง„์ž… ์‹๋ณ„ | ์ž๋™ ๊ฐ์ง€ + okstra-run wizard ํ™•์ธ ๋‹จ๊ณ„ (`fix_cycle_confirm`), CLI ๋Š” `--fix-cycle <yes|no>` |
13
- | ์ด๋ ฅ SSOT | `<task_root>/history/fix-cycles.jsonl` append-only ์ด๋ฒคํŠธ ํ–‰ (consumers.jsonl idiom) |
14
- | ์†Œ๋น„์ฒ˜ | โ‘  ํ›„์† run ์˜ analysis-packet โ‘ก okstra-brief ์ธ์šฉ โ‘ข final-report `## 5.10 Fix History` โ‘ฃ task-manifest / task-index / task-catalog ์š”์•ฝ |
15
-
16
- ## 1. ๊ฐœ๋… ๋ชจ๋ธ
17
-
18
- **fix cycle** ์€ "์™„๋ฃŒ๋œ task ์˜ ๊ธฐ์กด ์‚ฐ์ถœ๋ฌผ์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ฒ„๊ทธ 1๊ฑด์„ ๊ณ ์น˜๋Š” ์žฌ์ง„์ž… run ๋ฌถ์Œ"์ด๋‹ค.
19
-
20
- - id: `fc-<NN>` (task ๋‚ด ๋‹จ์กฐ ์ฆ๊ฐ€, 2์ž๋ฆฌ zero-pad).
21
- - ์ƒํƒœ: `open` โ†’ `closed` ๋‘˜๋ฟ. ์ด๋ฒคํŠธ ํ–‰์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ ๋ณ„๋„ mutable ์ƒํƒœ ํŒŒ์ผ์€ ๋‘์ง€ ์•Š๋Š”๋‹ค.
22
- - ๋Œ€์ƒ ๋งํฌ: ํ”ฝ์Šค ๋Œ€์ƒ์ธ ์ด์ „ final-report ์˜ project-relative ๊ฒฝ๋กœ (`target_report`). open ์‹œ์  task-manifest ์˜ `latestReportPath` ์—์„œ ์ฑ„์šด๋‹ค.
23
- - ์ฆ์ƒ ํ•œ ์ค„(`symptom`): ์žฌ์ง„์ž… brief ์˜ `Request Summary` ์ฒซ ๋ฌธ์žฅ์—์„œ ํŒŒ์ƒํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ์ž…๋ ฅ ์—†์Œ.
24
- - ๋™์‹œ open cycle ์€ task ๋‹น 1๊ฐœ๋กœ ์ œํ•œํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฒ„๊ทธ๋Š” ์ฒซ cycle ์ข…๋ฃŒ ํ›„์— ์—ฐ๋‹ค (KISS).
25
-
26
- ## 2. SSOT ํŒŒ์ผ ๊ณ„์•ฝ โ€” `history/fix-cycles.jsonl`
27
-
28
- ์œ„์น˜: `<task_root>/history/fix-cycles.jsonl`. reader/writer ๋Š” ์‹ ๊ทœ ๋ชจ๋“ˆ `scripts/okstra_ctl/fix_cycles.py` ๋‹จ ํ•œ ๊ณณ์ด๋‹ค. [consumers.py](../../../scripts/okstra_ctl/consumers.py) ์˜ idiom ์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค โ€” append-only + mutex(`run_context` ์˜ mutex ํ—ฌํผ ์žฌ์‚ฌ์šฉ) + last-wins ์ฝ๊ธฐ.
29
-
30
- ์ด๋ฒคํŠธ ํ–‰ 3์ข…:
31
-
32
- ```jsonl
33
- {"event":"opened","cycle":"fc-01","target_report":"<์ƒ๋Œ€๊ฒฝ๋กœ>","symptom":"...","opened_at":"<ISO>"}
34
- {"event":"run","cycle":"fc-01","task_type":"error-analysis","run_seq":3,"run_manifest":"<์ƒ๋Œ€๊ฒฝ๋กœ>"}
35
- {"event":"closed","cycle":"fc-01","closed_by":"release-handoff","report":"<์ƒ๋Œ€๊ฒฝ๋กœ>","closed_at":"<ISO>"}
36
- ```
37
-
38
- - idempotency ํ‚ค: `(cycle, event, run_manifest|None)` ํŠœํ”Œ. ๊ฐ™์€ ํ–‰์€ ์ค‘๋ณต append ๋˜์ง€ ์•Š๋Š”๋‹ค.
39
- - ๊ฒฝ๋กœ ํ•„๋“œ๋Š” run-manifest ์™€ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ธฐ์ค€ ์ƒ๋Œ€๊ฒฝ๋กœ๋งŒ ์ €์žฅํ•œ๋‹ค.
40
- - ํŒŒ์ƒ ์ฝ๊ธฐ API: `open_cycle(rows) -> dict|None`, `summarize(rows) -> dict` (์†Œ๋น„์ฒ˜๋“ค์ด ๊ณต์œ ). `summarize` ์˜ `latest` ๋Š” `{cycle, symptom, targetReport, closedAt}`.
41
-
42
- ## 3. ์ง„์ž…: ์ž๋™ ๊ฐ์ง€ + wizard ํ™•์ธ
43
-
44
- ๊ฐ์ง€ ์กฐ๊ฑด (prepare ์‹œ์ ):
45
-
46
- - ๋Œ€์ƒ task ์˜ `workflow.lastCompletedPhase == "release-handoff"` (done ๊ณ„์—ด ์ƒํƒœ), **๊ทธ๋ฆฌ๊ณ **
47
- - ์ด๋ฒˆ run ์˜ task-type ์ด ๋ถ„์„ entry phase (`requirements-discovery` / `error-analysis` / `implementation-planning`) ์ค‘ ํ•˜๋‚˜์ผ ๋•Œ.
48
- - `improvement-discovery` sidetrack ์€ ์ œ์™ธ.
49
-
50
- ํ™•์ธ UI:
51
-
52
- - okstra-run wizard ์— `fix_cycle_confirm` ๋‹จ๊ณ„ ์‹ ์„ค โ€” [wizard.py](../../../scripts/okstra_ctl/wizard.py) ์˜ `branch_confirm` ๊ณผ ๊ฐ™์€ step-registry ํŒจํ„ด (`required` ์ˆ ์–ด = ๊ฐ์ง€ ์กฐ๊ฑด, `owns` = `fix_cycle_confirmed`).
53
- - ์˜ต์…˜: "๋ฒ„๊ทธ ํ”ฝ์Šค ์‚ฌ์ดํด๋กœ ๊ธฐ๋ก (์ถ”์ฒœ)" / "์ผ๋ฐ˜ ํ›„์† ์ž‘์—…" / "์ง์ ‘ ์ž…๋ ฅ" โ€” okstra-run ํ”„๋กฌํ”„ํŠธ 3-์˜ต์…˜ picker ๊ทœ์น™ ์ค€์ˆ˜.
54
- - CLI ๋น„๋Œ€ํ™” ๊ฒฝ๋กœ(okstra.sh / Node CLI)๋Š” `--fix-cycle <yes|no>` ํ”Œ๋ž˜๊ทธ๋ฅผ [prepare_task_bundle()](../../../scripts/okstra_ctl/run.py) ์ž…๋ ฅ(`PrepareInputs`)์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด wizard ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋›ด๋‹ค. ์„ธ entry-point ๋ชจ๋‘ `prepare_task_bundle` ๋กœ ์ˆ˜๋ ดํ•˜๋Š” ๋‹จ์ผ ์ฐธ์กฐ ๊ทœ์น™์„ ์œ ์ง€ํ•˜๋ฉฐ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
55
-
56
- ํ™•์ธ๋˜๋ฉด prepare ๊ฐ€ `opened` ํ–‰์„ ๊ธฐ๋กํ•œ๋‹ค.
57
-
58
- ## 4. run ๋ถ€์ฐฉ๊ณผ ์ข…๋ฃŒ
59
-
60
- - cycle ์ด `open` ์ธ ๋™์•ˆ ๊ฐ™์€ task ์—์„œ ๋„๋Š” **๋ชจ๋“ ** run ์˜ prepare ๊ฐ€ `run` ํ–‰์„ append ํ•œ๋‹ค (task-type ๋ถˆ๋ฌธ โ€” ํ•ซํ”ฝ์Šค ์‚ฌ์ดํด์˜ implementation / final-verification / release-handoff ํฌํ•จ).
61
- - run-manifest ์™€ timeline ํ•ญ๋ชฉ์— `fixCycleId` ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค (open cycle ์—†์œผ๋ฉด ํ•„๋“œ ์ƒ๋žต).
62
- - ์ข…๋ฃŒ: release-handoff ๊ฒฐ๊ณผ๊ฐ€ ๊ธฐ๋ก๋˜์–ด workflow ๊ฐ€ `done-or-follow-up` ์— ๋„๋‹ฌํ•˜๋Š” ์‹œ์ ์— `closed` ํ–‰์„ append ํ•œ๋‹ค ([workflow.py](../../../scripts/okstra_ctl/workflow.py) ์˜ `DEFAULT_NEXT_PHASE`). final-verification `accepted` ๋งŒ์œผ๋กœ๋Š” ๋‹ซ์ง€ ์•Š๋Š”๋‹ค โ€” ์•„์ง release ๊ฐ€ ๋‚˜๊ฐ€์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ.
63
-
64
- ## 5. ์†Œ๋น„์ฒ˜ 4๊ณณ โ€” ์ „๋ถ€ ํŒŒ์ƒ ๋ทฐ
65
-
66
- ์“ฐ๊ธฐ 1๊ณณ(`fix_cycles.py`), ์ฝ๊ธฐ N๊ณณ ์›์น™. ๋ชจ๋“  ์†Œ๋น„์ฒ˜๋Š” `fix_cycles.summarize()` ๊ฐ€ ๋งŒ๋“  ๊ฐ™์€ ์š”์•ฝ์„ ์‚ฌ์šฉํ•œ๋‹ค.
67
-
68
- 1. **analysis-packet**: [analysis_packet.py](../../../scripts/okstra_ctl/analysis_packet.py) ์˜ `build_analysis_packet()` ์ด fix-cycles.jsonl ์กด์žฌ ์‹œ `## Fix History` ์„น์…˜์„ packet ์— ์ฃผ์ž…ํ•œ๋‹ค โ€” open cycle ์ƒ์„ธ(๋Œ€์ƒ ๋ณด๊ณ ์„œยท์ฆ์ƒยท๋ถ€์ฐฉ run ๋ชฉ๋ก) + closed cycle ํ•œ ์ค„ ๋ชฉ๋ก. lead / worker ๊ฐ€ ๋ถ„์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š”๋‹ค.
69
- 2. **task-manifest / task-index / task-catalog**: manifest ์— ํŒŒ์ƒ ์š”์•ฝ ํ•„๋“œ `fixCycles` (`{count, openCycleId|null, latest: {cycle, symptom, targetReport, closedAt}}`), task-index ์™€ `.okstra/discovery/task-catalog.json` ํ•ญ๋ชฉ์— ๊ฐ™์€ ์š”์•ฝ 1์ค„. manifest/index ์ž‘์„ฑ ๊ฒฝ๋กœ([render.py](../../../scripts/okstra_ctl/render.py))์—์„œ ํ•จ๊ป˜ ๊ฐฑ์‹ ํ•œ๋‹ค.
70
- 3. **final-report**: [final-report.template.md](../../../templates/reports/final-report.template.md) ์— ์กฐ๊ฑด๋ถ€ `## 5.10 Fix History` ์„น์…˜ ์‹ ์„ค (5.4~5.9 ์‚ฌ์šฉ ์ค‘ ํ™•์ธ). fix cycle ์— ๋ถ€์ฐฉ๋œ run ์˜ ๋ณด๊ณ ์„œ์— cycle id ยท ๋Œ€์ƒ ๋ณด๊ณ ์„œ ยท ์ฆ์ƒ ยท cycle ๋‚ด ์„ ํ–‰ run ๋ชฉ๋ก์ด ๋“ค์–ด๊ฐ„๋‹ค. `final_report_schema.py` ์— ๋Œ€์‘ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
71
- 4. **okstra-brief**: [skills/okstra-brief/SKILL.md](../../../skills/okstra-brief/SKILL.md) Step 3 (domain alignment scan) ์— "๋Œ€์ƒ task ์˜ `history/fix-cycles.jsonl` ์ด ์กด์žฌํ•˜๋ฉด `summarize` ์š”์•ฝ์„ ์ฝ์–ด brief ์˜ `Task Continuity Notes` ์— ์ธ์šฉ" ์ง€์‹œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
72
-
73
- ## 6. ๊ฐ•์ œ ์ง€์  (์„ ์–ธ โ‰  ๊ฐ•์ œ)
74
-
75
- | ๊ณ„์•ฝ | ๊ฐ•์ œ ์œ„์น˜ |
76
- |---|---|
77
- | ํ–‰ ์Šคํ‚ค๋งˆ ยท idempotency ยท ๋‹จ์ผ open cycle | `fix_cycles.py` ์ฝ”๋“œ + `tests/test_okstra_fix_cycles.py` |
78
- | `## 5.10 Fix History` ์„น์…˜ ํ˜•ํƒœ | ๊ธฐ์กด report validator ๊ฒฝ๋กœ (`validators/`) ์— ๊ฒ€์‚ฌ ์ถ”๊ฐ€ |
79
- | wizard ๋‹จ๊ณ„ ยท `--fix-cycle` ํ”Œ๋ž˜๊ทธ | ๊ธฐ์กด wizard / prepare ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํŒจํ„ด์œผ๋กœ ์ปค๋ฒ„ |
80
- | ๊ฐ์ง€ ์กฐ๊ฑด (done + entry phase) | `prepare_task_bundle` ๋‹จ์œ„ ํ…Œ์ŠคํŠธ |
81
-
82
- ## 7. ๋ฌธ์„œ
83
-
84
- - `docs/kr/architecture.md` โ€” "Phase ๊ฐ„ ์ •๋ณด ์ „๋‹ฌ" ์ธ๊ทผ์— "Fix cycle (์‚ฌํ›„ ๋ฒ„๊ทธ ํ•ซํ”ฝ์Šค ์ด๋ ฅ)" ์ ˆ ์ถ”๊ฐ€, storage model ํŠธ๋ฆฌ์— `history/fix-cycles.jsonl` ๋ฐ˜์˜.
85
- - `docs/kr/cli.md` โ€” `--fix-cycle` ํ”Œ๋ž˜๊ทธ.
86
- - `CHANGES.md` โ€” `์‚ฌ์šฉ์ž ์˜ํ–ฅ:` ๋ผ์ธ ํฌํ•จ ํ•ญ๋ชฉ ์ถ”๊ฐ€.
87
- - ์ „๋ถ€ ํ•œ๊ตญ์–ด.
88
-
89
- ## ๋น„๋ชฉํ‘œ
90
-
91
- - ์ „์šฉ hotfix task-type / fast path ์‹ ์„ค (phase gate ์šฐํšŒ ์—†์Œ).
92
- - task ๋‹น ๋™์‹œ ๋‹ค์ค‘ open cycle.
93
- - ๊ธฐ์กด timeline.json / run-manifest ์˜ ๊ตฌ์กฐ ๋ณ€๊ฒฝ (`fixCycleId` ํ•„๋“œ 1๊ฐœ ์ถ”๊ฐ€ ์™ธ).
94
- - ๊ณผ๊ฑฐ ์™„๋ฃŒ task ์˜ ์ด๋ ฅ ์†Œ๊ธ‰ backfill.
@@ -1,89 +0,0 @@
1
- # wizard whole-task final-verification ๋…ธ์ถœ ์„ค๊ณ„
2
-
3
- - ์ž‘์„ฑ์ผ: 2026-06-11
4
- - ์ƒํƒœ: ์„ค๊ณ„ ์Šน์ธ๋จ (์‚ฌ์šฉ์ž ์Šน์ธ 2026-06-11)
5
- - ์„ ํ–‰: [final-verification-whole-task-gate-design.md](2026-06-06-final-verification-whole-task-gate-design.md), ์ปค๋ฐ‹ `54b9482` (stage worktree ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ์œผ๋กœ ์œ„์ €๋“œ ๋‹จ์ˆœํ™”)
6
-
7
- ## 1. ๋ฐฐ๊ฒฝ / ๋ฌธ์ œ
8
-
9
- `final-verification` ์€ ๋‘ ๊ฒ€์ฆ ๋ชจ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค โ€” (A) ์ „์ฒด-task ๋ชจ๋“œ(๋ชจ๋“  stage ๋จธ์ง€ ํ›„ ํ•œ ๋ฒˆ), (B) ๋‹จ๋…-stage ๋ชจ๋“œ(๊ฒฉ๋ฆฌ worktree์—์„œ ๊ทธ stage๋งŒ). ์ด ๋‘ ๋ชจ๋“œ์™€ ์ž๋™ target ํ•ด์†Œ๋Š” prepare ๋ ˆ์ด์–ด์— ์ด๋ฏธ ๊ตฌํ˜„๋ผ ์žˆ๋‹ค([final-verification-whole-task-gate-design.md](2026-06-06-final-verification-whole-task-gate-design.md)).
10
-
11
- ์ปค๋ฐ‹ `54b9482` ์€ ๋‹จ๋…-stage ์œ„์ €๋“œ UX๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋ฉด์„œ(`base-ref`/branch-confirm ์ƒ๋žต, ๋ช…์‹œ stage ๊ฐ•์ œ) **์œ„์ €๋“œ์—์„œ ์ „์ฒด-task ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•  ๊ธธ์„ ๋ง‰์•˜๋‹ค**:
12
-
13
- - [`_stage_auto_allowed`](../../../scripts/okstra_ctl/wizard.py:778) ๊ฐ€ `implementation` ์—์„œ๋งŒ `True` โ†’ final-verification stage picker ์— ์ „์ฒด ์˜ต์…˜์ด ๋œจ์ง€ ์•Š๋Š”๋‹ค.
14
- - [`_submit_stage_pick`](../../../scripts/okstra_ctl/wizard.py:1539) ์™€ [`render_args`](../../../scripts/okstra_ctl/wizard.py:2799) ๊ฐ€ final-verification + ๋น„-๋ช…์‹œ-stage ๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค.
15
-
16
- ๊ฒฐ๊ณผ: ์ „์ฒด-task final-verification ์€ CLI `okstra.sh --stage auto` (๋˜๋Š” stage ์ƒ๋žต)๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , okstra-run ์œ„์ €๋“œ ์‚ฌ์šฉ์ž๋Š” ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค. prepare ๋Š” ์ด๋ฏธ ์ „์ฒด-task ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ([run.py:1829](../../../scripts/okstra_ctl/run.py:1829), [run.py:1533](../../../scripts/okstra_ctl/run.py:1533)) **๋ง‰ํžŒ ๊ณณ์€ ์œ„์ €๋“œ ๋ ˆ์ด์–ด๋ฟ**์ด๋‹ค.
17
-
18
- ## 2. ๋ชฉํ‘œ / ๋น„๋ชฉํ‘œ
19
-
20
- ๋ชฉํ‘œ:
21
- - okstra-run ์œ„์ €๋“œ์˜ final-verification stage picker ์—์„œ **์ „์ฒด-task ๊ฒ€์ฆ์„ ๋ช…์‹œ ํ•ญ๋ชฉ์œผ๋กœ ์„ ํƒ** ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
22
- - picker ์— stage ๋ณ„ **done ์ƒํƒœ๋ฅผ ํ‘œ์‹œ**ํ•ด, ์ „์ฒด-task ๊ฐ€ ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ ์–ด๋А stage ๊ฐ€ ๋ฏธ์™„์ธ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๋กœ ๋ณธ๋‹ค.
23
- - prepare ๊ณ„์•ฝ(CLI `--stage`)์„ **๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” ์œ„์ €๋“œ๊ฐ€ ๊ธฐ์กด ์ „์ฒด-task ํŠธ๋ฆฌ๊ฑฐ(๋นˆ stage)๋ฅผ emit ํ•œ๋‹ค.
24
-
25
- ๋น„๋ชฉํ‘œ:
26
- - `implementation` ์˜ `auto` ํ† ํฐ ์˜๋ฏธ("๊ฐ€์žฅ ๋‚ฎ์€ ready stage")๋ฅผ final-verification ์—์„œ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. picker ๋ผ๋ฒจยท๋‚ด๋ถ€ ๊ฐ’ ์–ด๋””์—๋„ `auto` ๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
27
- - ๋จธ์ง€/clean/active ์ „์ œ์˜ ์œ„์ €๋“œ ์‚ฌ์ „ ๊ฒ€์‚ฌ โ€” ์ด๋Š” prepare ์˜ PrepareError ๊ฒŒ์ดํŠธ์— ์œ„์ž„ํ•œ๋‹ค(ยง4).
28
- - ์ž๋™ stage ๋จธ์ง€(์—ฌ์ „ํžˆ ์‚ฌ์šฉ์ž ์ˆ˜๋™ ๋จธ์ง€).
29
- - prepare / `_reserve_final_verification_target` / target ํ•ด์†Œ ๋กœ์ง ๋ณ€๊ฒฝ.
30
-
31
- ## 3. ๋…ธ์ถœ ํ˜•ํƒœ โ€” stage picker ๋ช…์‹œ ํ•ญ๋ชฉ
32
-
33
- [`_build_stage_pick`](../../../scripts/okstra_ctl/wizard.py:1494) ๊ฐ€ final-verification ์ผ ๋•Œ:
34
-
35
- 1. ๊ฐ stage ํ•ญ๋ชฉ ๋ผ๋ฒจ์— **done ๋งˆํ‚น**์„ ๋ถ™์ธ๋‹ค. ์˜ˆ: `1: <์ œ๋ชฉ> [done]` / `2: <์ œ๋ชฉ> [๋ฏธ์™„]`.
36
- 2. **๋ชจ๋“ ** Stage Map stage ๊ฐ€ done ์ด๋ฉด picker ๋งจ ์œ„์— `์ „์ฒด task ๊ฒ€์ฆ` ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. done ์ด ์•„๋‹Œ stage ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ์ด ํ•ญ๋ชฉ์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” picker ์˜ stage ๋ณ„ `[๋ฏธ์™„]` ๋งˆํ‚น์ด ๊ทธ๋Œ€๋กœ ๋ณด์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์™œ ์ „์ฒด ๊ฒ€์ฆ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€ ์ž๋ช…ํ•˜๋‹ค.
37
-
38
- ์ด ๊ตฌ์กฐ๋Š” "stage ๊ฐ€ done ์ด ์•„๋‹Œ ๊ฑธ ๋ณด์—ฌ์ค€๋‹ค" ๋Š” ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜๋ฉด์„œ, ์ „์ฒด-task ์„ ํƒ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋„ ๊ฐ™์€ ํ™”๋ฉด์—์„œ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.
39
-
40
- ## 4. done ์ƒํƒœ ๋ฐ์ดํ„ฐ์› โ€” git ํ˜ธ์ถœ ์—†์Œ
41
-
42
- ์œ„์ €๋“œ๊ฐ€ ์ฝ๋Š” ๊ฒƒ์€ prepare ์™€ ๋™์ผํ•œ SSOT ์ธ `consumers.jsonl` ์˜ `status:done` ํ–‰๋ฟ์ด๋‹ค. git ์ƒํƒœ(๋จธ์ง€/clean)๋Š” ์œ„์ €๋“œ๊ฐ€ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
43
-
44
- - `plan_run_root` ๋„์ถœ: `Path(approved_plan_path).resolve().parents[1]` ([run.py:1525](../../../scripts/okstra_ctl/run.py:1525) ์™€ ๋™์ผ ๊ทœ์น™).
45
- - done ํ–‰: `backfill_done_from_carry(plan_run_root)` โ†’ `read_consumers(plan_run_root)` โ†’ `latest_done_by_stage(rows)` ([consumers.py:24](../../../scripts/okstra_ctl/consumers.py:24), [consumers.py:37](../../../scripts/okstra_ctl/consumers.py:37), [consumers.py:182](../../../scripts/okstra_ctl/consumers.py:182)).
46
- - Stage Map: ๊ธฐ์กด `_build_stage_pick` ์ด ์ด๋ฏธ ์Šน์ธ plan ์„ `_parse_stage_map` ์œผ๋กœ ํŒŒ์‹ฑํ•œ๋‹ค([wizard.py:1499](../../../scripts/okstra_ctl/wizard.py:1499)). ๊ทธ stage ๋ฒˆํ˜ธ ์ง‘ํ•ฉ๊ณผ done ์ง‘ํ•ฉ์„ ๋น„๊ตํ•œ๋‹ค.
47
-
48
- ์ฑ…์ž„ ๋ถ„๋‹ด:
49
- - **์œ„์ €๋“œ**: done ์—ฌ๋ถ€๋งŒ ์‚ฌ์ „ ํ‘œ์‹œ(ํŒŒ์ผ ์ฝ๊ธฐ). ์ „์ฒด-task ํ•ญ๋ชฉ ๋…ธ์ถœ ๊ฒŒ์ดํŠธ.
50
- - **prepare**: ๋จธ์ง€(`head_commit` ์ด task worktree HEAD ์˜ ancestor) ยท clean ยท task-key worktree active ๋ฅผ ์ตœ์ข… ๊ฐ•์ œ. ๋ฏธ์ถฉ์กฑ์ด๋ฉด ๊ธฐ์กด PrepareError ๋กœ ์–ด๋А stage ๊ฐ€ ๋ฏธ๋จธ์ง€์ธ์ง€ ์•ˆ๋‚ด([run.py:587](../../../scripts/okstra_ctl/run.py:587), [run.py:594](../../../scripts/okstra_ctl/run.py:594), [worktree.py:655](../../../scripts/okstra_ctl/worktree.py:655)).
51
-
52
- ์œ„์ €๋“œ๊ฐ€ git ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ picker ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋ณ๊ณ , ์ „์ œ ๊ฐ•์ œ๋Š” ํ•œ ๊ณณ(prepare)์— ๋‹จ์ผํ™”๋œ๋‹ค.
53
-
54
- ## 5. prepare ๊ณ„์•ฝ โ€” ๋นˆ stage emit (๊ณ„์•ฝ ๋ฌด๋ณ€๊ฒฝ)
55
-
56
- ์ „์ฒด-task ์„ ํƒ์˜ ์œ„์ €๋“œ ๋‚ด๋ถ€ ํ‘œํ˜„๊ณผ prepare ๋กœ ๋„˜๊ธฐ๋Š” ๊ฐ’์„ ๋ถ„๋ฆฌํ•œ๋‹ค:
57
-
58
- - ์œ„์ €๋“œ ๋‚ด๋ถ€: `selected_stage` ์— ๋ช…์‹œ sentinel(์˜ˆ: `"whole-task"`)์„ ๋‹ด๋Š”๋‹ค.
59
- - [`render_args`](../../../scripts/okstra_ctl/wizard.py:2792): ์ด sentinel ์„ **๋นˆ stage(`""`)** ๋กœ ๋ณ€ํ™˜ํ•ด prepare ์— ๋„˜๊ธด๋‹ค.
60
-
61
- prepare ๋Š” ๋นˆ/`auto` stage ๋ฅผ ์ด๋ฏธ ์ „์ฒด-task ๋กœ ํ•ด์„ํ•œ๋‹ค(`if inp.stage and inp.stage != "auto"` ์˜ else ๋ถ„๊ธฐ, [run.py:1829](../../../scripts/okstra_ctl/run.py:1829) ยท [run.py:1533](../../../scripts/okstra_ctl/run.py:1533)). ๋”ฐ๋ผ์„œ CLI `--stage` ๊ณ„์•ฝยทvalidatorยทprepare ๋ถ„๊ธฐ ๋ณ€๊ฒฝ์ด ์ „ํ˜€ ์—†๊ณ , ํ‘œ๋ฉด ์–ด๋””์—๋„ `auto` ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
62
-
63
- base-ref / branch-confirm skip ์€ ํ˜„ํ–‰ ์œ ์ง€([`_base_ref_required`](../../../scripts/okstra_ctl/wizard.py:766), [`_branch_confirm_required`](../../../scripts/okstra_ctl/wizard.py:774)) โ€” ์ „์ฒด-taskยท๋‹จ๋…-stage ๋ชจ๋‘ base ๊ฐ€ prepare ์—์„œ ์ž๋™ ํ•ด์†Œ๋˜๋ฏ€๋กœ ์œ„์ €๋“œ๊ฐ€ base ๋ฅผ ๋ฌผ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
64
-
65
- ## 6. ๊ฒŒ์ดํŠธ ํ•จ์ˆ˜ ์กฐ์ •
66
-
67
- | ํ•จ์ˆ˜ | ํ˜„์žฌ | ๋ณ€๊ฒฝ |
68
- |---|---|---|
69
- | [`_stage_auto_allowed`](../../../scripts/okstra_ctl/wizard.py:778) | `task_type == "implementation"` | final-verification ์—์„œ "์ „์ฒด task" ํ•ญ๋ชฉ ๋…ธ์ถœ์„ **์ „ stage done** ์กฐ๊ฑด์œผ๋กœ ํ—ˆ์šฉ. (implementation ์˜ `auto` ์™€ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ํ•จ์ˆ˜๋ช…/์˜๋„ ์žฌ์ •์˜ ๋˜๋Š” final-verification ์ „์šฉ ํ—ฌํผ ์‹ ์„ค) |
70
- | [`_submit_stage_pick`](../../../scripts/okstra_ctl/wizard.py:1539) | `auto` ๋งŒ ํŠน์ˆ˜ ์ฒ˜๋ฆฌ, final-verification+auto ๊ฑฐ๋ถ€ | "์ „์ฒด task" sentinel ์ˆ˜์šฉ |
71
- | [`render_args`](../../../scripts/okstra_ctl/wizard.py:2799) | final-verification + (๋นˆ/auto) โ†’ `WizardError` | sentinel โ†’ ๋นˆ stage ๋ณ€ํ™˜(ยง5); ๋‹จ๋…์€ ๊ธฐ์กด๋Œ€๋กœ ๋ช…์‹œ ๋ฒˆํ˜ธ |
72
- | [`confirmation_block`](../../../scripts/okstra_ctl/wizard.py:2872) | stage ๊ฐ’ ๊ทธ๋Œ€๋กœ ํ‘œ๊ธฐ | sentinel ์„ ์‚ฌ๋žŒ์ด ์ฝ์„ ๋ผ๋ฒจ("์ „์ฒด task")๋กœ ํ‘œ๊ธฐ |
73
-
74
- ## 7. ํ”„๋กฌํ”„ํŠธ (prompts/wizard/prompts.ko.json)
75
-
76
- `stage_pick` ํ”„๋กฌํ”„ํŠธ์— ์ „์ฒด-task ํ•ญ๋ชฉ ๋ผ๋ฒจ๊ณผ stage done/๋ฏธ์™„ ๋งˆํ‚น ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•œ๋‹ค. `54b9482` ๊ฐ€ ์ œ๊ฑฐํ•œ `auto` ๋ผ๋ฒจ์€ ๋ณต์›ํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์ƒˆ ๋ผ๋ฒจ์€ `auto` ๊ฐ€ ์•„๋‹Œ "์ „์ฒด task ๊ฒ€์ฆ" ๊ณ„์—ด ๋ฌธ์ž์—ด์ด๋‹ค.
77
-
78
- ## 8. ํ…Œ์ŠคํŠธ
79
-
80
- - `tests/test_wizard_stage_pick.py`: final-verification + ์ „ stage done โ†’ "์ „์ฒด task" ํ•ญ๋ชฉ ๋…ธ์ถœ / ์ผ๋ถ€ ๋ฏธ์™„ โ†’ ๋ฏธ๋…ธ์ถœ + ํ•ด๋‹น stage `[๋ฏธ์™„]` ๋งˆํ‚น.
81
- - `tests/test_wizard_final_verification_stage.py`: "์ „์ฒด task" ์„ ํƒ โ†’ `render_args` ๊ฐ€ ๋นˆ stage emit; ๋‹จ๋… ์„ ํƒ โ†’ ๋ช…์‹œ ๋ฒˆํ˜ธ emit.
82
- - `tests/test_okstra_ctl_wizard.py`: ์ „์ฒด-task ๊ฒฝ๋กœ์—์„œ๋„ base-ref/branch-confirm ๋‹จ๊ณ„๊ฐ€ ์ƒ๋žต๋˜๋Š”์ง€(ํ˜„ํ–‰ ๋ถˆ๋ณ€ ํšŒ๊ท€).
83
- - prepare ์ธก ํšŒ๊ท€๋Š” `tests/test_final_verification_target.py` ๊ธฐ์กด ์ผ€์ด์Šค๋กœ ์ถฉ๋ถ„(prepare ๊ณ„์•ฝ ๋ฌด๋ณ€๊ฒฝ).
84
-
85
- ## 9. ๋น„๋ณ€๊ฒฝ ํ™•์ธ (ํšŒ๊ท€ ๊ฐ€๋“œ)
86
-
87
- - prepare ๋ถ„๊ธฐยท`_reserve_final_verification_target`ยทtarget ํ•ด์†Œ: ๋ณ€๊ฒฝ ์—†์Œ.
88
- - CLI `okstra.sh --stage`: ๋ณ€๊ฒฝ ์—†์Œ(๋นˆ stage = ์ „์ฒด-task ๋Š” ๊ธฐ์กด ๊ณ„์•ฝ).
89
- - ๋‹จ๋…-stage ์œ„์ €๋“œ UX(`54b9482` ๋„์ž…๋ถ„): ๋ณ€๊ฒฝ ์—†์Œ.