okstra 0.7.0 → 0.9.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 (43) hide show
  1. package/README.kr.md +20 -3
  2. package/README.md +20 -3
  3. package/docs/kr/architecture.md +8 -3
  4. package/docs/kr/cli.md +55 -1
  5. package/docs/superpowers/plans/2026-05-12-ticket-id-in-reports.md +638 -0
  6. package/docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md +131 -0
  7. package/package.json +1 -1
  8. package/runtime/BUILD.json +2 -2
  9. package/runtime/agents/SKILL.md +13 -0
  10. package/runtime/agents/workers/claude-worker.md +2 -0
  11. package/runtime/agents/workers/codex-worker.md +2 -0
  12. package/runtime/agents/workers/gemini-worker.md +2 -0
  13. package/runtime/agents/workers/report-writer-worker.md +1 -0
  14. package/runtime/bin/okstra.sh +3 -0
  15. package/runtime/prompts/launch.template.md +11 -0
  16. package/runtime/prompts/profiles/implementation-planning.md +2 -2
  17. package/runtime/prompts/profiles/implementation.md +15 -1
  18. package/runtime/prompts/profiles/release-handoff.md +97 -0
  19. package/runtime/python/lib/okstra/cli.sh +13 -2
  20. package/runtime/python/lib/okstra/globals.sh +2 -0
  21. package/runtime/python/lib/okstra/usage.sh +11 -0
  22. package/runtime/python/okstra_ctl/render.py +21 -5
  23. package/runtime/python/okstra_ctl/run.py +135 -8
  24. package/runtime/python/okstra_ctl/workflow.py +34 -3
  25. package/runtime/python/okstra_ctl/worktree.py +235 -0
  26. package/runtime/skills/okstra-context-loader/SKILL.md +1 -1
  27. package/runtime/skills/okstra-convergence/SKILL.md +11 -5
  28. package/runtime/skills/okstra-report-finder/SKILL.md +1 -0
  29. package/runtime/skills/okstra-report-writer/SKILL.md +6 -0
  30. package/runtime/skills/okstra-run/SKILL.md +2 -1
  31. package/runtime/skills/okstra-status/SKILL.md +14 -3
  32. package/runtime/skills/okstra-team-contract/SKILL.md +19 -0
  33. package/runtime/skills/okstra-time-summary/SKILL.md +1 -0
  34. package/runtime/templates/reports/error-analysis-input.template.md +1 -0
  35. package/runtime/templates/reports/final-report.template.md +144 -21
  36. package/runtime/templates/reports/implementation-input.template.md +1 -0
  37. package/runtime/templates/reports/implementation-planning-input.template.md +1 -0
  38. package/runtime/templates/reports/quick-input.template.md +1 -0
  39. package/runtime/templates/reports/release-handoff-input.template.md +73 -0
  40. package/runtime/templates/reports/task-brief.template.md +5 -0
  41. package/runtime/validators/validate-run.py +136 -4
  42. package/src/install.mjs +133 -2
  43. package/src/uninstall.mjs +46 -9
@@ -0,0 +1,638 @@
1
+ # Ticket ID in Reports Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Workers, lead, and report-writer 산출물의 모든 항목에 ticket 식별자를 박아 한 run이 여러 ticket을 다룰 때 항목·ticket 매핑을 깨지지 않게 한다.
6
+
7
+ **Architecture:** 표 형식 섹션에는 `Ticket ID` 컬럼을, bullet/번호 목록·섹션 헤더에는 `[TICKETID: <id>]` 타이틀 태그를 강제한다. 채움 우선순위는 `Issue / Ticket` → `Task ID` → `unknown`이며, 다중 ticket은 콤마 구분이다. 변경은 4개 phase(`requirements-discovery`, `error-analysis`, `implementation-planning`, `implementation`)에 한정한다.
8
+
9
+ **Tech Stack:** Markdown 템플릿 · SKILL.md (skills/) · agents/workers/*.md
10
+
11
+ **Spec reference:** `docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md`
12
+
13
+ ---
14
+
15
+ ## File Structure
16
+
17
+ 각 파일의 책임:
18
+
19
+ - `skills/okstra-team-contract/SKILL.md` — Ticket Tagging 규칙의 authoritative source.
20
+ - `skills/okstra-convergence/SKILL.md` — Round 0 파싱이 ticket을 그룹핑 키 일부로 사용.
21
+ - `templates/reports/final-report.template.md` — 상단 Ticket Coverage 표 + 본문 표 전환·컬럼 추가.
22
+ - `templates/reports/{error-analysis,implementation-planning,implementation,quick}-input.template.md` — Identity 가이드 문구.
23
+ - `templates/reports/task-brief.template.md` — Identity 가이드 + Workers 질문.
24
+ - `agents/workers/{claude,codex,gemini}-worker.md` — Worker Output Structure 절에 ticket 표기 한 단락.
25
+ - `agents/workers/report-writer-worker.md` — Authoring Contract에 ticket 보존 의무.
26
+
27
+ 검증 전략: 마크다운 산출물이라 unit test를 새로 만들지 않고, 각 task의 마지막 step에서 `grep`으로 변경이 들어갔는지 확인 후 커밋한다. 정적 validator 추가는 spec 7항에 따라 후속 작업으로 분리한다.
28
+
29
+ ---
30
+
31
+ ## Task 1: team-contract Ticket Tagging 규칙 신설
32
+
33
+ **Files:**
34
+ - Modify: `skills/okstra-team-contract/SKILL.md` (around lines 197-210, Worker Output Contract section)
35
+
36
+ - [ ] **Step 1: Edit — Worker Output Contract 직후에 Ticket Tagging 하위 섹션 추가**
37
+
38
+ `Code evidence must include file paths and line numbers.` 줄(현재 210행) 바로 다음에 빈 줄을 두고 다음 블록을 삽입한다.
39
+
40
+ ```markdown
41
+ ### Ticket Tagging (mandatory for sections 1–5)
42
+
43
+ Every item in sections 1–5 MUST be tagged with the ticket(s) it relates to. This applies whenever the run's task type is `requirements-discovery`, `error-analysis`, `implementation-planning`, or `implementation`.
44
+
45
+ - **Table-form items**: include a `Ticket ID` column. The column is placed immediately after the row-ID column (e.g. after `F-001`, `M-001`).
46
+ - **Bullet / numbered-list items**: prepend `[TICKETID: <id>]` to the item title, immediately after the row ID and before the body text. Example: `- F-001 [TICKETID: TICKET-123] — <summary> (path:line)`.
47
+ - **Section headers in the final report** (e.g. `### 4.5.3 Recommended Option`): append `[TICKETID: <id>]` to the header when the section is scoped to a specific ticket. Headers that span all tickets in the run omit the tag.
48
+
49
+ Ticket ID fill rule (in order):
50
+
51
+ 1. Use the `Issue / Ticket` value from the run's input template.
52
+ 2. If empty, fall back to the `Task ID` value (no prefix; write `8852` not `task:8852`).
53
+ 3. If both are absent, write `unknown`. This is allowed but signals an input-template defect — the worker SHOULD also record a `Missing Information` item noting the absent identifier.
54
+ 4. When a single item maps to multiple tickets, separate them with commas: `TICKET-123, TICKET-456`. Ticket IDs containing commas are not supported.
55
+
56
+ Workers MUST apply these rules to every item in sections 1–5. Lead and report-writer MUST preserve the tagging when carrying worker findings into the final report.
57
+
58
+ For phases other than the four listed above (e.g. `release-handoff`, `final-verification`), ticket tagging is optional.
59
+ ```
60
+
61
+ - [ ] **Step 2: Verify the section is present**
62
+
63
+ Run: `grep -n "Ticket Tagging (mandatory for sections 1–5)" skills/okstra-team-contract/SKILL.md`
64
+ Expected: 단일 라인 매치.
65
+
66
+ Run: `grep -n "TICKETID: <id>" skills/okstra-team-contract/SKILL.md`
67
+ Expected: 최소 2건 매치 (bullet 예시 + section header 예시).
68
+
69
+ - [ ] **Step 3: Mirror to installed copy**
70
+
71
+ ```bash
72
+ cp skills/okstra-team-contract/SKILL.md /Users/devonshin/.claude/skills/okstra-team-contract/SKILL.md
73
+ ```
74
+
75
+ 검증: `diff -q skills/okstra-team-contract/SKILL.md /Users/devonshin/.claude/skills/okstra-team-contract/SKILL.md`
76
+ Expected: 출력 없음.
77
+
78
+ - [ ] **Step 4: Commit**
79
+
80
+ ```bash
81
+ git add skills/okstra-team-contract/SKILL.md
82
+ git commit -m "feat(team-contract): require ticket tagging in worker sections 1–5"
83
+ ```
84
+
85
+ ---
86
+
87
+ ## Task 2: convergence Round 0 ticket 추출 규칙
88
+
89
+ **Files:**
90
+ - Modify: `skills/okstra-convergence/SKILL.md` (around lines 36-46, Round 0 numbered list)
91
+
92
+ - [ ] **Step 1: Edit — Round 0 항목 1을 ticket 추출 포함으로 교체**
93
+
94
+ `skills/okstra-convergence/SKILL.md`의 현재 항목 1 (`In the "Findings" section ...`) 부터 4 (`When grouping is ambiguous ...`)까지를 다음으로 교체한다.
95
+
96
+ ```markdown
97
+ 1. In the "Findings" section of each worker's results, identify individual items by number (F-001, F-002, ...) and parse the ticket identifier attached to each item:
98
+ - For table-form findings, read the `Ticket ID` column.
99
+ - For bullet/numbered findings, parse `[TICKETID: <id>]` from the item title.
100
+ - Items with multiple tickets (e.g. `TICKET-123, TICKET-456`) expand to a set of ticket keys.
101
+ - Items tagged `unknown` keep the literal `unknown` as their ticket key.
102
+ 2. For each finding, record the summary, evidence (file path, line number, basis), the worker who identified it, and the parsed ticket set.
103
+ 3. Claude Lead groups findings based on semantic similarity AND ticket-set equality:
104
+ - Same semantics + same ticket set across 2+ workers → immediately reach `full consensus`.
105
+ - Same semantics but disjoint ticket sets → keep as separate groups (do NOT over-merge across tickets).
106
+ - Only one worker confirms a finding → `unique`, enter the verification queue.
107
+ 4. When grouping is ambiguous, prefer splitting over merging (avoid over-merging).
108
+ 5. Persist each finding's ticket set in the convergence state artifact under a `ticketIds` field on the finding record. Re-verification rounds carry the same field forward.
109
+ ```
110
+
111
+ - [ ] **Step 2: Verify**
112
+
113
+ Run: `grep -n "ticket-set equality" skills/okstra-convergence/SKILL.md`
114
+ Expected: 단일 매치.
115
+
116
+ Run: `grep -n "ticketIds" skills/okstra-convergence/SKILL.md`
117
+ Expected: 단일 매치.
118
+
119
+ - [ ] **Step 3: Mirror to installed copy**
120
+
121
+ ```bash
122
+ cp skills/okstra-convergence/SKILL.md /Users/devonshin/.claude/skills/okstra-convergence/SKILL.md
123
+ ```
124
+
125
+ - [ ] **Step 4: Commit**
126
+
127
+ ```bash
128
+ git add skills/okstra-convergence/SKILL.md
129
+ git commit -m "feat(convergence): use ticket set as part of finding-group key"
130
+ ```
131
+
132
+ ---
133
+
134
+ ## Task 3: final-report 상단 Ticket Coverage 표 추가
135
+
136
+ **Files:**
137
+ - Modify: `templates/reports/final-report.template.md` (Summary 섹션 직후, 현재 30행 부근)
138
+
139
+ - [ ] **Step 1: Edit — `## Summary of the Problem or Verification Target` 블록 뒤에 신규 섹션 삽입**
140
+
141
+ `## Execution Status by Agent` 라인 바로 앞에 다음을 삽입한다.
142
+
143
+ ```markdown
144
+ ## Ticket Coverage
145
+
146
+ 이 run이 다룬 ticket을 한 자리에서 확인하는 인덱스 표입니다. 본 보고서의 본문 항목들은 모두 `Ticket ID` 컬럼 또는 `[TICKETID: <id>]` 태그로 ticket과 묶여 있으며, 이 표는 그 역방향 인덱스입니다.
147
+
148
+ - 한 run이 단일 ticket만 다루는 경우: 표 대신 다음 한 줄로 대체할 수 있습니다 — `- Single ticket run: <TICKET-or-task-fallback>`
149
+ - 다중 ticket이거나, `Issue / Ticket`이 비어 `Task ID` 폴백을 쓴 항목이 섞여 있는 경우: 표를 채웁니다.
150
+
151
+ | Ticket ID | 등장 섹션 | 관련 항목 IDs |
152
+ |-----------|-----------|---------------|
153
+ | `<TICKET-123>` | `1.1, 3.1, 4.5.4` | `F-001, F-003, A1` |
154
+
155
+ 규칙:
156
+
157
+ - `Ticket ID` 컬럼은 본문에서 등장한 ticket 키와 정확히 동일한 문자열을 사용합니다. `Issue / Ticket`이 비어 폴백된 경우 `Task ID` 값을 prefix 없이 그대로 적습니다 (예: `8852`). 어느 쪽으로도 식별 불가한 경우 `unknown`을 사용합니다.
158
+ - `등장 섹션`은 본 보고서의 섹션 번호를 콤마로 구분합니다. 동일 ticket이 여러 섹션에 등장하면 모두 나열합니다.
159
+ - `관련 항목 IDs`는 `F-001`, `M-002`, `A1`, `Q1` 같은 row ID를 콤마로 나열합니다. 섹션 헤더 단위로만 ticket이 표시된 경우(개별 row ID가 없는 경우)에는 헤더 번호 자체를 적습니다 (예: `4.5.3`).
160
+ ```
161
+
162
+ - [ ] **Step 2: Verify**
163
+
164
+ Run: `grep -n "^## Ticket Coverage" templates/reports/final-report.template.md`
165
+ Expected: 단일 매치, 라인 번호는 `Summary` 다음, `Execution Status` 앞.
166
+
167
+ ---
168
+
169
+ ## Task 4: final-report 1.x / 3.x / 4 섹션을 표로 전환
170
+
171
+ **Files:**
172
+ - Modify: `templates/reports/final-report.template.md` (lines 47-69, sections 1.1 / 1.2 / 3.1 / 3.2 / 4)
173
+
174
+ - [ ] **Step 1: Edit — 1.1 Consensus 본문을 표로 교체**
175
+
176
+ 기존:
177
+
178
+ ```markdown
179
+ ### 1.1 Consensus
180
+ - Record the conclusions and evidence that multiple workers support.
181
+ ```
182
+
183
+ → 교체:
184
+
185
+ ```markdown
186
+ ### 1.1 Consensus
187
+
188
+ | ID | Ticket ID | Statement | Supporting workers | Evidence (path:line / log / worker report) |
189
+ |----|-----------|-----------|--------------------|---------------------------------------------|
190
+ | C-001 | `<TICKET-or-fallback>` | <합의된 결론> | claude, codex, gemini | <증거 위치> |
191
+
192
+ - 합의된 결론을 row마다 기록합니다. `Ticket ID`는 본 보고서 상단 `Ticket Coverage` 규칙을 따릅니다.
193
+ ```
194
+
195
+ - [ ] **Step 2: Edit — 1.2 Differences 본문 교체**
196
+
197
+ 기존:
198
+
199
+ ```markdown
200
+ ### 1.2 Differences
201
+ - Record meaningful differences in conclusions, interpretation, or evidence handling.
202
+ - If there is no meaningful difference, state that clearly.
203
+ ```
204
+
205
+ → 교체:
206
+
207
+ ```markdown
208
+ ### 1.2 Differences
209
+
210
+ | ID | Ticket ID | Disagreement | Workers (position) | Evidence |
211
+ |----|-----------|--------------|--------------------|----------|
212
+ | D-001 | `<TICKET-or-fallback>` | <차이 요약> | claude (A) / codex (B) / gemini (-) | <증거 위치> |
213
+
214
+ - 유의미한 차이가 없을 경우 표 대신 다음 한 줄을 적습니다 — `- 유의미한 차이 없음. 1.1 Consensus가 그대로 유효합니다.`
215
+ ```
216
+
217
+ - [ ] **Step 3: Edit — 3.1 Primary Evidence 본문 교체**
218
+
219
+ 기존:
220
+
221
+ ```markdown
222
+ ### 3.1 Primary Evidence
223
+ - Cite concrete evidence such as file paths, line numbers, brief contents, logs, or worker reports.
224
+ ```
225
+
226
+ → 교체:
227
+
228
+ ```markdown
229
+ ### 3.1 Primary Evidence
230
+
231
+ | ID | Ticket ID | Evidence | Source (path:line / log / worker report) |
232
+ |----|-----------|----------|------------------------------------------|
233
+ | E-001 | `<TICKET-or-fallback>` | <증거 한 줄 요약> | <출처> |
234
+ ```
235
+
236
+ - [ ] **Step 4: Edit — 3.2 Secondary Evidence 본문 교체**
237
+
238
+ 기존:
239
+
240
+ ```markdown
241
+ ### 3.2 Secondary Evidence or Alternate Interpretations
242
+ - Record supporting evidence, alternate hypotheses, or lower-confidence interpretations when relevant.
243
+ ```
244
+
245
+ → 교체:
246
+
247
+ ```markdown
248
+ ### 3.2 Secondary Evidence or Alternate Interpretations
249
+
250
+ | ID | Ticket ID | Hypothesis or supporting evidence | Source / confidence |
251
+ |----|-----------|-----------------------------------|---------------------|
252
+ | S-001 | `<TICKET-or-fallback>` | <보조 증거 또는 대안 해석> | <출처 + low/mid> |
253
+
254
+ - 해당 없음 시: `- 보조 증거 또는 대안 해석 없음.`
255
+ ```
256
+
257
+ - [ ] **Step 5: Edit — 4. Missing Information and Risks 본문 교체**
258
+
259
+ 기존:
260
+
261
+ ```markdown
262
+ ## 4. Missing Information and Risks
263
+ - Explicitly state any item that requires `I don't know` or `uncertain`.
264
+ - Record the missing information and risks that weaken the current conclusion.
265
+ ```
266
+
267
+ → 교체:
268
+
269
+ ```markdown
270
+ ## 4. Missing Information and Risks
271
+
272
+ | ID | Ticket ID | Item | Risk if ignored |
273
+ |----|-----------|------|-----------------|
274
+ | R-001 | `<TICKET-or-fallback>` | <누락 정보 또는 불확실 항목> | <무시할 때의 위험> |
275
+
276
+ - `I don't know` / `uncertain`으로 표기해야 하는 항목은 모두 표 안에 두고 본문 산문 형식으로 흩지 않습니다.
277
+ ```
278
+
279
+ - [ ] **Step 6: Verify**
280
+
281
+ Run: `grep -nE "^### 1\.(1|2)|^### 3\.(1|2)|^## 4\. Missing" templates/reports/final-report.template.md`
282
+ Expected: 5건 매치.
283
+
284
+ Run: `grep -nE "\| C-001 \||\| D-001 \||\| E-001 \||\| S-001 \||\| R-001 \|" templates/reports/final-report.template.md`
285
+ Expected: 5건 매치 (각 표의 예시 row).
286
+
287
+ ---
288
+
289
+ ## Task 5: final-report 4.5.x / 5.x 표 컬럼 추가
290
+
291
+ **Files:**
292
+ - Modify: `templates/reports/final-report.template.md` (4.5.1, 4.5.4, 4.5.6, 5.1, 5.2)
293
+
294
+ - [ ] **Step 1: Edit — 4.5.1 Option Candidates 안내문 + File Structure 행 컨벤션 갱신**
295
+
296
+ `### 4.5.1 Option Candidates (옵션 후보)` 블록(현재 76-80행)의 `File Structure` 줄을 교체한다.
297
+
298
+ 기존:
299
+
300
+ ```markdown
301
+ - **File Structure**: `Create: <path> — <responsibility>` / `Modify: <path>:<line-range> — <change summary>` / `Delete: <path> — <reason>` 형식으로 파일 단위 책임을 한 줄씩 명시합니다.
302
+ ```
303
+
304
+ → 교체:
305
+
306
+ ```markdown
307
+ - **File Structure**: 다음 표 형식으로 파일 단위 책임을 한 줄씩 명시합니다. 행마다 `Ticket ID` 컬럼을 채웁니다.
308
+
309
+ | ID | Ticket ID | Action | Path (and line-range) | Change summary |
310
+ |----|-----------|--------|------------------------|----------------|
311
+ | OF-001 | `<TICKET-or-fallback>` | Create / Modify / Delete | `<path>[:<line-range>]` | <한 줄 요약> |
312
+ ```
313
+
314
+ - [ ] **Step 2: Edit — 4.5.4 Stepwise Execution Order을 표 + 컬럼으로 전환**
315
+
316
+ `### 4.5.4 Stepwise Execution Order (단계별 실행 순서)`의 번호 목록을 다음으로 교체한다.
317
+
318
+ ```markdown
319
+ ### 4.5.4 Stepwise Execution Order (단계별 실행 순서)
320
+
321
+ | Step | Ticket ID | Action (≤ 5min) | Files | Command / Test | Expected outcome |
322
+ |------|-----------|------------------|-------|----------------|-------------------|
323
+ | 1 | `<TICKET-or-fallback>` | <예: 실패하는 테스트 작성> | `tests/foo_test.py` | `pytest tests/foo_test.py::test_x -v` | FAIL with <reason> |
324
+
325
+ 규칙:
326
+
327
+ - 한 step은 약 2~5분 안에 완료할 수 있는 작은 작업이어야 합니다(예: "X에 실패하는 테스트 작성", "테스트 실행해 실패 확인", "최소 구현", "테스트 통과 확인", "commit").
328
+ - 모든 step은 정확한 파일 경로와 정확한 명령어를 포함합니다. 코드 단계라면 실제 코드 또는 diff 스케치를 함께 적습니다 (`Action` 셀에 줄바꿈 가능).
329
+ - TDD 순서(failing test → implementation → green → commit)가 가능한 영역이라면 이 순서를 따릅니다.
330
+ - 한 step이 여러 ticket을 동시에 진행한다면 `Ticket ID`에 콤마로 함께 적습니다.
331
+ ```
332
+
333
+ - [ ] **Step 3: Edit — 4.5.6 Validation Checklist를 표 + 컬럼으로 전환**
334
+
335
+ `### 4.5.6 Validation Checklist (검증 체크리스트)` 본문을 다음으로 교체한다.
336
+
337
+ ```markdown
338
+ ### 4.5.6 Validation Checklist (검증 체크리스트)
339
+
340
+ | Phase | Ticket ID | Check | Command / Observation | Expected outcome |
341
+ |-------|-----------|-------|------------------------|-------------------|
342
+ | pre | `<TICKET-or-fallback>` | <체크 이름> | `<정확한 명령어 또는 관찰 지점>` | <기대 출력 / 상태> |
343
+ | mid | `<TICKET-or-fallback>` | <체크 이름> | `<...>` | <...> |
344
+ | post | `<TICKET-or-fallback>` | <체크 이름> | `<...>` | <...> |
345
+
346
+ 추상적 서술 금지. 모든 row는 명령어 또는 관찰 가능한 결과를 포함해야 합니다.
347
+ ```
348
+
349
+ - [ ] **Step 4: Edit — 5.1 표에 `Ticket ID` 컬럼 삽입**
350
+
351
+ `### 5.1 추가 자료 요청` 표(현재 187-189행)의 헤더와 예시 row를 교체한다.
352
+
353
+ 기존 헤더:
354
+
355
+ ```markdown
356
+ | 자료 ID | 무엇을 / 왜 필요한지 (문장으로 서술) | 어디에서 가져올 수 있는지 (파일 경로, 시스템 이름, URL 등) | 어디에 두면 되는지 / 어떻게 전달해 주실지 | Status | 사용자가 첨부한 위치 또는 메모 (다음 run 전에 사용자가 채움) |
357
+ |---------|--------------------------------------|------------------------------------------------------------|--------------------------------------------|--------|---------------------------------------------------------------|
358
+ ```
359
+
360
+ → 교체:
361
+
362
+ ```markdown
363
+ | 자료 ID | Ticket ID | 무엇을 / 왜 필요한지 (문장으로 서술) | 어디에서 가져올 수 있는지 (파일 경로, 시스템 이름, URL 등) | 어디에 두면 되는지 / 어떻게 전달해 주실지 | Status | 사용자가 첨부한 위치 또는 메모 (다음 run 전에 사용자가 채움) |
364
+ |---------|-----------|--------------------------------------|------------------------------------------------------------|--------------------------------------------|--------|---------------------------------------------------------------|
365
+ ```
366
+
367
+ 예시 row(`A1 | <어떤 자료를...>`)도 두 번째 셀에 `<TICKET-or-fallback>`을 끼워 넣어 컬럼 수를 맞춘다.
368
+
369
+ 기존:
370
+
371
+ ```markdown
372
+ | A1 | <어떤 자료를 왜 받아야 하는지를 1~2문장으로. 예: ... > | <예: ...> | <예: ...> | open | <빈칸으로 두고 다음 run 전에 사용자가 채움> |
373
+ ```
374
+
375
+ → 교체:
376
+
377
+ ```markdown
378
+ | A1 | `<TICKET-or-fallback>` | <어떤 자료를 왜 받아야 하는지를 1~2문장으로. 예: ... > | <예: ...> | <예: ...> | open | <빈칸으로 두고 다음 run 전에 사용자가 채움> |
379
+ ```
380
+
381
+ - [ ] **Step 5: Edit — 5.2 표에 `Ticket ID` 컬럼 삽입**
382
+
383
+ `### 5.2 사용자 확인 질문` 표(현재 201-203행)의 헤더를 교체한다.
384
+
385
+ 기존:
386
+
387
+ ```markdown
388
+ | 질문 ID | 이 답이 필요한 이유 (왜) | 질문 본문 (무엇을 묻는지, 풀어 쓴 문장) | 기대하는 답의 형태 / 보기 | Blocking (예 / 아니오) | Status | 사용자 답변 (다음 run 전에 사용자가 채움) |
389
+ |---------|--------------------------|-----------------------------------------|----------------------------|------------------------|--------|--------------------------------------------|
390
+ ```
391
+
392
+ → 교체:
393
+
394
+ ```markdown
395
+ | 질문 ID | Ticket ID | 이 답이 필요한 이유 (왜) | 질문 본문 (무엇을 묻는지, 풀어 쓴 문장) | 기대하는 답의 형태 / 보기 | Blocking (예 / 아니오) | Status | 사용자 답변 (다음 run 전에 사용자가 채움) |
396
+ |---------|-----------|--------------------------|-----------------------------------------|----------------------------|------------------------|--------|--------------------------------------------|
397
+ ```
398
+
399
+ 예시 row의 두 번째 셀에도 `<TICKET-or-fallback>`을 추가한다.
400
+
401
+ 기존:
402
+
403
+ ```markdown
404
+ | Q1 | <예: "이 결정에 따라 ..."> | <예: "지난 주 ..."> | <예: "다음 중 한 줄로 ..."> | 예 | open | <빈칸으로 두고 다음 run 전에 사용자가 채움> |
405
+ ```
406
+
407
+ → 교체:
408
+
409
+ ```markdown
410
+ | Q1 | `<TICKET-or-fallback>` | <예: "이 결정에 따라 ..."> | <예: "지난 주 ..."> | <예: "다음 중 한 줄로 ..."> | 예 | open | <빈칸으로 두고 다음 run 전에 사용자가 채움> |
411
+ ```
412
+
413
+ - [ ] **Step 6: Verify**
414
+
415
+ Run: `grep -cE "\| Ticket ID \|" templates/reports/final-report.template.md`
416
+ Expected: 8 이상 (1.1 / 1.2 / 3.1 / 3.2 / 4 / 4.5.1 OF / 4.5.4 / 4.5.6 / 5.1 / 5.2 — Task 3, 4, 5의 표).
417
+
418
+ - [ ] **Step 7: Commit (Tasks 3, 4, 5 일괄)**
419
+
420
+ ```bash
421
+ git add templates/reports/final-report.template.md
422
+ git commit -m "feat(final-report): add ticket coverage + ticket id columns"
423
+ ```
424
+
425
+ ---
426
+
427
+ ## Task 6: 4개 input 템플릿 — Identity 가이드 한 줄 추가
428
+
429
+ **Files:**
430
+ - Modify: `templates/reports/error-analysis-input.template.md`
431
+ - Modify: `templates/reports/implementation-planning-input.template.md`
432
+ - Modify: `templates/reports/implementation-input.template.md`
433
+ - Modify: `templates/reports/quick-input.template.md`
434
+
435
+ - [ ] **Step 1: Edit — 네 파일 모두에서 `- Issue / Ticket:` 줄 바로 다음 줄에 동일한 가이드 추가**
436
+
437
+ 각 파일에서 다음 문자열:
438
+
439
+ ```
440
+ - Issue / Ticket:
441
+ ```
442
+
443
+ 을 다음 두 줄로 교체한다.
444
+
445
+ ```
446
+ - Issue / Ticket:
447
+ - 값이 비면 워커는 `Task ID`로 폴백한다 (prefix 없이 `8852`처럼). 한 run이 여러 ticket을 동시에 다루면 콤마로 구분 (`TICKET-123, TICKET-456`). 어느 쪽으로도 식별 불가하면 `unknown`을 허용한다.
448
+ ```
449
+
450
+ `Edit` tool로 4개 파일에 동일한 교체를 적용한다 (각 파일에서 위 문자열은 1회씩만 등장).
451
+
452
+ - [ ] **Step 2: Verify**
453
+
454
+ Run: `grep -c "값이 비면 워커는 \`Task ID\`로 폴백한다" templates/reports/error-analysis-input.template.md templates/reports/implementation-planning-input.template.md templates/reports/implementation-input.template.md templates/reports/quick-input.template.md`
455
+ Expected: 4 파일 각각 `1` (총 4건).
456
+
457
+ - [ ] **Step 3: Commit**
458
+
459
+ ```bash
460
+ git add templates/reports/error-analysis-input.template.md templates/reports/implementation-planning-input.template.md templates/reports/implementation-input.template.md templates/reports/quick-input.template.md
461
+ git commit -m "feat(input-templates): document ticket fallback and multi-ticket rule"
462
+ ```
463
+
464
+ ---
465
+
466
+ ## Task 7: task-brief 템플릿 보강
467
+
468
+ **Files:**
469
+ - Modify: `templates/reports/task-brief.template.md`
470
+
471
+ - [ ] **Step 1: Edit — Identity 섹션 가이드 추가**
472
+
473
+ 다음 문자열:
474
+
475
+ ```
476
+ - Issue / Ticket:
477
+ ```
478
+
479
+ 을 다음으로 교체한다.
480
+
481
+ ```
482
+ - Issue / Ticket:
483
+ - 값이 비면 워커는 `Task ID`로 폴백한다 (prefix 없이 `8852`처럼). 한 run이 여러 ticket을 동시에 다루면 콤마로 구분 (`TICKET-123, TICKET-456`). 어느 쪽으로도 식별 불가하면 `unknown`을 허용한다.
484
+ ```
485
+
486
+ - [ ] **Step 2: Edit — Standing Scope-Discipline Questions 블록 위에 ticket 표기 한 줄 추가**
487
+
488
+ 다음 문자열:
489
+
490
+ ```
491
+ ### Standing Scope-Discipline Questions (always answered by every worker)
492
+ ```
493
+
494
+ 을 다음으로 교체한다.
495
+
496
+ ```
497
+ ### Standing Ticket-Tagging Rule (always applied by every worker)
498
+
499
+ - 모든 항목 및 표 행에 ticket을 명시한다. 표 형식은 `Ticket ID` 컬럼, bullet/번호목록·섹션 헤더는 `[TICKETID: <id>]` 태그를 사용한다. 채움 우선순위·폴백·다중 ticket 규칙은 `okstra-team-contract` SKILL의 Ticket Tagging 절을 따른다.
500
+
501
+ ### Standing Scope-Discipline Questions (always answered by every worker)
502
+ ```
503
+
504
+ - [ ] **Step 3: Verify**
505
+
506
+ Run: `grep -n "Standing Ticket-Tagging Rule" templates/reports/task-brief.template.md`
507
+ Expected: 단일 매치.
508
+
509
+ Run: `grep -n "값이 비면 워커는 \`Task ID\`로 폴백한다" templates/reports/task-brief.template.md`
510
+ Expected: 단일 매치.
511
+
512
+ - [ ] **Step 4: Commit**
513
+
514
+ ```bash
515
+ git add templates/reports/task-brief.template.md
516
+ git commit -m "feat(task-brief): add standing ticket-tagging rule + identity guide"
517
+ ```
518
+
519
+ ---
520
+
521
+ ## Task 8: 분석 워커 프롬프트 3종 — Worker Output Structure 보강
522
+
523
+ **Files:**
524
+ - Modify: `agents/workers/claude-worker.md`
525
+ - Modify: `agents/workers/codex-worker.md`
526
+ - Modify: `agents/workers/gemini-worker.md`
527
+
528
+ - [ ] **Step 1: Edit — 각 파일의 "This contract mirrors the `okstra-team-contract` skill's Worker Output Contract — that skill is the authoritative source if the two ever diverge." 직전에 한 단락 삽입**
529
+
530
+ 세 파일 모두 동일한 문자열:
531
+
532
+ ```
533
+ This contract mirrors the `okstra-team-contract` skill's Worker Output Contract — that skill is the authoritative source if the two ever diverge.
534
+ ```
535
+
536
+ 을 다음으로 교체한다.
537
+
538
+ ```
539
+ **Ticket tagging:** For runs whose task type is `requirements-discovery`, `error-analysis`, `implementation-planning`, or `implementation`, every item in sections 1–5 MUST carry a ticket identifier. Use the `Ticket ID` column in table-form items and the `[TICKETID: <id>]` prefix in bullet/numbered items. Fill priority: `Issue / Ticket` from the input → `Task ID` (no prefix, e.g. `8852`) → `unknown`. Multiple tickets are comma-separated. Full rules live in the `okstra-team-contract` skill's Ticket Tagging section.
540
+
541
+ This contract mirrors the `okstra-team-contract` skill's Worker Output Contract — that skill is the authoritative source if the two ever diverge.
542
+ ```
543
+
544
+ - [ ] **Step 2: Verify**
545
+
546
+ Run: `grep -c "Ticket tagging:" agents/workers/claude-worker.md agents/workers/codex-worker.md agents/workers/gemini-worker.md`
547
+ Expected: 3 파일 각각 `1`.
548
+
549
+ - [ ] **Step 3: Commit**
550
+
551
+ ```bash
552
+ git add agents/workers/claude-worker.md agents/workers/codex-worker.md agents/workers/gemini-worker.md
553
+ git commit -m "feat(workers): require ticket tagging in analysis worker outputs"
554
+ ```
555
+
556
+ ---
557
+
558
+ ## Task 9: report-writer-worker — Authoring Contract 보강
559
+
560
+ **Files:**
561
+ - Modify: `agents/workers/report-writer-worker.md`
562
+
563
+ - [ ] **Step 1: Edit — Authoring Contract의 Hard rules 마지막 항목 다음에 한 줄 추가**
564
+
565
+ 다음 문자열:
566
+
567
+ ```
568
+ - Cite file paths and line numbers for every code-evidence claim.
569
+ ```
570
+
571
+ 을 다음으로 교체한다.
572
+
573
+ ```
574
+ - Cite file paths and line numbers for every code-evidence claim.
575
+ - Preserve every analysis worker's ticket tagging (`Ticket ID` columns and `[TICKETID: <id>]` prefixes) when carrying findings into the final report. Populate the final report's top-level `## Ticket Coverage` table per the rules in `templates/reports/final-report.template.md`. For runs that do not require ticket tagging (e.g. `release-handoff`, `final-verification`), omit the `Ticket Coverage` table and do not invent ticket IDs.
576
+ ```
577
+
578
+ - [ ] **Step 2: Verify**
579
+
580
+ Run: `grep -n "Preserve every analysis worker's ticket tagging" agents/workers/report-writer-worker.md`
581
+ Expected: 단일 매치.
582
+
583
+ - [ ] **Step 3: Commit**
584
+
585
+ ```bash
586
+ git add agents/workers/report-writer-worker.md
587
+ git commit -m "feat(report-writer): preserve ticket tagging and populate ticket coverage"
588
+ ```
589
+
590
+ ---
591
+
592
+ ## Task 10: 전체 검증 및 spec 링크 추가
593
+
594
+ **Files:**
595
+ - Modify: `docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md` (단순 링크 한 줄 추가)
596
+
597
+ - [ ] **Step 1: Cross-check that every spec section maps to a delivered change**
598
+
599
+ Run: `git log --oneline -10`
600
+ Expected: Task 1~9 커밋이 차례로 나열됨.
601
+
602
+ Run: `grep -nE "Ticket Tagging|Ticket Coverage|Ticket ID|TICKETID" skills/okstra-team-contract/SKILL.md skills/okstra-convergence/SKILL.md templates/reports/final-report.template.md templates/reports/task-brief.template.md templates/reports/error-analysis-input.template.md templates/reports/implementation-planning-input.template.md templates/reports/implementation-input.template.md templates/reports/quick-input.template.md agents/workers/claude-worker.md agents/workers/codex-worker.md agents/workers/gemini-worker.md agents/workers/report-writer-worker.md | wc -l`
603
+ Expected: 최소 12 이상 (각 파일에 최소 1건씩).
604
+
605
+ - [ ] **Step 2: Append implementation-plan reference to the spec**
606
+
607
+ `docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md`의 첫 헤더 블록(`- Status: Design (pre-implementation)`)을 다음으로 교체한다.
608
+
609
+ ```
610
+ - Status: Implemented
611
+ - Implementation plan: `docs/superpowers/plans/2026-05-12-ticket-id-in-reports.md`
612
+ ```
613
+
614
+ - [ ] **Step 3: Commit**
615
+
616
+ ```bash
617
+ git add docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md
618
+ git commit -m "docs(specs): link ticket-id design to implementation plan"
619
+ ```
620
+
621
+ - [ ] **Step 4: Manual smoke check (deferred verification, optional)**
622
+
623
+ 다음 항목은 다음 번 실제 okstra run을 통해 확인한다 (이번 plan의 자동 검증 범위 밖):
624
+
625
+ 1. 신규 `requirements-discovery` / `error-analysis` / `implementation-planning` / `implementation` run에서 워커 출력 bullet 전부에 `[TICKETID: ...]`가 박히는지.
626
+ 2. final report 상단에 `## Ticket Coverage`가 비어 있지 않고 본문 항목과 정합한지.
627
+ 3. convergence state 아티팩트의 finding 레코드에 `ticketIds`가 함께 기록되는지.
628
+
629
+ 이 항목이 실패하면 spec의 후속 작업(validator 추가)을 우선순위로 올린다.
630
+
631
+ ---
632
+
633
+ ## Self-Review Notes
634
+
635
+ - 모든 step에 정확한 grep 명령과 기대 결과가 들어가 있다 (markdown 산출물이라 unit test 대신 grep 검증).
636
+ - 4개 input 템플릿의 같은 가이드 문구는 Task 6에서 복사 가능한 형태로 본문에 그대로 포함했다(엔지니어가 task를 out-of-order로 읽어도 문구를 빌려올 필요 없음).
637
+ - 분석 워커 3종의 동일 변경은 Task 8에서 동일 문자열 교체로 처리해 drift 위험을 줄였다.
638
+ - spec의 모든 변경 파일이 Task 1~9에 배정되었고, Task 10이 최종 cross-check를 수행한다.