okstra 0.102.1 → 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.
- package/README.kr.md +5 -6
- package/README.md +5 -6
- package/docs/kr/architecture/storage-model.md +1 -1
- package/docs/kr/architecture.md +8 -12
- package/docs/kr/cli.md +6 -6
- package/docs/kr/container.md +1 -1
- package/docs/kr/performance-improvement-plan-v2.md +2 -2
- package/docs/project-structure-overview.md +2 -2
- package/package.json +7 -2
- package/runtime/BUILD.json +2 -2
- package/runtime/bin/okstra-antigravity-exec.sh +1 -2
- package/runtime/bin/okstra-codex-exec.sh +1 -2
- package/runtime/bin/okstra-render-final-report.py +2 -9
- package/runtime/bin/okstra-spawn-followups.py +4 -6
- package/runtime/bin/okstra-trace-cleanup.sh +24 -4
- package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
- package/runtime/prompts/lead/report-writer.md +1 -1
- package/runtime/prompts/profiles/_common-contract.md +9 -11
- package/runtime/python/okstra_ctl/codex_dispatch.py +4 -12
- package/runtime/python/okstra_ctl/consumers.py +35 -0
- package/runtime/python/okstra_ctl/container.py +4 -6
- package/runtime/python/okstra_ctl/dispatch_core.py +4 -12
- package/runtime/python/okstra_ctl/final_report_paths.py +24 -0
- package/runtime/python/okstra_ctl/handoff.py +2 -1
- package/runtime/python/okstra_ctl/implementation_stage.py +7 -11
- package/runtime/python/okstra_ctl/report_view_artifacts.py +14 -0
- package/runtime/python/okstra_ctl/report_views.py +7 -4
- package/runtime/python/okstra_ctl/run.py +3 -10
- package/runtime/python/okstra_ctl/stage_targets.py +18 -0
- package/runtime/python/okstra_ctl/wizard.py +24 -25
- package/runtime/python/okstra_ctl/wizard_stage_intent.py +54 -0
- package/runtime/python/okstra_token_usage/report.py +2 -5
- package/runtime/validators/validate-report-views.py +2 -1
- package/runtime/validators/validate-run.py +1 -11
- package/src/cli-registry.mjs +1 -1
- package/src/commands/lifecycle/install.mjs +10 -20
- package/src/commands/lifecycle/uninstall.mjs +7 -10
- package/docs/superpowers/plans/2026-05-12-ticket-id-in-reports.md +0 -638
- package/docs/superpowers/plans/2026-05-14-convergence-queue-pruning.md +0 -1568
- package/docs/superpowers/plans/2026-05-17-dual-format-final-report.md +0 -167
- package/docs/superpowers/plans/2026-05-20-final-report-language.md +0 -1501
- package/docs/superpowers/plans/2026-05-20-implementation-planning-multi-stage.md +0 -1267
- package/docs/superpowers/plans/2026-05-20-okstra-run-prompt-sot-b1.md +0 -1007
- package/docs/superpowers/plans/2026-05-20-wizard-messages-json-sot.md +0 -720
- package/docs/superpowers/plans/2026-05-20-wizard-prompt-json-sot-a1.md +0 -681
- package/docs/superpowers/plans/2026-05-21-improvement-discovery-task-type.md +0 -1691
- package/docs/superpowers/plans/2026-05-24-implementation-lead-context-slimming.md +0 -1700
- package/docs/superpowers/plans/2026-05-25-okstra-project-root-rename.md +0 -158
- package/docs/superpowers/plans/2026-05-26-wizard-3-option-picker.md +0 -860
- package/docs/superpowers/plans/2026-06-02-final-verification-protocol-hardening.md +0 -326
- package/docs/superpowers/plans/2026-06-02-okstra-run-branch-confirm-step.md +0 -337
- package/docs/superpowers/plans/2026-06-02-okstra-run-phase-pane-cleanup.md +0 -410
- package/docs/superpowers/plans/2026-06-02-requirements-discovery-fanout.md +0 -728
- package/docs/superpowers/plans/2026-06-04-adversarial-implementation-planning.md +0 -294
- package/docs/superpowers/plans/2026-06-04-adversarial-verification.md +0 -570
- package/docs/superpowers/plans/2026-06-04-coverage-critic.md +0 -516
- package/docs/superpowers/plans/2026-06-04-stage-cohesion-planner.md +0 -351
- package/docs/superpowers/plans/2026-06-04-stage-run-batching.md +0 -457
- package/docs/superpowers/plans/2026-06-05-acceptance-critic.md +0 -251
- package/docs/superpowers/plans/2026-06-05-compact-markdown-report-tables.md +0 -323
- package/docs/superpowers/plans/2026-06-05-wizard-batch-prompts.md +0 -559
- package/docs/superpowers/plans/2026-06-06-final-verification-whole-task-gate.md +0 -993
- package/docs/superpowers/plans/2026-06-06-stage-parallel-and-pending-fixes.md +0 -93
- package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p1.md +0 -447
- package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p2.md +0 -289
- package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p3.md +0 -774
- package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p4.md +0 -303
- package/docs/superpowers/plans/2026-06-06-stage-worktree-isolation-p5-multidep-base.md +0 -387
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase2.md +0 -275
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase3.md +0 -282
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4a.md +0 -147
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4b.md +0 -262
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4c.md +0 -184
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4d.md +0 -88
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa-phase4e.md +0 -250
- package/docs/superpowers/plans/2026-06-07-stage-conformance-qa.md +0 -409
- package/docs/superpowers/plans/2026-06-09-implementation-run-artifact-stage-isolation.md +0 -320
- package/docs/superpowers/plans/2026-06-10-concurrent-run-team-guard.md +0 -456
- package/docs/superpowers/plans/2026-06-10-git-reconcile-stale-sha-recovery.md +0 -1408
- package/docs/superpowers/plans/2026-06-10-lead-worker-completion-polling-PROBE.md +0 -42
- package/docs/superpowers/plans/2026-06-10-lead-worker-completion-polling.md +0 -337
- package/docs/superpowers/plans/2026-06-10-p6-token-usage-incremental.md +0 -1029
- package/docs/superpowers/plans/2026-06-10-stage-group-handoff.md +0 -1572
- package/docs/superpowers/plans/2026-06-11-fix-cycle.md +0 -1290
- package/docs/superpowers/plans/2026-06-11-wizard-whole-task-final-verification.md +0 -526
- package/docs/superpowers/plans/2026-06-12-html-plan-approval.md +0 -1000
- package/docs/superpowers/plans/2026-06-13-repo-risk-hardening.md +0 -493
- package/docs/superpowers/plans/2026-06-14-host-runtime-auto-execution.md +0 -1775
- package/docs/superpowers/plans/2026-06-15-coding-preflight-pack-dispatch-path.md +0 -504
- package/docs/superpowers/plans/2026-06-15-internal-skill-migration-final-fixups.md +0 -342
- package/docs/superpowers/plans/2026-06-15-internal-skill-migration-fixups.md +0 -258
- package/docs/superpowers/plans/2026-06-15-internal-skill-migration-remaining-fixups.md +0 -387
- package/docs/superpowers/plans/2026-06-15-internal-skill-resource-migration.md +0 -749
- package/docs/superpowers/plans/2026-06-15-worker-prompt-anchor-final-fixups.md +0 -828
- package/docs/superpowers/plans/2026-06-15-worker-prompt-header-error-contract.md +0 -490
- package/docs/superpowers/plans/2026-06-17-okstra-error-report.md +0 -724
- package/docs/superpowers/plans/2026-06-18-subagent-pane-reclaim.md +0 -483
- package/docs/superpowers/plans/2026-06-19-agent-operating-standard.md +0 -476
- package/docs/superpowers/plans/2026-06-19-okstra-inspect-recap-facet.md +0 -647
- package/docs/superpowers/plans/2026-06-20-error-feedback-loop.md +0 -1019
- package/docs/superpowers/plans/2026-06-20-run-index-row-normalization.md +0 -583
- package/docs/superpowers/plans/2026-06-20-stage-auto-integrate-teardown.md +0 -819
- package/docs/superpowers/plans/2026-06-21-okstra-container-local-user-test.md +0 -714
- package/docs/superpowers/plans/2026-06-21-release-handoff-local-checkout.md +0 -348
- package/docs/superpowers/plans/2026-06-23-implementation-stage-multiselect-chain.md +0 -630
- package/docs/superpowers/plans/2026-06-23-implementation-step-commit-granularity.md +0 -274
- package/docs/superpowers/plans/2026-06-23-phase-batch-cleanup-enforcement.md +0 -409
- package/docs/superpowers/plans/2026-06-24-cross-project-precondition.md +0 -542
- package/docs/superpowers/plans/2026-06-24-decision-drafts-render-gap.md +0 -568
- package/docs/superpowers/plans/2026-06-24-manual-user-test-section.md +0 -203
- package/docs/superpowers/plans/2026-06-24-okstra-container-build-rename.md +0 -525
- package/docs/superpowers/specs/2026-05-12-ticket-id-in-reports-design.md +0 -131
- package/docs/superpowers/specs/2026-05-15-implementation-plan-verification-design.md +0 -254
- package/docs/superpowers/specs/2026-05-20-final-report-language-design.md +0 -383
- package/docs/superpowers/specs/2026-05-20-implementation-planning-multi-stage-design.md +0 -322
- package/docs/superpowers/specs/2026-05-20-okstra-run-prompt-sot-design.md +0 -299
- package/docs/superpowers/specs/2026-05-21-improvement-discovery-task-type-design.md +0 -335
- package/docs/superpowers/specs/2026-06-02-okstra-run-branch-confirm-step-design.md +0 -113
- package/docs/superpowers/specs/2026-06-02-okstra-run-phase-pane-cleanup-design.md +0 -173
- package/docs/superpowers/specs/2026-06-02-requirements-discovery-fanout-design.md +0 -154
- package/docs/superpowers/specs/2026-06-04-adversarial-implementation-planning-design.md +0 -90
- package/docs/superpowers/specs/2026-06-04-adversarial-verification-design.md +0 -176
- package/docs/superpowers/specs/2026-06-04-coverage-critic-design.md +0 -99
- package/docs/superpowers/specs/2026-06-04-stage-splitting-cost-aware-design.md +0 -98
- package/docs/superpowers/specs/2026-06-05-acceptance-critic-design.md +0 -90
- package/docs/superpowers/specs/2026-06-05-compact-markdown-report-tables-design.md +0 -87
- package/docs/superpowers/specs/2026-06-05-wizard-batch-prompts-design.md +0 -121
- package/docs/superpowers/specs/2026-06-06-final-verification-whole-task-gate-design.md +0 -126
- package/docs/superpowers/specs/2026-06-06-stage-worktree-isolation-design.md +0 -180
- package/docs/superpowers/specs/2026-06-06-vertical-slice-tdd-planning-design.md +0 -179
- package/docs/superpowers/specs/2026-06-07-stage-conformance-qa-design.md +0 -169
- package/docs/superpowers/specs/2026-06-09-executor-model-custom-id-cascade-design.md +0 -66
- package/docs/superpowers/specs/2026-06-09-implementation-run-artifact-stage-isolation-design.md +0 -87
- package/docs/superpowers/specs/2026-06-10-blocking-contract-posthoc-conformance-design.md +0 -168
- package/docs/superpowers/specs/2026-06-10-concurrent-run-team-guard-design.md +0 -107
- package/docs/superpowers/specs/2026-06-10-git-reconcile-stale-sha-recovery-design.md +0 -105
- package/docs/superpowers/specs/2026-06-10-lead-worker-completion-polling-design.md +0 -113
- package/docs/superpowers/specs/2026-06-10-stage-group-handoff-design.md +0 -156
- package/docs/superpowers/specs/2026-06-11-brief-entry-only-handoff-stage-entry-design.md +0 -158
- package/docs/superpowers/specs/2026-06-11-fix-cycle-design.md +0 -94
- package/docs/superpowers/specs/2026-06-11-wizard-whole-task-final-verification-design.md +0 -89
- package/docs/superpowers/specs/2026-06-12-codex-lead-adapter-design.md +0 -358
- package/docs/superpowers/specs/2026-06-12-html-plan-approval-design.md +0 -85
- package/docs/superpowers/specs/2026-06-12-stage-discipline-rule-design.md +0 -108
- package/docs/superpowers/specs/2026-06-13-forbidden-actions-ssot-design.md +0 -134
- package/docs/superpowers/specs/2026-06-13-neutral-tmux-lead-adapter-design.md +0 -284
- package/docs/superpowers/specs/2026-06-14-host-runtime-auto-execution-design.md +0 -404
- package/docs/superpowers/specs/2026-06-17-okstra-error-report-design.md +0 -123
- package/docs/superpowers/specs/2026-06-18-subagent-pane-reclaim-design.md +0 -150
- package/docs/superpowers/specs/2026-06-19-agent-operating-standard-design.md +0 -120
- package/docs/superpowers/specs/2026-06-19-okstra-inspect-recap-facet-design.md +0 -96
- package/docs/superpowers/specs/2026-06-20-error-feedback-loop-design.md +0 -171
- package/docs/superpowers/specs/2026-06-20-run-index-row-normalization-design.md +0 -112
- package/docs/superpowers/specs/2026-06-20-stage-auto-integrate-teardown-design.md +0 -145
- package/docs/superpowers/specs/2026-06-21-okstra-container-local-user-test-design.md +0 -125
- package/docs/superpowers/specs/2026-06-21-release-handoff-local-checkout-design.md +0 -113
- package/docs/superpowers/specs/2026-06-23-implementation-stage-multiselect-chain-design.md +0 -138
- package/docs/superpowers/specs/2026-06-23-implementation-step-commit-granularity-design.md +0 -120
- package/docs/superpowers/specs/2026-06-24-cross-project-precondition-design.md +0 -129
- package/docs/superpowers/specs/2026-06-24-decision-drafts-render-gap-design.md +0 -185
- package/docs/superpowers/specs/2026-06-24-manual-user-test-section-design.md +0 -121
- 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` 정식 필드화 (현재는 분류 키로만 사용).
|