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,358 +0,0 @@
|
|
|
1
|
-
# Claude Code / Codex lead adapter split design
|
|
2
|
-
|
|
3
|
-
- 날짜: 2026-06-12
|
|
4
|
-
- 상태: 설계 초안
|
|
5
|
-
- 대상: okstra runtime, installed skills, lead orchestration contract
|
|
6
|
-
|
|
7
|
-
## 1. 배경
|
|
8
|
-
|
|
9
|
-
okstra 의 core runtime 은 이미 비교적 플랫폼 중립적이다.
|
|
10
|
-
`prepare_task_bundle()` 이 task bundle, manifests, prompts, worktree,
|
|
11
|
-
validators 를 생성하고, Node CLI 는 이 Python core 를 호출한다.
|
|
12
|
-
|
|
13
|
-
문제는 lead 실행 계층이 Claude Code 전용 계약을 강하게 전제한다는 점이다.
|
|
14
|
-
|
|
15
|
-
- skills 는 `~/.claude/skills/` 에 설치된다.
|
|
16
|
-
- worker agents 는 `~/.claude/agents/` 에 설치된다.
|
|
17
|
-
- in-session run 은 `AskUserQuestion` 과 Claude Code slash skill 흐름을 전제한다.
|
|
18
|
-
- team execution 은 `TeamCreate` / `Agent(...)` / `team_name` 을 전제한다.
|
|
19
|
-
- resume, token usage, team reconcile 은 Claude session jsonl 과
|
|
20
|
-
`~/.claude/projects`, `~/.claude/teams` 를 읽는다.
|
|
21
|
-
|
|
22
|
-
따라서 Codex 에서 같은 저장소를 사용하려면 프로젝트를 통째로 둘로 복사하는 대신
|
|
23
|
-
**lead adapter** 를 나눠야 한다.
|
|
24
|
-
|
|
25
|
-
## 2. 결정
|
|
26
|
-
|
|
27
|
-
okstra 는 하나의 공통 core 와 두 lead adapter 로 분리한다.
|
|
28
|
-
|
|
29
|
-
```text
|
|
30
|
-
okstra core
|
|
31
|
-
- prepare_task_bundle
|
|
32
|
-
- task/run manifests
|
|
33
|
-
- worktree registry
|
|
34
|
-
- final-report schema/render/validators
|
|
35
|
-
- wizard state machine
|
|
36
|
-
- worker result / convergence schemas
|
|
37
|
-
|
|
38
|
-
lead adapters
|
|
39
|
-
- claude-code adapter
|
|
40
|
-
- codex adapter
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Claude Code adapter 는 현재 동작을 유지한다. Codex adapter 는 Claude Teams 를
|
|
44
|
-
흉내내지 않고 Codex 가 제공하는 방식으로 같은 artifact contract 를 채운다.
|
|
45
|
-
|
|
46
|
-
## 3. 비목표
|
|
47
|
-
|
|
48
|
-
- `prepare_task_bundle()` 를 Claude/Codex 별로 복제하지 않는다.
|
|
49
|
-
- phase profile, schema, validator 를 provider 별로 fork 하지 않는다.
|
|
50
|
-
- Codex adapter 가 Claude Code 의 `TeamCreate` 나 `Agent(...)` 를 동일하게
|
|
51
|
-
재현한다고 주장하지 않는다.
|
|
52
|
-
- 기존 Claude Code slash skill UX 를 깨지 않는다.
|
|
53
|
-
|
|
54
|
-
## 4. Adapter 경계
|
|
55
|
-
|
|
56
|
-
### 4.1 공통 core 로 남길 것
|
|
57
|
-
|
|
58
|
-
| 영역 | 이유 |
|
|
59
|
-
|---|---|
|
|
60
|
-
| `scripts/okstra_ctl/run.py::prepare_task_bundle` | task identity 와 artifact layout 의 single authority |
|
|
61
|
-
| `scripts/okstra_ctl/worktree*.py` | provider 와 무관한 격리/동시성 계약 |
|
|
62
|
-
| `scripts/okstra_ctl/workers.py` | phase profile 이 허용하는 logical roster 검증 |
|
|
63
|
-
| `scripts/okstra_ctl/render*.py` | manifests, prompts, final report rendering |
|
|
64
|
-
| `schemas/`, `validators/`, `templates/` | output contract 의 SSOT |
|
|
65
|
-
| `prompts/profiles/*.md` | lifecycle phase 규칙의 SSOT |
|
|
66
|
-
|
|
67
|
-
### 4.2 Claude Code adapter 로 남길 것
|
|
68
|
-
|
|
69
|
-
| 영역 | 현재 결합 |
|
|
70
|
-
|---|---|
|
|
71
|
-
| installed skills | `~/.claude/skills/okstra-*` |
|
|
72
|
-
| installed agents | `~/.claude/agents/*-worker.md` |
|
|
73
|
-
| interactive UI | `AskUserQuestion` |
|
|
74
|
-
| worker dispatch | `TeamCreate`, `Agent(...)`, `team_name` |
|
|
75
|
-
| resume | `claude --resume <session-id>` |
|
|
76
|
-
| session accounting | Claude session jsonl, `~/.claude/projects` |
|
|
77
|
-
| team cleanup | `~/.claude/teams`, `TeamDelete` |
|
|
78
|
-
|
|
79
|
-
### 4.3 Codex adapter 로 새로 둘 것
|
|
80
|
-
|
|
81
|
-
Codex adapter 는 다음을 담당한다.
|
|
82
|
-
|
|
83
|
-
| 책임 | Codex 방식 |
|
|
84
|
-
|---|---|
|
|
85
|
-
| input collection | CLI wizard JSON 을 Codex 대화/질문으로 relay |
|
|
86
|
-
| task bundle prepare | 기존 `okstra render-bundle` / `prepare_task_bundle()` 호출 |
|
|
87
|
-
| lead progress logging | `PROGRESS:` line 을 assistant text + run artifact 에 기록 |
|
|
88
|
-
| worker fan-out | Codex sub-agent tool, or CLI wrapper process, or sequential fallback |
|
|
89
|
-
| worker result persistence | 기존 `worker-results/*.md` contract 에 맞춰 파일 작성 |
|
|
90
|
-
| convergence | 기존 `okstra-convergence` 알고리즘을 lead-local 로 실행 |
|
|
91
|
-
| report writing | report-writer worker 가 없으면 explicit fallback status 를 기록한 뒤 lead-authored path 사용, 또는 Codex 전용 report-writer role 을 정의 |
|
|
92
|
-
| resume | Codex session resume 가 아니라 run artifact checkpoint 기준 재진입 |
|
|
93
|
-
|
|
94
|
-
## 5. Execution modes
|
|
95
|
-
|
|
96
|
-
### 5.1 `leadRuntime=claude-code`
|
|
97
|
-
|
|
98
|
-
현재 기본값이다.
|
|
99
|
-
|
|
100
|
-
- 설치: `okstra install` 이 `~/.claude/skills` 와 `~/.claude/agents` 를 채운다.
|
|
101
|
-
- 실행: slash skill 또는 `okstra.sh` 가 Claude lead 를 시작한다.
|
|
102
|
-
- worker dispatch: `TeamCreate` / `Agent(...)`.
|
|
103
|
-
- validator: 기존 session conformance 를 그대로 적용한다.
|
|
104
|
-
|
|
105
|
-
### 5.2 `leadRuntime=codex`
|
|
106
|
-
|
|
107
|
-
신규 모드다.
|
|
108
|
-
|
|
109
|
-
- 설치: Claude assets 는 선택 설치로 바꾸고, Codex adapter assets 를 별도 설치한다.
|
|
110
|
-
- 실행: `okstra codex-run` 또는 `okstra run --lead-runtime codex`.
|
|
111
|
-
- worker dispatch:
|
|
112
|
-
- 가능한 경우 Codex sub-agent fan-out 사용.
|
|
113
|
-
- 불가능하면 CLI wrapper 또는 sequential local analysis 로 degrade.
|
|
114
|
-
- team-state 는 Claude team fields 대신 `leadRuntime: "codex"` 와
|
|
115
|
-
`dispatchMode` 를 명시한다.
|
|
116
|
-
- validator 는 `leadRuntime` 별 conformance rule 을 고른다.
|
|
117
|
-
|
|
118
|
-
## 6. Contract changes
|
|
119
|
-
|
|
120
|
-
### 6.1 manifest
|
|
121
|
-
|
|
122
|
-
`task-manifest.json` 또는 run manifest 에 다음 필드를 추가한다.
|
|
123
|
-
|
|
124
|
-
```json
|
|
125
|
-
{
|
|
126
|
-
"leadRuntime": "claude-code",
|
|
127
|
-
"leadAdapter": {
|
|
128
|
-
"name": "claude-code",
|
|
129
|
-
"dispatchMode": "team",
|
|
130
|
-
"sessionAccounting": "claude-jsonl"
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
Codex run 예:
|
|
136
|
-
|
|
137
|
-
```json
|
|
138
|
-
{
|
|
139
|
-
"leadRuntime": "codex",
|
|
140
|
-
"leadAdapter": {
|
|
141
|
-
"name": "codex",
|
|
142
|
-
"dispatchMode": "codex-subagents",
|
|
143
|
-
"sessionAccounting": "artifact-only"
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### 6.2 validator
|
|
149
|
-
|
|
150
|
-
`validate_session_conformance.py` 는 현재 Claude session jsonl 을 검사한다.
|
|
151
|
-
이를 다음처럼 분기한다.
|
|
152
|
-
|
|
153
|
-
| runtime | conformance source |
|
|
154
|
-
|---|---|
|
|
155
|
-
| `claude-code` | existing Claude session jsonl scan |
|
|
156
|
-
| `codex` | run artifact event log scan |
|
|
157
|
-
|
|
158
|
-
Codex adapter 는 `runs/<task-type>/state/lead-events-<task-type>-<seq>.jsonl`
|
|
159
|
-
에 진행 이벤트를 기록한다.
|
|
160
|
-
|
|
161
|
-
Token/cost validation is runtime-aware. `claude-code` keeps the existing
|
|
162
|
-
fail-close `okstra token-usage --substitute-data` requirement. `codex` does
|
|
163
|
-
not run the Claude session-jsonl auto-recovery path. Codex runtime worker
|
|
164
|
-
usage is collected from `lead-events-*.jsonl` dispatch windows matched against
|
|
165
|
-
Codex rollout / Gemini session logs, so CLI-backed worker and report-writer
|
|
166
|
-
cost can be summarized without Claude wrapper jsonls. Codex lead token
|
|
167
|
-
accounting is still unavailable, and validator does not yet force
|
|
168
|
-
final-report token substitution for Codex runs.
|
|
169
|
-
|
|
170
|
-
### 6.3 report author
|
|
171
|
-
|
|
172
|
-
기존 규칙은 "report-writer worker 가 roster 에 있으면 lead 가 직접 쓰지 않는다"이다.
|
|
173
|
-
Codex adapter 에서도 이 원칙은 유지하되, report-writer role 의 구현을 runtime 별로 둔다.
|
|
174
|
-
|
|
175
|
-
```text
|
|
176
|
-
logical role: report-writer
|
|
177
|
-
claude-code implementation: Agent(subagent_type=report-writer-worker)
|
|
178
|
-
codex implementation: Codex report-writer subagent or explicit recorded fallback
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## 7. Install layout
|
|
182
|
-
|
|
183
|
-
현재 설치는 Claude Code 를 전제로 한다. 설치 command 를 runtime-aware 로 분리한다.
|
|
184
|
-
|
|
185
|
-
```bash
|
|
186
|
-
okstra install --runtime claude-code # default, current behavior
|
|
187
|
-
okstra install --runtime codex # codex adapter assets only
|
|
188
|
-
okstra install --runtime all # both adapters
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
권장 내부 구조:
|
|
192
|
-
|
|
193
|
-
```text
|
|
194
|
-
adapters/
|
|
195
|
-
claude-code/
|
|
196
|
-
skills/
|
|
197
|
-
agents/
|
|
198
|
-
settings/
|
|
199
|
-
codex/
|
|
200
|
-
skills/
|
|
201
|
-
prompts/
|
|
202
|
-
adapter.md
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
단, 첫 구현에서는 물리 디렉터리 이동 없이 installer option 과 manifest field 만
|
|
206
|
-
도입해도 된다. 대규모 파일 이동은 후속 cleanup 으로 둔다.
|
|
207
|
-
|
|
208
|
-
## 8. 단계별 구현 계획
|
|
209
|
-
|
|
210
|
-
### Stage 1 — runtime marker only
|
|
211
|
-
|
|
212
|
-
- `--lead-runtime <claude-code|codex>` flag 를 `render-bundle` / `okstra.sh` /
|
|
213
|
-
`prepare_task_bundle()` 에 추가한다.
|
|
214
|
-
- 기본값은 `claude-code`.
|
|
215
|
-
- manifests 와 team-state 에 `leadRuntime` / `leadAdapter` 를 기록한다.
|
|
216
|
-
- `codex` 는 dispatch adapter 가 생기기 전까지 `--render-only` 에서만 허용하고,
|
|
217
|
-
non-render prepare 는 명확히 fail 한다.
|
|
218
|
-
|
|
219
|
-
### Stage 2 — Codex dry-run adapter
|
|
220
|
-
|
|
221
|
-
- `okstra codex-run` 를 추가한다.
|
|
222
|
-
- wrapper 가 `--render-only --lead-runtime codex` 를 소유하고, 사용자가 직접
|
|
223
|
-
중복 전달하면 거부한다.
|
|
224
|
-
- wizard/render-bundle 로 task bundle 을 만들고, Codex lead prompt 를 출력한다.
|
|
225
|
-
- worker dispatch 는 하지 않는다.
|
|
226
|
-
- 목적: Codex 에서 task bundle intake, profile reading, phase boundary 를 안정화.
|
|
227
|
-
|
|
228
|
-
### Stage 3 — Codex artifact event log
|
|
229
|
-
|
|
230
|
-
- `lead-events-*.jsonl` writer/reader 를 추가한다.
|
|
231
|
-
- `runs/<task-type>/state/lead-events-<task-type>-<seq>.jsonl` 를
|
|
232
|
-
team-state / run-manifest / task-manifest artifacts 에 노출한다.
|
|
233
|
-
- Codex render-only adapter 는 우선 `bundle-prepared` event 를 기록한다.
|
|
234
|
-
- validator 는 `leadRuntime=codex` 일 때 Claude session jsonl 대신 event log 를
|
|
235
|
-
읽고 `progress` / `artifact-read` 이벤트를 checkpoint / implementation
|
|
236
|
-
sidecar-read 증거로 사용한다.
|
|
237
|
-
- 후속 dispatch 단계에서 `worker-dispatched`, `worker-result-collected` event 를
|
|
238
|
-
기록한다.
|
|
239
|
-
|
|
240
|
-
### Stage 4 — Codex worker dispatch
|
|
241
|
-
|
|
242
|
-
- logical worker role 을 유지하면서 Codex adapter 의 dispatch backend 를 붙인다.
|
|
243
|
-
- backend 우선순위:
|
|
244
|
-
1. Codex sub-agent dispatch
|
|
245
|
-
2. CLI wrapper dispatch
|
|
246
|
-
3. sequential fallback with terminal status markers
|
|
247
|
-
- 모든 backend 는 기존 `worker-results/*.md`, prompt history, errors sidecar 를
|
|
248
|
-
같은 path 에 써야 한다.
|
|
249
|
-
- 첫 구현 범위(2026-06-12): `okstra codex-run` 으로 준비된 run manifest 를
|
|
250
|
-
입력으로 받는 `okstra codex-dispatch` 보조 명령을 추가한다.
|
|
251
|
-
- 지원 worker: 기존 CLI wrapper 계약이 있는 `codex`, `gemini`.
|
|
252
|
-
- `report-writer` 는 Stage 5 의 명시 opt-in 경로에서 지원한다.
|
|
253
|
-
- 미지원 worker: `--workers` 를 생략한 기본 dispatch 에서는 `claude` 같은
|
|
254
|
-
Codex-side 미지원 roster 항목을 건너뛴다. 사용자가 `--workers claude` 처럼
|
|
255
|
-
명시 요청하면 Codex-native 구현 전까지 즉시 unsupported 로 실패한다.
|
|
256
|
-
- 실행 방식: shell 없이 wrapper 를 `subprocess.run([...])` 으로 호출하고,
|
|
257
|
-
team-state worker status 와 `lead-events-*.jsonl` 의
|
|
258
|
-
`worker-dispatched` / `worker-result-collected` / `worker-failed` 이벤트를
|
|
259
|
-
갱신한다.
|
|
260
|
-
- prompt history 파일이 아직 없으면 run manifest / active-run-context 에서
|
|
261
|
-
자동 생성한다. 기존 prompt 파일은 덮어쓰지 않는다.
|
|
262
|
-
- dispatch plan 과 lead-events 는 worker 별 `backend` / `dispatchMode` 를
|
|
263
|
-
기록한다. 현재 값은 모두 `cli-wrapper` 이며, `_run_worker()` 는 backend router
|
|
264
|
-
로 분리되어 미지원 backend 를 wrapper 실행 전에 거부한다.
|
|
265
|
-
- 비범위: Claude TeamCreate 대체, final-report Phase 7 token substitution,
|
|
266
|
-
report-writer 후처리, token/session accounting. 이후 Stage 5 에서
|
|
267
|
-
report-writer 후처리가 추가됐고, Stage 5.5 에서 worker CLI token accounting
|
|
268
|
-
이 추가됐다.
|
|
269
|
-
|
|
270
|
-
### Stage 5 — Codex report-writer
|
|
271
|
-
|
|
272
|
-
- report-writer logical role 을 Codex sub-agent 로 구현한다.
|
|
273
|
-
- 실패 시 기존 fallback 규칙처럼 dispatch attempt 와 terminal status 를 기록한다.
|
|
274
|
-
- final-report data.json -> renderer -> views -> token/cost placeholder 처리 순서는
|
|
275
|
-
Claude adapter 와 동일하게 유지한다.
|
|
276
|
-
- 첫 구현 범위(2026-06-12): `okstra codex-dispatch` 에 준비된
|
|
277
|
-
report-writer prompt 를 Codex wrapper 로 실행하는 opt-in 경로를 추가한다.
|
|
278
|
-
- 사용자는 `--workers report-writer --enable-codex-report-writer
|
|
279
|
-
--report-writer-codex-model <model>` 을 명시해야 한다.
|
|
280
|
-
- 이유: run manifest 의 report-writer model assignment 는 아직 Claude provider
|
|
281
|
-
기준(`REPORT_WRITER_MODEL_EXECUTION_VALUE`)으로 렌더되므로, Codex CLI 에
|
|
282
|
-
넘길 모델은 dispatch 단계에서 명시 override 해야 한다.
|
|
283
|
-
- dispatcher 는 prompt 의 `**Model:** Report writer worker, ...` header 를
|
|
284
|
-
override 값으로 갱신하고, wrapper 실행 성공 후 세 artifact 를 모두 확인한다:
|
|
285
|
-
`reports/final-report-*.data.json`, 렌더된 `reports/final-report-*.md`,
|
|
286
|
-
`worker-results/report-writer-worker-*.md` audit sidecar.
|
|
287
|
-
- artifact 확인 후 idempotent 한 후처리 네 개를 실행한다:
|
|
288
|
-
`okstra-token-usage.py --write --substitute-data` 로 token/cost 값을
|
|
289
|
-
data.json 과 markdown 에 치환하고,
|
|
290
|
-
`okstra-render-report-views.py` 로 HTML view 를 렌더하고,
|
|
291
|
-
`okstra-spawn-followups.py` 로 `followUpTasks[]` 의 auto-spawn 항목을
|
|
292
|
-
task stub 으로 만들고,
|
|
293
|
-
`validators/validate-run.py` 로 final-report schema / markdown contract /
|
|
294
|
-
report-view contract 를 검증한다. HTML view 가 치환 후 markdown 을 읽도록
|
|
295
|
-
token substitution 이 항상 render-views 보다 먼저 실행되며, validation 은
|
|
296
|
-
더 이상 실패할 후처리 단계가 없는 마지막 gate 로 실행된다. 후처리가 실패하면
|
|
297
|
-
report-writer 는 failed 로 기록한다.
|
|
298
|
-
- report-writer prompt history 파일이 아직 없으면 dispatcher 가 자동 생성한다.
|
|
299
|
-
이때 `Result Path` 는 `.data.json`, `Worker Result Path` 는 audit sidecar,
|
|
300
|
-
`Report Language` 는 project/global config 또는 task brief 추론값으로 채운다.
|
|
301
|
-
- 비범위: Codex lead 자체 token/cost accounting.
|
|
302
|
-
|
|
303
|
-
### Stage 5.5 — Codex worker CLI token accounting
|
|
304
|
-
|
|
305
|
-
- Codex runtime 은 Claude Agent wrapper session 을 생성하지 않으므로,
|
|
306
|
-
`okstra token-usage` 가 `lead-events-*.jsonl` 의 worker dispatch window 를
|
|
307
|
-
session source 로 사용한다.
|
|
308
|
-
- `codex` worker 와 Codex opt-in `report-writer` 는 Codex rollout JSONL 을,
|
|
309
|
-
`gemini` worker 는 Gemini chat session JSON 을 window 안에서 매칭한다.
|
|
310
|
-
- `usageSummary.workerTotalTokens` 와 `estimatedCostUsd.cliWorkers` 는 CLI worker
|
|
311
|
-
totals 를 반영한다.
|
|
312
|
-
- report-writer 후처리 중에는 `worker-result-collected` 이벤트가 아직 append
|
|
313
|
-
되기 전이므로, collector 는 `status=running` worker 의 active dispatch 를
|
|
314
|
-
수집 시각까지의 open window 로 사용할 수 있다.
|
|
315
|
-
- Codex lead 자체 token/cost 는 아직 공식 수집원이 없어 `leadUsage.source =
|
|
316
|
-
"unavailable"` 로 남긴다.
|
|
317
|
-
- validator 는 Codex run 에 대해 token substitution auto-recovery 를 강제하지
|
|
318
|
-
않는다. 이 단계의 목적은 collector data 를 먼저 정확히 채우는 것이다.
|
|
319
|
-
|
|
320
|
-
### Stage 6 — install packaging cleanup
|
|
321
|
-
|
|
322
|
-
- `okstra install --runtime <claude-code|codex|all>` 을 추가한다.
|
|
323
|
-
- `claude-code` 기본값은 기존 동작 그대로 공유 runtime + Claude skills/agents 를
|
|
324
|
-
설치한다.
|
|
325
|
-
- `codex` 는 공유 runtime/bin/templates/schema/validators/settings 만 설치하고
|
|
326
|
-
`~/.claude/skills` / `~/.claude/agents` 를 건드리지 않는다.
|
|
327
|
-
- `all` 은 Claude assets 포함 설치와 동일하다. 별도 Codex-only asset tree 가
|
|
328
|
-
생기면 여기서 함께 설치한다.
|
|
329
|
-
- `okstra ensure-installed --runtime <...>` 는 같은 runtime 으로 재설치하며,
|
|
330
|
-
`codex` 는 Claude skill/agent drift 검사를 건너뛴다.
|
|
331
|
-
- `okstra doctor --runtime <...>` 는 `codex` 에서 Claude skill checks 를 제외하고
|
|
332
|
-
JSON 출력에 선택 runtime 을 포함한다.
|
|
333
|
-
- `~/.okstra/installed-runtimes.json` 을 추가해 선택 runtime 과 asset 범위를
|
|
334
|
-
`installed-skills.json` / `installed-agents.json` 과 분리해 기록한다.
|
|
335
|
-
codex-only manifest 는 uninstall 이 레거시 fallback 으로 `~/.claude` 자산을
|
|
336
|
-
제거하지 않도록 막는다.
|
|
337
|
-
- README / docs 는 Codex-only install + doctor 경로를 노출한다.
|
|
338
|
-
- 남은 cleanup: Codex 전용 skill/adapter asset 이 생기면
|
|
339
|
-
`installed-runtimes.json` 의 Codex asset 범위를 실제 파일 manifest 로 확장한다.
|
|
340
|
-
|
|
341
|
-
## 9. 위험과 대응
|
|
342
|
-
|
|
343
|
-
| 위험 | 대응 |
|
|
344
|
-
|---|---|
|
|
345
|
-
| validator 가 Claude session jsonl 만 신뢰 | `leadRuntime` 별 conformance source 분기 |
|
|
346
|
-
| worker output contract drift | logical worker role/schema 는 공유하고 dispatch backend 만 교체 |
|
|
347
|
-
| report-writer authorship 규칙 훼손 | runtime 별 report-writer implementation 을 두고 fallback 은 명시 기록 |
|
|
348
|
-
| 설치 경로 혼란 | `okstra doctor --runtime <name>` 로 runtime 별 진단 |
|
|
349
|
-
| 두 버전 문서 drift | phase profile/schema/validator 는 fork 금지, adapter docs 만 분리 |
|
|
350
|
-
|
|
351
|
-
## 10. 결론
|
|
352
|
-
|
|
353
|
-
가능하다. 단, "Claude Code 버전"과 "Codex 버전"을 제품 복사본으로 나누는 것이
|
|
354
|
-
아니라, **lead runtime adapter 를 나누는 방식**이어야 한다.
|
|
355
|
-
|
|
356
|
-
가장 작고 안전한 첫 PR 은 `leadRuntime` marker 와 Codex dry-run adapter 이다.
|
|
357
|
-
이 PR 은 기존 Claude Code 사용자를 깨지 않으면서 Codex 실행 경로를 공식적으로
|
|
358
|
-
받아들일 수 있는 구조를 만든다.
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
# final-report HTML 승인·옵션 선택 설계
|
|
2
|
-
|
|
3
|
-
- 날짜: 2026-06-12
|
|
4
|
-
- 상태: 설계 승인됨 (구현 전)
|
|
5
|
-
- 대상: implementation-planning final-report 의 HTML 뷰 + implementation 시작 마법사
|
|
6
|
-
|
|
7
|
-
## 1. 배경과 목표
|
|
8
|
-
|
|
9
|
-
implementation-planning 보고서의 승인은 현재 (a) frontmatter `approved:` 수동 편집 또는 (b) CLI `--approve` 플래그로만 가능하고, 구현 옵션 선택은 `--implementation-option <name>` CLI 플래그뿐이다 (`scripts/okstra_ctl/run.py:305`, `scripts/okstra_ctl/run.py:744`). 사용자가 보고서를 검토하는 화면은 HTML 뷰인데, 그 화면에는 §1 clarification 폼만 있고 승인·옵션 선택 수단이 없다.
|
|
10
|
-
|
|
11
|
-
목표: 사용자가 보고서 HTML 안에서 승인 의사와 구현 옵션을 기록하고, implementation 시작 시 그 기록이 확인 절차를 거쳐 기존 승인 경로로 적용되게 한다.
|
|
12
|
-
|
|
13
|
-
설계 원칙 (기존 계약 유지):
|
|
14
|
-
|
|
15
|
-
- HTML 은 원본 md / data.json 을 **절대 직접 수정하지 않는다** — 기록은 user-response sidecar 로만 나간다 (`templates/reports/user-response.template.md:6`).
|
|
16
|
-
- data.json 이 SSOT — 적용은 data.json 플립 + md 재렌더 경로만 사용한다 (`scripts/okstra_ctl/run.py:222`).
|
|
17
|
-
- 승인 게이트 검증(`_validate_approved_plan`, `scripts/okstra_ctl/run.py:331`)은 무변경 — sidecar 는 검증을 우회하지 않는다.
|
|
18
|
-
|
|
19
|
-
## 2. 기각한 대안
|
|
20
|
-
|
|
21
|
-
**§1 C-행 재사용안**: report-writer 가 승인/옵션을 §1 decision 행으로 발행해 기존 폼을 재사용하는 방법. §1 응답의 소비자는 resume-clarification(= planning 재실행)이라 적용 경로가 어긋나고, "§1 미해소 행 = 승인 차단" 게이트 규칙(`scripts/okstra_ctl/run.py:360`)과 자기모순이 생기므로 기각.
|
|
22
|
-
|
|
23
|
-
**run-prep 무확인 자동 적용안**: HTML 버튼 클릭이 사실상 승인 행위가 되어 명시적 승인 원칙에 어긋나므로 기각. 마법사 확인 단계를 거친다.
|
|
24
|
-
|
|
25
|
-
## 3. 설계
|
|
26
|
-
|
|
27
|
-
### 3.1 HTML 위젯 — "Plan Approval" 섹션
|
|
28
|
-
|
|
29
|
-
- 렌더 조건: `task-type == implementation-planning` **이고** sibling `.data.json` 이 존재할 때만. 둘 중 하나라도 아니면 섹션 자체를 생략한다.
|
|
30
|
-
- 데이터 소스: md 파싱이 아니라 sibling data.json 의 `implementationPlanning.optionCandidates[].name` 과 `recommendedOption.name` (`schemas/final-report-v1.0.schema.json:1062`, `schemas/final-report-v1.0.schema.json:1102`). 렌더 시점(`render_html_view`)에 Python 이 읽어 HTML 에 정적으로 박는다.
|
|
31
|
-
- 구성: 보고서 끝(footer 위)에
|
|
32
|
-
- 옵션 `<select>` — 후보 = optionCandidates 이름 목록, 기본 선택 = recommendedOption 이름에 "(권장)" 라벨.
|
|
33
|
-
- 승인 체크박스 — "이 plan 을 승인합니다".
|
|
34
|
-
- 활성 조건 (fail-closed, run-prep 게이트와 동일 기준): §1 의 `Blocks: approval` 행이 전부 `resolved`/`obsolete` 일 때만 활성. 미해소(open/answered) 행이 있으면 disabled + "§1 승인 차단 항목 N건 미해소 — 답변 후 resume-clarification 으로 다음 보고서에서 승인" 사유를 표시한다. 판정은 렌더 시 Python 이 §1 을 스캔(`scan_approval_gate` 재사용)해 박는다.
|
|
35
|
-
- Export: 기존 "Export user response" 버튼 하나에 합류 — 별도 버튼을 만들지 않는다.
|
|
36
|
-
|
|
37
|
-
### 3.2 sidecar 스키마 확장
|
|
38
|
-
|
|
39
|
-
`user-response-<task-type>-<seq>.md` 본문 끝에 APPROVAL 블록 1개를 허용한다:
|
|
40
|
-
|
|
41
|
-
```markdown
|
|
42
|
-
## APPROVAL
|
|
43
|
-
- Approved: true
|
|
44
|
-
- Implementation-Option: <optionCandidates[].name 그대로>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
- 승인 체크 없이 Export 하면 블록 자체를 생략한다 (기존 출력과 동일).
|
|
48
|
-
- 옵션을 추천 그대로 두면 `Implementation-Option:` 라인을 생략한다 → 기존 Recommended 폴백 의미 유지 (`scripts/okstra_ctl/run.py:308`).
|
|
49
|
-
- Python `serialize_user_response` 와 JS `buildUserResponseMarkdown` 의 byte-identical 계약은 유지하고, 동일성 테스트를 APPROVAL 케이스로 확장한다 (`templates/reports/user-response.template.md:69`).
|
|
50
|
-
|
|
51
|
-
### 3.2.1 user-responses/ 디렉토리 선생성
|
|
52
|
-
|
|
53
|
-
사용자 확인(폼 입력 또는 승인)이 필요한 HTML 을 렌더하는 시점에 `render_html_view` 가 저장 대상 디렉토리 `runs/<task-type>/.../user-responses/` (reports/ 의 sibling) 를 함께 생성한다. 사용자가 Export 파일을 저장할 위치를 직접 만들 필요가 없어야 한다. HTML 을 생성하지 않는 보고서(인터랙티브 요소 없음)에는 만들지 않는다.
|
|
54
|
-
|
|
55
|
-
### 3.3 소비 — implementation 마법사
|
|
56
|
-
|
|
57
|
-
`approved_plan` 단계(`skills/okstra-run/SKILL.md:126`)에서:
|
|
58
|
-
|
|
59
|
-
1. 지정된 plan 이 `approved: false` 이고, 같은 run 의 `user-responses/` 에 source-report 와 seq 가 일치하며 APPROVAL 블록을 가진 sidecar 가 있으면, pick 단계를 노출한다:
|
|
60
|
-
- "HTML 승인 기록 발견(옵션: X) — 적용 (추천)" / "무시하고 진행" / "중단".
|
|
61
|
-
2. "적용" 선택 시 기존 함수만 호출한다:
|
|
62
|
-
- `_set_data_json_approved_true_if_present` (`scripts/okstra_ctl/run.py:222`) — data.json 플립 + md 재렌더.
|
|
63
|
-
- sidecar 에 `Implementation-Option:` 이 있으면 `_apply_cli_implementation_option` (`scripts/okstra_ctl/run.py:744`).
|
|
64
|
-
- audit 라인에 HTML user-response 경유임을 명시 (기존 `--approve` audit 라인 형식 확장).
|
|
65
|
-
3. 적용 후 게이트 검증(`_validate_approved_plan`)은 기존 그대로 수행된다.
|
|
66
|
-
|
|
67
|
-
### 3.4 엣지 케이스
|
|
68
|
-
|
|
69
|
-
| 상황 | 처리 |
|
|
70
|
-
|---|---|
|
|
71
|
-
| sidecar 의 옵션 이름이 현 data.json optionCandidates 에 없음 | 적용 거부 + 에러 메시지에 유효 후보 나열 |
|
|
72
|
-
| sidecar seq ≠ 보고서 seq | 해당 sidecar 무시 (소스 보고서 기준) |
|
|
73
|
-
| APPROVAL 블록이 있는데 §1 차단 행 미해소 (조작/구버전 HTML) | 적용 시도해도 기존 게이트가 거부 — 추가 방어 불요 |
|
|
74
|
-
| plan 이 이미 `approved: true` | pick 단계 생략, 기존 흐름 그대로 |
|
|
75
|
-
|
|
76
|
-
### 3.5 테스트
|
|
77
|
-
|
|
78
|
-
- `tests/test_report_views.py`: 위젯 렌더 조건 3종 — (a) planning + data.json + 차단 없음 → 활성 렌더, (b) 차단 행 존재 → disabled + 사유, (c) 타 task-type 또는 data.json 부재 → 섹션 생략.
|
|
79
|
-
- 직렬화 동일성: APPROVAL 블록 포함/생략 케이스에서 Python ↔ JS byte-identical.
|
|
80
|
-
- 마법사: sidecar 감지 → pick 노출, "적용" 경로가 data.json 플립 + 옵션 치환을 수행하는 단위 테스트.
|
|
81
|
-
|
|
82
|
-
## 4. 범위 제외 (후속 과제)
|
|
83
|
-
|
|
84
|
-
- sidecar 없이 마법사 단독으로 옵션을 고르는 standalone pick 단계 — 이번 범위 아님 (현행 CLI 플래그 유지).
|
|
85
|
-
- implementation-planning 외 task-type 의 승인 위젯 — frontmatter `approved:` 를 소비하는 진입점이 implementation 뿐이므로 대상 없음.
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
# Stage discipline 규칙 — 선행 stage 동작 동결 설계
|
|
2
|
-
|
|
3
|
-
- 날짜: 2026-06-12
|
|
4
|
-
- 상태: 설계 승인됨 (구현 전)
|
|
5
|
-
- 대상: `implementation` · `implementation-planning` 프로파일
|
|
6
|
-
|
|
7
|
-
## 1. 배경과 목표
|
|
8
|
-
|
|
9
|
-
implementation 은 stage-isolated 다 — 한 run = 한 stage 이고, dependent stage 는 선행(`depends-on`) stage 의 done commit 을 base 로 시작한다(`prompts/profiles/implementation.md:27`). 선행 stage 는 이미 conformance 를 통과해 `done` 으로 닫힌 상태인데, 이후 stage 가 그 코드의 **동작을 바꾸면** "verified-stays-verified" 불변식이 깨진다 — 닫힌 stage 가 조용히 회귀한다.
|
|
10
|
-
|
|
11
|
-
목표: "선행 stage 가 추가·수정한 코드의 기능(동작)은 이후 stage 에서 변경하지 않는다" 라는 규율을 `implementation` 과 `implementation-planning` 양쪽에 도입하고, 이런 stage 규율을 **별도 단일 파일**로 관리한다.
|
|
12
|
-
|
|
13
|
-
## 2. 결정 사항 (brainstorming 합의)
|
|
14
|
-
|
|
15
|
-
| 항목 | 결정 |
|
|
16
|
-
|---|---|
|
|
17
|
-
| 규칙 파일 소유권 | okstra 내장 공유 파일 (모든 프로젝트 적용, okstra 레포에서 편집·전파) |
|
|
18
|
-
| 강제 수준 | 선언 + 보고서 증거 (validator/wrapper sentinel 없음) |
|
|
19
|
-
| 규칙 언어 | English (기존 Forbidden actions·stage-scope 규칙과 일관) |
|
|
20
|
-
| executor 전사 포인터 | 둔다 (CLI executor 가 규칙을 받도록) |
|
|
21
|
-
|
|
22
|
-
YAGNI 로 제외: validator/wrapper 강제, data.json 스키마 필드, 프로젝트별 override.
|
|
23
|
-
|
|
24
|
-
## 3. 아키텍처 근거
|
|
25
|
-
|
|
26
|
-
- 프로파일은 `{{INCLUDE:<name>}}` 로 공유 계약을 합친다 — resolver 는 임의 파일을 지원한다(`scripts/okstra_ctl/run.py:973` `_expand_profile_includes`, 재귀 depth ≤4, 누락 시 `PrepareError` fail-fast). 추가 코드 변경 없이 새 사이드카를 INCLUDE 할 수 있다.
|
|
27
|
-
- `implementation-planning` 의 행위자는 lead/planner 본인이라 INCLUDE 로 직접 바인딩된다.
|
|
28
|
-
- `implementation` 의 실제 행위자인 **executor(codex/gemini CLI)는 lead 컨텍스트를 공유하지 않는다**. 기존 계약은 lead 가 규칙을 executor 프롬프트에 **verbatim 전사**하게 한다(`prompts/profiles/_implementation-executor.md:27` "CLI executor transcription"). 따라서 implementation 규칙이 CLI executor 에 닿으려면 전사 포인터가 필요하다.
|
|
29
|
-
- executor 사이드카(`_implementation-executor.md`)는 lead 가 Phase 5 에 raw 로 lazy-load 하며 `{{INCLUDE}}` resolver 를 거치지 않는다(`_implementation-executor.md:3`). 그래서 사이드카에는 규칙 **텍스트를 복사하지 않고** 단일 출처를 가리키는 **전사 지시 한 줄**만 둔다(DRY).
|
|
30
|
-
|
|
31
|
-
## 4. 설계
|
|
32
|
-
|
|
33
|
-
### 4.1 신규 단일 파일 `prompts/profiles/_stage-discipline.md` (SSOT)
|
|
34
|
-
|
|
35
|
-
규칙의 유일한 출처. 핵심 원칙 + phase 별 적용 + 보고서 증거 절을 담는다. 전체 본문:
|
|
36
|
-
|
|
37
|
-
```markdown
|
|
38
|
-
<!--
|
|
39
|
-
Shared stage-discipline rule. INCLUDEd by implementation-planning.md (binds the
|
|
40
|
-
planner) and implementation.md (binds the lead). The implementation executor
|
|
41
|
-
sidecar instructs the lead to transcribe this rule into a CLI executor prompt,
|
|
42
|
-
since codex/gemini executors do not share lead context.
|
|
43
|
-
|
|
44
|
-
Do NOT write the literal include directive token in this file's body — the
|
|
45
|
-
resolver matches it anywhere and would recurse on this file itself.
|
|
46
|
-
-->
|
|
47
|
-
|
|
48
|
-
## Stage discipline — preceding stages are behavior-frozen
|
|
49
|
-
|
|
50
|
-
A stage that is already `done` (a `depends-on` predecessor whose work is merged
|
|
51
|
-
into this run's base) is **behavior-frozen**: code it added or modified keeps its
|
|
52
|
-
existing behavior. Later stages MAY call, extend, or compose with that code, but
|
|
53
|
-
MUST NOT change what it already does. This preserves the verified-stays-verified
|
|
54
|
-
invariant — a completed, conformance-passed stage must not silently regress when
|
|
55
|
-
a later stage runs.
|
|
56
|
-
|
|
57
|
-
- **implementation-planning** — decompose stages forward-only. No stage's scope
|
|
58
|
-
may require altering an earlier stage's behavior; each stage builds additively
|
|
59
|
-
on its predecessors' Stage Exit Contracts. If delivering an increment would
|
|
60
|
-
force changing an earlier stage's behavior, that earlier stage was mis-scoped —
|
|
61
|
-
fold the change into that stage or re-partition; do not plan a later stage that
|
|
62
|
-
rewrites it.
|
|
63
|
-
- **implementation** — the executor MUST NOT alter the behavior of any file added
|
|
64
|
-
or modified by a preceding done stage. Touching such a file to *extend* it (a
|
|
65
|
-
new branch, a new caller, an additive field) is allowed; changing its existing
|
|
66
|
-
behavior is not. If a plan step appears to require a behavior change to
|
|
67
|
-
prior-stage code, treat it as a planning defect: record the finding and route
|
|
68
|
-
to a new `implementation-planning` run — never silently rewrite it.
|
|
69
|
-
- **Report evidence (declaration-level).** When this stage modifies a file that
|
|
70
|
-
a preceding stage added or modified, the final report MUST record — in the
|
|
71
|
-
deliverable's existing edits / validation evidence section — which file, why
|
|
72
|
-
it was touched, and how the prior stage's behavior was preserved. Absent that
|
|
73
|
-
note, a reviewer treats a prior-stage edit as an unverified regression risk.
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### 4.2 INCLUDE 배선
|
|
77
|
-
|
|
78
|
-
- `prompts/profiles/implementation.md`: 기존 `{{INCLUDE:_common-contract.md}}`(line 17) 바로 다음 줄에 `{{INCLUDE:_stage-discipline.md}}` 추가.
|
|
79
|
-
- `prompts/profiles/implementation-planning.md`: 기존 `{{INCLUDE:_common-contract.md}}`(line 10) 바로 다음 줄에 `{{INCLUDE:_stage-discipline.md}}` 추가.
|
|
80
|
-
|
|
81
|
-
### 4.3 executor 전사 포인터
|
|
82
|
-
|
|
83
|
-
`prompts/profiles/_implementation-executor.md` 의 기존 전사 규칙(`:27` "CLI executor transcription") 근처에 형제 bullet 한 줄 추가 (규칙 텍스트 복사 없음):
|
|
84
|
-
|
|
85
|
-
```markdown
|
|
86
|
-
- **Stage discipline transcription (when a preceding stage is `done`):** the lead
|
|
87
|
-
MUST transcribe the `Stage discipline` rule (from this run's rendered profile)
|
|
88
|
-
verbatim into the dispatched CLI executor prompt, so a codex/gemini executor
|
|
89
|
-
honors the prior-stage behavior-freeze. Declaration-level — no wrapper sentinel.
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 4.4 전파
|
|
93
|
-
|
|
94
|
-
`tools/build.mjs` 가 `prompts/` → `runtime/` 를 동기화하고 install 이 사용자 머신으로 복사한다. INCLUDE resolver 가 임의 파일을 이미 지원하므로 추가 코드 변경은 없다.
|
|
95
|
-
|
|
96
|
-
## 5. 테스트
|
|
97
|
-
|
|
98
|
-
`tests/test_okstra_profile_includes.py` 확장:
|
|
99
|
-
- `implementation.md` 렌더 결과에 `Stage discipline — preceding stages are behavior-frozen` 헤딩과 `behavior-frozen` 본문이 INCLUDE 로 들어오는지 단언.
|
|
100
|
-
- `implementation-planning.md` 렌더 결과에 같은 규칙 텍스트가 들어오는지 단언.
|
|
101
|
-
- `_stage-discipline.md` 파일 존재 + `implementation` / `implementation-planning` 두 프로파일에 INCLUDE 디렉티브가 있는지 단언 (executor 사이드카에는 전사 포인터 문자열이 있는지 단언).
|
|
102
|
-
|
|
103
|
-
(누락 INCLUDE 는 `_expand_profile_includes` 가 이미 `PrepareError` 로 fail-fast.)
|
|
104
|
-
|
|
105
|
-
## 6. 영향받지 않는 것
|
|
106
|
-
|
|
107
|
-
- 다른 phase(`requirements-discovery` / `error-analysis` / `final-verification` / `release-handoff` / `improvement-discovery`)는 무변경 — 규칙은 두 프로파일에만 INCLUDE 된다.
|
|
108
|
-
- data.json 스키마, validator, CLI 플래그, wizard 무변경.
|