okstra 0.102.2 → 0.102.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.kr.md +5 -5
  2. package/README.md +5 -5
  3. package/docs/kr/architecture/storage-model.md +1 -1
  4. package/docs/kr/architecture.md +7 -11
  5. package/docs/kr/cli.md +4 -4
  6. package/docs/kr/container.md +1 -1
  7. package/docs/kr/performance-improvement-plan-v2.md +2 -2
  8. package/docs/project-structure-overview.md +2 -2
  9. package/package.json +7 -2
  10. package/runtime/BUILD.json +2 -2
  11. package/runtime/bin/okstra-antigravity-exec.sh +1 -2
  12. package/runtime/bin/okstra-codex-exec.sh +1 -2
  13. package/runtime/bin/okstra-render-final-report.py +2 -9
  14. package/runtime/bin/okstra-spawn-followups.py +4 -6
  15. package/runtime/bin/okstra-trace-cleanup.sh +24 -4
  16. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  17. package/runtime/prompts/lead/report-writer.md +1 -1
  18. package/runtime/prompts/profiles/_common-contract.md +9 -11
  19. package/runtime/python/okstra_ctl/codex_dispatch.py +4 -12
  20. package/runtime/python/okstra_ctl/consumers.py +35 -0
  21. package/runtime/python/okstra_ctl/container.py +4 -6
  22. package/runtime/python/okstra_ctl/dispatch_core.py +4 -12
  23. package/runtime/python/okstra_ctl/final_report_paths.py +24 -0
  24. package/runtime/python/okstra_ctl/handoff.py +2 -1
  25. package/runtime/python/okstra_ctl/implementation_stage.py +7 -11
  26. package/runtime/python/okstra_ctl/report_view_artifacts.py +14 -0
  27. package/runtime/python/okstra_ctl/report_views.py +7 -4
  28. package/runtime/python/okstra_ctl/run.py +3 -10
  29. package/runtime/python/okstra_ctl/stage_targets.py +18 -0
  30. package/runtime/python/okstra_ctl/wizard.py +24 -25
  31. package/runtime/python/okstra_ctl/wizard_stage_intent.py +54 -0
  32. package/runtime/python/okstra_token_usage/report.py +2 -5
  33. package/runtime/validators/validate-report-views.py +2 -1
  34. package/runtime/validators/validate-run.py +1 -11
  35. package/src/commands/lifecycle/install.mjs +5 -5
  36. package/src/commands/lifecycle/uninstall.mjs +4 -4
  37. package/docs/superpowers/plans/2026-05-12-ticket-id-in-reports.md +0 -638
  38. package/docs/superpowers/plans/2026-05-14-convergence-queue-pruning.md +0 -1568
  39. package/docs/superpowers/plans/2026-05-17-dual-format-final-report.md +0 -167
  40. package/docs/superpowers/plans/2026-05-20-final-report-language.md +0 -1501
  41. package/docs/superpowers/plans/2026-05-20-implementation-planning-multi-stage.md +0 -1267
  42. package/docs/superpowers/plans/2026-05-20-okstra-run-prompt-sot-b1.md +0 -1007
  43. package/docs/superpowers/plans/2026-05-20-wizard-messages-json-sot.md +0 -720
  44. package/docs/superpowers/plans/2026-05-20-wizard-prompt-json-sot-a1.md +0 -681
  45. package/docs/superpowers/plans/2026-05-21-improvement-discovery-task-type.md +0 -1691
  46. package/docs/superpowers/plans/2026-05-24-implementation-lead-context-slimming.md +0 -1700
  47. package/docs/superpowers/plans/2026-05-25-okstra-project-root-rename.md +0 -158
  48. package/docs/superpowers/plans/2026-05-26-wizard-3-option-picker.md +0 -860
  49. package/docs/superpowers/plans/2026-06-02-final-verification-protocol-hardening.md +0 -326
  50. package/docs/superpowers/plans/2026-06-02-okstra-run-branch-confirm-step.md +0 -337
  51. package/docs/superpowers/plans/2026-06-02-okstra-run-phase-pane-cleanup.md +0 -410
  52. package/docs/superpowers/plans/2026-06-02-requirements-discovery-fanout.md +0 -728
  53. package/docs/superpowers/plans/2026-06-04-adversarial-implementation-planning.md +0 -294
  54. package/docs/superpowers/plans/2026-06-04-adversarial-verification.md +0 -570
  55. package/docs/superpowers/plans/2026-06-04-coverage-critic.md +0 -516
  56. package/docs/superpowers/plans/2026-06-04-stage-cohesion-planner.md +0 -351
  57. package/docs/superpowers/plans/2026-06-04-stage-run-batching.md +0 -457
  58. package/docs/superpowers/plans/2026-06-05-acceptance-critic.md +0 -251
  59. package/docs/superpowers/plans/2026-06-05-compact-markdown-report-tables.md +0 -323
  60. package/docs/superpowers/plans/2026-06-05-wizard-batch-prompts.md +0 -559
  61. package/docs/superpowers/plans/2026-06-06-final-verification-whole-task-gate.md +0 -993
  62. package/docs/superpowers/plans/2026-06-06-stage-parallel-and-pending-fixes.md +0 -93
  63. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p1.md +0 -447
  64. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p2.md +0 -289
  65. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p3.md +0 -774
  66. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p4.md +0 -303
  67. package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p5-multidep-base.md +0 -387
  68. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase2.md +0 -275
  69. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase3.md +0 -282
  70. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4a.md +0 -147
  71. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4b.md +0 -262
  72. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4c.md +0 -184
  73. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4d.md +0 -88
  74. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4e.md +0 -250
  75. package/docs/superpowers/plans/2026-06-07-stage-conformance-qa.md +0 -409
  76. package/docs/superpowers/plans/2026-06-09-implementation-run-artifact-stage-isolation.md +0 -320
  77. package/docs/superpowers/plans/2026-06-10-concurrent-run-team-guard.md +0 -456
  78. package/docs/superpowers/plans/2026-06-10-git-reconcile-stale-sha-recovery.md +0 -1408
  79. package/docs/superpowers/plans/2026-06-10-lead-worker-completion-polling-PROBE.md +0 -42
  80. package/docs/superpowers/plans/2026-06-10-lead-worker-completion-polling.md +0 -337
  81. package/docs/superpowers/plans/2026-06-10-p6-token-usage-incremental.md +0 -1029
  82. package/docs/superpowers/plans/2026-06-10-stage-group-handoff.md +0 -1572
  83. package/docs/superpowers/plans/2026-06-11-fix-cycle.md +0 -1290
  84. package/docs/superpowers/plans/2026-06-11-wizard-whole-task-final-verification.md +0 -526
  85. package/docs/superpowers/plans/2026-06-12-html-plan-approval.md +0 -1000
  86. package/docs/superpowers/plans/2026-06-13-repo-risk-hardening.md +0 -493
  87. package/docs/superpowers/plans/2026-06-14-host-runtime-auto-execution.md +0 -1775
  88. package/docs/superpowers/plans/2026-06-15-coding-preflight-pack-dispatch-path.md +0 -504
  89. package/docs/superpowers/plans/2026-06-15-internal-skill-migration-final-fixups.md +0 -342
  90. package/docs/superpowers/plans/2026-06-15-internal-skill-migration-fixups.md +0 -258
  91. package/docs/superpowers/plans/2026-06-15-internal-skill-migration-remaining-fixups.md +0 -387
  92. package/docs/superpowers/plans/2026-06-15-internal-skill-resource-migration.md +0 -749
  93. package/docs/superpowers/plans/2026-06-15-worker-prompt-anchor-final-fixups.md +0 -828
  94. package/docs/superpowers/plans/2026-06-15-worker-prompt-header-error-contract.md +0 -490
  95. package/docs/superpowers/plans/2026-06-17-okstra-error-report.md +0 -724
  96. package/docs/superpowers/plans/2026-06-18-subagent-pane-reclaim.md +0 -483
  97. package/docs/superpowers/plans/2026-06-19-agent-operating-standard.md +0 -476
  98. package/docs/superpowers/plans/2026-06-19-okstra-inspect-recap-facet.md +0 -647
  99. package/docs/superpowers/plans/2026-06-20-error-feedback-loop.md +0 -1019
  100. package/docs/superpowers/plans/2026-06-20-run-index-row-normalization.md +0 -583
  101. package/docs/superpowers/plans/2026-06-20-stage-auto-integrate-teardown.md +0 -819
  102. package/docs/superpowers/plans/2026-06-21-okstra-container-local-user-test.md +0 -714
  103. package/docs/superpowers/plans/2026-06-21-release-handoff-local-checkout.md +0 -348
  104. package/docs/superpowers/plans/2026-06-23-implementation-stage-multiselect-chain.md +0 -630
  105. package/docs/superpowers/plans/2026-06-23-implementation-step-commit-granularity.md +0 -274
  106. package/docs/superpowers/plans/2026-06-23-phase-batch-cleanup-enforcement.md +0 -409
  107. package/docs/superpowers/plans/2026-06-24-cross-project-precondition.md +0 -542
  108. package/docs/superpowers/plans/2026-06-24-decision-drafts-render-gap.md +0 -568
  109. package/docs/superpowers/plans/2026-06-24-manual-user-test-section.md +0 -203
  110. package/docs/superpowers/plans/2026-06-24-okstra-container-build-rename.md +0 -525
  111. package/docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md +0 -131
  112. package/docs/superpowers/specs/2026-05-15-implementation-plan-verification-design.md +0 -254
  113. package/docs/superpowers/specs/2026-05-20-final-report-language-design.md +0 -383
  114. package/docs/superpowers/specs/2026-05-20-implementation-planning-multi-stage-design.md +0 -322
  115. package/docs/superpowers/specs/2026-05-20-okstra-run-prompt-sot-design.md +0 -299
  116. package/docs/superpowers/specs/2026-05-21-improvement-discovery-task-type-design.md +0 -335
  117. package/docs/superpowers/specs/2026-06-02-okstra-run-branch-confirm-step-design.md +0 -113
  118. package/docs/superpowers/specs/2026-06-02-okstra-run-phase-pane-cleanup-design.md +0 -173
  119. package/docs/superpowers/specs/2026-06-02-requirements-discovery-fanout-design.md +0 -154
  120. package/docs/superpowers/specs/2026-06-04-adversarial-implementation-planning-design.md +0 -90
  121. package/docs/superpowers/specs/2026-06-04-adversarial-verification-design.md +0 -176
  122. package/docs/superpowers/specs/2026-06-04-coverage-critic-design.md +0 -99
  123. package/docs/superpowers/specs/2026-06-04-stage-splitting-cost-aware-design.md +0 -98
  124. package/docs/superpowers/specs/2026-06-05-acceptance-critic-design.md +0 -90
  125. package/docs/superpowers/specs/2026-06-05-compact-markdown-report-tables-design.md +0 -87
  126. package/docs/superpowers/specs/2026-06-05-wizard-batch-prompts-design.md +0 -121
  127. package/docs/superpowers/specs/2026-06-06-final-verification-whole-task-gate-design.md +0 -126
  128. package/docs/superpowers/specs/2026-06-06-stage-worktree-isolation-design.md +0 -180
  129. package/docs/superpowers/specs/2026-06-06-vertical-slice-tdd-planning-design.md +0 -179
  130. package/docs/superpowers/specs/2026-06-07-stage-conformance-qa-design.md +0 -169
  131. package/docs/superpowers/specs/2026-06-09-executor-model-custom-id-cascade-design.md +0 -66
  132. package/docs/superpowers/specs/2026-06-09-implementation-run-artifact-stage-isolation-design.md +0 -87
  133. package/docs/superpowers/specs/2026-06-10-blocking-contract-posthoc-conformance-design.md +0 -168
  134. package/docs/superpowers/specs/2026-06-10-concurrent-run-team-guard-design.md +0 -107
  135. package/docs/superpowers/specs/2026-06-10-git-reconcile-stale-sha-recovery-design.md +0 -105
  136. package/docs/superpowers/specs/2026-06-10-lead-worker-completion-polling-design.md +0 -113
  137. package/docs/superpowers/specs/2026-06-10-stage-group-handoff-design.md +0 -156
  138. package/docs/superpowers/specs/2026-06-11-brief-entry-only-handoff-stage-entry-design.md +0 -158
  139. package/docs/superpowers/specs/2026-06-11-fix-cycle-design.md +0 -94
  140. package/docs/superpowers/specs/2026-06-11-wizard-whole-task-final-verification-design.md +0 -89
  141. package/docs/superpowers/specs/2026-06-12-codex-lead-adapter-design.md +0 -358
  142. package/docs/superpowers/specs/2026-06-12-html-plan-approval-design.md +0 -85
  143. package/docs/superpowers/specs/2026-06-12-stage-discipline-rule-design.md +0 -108
  144. package/docs/superpowers/specs/2026-06-13-forbidden-actions-ssot-design.md +0 -134
  145. package/docs/superpowers/specs/2026-06-13-neutral-tmux-lead-adapter-design.md +0 -284
  146. package/docs/superpowers/specs/2026-06-14-host-runtime-auto-execution-design.md +0 -404
  147. package/docs/superpowers/specs/2026-06-17-okstra-error-report-design.md +0 -123
  148. package/docs/superpowers/specs/2026-06-18-subagent-pane-reclaim-design.md +0 -150
  149. package/docs/superpowers/specs/2026-06-19-agent-operating-standard-design.md +0 -120
  150. package/docs/superpowers/specs/2026-06-19-okstra-inspect-recap-facet-design.md +0 -96
  151. package/docs/superpowers/specs/2026-06-20-error-feedback-loop-design.md +0 -171
  152. package/docs/superpowers/specs/2026-06-20-run-index-row-normalization-design.md +0 -112
  153. package/docs/superpowers/specs/2026-06-20-stage-auto-integrate-teardown-design.md +0 -145
  154. package/docs/superpowers/specs/2026-06-21-okstra-container-local-user-test-design.md +0 -125
  155. package/docs/superpowers/specs/2026-06-21-release-handoff-local-checkout-design.md +0 -113
  156. package/docs/superpowers/specs/2026-06-23-implementation-stage-multiselect-chain-design.md +0 -138
  157. package/docs/superpowers/specs/2026-06-23-implementation-step-commit-granularity-design.md +0 -120
  158. package/docs/superpowers/specs/2026-06-24-cross-project-precondition-design.md +0 -129
  159. package/docs/superpowers/specs/2026-06-24-decision-drafts-render-gap-design.md +0 -185
  160. package/docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md +0 -121
  161. package/docs/superpowers/specs/2026-06-24-okstra-container-build-rename-design.md +0 -110
@@ -1,525 +0,0 @@
1
- # okstra-container-build Rename 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:** Rename the public okstra container skill from `okstra-container` to `okstra-container-build` without changing the `okstra container` CLI or container runtime trace names.
6
-
7
- **Architecture:** The public skill surface remains driven by `src/lib/skill-catalog.mjs` and `.claude-plugin/plugin.json`. Install copy/link mode reads skill directories by exact `USER_SKILL_NAMES`, so the source directory and frontmatter must move together. Upgrade cleanup uses an exact obsolete-name allowlist so old `/okstra-container` directories are pruned without wildcard deletion.
8
-
9
- **Tech Stack:** Node.js ES modules, Python pytest contract tests, Markdown skill/docs sources, `tools/build.mjs` runtime sync.
10
-
11
- ## Global Constraints
12
-
13
- - Public skill name becomes exactly `okstra-container-build`.
14
- - Old public skill name `okstra-container` is removed from installed skill manifests and pruned from agent skill homes.
15
- - CLI command remains exactly `okstra container <up|status|logs|stop-watcher|down>`.
16
- - Runtime tmux/docker trace prefix remains exactly `okstra-container-<slug>`.
17
- - Do not wildcard-delete `okstra-*`; cleanup must use exact names only.
18
- - Do not hand-edit `runtime/`; run `npm run build` after source edits.
19
- - Preserve historical `CHANGES.md` / `CHANGELOG.md` entries except adding a new current entry.
20
-
21
- ---
22
-
23
- ## File Structure
24
-
25
- - `skills/okstra-container-build/SKILL.md`: renamed public skill source. Keeps `okstra container ...` command examples.
26
- - `src/lib/skill-catalog.mjs`: public/obsolete skill name SSOT.
27
- - `.claude-plugin/plugin.json`: secondary skills channel manifest.
28
- - `src/commands/lifecycle/install.mjs`: install copy/link exact-name prune path.
29
- - `src/commands/lifecycle/uninstall.mjs`: legacy fallback cleanup names.
30
- - `tests-js/skill-catalog.test.mjs`: catalog/plugin/obsolete-name contract.
31
- - `tests-js/install-runtime.test.mjs`: install target manifest plus old skill prune regression.
32
- - `tests-js/uninstall-runtime.test.mjs`: manifest-missing fallback cleanup regression.
33
- - `tests/contract/test_docs_runtime_contract.py`: plugin manifest contract mirror.
34
- - `README.md`, `README.kr.md`, `docs/kr/architecture.md`, `docs/project-structure-overview.md`, `docs/kr/container.md`: live user/internal docs.
35
- - `docs/for-ai/README.md`, `docs/for-ai/skills/okstra-container-build.md`, `docs/for-ai/skills/okstra-inspect.md`: AI routing manuals.
36
- - `prompts/profiles/_implementation-deliverable.md`, `prompts/profiles/final-verification.md`: live phase prompt references.
37
- - `docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md`, `docs/superpowers/plans/2026-06-24-manual-user-test-section.md`: active manual-test design/plan references.
38
- - `CHANGES.md`: current user-visible change entry.
39
-
40
- ### Task 1: Public Skill Contract Rename
41
-
42
- **Files:**
43
- - Move: `skills/okstra-container` -> `skills/okstra-container-build`
44
- - Modify: `skills/okstra-container-build/SKILL.md`
45
- - Modify: `src/lib/skill-catalog.mjs`
46
- - Modify: `.claude-plugin/plugin.json`
47
- - Modify: `src/commands/lifecycle/install.mjs`
48
- - Modify: `tests-js/skill-catalog.test.mjs`
49
- - Modify: `tests/contract/test_docs_runtime_contract.py`
50
-
51
- **Interfaces:**
52
- - Produces: `USER_SKILL_NAMES` contains `okstra-container-build`, not `okstra-container`.
53
- - Produces: `OBSOLETE_SKILL_NAMES` contains old `okstra-container`.
54
- - Produces: plugin manifest entry `./skills/okstra-container-build`.
55
-
56
- - [ ] **Step 1: Write failing catalog contract tests**
57
-
58
- Update `tests-js/skill-catalog.test.mjs` import and tests to this shape:
59
-
60
- ```js
61
- import assert from "node:assert/strict";
62
- import { readFileSync } from "node:fs";
63
- import test from "node:test";
64
-
65
- import {
66
- OBSOLETE_SKILL_NAMES,
67
- USER_SKILL_NAMES,
68
- } from "../src/lib/skill-catalog.mjs";
69
-
70
- function readJson(path) {
71
- return JSON.parse(readFileSync(path, "utf8"));
72
- }
73
-
74
- test("public skill catalog matches Claude plugin manifest", () => {
75
- const plugin = readJson(".claude-plugin/plugin.json");
76
- const pluginNames = plugin.skills.map((entry) => entry.replace("./skills/", ""));
77
- assert.deepEqual(pluginNames, [...USER_SKILL_NAMES]);
78
- });
79
-
80
- test("obsolete skill names do not overlap public skills", () => {
81
- for (const name of OBSOLETE_SKILL_NAMES) {
82
- assert.equal(USER_SKILL_NAMES.includes(name), false, name);
83
- }
84
- });
85
-
86
- test("container skill rename keeps old public name prunable", () => {
87
- assert.equal(USER_SKILL_NAMES.includes("okstra-container-build"), true);
88
- assert.equal(USER_SKILL_NAMES.includes("okstra-container"), false);
89
- assert.equal(OBSOLETE_SKILL_NAMES.includes("okstra-container"), true);
90
- });
91
- ```
92
-
93
- Update `tests/contract/test_docs_runtime_contract.py` public skill list:
94
-
95
- ```python
96
- USER_FACING_PLUGIN_SKILLS = [
97
- "./skills/okstra-setup",
98
- "./skills/okstra-brief",
99
- "./skills/okstra-run",
100
- "./skills/okstra-memory",
101
- "./skills/okstra-inspect",
102
- "./skills/okstra-schedule",
103
- "./skills/okstra-container-build",
104
- ]
105
- ```
106
-
107
- - [ ] **Step 2: Run failing contract tests**
108
-
109
- Run:
110
-
111
- ```bash
112
- node --test tests-js/skill-catalog.test.mjs
113
- python3 -m pytest tests/contract/test_docs_runtime_contract.py::test_plugin_manifest_exposes_only_user_facing_skills -q
114
- ```
115
-
116
- Expected: FAIL because `OBSOLETE_SKILL_NAMES` is not exported yet and `.claude-plugin/plugin.json` still lists `./skills/okstra-container`.
117
-
118
- - [ ] **Step 3: Rename skill source and public catalog**
119
-
120
- Run:
121
-
122
- ```bash
123
- git mv skills/okstra-container skills/okstra-container-build
124
- ```
125
-
126
- Edit `skills/okstra-container-build/SKILL.md` frontmatter/title:
127
-
128
- ```markdown
129
- ---
130
- name: okstra-container-build
131
- description: |
132
- Use to bring up, inspect, or tear down the okstra user-test container runtime for an implementation task — the docker-compose group okstra deploys from a task's worktree so a human can poke at the running build. Trigger words include "okstra container", "okstra container up", "okstra container down", "컨테이너 띄워", "컨테이너 올려", "컨테이너 내려", "컨테이너 상태", "컨테이너 로그", "유저 테스트 환경", "user test environment", "docker compose 띄워줘", "이 task 컨테이너로 띄워", "watcher 멈춰", "stop watcher", "감시 종료".
133
- ---
134
-
135
- # OKSTRA Container Build
136
- ```
137
-
138
- Edit `src/lib/skill-catalog.mjs` public and obsolete exports:
139
-
140
- ```js
141
- export const USER_SKILL_NAMES = Object.freeze([
142
- "okstra-setup",
143
- "okstra-brief",
144
- "okstra-run",
145
- "okstra-memory",
146
- "okstra-inspect",
147
- "okstra-schedule",
148
- "okstra-container-build",
149
- ]);
150
-
151
- // Names okstra used to install as skills before they were renamed or moved
152
- // into the runtime resource tree. Install prunes these exact directories from
153
- // each target skill home so upgrades do not leave stale slash commands behind.
154
- // Exact-name only — never wildcard.
155
- export const OBSOLETE_SKILL_NAMES = Object.freeze([
156
- "okstra",
157
- "okstra-context-loader",
158
- "okstra-team-contract",
159
- "okstra-convergence",
160
- "okstra-report-writer",
161
- "okstra-coding-preflight",
162
- "okstra-container",
163
- ]);
164
-
165
- export function userSkillNames() {
166
- return [...USER_SKILL_NAMES];
167
- }
168
-
169
- export function obsoleteSkillNames() {
170
- return [...OBSOLETE_SKILL_NAMES];
171
- }
172
- ```
173
-
174
- Edit `.claude-plugin/plugin.json`:
175
-
176
- ```json
177
- {
178
- "name": "okstra",
179
- "description": "Multi-agent cross-verification orchestrator (Claude lead + Codex/Antigravity workers).",
180
- "skills": [
181
- "./skills/okstra-setup",
182
- "./skills/okstra-brief",
183
- "./skills/okstra-run",
184
- "./skills/okstra-memory",
185
- "./skills/okstra-inspect",
186
- "./skills/okstra-schedule",
187
- "./skills/okstra-container-build"
188
- ]
189
- }
190
- ```
191
-
192
- Edit `src/commands/lifecycle/install.mjs` import and prune helper names:
193
-
194
- ```js
195
- import { OBSOLETE_SKILL_NAMES, USER_SKILL_NAMES } from "../../lib/skill-catalog.mjs";
196
- ```
197
-
198
- ```js
199
- const pruned = await pruneObsoleteSkills(target, opts);
200
- ```
201
-
202
- ```js
203
- // Remove former skill directories left by older installs. Exact-name only
204
- // (OBSOLETE_SKILL_NAMES) — never wildcard-delete okstra-*.
205
- async function pruneObsoleteSkills(target, opts) {
206
- let pruned = 0;
207
- for (const name of OBSOLETE_SKILL_NAMES) {
208
- const path = join(target.skillsDir, name);
209
- if (!(await pathEntryExists(path))) continue;
210
- pruned += 1;
211
- if (opts.dryRun) {
212
- process.stdout.write(`[dry-run] rm ${path}\n`);
213
- continue;
214
- }
215
- await fs.rm(path, { recursive: true, force: true });
216
- }
217
- return pruned;
218
- }
219
- ```
220
-
221
- Apply the helper call rename in both `installSkillsCopy()` and `installSkillsLink()`.
222
-
223
- - [ ] **Step 4: Run catalog tests to verify pass**
224
-
225
- Run:
226
-
227
- ```bash
228
- node --test tests-js/skill-catalog.test.mjs
229
- python3 -m pytest tests/contract/test_docs_runtime_contract.py::test_plugin_manifest_exposes_only_user_facing_skills -q
230
- ```
231
-
232
- Expected: PASS.
233
-
234
- - [ ] **Step 5: Commit Task 1**
235
-
236
- ```bash
237
- git add skills/okstra-container-build src/lib/skill-catalog.mjs src/commands/lifecycle/install.mjs .claude-plugin/plugin.json tests-js/skill-catalog.test.mjs tests/contract/test_docs_runtime_contract.py
238
- git commit -m "fix(container): rename public container skill to build"
239
- ```
240
-
241
- ### Task 2: Install/Uninstall Upgrade Cleanup
242
-
243
- **Files:**
244
- - Modify: `tests-js/install-runtime.test.mjs`
245
- - Modify: `tests-js/uninstall-runtime.test.mjs`
246
- - Modify: `src/commands/lifecycle/uninstall.mjs`
247
-
248
- **Interfaces:**
249
- - Consumes: `OBSOLETE_SKILL_NAMES` includes `okstra-container`.
250
- - Produces: install removes old `okstra-container` skill dirs during upgrade.
251
- - Produces: uninstall fallback can remove both `okstra-container-build` and old `okstra-container`.
252
-
253
- - [ ] **Step 1: Write failing install prune regression**
254
-
255
- In `tests-js/install-runtime.test.mjs`, extend `install copies skills to existing Claude and Agent homes and records targets` after the `.claude` / `.agent` roots are created:
256
-
257
- ```js
258
- for (const providerRoot of [join(root, ".claude", "skills"), join(root, ".agent", "skills")]) {
259
- mkdirSync(join(providerRoot, "okstra-container"), { recursive: true });
260
- writeFileSync(join(providerRoot, "okstra-container", "SKILL.md"), "old container skill\n");
261
- }
262
- ```
263
-
264
- Extend the provider-root assertions:
265
-
266
- ```js
267
- assert.equal(existsSync(join(providerRoot, "okstra-container-build", "SKILL.md")), true);
268
- assert.equal(existsSync(join(providerRoot, "okstra-container", "SKILL.md")), false);
269
- ```
270
-
271
- - [ ] **Step 2: Write failing uninstall fallback regression**
272
-
273
- Add this test to `tests-js/uninstall-runtime.test.mjs`:
274
-
275
- ```js
276
- test("uninstall fallback removes renamed and legacy container skills", () => {
277
- const { root, env } = makeInstallEnv();
278
- mkdirSync(join(root, ".okstra"), { recursive: true });
279
- mkdirSync(join(root, ".claude", "skills", "okstra-container"), { recursive: true });
280
- mkdirSync(join(root, ".claude", "skills", "okstra-container-build"), { recursive: true });
281
-
282
- const uninstall = runCli(["uninstall", "-y"], env);
283
- assert.equal(uninstall.code, 0, uninstall.stderr);
284
-
285
- assert.equal(existsSync(join(root, ".claude", "skills", "okstra-container")), false);
286
- assert.equal(existsSync(join(root, ".claude", "skills", "okstra-container-build")), false);
287
- });
288
- ```
289
-
290
- - [ ] **Step 3: Run failing install/uninstall tests**
291
-
292
- Run:
293
-
294
- ```bash
295
- node --test tests-js/install-runtime.test.mjs tests-js/uninstall-runtime.test.mjs
296
- ```
297
-
298
- Expected: FAIL until `src/commands/lifecycle/uninstall.mjs` fallback names include both container skill names and install prune is wired to `OBSOLETE_SKILL_NAMES`.
299
-
300
- - [ ] **Step 4: Implement fallback cleanup names**
301
-
302
- Edit `src/commands/lifecycle/uninstall.mjs` `FALLBACK_SKILL_NAMES`:
303
-
304
- ```js
305
- const FALLBACK_SKILL_NAMES = [
306
- "okstra",
307
- "okstra-setup",
308
- "okstra-brief",
309
- "okstra-run",
310
- "okstra-memory",
311
- "okstra-inspect",
312
- "okstra-schedule",
313
- "okstra-container-build",
314
- "okstra-container",
315
- "okstra-context-loader",
316
- "okstra-team-contract",
317
- "okstra-convergence",
318
- "okstra-report-writer",
319
- // Pre-merge names — kept so uninstall on an upgraded machine still cleans
320
- // them out of ~/.claude/skills/ once the user runs `okstra uninstall`.
321
- // Safe to drop after a few releases when nobody has them installed.
322
- "okstra-status",
323
- "okstra-history",
324
- "okstra-logs",
325
- "okstra-report-finder",
326
- "okstra-time-summary",
327
- ];
328
- ```
329
-
330
- - [ ] **Step 5: Run install/uninstall tests to verify pass**
331
-
332
- Run:
333
-
334
- ```bash
335
- node --test tests-js/install-runtime.test.mjs tests-js/uninstall-runtime.test.mjs
336
- ```
337
-
338
- Expected: PASS.
339
-
340
- - [ ] **Step 6: Commit Task 2**
341
-
342
- ```bash
343
- git add src/commands/lifecycle/uninstall.mjs tests-js/install-runtime.test.mjs tests-js/uninstall-runtime.test.mjs
344
- git commit -m "fix(install): prune legacy container skill on rename"
345
- ```
346
-
347
- ### Task 3: Docs, Prompts, and User-Visible Changelog
348
-
349
- **Files:**
350
- - Move: `docs/for-ai/skills/okstra-container.md` -> `docs/for-ai/skills/okstra-container-build.md`
351
- - Modify: `README.md`
352
- - Modify: `README.kr.md`
353
- - Modify: `docs/kr/architecture.md`
354
- - Modify: `docs/project-structure-overview.md`
355
- - Modify: `docs/kr/container.md`
356
- - Modify: `docs/for-ai/README.md`
357
- - Modify: `docs/for-ai/skills/okstra-container-build.md`
358
- - Modify: `docs/for-ai/skills/okstra-inspect.md`
359
- - Modify: `prompts/profiles/_implementation-deliverable.md`
360
- - Modify: `prompts/profiles/final-verification.md`
361
- - Modify: `docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md`
362
- - Modify: `docs/superpowers/plans/2026-06-24-manual-user-test-section.md`
363
- - Modify: `CHANGES.md`
364
- - Test: `tests/contract/test_docs_runtime_contract.py`
365
-
366
- **Interfaces:**
367
- - Consumes: public skill name `okstra-container-build`.
368
- - Produces: user-facing slash command docs use `/okstra-container-build`.
369
- - Produces: prompt guidance uses `/okstra-container-build` for skill invocation and `okstra container up ...` for CLI execution.
370
-
371
- - [ ] **Step 1: Write failing docs scan command**
372
-
373
- Run:
374
-
375
- ```bash
376
- rg -n -P '/okstra-container(?!-build)\\b|okstra-container up|okstra-container-build[[:alpha:]]' README.md README.kr.md docs/kr/architecture.md docs/project-structure-overview.md docs/kr/container.md docs/for-ai prompts/profiles/_implementation-deliverable.md prompts/profiles/final-verification.md docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md docs/superpowers/plans/2026-06-24-manual-user-test-section.md
377
- ```
378
-
379
- Expected before edits: matches showing old slash-command/prompt references and zero `builder` references after the corrected spec.
380
-
381
- - [ ] **Step 2: Rename AI manual file and update live references**
382
-
383
- Run:
384
-
385
- ```bash
386
- git mv docs/for-ai/skills/okstra-container.md docs/for-ai/skills/okstra-container-build.md
387
- ```
388
-
389
- Apply these text rules:
390
-
391
- ```text
392
- /okstra-container -> /okstra-container-build
393
- `okstra-container` as public skill name -> `okstra-container-build`
394
- skills/okstra-container.md -> skills/okstra-container-build.md
395
- skills/okstra-container/SKILL.md -> skills/okstra-container-build/SKILL.md
396
- ```
397
-
398
- Do not change these runtime strings:
399
-
400
- ```text
401
- okstra container
402
- okstra-container-<slug>
403
- @okstra_container_run
404
- ```
405
-
406
- In `prompts/profiles/_implementation-deliverable.md`, replace the environment line with:
407
-
408
- ```markdown
409
- - **Manual user test draft**: when this run produces a user-observable change (UI / API / CLI / artifact), write `target / environment / steps / expected result` per change into §5.7.9 (data field `implementation.manualUserTest`, `applicable=true` with `items`). Environment line: if the project has a `docker-compose.yml`, use `/okstra-container-build` (which runs `okstra container up <task-id>`) then connect to the published port; otherwise the project's run command (e.g. `npm start`). When there is no user-observable change, set `applicable=false` and give a one-line `exemptionReason` instead of items. Base the steps on the approved plan's `Acceptance:` and this run's actual diff — these are the steps a human (or `final-verification`) re-runs by hand, NOT the automated validation commands in `Validation evidence`.
410
- ```
411
-
412
- In `prompts/profiles/final-verification.md`, replace the manual test example with:
413
-
414
- ```markdown
415
- - **Manual user test results**: take each item from the source implementation report's §5.7.9 Manual User Test (Draft), execute the ones reproducible in this environment (e.g. `/okstra-container-build`, which runs `okstra container up`, then the documented steps), and record `result` (`pass` / `fail` / `blocked`) + observed value in §5.8.7 (data field `finalVerification.manualUserTest`). Steps that need human-only interaction this run cannot perform are recorded as `blocked` with the reason (handed to the user), never silently skipped. A failed manual test is an Acceptance Blocker. If the draft was an exemption (`applicable=false`), reaffirm the reason in one line (`applicable=false` + `exemptionReaffirm`).
416
- ```
417
-
418
- - [ ] **Step 3: Add current CHANGES entry**
419
-
420
- Under `## 2026-06-24`, add this entry above the existing entries:
421
-
422
- ```markdown
423
- ### fix(container): 공개 컨테이너 스킬명을 okstra-container-build 로 변경
424
-
425
- - **배경**: 컨테이너 유저 테스트 기능의 공개 slash command 이름을 `okstra-container` 에서 `okstra-container-build` 로 바꾸기로 결정했다. CLI 명령 `okstra container ...` 와 런타임 tmux/docker trace prefix `okstra-container-<slug>` 는 컨테이너 런타임 계약이므로 유지한다.
426
- - **해결**: 공개 skill catalog, 플러그인 manifest, 설치/업그레이드 cleanup, README/architecture/AI manual/phase prompt 의 사용자-facing 표기를 `okstra-container-build` 로 동기화한다. 옛 `okstra-container` skill directory 는 exact-name obsolete cleanup 으로 재설치 시 제거한다.
427
- - 사용자 영향: 재설치 후 slash command 는 `/okstra-container-build` 로 노출된다. 기존 `okstra container up/status/logs/stop-watcher/down` CLI 와 실행 중 container watcher trace 이름은 그대로 유지된다. (설치 환경은 `okstra install` 로 런타임 갱신 후 적용.)
428
- ```
429
-
430
- - [ ] **Step 4: Run docs scans and contract test**
431
-
432
- Run:
433
-
434
- ```bash
435
- rg -n -P '/okstra-container(?!-build)\\b|okstra-container up|okstra-container-build[[:alpha:]]' README.md README.kr.md docs/kr/architecture.md docs/project-structure-overview.md docs/kr/container.md docs/for-ai prompts/profiles/_implementation-deliverable.md prompts/profiles/final-verification.md docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md docs/superpowers/plans/2026-06-24-manual-user-test-section.md
436
- python3 -m pytest tests/contract/test_docs_runtime_contract.py -q
437
- ```
438
-
439
- Expected: `rg` exits 1 with no matches; pytest PASS.
440
-
441
- - [ ] **Step 5: Commit Task 3**
442
-
443
- ```bash
444
- git add README.md README.kr.md docs/kr/architecture.md docs/project-structure-overview.md docs/kr/container.md docs/for-ai/README.md docs/for-ai/skills/okstra-container-build.md docs/for-ai/skills/okstra-inspect.md prompts/profiles/_implementation-deliverable.md prompts/profiles/final-verification.md docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md docs/superpowers/plans/2026-06-24-manual-user-test-section.md CHANGES.md
445
- git commit -m "docs(container): rename container skill docs to build"
446
- ```
447
-
448
- ### Task 4: Runtime Build and Full Verification
449
-
450
- **Files:**
451
- - Generated: `runtime/` via `npm run build` (gitignored, do not hand-edit)
452
- - Test: `tests-js/*.test.mjs`
453
- - Test: `tests/`
454
- - Test: `validators/validate-workflow.sh`
455
-
456
- **Interfaces:**
457
- - Consumes: source skill directory `skills/okstra-container-build`.
458
- - Produces: generated `runtime/skills/okstra-container-build/SKILL.md`.
459
- - Produces: no generated `runtime/skills/okstra-container/SKILL.md`.
460
-
461
- - [ ] **Step 1: Run build**
462
-
463
- Run:
464
-
465
- ```bash
466
- npm run build
467
- ```
468
-
469
- Expected: exit 0. Output includes `skills -> runtime/skills` sync. `runtime/` remains untracked/ignored.
470
-
471
- - [ ] **Step 2: Verify runtime skill sync**
472
-
473
- Run:
474
-
475
- ```bash
476
- test -f runtime/skills/okstra-container-build/SKILL.md
477
- test ! -e runtime/skills/okstra-container/SKILL.md
478
- rg -n "name: okstra-container-build" runtime/skills/okstra-container-build/SKILL.md
479
- ```
480
-
481
- Expected: all commands exit 0.
482
-
483
- - [ ] **Step 3: Run targeted test suite**
484
-
485
- Run:
486
-
487
- ```bash
488
- node --test tests-js/skill-catalog.test.mjs tests-js/install-runtime.test.mjs tests-js/uninstall-runtime.test.mjs tests-js/doctor-runtime.test.mjs
489
- python3 -m pytest tests/contract/test_docs_runtime_contract.py -q
490
- ```
491
-
492
- Expected: PASS.
493
-
494
- - [ ] **Step 4: Run project check**
495
-
496
- Run:
497
-
498
- ```bash
499
- npm run check
500
- ```
501
-
502
- Expected: exit 0.
503
-
504
- - [ ] **Step 5: Run final identifier audit**
505
-
506
- Run:
507
-
508
- ```bash
509
- rg -n "okstra-container-build[[:alpha:]]|container-build[[:alpha:]]" .
510
- rg -n "okstra-container" .
511
- ```
512
-
513
- Expected:
514
- - First command exits 1 with no matches.
515
- - Second command still reports historical changelog/old design-plan references and runtime prefix tests such as `okstra-container-<slug>`, but not live public skill catalog, plugin manifest, README slash-command rows, AI routing manuals, or live phase prompt instructions.
516
-
517
- - [ ] **Step 6: Record verification-only status**
518
-
519
- Run:
520
-
521
- ```bash
522
- git status --short
523
- ```
524
-
525
- Expected: no new tracked source changes from Task 4. `runtime/` may have been regenerated by `npm run build` but remains ignored. Do not create a commit for this task unless a tracked verification fixture changed.
@@ -1,131 +0,0 @@
1
- # Ticket ID in Worker / Lead / Report Outputs — Design
2
-
3
- - Date: 2026-05-12
4
- - Scope: okstra phases `requirements-discovery`, `error-analysis`, `implementation-planning`, `implementation`
5
- - Status: Implemented
6
- - Implementation plan: `docs/superpowers/plans/2026-05-12-ticket-id-in-reports.md`
7
-
8
- ## 1. 목적
9
-
10
- okstra의 작업 단위는 보통 외부 트래커의 ticket과 1:1로 묶이지만, 현재 워커·lead·report-writer 산출물은 보고서 헤더의 `Task Key` 한 곳에서만 ticket을 식별한다. 항목별로 어떤 ticket을 다루고 있는지 추적할 수 없어, 한 run이 여러 ticket을 동시에 다룰 때 항목·ticket 매핑이 누락된다.
11
-
12
- 본 변경은 워커가 작성하는 모든 항목과 final report의 본문 섹션에 ticket 식별자를 박아 trace를 ticket 단위로 동기화한다.
13
-
14
- ## 2. Ticket ID 채움 규칙 (모든 산출물 공통)
15
-
16
- 1. 입력 템플릿의 `Issue / Ticket` 값을 우선 사용한다.
17
- 2. 비어 있으면 `Task ID`로 폴백한다. 폴백 표기에는 prefix를 붙이지 않는다 (예: `8852`).
18
- 3. `Issue / Ticket`도 비고 `Task ID`도 사용할 수 없는 예외 상황에 한해 `unknown` 표기를 허용한다.
19
- 4. 한 항목이 여러 ticket을 동시에 다루면 쉼표로 구분한다 (예: `TICKET-123, TICKET-456`).
20
-
21
- ## 3. 표기 규칙
22
-
23
- ### 3.1 표 형식 섹션
24
- 표 형식 섹션은 `Ticket ID` 컬럼을 추가한다. 컬럼은 표의 가장 왼쪽 ID 컬럼 바로 다음에 위치한다.
25
-
26
- ### 3.2 비-표 섹션 (bullet / 번호 목록 / 섹션 헤더)
27
- 항목 또는 섹션 헤더의 타이틀에 `[TICKETID: <id>]` 태그를 강제한다.
28
-
29
- - 항목 예: `- F-001 [TICKETID: TICKET-123] — <summary> (path:line)`
30
- - 헤더 예: `### 4.5.3 Recommended Option [TICKETID: TICKET-123]`
31
-
32
- 태그는 ID 직후, 본문 텍스트 앞에 위치한다. 한 줄 안에서 태그가 보이지 않으면 contract violation이다.
33
-
34
- ## 4. 변경 파일
35
-
36
- ### 4.1 `skills/okstra-team-contract/SKILL.md`
37
- - Worker Output Contract 섹션에 "Ticket Tagging" 항목 신설.
38
- - 섹션 1 Findings, 2 Missing Information / Assumptions, 3 Safe or Reasonable Areas, 4 Uncertain Points, 5 Recommended Next Actions 모두에 적용된다는 점을 명시.
39
- - bullet 항목은 `[TICKETID: ...]` 태그 강제, 표 항목은 `Ticket ID` 컬럼 강제.
40
- - 폴백/다중 ticket/`unknown` 규칙을 본 spec과 동일한 문구로 인용.
41
-
42
- ### 4.2 `skills/okstra-convergence/SKILL.md`
43
- - Round 0 (Parse worker results)에 ticket 추출 절차 추가.
44
- - finding 그룹핑 시 ticket이 다르면 의미가 유사해도 별도 그룹으로 처리해 과병합을 방지한다는 규칙 추가.
45
- - 컨버전스 상태 아티팩트에 각 finding의 `ticketId` 필드를 함께 기록.
46
-
47
- ### 4.3 `templates/reports/final-report.template.md`
48
- - 보고서 상단(`## Summary of the Problem or Verification Target` 직후)에 `## Ticket Coverage` 표 신규 추가.
49
-
50
- | Ticket ID | 등장 섹션 | 관련 항목 IDs |
51
- |-----------|-----------|---------------|
52
-
53
- - 한 run에 ticket이 0~1개면 단일 행으로 채우거나 `- Single ticket run: <id>` 한 줄로 대체 가능.
54
- - 다중 ticket이면 ticket마다 한 행씩 작성하고, `등장 섹션` 컬럼에는 본문에서 해당 ticket이 나타나는 섹션 번호를 콤마 구분으로, `관련 항목 IDs` 컬럼에는 `F-001`, `A1`, `Q1` 등 항목 ID를 콤마 구분으로 적는다.
55
-
56
- - `1.1 Consensus`, `1.2 Differences` → bullet에서 표로 전환.
57
-
58
- | ID | Ticket ID | Statement | Supporting workers | Evidence |
59
- |----|-----------|-----------|--------------------|----------|
60
-
61
- - `3.1 Primary Evidence`, `3.2 Secondary Evidence or Alternate Interpretations` → 표로 전환.
62
-
63
- | ID | Ticket ID | Evidence | Source (path:line / log / worker) |
64
- |----|-----------|----------|------------------------------------|
65
-
66
- - `4. Missing Information and Risks` → 표로 전환.
67
-
68
- | ID | Ticket ID | Item | Risk if ignored |
69
- |----|-----------|------|-----------------|
70
-
71
- - `4.5.1 Option Candidates`: 옵션별 File Structure 표에 `Ticket ID` 컬럼 추가.
72
- - `4.5.2 Trade-off Matrix`: 컬럼 변경 없음 (옵션 단위 매트릭스이며 옵션 자체가 ticket scope를 가로지를 수 있다).
73
- - `4.5.4 Stepwise Execution Order`: 각 step 행에 `Ticket ID` 컬럼 추가 (현재 번호 목록이라면 표로 전환).
74
- - `4.5.6 Validation Checklist`: pre/mid/post 각 체크 행에 `Ticket ID` 컬럼 추가.
75
- - `5.1 추가 자료 요청`, `5.2 사용자 확인 질문`: 기존 표에 `Ticket ID` 컬럼을 두 번째 위치로 삽입 (`자료 ID` / `질문 ID` 다음).
76
-
77
- ### 4.4 입력 템플릿
78
- 대상 파일:
79
- - `templates/reports/error-analysis-input.template.md`
80
- - `templates/reports/implementation-planning-input.template.md`
81
- - `templates/reports/implementation-input.template.md`
82
- - `templates/reports/quick-input.template.md`
83
-
84
- 변경:
85
- - `Identity` 섹션의 `Issue / Ticket:` 줄 바로 아래에 한 줄 가이드 추가.
86
- > `Issue / Ticket` 값이 비면 워커는 `Task ID`로 폴백한다 (예: `8852`). 한 run에서 여러 ticket을 동시에 다루는 경우 쉼표로 구분한다 (`TICKET-123, TICKET-456`).
87
-
88
- ### 4.5 `templates/reports/task-brief.template.md`
89
- - `Identity` 섹션에 동일한 폴백/다중 ticket 가이드 한 줄 추가.
90
- - `Questions for Workers > Standing Scope-Discipline Questions` 직전에 한 줄 추가: "모든 항목 및 표 행에 ticket을 명시해야 한다. 표 형식은 `Ticket ID` 컬럼, bullet/번호목록·섹션 헤더는 `[TICKETID: ...]` 태그를 사용한다. 자세한 규칙은 `okstra-team-contract` SKILL을 참조."
91
-
92
- ### 4.6 워커 프롬프트
93
- 대상 파일:
94
- - `agents/workers/claude-worker.md`
95
- - `agents/workers/codex-worker.md`
96
- - `agents/workers/gemini-worker.md`
97
-
98
- 변경:
99
- - `Worker Output Structure` 절 끝에 한 단락 추가. 표기 규칙은 team-contract가 authoritative source임을 명시하고, 표/비-표 두 가지 형식과 폴백·다중 ticket·`unknown` 규칙을 한 번에 인용.
100
-
101
- ### 4.7 `agents/workers/report-writer-worker.md`
102
- - final-report 작성 의무 절에 한 줄 추가: "워커 산출물의 `Ticket ID` 컬럼 및 `[TICKETID: ...]` 태그를 보존하고, 상단 `## Ticket Coverage` 표를 본 spec 규칙대로 채울 것."
103
-
104
- ## 5. 손대지 않는 곳
105
-
106
- - 기존 `F-001`, `A1`, `Q1` 등 ID 카운터 체계 (전역 유일성 그대로 유지).
107
- - `User Approval Request` 체크박스, validator의 영문 키워드 매칭(`Option Candidates`, `Trade-off`, `Recommended Option`, `Stepwise Execution Order`, `Dependency`, `Validation Checklist`, `Rollback`, `User Approval Request`).
108
- - `release-handoff`, `final-verification` 산출물 및 그 phase의 워커/lead 출력.
109
- - 토큰 사용량 표, Execution Status 표 등 ticket scope와 무관한 메타 표.
110
-
111
- ## 6. 영향과 위험
112
-
113
- - **convergence 파서**: bullet 한 줄 안에 ticket 태그가 함께 들어가 정규식 변경이 필요. ticket이 finding의 그룹핑 키 일부가 되므로 동일 root cause라도 ticket이 다르면 별도 그룹으로 처리된다. 의도된 동작.
114
- - **기존 보고서 호환성**: 본 변경은 신규 run에만 적용. 과거 보고서는 마이그레이션하지 않는다.
115
- - **워커가 ticket을 못 채우는 경우**: `unknown` 표기를 허용하지만, 이는 입력 템플릿이 잘못 채워졌다는 신호이므로 lead가 `Missing Information` 항목으로 함께 기록한다.
116
- - **다중 ticket 콤마 구분 vs 정규식**: ticket ID 자체에 콤마가 들어가는 경우는 없다고 가정한다. JIRA/GitHub/Linear 모두 콤마 미사용. 만약 향후 콤마를 포함한 ticket ID가 나오면 별도 escape 룰을 추가한다 (현재 spec에는 포함하지 않음).
117
-
118
- ## 7. 검증
119
-
120
- - 신규 run 1건씩 phase별로 실행해 다음을 수동 확인:
121
- - 입력 템플릿 가이드가 노출되는지.
122
- - 워커 출력의 bullet 항목 전부에 `[TICKETID: ...]` 태그가 붙는지.
123
- - 표 섹션에 `Ticket ID` 컬럼이 채워지는지.
124
- - final report 상단 `## Ticket Coverage` 표가 본문 항목과 정합한지 (수동 cross-check).
125
- - `validators/` 디렉토리에 ticket 태그/컬럼 누락을 잡는 정적 체크를 추가하는 것은 후속 작업(이번 spec 범위 밖).
126
-
127
- ## 8. 후속 작업 (이번 spec 범위 밖)
128
-
129
- - `validators/`에 ticket 표기 강제용 정적 검증기 추가.
130
- - `final-verification`, `release-handoff` phase에도 동일 규칙 확장 여부 결정.
131
- - `okstra-convergence` 상태 아티팩트 스키마에 `ticketId` 정식 필드화 (현재는 분류 키로만 사용).