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.
- package/README.kr.md +5 -5
- package/README.md +5 -5
- package/docs/kr/architecture/storage-model.md +1 -1
- package/docs/kr/architecture.md +7 -11
- package/docs/kr/cli.md +4 -4
- 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/commands/lifecycle/install.mjs +5 -5
- package/src/commands/lifecycle/uninstall.mjs +4 -4
- 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,456 +0,0 @@
|
|
|
1
|
-
# ๋์-run team ๊ฐ๋ ๊ตฌํ ํ๋
|
|
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:** ๊ฐ์ task-key ์ implementation run ์ด ๋์์ ๋ ๋, ํ๋ฐ run ์ด team ์ ๋ง๋ค์ง ์๊ณ no-team background ๋ก worker ๋ฅผ dispatch ํ๊ฒ ๋ง๋ค์ด `~/.claude/teams/` config race ๋ฅผ ์๋ฐฉํ๋ค.
|
|
6
|
-
|
|
7
|
-
**Architecture:** `prepare_task_bundle` ์ stage ์ ํ ๋จ๊ณ๊ฐ ์ด๋ฏธ ํธ์ถํ๋ `list_active_stage_numbers` ๋ก ๋์-run ์ ๊ฐ์งํ๋ค โ `StageSelection.concurrent_stages` ์ ๋ด์ โ `ctx["CONCURRENT_RUN_STAGES"]` ๋ก wire โ render ๊ฐ "Team Creation Gate" ๋์ "no-team background" ๋ธ๋ก์ emit + `PrepareOutputs.extras["concurrent_run"]` ๋ก ์ง์
์ ์ ๋
ธ์ถ. ์ lockยท์ ์ถ์ ์์, enforce ์ง์ ์ Python ๋ ๋.
|
|
8
|
-
|
|
9
|
-
**Tech Stack:** Python 3 (`scripts/okstra_ctl/`), pytest, Markdown ํ๋กฌํํธ/์คํฌ, `npm run build`(์์คโ`runtime/` ๋๊ธฐํ).
|
|
10
|
-
|
|
11
|
-
**์ค๊ณ ์ถ์ฒ:** [docs/superpowers/specs/2026-06-10-concurrent-run-team-guard-design.md](../specs/2026-06-10-concurrent-run-team-guard-design.md)
|
|
12
|
-
|
|
13
|
-
**์ ์ญ ๊ท์น:**
|
|
14
|
-
- `runtime/` ๋ build output โ ์ง์ ํธ์ง ๊ธ์ง. ์์ค(`scripts/`, `prompts/`, `agents/`, `skills/`)๋ง ๊ณ ์น๊ณ Task 7 ์์ `npm run build`.
|
|
15
|
-
- ์ปค๋ฐ trailer ๊ธ์ง(`Co-Authored-By` / `Generated with` ๋ฑ). Conventional Commits header `type(scope): โฆ`.
|
|
16
|
-
- ๊ฐ Task ๋ ์์ค + ํ
์คํธ๋ฅผ ๊ฐ์ ์ปค๋ฐ์ ๋ด๋๋ค.
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## File Structure
|
|
21
|
-
|
|
22
|
-
| ํ์ผ | ์ฑ
์ | Task |
|
|
23
|
-
|---|---|---|
|
|
24
|
-
| [scripts/okstra_ctl/render.py](../../../scripts/okstra_ctl/render.py) | `inject_lead_prompt_computed_tokens` ์ no-team ๋ธ๋ก ๋ถ๊ธฐ ์ถ๊ฐ | 1 |
|
|
25
|
-
| [scripts/okstra_ctl/run.py](../../../scripts/okstra_ctl/run.py) | `StageSelection.concurrent_stages` ํ๋ + ๊ฐ์งยทwire + `extras` ์ ํ | 2, 3 |
|
|
26
|
-
| [agents/SKILL.md](../../../agents/SKILL.md), [prompts/profiles/_common-contract.md](../../../prompts/profiles/_common-contract.md) | no-team fallback ์ ์ legal ์ฌ์ (`status:"skipped"`, `reason:"concurrent-run"`) | 4 |
|
|
27
|
-
| [skills/okstra-run/SKILL.md](../../../skills/okstra-run/SKILL.md) | ๋ํํ 3-์ต์
picker | 5 |
|
|
28
|
-
| [tests/test_render_inject_computed_tokens.py](../../../tests/test_render_inject_computed_tokens.py), [tests/test_okstra_run_select_and_apply_implementation_stage.py](../../../tests/test_okstra_run_select_and_apply_implementation_stage.py) | ๋จ์ ํ
์คํธ | 1, 2 |
|
|
29
|
-
| `tests-e2e/scenario-<id>-concurrent-run-no-team.sh` | e2e (extras ์ ํ + no-team ๋ธ๋ก) | 6 |
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Task 1: render โ ๋์-run no-team ๋ธ๋ก ๋ถ๊ธฐ
|
|
34
|
-
|
|
35
|
-
**Files:**
|
|
36
|
-
- Modify: `scripts/okstra_ctl/render.py:1645-1664` (`inject_lead_prompt_computed_tokens` ๋ด team-gate ๋ถ๊ธฐ)
|
|
37
|
-
- Test: `tests/test_render_inject_computed_tokens.py`
|
|
38
|
-
|
|
39
|
-
์ด Task ๊ฐ ctx ํค ๊ณ์ฝ(`CONCURRENT_RUN_STAGES`)์ ๋จผ์ ์ ์ํ๋ค. Task 2 ๊ฐ ์ด ํค๋ฅผ ์ฑ์ด๋ค.
|
|
40
|
-
|
|
41
|
-
- [ ] **Step 1: ์คํจ ํ
์คํธ ์์ฑ** โ `tests/test_render_inject_computed_tokens.py` ๋์ ์ถ๊ฐ
|
|
42
|
-
|
|
43
|
-
```python
|
|
44
|
-
def test_inject_concurrent_run_emits_no_team_block():
|
|
45
|
-
"""๋์-run ๊ฐ์ง ์ Team Creation Gate ๋์ no-team background ๋ธ๋ก์ emit."""
|
|
46
|
-
ctx = _base_ctx()
|
|
47
|
-
ctx["TASK_TYPE"] = "implementation"
|
|
48
|
-
ctx["EFFECTIVE_STAGES"] = "4"
|
|
49
|
-
ctx["CONCURRENT_RUN_STAGES"] = "5"
|
|
50
|
-
inject_lead_prompt_computed_tokens(ctx)
|
|
51
|
-
gate = ctx["TEAM_CREATION_GATE"]
|
|
52
|
-
assert "Concurrent-run: no-team background" in gate
|
|
53
|
-
# ์ค์ team ์์ฑ ํธ์ถ ํํ๋ ์์ด์ผ ํ๋ค
|
|
54
|
-
assert 'TeamCreate(team_name:' not in gate
|
|
55
|
-
assert 'reason: "concurrent-run"' in gate
|
|
56
|
-
assert "run_in_background" in gate
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def test_inject_no_concurrent_keeps_team_gate():
|
|
60
|
-
"""CONCURRENT_RUN_STAGES ๊ฐ ์์ผ๋ฉด ๊ธฐ์กด Team Creation Gate ๊ทธ๋๋ก(ํ๊ท ๋ฐฉ์ง)."""
|
|
61
|
-
ctx = _base_ctx()
|
|
62
|
-
ctx["TASK_TYPE"] = "implementation"
|
|
63
|
-
ctx["EFFECTIVE_STAGES"] = "4"
|
|
64
|
-
inject_lead_prompt_computed_tokens(ctx)
|
|
65
|
-
assert "Team Creation Gate (BLOCKING)" in ctx["TEAM_CREATION_GATE"]
|
|
66
|
-
assert 'TeamCreate(team_name: "okstra-demo/task-a-s4"' in ctx["TEAM_CREATION_GATE"]
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
- [ ] **Step 2: ์คํจ ํ์ธ**
|
|
70
|
-
|
|
71
|
-
Run: `python3 -m pytest tests/test_render_inject_computed_tokens.py::test_inject_concurrent_run_emits_no_team_block -v`
|
|
72
|
-
Expected: FAIL โ `"Concurrent-run: no-team background"` ๊ฐ gate ์ ์์(ํ์ฌ๋ Team Creation Gate ๊ฐ ๋์ด).
|
|
73
|
-
|
|
74
|
-
- [ ] **Step 3: ๋ถ๊ธฐ ์ถ๊ฐ** โ `render.py` ์ `task_type = ctx.get("TASK_TYPE", "")` ์ค(ํ 1645) ๋ฐ๋ก ์๋์ `concurrent_stages` ๋ฅผ ์ฝ๊ณ , `if task_type == "release-handoff" or not selected:` ์ `else:` ์ฌ์ด์ `elif` ๋ฅผ ๋ผ์ด๋ค. ์ต์ข
ํํ:
|
|
75
|
-
|
|
76
|
-
```python
|
|
77
|
-
task_type = ctx.get("TASK_TYPE", "")
|
|
78
|
-
concurrent_stages = str(ctx.get("CONCURRENT_RUN_STAGES", "") or "").strip()
|
|
79
|
-
if task_type == "release-handoff" or not selected:
|
|
80
|
-
team_creation_gate_block = (
|
|
81
|
-
"## Single-Lead Phase (no team creation)\n"
|
|
82
|
-
"\n"
|
|
83
|
-
"This run is single-lead. There is no worker roster, no\n"
|
|
84
|
-
"`TeamCreate` call, no `Agent(...)` worker dispatch, and no\n"
|
|
85
|
-
"convergence loop. The Claude lead performs every step inline\n"
|
|
86
|
-
"(reading inputs, drafting commit / PR text when applicable,\n"
|
|
87
|
-
"asking the user, running git / gh, and writing the final\n"
|
|
88
|
-
"report). Do NOT call `TeamCreate` or dispatch any sub-agent\n"
|
|
89
|
-
"from this run โ that would be a contract violation."
|
|
90
|
-
)
|
|
91
|
-
elif task_type == "implementation" and concurrent_stages:
|
|
92
|
-
team_creation_gate_block = (
|
|
93
|
-
"## Concurrent-run: no-team background (BLOCKING)\n"
|
|
94
|
-
"\n"
|
|
95
|
-
"A concurrent implementation run of the same task-key holds stage(s)\n"
|
|
96
|
-
f"`{concurrent_stages}` right now. Creating a team would race the shared\n"
|
|
97
|
-
"`~/.claude/teams/` config and can make another stage's `config.json`\n"
|
|
98
|
-
"unreadable. This run therefore does NOT create a team.\n"
|
|
99
|
-
"\n"
|
|
100
|
-
"Required actions, in order:\n"
|
|
101
|
-
"\n"
|
|
102
|
-
"1. Do NOT call `TeamCreate`, and do NOT dispatch any worker with\n"
|
|
103
|
-
" `Agent(... team_name: ...)`.\n"
|
|
104
|
-
"2. Before any dispatch, record in team-state:\n"
|
|
105
|
-
' `teamCreate: { attempted: false, status: "skipped",'
|
|
106
|
-
f' reason: "concurrent-run", concurrentStages: [{concurrent_stages}] }}`.\n'
|
|
107
|
-
"3. Dispatch every worker with `run_in_background: true` and NO\n"
|
|
108
|
-
" `team_name` (the Phase 5 fallback). Worker completion is detected by\n"
|
|
109
|
-
" result-file polling, so analysis output is equivalent โ only the\n"
|
|
110
|
-
" Teams split-pane view is lost."
|
|
111
|
-
)
|
|
112
|
-
else:
|
|
113
|
-
team_name = f'okstra-{ctx.get("TASK_KEY", "")}'
|
|
114
|
-
stage = str(ctx.get("EFFECTIVE_STAGES", "") or "").strip()
|
|
115
|
-
if task_type == "implementation" and stage:
|
|
116
|
-
# stage ๊ฒฉ๋ฆฌ run ์ stage ๋ณ team โ ๊ฐ์ task ์ ๋ค๋ฅธ stage ๊ฐ ๋จ๊ธด
|
|
117
|
-
# team ๊ณผ ์ด๋ฆ์ด ์ถฉ๋ํ์ง ์๋๋ค(worktree branch `-s<N>` ์ ๋ฏธ์ฌ์ ๋ํ).
|
|
118
|
-
team_name = f"{team_name}-s{stage}"
|
|
119
|
-
team_creation_gate_block = (
|
|
120
|
-
# ... ๊ธฐ์กด "## Team Creation Gate (BLOCKING)" ๋ธ๋ก ๊ทธ๋๋ก ์ ์ง ...
|
|
121
|
-
)
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
> ์ฃผ์: `else:` ์์ ๊ธฐ์กด Team Creation Gate ๋ธ๋ก ๋ณธ๋ฌธ(ํ 1665-1703)์ **๊ทธ๋๋ก ๋๋ค**. `elif` ๋ง ๋ผ์ฐ๋ ๋ณ๊ฒฝ์ด๋ค.
|
|
125
|
-
|
|
126
|
-
- [ ] **Step 4: ํต๊ณผ ํ์ธ**
|
|
127
|
-
|
|
128
|
-
Run: `python3 -m pytest tests/test_render_inject_computed_tokens.py -v`
|
|
129
|
-
Expected: PASS (์ ๊ท 2๊ฐ + ๊ธฐ์กด ์ ๋ถ).
|
|
130
|
-
|
|
131
|
-
- [ ] **Step 5: ์ปค๋ฐ**
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
git add scripts/okstra_ctl/render.py tests/test_render_inject_computed_tokens.py
|
|
135
|
-
git commit -m "feat(okstra-ctl): ๋์-run ์ no-team background ๊ฒ์ดํธ ๋ธ๋ก ๋ ๋"
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## Task 2: run โ ๋์-run ๊ฐ์ง + ctx wire
|
|
141
|
-
|
|
142
|
-
**Files:**
|
|
143
|
-
- Modify: `scripts/okstra_ctl/run.py:1297-1313` (`StageSelection` ํ๋ ์ถ๊ฐ)
|
|
144
|
-
- Modify: `scripts/okstra_ctl/run.py:1340-1412` (`_select_and_provision_implementation_stage` ์ฑ์ฐ๊ธฐ)
|
|
145
|
-
- Modify: `scripts/okstra_ctl/run.py:1426-1429` (`_apply_implementation_stage` ctx wire)
|
|
146
|
-
- Test: `tests/test_okstra_run_select_and_apply_implementation_stage.py`
|
|
147
|
-
|
|
148
|
-
- [ ] **Step 1: ์คํจ ํ
์คํธ ์์ฑ** โ ํ์ผ ๋์ ์ถ๊ฐ. registry ์ ๋ค๋ฅธ stage ๋ฅผ active ๋ก ๋ฏธ๋ฆฌ ์์ฝํด ๋์-run ์ ์๋ฎฌ๋ ์ด์
ํ๋ค.
|
|
149
|
-
|
|
150
|
-
```python
|
|
151
|
-
def test_select_flags_concurrent_active_stage(tmp_path, monkeypatch):
|
|
152
|
-
"""๋ค๋ฅธ run ์ด stage 6 ์ active ๋ก ์ ์ ์ค์ด๋ฉด, stage 4 ์ ํ ๊ฒฐ๊ณผ์
|
|
153
|
-
concurrent_stages ์ 6 ์ด ๋ด๊ธด๋ค."""
|
|
154
|
-
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
|
|
155
|
-
from okstra_ctl import worktree_registry as reg
|
|
156
|
-
from okstra_ctl.run import _select_and_provision_implementation_stage
|
|
157
|
-
|
|
158
|
-
repo = tmp_path / "repo"
|
|
159
|
-
head = _init_repo(repo)
|
|
160
|
-
|
|
161
|
-
# ๋ค๋ฅธ ๋์ run ์ด stage 6 ์ active ๋ก ์ ์ ์ค์ด๋ผ๊ณ ๊ฐ์
|
|
162
|
-
reg.reserve(
|
|
163
|
-
project_id="proj", task_group="grp", task_id="tid",
|
|
164
|
-
worktree_path=str(tmp_path / "s6"), branch="feature-tid-s6",
|
|
165
|
-
base_ref=head, stage_number=6,
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
plan = _consumers_dir(tmp_path)
|
|
169
|
-
inp = _Inp(project_root=str(repo), approved_plan_path=str(plan), stage="auto")
|
|
170
|
-
stages = [_stage(4, []), _stage(6, [])]
|
|
171
|
-
|
|
172
|
-
sel = _select_and_provision_implementation_stage(
|
|
173
|
-
inp, stages, "grp", "tid", "proj:grp:tid", "ok",
|
|
174
|
-
)
|
|
175
|
-
assert sel.stage == 4
|
|
176
|
-
assert sel.concurrent_stages == [6]
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def test_select_no_concurrent_when_alone(tmp_path):
|
|
180
|
-
"""๋์ run ์ด ์์ผ๋ฉด concurrent_stages ๋ ๋น ๋ฆฌ์คํธ."""
|
|
181
|
-
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
|
|
182
|
-
from okstra_ctl.run import _select_and_provision_implementation_stage
|
|
183
|
-
|
|
184
|
-
repo = tmp_path / "repo"
|
|
185
|
-
head = _init_repo(repo)
|
|
186
|
-
plan = _consumers_dir(tmp_path)
|
|
187
|
-
inp = _Inp(project_root=str(repo), approved_plan_path=str(plan), stage="auto")
|
|
188
|
-
stages = [_stage(4, [])]
|
|
189
|
-
|
|
190
|
-
sel = _select_and_provision_implementation_stage(
|
|
191
|
-
inp, stages, "grp", "tid", "proj:grp:tid", "ok",
|
|
192
|
-
)
|
|
193
|
-
assert sel.stage == 4
|
|
194
|
-
assert sel.concurrent_stages == []
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
> `conftest.py` ๊ฐ `OKSTRA_HOME` ๋ฅผ ๊ฒฉ๋ฆฌํ๋ฏ๋ก registry ๋ ํ
์คํธ ์์ ๊ฒฝ๋ก์ ์ฐ์ธ๋ค. `_init_repo` / `_stage` / `_Inp` / `_consumers_dir` ๋ ํ์ผ ์๋จ์ ๊ธฐ์กด ํฌํผ๋ค.
|
|
198
|
-
|
|
199
|
-
- [ ] **Step 2: ์คํจ ํ์ธ**
|
|
200
|
-
|
|
201
|
-
Run: `python3 -m pytest tests/test_okstra_run_select_and_apply_implementation_stage.py::test_select_flags_concurrent_active_stage -v`
|
|
202
|
-
Expected: FAIL โ `AttributeError: 'StageSelection' object has no attribute 'concurrent_stages'`.
|
|
203
|
-
|
|
204
|
-
- [ ] **Step 3a: `StageSelection` ํ๋ ์ถ๊ฐ** โ `run.py:1306-1312` ์ dataclass ๋(`started_head_commit: str` ๋ค์ ์ค)์ ์ถ๊ฐ:
|
|
205
|
-
|
|
206
|
-
```python
|
|
207
|
-
started_head_commit: str
|
|
208
|
-
concurrent_stages: list = field(default_factory=list)
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
> ํ์ผ ์๋จ์ `from dataclasses import dataclass, field` ๊ฐ ์ด๋ฏธ ์๋์ง ํ์ธํ๊ณ , `field` ๊ฐ ์์ผ๋ฉด import ์ ์ถ๊ฐํ๋ค.
|
|
212
|
-
|
|
213
|
-
- [ ] **Step 3b: ๊ฐ์ง๊ฐ ๊ณ์ฐ + ๋ ๋ฐํ ๊ฒฝ๋ก์ ๋ด๊ธฐ** โ `_select_and_provision_implementation_stage` ์, `selected = batch[0]`(ํ 1350) ๋ฐ๋ก ๋ค์ ์ค์:
|
|
214
|
-
|
|
215
|
-
```python
|
|
216
|
-
selected = batch[0]
|
|
217
|
-
concurrent_stages = sorted(reserved_stages - {selected})
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
๊ทธ๋ฆฌ๊ณ ์ด ํจ์์ **๋ `return StageSelection(...)`** (degrade ๊ฒฝ๋ก ํ 1356, ์ ์ ๊ฒฝ๋ก ํ 1404) ๋ ๋ค ๋ง์ง๋ง ์ธ์๋ก ์ถ๊ฐ:
|
|
221
|
-
|
|
222
|
-
```python
|
|
223
|
-
started_head_commit=head, # degrade ๊ฒฝ๋ก
|
|
224
|
-
concurrent_stages=concurrent_stages,
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
```python
|
|
228
|
-
started_head_commit=prov.base_ref, # ์ ์ ๊ฒฝ๋ก
|
|
229
|
-
concurrent_stages=concurrent_stages,
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
- [ ] **Step 3c: ctx wire** โ `_apply_implementation_stage` ์, `ctx["EFFECTIVE_STAGES"] = csv`(ํ 1429) ๋ค์ ์ค์:
|
|
233
|
-
|
|
234
|
-
```python
|
|
235
|
-
ctx["CONCURRENT_RUN_STAGES"] = ",".join(str(s) for s in sel.concurrent_stages)
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
- [ ] **Step 4: ํต๊ณผ ํ์ธ**
|
|
239
|
-
|
|
240
|
-
Run: `python3 -m pytest tests/test_okstra_run_select_and_apply_implementation_stage.py -v`
|
|
241
|
-
Expected: PASS (์ ๊ท 2๊ฐ + ๊ธฐ์กด ์ ๋ถ).
|
|
242
|
-
|
|
243
|
-
- [ ] **Step 5: ์ปค๋ฐ**
|
|
244
|
-
|
|
245
|
-
```bash
|
|
246
|
-
git add scripts/okstra_ctl/run.py tests/test_okstra_run_select_and_apply_implementation_stage.py
|
|
247
|
-
git commit -m "feat(okstra-ctl): ๋์ active stage ๋ฅผ StageSelection.concurrent_stages ๋ก ๊ฐ์งยทwire"
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## Task 3: run โ `extras.concurrent_run` ์ ํ
|
|
253
|
-
|
|
254
|
-
**Files:**
|
|
255
|
-
- Modify: `scripts/okstra_ctl/run.py:2005-2009` (`prepare_task_bundle` ์ `return PrepareOutputs(...)`)
|
|
256
|
-
|
|
257
|
-
์ง์
์ (์คํฌ / okstra.sh)์ด ๋์-run ์ฌ๋ถ๋ฅผ ์ฝ์ ์ ์๋๋ก `extras` ์ ์ฃ๋๋ค. ์ ์ฒด ์ฌ์ดํด ๊ฒ์ฆ์ Task 6 e2e ๊ฐ ๋ด๋นํ๋ค.
|
|
258
|
-
|
|
259
|
-
- [ ] **Step 1: `return PrepareOutputs(...)` ์์ ** โ ํ์ฌ:
|
|
260
|
-
|
|
261
|
-
```python
|
|
262
|
-
return PrepareOutputs(
|
|
263
|
-
ctx=ctx,
|
|
264
|
-
prompt_text=prompt_text,
|
|
265
|
-
extras={"profile_content": profile_content},
|
|
266
|
-
)
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
๋ฅผ ๋ค์์ผ๋ก:
|
|
270
|
-
|
|
271
|
-
```python
|
|
272
|
-
concurrent_run: dict = {}
|
|
273
|
-
if impl_stage_selection is not None and impl_stage_selection.concurrent_stages:
|
|
274
|
-
concurrent_run = {
|
|
275
|
-
"detected": True,
|
|
276
|
-
"active_stages": impl_stage_selection.concurrent_stages,
|
|
277
|
-
}
|
|
278
|
-
return PrepareOutputs(
|
|
279
|
-
ctx=ctx,
|
|
280
|
-
prompt_text=prompt_text,
|
|
281
|
-
extras={
|
|
282
|
-
"profile_content": profile_content,
|
|
283
|
-
"concurrent_run": concurrent_run,
|
|
284
|
-
},
|
|
285
|
-
)
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
> `impl_stage_selection` ์ ํ 1825/1831 ์์ ์ ์๋ผ ์ด ์ง์ ๊น์ง ์ ํจํ๋ค(implementation ์ธ task-type ์ `None`).
|
|
289
|
-
|
|
290
|
-
- [ ] **Step 2: import ํ๊ท ํ์ธ** (๋จ์ ํ
์คํธ ์์ โ ์ฝ๋ ๋จ์, Task 6 e2e ๊ฐ ์ค์ธก)
|
|
291
|
-
|
|
292
|
-
Run: `python3 -c "import sys; sys.path.insert(0,'scripts'); from okstra_ctl.run import prepare_task_bundle; print('ok')"`
|
|
293
|
-
Expected: `ok`
|
|
294
|
-
|
|
295
|
-
- [ ] **Step 3: ์ปค๋ฐ**
|
|
296
|
-
|
|
297
|
-
```bash
|
|
298
|
-
git add scripts/okstra_ctl/run.py
|
|
299
|
-
git commit -m "feat(okstra-ctl): PrepareOutputs.extras ๋ก concurrent_run ๋
ธ์ถ"
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
## Task 4: ํ๋กฌํํธ/agent ๊ณ์ฝ โ no-team ์ ์ legal ์ฌ์
|
|
305
|
-
|
|
306
|
-
**Files:**
|
|
307
|
-
- Modify: `agents/SKILL.md:231`
|
|
308
|
-
- Modify: `prompts/profiles/_common-contract.md:53`
|
|
309
|
-
|
|
310
|
-
ํ์ฌ no-`team_name` fallback ์ `teamCreate.status == "error"` ์ผ ๋๋ง legal ์ด๋ค. ๋์-run ์ฌ์ skip ์ legal ๋ก ์ถ๊ฐํ๋ค.
|
|
311
|
-
|
|
312
|
-
- [ ] **Step 1: `agents/SKILL.md:231` ์์ ** โ ํ์ฌ ๋ฌธ์ฅ:
|
|
313
|
-
|
|
314
|
-
> The no-`team_name` fallback (Phase 5) is only legal when team-state's `teamCreate.status` is `"error"` for this run.
|
|
315
|
-
|
|
316
|
-
๋ฅผ ๋ค์์ผ๋ก:
|
|
317
|
-
|
|
318
|
-
> The no-`team_name` fallback (Phase 5) is legal when team-state's `teamCreate.status` is `"error"` (TeamCreate attempted and failed) OR `"skipped"` with `reason: "concurrent-run"` (the launch prompt's "Concurrent-run: no-team background" gate pre-decided no team to avoid racing a concurrent same-task run's `~/.claude/teams/` config). In both cases `teamCreate` is recorded in team-state before any dispatch.
|
|
319
|
-
|
|
320
|
-
- [ ] **Step 2: `_common-contract.md:53` ์์ ** โ ํ์ฌ ๋ฌธ์ฅ:
|
|
321
|
-
|
|
322
|
-
> This step applies only when team-state's `teamCreate.status == "ok"` (Teams mode was actually used). In the no-`team_name` fallback there is no team to delete, so silent-skip.
|
|
323
|
-
|
|
324
|
-
๋ฅผ ๋ค์์ผ๋ก:
|
|
325
|
-
|
|
326
|
-
> This step applies only when team-state's `teamCreate.status == "ok"` (Teams mode was actually used). In the no-`team_name` fallback โ whether `teamCreate.status` is `"error"` or `"skipped"` (`reason: "concurrent-run"`) โ there is no team to delete, so silent-skip.
|
|
327
|
-
|
|
328
|
-
- [ ] **Step 3: grep ๊ฒ์ฆ**
|
|
329
|
-
|
|
330
|
-
Run: `grep -n 'concurrent-run' agents/SKILL.md prompts/profiles/_common-contract.md`
|
|
331
|
-
Expected: ๋ ํ์ผ ๊ฐ๊ฐ ์ต์ 1์ค ๋งค์นญ.
|
|
332
|
-
|
|
333
|
-
- [ ] **Step 4: ์ปค๋ฐ**
|
|
334
|
-
|
|
335
|
-
```bash
|
|
336
|
-
git add agents/SKILL.md prompts/profiles/_common-contract.md
|
|
337
|
-
git commit -m "docs(agents): no-team fallback ์ concurrent-run skipped legal ์ฌ์ ์ถ๊ฐ"
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
---
|
|
341
|
-
|
|
342
|
-
## Task 5: okstra-run ์คํฌ โ ๋ํํ 3-์ต์
picker
|
|
343
|
-
|
|
344
|
-
**Files:**
|
|
345
|
-
- Modify: `skills/okstra-run/SKILL.md` (conformance-waiver picker ์น์
, ํ 192 ๋ถ๊ทผ ๊ทผ์ฒ์ ๋ํ ์น์
์ถ๊ฐ)
|
|
346
|
-
|
|
347
|
-
- [ ] **Step 1: ์น์
์ถ๊ฐ** โ conformance-waiver picker ์ค๋ช
๋ธ๋ก๊ณผ ๊ฐ์ ํจํด์ผ๋ก, prepare ํธ์ถ ๊ฒฐ๊ณผ์์ `extras.concurrent_run.detected == true` ์ผ ๋์ ๋ถ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ค. ๋ณธ๋ฌธ:
|
|
348
|
-
|
|
349
|
-
```markdown
|
|
350
|
-
### ๋์-run ๊ฐ์ง ๋ถ๊ธฐ (concurrent-run)
|
|
351
|
-
|
|
352
|
-
`prepare_task_bundle` ๊ฒฐ๊ณผ์ `extras.concurrent_run.detected` ๊ฐ `true` ์ด๋ฉด(๊ฐ์
|
|
353
|
-
task-key ์ ๋ค๋ฅธ implementation run ์ด `extras.concurrent_run.active_stages` ๋ฅผ
|
|
354
|
-
์ ์ ์ค), launch ํ๋กฌํํธ๋ ์ด๋ฏธ "Concurrent-run: no-team background" ๊ฒ์ดํธ๋ก
|
|
355
|
-
๋ ๋๋ผ ์๋ค. dispatch ์ ์ ์ฌ์ฉ์์๊ฒ 3-์ต์
recommendation picker ๋ฅผ ์ ์ํ๋ค
|
|
356
|
-
(run-prompt recommendation ๊ท์น: 1โ2 ์ถ์ฒ + ์ง์ ์
๋ ฅ; ์ด picker ๋ ์คํฌ์ด
|
|
357
|
-
author ํ๋ ๊ฒ์ด๋ผ wizard `options[]` ์ ์ฝ๊ณผ ๋ฌด๊ด):
|
|
358
|
-
|
|
359
|
-
1. (์ถ์ฒ) ์ด๋๋ก no-team background ๋ก ์งํ โ ์ด๋ฏธ ๋ ๋๋ bundle ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
|
|
360
|
-
team ์ ๋ง๋ค์ง ์์ `~/.claude/teams/` race ๋ฅผ ํํผํ๋ค(Teams split-pane ๊ด์ฐฐ์ฑ๋ง ํฌ๊ธฐ).
|
|
361
|
-
2. ๋๊ธฐ โ ์ง๊ธ dispatch ๋ฅผ ๋ณด๋ฅํ๋ค. stage worktreeยทrun-context ๋ ๋ณด์กด๋๋ฏ๋ก,
|
|
362
|
-
์ ์ ์ค์ธ ๋ค๋ฅธ run ์ข
๋ฃ ํ ๊ฐ์ stage ๋ฅผ resume ์ผ๋ก ์ฌ๊ฐํ๋ฉด ๊ทธ๋๋ ์ ์ team
|
|
363
|
-
๊ฒฝ๋ก๋ค. resume ๋ช
๋ น(`okstra-inspect` history โ resume)์ ์ฌ์ฉ์์๊ฒ ์ถ๋ ฅํ๋ค.
|
|
364
|
-
3. ์ง์ ์
๋ ฅ.
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
> ์์น: conformance-waiver picker ์ค๋ช
([skills/okstra-run/SKILL.md](../../../skills/okstra-run/SKILL.md) ์ "Conformance waiver" ์น์
) ๋ฐ๋ก ๋ค์. ๊ฐ์ "์คํฌ์ด author ํ๋ picker" ๋ถ๋ฅ์ด๋ฏ๋ก ์ธ์ ๋ฐฐ์นํ๋ค.
|
|
368
|
-
|
|
369
|
-
- [ ] **Step 2: grep ๊ฒ์ฆ**
|
|
370
|
-
|
|
371
|
-
Run: `grep -n 'concurrent-run\|no-team background\|๋์-run' skills/okstra-run/SKILL.md`
|
|
372
|
-
Expected: ์ต์ 1์ค ๋งค์นญ.
|
|
373
|
-
|
|
374
|
-
- [ ] **Step 3: ์ปค๋ฐ**
|
|
375
|
-
|
|
376
|
-
```bash
|
|
377
|
-
git add skills/okstra-run/SKILL.md
|
|
378
|
-
git commit -m "feat(skills/okstra-run): ๋์-run ์ no-team/๋๊ธฐ 3-์ต์
picker ์ถ๊ฐ"
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
## Task 6: e2e ์๋๋ฆฌ์ค โ extras ์ ํ + no-team ๋ธ๋ก
|
|
384
|
-
|
|
385
|
-
**Files:**
|
|
386
|
-
- Create: `tests-e2e/scenario-<๋ค์๋ฒํธ>-concurrent-run-no-team.sh`
|
|
387
|
-
|
|
388
|
-
๊ธฐ์กด ์๋๋ฆฌ์ค ๋ฒํธ๋ฅผ ํ์ธํด ๋ค์ ๋ฒํธ๋ฅผ ์ด๋ค: `ls tests-e2e/ | grep -oE 'scenario-[0-9]+' | sort -u | tail -1`.
|
|
389
|
-
|
|
390
|
-
- [ ] **Step 1: ์๋๋ฆฌ์ค ์์ฑ** โ ๊ธฐ์กด ์๋๋ฆฌ์ค ๊ณจ๊ฒฉ(`mktemp -d` ๋ก `OKSTRA_HOME`, `trap` EXIT ์ ๋ฆฌ)์ ๋ฐ๋ฅธ๋ค. ํต์ฌ ๋จ๊ณ:
|
|
391
|
-
1. ์์ git repo + `.okstra/project.json` ์
์
, implementation plan(stage 4ยท6) ์ค๋น.
|
|
392
|
-
2. registry ์ stage 6 ์ active ๋ก reserve(๋ค๋ฅธ run ์ ์ ์๋ฎฌ๋ ์ด์
).
|
|
393
|
-
3. `prepare_task_bundle`(๋๋ `okstra.sh --task-type implementation --stage auto`)๋ก stage 4 run ์ prepare.
|
|
394
|
-
4. ๊ฒ์ฆ: ๋ ๋๋ launch ํ๋กฌํํธ์ `"Concurrent-run: no-team background"` ํฌํจ + `'TeamCreate(team_name:'` **๋ฏธํฌํจ**.
|
|
395
|
-
5. ๊ฒ์ฆ: prepare ์ `extras.concurrent_run.detected == true`, `active_stages == [6]`.
|
|
396
|
-
|
|
397
|
-
```bash
|
|
398
|
-
#!/usr/bin/env bash
|
|
399
|
-
set -euo pipefail
|
|
400
|
-
OKSTRA_HOME="$(mktemp -d)"; export OKSTRA_HOME
|
|
401
|
-
trap 'rm -rf "$OKSTRA_HOME"' EXIT
|
|
402
|
-
# ... repo/project/plan ์
์
(๊ธฐ์กด scenario-01 ํจํด ์ฐธ์กฐ) ...
|
|
403
|
-
# ... reg.reserve(stage_number=6) ...
|
|
404
|
-
# ... prepare ํธ์ถ ํ launch ํ๋กฌํํธ grep "Concurrent-run: no-team background" ...
|
|
405
|
-
echo "PASS: concurrent-run no-team scenario"
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
- [ ] **Step 2: ์คํ**
|
|
409
|
-
|
|
410
|
-
Run: `bash tests-e2e/scenario-<๋ฒํธ>-concurrent-run-no-team.sh`
|
|
411
|
-
Expected: `PASS: concurrent-run no-team scenario`
|
|
412
|
-
|
|
413
|
-
- [ ] **Step 3: ์ปค๋ฐ**
|
|
414
|
-
|
|
415
|
-
```bash
|
|
416
|
-
git add tests-e2e/scenario-<๋ฒํธ>-concurrent-run-no-team.sh
|
|
417
|
-
git commit -m "test(e2e): ๋์-run no-team background ์๋๋ฆฌ์ค ์ถ๊ฐ"
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
---
|
|
421
|
-
|
|
422
|
-
## Task 7: build + ์ ์ฒด ํ๊ท
|
|
423
|
-
|
|
424
|
-
**Files:**
|
|
425
|
-
- Modify: `runtime/**` (build output โ ์ง์ ํธ์ง ์๋, `npm run build` ์ฐ์ถ)
|
|
426
|
-
|
|
427
|
-
- [ ] **Step 1: build**
|
|
428
|
-
|
|
429
|
-
Run: `npm run build`
|
|
430
|
-
Expected: ์๋ฌ ์์ด `scripts/`ยท`prompts/`ยท`agents/`ยท`skills/` ๊ฐ `runtime/` ๋ก ๋๊ธฐํ.
|
|
431
|
-
|
|
432
|
-
- [ ] **Step 2: ์ ์ฒด ๋จ์ ํ
์คํธ**
|
|
433
|
-
|
|
434
|
-
Run: `python3 -m pytest tests/ -q`
|
|
435
|
-
Expected: ์ ๋ถ PASS (์ ๊ท ํฌํจ, ํ๊ท ์์).
|
|
436
|
-
|
|
437
|
-
- [ ] **Step 3: phase contract validator**
|
|
438
|
-
|
|
439
|
-
Run: `bash validators/validate-workflow.sh`
|
|
440
|
-
Expected: PASS.
|
|
441
|
-
|
|
442
|
-
- [ ] **Step 4: ์ปค๋ฐ**
|
|
443
|
-
|
|
444
|
-
```bash
|
|
445
|
-
git add runtime/
|
|
446
|
-
git commit -m "chore(build): ๋์-run team ๊ฐ๋ runtime ๋๊ธฐํ"
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
---
|
|
450
|
-
|
|
451
|
-
## Self-Review (์์ฑ์ ์ฒดํฌ ์๋ฃ)
|
|
452
|
-
|
|
453
|
-
- **Spec ์ปค๋ฒ๋ฆฌ์ง:** ยง4.1 ๊ฐ์งโTask 2, ยง4.2 no-team ๋ ๋โTask 1, ยง4.3 ๋ํํ pickerโTask 5, ยง4.4 ๋น๋ํํ ๊ธฐ๋ณธ๊ฐโTask 1+3(๋ ๋๊ฐ ์๋ no-team, ์ง์
์ ๋ถ๊ธฐ ์์), ยง4.5 ๋จ์ผ ์๋ ด์ โTask 3(`prepare_task_bundle` ํ ๊ณณ), ยง4.6 legal ์ฌ์ โTask 4, ยง7 ํ
์คํธโTask 1ยท2ยท6. ๋๋ฝ ์์.
|
|
454
|
-
- **๋น๋ํํ(ยง4.4)** ์ ๋ณ๋ ์ฝ๋๊ฐ ์๋๋ผ "picker ๋ฅผ ์ ๋์ฐ๋ฉด ๋ ๋๋ no-team bundle ๊ทธ๋๋ก ์งํ"์ผ๋ก ์๋ ์ถฉ์กฑ๋จ โ ์ถ๊ฐ Task ๋ถํ์.
|
|
455
|
-
- **ํ์
์ผ๊ด์ฑ:** `concurrent_stages` ๋ `list[int]`(Task 2) โ ctx ์์ csv `str`(Task 2 wire) โ render ๊ฐ `str` ์ผ๋ก ์ฝ์(Task 1) โ `extras.active_stages` ๋ `list[int]`(Task 3). ๊ฒฝ๊ณ๋ง๋ค ํ ๋ณํ ๋ช
์.
|
|
456
|
-
- **Placeholder:** ์์(์๋๋ฆฌ์ค ๋ฒํธ๋ง ์คํ ์ ํ์ โ Task 6 Step 0 ์ ์กฐํ ๋ช
๋ น ์ ๊ณต).
|