okstra 0.27.0 → 0.29.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.
- package/bin/okstra +1 -0
- package/docs/superpowers/plans/2026-05-17-dual-format-final-report.md +167 -0
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/claude-worker.md +6 -5
- package/runtime/agents/workers/codex-worker.md +5 -4
- package/runtime/agents/workers/gemini-worker.md +5 -4
- package/runtime/agents/workers/report-writer-worker.md +10 -3
- package/runtime/bin/okstra-render-report-views.py +129 -0
- package/runtime/prompts/launch.template.md +1 -1
- package/runtime/prompts/profiles/_common-contract.md +12 -4
- package/runtime/prompts/profiles/implementation-planning.md +1 -1
- package/runtime/python/okstra_ctl/report_views.py +701 -0
- package/runtime/python/okstra_token_usage/cli.py +9 -2
- package/runtime/python/okstra_token_usage/report.py +32 -3
- package/runtime/skills/okstra-convergence/SKILL.md +2 -2
- package/runtime/skills/okstra-report-writer/SKILL.md +25 -8
- package/runtime/skills/okstra-team-contract/SKILL.md +16 -15
- package/runtime/templates/reports/final-report.template.md +398 -211
- package/runtime/templates/reports/report.css +151 -0
- package/runtime/templates/reports/report.js +163 -0
- package/runtime/templates/reports/user-response.template.md +69 -0
- package/runtime/validators/lib/fixtures.sh +76 -2
- package/runtime/validators/validate-report-views.py +283 -0
- package/runtime/validators/validate-run.py +564 -4
- package/runtime/validators/validate-workflow.sh +4 -0
- package/src/install.mjs +1 -0
- package/src/render-views.mjs +67 -0
|
@@ -11,40 +11,75 @@ project-id: "{{PROJECT_ID}}"
|
|
|
11
11
|
taskType: "{{FM_TASK_TYPE}}"
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
<!--
|
|
15
|
+
Template authoring notes (NOT rendered to readers — HTML comments).
|
|
16
|
+
|
|
17
|
+
- All `<!-- ... -->` blocks in this file are author-side guidance. Do NOT
|
|
18
|
+
convert them into Markdown quote blocks (`> …`) in the produced report.
|
|
19
|
+
- "Conditional block" guards: where a section heading is wrapped in a
|
|
20
|
+
`<!-- RENDER_IF: <condition> -->` … `<!-- /RENDER_IF -->` pair, the
|
|
21
|
+
report-writer MUST delete the entire heading + body when the condition is
|
|
22
|
+
false. Leaving a section heading with placeholder body ("No prior X" /
|
|
23
|
+
"Not applicable") is a contract violation that the validator will catch.
|
|
24
|
+
- Section ordering rule: Verdict Card → Approval Block (planning only) →
|
|
25
|
+
Carry-in (only if non-empty) → Summary/Ticket/Status → Token table →
|
|
26
|
+
§1–§7. The reader's first 30 lines must answer "what was decided" and
|
|
27
|
+
"what do I do next"; deep evidence lives further down.
|
|
28
|
+
-->
|
|
29
|
+
|
|
14
30
|
# {{TASK_KEY}} - Multi-Agent Cross Verification Final Report
|
|
31
|
+
|
|
15
32
|
- Created at: {{RUN_TIMESTAMP_ISO}}
|
|
16
33
|
- Task Key: {{TASK_KEY}}
|
|
17
34
|
- Task Type: {{TASK_TYPE}}
|
|
18
35
|
- Report Owner: `Claude lead`
|
|
36
|
+
- Report Author: `<Report writer worker | Claude lead (release-handoff or recorded-fallback only)>`
|
|
19
37
|
- Lead Model: `{{LEAD_MODEL}}`
|
|
20
38
|
- Okstra Version: `{{OKSTRA_VERSION}}`
|
|
21
|
-
|
|
39
|
+
|
|
40
|
+
## Verdict Card
|
|
41
|
+
|
|
42
|
+
한눈에 보는 결과 카드. 본 표의 모든 값은 `## 2. Final Verdict` 및 `## 6. Recommended Next Steps` 의 권위 있는 값과 정확히 일치해야 합니다. 두 곳의 값이 다르면 본 카드를 깨진 인덱스로 간주합니다.
|
|
43
|
+
|
|
44
|
+
| 항목 | 값 |
|
|
45
|
+
|------|----|
|
|
46
|
+
| Final Conclusion | <한 줄 결론 — `## 2.` 의 Final Conclusion 셀과 동일> |
|
|
47
|
+
| Verdict Token | `<accepted / conditional-accept / blocked / not-applicable>` |
|
|
48
|
+
| Direction | `<continue-investigation / begin-implementation / approve / reject / hold>` |
|
|
49
|
+
| Approval Required? | `<yes — User Approval Request 블록 참조 / no>` |
|
|
50
|
+
| Next Step | <한 줄 — `## 6.` 첫 항목과 동일> |
|
|
51
|
+
|
|
52
|
+
<!-- RENDER_IF: task-type == implementation-planning -->
|
|
22
53
|
|
|
23
54
|
## User Approval Request (사용자 승인 게이트)
|
|
24
55
|
|
|
25
|
-
|
|
26
|
-
>
|
|
27
|
-
> 다음 `implementation` run은 아래 체크박스가 `[x]`로 표시되어 있을 때에만 진입할 수 있습니다 (`okstra_ctl.run._validate_approved_plan` 가 이 마커를 line-anchored 정규식으로 검사하여 통과/거부합니다). 본문(`Sections 1`–`4.5`)을 끝까지 읽고, `## 5. Clarification Items` 표에서 `Blocks=approval` 인 모든 행이 `Status` 가 `resolved` 또는 `obsolete` 인지 확인한 뒤 승인해 주세요. 한 행이라도 `open`/`answered` 로 남아 있으면 `Approved` 마커를 새기지 마십시오 — 향후 `validate-run.py` 가 이 정합성을 자동 검사할 예정입니다.
|
|
56
|
+
다음 `implementation` run 은 아래 체크박스가 `[x]` 일 때에만 진입할 수 있습니다 (`okstra_ctl.run._validate_approved_plan` 가 line-anchored 정규식으로 검사). `## 5. Clarification Items` 표에서 `Blocks=approval` 인 모든 행이 `resolved` / `obsolete` 가 된 뒤 승인해 주세요.
|
|
28
57
|
|
|
29
|
-
- 승인
|
|
30
|
-
- 승인 후 다음 단계
|
|
31
|
-
- Claude Code
|
|
58
|
+
- 승인 체크박스 (사용자가 직접 편집): `- [ ] Approved`
|
|
59
|
+
- 승인 후 다음 단계 명령 (수동 편집 방식):
|
|
60
|
+
- Claude Code: `/okstra-run task-key={{TASK_KEY}} task-type=implementation approved-plan=<이 보고서 경로>`
|
|
32
61
|
- 별도 터미널: `scripts/okstra.sh --task-key {{TASK_KEY}} --task-type implementation --approved-plan <이 보고서 경로>`
|
|
33
|
-
- 승인 + 실행 한 번에 (
|
|
34
|
-
- Claude Code
|
|
62
|
+
- 승인 + 실행 한 번에 (진입 명령 자체를 승인 의사로):
|
|
63
|
+
- Claude Code: `/okstra-run task-key={{TASK_KEY}} task-type=implementation approved-plan=<이 보고서 경로> approve`
|
|
35
64
|
- 별도 터미널: `scripts/okstra.sh --task-key {{TASK_KEY}} --task-type implementation --approved-plan <이 보고서 경로> --approve`
|
|
36
|
-
|
|
37
|
-
|
|
65
|
+
- 보류·거부: 체크박스를 `[ ]` 로 두고 `--approve` 를 사용하지 마세요. 필요 변경은 `## 5.` 표에 `Blocks=approval` 행으로 등록한 뒤 같은 phase 를 재실행합니다.
|
|
66
|
+
|
|
67
|
+
<!-- /RENDER_IF -->
|
|
68
|
+
|
|
69
|
+
<!-- RENDER_IF: CLARIFICATION_RESPONSE_RELATIVE_PATH is non-empty
|
|
70
|
+
When empty, DELETE this entire `## 0.` heading and body. The validator
|
|
71
|
+
fails an empty Section 0 stub ("No prior clarification was provided"). -->
|
|
38
72
|
|
|
39
73
|
## 0. Clarification Response Carried In From Previous Run
|
|
74
|
+
|
|
40
75
|
- Source file: `{{CLARIFICATION_RESPONSE_RELATIVE_PATH}}`
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
|
|
76
|
+
- 이전 보고서의 `## 5. Clarification Items` 표 매 행(`C-001`, `C-002`, …) 을 새 증거에 비추어 검토하고, 각 행의 `Status` 를 `resolved` 또는 `obsolete` 로 갱신한 뒤 본 run 의 `## 5.` 표에 carry-in 합니다. 해소 근거(파일:라인 / 로그 / 워커 결과) 를 함께 인용합니다.
|
|
77
|
+
|
|
78
|
+
<!-- /RENDER_IF -->
|
|
44
79
|
|
|
45
80
|
## Summary of the Problem or Verification Target
|
|
46
81
|
|
|
47
|
-
3~5
|
|
82
|
+
3~5 개 row 로 핵심 문제·요구사항·검증 대상을 표로 정리합니다. brief, 소스 자료, worker 결과를 근거로 작성합니다.
|
|
48
83
|
|
|
49
84
|
| ID | Ticket ID | 한 줄 요약 | 출처 (brief/source/worker) |
|
|
50
85
|
|----|-----------|------------|----------------------------|
|
|
@@ -52,24 +87,20 @@ taskType: "{{FM_TASK_TYPE}}"
|
|
|
52
87
|
|
|
53
88
|
## Ticket Coverage
|
|
54
89
|
|
|
55
|
-
|
|
90
|
+
본 run 이 다룬 ticket 의 역방향 인덱스. 본문 항목들은 모두 `Ticket ID` 컬럼 또는 `[TICKETID: <id>]` 태그로 ticket 과 묶여 있습니다.
|
|
56
91
|
|
|
57
|
-
-
|
|
58
|
-
- 다중 ticket
|
|
92
|
+
- 단일 ticket run 인 경우: 표 대신 다음 한 줄 — `- Single ticket run: <TICKET-or-task-fallback>`
|
|
93
|
+
- 다중 ticket 이거나 `Issue / Ticket` 이 비어 `Task ID` 폴백이 섞여 있는 경우: 표를 채웁니다.
|
|
59
94
|
|
|
60
95
|
| Ticket ID | 등장 섹션 | 관련 항목 IDs |
|
|
61
96
|
|-----------|-----------|---------------|
|
|
62
97
|
| `<TICKET-123>` | `1.1, 3.1, 4.5.4` | `F-001, F-003, A1` |
|
|
63
98
|
|
|
64
|
-
규칙:
|
|
65
|
-
|
|
66
|
-
- `Ticket ID` 컬럼은 본문에서 등장한 ticket 키와 정확히 동일한 문자열을 사용합니다. `Issue / Ticket`이 비어 폴백된 경우 `Task ID` 값을 prefix 없이 그대로 적습니다 (예: `8852`). 어느 쪽으로도 식별 불가한 경우 `unknown`을 사용합니다.
|
|
67
|
-
- `등장 섹션`은 본 보고서의 섹션 번호를 콤마로 구분합니다. 동일 ticket이 여러 섹션에 등장하면 모두 나열합니다.
|
|
68
|
-
- `관련 항목 IDs`는 `F-001`, `M-002`, `A1`, `Q1` 같은 row ID를 콤마로 나열합니다. 섹션 헤더 단위로만 ticket이 표시된 경우(개별 row ID가 없는 경우)에는 헤더 번호 자체를 적습니다 (예: `4.5.3`).
|
|
99
|
+
규칙: `Ticket ID` 는 본문에서 등장한 ticket 키와 정확히 동일 문자열. `Issue / Ticket` 이 비어 폴백된 경우 `Task ID` 값을 prefix 없이 그대로 (예: `8852`). 식별 불가는 `unknown`. `관련 항목 IDs` 는 `F-001`, `M-002`, `A1`, `Q1` 같은 row ID 를 콤마로 나열하고, row ID 가 없는 경우 섹션 번호 (예: `4.5.3`) 를 적습니다.
|
|
69
100
|
|
|
70
101
|
## Execution Status by Agent
|
|
71
102
|
|
|
72
|
-
각 worker의 status, 배정 모델, key finding을
|
|
103
|
+
각 worker 의 status, 배정 모델, key finding 을 한 표에 모읍니다. worker 산출물을 근거 없는 주장으로 대체하지 않습니다.
|
|
73
104
|
|
|
74
105
|
{{EXECUTION_STATUS_TABLE_ROWS}}
|
|
75
106
|
|
|
@@ -82,13 +113,22 @@ taskType: "{{FM_TASK_TYPE}}"
|
|
|
82
113
|
| **전체 합계** | **`{{GRAND_TOTAL_TOKENS}}`** | **`{{GRAND_BILLABLE_TOKENS}}`** | **`{{GRAND_COST_USD}}`** |
|
|
83
114
|
| Codex/Gemini CLI 추가 비용 | | | `{{CLI_COST_USD}}` |
|
|
84
115
|
|
|
85
|
-
|
|
116
|
+
<!--
|
|
117
|
+
환산식 설명·"읽는 법"·캐시 가중치 등은 `docs/kr/architecture.md#token-accounting`
|
|
118
|
+
및 audit 사이드카에서 참조하세요. 본문 가독성 회복을 위해 인용구는 제거했습니다.
|
|
119
|
+
|
|
120
|
+
placeholders 정책:
|
|
121
|
+
- Phase 6 시점에는 10 개 `{{...}}` 토큰을 verbatim 으로 둡니다.
|
|
122
|
+
- Phase 7 의 `okstra-token-usage.py --substitute-final-report` 가 치환합니다.
|
|
123
|
+
- 임의 값 (`0` / `N/A` / `--` / `not-collected` / `pending`) 으로 대체 금지.
|
|
124
|
+
Validator 가 치환 실패와 임의 값 모두 fail 합니다.
|
|
125
|
+
-->
|
|
86
126
|
|
|
87
127
|
## 1. Cross Verification Results
|
|
88
128
|
|
|
89
129
|
### 1.0 Round History (convergence-enabled runs only)
|
|
90
130
|
|
|
91
|
-
`state/convergence-<task-type>-<seq>.json` 의 값을 그대로
|
|
131
|
+
`state/convergence-<task-type>-<seq>.json` 의 값을 그대로 옮깁니다. convergence 가 비활성화된 run 에서는 이 sub-section 전체를 삭제합니다.
|
|
92
132
|
|
|
93
133
|
| Round | inputQueueSize | resolvedCount | carriedForwardCount | dispatches (worker:status:durationMs) | skippedWorkers (worker:reason) |
|
|
94
134
|
|-------|----------------|---------------|----------------------|----------------------------------------|---------------------------------|
|
|
@@ -96,42 +136,49 @@ taskType: "{{FM_TASK_TYPE}}"
|
|
|
96
136
|
| 2 | 1 | 1 | 0 | claude-worker:completed:92110 | -- |
|
|
97
137
|
|
|
98
138
|
- `round2SkippedReason`: `not-skipped` ← 값은 `queue-empty | max-rounds-1 | all-reverify-non-result | not-skipped` 중 하나.
|
|
99
|
-
- 실행된 round 수가 0 (Round 0에서 모든 finding이 곧장 full-consensus
|
|
139
|
+
- 실행된 round 수가 0 (Round 0 에서 모든 finding 이 곧장 full-consensus) 이면 표 대신 한 줄 — `- Round 0 grouping 에서 모든 finding 이 합의되어 재검증 라운드가 실행되지 않았습니다.`
|
|
100
140
|
|
|
101
141
|
### 1.1 Consensus
|
|
102
142
|
|
|
103
|
-
| ID | Ticket ID | Statement |
|
|
104
|
-
|
|
105
|
-
| C-001 | `<TICKET-or-fallback>` | <합의된 결론> | claude, codex, gemini | <증거 위치> |
|
|
143
|
+
| ID | Ticket ID | Statement | Source items (worker:item) | Evidence (path:line / log / worker report) |
|
|
144
|
+
|----|-----------|-----------|----------------------------|---------------------------------------------|
|
|
145
|
+
| C-001 | `<TICKET-or-fallback>` | <합의된 결론> | claude:F-001, codex:1.1, gemini:F-3 | <증거 위치> |
|
|
106
146
|
|
|
107
|
-
|
|
147
|
+
표 우선 (bullet 으로 degrade 금지). 합의된 결론을 row 마다 기록합니다.
|
|
148
|
+
|
|
149
|
+
`Source items` 규칙: 본 합의 row 가 어느 워커의 어느 항목들에서 합성됐는지를 `<worker>:<item-id>` 페어 콤마-리스트로 적습니다. 워커 항목 ID 는 워커 자체가 부여한 leading-column ID 입니다 (claude 는 `F-NNN`, codex 는 `1.1` 같은 hierarchical, gemini 는 자유). 바로 이 컬럼이 합성된 `C-NNN` 을 원본 worker-results 파일로 역추적하는 단 하나의 다리입니다 — 단순 워커 이름만 (`claude, codex, gemini`) 적으면 추적성이 끊깁니다. 자세한 정책은 `prompts/profiles/_common-contract.md` "Cross-worker traceability" SSOT.
|
|
108
150
|
|
|
109
151
|
### 1.2 Differences
|
|
110
152
|
|
|
111
|
-
| ID | Ticket ID | Disagreement | Workers (position) | Evidence |
|
|
112
|
-
|
|
113
|
-
| D-001 | `<TICKET-or-fallback>` | <차이 요약> | claude (A) / codex (B) / gemini
|
|
153
|
+
| ID | Ticket ID | Disagreement | Workers (position + item) | Evidence |
|
|
154
|
+
|----|-----------|--------------|---------------------------|----------|
|
|
155
|
+
| D-001 | `<TICKET-or-fallback>` | <차이 요약> | claude:F-005 (A) / codex:1.3 (B) / gemini:-- | <증거 위치> |
|
|
156
|
+
|
|
157
|
+
유의미한 차이 없음: 표 대신 — `- 유의미한 차이 없음. 1.1 Consensus 가 그대로 유효합니다.`
|
|
114
158
|
|
|
115
|
-
-
|
|
159
|
+
`Workers (position + item)` 규칙: 1.1 의 `Source items` 와 동일한 `<worker>:<item-id>` 형식이되 워커마다 `(<position>)` 라벨 (`A` / `B` / `-` 등) 을 함께 적어 어느 워커가 어느 입장을 취했는지 표시합니다. 해당 plan item 에 의견을 내지 않은 워커는 `<worker>:--` 로 기록합니다.
|
|
116
160
|
|
|
117
161
|
## 2. Final Verdict
|
|
118
162
|
|
|
119
|
-
최종 결론과 권장 방향을 한 표로 명시합니다. `Direction
|
|
163
|
+
최종 결론과 권장 방향을 한 표로 명시합니다. `Direction` ∈ `continue-investigation / begin-implementation / approve / reject / hold`. `task-type` 이 `final-verification` 이면 `Verdict Token` 은 `accepted / conditional-accept / blocked` 중 하나여야 하며, `release-handoff` 는 이 값을 진입 게이트로 사용합니다. 다른 task-type 에서는 `not-applicable`.
|
|
120
164
|
|
|
121
165
|
| 항목 | 값 |
|
|
122
166
|
|------|----|
|
|
123
167
|
| Final Conclusion | <한 줄 결론> |
|
|
124
168
|
| Verdict Token | `<accepted / conditional-accept / blocked / not-applicable>` |
|
|
125
169
|
| Direction | `<continue-investigation / begin-implementation / approve / reject / hold>` |
|
|
126
|
-
| 근거 요약 | <`1.1`, `3.1` 등 본 보고서 행 ID를 콤마로> |
|
|
170
|
+
| 근거 요약 | <`1.1`, `3.1` 등 본 보고서 행 ID 를 콤마로> |
|
|
127
171
|
| 다음 단계 | <Section 6 또는 7 중 어디로 이어지는지> |
|
|
128
172
|
|
|
129
173
|
## 3. Evidence and Detailed Analysis
|
|
174
|
+
|
|
130
175
|
### 3.1 Primary Evidence
|
|
131
176
|
|
|
132
|
-
| ID | Ticket ID | Evidence | Source (path:line / log
|
|
133
|
-
|
|
134
|
-
| E-001 | `<TICKET-or-fallback>` | <증거 한 줄 요약> |
|
|
177
|
+
| ID | Ticket ID | Evidence | Source items (worker:item) | Source (path:line / log) |
|
|
178
|
+
|----|-----------|----------|----------------------------|---------------------------|
|
|
179
|
+
| E-001 | `<TICKET-or-fallback>` | <증거 한 줄 요약> | claude:F-002, codex:1.4 | `<path>:<line>` 또는 로그 인용 |
|
|
180
|
+
|
|
181
|
+
`Source items` 컬럼 규칙은 §1.1 과 동일 — `<worker>:<item-id>` 페어 콤마-리스트로 어느 워커 항목들에서 본 증거가 도출됐는지 기록합니다. 워커 결과 인용 없이 lead 가 독립적으로 (예: MCP 직접 조회로) 얻은 증거는 `lead:mcp-<순번>` 형식으로 적습니다 (예: `lead:mcp-1`). `Source (path:line / log)` 컬럼은 코드/로그 위치 자체를 기록합니다.
|
|
135
182
|
|
|
136
183
|
### 3.2 Secondary Evidence or Alternate Interpretations
|
|
137
184
|
|
|
@@ -139,46 +186,56 @@ taskType: "{{FM_TASK_TYPE}}"
|
|
|
139
186
|
|----|-----------|-----------------------------------|---------------------|
|
|
140
187
|
| S-001 | `<TICKET-or-fallback>` | <보조 증거 또는 대안 해석> | <출처 + low/mid> |
|
|
141
188
|
|
|
142
|
-
|
|
189
|
+
해당 없음 시: `- 보조 증거 또는 대안 해석 없음.`
|
|
143
190
|
|
|
144
191
|
## 4. Missing Information and Risks
|
|
145
192
|
|
|
146
|
-
| ID | Ticket ID | Item | Risk if ignored |
|
|
147
|
-
|
|
148
|
-
| R-001 | `<TICKET-or-fallback>` | <누락 정보 또는 불확실 항목> | <무시할 때의 위험> |
|
|
193
|
+
| ID | Ticket ID | Item | Risk if ignored | Mitigation Owner |
|
|
194
|
+
|----|-----------|------|-----------------|------------------|
|
|
195
|
+
| R-001 | `<TICKET-or-fallback>` | <누락 정보 또는 불확실 항목> | <무시할 때의 위험> | <역할 / 팀> |
|
|
149
196
|
|
|
150
|
-
|
|
197
|
+
`I don't know` / `uncertain` 항목은 모두 표 안에 두고 본문 산문으로 흩지 않습니다.
|
|
151
198
|
|
|
152
|
-
|
|
199
|
+
<!-- RENDER_IF: task-type == implementation-planning
|
|
200
|
+
Delete the entire `## 4.5` block + sub-sections otherwise.
|
|
153
201
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
202
|
+
Validator (validators/validate-run.py PLANNING_REQUIRED_SECTIONS) does
|
|
203
|
+
substring matching for these 9 English keywords in order:
|
|
204
|
+
Option Candidates, Trade-off, Recommended Option,
|
|
205
|
+
Stepwise Execution Order, Dependency, Validation Checklist, Rollback,
|
|
206
|
+
User Approval Request, Plan Body Verification
|
|
207
|
+
The first 7 + 9th live below; "User Approval Request" is satisfied by
|
|
208
|
+
the top-of-report Approval block heading. Do NOT recreate a §4.5.8 stub
|
|
209
|
+
in body — validator now fails reports that contain one. -->
|
|
210
|
+
|
|
211
|
+
## 4.5 Implementation Plan Deliverables
|
|
157
212
|
|
|
158
213
|
### 4.5.1 Option Candidates (옵션 후보)
|
|
159
|
-
- 최소 두 개의 구현 옵션을 제시합니다. 각 옵션마다 다음을 포함합니다.
|
|
160
|
-
- **File Structure**: 다음 표 형식으로 파일 단위 책임을 한 줄씩 명시합니다. 행마다 `Ticket ID` 컬럼을 채웁니다.
|
|
161
214
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
215
|
+
최소 두 개의 구현 옵션. 각 옵션마다:
|
|
216
|
+
|
|
217
|
+
- **File Structure** — 파일 단위 책임을 한 줄씩 (`Ticket ID` 채움):
|
|
218
|
+
|
|
219
|
+
| ID | Ticket ID | Action | Path (and line-range) | Change summary |
|
|
220
|
+
|----|-----------|--------|------------------------|----------------|
|
|
221
|
+
| OF-001 | `<TICKET-or-fallback>` | Create / Modify / Delete | `<path>[:<line-range>]` | <한 줄 요약> |
|
|
222
|
+
|
|
223
|
+
- 영향을 받는 인터페이스 / 공개 계약 / 다운스트림 소비자.
|
|
224
|
+
- 폭발 반경 추정 (units, configs, deployment manifests, data migrations).
|
|
167
225
|
|
|
168
226
|
### 4.5.2 Trade-off Matrix (트레이드오프 매트릭스)
|
|
227
|
+
|
|
169
228
|
| Option | Complexity | Risk | Reversibility | Test Coverage Cost | Rollout Cost |
|
|
170
229
|
|--------|-----------|------|---------------|--------------------|--------------|
|
|
171
230
|
| <Option A> | <…> | <…> | <…> | <…> | <…> |
|
|
172
231
|
|
|
173
232
|
### 4.5.3 Recommended Option (권장 옵션)
|
|
174
233
|
|
|
175
|
-
권장 옵션과 그 이유를 표로 정리합니다. `근거`는 `4.5.2`의 비교 결과 + 디자인 원칙(isolation, files-that-change-together, follow-established-patterns, YAGNI) 중 적용된 항목을 적습니다.
|
|
176
|
-
|
|
177
234
|
| 항목 | 값 |
|
|
178
235
|
|------|----|
|
|
179
236
|
| Recommended Option | <옵션 이름> |
|
|
180
237
|
| 핵심 이유 | <한 줄> |
|
|
181
|
-
| 근거 (Trade-off 행 / 원칙) | <4.5.2 행 + 적용 디자인
|
|
238
|
+
| 근거 (Trade-off 행 / 원칙) | <4.5.2 행 + 적용 디자인 원칙: isolation / files-that-change-together / follow-established-patterns / YAGNI> |
|
|
182
239
|
| 채택되지 않은 옵션 요약 | <짧게: 어떤 비용 때문에 탈락> |
|
|
183
240
|
|
|
184
241
|
### 4.5.4 Stepwise Execution Order (단계별 실행 순서)
|
|
@@ -187,16 +244,11 @@ taskType: "{{FM_TASK_TYPE}}"
|
|
|
187
244
|
|------|-----------|------------------|-------|----------------|-------------------|
|
|
188
245
|
| 1 | `<TICKET-or-fallback>` | <예: 실패하는 테스트 작성> | `tests/foo_test.py` | `pytest tests/foo_test.py::test_x -v` | FAIL with <reason> |
|
|
189
246
|
|
|
190
|
-
규칙:
|
|
191
|
-
|
|
192
|
-
- 한 step은 약 2~5분 안에 완료할 수 있는 작은 작업이어야 합니다(예: "X에 실패하는 테스트 작성", "테스트 실행해 실패 확인", "최소 구현", "테스트 통과 확인", "commit").
|
|
193
|
-
- 모든 step은 정확한 파일 경로와 정확한 명령어를 포함합니다. 코드 단계라면 실제 코드 또는 diff 스케치를 함께 적습니다 (`Action` 셀에 줄바꿈 가능).
|
|
194
|
-
- TDD 순서(failing test → implementation → green → commit)가 가능한 영역이라면 이 순서를 따릅니다.
|
|
195
|
-
- 한 step이 여러 ticket을 동시에 진행한다면 `Ticket ID`에 콤마로 함께 적습니다.
|
|
247
|
+
규칙: 한 step 은 약 2~5 분. 모든 step 은 정확한 파일 경로와 명령어 포함. TDD 가능 영역은 failing test → implementation → green → commit 순서.
|
|
196
248
|
|
|
197
249
|
### 4.5.5 Dependency / Migration Risk (의존성·마이그레이션 위험)
|
|
198
250
|
|
|
199
|
-
순서 제약, 데이터 백필, feature-flag 선행 조건, repo-internal sequencing
|
|
251
|
+
순서 제약, 데이터 백필, feature-flag 선행 조건, repo-internal sequencing. 외부 승인·권한·vendor 조율은 위험/일정 항목으로 등록하지 않습니다. 해당 없음: `- 의존성·마이그레이션 위험 없음.`
|
|
200
252
|
|
|
201
253
|
| ID | Kind (order / backfill / flag-precondition / repo-sequencing / other) | Item | 영향 | 완화 / 선행 작업 |
|
|
202
254
|
|----|------------------------------------------------------------------------|------|------|------------------|
|
|
@@ -210,68 +262,73 @@ taskType: "{{FM_TASK_TYPE}}"
|
|
|
210
262
|
| mid | `<TICKET-or-fallback>` | <체크 이름> | `<...>` | <...> |
|
|
211
263
|
| post | `<TICKET-or-fallback>` | <체크 이름> | `<...>` | <...> |
|
|
212
264
|
|
|
213
|
-
추상적 서술 금지. 모든 row는 명령어 또는 관찰 가능한 결과를
|
|
265
|
+
추상적 서술 금지. 모든 row 는 명령어 또는 관찰 가능한 결과를 포함.
|
|
214
266
|
|
|
215
267
|
### 4.5.7 Rollback Strategy (롤백 전략)
|
|
216
268
|
|
|
217
|
-
revert 경로와 롤백 트리거 신호를 표로 정리합니다. 추상적 서술 금지 — 명령어 또는 관찰 가능한 신호여야 합니다.
|
|
218
|
-
|
|
219
269
|
| ID | Step | Action (revert command / flag toggle / migration down) | Trigger signal (error rate / latency / user report 등) | 확인 방법 |
|
|
220
270
|
|----|------|---------------------------------------------------------|--------------------------------------------------------|-----------|
|
|
221
271
|
| RB-001 | 1 | `<예: git revert <SHA>>` | <예: 에러율 > 1% 5분 지속> | `<관찰 명령 / 대시보드>` |
|
|
222
272
|
|
|
223
|
-
### 4.5.
|
|
224
|
-
- 실제 승인 게이트는 본 보고서 **상단 `User Approval Request (사용자 승인 게이트)` 블록**에 있습니다. 이 하위 섹션은 validator가 요구하는 영문 키워드(`User Approval Request`)와 본문 구조 일관성을 위해 남겨 둡니다.
|
|
225
|
-
- 본 섹션에는 승인 결정에 영향을 주는 *플랜 측 보충 메모*만 적습니다(예: 위험을 줄이기 위한 사전 작업, 승인 전 사용자가 확인해 두어야 할 사항). 승인 마커는 본 섹션이 아니라 상단 블록의 체크박스로만 부여합니다.
|
|
226
|
-
- 사용자가 답하거나 자료를 첨부해야만 승인이 가능한 항목은 **이 섹션에 적지 않습니다** — `## 5. Clarification Items` 표에 한 행으로 등록하고 `Blocks=approval` 로 표시하세요. 같은 항목을 두 위치에 적으면 sync 가 깨집니다.
|
|
273
|
+
### 4.5.9 Plan Body Verification (계획 본문 검증)
|
|
227
274
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
> **이 sub-section 은 `task-type` = `implementation-planning` 실행 결과에만 포함하세요.** Phase 6 에서 report-writer 가 합성한 4.5 본문(Option Candidates / Stepwise Execution Order / Dependency / Validation Checklist / Rollback)을 lead 가 plan-item 단위로 쪼개 워커들에게 다시 던지고 `AGREE / DISAGREE / SUPPLEMENT` 평결을 수집한 결과입니다. 자세한 라운드 프로토콜은 `skills/okstra-convergence/SKILL.md` "Plan-body verification mode" 섹션을 참고하세요.
|
|
275
|
+
Phase 6 에서 report-writer 가 합성한 4.5 본문을 lead 가 plan-item 단위로 워커들에게 다시 던지고 `AGREE / DISAGREE / SUPPLEMENT` 평결을 수집한 결과. 라운드 프로토콜은 `skills/okstra-convergence/SKILL.md` "Plan-body verification mode" 참조.
|
|
231
276
|
|
|
232
277
|
- **Round count**: `<N>` (default: 1)
|
|
233
278
|
- **Gate result**: `<passed | passed-with-dissent | blocked-by-disagreement | aborted-non-result>`
|
|
234
|
-
- `passed` →
|
|
235
|
-
- `passed-with-dissent` →
|
|
236
|
-
- `blocked-by-disagreement` →
|
|
237
|
-
- `aborted-non-result` → 워커 dispatch 가 모두 non-result
|
|
279
|
+
- `passed` → 상단 `User Approval Request` 체크박스 라인 렌더.
|
|
280
|
+
- `passed-with-dissent` → 체크박스 렌더 + 반대 의견은 아래 `Dissent log` 에 기록.
|
|
281
|
+
- `blocked-by-disagreement` → 체크박스 라인 **렌더하지 않음**. majority DISAGREE 인 plan item 마다 `## 5.` 에 `Blocks=approval` row 추가.
|
|
282
|
+
- `aborted-non-result` → 워커 dispatch 가 모두 non-result. 체크박스 라인 렌더하지 않음 + `## 5.` 에 "plan-body verification could not run" row.
|
|
283
|
+
|
|
284
|
+
#### Verdict summary
|
|
285
|
+
|
|
286
|
+
각 plan item 1 행. `Plan item` 열은 `P-Opt-<N>` / `P-Step-<N>` / `P-Dep-<N>` / `P-Val-<N>` / `P-Rb-<N>` prefix. `Section` 열은 4.5 내부 sub-section 번호. 워커별 평결은 아래 `Verdict details` 표로 분리합니다 (워커 수에 비례해 가로 폭이 폭발하던 단일 wide 표를 두 개로 쪼개 시인성을 회복).
|
|
238
287
|
|
|
239
|
-
|
|
288
|
+
| Plan item | Ticket ID | Section | Classification |
|
|
289
|
+
|-----------|-----------|---------|----------------|
|
|
290
|
+
| P-Opt-1 | `<id>` | 4.5.1 | full-consensus |
|
|
291
|
+
| P-Step-3 | `<id>` | 4.5.4 | majority-disagree → C-7 |
|
|
240
292
|
|
|
241
|
-
|
|
293
|
+
- `Classification` ∈ `{full-consensus, partial-consensus, worker-unique, majority-disagree → C-<N>}`.
|
|
294
|
+
- `majority-disagree → C-<N>` 의 `C-<N>` 은 `## 5. Clarification Items` 의 row ID 와 1:1 일치해야 합니다.
|
|
242
295
|
|
|
243
|
-
|
|
244
|
-
|-----------|-----------|---------|-----------|-----------|-----|----------------|
|
|
245
|
-
| P-Opt-1 | `<id>` | 4.5.1 | AGREE | AGREE | ... | full-consensus |
|
|
246
|
-
| P-Step-3 | `<id>` | 4.5.4 | DISAGREE(a) | DISAGREE(a) | ... | majority-disagree → C-7 |
|
|
296
|
+
#### Verdict details
|
|
247
297
|
|
|
248
|
-
- DISAGREE
|
|
249
|
-
|
|
298
|
+
워커별 평결을 plan item × worker 쌍으로 1 행씩 기록합니다. 워커 수가 늘어나도 가로 폭이 늘지 않고 행 수만 늘어납니다. `Verdict` ∈ `{AGREE, DISAGREE, SUPPLEMENT, verification-error}`. `Breakage kind` 는 `DISAGREE` 일 때만 채우며 spec 의 `(a|b|c|d|e)` 중 하나 (a=참조 file path / symbol 불일치, b=… 자세한 정의는 `skills/okstra-convergence/SKILL.md`).
|
|
299
|
+
|
|
300
|
+
| Plan item | Worker | Verdict | Breakage kind | Note (선택) |
|
|
301
|
+
|-----------|--------|---------|---------------|-------------|
|
|
302
|
+
| P-Opt-1 | claude-worker | AGREE | -- | |
|
|
303
|
+
| P-Opt-1 | codex-worker | AGREE | -- | |
|
|
304
|
+
| P-Step-3 | claude-worker | DISAGREE | a | 참조한 `crates/.../mod.rs:120` 가 없음 |
|
|
305
|
+
| P-Step-3 | codex-worker | DISAGREE | a | 동일 — 파일 path 미존재 |
|
|
306
|
+
| P-Step-3 | gemini-worker | SUPPLEMENT | -- | 대체 step 제안 (Dissent log 참조) |
|
|
250
307
|
|
|
251
308
|
#### Dissent log
|
|
252
309
|
|
|
253
|
-
`partial-consensus` 와 `worker-unique`
|
|
310
|
+
`partial-consensus` 와 `worker-unique` 의 반대 의견을 plan item 별로 묶어 적습니다. `majority-disagree` 항목의 반대 의견은 본 섹션 대신 `## 5.` 의 해당 row `Statement` 컬럼에 옮겨 적습니다.
|
|
254
311
|
|
|
255
312
|
- **P-XXX-N**: `<worker-role>` — `<반대 의견 본문 2-3 sentences>`
|
|
256
313
|
|
|
257
|
-
|
|
314
|
+
<!-- /RENDER_IF (task-type == implementation-planning) -->
|
|
258
315
|
|
|
259
|
-
|
|
260
|
-
|
|
316
|
+
<!-- RENDER_IF: task-type == release-handoff
|
|
317
|
+
Delete the entire `## 4.6` block + sub-sections otherwise. -->
|
|
261
318
|
|
|
262
|
-
## 4.6 Release Handoff Deliverables
|
|
319
|
+
## 4.6 Release Handoff Deliverables
|
|
263
320
|
|
|
264
|
-
|
|
265
|
-
>
|
|
266
|
-
> 이 섹션은 git/gh mutating 명령이 실행된 phase의 감사 기록입니다. 모든 mutating command 는 반드시 위 `User Selections` 표의 사용자 응답과 1:1로 대응되어야 하며, 대응되지 않는 mutating command 가 있으면 self-review 가 `contract-violated` 로 종료해야 합니다.
|
|
321
|
+
git/gh mutating 명령이 실행된 phase 의 감사 기록. 모든 mutating command 는 반드시 아래 `User Selections` 표의 사용자 응답과 1:1 대응되어야 하며, 대응되지 않는 mutating command 가 있으면 self-review 가 `contract-violated` 로 종료해야 합니다.
|
|
267
322
|
|
|
268
323
|
### 4.6.1 Source Verification Report (선행 final-verification 인용)
|
|
324
|
+
|
|
269
325
|
- Path (project-relative): `<runs/final-verification/.../reports/final-report-final-verification-<seq>.md>`
|
|
270
|
-
- Quoted `Verdict Token` row from that report's `## 2
|
|
326
|
+
- Quoted `Verdict Token` row from that report's `## 2.` table (값이 정확히 `accepted` 여야 함):
|
|
271
327
|
> <원문 인용>
|
|
272
|
-
-
|
|
328
|
+
- 원본 `Verdict Token` 값이 `accepted` 가 아니면 본 run 은 실행되지 않아야 했습니다. self-review 에서 contract-violated 처리하고 routing 을 `final-verification` 으로 되돌립니다.
|
|
273
329
|
|
|
274
330
|
### 4.6.2 Feature Branch & Working-Tree State (run 시작 시점)
|
|
331
|
+
|
|
275
332
|
- Feature branch (`git rev-parse --abbrev-ref HEAD`): `<branch-name>`
|
|
276
333
|
- `git status --short` 출력:
|
|
277
334
|
```
|
|
@@ -280,160 +337,290 @@ revert 경로와 롤백 트리거 신호를 표로 정리합니다. 추상적
|
|
|
280
337
|
- 기존 PR 존재 여부 (`gh pr list --head <branch> --state open --json url --jq '.[0].url'`): `<URL or empty>`
|
|
281
338
|
|
|
282
339
|
### 4.6.3 User Selections (메뉴 응답 기록)
|
|
340
|
+
|
|
283
341
|
| 질문 ID | 질문 본문 | 사용자 응답 (원문) | 응답이 가능한 보기 |
|
|
284
342
|
|---------|-----------|--------------------|--------------------|
|
|
285
343
|
| H1 | 어떤 작업을 실행할까요? | <`local only` / `push + PR` / `skip`> | `local only` / `push + PR` / `skip` |
|
|
286
|
-
| H2 | PR base 브랜치를 골라주세요. (H1=`push + PR` 인 경우에만 묻습니다) | <`staging` / `preprod` / `prod` / `main` / `dev` / 사용자가 입력한 브랜치명> |
|
|
287
|
-
| H3 | lead가 작성한 PR title / PR body 초안을 어떻게 처리할까요? | <`use as-is` / `edit then proceed` / `cancel`> | `use as-is` / `edit then proceed` / `cancel` |
|
|
344
|
+
| H2 | PR base 브랜치를 골라주세요. (H1=`push + PR` 인 경우에만 묻습니다) | <`staging` / `preprod` / `prod` / `main` / `dev` / 사용자가 입력한 브랜치명> | 위 + 직접 입력 |
|
|
345
|
+
| H3 | lead 가 작성한 PR title / PR body 초안을 어떻게 처리할까요? | <`use as-is` / `edit then proceed` / `cancel`> | `use as-is` / `edit then proceed` / `cancel` |
|
|
288
346
|
|
|
289
|
-
H1
|
|
347
|
+
H1 = `skip` 이거나 H3 = `cancel` 인 경우 4.6.4 ~ 4.6.6 은 빈 결과로 채우고 (mutating 명령 미실행) 4.6.7 routing 만 채웁니다.
|
|
290
348
|
|
|
291
349
|
### 4.6.4 Executed Commands (실행한 git / gh 명령 로그)
|
|
292
|
-
|
|
293
|
-
-
|
|
350
|
+
|
|
351
|
+
- Mutating commands: 정확한 명령행 / exit code / 한 줄 stdout 요약을 한 행씩 모두 기록 (누락은 contract-violated).
|
|
352
|
+
- Read-only inspection commands: 요약 또는 명령행 목록만으로 충분.
|
|
294
353
|
|
|
295
354
|
| # | command (verbatim) | exit code | stdout/stderr 요약 |
|
|
296
355
|
|---|---------------------|-----------|--------------------|
|
|
297
356
|
| 1 | `<예: git add path/to/file.py>` | `0` | `<요약>` |
|
|
298
357
|
|
|
299
358
|
### 4.6.5 Commit List (생성된 commit)
|
|
300
|
-
- `implementation` phase에서 이미 생성된 commit 범위(`git log <base>..HEAD`)를 기록합니다. release-handoff는 새 commit을 만들지 않습니다.
|
|
301
|
-
- 각 commit 의 short SHA / full SHA / subject / 영향 파일 목록을 한 항목씩 기록합니다.
|
|
302
|
-
- commit 범위가 비어 있으면 release-handoff가 실행되면 안 됩니다. 다음 한 줄을 적고 routing을 `implementation`으로 되돌립니다.
|
|
303
|
-
> `- No implementation commits found; release-handoff is blocked.`
|
|
304
|
-
|
|
305
|
-
### 4.6.6 Pull Request Outcome (PR 결과)
|
|
306
|
-
- 다음 네 가지 중 정확히 하나의 형식으로 한 줄을 적습니다.
|
|
307
|
-
- `- No PR action requested.` (H1=`local only` 또는 `skip` 인 경우)
|
|
308
|
-
- `- PR created: <url>` + 타이틀 + base 브랜치
|
|
309
|
-
- `- PR reused: <url>` (run 시작 시점에 같은 head 의 open PR 이 이미 존재해 `gh pr create` 를 생략한 경우)
|
|
310
|
-
- `- PR creation skipped: <reason>` (H3=`cancel`, 또는 push/PR 생성 도중 사용자가 중단 지시한 경우. reason 은 풀어 쓴 한 문장)
|
|
311
|
-
|
|
312
|
-
### 4.6.7 Routing Recommendation (마지막 phase 라우팅)
|
|
313
|
-
- `release-handoff` 는 lifecycle 의 종착 phase 이므로 일반적으로 `done` 으로 라우팅합니다.
|
|
314
|
-
- 단, H1=`skip` 또는 H3=`cancel` 로 종료된 경우 사용자가 추후 재진입해 다시 release-handoff 를 실행할 수 있는지 한 줄로 명시합니다.
|
|
315
|
-
- 형식 예시: `- Routing: done. PR <url> opened against <base>; no follow-up required.`
|
|
316
359
|
|
|
317
|
-
|
|
360
|
+
`implementation` phase 에서 이미 생성된 commit 범위 (`git log <base>..HEAD`) 를 기록. release-handoff 는 새 commit 을 만들지 않습니다. 각 commit 의 short SHA / full SHA / subject / 영향 파일 목록.
|
|
361
|
+
|
|
362
|
+
commit 범위가 비어 있으면 release-handoff 는 실행되면 안 됩니다 → `- No implementation commits found; release-handoff is blocked.` + routing 을 `implementation` 으로 되돌림.
|
|
363
|
+
|
|
364
|
+
### 4.6.6 Merge Conflict Probe (사전 머지 충돌 점검)
|
|
365
|
+
|
|
366
|
+
`push + PR` 경로에서만 실행. 다음 셋 중 정확히 하나의 형식으로 한 줄을 기록합니다 (read-only — `git fetch origin <base>` + `git merge-tree --merge-base origin/<base> HEAD origin/<base>` 만 허용; mutating git 명령 금지):
|
|
367
|
+
|
|
368
|
+
- `- Not run (user picked local only or skip).`
|
|
369
|
+
- `- Clean — no conflicts against <base> at <origin/base SHA>.`
|
|
370
|
+
- `- Conflicts detected against <base> at <origin/base SHA>; user chose <proceed anyway | change base branch | cancel>. Conflicting paths: <list>.`
|
|
371
|
+
|
|
372
|
+
`push + PR` 인데 본 항목이 없거나 위 셋 외의 자유 서술이면 self-review 가 `contract-violated` 로 종료합니다 (`release-handoff` profile self-review 6번 — merge-conflict probe audit).
|
|
373
|
+
|
|
374
|
+
### 4.6.7 Pull Request Outcome (PR 결과)
|
|
375
|
+
|
|
376
|
+
다음 네 가지 중 정확히 하나의 형식으로 한 줄:
|
|
377
|
+
|
|
378
|
+
- `- No PR action requested.` (H1 = `local only` 또는 `skip`)
|
|
379
|
+
- `- PR created: <url>` + 타이틀 + base 브랜치
|
|
380
|
+
- `- PR reused: <url>` (run 시작 시 같은 head 의 open PR 이 이미 존재해 `gh pr create` 생략)
|
|
381
|
+
- `- PR creation skipped: <reason>` (H3 = `cancel`, 또는 push/PR 도중 사용자 중단)
|
|
382
|
+
|
|
383
|
+
### 4.6.8 Routing Recommendation (마지막 phase 라우팅)
|
|
384
|
+
|
|
385
|
+
`release-handoff` 는 lifecycle 종착 phase 이므로 일반적으로 `done` 으로 라우팅합니다. H1 = `skip` 또는 H3 = `cancel` 로 종료된 경우 재진입 가능 여부를 한 줄로 명시합니다.
|
|
386
|
+
|
|
387
|
+
형식 예시: `- Routing: done. PR <url> opened against <base>; no follow-up required.`
|
|
388
|
+
|
|
389
|
+
<!-- /RENDER_IF (task-type == release-handoff) -->
|
|
390
|
+
|
|
391
|
+
<!-- RENDER_IF: task-type == implementation
|
|
392
|
+
Delete the entire `## 4.7` block + sub-sections otherwise. -->
|
|
393
|
+
|
|
394
|
+
## 4.7 Implementation Deliverables
|
|
395
|
+
|
|
396
|
+
`implementation` profile 의 "Required deliverable shape" 를 보고서 본문 구조로 옮겨 적습니다. 모든 sub-section 은 필수이며, 비어 있는 경우에도 헤딩은 유지하고 본문에 명시적 빈 상태 한 줄을 적습니다. validator 는 8 개 substring (`Approved Plan Reference`, `Commit List`, `Diff Summary`, `Out-of-plan Edits`, `Validation Evidence`, `Verifier Results`, `Rollback Verification`, `Routing Recommendation`) 의 등장 여부를 검사합니다.
|
|
397
|
+
|
|
398
|
+
### 4.7.1 Approved Plan Reference (승인된 계획 참조)
|
|
399
|
+
|
|
400
|
+
- Plan file (project-relative): `<runs/implementation-planning/.../reports/final-report-implementation-planning-<seq>.md>`
|
|
401
|
+
- Approval evidence (해당 plan 의 정확한 인용 — `- [x] Approved` 마커 + Section 4.5.3 Recommended Option 한 줄):
|
|
402
|
+
> <원문 인용>
|
|
403
|
+
- 본 run 의 `EXECUTOR_WORKTREE_PATH`: `<absolute path>`
|
|
404
|
+
- 본 run 의 base ref (`{{EXECUTOR_WORKTREE_BASE_REF}}`): `<commit SHA>`
|
|
405
|
+
|
|
406
|
+
### 4.7.2 Commit List (생성된 commit)
|
|
407
|
+
|
|
408
|
+
| # | Short SHA | Full SHA | Plan Step | Subject | Files |
|
|
409
|
+
|---|-----------|----------|-----------|---------|-------|
|
|
410
|
+
| 1 | `<abc1234>` | `<full-sha>` | Step 1 | `<exact commit subject>` | `<file paths>` |
|
|
411
|
+
|
|
412
|
+
규칙: 한 commit = 한 plan step (또는 cohesive sub-step). `Subject` 는 git log 에 적힌 원문 그대로 — 재해석·요약 금지. commit 이 없으면 본 run 은 실행되지 않아야 했음 → `- No implementation commits produced; routing recommendation must be back to implementation-planning.` 한 줄.
|
|
413
|
+
|
|
414
|
+
### 4.7.3 Diff Summary (변경 요약)
|
|
415
|
+
|
|
416
|
+
```
|
|
417
|
+
<git diff --stat <base>..HEAD 의 raw 출력>
|
|
418
|
+
```
|
|
318
419
|
|
|
319
|
-
|
|
420
|
+
다음으로 file-by-file 한 줄 요약 표:
|
|
320
421
|
|
|
321
|
-
|
|
422
|
+
| File | Action | Lines (+/-) | Plan step / Out-of-plan |
|
|
423
|
+
|------|--------|-------------|--------------------------|
|
|
424
|
+
| `<path>` | created / modified / deleted | `+12 / -3` | Step 2 또는 `Out-of-plan` |
|
|
425
|
+
|
|
426
|
+
### 4.7.4 Out-of-plan Edits (계획 외 편집)
|
|
427
|
+
|
|
428
|
+
승인된 plan 의 file list 에 없는 파일을 편집한 경우 row 로 기록. 없으면 `- 계획 외 편집 없음.` 한 줄.
|
|
429
|
+
|
|
430
|
+
| ID | File | Rationale | Trigger (어떤 step 수행 중 발견) |
|
|
431
|
+
|----|------|-----------|--------------------------------|
|
|
432
|
+
| OOP-001 | `<path>` | <한 두 문장> | Step `<N>` |
|
|
433
|
+
|
|
434
|
+
### 4.7.5 Validation Evidence (검증 증거)
|
|
435
|
+
|
|
436
|
+
plan 의 `4.5.6 Validation Checklist` 의 pre / mid / post 각 row 에 대해 실제 명령과 출력 / exit code 를 모두 기록합니다. 요약·"tests pass" 같은 단어 금지 — 명령 line 과 exit code 는 원문 그대로.
|
|
437
|
+
|
|
438
|
+
| Phase | Command | Exit code | Output tail (≤10 lines) | TDD evidence (failing→passing SHAs) |
|
|
439
|
+
|-------|---------|-----------|--------------------------|--------------------------------------|
|
|
440
|
+
| pre | `<cmd>` | `0` | <인용> | -- |
|
|
441
|
+
| mid | `<cmd>` | `0` | <인용> | `<failing SHA>` → `<passing SHA>` |
|
|
442
|
+
| post | `<cmd>` | `0` | <인용> | -- |
|
|
443
|
+
|
|
444
|
+
### 4.7.6 Verifier Results (verifier 별 결과)
|
|
445
|
+
|
|
446
|
+
verifier role 마다 한 sub-block 으로 정리합니다 (`Claude verifier`, `Codex verifier`, opt-in 시 `Gemini verifier`). 각 verifier 의 read-only 명령 로그, 독립 재실행 결과, lint/format/typecheck 결과, 그리고 Discrepancy 라인을 모두 보존합니다. lead 는 합의 verdict 를 합성하되 의견을 collapse 하지 않습니다.
|
|
447
|
+
|
|
448
|
+
- **Claude verifier** — Verdict: `<PASS | CONCERNS | FAIL>`
|
|
449
|
+
- Read-only command log: <verifier 의 worker result 에서 원문 인용>
|
|
450
|
+
- Independent validation re-run: <plan validation command 별 exit code + tail>
|
|
451
|
+
- Style / lint / type-check: <도구·exit code·새 위반 수>
|
|
452
|
+
- Declined fix recommendations: <한 줄씩 — 없으면 `- 없음.`>
|
|
453
|
+
- Discrepancy (vs executor): `- 없음.` 또는 `- <plan step / command>: executor=<result>, verifier=<result>`
|
|
454
|
+
- **Codex verifier** — Verdict: ...
|
|
455
|
+
- **Gemini verifier** (opt-in 시) — Verdict: ...
|
|
456
|
+
|
|
457
|
+
합의 verdict (lead 합성): `<PASS | CONCERNS | FAIL>` — 한 verifier 라도 `FAIL` 이면 합의는 `FAIL` (override 시 lead 가 구체적 재현 시점 이유 인용 필수).
|
|
458
|
+
|
|
459
|
+
### 4.7.7 Rollback Verification (롤백 검증)
|
|
460
|
+
|
|
461
|
+
변경 카테고리별로 다른 강도의 확인. 표 1 행 = 1 카테고리.
|
|
462
|
+
|
|
463
|
+
| Category | Rollback command | Verification | Result |
|
|
464
|
+
|----------|-------------------|---------------|--------|
|
|
465
|
+
| Pure code | `git revert <SHA>` | `git rev-parse <SHA>` 가 resolve 됨 | `ok` |
|
|
466
|
+
| Feature-flag-gated | flag off 상태 validation run | 위 4.7.5 의 해당 명령 인용 | `ok` |
|
|
467
|
+
| Schema/config/stateful | rollback step `<cmd>` dry-run | exit code + stdout 인용 | `ok` 또는 `unable — route back to planning` |
|
|
468
|
+
|
|
469
|
+
dry-run 모드가 없는 stateful 변경은 본 항목을 `unable` 로 적고 `## 6.` 의 첫 항목을 `implementation-planning` 재진입으로 권장해야 합니다.
|
|
470
|
+
|
|
471
|
+
### 4.7.8 Routing Recommendation (다음 phase 라우팅)
|
|
472
|
+
|
|
473
|
+
다음 셋 중 하나의 형식으로 한 줄:
|
|
474
|
+
|
|
475
|
+
- `- Routing: final-verification. All plan steps satisfied; rollback verified; verifier consensus <PASS|CONCERNS>.`
|
|
476
|
+
- `- Routing: error-analysis. <한 줄 — 어떤 결함이 추가 분석을 요구하는지>.`
|
|
477
|
+
- `- Routing: implementation-planning. <한 줄 — 왜 새 plan 이 필요한지 (drift / scope-mismatch / stateful-rollback-gap)>.`
|
|
478
|
+
|
|
479
|
+
<!-- /RENDER_IF (task-type == implementation) -->
|
|
480
|
+
|
|
481
|
+
<!-- RENDER_IF: task-type == final-verification
|
|
482
|
+
Delete the entire `## 4.8` block + sub-sections otherwise. -->
|
|
483
|
+
|
|
484
|
+
## 4.8 Final Verification Deliverables
|
|
485
|
+
|
|
486
|
+
`final-verification` profile 의 "Required deliverable shape" 를 본문 구조로 옮겨 적습니다. 모든 sub-section 필수. validator 는 6 개 substring (`Source Implementation Report`, `Acceptance Blockers`, `Residual Risk`, `Validation Evidence`, `Read-only Command Log`, `Routing Recommendation`) 등장과 `## 2. Final Verdict` 의 `Verdict Token` 값이 `accepted` / `conditional-accept` / `blocked` 중 하나인지 검사합니다.
|
|
487
|
+
|
|
488
|
+
### 4.8.1 Source Implementation Report (선행 implementation 인용)
|
|
489
|
+
|
|
490
|
+
- Path (project-relative): `<runs/implementation/.../reports/final-report-implementation-<seq>.md>`
|
|
491
|
+
- 인용된 commit list / diff summary 요약:
|
|
492
|
+
> <원문 인용 — `## 4.7.2` / `## 4.7.3` 에서>
|
|
493
|
+
- 검증 대상 worktree path: `<absolute path>`
|
|
494
|
+
- run 시작 시 capture 한 head/base SHA: `<base SHA> .. <head SHA>`
|
|
495
|
+
- `git status --short` (run 시작 시점):
|
|
496
|
+
```
|
|
497
|
+
<원문 그대로>
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### 4.8.2 Acceptance Blockers (수락 차단 항목)
|
|
501
|
+
|
|
502
|
+
비어 있으면 표 대신 `- No acceptance blockers found.` 한 줄. 모든 blocker 는 구체적 artifact (file:line, log, exit code, MCP SELECT 결과) 인용 필수 — 증거 없는 blocker 는 4.8.3 residual risk 로 강등.
|
|
503
|
+
|
|
504
|
+
| ID | Severity | Statement | Evidence (path:line / log / exit code) | Recommended follow-up phase |
|
|
505
|
+
|----|----------|-----------|-----------------------------------------|------------------------------|
|
|
506
|
+
| AB-001 | `critical / major / minor` | <한 줄 결함 요약> | `<file>:<line>` 또는 로그 인용 | `error-analysis` / `implementation-planning` |
|
|
507
|
+
|
|
508
|
+
### 4.8.3 Residual Risk (잔존 위험)
|
|
509
|
+
|
|
510
|
+
blocker 는 아니지만 추적해야 할 위험. 각 항목에 mitigation owner 와 blocker 로 격상되는 trigger 를 명시.
|
|
511
|
+
|
|
512
|
+
| ID | Item | Mitigation owner | Escalation trigger |
|
|
513
|
+
|----|------|------------------|---------------------|
|
|
514
|
+
| RR-001 | <한 줄> | <역할 / 팀> | <어떤 조건이면 AB-? 로 격상> |
|
|
515
|
+
|
|
516
|
+
비어 있으면: `- 추적 대상 잔존 위험 없음.`
|
|
517
|
+
|
|
518
|
+
### 4.8.4 Validation Evidence (요구사항 커버리지)
|
|
519
|
+
|
|
520
|
+
선행 plan / task brief 의 모든 요구사항에 대해 cover 한 artifact 를 cite. 패러프레이즈 ("verified") 금지.
|
|
521
|
+
|
|
522
|
+
| ID | Requirement (plan/brief 인용) | Artifact (commit SHA / test output / log line / MCP SELECT) | Status (covered / blocker AB-? / gap) |
|
|
523
|
+
|----|--------------------------------|--------------------------------------------------------------|----------------------------------------|
|
|
524
|
+
| VE-001 | <한 줄> | `<artifact>` | covered |
|
|
525
|
+
|
|
526
|
+
### 4.8.5 Read-only Command Log (실행 명령 로그)
|
|
527
|
+
|
|
528
|
+
본 run 에서 실행한 모든 명령 (Tier 1 plan validation + Tier 2 `project.json.qaCommands`) 을 실행 순서대로 한 row 씩 기록. mutating 명령은 등장하면 안 됨.
|
|
529
|
+
|
|
530
|
+
| # | Tier | Command (verbatim) | Exit code | Output tail (≤5 lines) |
|
|
531
|
+
|---|------|---------------------|-----------|-------------------------|
|
|
532
|
+
| 1 | 1 | `<plan validation cmd>` | `0` | <인용> |
|
|
533
|
+
| 2 | 2 | `cargo clippy --all-targets -- -D warnings` | `0` | <인용> |
|
|
534
|
+
|
|
535
|
+
`project.json.qaCommands` 의 category 가 비어 있으면 `qa-command not configured: <lint/format/typecheck/test>` 한 줄. deny-list (`--fix`, `--write`, ` -w`, ` -u`, `--snapshot-update`, `INSTA_UPDATE=<not-no>`, `cargo update`, `npm install` without `ci` 등) 토큰을 포함한 cmd 는 `qa-command rejected (denied token: <token>): <label>` 한 줄로 기록 후 실행하지 않음.
|
|
536
|
+
|
|
537
|
+
### 4.8.6 Routing Recommendation (다음 phase 라우팅)
|
|
538
|
+
|
|
539
|
+
`## 2. Final Verdict` 의 `Verdict Token` 과 1:1 대응. 다음 셋 중 하나:
|
|
540
|
+
|
|
541
|
+
- `- Routing: release-handoff. Verdict Token = accepted; PR-ready.`
|
|
542
|
+
- `- Routing: release-handoff with conditions. Verdict Token = conditional-accept; conditions listed in 4.8.2 / 4.8.3 must be resolved before push.`
|
|
543
|
+
- `- Routing: error-analysis (or implementation-planning). Verdict Token = blocked; <blocker AB-?> requires <re-analysis | replan>.`
|
|
544
|
+
|
|
545
|
+
<!-- /RENDER_IF (task-type == final-verification) -->
|
|
546
|
+
|
|
547
|
+
## 5. Clarification Items
|
|
548
|
+
|
|
549
|
+
다음 run 으로 넘어가기 전에 사용자가 답하거나 자료를 첨부해야 하는 항목을 **한 표 안에서** 추적합니다. `task-type` 이 `error-analysis` / `requirements-discovery` 이고 지금까지의 증거만으로 확신 있는 최종 판단이 어려울 때는 반드시 채웁니다. 그 외 task-type 에서는 lead 가 필요하다고 판단할 때만 채우고, 그렇지 않다면 `- 추가 정보 요청 없음. Section 2 의 최종 판단이 그대로 유효합니다.` 한 줄만 남깁니다.
|
|
322
550
|
|
|
323
551
|
작성 원칙:
|
|
324
552
|
|
|
325
|
-
- 개발자가 아닌 사람도 한 번 읽고 무엇을 어디서 가져와야 하는지 이해할 수 있게, 줄임말과 내부 용어 대신 풀어 쓴
|
|
326
|
-
- 한 행은 "왜 필요한지", "무엇을 묻거나 받아야 하는지", "어떤 형태의 답을 기대하는지"가 모두
|
|
327
|
-
-
|
|
553
|
+
- 개발자가 아닌 사람도 한 번 읽고 무엇을 어디서 가져와야 하는지 이해할 수 있게, 줄임말과 내부 용어 대신 풀어 쓴 문장.
|
|
554
|
+
- 한 행은 "왜 필요한지", "무엇을 묻거나 받아야 하는지", "어떤 형태의 답을 기대하는지" 가 모두 드러나야 함.
|
|
555
|
+
- 항목별 ID (`C-001`, `C-002`, …) 는 run 간 유지. 답변된 항목은 다음 run 에서도 삭제하지 말고 `Status` 만 `resolved` / `obsolete` 로 갱신.
|
|
556
|
+
|
|
557
|
+
답을 채우신 뒤 같은 phase 를 다시 실행:
|
|
328
558
|
|
|
329
|
-
|
|
330
|
-
- Claude Code 세션 안: `/okstra-run resume-clarification task-key={{TASK_KEY}}`
|
|
559
|
+
- Claude Code: `/okstra-run resume-clarification task-key={{TASK_KEY}}`
|
|
331
560
|
- 별도 터미널: `scripts/okstra.sh --resume-clarification --task-key {{TASK_KEY}}`
|
|
332
561
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
-
|
|
350
|
-
- **`Expected form`**: 답 / 자료의 모양 — 예/아니오, 보기 a/b/c, 정수, 날짜, 파일 경로, URL 등. 가능하면 정확한 보기 또는 예시 한 줄.
|
|
351
|
-
- **`Blocks`** ∈ `{approval, next-phase, none}`:
|
|
352
|
-
- `approval` — `implementation-planning` 의 User Approval Request 통과를 막는 항목. 모두 `resolved`/`obsolete` 가 되어야 상단 체크박스를 `[x]` 로 바꿀 수 있습니다.
|
|
353
|
-
- `next-phase` — 승인 게이트가 아니더라도 다음 run 진입에 답이 필요한 항목.
|
|
354
|
-
- `none` — informational. 답이 없어도 다음 phase 는 진행 가능하지만 audit 기록을 위해 남깁니다.
|
|
355
|
-
- **`Status`** ∈ `{open, answered, resolved, obsolete}`:
|
|
356
|
-
- `open` — 요청했지만 아직 받지 못함.
|
|
357
|
-
- `answered` — 사용자가 `User input` 칸을 채워 두었음 (다음 run 의 lead 가 검증해야 함).
|
|
358
|
-
- `resolved` — 다음 run 에서 lead 가 답변·자료를 받아 검증을 마침.
|
|
359
|
-
- `obsolete` — 이후 분석 결과로 더 이상 필요 없어진 항목.
|
|
360
|
-
- **`User input`**: 사용자가 직접 채우는 칸. `material` 이면 첨부 파일 경로 / URL / 메모, `decision` 이면 선택 또는 짧은 서술, `data-point` 이면 inline 값.
|
|
361
|
-
|
|
362
|
-
작성 안티패턴 (자동 거절):
|
|
363
|
-
|
|
364
|
-
- 같은 항목을 `## 4.5.8 User Approval Request` 보충 메모와 본 표에 동시 등록 — `Blocks=approval` 행 하나로 충분합니다.
|
|
365
|
-
- 한 행을 두 개로 나눠 "자료 요청 행" 과 "관련 질문 행" 으로 쪼개기 — 자료 + yes/no 가 묶인 항목은 `Kind=material`, `Expected form` 에 "파일 경로 + yes/no" 라고 적은 한 행으로 처리합니다.
|
|
366
|
-
- 사용자가 답하지 않아도 진행 가능한 항목을 `Blocks=approval` 로 표시 — `Blocks=none` 또는 `next-phase` 로 정확히 표시하세요. 잘못 표시하면 사용자가 불필요하게 게이트에 걸립니다.
|
|
562
|
+
| ID | Ticket ID | Kind | Statement (무엇이 필요한지 + 왜) | Expected form (답·자료의 모양) | Blocks | Status | User input |
|
|
563
|
+
|----|-----------|------|----------------------------------|-------------------------------|--------|--------|-----------|
|
|
564
|
+
| C-001 | `<TICKET-or-fallback>` | `decision` | <예: "지난 주 새벽 결제 실패가 일회성이었는지 재발했는지 알려주세요. 다음 run 의 task-type 이 `error-analysis` 로 갈지 `requirements-discovery` 로 갈지가 갈립니다."> | <예: "(a) 일회성, (b) 재발 — 최근 시각 YYYY-MM-DD HH:MM, 영향 사용자 수 약 N명"> | `next-phase` | open | <빈칸으로 두고 다음 run 전에 사용자가 채움> |
|
|
565
|
+
| C-002 | `<TICKET-or-fallback>` | `material` | <예: "오류 시각 전후 30분 worker 로그가 필요합니다. Datadog `service:worker env:prod` 필터, 시각 2026-04-30 09:30~10:30 KST. `.project-docs/okstra/tasks/8852/logs/worker-2026-04-30.log` 로 저장해 주세요."> | <예: "위 경로의 .log 파일 (gzip 가능)"> | `next-phase` | open | |
|
|
566
|
+
| C-003 | `<TICKET-or-fallback>` | `data-point` | <예: "본 배치 시작 직전 `common.FontManualClassifiers` 의 `prediction=0` / `prediction=1` 행 수가 필요합니다. acceptance #5 의 동일성 검증 ground truth."> | <예: "두 정수 (prediction=0 count, prediction=1 count) 한 줄로"> | `approval` | open | |
|
|
567
|
+
|
|
568
|
+
컬럼 가이드 (전체 정의는 `prompts/profiles/_common-contract.md §Clarification request policy` SSOT 참조):
|
|
569
|
+
|
|
570
|
+
- **`Kind`** ∈ `{material, decision, data-point}`.
|
|
571
|
+
- **`Blocks`** ∈ `{approval, next-phase, none}` — `approval` 은 implementation-planning 의 승인 게이트 차단.
|
|
572
|
+
- **`Status`** ∈ `{open, answered, resolved, obsolete}`.
|
|
573
|
+
|
|
574
|
+
안티패턴 (validator 가 fail 처리):
|
|
575
|
+
|
|
576
|
+
- 같은 항목을 별도 sub-section (`5.1 추가 자료 요청` / `5.2 사용자 확인 질문` / `4.5.9 Open Questions`) 으로 분리하기 — 본 8-열 표 한 곳으로만 표현합니다.
|
|
577
|
+
- 한 행을 두 개로 쪼개기 — 자료 + yes/no 가 묶인 항목은 `Kind=material`, `Expected form` 에 "파일 경로 + yes/no" 라고 적은 한 행.
|
|
578
|
+
- 사용자가 답하지 않아도 진행 가능한 항목을 `Blocks=approval` 로 표시 — `Blocks=none` / `next-phase` 로 정확히 표시.
|
|
367
579
|
|
|
368
580
|
## 6. Recommended Next Steps
|
|
369
581
|
|
|
370
|
-
This section is **always present**
|
|
582
|
+
This section is **always present** — never omit the heading. If there are no concrete actions, write the single line `- No further action required. Final verdict in section 2 stands.` and stop.
|
|
371
583
|
|
|
372
|
-
When concrete actions exist, list them as a numbered list
|
|
584
|
+
When concrete actions exist, list them as a numbered list. Each item includes the exact copy-pasteable command(s). Show **both** the in-session form (`/okstra-run …`) and the external-terminal form (`scripts/okstra.sh …`) — the Node `okstra` admin CLI does NOT accept `--task-key` / `--task-type` / `--resume-clarification`.
|
|
373
585
|
|
|
374
|
-
1. **Highest-priority next action.** State what
|
|
586
|
+
1. **Highest-priority next action.** State what + why in one sentence, then the command.
|
|
375
587
|
- Same phase rerun:
|
|
376
|
-
- Claude Code
|
|
588
|
+
- Claude Code: `/okstra-run task-key={{TASK_KEY}} task-type={{TASK_TYPE}}`
|
|
377
589
|
- 별도 터미널: `scripts/okstra.sh --task-key {{TASK_KEY}} --task-type {{TASK_TYPE}}`
|
|
378
|
-
- Next phase (omit `task-type` to use the manifest's `workflow.nextRecommendedPhase`
|
|
379
|
-
- Claude Code
|
|
590
|
+
- Next phase (omit `task-type` to use the manifest's `workflow.nextRecommendedPhase` when concrete):
|
|
591
|
+
- Claude Code: `/okstra-run task-key={{TASK_KEY}} task-type=<next-phase>`
|
|
380
592
|
- 별도 터미널: `scripts/okstra.sh --task-key {{TASK_KEY}} --task-type <next-phase>`
|
|
381
|
-
2. **Additional verification
|
|
382
|
-
3. **Follow-up tasks
|
|
383
|
-
4. **If
|
|
384
|
-
- Preferred
|
|
385
|
-
- Claude Code 세션 안: `/okstra-run resume-clarification task-key={{TASK_KEY}}`
|
|
386
|
-
- 별도 터미널: `scripts/okstra.sh --resume-clarification --task-key {{TASK_KEY}}`
|
|
387
|
-
- Scripted: `scripts/okstra.sh --task-key {{TASK_KEY}} --task-type {{TASK_TYPE}} --clarification-response <path-to-this-file-after-editing>`.
|
|
593
|
+
2. **Additional read-only verification** before moving to the next phase (test commands, log queries, dashboard URLs). No state-mutating commands here.
|
|
594
|
+
3. **Follow-up tasks** if needed. Reference by `task-key` when they exist; otherwise describe the new brief to draft.
|
|
595
|
+
4. **If `## 5.` has any row with `Status` in `{open, answered}`**, the highest-priority next step MUST be the clarification turn-around:
|
|
596
|
+
- Preferred: `/okstra-run resume-clarification task-key={{TASK_KEY}}` / `scripts/okstra.sh --resume-clarification --task-key {{TASK_KEY}}`.
|
|
388
597
|
|
|
389
|
-
Empty-state placeholder
|
|
390
|
-
|
|
391
|
-
```
|
|
392
|
-
- No further action required. Final verdict in section 2 stands.
|
|
393
|
-
```
|
|
598
|
+
Empty-state placeholder (copy verbatim when nothing else applies): `- No further action required. Final verdict in section 2 stands.`
|
|
394
599
|
|
|
395
600
|
## 7. Follow-up Tasks (후속 작업)
|
|
396
601
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
- `task-type` = `implementation` / `final-verification` / `release-handoff` runs: **필수**. 채울 항목이 없으면 표 대신 `- 후속 작업 없음.` 한 줄.
|
|
400
|
-
- 그 외 task-type runs: 선택. lead가 필요하다고 판단할 때만 채웁니다.
|
|
602
|
+
본 run 의 구현·검증 범위를 **넘어서는** 작업을 후속 task 로 이어가기 위한 표.
|
|
401
603
|
|
|
402
|
-
|
|
604
|
+
- `task-type` = `implementation` / `final-verification` / `release-handoff`: **필수**. 채울 항목이 없으면 표 대신 `- 후속 작업 없음.`
|
|
605
|
+
- 그 외 task-type: 선택. lead 가 필요하다고 판단할 때만.
|
|
403
606
|
|
|
404
|
-
|
|
405
|
-
- `verifier-concern` — verifier가 PASS는 줬으나 후속 개선 권고로 남긴 항목.
|
|
406
|
-
- `scope-boundary` — `implementation-planning`의 `4.5.5 Dependency / Migration Risk` 또는 task-brief `Out of Scope` 에서 의도적으로 제외했으나, 본 run 결과에 비추어 별도 ticket이 필요한 항목.
|
|
407
|
-
- `open-question` — `## 5. Clarification Items` 에서 분리한 후속 작업 (사용자 답을 그대로 닫지 않고 별도 task 로 진행해야 하는 경우).
|
|
408
|
-
- `manual` — lead가 추가로 식별한 follow-up.
|
|
607
|
+
후속 항목 출처: `out-of-plan` / `verifier-concern` / `scope-boundary` / `open-question` / `manual` 중 하나.
|
|
409
608
|
|
|
410
|
-
규칙:
|
|
411
|
-
|
|
412
|
-
- 각 row의 `Auto-spawn?` 값이 `yes` 이면 Phase 7 의 `scripts/okstra-spawn-followups.py` 가 자동으로 후속 task 디렉터리(`tasks/<TASK_GROUP>/<New Task ID>/`)와 `task-manifest.json` (status: `todo`), stub task-brief 를 생성합니다. `no` 이면 사람이 따로 결정합니다.
|
|
413
|
-
- `Ticket ID` 는 본 보고서 상단 `Ticket Coverage` 규칙과 동일합니다. 후속 작업이 특정 외부 ticket(Jira/Linear/이슈 트래커 등)이나 본 보고서의 ticket 인덱스에 묶이면 그 키를 적고, 매핑이 없으면 `Task ID` 폴백 값을 prefix 없이 적습니다(예: `8852`). 어느 쪽으로도 식별 불가하면 `unknown`.
|
|
414
|
-
- `New Task ID` 는 알파숫자·하이픈만 사용하는 짧은 slug 입니다 (예: `8852-followup-logs`). 같은 task-group 안에서 유일해야 합니다.
|
|
415
|
-
- `Suggested task-type` 은 `requirements-discovery` / `error-analysis` / `implementation-planning` / `implementation` / `final-verification` / `release-handoff` 중 하나.
|
|
416
|
-
- `Scope` 는 영향 파일·영역을 콤마 또는 한 줄로 적습니다.
|
|
417
|
-
- `Reason / Why deferred` 는 본 run 에서 처리하지 못한 이유를 한 두 문장으로 적습니다. "시간이 없어서" 같은 모호한 사유는 거절됩니다.
|
|
418
|
-
- 동일 follow-up 이 여러 run 에 걸쳐 등장하면 `New Task ID` 를 동일하게 유지하여 중복 spawn 을 방지합니다 (script 가 기존 디렉터리 존재 여부로 idempotent 처리).
|
|
609
|
+
규칙: `Auto-spawn? = yes` 인 row 는 Phase 7 의 `scripts/okstra-spawn-followups.py` 가 자동으로 `tasks/<TASK_GROUP>/<New Task ID>/` 디렉터리 + `task-manifest.json` (status: `todo`) + stub task-brief 를 생성. `no` 는 사람이 처리. `New Task ID` 는 task-group 내 유일한 알파숫자·하이픈 slug. 동일 follow-up 이 여러 run 에 등장하면 `New Task ID` 를 동일하게 유지하여 중복 spawn 방지.
|
|
419
610
|
|
|
420
611
|
| ID | Ticket ID | Origin | New Task ID | Title | Suggested task-type | Scope (files/areas) | Reason / Why deferred | Priority (P0/P1/P2) | Auto-spawn? |
|
|
421
612
|
|----|-----------|--------|-------------|-------|---------------------|---------------------|------------------------|---------------------|-------------|
|
|
422
613
|
| FU-001 | `<TICKET-or-fallback>` | `<out-of-plan / verifier-concern / scope-boundary / open-question / manual>` | `<new-task-id-slug>` | <한 줄 제목> | `<task-type>` | `<files / areas>` | <한 두 문장 사유> | `P1` | `yes` |
|
|
423
614
|
|
|
424
|
-
빈
|
|
615
|
+
빈 상태: `- 후속 작업 없음.`
|
|
425
616
|
|
|
426
|
-
|
|
427
|
-
- 후속 작업 없음.
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
본 섹션이 채워진 경우, Section 6 의 "Follow-up tasks or related tasks" 항목에 자동 생성된 task-key 와 진입 명령을 함께 적어 사용자가 즉시 이어갈 수 있게 합니다.
|
|
617
|
+
본 섹션이 채워진 경우 Section 6 의 "Follow-up tasks" 항목에 자동 생성된 task-key 와 진입 명령을 함께 적어 사용자가 즉시 이어갈 수 있게 합니다.
|
|
431
618
|
|
|
432
619
|
## Writing Rules
|
|
433
|
-
|
|
434
|
-
-
|
|
435
|
-
-
|
|
436
|
-
-
|
|
437
|
-
-
|
|
438
|
-
-
|
|
439
|
-
-
|
|
620
|
+
|
|
621
|
+
- Markdown. 본문은 한국어. 기술 식별자 (파일 경로, 코드 심볼, 모델명, status 값) 는 원형 유지.
|
|
622
|
+
- 섹션 구조는 brief 가 명시적으로 다른 구조를 요구하지 않는 한 보존.
|
|
623
|
+
- 증거 기반 (speculation 금지). 메타 코멘트 (저장소·세션·이전 메시지 언급) 로 본문 대체 금지.
|
|
624
|
+
- 본 문서는 `Claude lead` 의 최종 합성이지 raw worker dump 가 아닙니다.
|
|
625
|
+
- 표 우선. 같은 모양의 항목을 여러 개 나열할 때 bullet 으로 degrade 금지.
|
|
626
|
+
- Reading Confirmation / 워커 raw output / 환산식 설명 등 audit 자료는 본문이 아닌 사이드카에 둡니다 (`runs/<task-type>/worker-results/<worker>-audit-<task-type>-<seq>.md`).
|