okstra 0.34.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.kr.md +26 -16
  2. package/README.md +26 -16
  3. package/docs/kr/architecture.md +59 -45
  4. package/docs/kr/cli.md +61 -18
  5. package/docs/pr-template-usage.md +65 -0
  6. package/docs/project-structure-overview.md +358 -354
  7. package/docs/superpowers/plans/2026-05-12-ticket-id-in-reports.md +1 -1
  8. package/docs/superpowers/plans/2026-05-14-convergence-queue-pruning.md +1 -1
  9. package/docs/superpowers/plans/2026-05-17-dual-format-final-report.md +1 -1
  10. package/docs/superpowers/plans/2026-05-20-final-report-language.md +1501 -0
  11. package/docs/superpowers/plans/2026-05-20-implementation-planning-multi-stage.md +1267 -0
  12. package/docs/superpowers/plans/2026-05-20-okstra-run-prompt-sot-b1.md +1007 -0
  13. package/docs/superpowers/plans/2026-05-20-wizard-messages-json-sot.md +720 -0
  14. package/docs/superpowers/plans/2026-05-20-wizard-prompt-json-sot-a1.md +681 -0
  15. package/docs/superpowers/plans/2026-05-21-improvement-discovery-task-type.md +1691 -0
  16. package/docs/superpowers/specs/2026-05-20-final-report-language-design.md +383 -0
  17. package/docs/superpowers/specs/2026-05-20-implementation-planning-multi-stage-design.md +320 -0
  18. package/docs/superpowers/specs/2026-05-20-okstra-run-prompt-sot-design.md +299 -0
  19. package/docs/superpowers/specs/2026-05-21-improvement-discovery-task-type-design.md +335 -0
  20. package/docs/task-process/README.md +74 -0
  21. package/docs/task-process/common-flow.md +166 -0
  22. package/docs/task-process/error-analysis.md +101 -0
  23. package/docs/task-process/final-verification.md +167 -0
  24. package/docs/task-process/implementation-planning.md +128 -0
  25. package/docs/task-process/implementation.md +149 -0
  26. package/docs/task-process/release-handoff.md +206 -0
  27. package/docs/task-process/requirements-discovery.md +115 -0
  28. package/package.json +1 -1
  29. package/runtime/BUILD.json +2 -2
  30. package/runtime/agents/SKILL.md +12 -2
  31. package/runtime/agents/workers/claude-worker.md +26 -0
  32. package/runtime/agents/workers/codex-worker.md +27 -1
  33. package/runtime/agents/workers/gemini-worker.md +27 -1
  34. package/runtime/agents/workers/report-writer-worker.md +8 -1
  35. package/runtime/bin/okstra-central.sh +6 -6
  36. package/runtime/bin/okstra-codex-exec.sh +49 -28
  37. package/runtime/bin/okstra-gemini-exec.sh +39 -21
  38. package/runtime/bin/okstra-render-final-report.py +13 -2
  39. package/runtime/bin/okstra-wrapper-status.py +155 -0
  40. package/runtime/bin/okstra.sh +2 -2
  41. package/runtime/prompts/profiles/_common-contract.md +11 -6
  42. package/runtime/prompts/profiles/error-analysis.md +3 -7
  43. package/runtime/prompts/profiles/implementation-planning.md +22 -21
  44. package/runtime/prompts/profiles/implementation.md +28 -11
  45. package/runtime/prompts/profiles/improvement-discovery.md +42 -0
  46. package/runtime/prompts/profiles/kr/_common-contract.md +92 -0
  47. package/runtime/prompts/profiles/kr/error-analysis.md +36 -0
  48. package/runtime/prompts/profiles/kr/final-verification.md +48 -0
  49. package/runtime/prompts/profiles/kr/implementation-planning.md +90 -0
  50. package/runtime/prompts/profiles/kr/implementation.md +144 -0
  51. package/runtime/prompts/profiles/kr/improvement-discovery.md +42 -0
  52. package/runtime/prompts/profiles/kr/release-handoff.md +104 -0
  53. package/runtime/prompts/profiles/kr/requirements-discovery.md +42 -0
  54. package/runtime/prompts/profiles/release-handoff.md +1 -1
  55. package/runtime/prompts/profiles/requirements-discovery.md +8 -12
  56. package/runtime/prompts/wizard/prompts.ko.json +230 -0
  57. package/runtime/python/lib/okstra/cli.sh +2 -49
  58. package/runtime/python/lib/okstra/globals.sh +21 -21
  59. package/runtime/python/lib/okstra/interactive.sh +7 -7
  60. package/runtime/python/okstra_ctl/clarification_items.py +3 -9
  61. package/runtime/python/okstra_ctl/consumers.py +53 -0
  62. package/runtime/python/okstra_ctl/final_report_schema.py +0 -7
  63. package/runtime/python/okstra_ctl/i18n.py +73 -0
  64. package/runtime/python/okstra_ctl/improvement_lenses.py +44 -0
  65. package/runtime/python/okstra_ctl/index.py +1 -1
  66. package/runtime/python/okstra_ctl/paths.py +23 -20
  67. package/runtime/python/okstra_ctl/render.py +147 -202
  68. package/runtime/python/okstra_ctl/render_final_report.py +53 -10
  69. package/runtime/python/okstra_ctl/run.py +292 -107
  70. package/runtime/python/okstra_ctl/run_context.py +22 -0
  71. package/runtime/python/okstra_ctl/seeding.py +186 -0
  72. package/runtime/python/okstra_ctl/wizard.py +348 -127
  73. package/runtime/python/okstra_ctl/workflow.py +21 -2
  74. package/runtime/python/okstra_ctl/worktree.py +54 -1
  75. package/runtime/python/okstra_project/resolver.py +4 -3
  76. package/runtime/python/okstra_token_usage/report.py +2 -2
  77. package/runtime/schemas/final-report-v1.0.schema.json +22 -16
  78. package/runtime/skills/okstra-brief/SKILL.md +124 -31
  79. package/runtime/skills/okstra-convergence/SKILL.md +2 -3
  80. package/runtime/skills/okstra-report-writer/SKILL.md +35 -15
  81. package/runtime/skills/okstra-run/SKILL.md +5 -4
  82. package/runtime/skills/okstra-schedule/SKILL.md +4 -4
  83. package/runtime/skills/okstra-setup/SKILL.md +27 -0
  84. package/runtime/skills/okstra-team-contract/SKILL.md +1 -1
  85. package/runtime/templates/okstra.CLAUDE.md +104 -0
  86. package/runtime/templates/reports/final-report.template.md +93 -98
  87. package/runtime/templates/reports/i18n/en.json +135 -0
  88. package/runtime/templates/reports/i18n/ko.json +135 -0
  89. package/runtime/templates/reports/implementation-planning-input.template.md +18 -0
  90. package/runtime/templates/reports/improvement-discovery-input.template.md +78 -0
  91. package/runtime/templates/reports/task-brief.template.md +2 -2
  92. package/runtime/validators/lib/fixtures.sh +30 -0
  93. package/runtime/validators/lib/runners.sh +1 -1
  94. package/runtime/validators/validate-implementation-plan-stages.py +211 -0
  95. package/runtime/validators/validate-run.py +121 -26
  96. package/runtime/validators/validate-workflow.sh +2 -2
  97. package/runtime/validators/validate_improvement_report.py +275 -0
  98. package/src/config.mjs +18 -0
  99. package/src/install.mjs +41 -14
  100. package/src/setup.mjs +133 -1
  101. package/src/uninstall.mjs +21 -1
@@ -17,6 +17,7 @@ task-group: {{ frontmatter.taskGroup | yaml_scalar }}
17
17
  project-id: {{ frontmatter.projectId | yaml_scalar }}
18
18
  taskType: {{ frontmatter.taskType | yaml_scalar }}
19
19
  workerId: {{ frontmatter.workerId | yaml_scalar }}
20
+ approved: {{ frontmatter.approved | yaml_scalar }}
20
21
  ---
21
22
 
22
23
  # {{ header.taskKey }} - Multi-Agent Cross Verification Final Report
@@ -31,43 +32,28 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
31
32
 
32
33
  ## Verdict Card
33
34
 
34
- 한눈에 보는 결과 카드. 본 표의 모든 값은 `## 2. Final Verdict` 및 `## 6. Recommended Next Steps` 의 권위 있는 값과 정확히 일치해야 합니다.
35
+ {{ t("sectionIntro.verdictCard") }}
35
36
 
36
- | 항목 | |
37
+ | {{ t("verdictCard.tableHeaderLabel") }} | {{ t("verdictCard.tableHeaderValue") }} |
37
38
  |------|----|
38
39
  | Final Conclusion | {{ verdictCard.finalConclusion }} |
39
40
  | Verdict Token | `{{ verdictCard.verdictToken }}` |
40
41
  | Direction | `{{ verdictCard.direction }}` |
41
- | Approval Required? | `{% if verdictCard.approvalRequired %}yes — User Approval Request 블록 참조{% else %}no{% endif %}` |
42
+ | Approval Required? | `{% if verdictCard.approvalRequired %}yes — {{ t("verdictCard.approvalRequiredSuffix") }}{% else %}no{% endif %}` |
42
43
  | Next Step | {{ verdictCard.nextStep }} |
43
44
 
44
- {% if header.taskType == 'implementation-planning' %}
45
- ## User Approval Request (사용자 승인 게이트)
46
-
47
- 다음 `implementation` run 은 아래 체크박스가 `[x]` 일 때에만 진입할 수 있습니다 (`okstra_ctl.run._validate_approved_plan` 가 line-anchored 정규식으로 검사). `## 5. Clarification Items` 표에서 `Blocks=approval` 인 모든 행이 `resolved` / `obsolete` 가 된 뒤 승인해 주세요.
48
-
49
- - 승인 체크박스 (사용자가 직접 편집): `- [{% if approvalBlock.approved %}x{% else %} {% endif %}] Approved`
50
- - 승인 후 다음 단계 명령 (수동 편집 방식):
51
- - Claude Code: `/okstra-run task-key={{ header.taskKey }} task-type=implementation approved-plan=<이 보고서 경로>`
52
- - 별도 터미널: `scripts/okstra.sh --task-key {{ header.taskKey }} --task-type implementation --approved-plan <이 보고서 경로>`
53
- - 승인 + 실행 한 번에 (진입 명령 자체를 승인 의사로):
54
- - Claude Code: `/okstra-run task-key={{ header.taskKey }} task-type=implementation approved-plan=<이 보고서 경로> approve`
55
- - 별도 터미널: `scripts/okstra.sh --task-key {{ header.taskKey }} --task-type implementation --approved-plan <이 보고서 경로> --approve`
56
- - 보류·거부: 체크박스를 `[ ]` 로 두고 `--approve` 를 사용하지 마세요. 필요 변경은 `## 5.` 표에 `Blocks=approval` 행으로 등록한 뒤 같은 phase 를 재실행합니다.
57
-
58
- {% endif %}
59
45
  {% if clarificationCarryIn and clarificationCarryIn.sourceFile %}
60
46
  ## 0. Clarification Response Carried In From Previous Run
61
47
 
62
48
  - Source file: `{{ clarificationCarryIn.sourceFile }}`
63
- - 이전 보고서의 `## 5. Clarification Items` 표 매 행(`C-001`, `C-002`, …) 을 새 증거에 비추어 검토하고, 각 행의 `Status` 를 `resolved` 또는 `obsolete` 로 갱신한 뒤 본 run 의 `## 5.` 표에 carry-in 합니다. 해소 근거(파일:라인 / 로그 / 워커 결과) 를 함께 인용합니다.
49
+ - {{ t("sectionIntro.clarificationCarryIn") }}
64
50
 
65
51
  {% endif %}
66
52
  ## Summary of the Problem or Verification Target
67
53
 
68
- 3~5 row 로 핵심 문제·요구사항·검증 대상을 표로 정리합니다. brief, 소스 자료, worker 결과를 근거로 작성합니다.
54
+ {{ t("sectionIntro.ticketCoverage") }}
69
55
 
70
- | ID | Ticket ID | 요약 | 출처 (brief/source/worker) |
56
+ | ID | Ticket ID | {{ t("columns.summary") }} | {{ t("columns.source") }} |
71
57
  |----|-----------|------------|----------------------------|
72
58
  {% for row in summary -%}
73
59
  | {{ row.id }} | `{{ row.ticketId }}` | {{ row.summary }} | {{ row.source }} |
@@ -78,43 +64,43 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
78
64
  {%- else %}
79
65
  ## Ticket Coverage
80
66
 
81
- run 이 다룬 ticket 의 역방향 인덱스. 본문 항목들은 모두 `Ticket ID` 컬럼 또는 `[TICKETID: <id>]` 태그로 ticket 과 묶여 있습니다.
67
+ {{ t("ticketCoverage.intro") }}
82
68
 
83
69
  {% if ticketCoverage.singleTicket -%}
84
70
  - Single ticket run: {{ ticketCoverage.singleTicket }}
85
71
  {%- else %}
86
- | Ticket ID | 등장 섹션 | 관련 항목 IDs |
72
+ | Ticket ID | {{ t("ticketCoverage.columnSections") }} | {{ t("ticketCoverage.columnRelatedIds") }} |
87
73
  |-----------|-----------|---------------|
88
74
  {% for row in ticketCoverage.rows -%}
89
75
  | `{{ row.ticketId }}` | `{{ row.sections }}` | `{{ row.relatedIds }}` |
90
76
  {% endfor %}
91
77
  {%- endif %}
92
78
 
93
- 규칙: `Ticket ID` 는 본문에서 등장한 ticket 키와 정확히 동일 문자열. `Issue / Ticket` 이 비어 폴백된 경우 `Task ID` 값을 prefix 없이 그대로 (예: `8852`). 식별 불가는 `unknown`.
79
+ {{ t("ticketCoverage.ruleNote") }}
94
80
 
95
81
  {% endif %}
96
82
  ## Execution Status by Agent
97
83
 
98
- worker 의 status, 배정 모델, key finding 을 한 표에 모읍니다. worker 산출물을 근거 없는 주장으로 대체하지 않습니다.
84
+ {{ t("sectionIntro.executionStatus") }}
99
85
 
100
- | Agent | Role | Model | Status | 처리 토큰 | 환산 토큰 | 비용 (USD) | Duration | Summary of Key Findings |
86
+ | Agent | Role | Model | Status | {{ t("columns.rawTokens") }} | {{ t("columns.billableTokens") }} | {{ t("columns.cost") }} | Duration | Summary of Key Findings |
101
87
  |-------|------|-------|--------|-----------|-----------|------------|----------|-------------------------|
102
88
  {% for row in executionStatus -%}
103
89
  | {{ row.agent }} | {{ row.role }} | {{ row.model }} | {{ row.status }} | {{ row.totalTokens | format_int }}{% if row.cliTotalTokens %} (CLI: {{ row.cliTotalTokens | format_int }}){% endif %} | {{ row.billableTokens | format_int }} | {{ row.costUsd | format_usd }}{% if row.cliCostUsd %} (+ CLI {{ row.cliCostUsd | format_usd }}){% endif %} | {{ row.durationMs | format_duration_ms }} | {{ row.summary }} |
104
90
  {% endfor %}
105
91
 
106
- ## Token Usage Summary
92
+ ## {{ t("tokenSummary.heading") }}
107
93
 
108
- | 항목 | 처리 토큰 | 환산 토큰 (input 기준) | 비용 (USD) |
94
+ | {{ t("tokenSummary.tableHeaderItem") }} | {{ t("columns.rawTokens") }} | {{ t("columns.billableTokensInputEquiv") }} | {{ t("columns.cost") }} |
109
95
  |------|-----------|------------------------|------------|
110
- | Lead | `{{ tokenUsage.lead.totalTokens | format_int }}` | `{{ tokenUsage.lead.billableTokens | format_int }}` | `{{ tokenUsage.lead.costUsd | format_usd }}` |
111
- | Worker 합계 | `{{ tokenUsage.worker.totalTokens | format_int }}` | `{{ tokenUsage.worker.billableTokens | format_int }}` | `{{ tokenUsage.worker.costUsd | format_usd }}` |
112
- | **전체 합계** | **`{{ tokenUsage.grand.totalTokens | format_int }}`** | **`{{ tokenUsage.grand.billableTokens | format_int }}`** | **`{{ tokenUsage.grand.costUsd | format_usd }}`** |
113
- | Codex/Gemini CLI 추가 비용 | | | `{{ tokenUsage.cli.costUsd | format_usd }}` |
96
+ | {{ t("tokenSummary.rowLead") }} | `{{ tokenUsage.lead.totalTokens | format_int }}` | `{{ tokenUsage.lead.billableTokens | format_int }}` | `{{ tokenUsage.lead.costUsd | format_usd }}` |
97
+ | {{ t("tokenSummary.rowWorkerTotal") }} | `{{ tokenUsage.worker.totalTokens | format_int }}` | `{{ tokenUsage.worker.billableTokens | format_int }}` | `{{ tokenUsage.worker.costUsd | format_usd }}` |
98
+ | {{ t("tokenSummary.rowGrandTotal") }} | **`{{ tokenUsage.grand.totalTokens | format_int }}`** | **`{{ tokenUsage.grand.billableTokens | format_int }}`** | **`{{ tokenUsage.grand.costUsd | format_usd }}`** |
99
+ | {{ t("tokenSummary.rowCliExtra") }} | | | `{{ tokenUsage.cli.costUsd | format_usd }}` |
114
100
 
115
- {# Phase 6 시점에는 numeric cells null 모두 `--` 로 렌더링.
116
- Phase 7 okstra-token-usage.py data.json 의 tokenUsage 를 채우고
117
- renderer 재호출하여 최종 markdown 을 다시 생성합니다. #}
101
+ {# At Phase 6 numeric cells are null and render as `--`.
102
+ Phase 7's okstra-token-usage.py populates tokenUsage in data.json then
103
+ re-invokes this renderer to produce the final markdown. #}
118
104
 
119
105
  ## 1. Cross Verification Results
120
106
 
@@ -127,13 +113,13 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
127
113
  | {{ row.round }} | {{ row.inputQueueSize }} | {{ row.resolvedCount }} | {{ row.carriedForwardCount }} | {{ row.dispatches }} | {{ row.skippedWorkers }} |
128
114
  {% endfor %}
129
115
 
130
- - `round2SkippedReason`: `{{ crossVerification.roundHistory.round2SkippedReason }}` ← 값은 `queue-empty | max-rounds-1 | all-reverify-non-result | not-skipped | convergence-disabled | single-analyser-only` 중 하나.
116
+ - `round2SkippedReason`: `{{ crossVerification.roundHistory.round2SkippedReason }}` ← {{ t("roundHistory.round2SkippedReasonNote") }}
131
117
 
132
118
  {% endif %}
133
119
  ### 1.1 Consensus
134
120
 
135
121
  {% if crossVerification.consensus | length == 0 -%}
136
- - 합의 항목 없음.
122
+ {{ t("emptyState.consensusItems") }}
137
123
  {%- else %}
138
124
  | ID | Ticket ID | Statement | Source items (worker:item) | Evidence (path:line / log / worker report) |
139
125
  |----|-----------|-----------|----------------------------|---------------------------------------------|
@@ -142,12 +128,12 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
142
128
  {% endfor %}
143
129
  {%- endif %}
144
130
 
145
- `Source items` 규칙: 본 합의 row 가 어느 워커의 어느 항목들에서 합성됐는지를 `<worker>:<item-id>` 페어 콤마-리스트로 적습니다. 자세한 정책은 `prompts/profiles/_common-contract.md` "Cross-worker traceability" SSOT.
131
+ {{ t("sectionIntro.sourceItemsRule") }}
146
132
 
147
133
  ### 1.2 Differences
148
134
 
149
135
  {% if crossVerification.differences | length == 0 -%}
150
- - 유의미한 차이 없음. 1.1 Consensus 가 그대로 유효합니다.
136
+ {{ t("emptyState.differences") }}
151
137
  {%- else %}
152
138
  | ID | Ticket ID | Disagreement | Workers (position + item) | Evidence |
153
139
  |----|-----------|--------------|---------------------------|----------|
@@ -158,22 +144,22 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
158
144
 
159
145
  ## 2. Final Verdict
160
146
 
161
- 최종 결론과 권장 방향을 한 표로 명시합니다. `Direction` ∈ `continue-investigation / begin-implementation / approve / reject / hold`. `task-type` 이 `final-verification` 이면 `Verdict Token` 은 `accepted / conditional-accept / blocked` 중 하나여야 하며, `release-handoff` 는 이 값을 진입 게이트로 사용합니다. 다른 task-type 에서는 `not-applicable`.
147
+ {{ t("finalVerdict.intro") }}
162
148
 
163
- | 항목 | |
149
+ | {{ t("verdictCard.tableHeaderLabel") }} | {{ t("verdictCard.tableHeaderValue") }} |
164
150
  |------|----|
165
151
  | Final Conclusion | {{ finalVerdict.finalConclusion }} |
166
152
  | Verdict Token | `{{ finalVerdict.verdictToken }}` |
167
153
  | Direction | `{{ finalVerdict.direction }}` |
168
- | 근거 요약 | {{ finalVerdict.rationaleRowIds | join(', ') }} |
169
- | 다음 단계 | {{ finalVerdict.nextStep }} |
154
+ | {{ t("verdictCard.rationaleLabel") }} | {{ finalVerdict.rationaleRowIds | join(', ') }} |
155
+ | {{ t("verdictCard.nextStepLabel") }} | {{ finalVerdict.nextStep }} |
170
156
 
171
157
  ## 3. Evidence and Detailed Analysis
172
158
 
173
159
  ### 3.1 Primary Evidence
174
160
 
175
161
  {% if evidence.primary | length == 0 -%}
176
- - 증거 없음.
162
+ {{ t("emptyState.primaryEvidence") }}
177
163
  {%- else %}
178
164
  | ID | Ticket ID | Evidence | Source items (worker:item) | Source (path:line / log) |
179
165
  |----|-----------|----------|----------------------------|---------------------------|
@@ -182,12 +168,12 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
182
168
  {% endfor %}
183
169
  {%- endif %}
184
170
 
185
- `Source items` 컬럼 규칙은 §1.1 과 동일.
171
+ {{ t("evidence.sourceItemsColumnNote") }}
186
172
 
187
173
  ### 3.2 Secondary Evidence or Alternate Interpretations
188
174
 
189
175
  {% if not evidence.secondary or evidence.secondary | length == 0 -%}
190
- - 보조 증거 또는 대안 해석 없음.
176
+ {{ t("emptyState.secondaryEvidence") }}
191
177
  {%- else %}
192
178
  | ID | Ticket ID | Hypothesis or supporting evidence | Source / confidence |
193
179
  |----|-----------|-----------------------------------|---------------------|
@@ -199,7 +185,7 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
199
185
  ## 4. Missing Information and Risks
200
186
 
201
187
  {% if missingInformation | length == 0 -%}
202
- - 누락된 정보·위험 없음.
188
+ {{ t("emptyState.risks") }}
203
189
  {%- else %}
204
190
  | ID | Ticket ID | Item | Risk if ignored | Mitigation Owner |
205
191
  |----|-----------|------|-----------------|------------------|
@@ -211,7 +197,7 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
211
197
  {% if header.taskType == 'implementation-planning' %}
212
198
  ## 4.5 Implementation Plan Deliverables
213
199
 
214
- ### 4.5.1 Option Candidates (옵션 후보)
200
+ ### 4.5.1 Option Candidates{% if t("sectionAside.optionCandidates") != "Option Candidates" %} ({{ t("sectionAside.optionCandidates") }}){% endif %}
215
201
 
216
202
  {% for opt in implementationPlanning.optionCandidates %}
217
203
  **{{ opt.name }}**
@@ -224,12 +210,12 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
224
210
  | {{ fs.id }} | `{{ fs.ticketId }}` | {{ fs.action }} | `{{ fs.path }}` | {{ fs.summary }} |
225
211
  {% endfor %}
226
212
 
227
- - 영향 인터페이스 / 공개 계약 / 다운스트림 소비자: {{ opt.interfaces }}
228
- - 폭발 반경 추정: {{ opt.blastRadius }}
213
+ - {{ t("implementationPlanning.optionInterfacesLabel") }}: {{ opt.interfaces }}
214
+ - {{ t("implementationPlanning.optionBlastRadiusLabel") }}: {{ opt.blastRadius }}
229
215
 
230
216
  {% endfor %}
231
217
 
232
- ### 4.5.2 Trade-off Matrix (트레이드오프 매트릭스)
218
+ ### 4.5.2 Trade-off Matrix{% if t("sectionAside.tradeOffMatrix") != "Trade-off Matrix" %} ({{ t("sectionAside.tradeOffMatrix") }}){% endif %}
233
219
 
234
220
  | Option | Complexity | Risk | Reversibility | Test Coverage Cost | Rollout Cost |
235
221
  |--------|-----------|------|---------------|--------------------|--------------|
@@ -237,16 +223,16 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
237
223
  | {{ row.option }} | {{ row.complexity }} | {{ row.risk }} | {{ row.reversibility }} | {{ row.testCoverageCost }} | {{ row.rolloutCost }} |
238
224
  {% endfor %}
239
225
 
240
- ### 4.5.3 Recommended Option (권장 옵션)
226
+ ### 4.5.3 Recommended Option{% if t("sectionAside.recommendedOption") != "Recommended Option" %} ({{ t("sectionAside.recommendedOption") }}){% endif %}
241
227
 
242
- | 항목 | |
228
+ | {{ t("implementationPlanning.recommendedTableHeaderLabel") }} | {{ t("implementationPlanning.recommendedTableHeaderValue") }} |
243
229
  |------|----|
244
230
  | Recommended Option | {{ implementationPlanning.recommendedOption.name }} |
245
- | 핵심 이유 | {{ implementationPlanning.recommendedOption.coreReason }} |
246
- | 근거 (Trade-off / 원칙) | {{ implementationPlanning.recommendedOption.rationale }} |
247
- | 채택되지 않은 옵션 요약 | {{ implementationPlanning.recommendedOption.rejectedSummary }} |
231
+ | {{ t("implementationPlanning.coreReasonLabel") }} | {{ implementationPlanning.recommendedOption.coreReason }} |
232
+ | {{ t("implementationPlanning.rationaleLabel") }} | {{ implementationPlanning.recommendedOption.rationale }} |
233
+ | {{ t("implementationPlanning.rejectedSummaryLabel") }} | {{ implementationPlanning.recommendedOption.rejectedSummary }} |
248
234
 
249
- ### 4.5.4 Stepwise Execution Order (단계별 실행 순서)
235
+ ### 4.5.4 Stepwise Execution Order{% if t("sectionAside.stepwiseExecutionOrder") != "Stepwise Execution Order" %} ({{ t("sectionAside.stepwiseExecutionOrder") }}){% endif %}
250
236
 
251
237
  | Step | Ticket ID | Action (≤ 5min) | Files | Command / Test | Expected outcome |
252
238
  |------|-----------|------------------|-------|----------------|-------------------|
@@ -254,21 +240,21 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
254
240
  | {{ row.step }} | `{{ row.ticketId }}` | {{ row.action }} | `{{ row.files }}` | `{{ row.commandOrTest }}` | {{ row.expectedOutcome }} |
255
241
  {% endfor %}
256
242
 
257
- 규칙: step 은 약 2~5 분. 모든 step 은 정확한 파일 경로와 명령어 포함.
243
+ {{ t("sectionIntro.stepRule") }}
258
244
 
259
- ### 4.5.5 Dependency / Migration Risk (의존성·마이그레이션 위험)
245
+ ### 4.5.5 Dependency / Migration Risk{% if t("sectionAside.dependencyRisk") != "Dependency / Migration Risk" %} ({{ t("sectionAside.dependencyRisk") }}){% endif %}
260
246
 
261
247
  {% if implementationPlanning.dependencyMigrationRisk | length == 0 -%}
262
- - 의존성·마이그레이션 위험 없음.
248
+ {{ t("emptyState.dependencyRisk") }}
263
249
  {%- else %}
264
- | ID | Kind | Item | 영향 | 완화 / 선행 작업 |
250
+ | ID | Kind | Item | {{ t("implementationPlanning.columnImpact") }} | {{ t("implementationPlanning.columnMitigation") }} |
265
251
  |----|------|------|------|------------------|
266
252
  {% for row in implementationPlanning.dependencyMigrationRisk -%}
267
253
  | {{ row.id }} | {{ row.kind }} | {{ row.item }} | {{ row.impact }} | {{ row.mitigation }} |
268
254
  {% endfor %}
269
255
  {%- endif %}
270
256
 
271
- ### 4.5.6 Validation Checklist (검증 체크리스트)
257
+ ### 4.5.6 Validation Checklist{% if t("sectionAside.validationChecklist") != "Validation Checklist" %} ({{ t("sectionAside.validationChecklist") }}){% endif %}
272
258
 
273
259
  | Phase | Ticket ID | Check | Command / Observation | Expected outcome |
274
260
  |-------|-----------|-------|------------------------|-------------------|
@@ -276,17 +262,17 @@ workerId: {{ frontmatter.workerId | yaml_scalar }}
276
262
  | {{ row.phase }} | `{{ row.ticketId }}` | {{ row.check }} | `{{ row.commandOrObservation }}` | {{ row.expectedOutcome }} |
277
263
  {% endfor %}
278
264
 
279
- ### 4.5.7 Rollback Strategy (롤백 전략)
265
+ ### 4.5.7 Rollback Strategy{% if t("sectionAside.rollbackStrategy") != "Rollback Strategy" %} ({{ t("sectionAside.rollbackStrategy") }}){% endif %}
280
266
 
281
- | ID | Step | Action | Trigger signal | 확인 방법 |
267
+ | ID | Step | Action | Trigger signal | {{ t("columns.checkMethod") }} |
282
268
  |----|------|--------|----------------|-----------|
283
269
  {% for row in implementationPlanning.rollbackStrategy -%}
284
270
  | {{ row.id }} | {{ row.step }} | `{{ row.action }}` | {{ row.triggerSignal }} | `{{ row.verificationMethod }}` |
285
271
  {% endfor %}
286
272
 
287
- ### 4.5.9 Plan Body Verification (계획 본문 검증)
273
+ ### 4.5.9 Plan Body Verification{% if t("sectionAside.planBodyVerification") != "Plan Body Verification" %} ({{ t("sectionAside.planBodyVerification") }}){% endif %}
288
274
 
289
- Phase 6 에서 report-writer 가 합성한 4.5 본문을 lead 가 plan-item 단위로 워커들에게 다시 던지고 평결을 수집한 결과.
275
+ {{ t("sectionIntro.planBodyVerification") }}
290
276
 
291
277
  - **Round count**: `{{ implementationPlanning.planBodyVerification.roundCount }}`
292
278
  - **Gate result**: `{{ implementationPlanning.planBodyVerification.gateResult }}`
@@ -310,7 +296,7 @@ Phase 6 에서 report-writer 가 합성한 4.5 본문을 lead 가 plan-item 단
310
296
  #### Dissent log
311
297
 
312
298
  {% if implementationPlanning.planBodyVerification.dissentLog | length == 0 -%}
313
- - 반대 의견 없음.
299
+ {{ t("emptyState.dissent") }}
314
300
  {%- else %}
315
301
  {% for row in implementationPlanning.planBodyVerification.dissentLog -%}
316
302
  - **{{ row.planItem }}**: `{{ row.workerRole }}` — {{ row.body }}
@@ -321,7 +307,7 @@ Phase 6 에서 report-writer 가 합성한 4.5 본문을 lead 가 plan-item 단
321
307
  {% if header.taskType == 'release-handoff' %}
322
308
  ## 4.6 Release Handoff Deliverables
323
309
 
324
- git/gh mutating 명령이 실행된 phase 의 감사 기록.
310
+ {{ t("releaseHandoff.auditNote") }}
325
311
 
326
312
  ### 4.6.1 Source Verification Report
327
313
 
@@ -329,29 +315,29 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
329
315
  - Quoted `Verdict Token` row from that report's `## 2.` table:
330
316
  > {{ releaseHandoff.sourceVerificationReport.verdictTokenQuote }}
331
317
 
332
- ### 4.6.2 Feature Branch & Working-Tree State (run 시작 시점)
318
+ ### 4.6.2 Feature Branch & Working-Tree State{% if t("releaseHandoff.branchStateAside") != "captured at run start" %} ({{ t("releaseHandoff.branchStateAside") }}){% endif %}
333
319
 
334
320
  - Feature branch: `{{ releaseHandoff.featureBranchState.branchName }}`
335
- - `git status --short` 출력:
321
+ - {{ t("releaseHandoff.gitStatusShortLabel") }}:
336
322
  ```
337
323
  {{ releaseHandoff.featureBranchState.gitStatusShort }}
338
324
  ```
339
- - 기존 PR 존재 여부: `{{ releaseHandoff.featureBranchState.existingPrUrl or '(none)' }}`
325
+ - {{ t("releaseHandoff.existingPrLabel") }}: `{{ releaseHandoff.featureBranchState.existingPrUrl or '(none)' }}`
340
326
 
341
- ### 4.6.3 User Selections (메뉴 응답 기록)
327
+ ### 4.6.3 User Selections{% if t("releaseHandoff.userSelectionsAside") != "menu response log" %} ({{ t("releaseHandoff.userSelectionsAside") }}){% endif %}
342
328
 
343
- | 질문 ID | 질문 본문 | 사용자 응답 (원문) | 응답이 가능한 보기 |
329
+ | {{ t("releaseHandoff.questionsTableHeader.questionId") }} | {{ t("releaseHandoff.questionsTableHeader.questionBody") }} | {{ t("releaseHandoff.questionsTableHeader.userResponse") }} | {{ t("releaseHandoff.questionsTableHeader.allowedOptions") }} |
344
330
  |---------|-----------|--------------------|--------------------|
345
- | H1 | 어떤 작업을 실행할까요? | `{{ releaseHandoff.userSelections.h1 }}` | `local only` / `push + PR` / `skip` |
346
- | H2 | PR base 브랜치 (H1=`push + PR` 인 경우) | `{{ releaseHandoff.userSelections.h2 or '(n/a)' }}` | staging / preprod / prod / main / dev / 사용자 입력 |
347
- | H3 | PR title/body 초안 처리 | `{{ releaseHandoff.userSelections.h3 }}` | `use as-is` / `edit then proceed` / `cancel` |
331
+ | H1 | {{ t("releaseHandoff.h1Body") }} | `{{ releaseHandoff.userSelections.h1 }}` | `local only` / `push + PR` / `skip` |
332
+ | H2 | {{ t("releaseHandoff.h2Body") }} | `{{ releaseHandoff.userSelections.h2 or t("releaseHandoff.h2DefaultLabel") }}` | {{ t("releaseHandoff.h2OptionsLabel") }} |
333
+ | H3 | {{ t("releaseHandoff.h3Body") }} | `{{ releaseHandoff.userSelections.h3 }}` | `use as-is` / `edit then proceed` / `cancel` |
348
334
 
349
335
  ### 4.6.4 Executed Commands
350
336
 
351
337
  {% if releaseHandoff.executedCommands | length == 0 -%}
352
- - (mutating 명령 미실행 — H1=`skip` 또는 H3=`cancel`)
338
+ - {{ t("releaseHandoff.noMutationNote") }}
353
339
  {%- else %}
354
- | # | command (verbatim) | exit code | stdout/stderr 요약 |
340
+ | # | command (verbatim) | exit code | {{ t("releaseHandoff.commandsTableHeader.outputSummary") }} |
355
341
  |---|---------------------|-----------|--------------------|
356
342
  {% for row in releaseHandoff.executedCommands -%}
357
343
  | {{ row.number }} | `{{ row.command }}` | `{{ row.exitCode }}` | {{ row.outputSummary }} |
@@ -405,8 +391,8 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
405
391
  - Plan file (project-relative): `{{ implementation.approvedPlanReference.planFile }}`
406
392
  - Approval evidence:
407
393
  > {{ implementation.approvedPlanReference.approvalEvidence }}
408
- - run `EXECUTOR_WORKTREE_PATH`: `{{ implementation.approvedPlanReference.executorWorktreePath }}`
409
- - run 의 base ref: `{{ implementation.approvedPlanReference.baseRefSha }}`
394
+ - {{ t("executionMeta.runExecutorWorktreePath") }}: `{{ implementation.approvedPlanReference.executorWorktreePath }}`
395
+ - {{ t("executionMeta.runBaseRef") }}: `{{ implementation.approvedPlanReference.baseRefSha }}`
410
396
 
411
397
  ### 4.7.2 Commit List
412
398
 
@@ -435,7 +421,7 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
435
421
  ### 4.7.4 Out-of-plan Edits
436
422
 
437
423
  {% if implementation.outOfPlanEdits | length == 0 -%}
438
- - 계획 외 편집 없음.
424
+ {{ t("emptyState.outOfPlanEdits") }}
439
425
  {%- else %}
440
426
  | ID | File | Rationale | Trigger |
441
427
  |----|------|-----------|---------|
@@ -459,8 +445,8 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
459
445
  - Read-only command log: {{ block.readOnlyCommandLog }}
460
446
  - Independent validation re-run: {{ block.independentValidationRerun }}
461
447
  - Style / lint / type-check: {{ block.styleLintTypecheck or '--' }}
462
- - Declined fix recommendations: {{ block.declinedFixRecommendations or '- 없음.' }}
463
- - Discrepancy: {{ block.discrepancy or '- 없음.' }}
448
+ - Declined fix recommendations: {{ block.declinedFixRecommendations or t("emptyState.declinedFixRecommendations") }}
449
+ - Discrepancy: {{ block.discrepancy or t("emptyState.discrepancy") }}
464
450
  {% endfor %}
465
451
 
466
452
  ### 4.7.7 Rollback Verification
@@ -482,11 +468,11 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
482
468
  ### 4.8.1 Source Implementation Report
483
469
 
484
470
  - Path (project-relative): `{{ finalVerification.sourceImplementationReport.path }}`
485
- - 인용된 commit list / diff summary 요약:
471
+ - {{ t("evidenceMeta.commitListSummary") }}:
486
472
  > {{ finalVerification.sourceImplementationReport.commitListQuote }}
487
- - 검증 대상 worktree path: `{{ finalVerification.sourceImplementationReport.worktreePath }}`
488
- - run 시작 시 capture 한 head/base SHA: `{{ finalVerification.sourceImplementationReport.baseHeadSha }}`
489
- - `git status --short` (run 시작 시점):
473
+ - {{ t("evidenceMeta.targetWorktreePath") }}: `{{ finalVerification.sourceImplementationReport.worktreePath }}`
474
+ - {{ t("evidenceMeta.capturedHeadBaseSha") }}: `{{ finalVerification.sourceImplementationReport.baseHeadSha }}`
475
+ - {{ t("evidenceMeta.gitStatusAtRunStart") }}:
490
476
  ```
491
477
  {{ finalVerification.sourceImplementationReport.gitStatusShort }}
492
478
  ```
@@ -506,7 +492,7 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
506
492
  ### 4.8.3 Residual Risk
507
493
 
508
494
  {% if finalVerification.residualRisk | length == 0 -%}
509
- - 추적 대상 잔존 위험 없음.
495
+ {{ t("emptyState.lingeringRisks") }}
510
496
  {%- else %}
511
497
  | ID | Item | Mitigation owner | Escalation trigger |
512
498
  |----|------|------------------|---------------------|
@@ -515,9 +501,9 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
515
501
  {% endfor %}
516
502
  {%- endif %}
517
503
 
518
- ### 4.8.4 Validation Evidence (요구사항 커버리지)
504
+ ### 4.8.4 Validation Evidence{% if t("finalVerification.validationEvidenceAside") != "requirements coverage" %} ({{ t("finalVerification.validationEvidenceAside") }}){% endif %}
519
505
 
520
- | ID | Requirement (plan/brief 인용) | Artifact | Status |
506
+ | ID | {{ t("finalVerification.columnRequirement") }} | Artifact | Status |
521
507
  |----|--------------------------------|----------|--------|
522
508
  {% for row in finalVerification.validationEvidence -%}
523
509
  | {{ row.id }} | {{ row.requirement }} | `{{ row.artifact }}` | {{ row.status }} |
@@ -535,18 +521,27 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
535
521
 
536
522
  {{ finalVerification.routingRecommendation }}
537
523
 
524
+ {% endif %}
525
+ {% if header.taskType == 'improvement-discovery' %}
526
+ ## 4.9 Improvement Candidates
527
+
528
+ > Lens whitelist and column schema enforced by `validators/validate-improvement-report.py`. Row count is bounded by the brief's `candidate-cap` (default 8, absolute max 12).
529
+
530
+ | Cand ID | Lens | Title | Scope | Severity | Effort | Consensus | Source workers | Recommended next-phase | Evidence |
531
+ |---------|------|-------|-------|----------|--------|-----------|----------------|------------------------|----------|
532
+
538
533
  {% endif %}
539
534
  ## 5. Clarification Items
540
535
 
541
- 다음 run 으로 넘어가기 전에 사용자가 답하거나 자료를 첨부해야 하는 항목을 **한 표 안에서** 추적합니다.
536
+ {{ t("sectionIntro.clarificationItems") }}
542
537
 
543
538
  {% if clarificationItems | length == 0 -%}
544
- - 추가 정보 요청 없음. Section 2 의 최종 판단이 그대로 유효합니다.
539
+ {{ t("emptyState.noClarification") }}
545
540
  {%- else %}
546
- 답을 채우신 뒤 같은 phase 를 다시 실행:
541
+ {{ t("clarification.fillAndRerun") }}
547
542
 
548
543
  - Claude Code: `/okstra-run resume-clarification task-key={{ header.taskKey }}`
549
- - 별도 터미널: `scripts/okstra.sh --resume-clarification --task-key {{ header.taskKey }}`
544
+ - {{ t("clarification.separateTerminalLabel") }}: `scripts/okstra.sh --resume-clarification --task-key {{ header.taskKey }}`
550
545
 
551
546
  | ID | Ticket ID | Kind | Statement | Expected form | Blocks | Status | User input |
552
547
  |----|-----------|------|-----------|---------------|--------|--------|-----------|
@@ -554,7 +549,7 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
554
549
  | {{ row.id }} | `{{ row.ticketId }}` | `{{ row.kind }}` | {{ row.statement }} | {{ row.expectedForm }} | `{{ row.blocks }}` | {{ row.status }} | {{ row.userInput or '' }} |
555
550
  {% endfor %}
556
551
 
557
- 컬럼 가이드 (전체 정의는 `prompts/profiles/_common-contract.md §Clarification request policy` SSOT 참조):
552
+ {{ t("clarification.columnGuide") }}
558
553
 
559
554
  - **`Kind`** ∈ `{material, decision, data-point}`.
560
555
  - **`Blocks`** ∈ `{approval, next-phase, none}`.
@@ -572,16 +567,16 @@ git/gh mutating 명령이 실행된 phase 의 감사 기록.
572
567
  {% for cmd in step.commands %}
573
568
  - {{ cmd.label }}:
574
569
  - Claude Code: `{{ cmd.claudeCode }}`
575
- - 별도 터미널: `{{ cmd.terminal }}`
570
+ - {{ t("clarification.separateTerminalLabel") }}: `{{ cmd.terminal }}`
576
571
  {% endfor -%}
577
572
  {%- endif %}
578
573
  {% endfor %}
579
574
  {%- endif %}
580
575
 
581
- ## 7. Follow-up Tasks (후속 작업)
576
+ ## 7. Follow-up Tasks{% if t("followUpTasks.headingAside") != "Follow-up Tasks" %} ({{ t("followUpTasks.headingAside") }}){% endif %}
582
577
 
583
578
  {% if followUpTasks | length == 0 -%}
584
- - 후속 작업 없음. 본 run 의 다음 phase 는 §6 (Recommended Next Steps) 참고.
579
+ {{ t("emptyState.noFollowUp") }}
585
580
  {%- else %}
586
581
  | ID | Ticket ID | Origin | New Task ID | Title | Suggested task-type | Scope (files/areas) | Reason / Why deferred | Priority (P0/P1/P2) | Auto-spawn? |
587
582
  |----|-----------|--------|-------------|-------|---------------------|---------------------|------------------------|---------------------|-------------|
@@ -0,0 +1,135 @@
1
+ {
2
+ "_meta": {
3
+ "lang": "en",
4
+ "note": "okstra final-report fixed strings (English). Keys must mirror ko.json exactly. Add a key here AND in ko.json in the same commit."
5
+ },
6
+ "emptyState": {
7
+ "consensusItems": "- No consensus items.",
8
+ "differences": "- No significant differences. 1.1 Consensus stands as-is.",
9
+ "primaryEvidence": "- No primary evidence.",
10
+ "secondaryEvidence": "- No secondary evidence or alternate interpretations.",
11
+ "risks": "- No missing information or risks.",
12
+ "dependencyRisk": "- No dependency / migration risks.",
13
+ "dissent": "- No dissenting opinions.",
14
+ "outOfPlanEdits": "- No out-of-plan edits.",
15
+ "declinedFixRecommendations": "- None.",
16
+ "discrepancy": "- None.",
17
+ "lingeringRisks": "- No tracked lingering risks.",
18
+ "noClarification": "- No additional information requested. The Section 2 verdict stands as-is.",
19
+ "noFollowUp": "- No follow-up tasks. The next phase for this run is in §6 (Recommended Next Steps)."
20
+ },
21
+ "columns": {
22
+ "summary": "Summary",
23
+ "source": "Source (brief/source/worker)",
24
+ "rawTokens": "Raw tokens",
25
+ "billableTokens": "Billable tokens",
26
+ "billableTokensInputEquiv": "Billable tokens (input-equiv.)",
27
+ "cost": "Cost (USD)",
28
+ "checkMethod": "How to check"
29
+ },
30
+ "sectionAside": {
31
+ "dependencyRisk": "Dependency / Migration Risk",
32
+ "validationChecklist": "Validation Checklist",
33
+ "rollbackStrategy": "Rollback Strategy",
34
+ "planBodyVerification": "Plan Body Verification",
35
+ "recommendedOption": "Recommended Option",
36
+ "optionCandidates": "Option Candidates",
37
+ "tradeOffMatrix": "Trade-off Matrix",
38
+ "stepwiseExecutionOrder": "Stepwise Execution Order"
39
+ },
40
+ "sectionIntro": {
41
+ "verdictCard": "At-a-glance verdict card. Every value in this table MUST exactly match the authoritative values in `## 2. Final Verdict` and `## 6. Recommended Next Steps`.",
42
+ "clarificationCarryIn": "Walk every C-* row of the prior report's `## 5. Clarification Items` table against new evidence. Update each row's `Status` to `resolved` or `obsolete` and carry it into this run's `## 5.` table. Cite the resolution evidence (file:line / log / worker result) inline.",
43
+ "ticketCoverage": "Summarize 3-5 core problems / requirements / verification targets as a table. Base this on the brief, source material, and worker results.",
44
+ "executionStatus": "Aggregate each worker's status, assigned model, and key findings into one table. Do NOT replace worker artifacts with ungrounded claims.",
45
+ "sourceItemsRule": "`Source items` rule: list which worker items this consensus row was synthesised from, as a comma-list of `<worker>:<item-id>` pairs. Full policy: `prompts/profiles/_common-contract.md` \"Cross-worker traceability\" SSOT.",
46
+ "stepRule": "Rule: each step is roughly 2-5 minutes. Every step MUST include exact file paths and commands.",
47
+ "planBodyVerification": "Result of Phase 6 — report-writer's synthesised 4.5 body re-cast to workers by the lead on a plan-item basis, with verdicts collected.",
48
+ "clarificationItems": "Track items that must be answered by the user or backed by attached material before the next run advances, **all inside one table**."
49
+ },
50
+ "tokenSummary": {
51
+ "heading": "Token Usage Summary",
52
+ "tableHeaderItem": "Item",
53
+ "rowLead": "Lead",
54
+ "rowWorkerTotal": "Worker subtotal",
55
+ "rowGrandTotal": "**Grand total**",
56
+ "rowCliExtra": "Codex/Gemini CLI add-on"
57
+ },
58
+ "verdictCard": {
59
+ "tableHeaderLabel": "Item",
60
+ "tableHeaderValue": "Value",
61
+ "approvalRequiredSuffix": "frontmatter `approved` must be `true` to enter `implementation`",
62
+ "rationaleLabel": "Rationale summary",
63
+ "nextStepLabel": "Next step"
64
+ },
65
+ "ticketCoverage": {
66
+ "intro": "Reverse index of tickets covered in this run. All body items are linked to a ticket via the `Ticket ID` column or `[TICKETID: <id>]` tag.",
67
+ "columnSections": "Sections",
68
+ "columnRelatedIds": "Related item IDs",
69
+ "ruleNote": "Rule: `Ticket ID` must match the ticket key exactly as it appears in the body. When `Issue / Ticket` is empty and falls back, use the `Task ID` value as-is without prefix (e.g. `8852`). Use `unknown` when not identifiable."
70
+ },
71
+ "finalVerdict": {
72
+ "intro": "State the final conclusion and recommended direction in one table. `Direction` ∈ `continue-investigation / begin-implementation / approve / reject / hold`. When `task-type` is `final-verification`, `Verdict Token` must be one of `accepted / conditional-accept / blocked`; `release-handoff` uses this value as an entry gate. For all other task-types use `not-applicable`."
73
+ },
74
+ "evidence": {
75
+ "sourceItemsColumnNote": "`Source items` column rule is the same as §1.1."
76
+ },
77
+ "roundHistory": {
78
+ "round2SkippedReasonNote": "value is one of `queue-empty | max-rounds-1 | all-reverify-non-result | not-skipped | convergence-disabled | single-analyser-only`"
79
+ },
80
+ "implementationPlanning": {
81
+ "optionInterfacesLabel": "Affected interfaces / public contracts / downstream consumers",
82
+ "optionBlastRadiusLabel": "Blast radius estimate",
83
+ "recommendedTableHeaderLabel": "Item",
84
+ "recommendedTableHeaderValue": "Value",
85
+ "coreReasonLabel": "Core reason",
86
+ "rationaleLabel": "Rationale (trade-off row / principle)",
87
+ "rejectedSummaryLabel": "Summary of rejected options",
88
+ "columnImpact": "Impact",
89
+ "columnMitigation": "Mitigation / prerequisite"
90
+ },
91
+ "releaseHandoff": {
92
+ "auditNote": "Audit trail for the phase that ran git/gh mutating commands.",
93
+ "branchStateAside": "captured at run start",
94
+ "gitStatusShortLabel": "`git status --short` output",
95
+ "existingPrLabel": "Existing PR",
96
+ "userSelectionsAside": "menu response log",
97
+ "questionsTableHeader": {
98
+ "questionId": "Question ID",
99
+ "questionBody": "Question",
100
+ "userResponse": "User response (raw)",
101
+ "allowedOptions": "Allowed options"
102
+ },
103
+ "h1Body": "Which action should run?",
104
+ "h2Body": "PR base branch (when H1 = `push + PR`)",
105
+ "h3Body": "How should the PR title/body draft be handled?",
106
+ "h2DefaultLabel": "(n/a)",
107
+ "h2OptionsLabel": "staging / preprod / prod / main / dev / user input",
108
+ "noMutationNote": "(no mutating command — H1=`skip` or H3=`cancel`)",
109
+ "commandsTableHeader": {
110
+ "outputSummary": "stdout/stderr summary"
111
+ }
112
+ },
113
+ "executionMeta": {
114
+ "runExecutorWorktreePath": "This run's `EXECUTOR_WORKTREE_PATH`",
115
+ "runBaseRef": "This run's base ref"
116
+ },
117
+ "evidenceMeta": {
118
+ "commitListSummary": "Cited commit list / diff summary",
119
+ "targetWorktreePath": "Target worktree path for verification",
120
+ "capturedHeadBaseSha": "head/base SHA captured at run start",
121
+ "gitStatusAtRunStart": "`git status --short` (at run start)"
122
+ },
123
+ "clarification": {
124
+ "fillAndRerun": "Fill in your answers then re-run the same phase:",
125
+ "separateTerminalLabel": "Separate terminal",
126
+ "columnGuide": "Column guide (full definitions: `prompts/profiles/_common-contract.md §Clarification request policy` SSOT):"
127
+ },
128
+ "followUpTasks": {
129
+ "headingAside": "Follow-up Tasks"
130
+ },
131
+ "finalVerification": {
132
+ "validationEvidenceAside": "requirements coverage",
133
+ "columnRequirement": "Requirement (plan/brief citation)"
134
+ }
135
+ }