okstra 0.71.1 → 0.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/docs/kr/architecture.md +14 -1
  2. package/docs/kr/cli.md +7 -1
  3. package/docs/superpowers/plans/2026-06-11-fix-cycle.md +1290 -0
  4. package/docs/superpowers/specs/2026-06-11-fix-cycle-design.md +94 -0
  5. package/package.json +1 -1
  6. package/runtime/BUILD.json +2 -2
  7. package/runtime/agents/SKILL.md +1 -1
  8. package/runtime/bin/lib/okstra/cli.sh +5 -1
  9. package/runtime/bin/lib/okstra/globals.sh +1 -0
  10. package/runtime/bin/lib/okstra/usage.sh +6 -1
  11. package/runtime/bin/okstra.sh +1 -0
  12. package/runtime/prompts/profiles/_implementation-executor.md +1 -1
  13. package/runtime/prompts/profiles/_implementation-verifier.md +1 -1
  14. package/runtime/prompts/profiles/implementation-planning.md +2 -2
  15. package/runtime/prompts/wizard/prompts.ko.json +9 -0
  16. package/runtime/python/okstra_ctl/analysis_packet.py +17 -0
  17. package/runtime/python/okstra_ctl/conformance.py +5 -0
  18. package/runtime/python/okstra_ctl/fix_cycles.py +172 -0
  19. package/runtime/python/okstra_ctl/render.py +45 -5
  20. package/runtime/python/okstra_ctl/run.py +93 -0
  21. package/runtime/python/okstra_ctl/run_context.py +15 -9
  22. package/runtime/python/okstra_ctl/wizard.py +64 -4
  23. package/runtime/python/okstra_token_usage/claude.py +64 -8
  24. package/runtime/python/okstra_token_usage/collect.py +30 -1
  25. package/runtime/schemas/final-report-v1.0.schema.json +25 -0
  26. package/runtime/skills/okstra-brief/SKILL.md +8 -0
  27. package/runtime/skills/okstra-report-writer/SKILL.md +2 -0
  28. package/runtime/skills/okstra-run/SKILL.md +2 -1
  29. package/runtime/templates/project-docs/task-index.template.md +1 -0
  30. package/runtime/templates/reports/final-report.template.md +14 -0
  31. package/runtime/validators/validate-run.py +81 -4
  32. package/runtime/validators/validate_session_conformance.py +7 -1
  33. package/src/render-bundle.mjs +4 -1
@@ -366,6 +366,15 @@ okstra phase 는 PRD / issue file 을 직접 쓰지 않습니다. 동등한 결
366
366
  - 답변 편집과 재실행을 한 번에 처리하려면 `--resume-clarification` 모드를 사용합니다. 자세한 동작은 `### --resume-clarification` 섹션을 참고합니다.
367
367
  - **Stage carry-in (`implementation` → 다음 stage)**: 각 `implementation` run 은 `runs/implementation/carry/stage-<N>.json` evidence sidecar 를 남깁니다. 다음 stage 가 실행될 때 이 파일을 자동으로 carry-in 합니다. 어떤 `implementation` run 이 어떤 stage 를 소비했는지는 `runs/implementation-planning/consumers.jsonl` 에 역링크로 누적됩니다.
368
368
 
369
+ ### Fix cycle (사후 버그 핫픽스 이력)
370
+
371
+ release-handoff 까지 완료된 task 의 산출물에서 버그가 발견되면, 같은 task-id 에 entry phase (`requirements-discovery` / `error-analysis` / `implementation-planning`) 로 재진입해 고칩니다 — 전용 hotfix task-type 은 없고 phase gate 는 그대로입니다. 이 재진입 run 묶음이 **fix cycle** 이며, SSOT 는 `<task_root>/history/fix-cycles.jsonl` 의 append-only 이벤트 행 (`opened` / `run` / `closed`, 모듈 `scripts/okstra_ctl/fix_cycles.py` 단독 소유) 입니다. entry phase 목록은 `fix_cycles.FIX_CYCLE_ENTRY_PHASES` 한 곳에서만 정의되고 prepare 게이트와 wizard 감지 술어가 공유합니다.
372
+
373
+ - **진입**: okstra-run wizard 가 완료 task + entry phase 재진입을 감지해 `fix_cycle_confirm` 단계로 확인합니다. CLI 는 `--fix-cycle <yes|no>` (미지정 시 기록하지 않음). `--fix-cycle yes` 는 두 가드를 모두 통과해야 cycle 을 엽니다 — task-type 이 entry phase 이고, manifest 의 `workflow.lastCompletedPhase` 가 `release-handoff` 여야 하며, 위반 시 `PrepareError`. open cycle 은 task 당 동시 1개입니다.
374
+ - **부착**: cycle 이 open 인 동안 같은 task 의 모든 run 이 (이후 `--fix-cycle` 플래그 없이도) `run` 행으로 부착되고, run-manifest / timeline 항목에 `fixCycleId` 가 찍힙니다.
375
+ - **종료**: open cycle 에 release-handoff run 이 부착된 뒤 manifest 의 `workflow.lastCompletedPhase` 가 `release-handoff` 가 되면, 다음 prepare 가 `closed` 행을 lazy-append 합니다.
376
+ - **소비처 (전부 파생 뷰)**: ① 후속 run 의 analysis-packet `## Fix History` 섹션 ② okstra-brief 의 Task Continuity Notes 인용 ③ final-report `## 5.10 Fix History` (run-manifest 에 `fixCycleId` 가 있으면 data.json `fixCycle` 블록을 validator `_validate_fix_cycle` 가 강제) ④ task-manifest `fixCycles` 요약 + task-index / task-catalog 한 줄. 네 소비처 모두 `fix_cycles.summarize()` / `packet_summary()` 파생 뷰만 읽습니다.
377
+
369
378
  ### release-handoff stage-group 모드
370
379
 
371
380
  `release-handoff` 는 두 모드로 동작합니다 (설계 `docs/superpowers/specs/2026-06-10-stage-group-handoff-design.md`).
@@ -460,7 +469,8 @@ task manifest, task index, instruction-set, runs, history가 이 루트 아래
460
469
  │ │ └── errors-<task-type>-<seq>.jsonl # optional, lead-only writer
461
470
  │ └── worker-results/
462
471
  └── history/
463
- └── timeline.json
472
+ ├── timeline.json
473
+ └── fix-cycles.jsonl # optional, fix cycle 진입 시에만 생성 (append-only)
464
474
  ```
465
475
 
466
476
  실제 디렉터리 세그먼트는 안전한 경로 생성을 위해 slug 형태로 정규화될 수 있습니다.
@@ -572,6 +582,7 @@ scripts/okstra.sh workflow가 사용하는 project-local Claude assets는 아래
572
582
  - `artifacts`
573
583
  - `resultContract`
574
584
  - `claudeSession`
585
+ - `fixCycles` *(파생 요약 — `{count, openCycleId, latest:{cycle, symptom, targetReport, closedAt}}`; 매 prepare 재계산)*
575
586
 
576
587
  이 manifest는 아래 목적을 가집니다.
577
588
 
@@ -632,6 +643,7 @@ canonical metadata는 항상 `task-manifest.json`을 기준으로 확인합니
632
643
  - current run status
633
644
  - workflow snapshot
634
645
  - team contract
646
+ - `fixCycleId` *(fix cycle 부착 시에만; 없으면 필드 생략)*
635
647
 
636
648
  ## Timeline contract
637
649
 
@@ -651,6 +663,7 @@ canonical metadata는 항상 `task-manifest.json`을 기준으로 확인합니
651
663
  - resume command relative path
652
664
  - related tasks
653
665
  - workflow snapshot
666
+ - `fixCycleId` *(fix cycle 부착 시에만; 없으면 필드 생략)*
654
667
  같은 task-type을 다시 실행하면 같은 `runs/<task-type>/` 폴더를 재사용하더라도 `run-manifest-<task-type>-<seq>.json`과 관련 artifact 경로가 per-category sequence suffix(`<task-type>-<seq>`)로 분리되므로 각 실행이 별도 이력으로 누적됩니다. cross-category 식별자는 manifest의 `runDateTimeSegment` ISO timestamp 필드입니다.
655
668
 
656
669
  ## Claude operating contract
package/docs/kr/cli.md CHANGED
@@ -20,6 +20,7 @@
20
20
  - [`--resume-clarification`](#--resume-clarification)
21
21
  - [`--project-root`](#--project-root)
22
22
  - [`--directive`](#--directive)
23
+ - [`--fix-cycle`](#--fix-cycle)
23
24
  - [`--workers`](#--workers)
24
25
  - [`--claude-model`](#--claude-model)
25
26
  - [`--lead-model`](#--lead-model)
@@ -51,7 +52,7 @@
51
52
  기본 명령(첫 진입 / full args):
52
53
 
53
54
  ```bash
54
- scripts/okstra.sh [--render-only] [--yes] [--no-plan-verification] --task-type <task-type> [--workers worker1,worker2] [--lead-model <model>] [--claude-model <model>] [--codex-model <model>] [--gemini-model <model>] [--report-writer-model <model>] [--executor claude|codex|gemini] [--critic off|claude|codex|gemini] [--related-tasks taskA,taskB] [--work-category bugfix|feature|refactor|ops|improvement|unknown] [--base-ref <branch|tag|sha>] [--clarification-response <previous-final-report>] [--approved-plan <plan-path>] [--approve] --project-id <project-id> --task-group <task-group> --task-id <task-id> --task-brief <brief-path> [--directive <directive>]
55
+ scripts/okstra.sh [--render-only] [--yes] [--no-plan-verification] --task-type <task-type> [--workers worker1,worker2] [--lead-model <model>] [--claude-model <model>] [--codex-model <model>] [--gemini-model <model>] [--report-writer-model <model>] [--executor claude|codex|gemini] [--critic off|claude|codex|gemini] [--related-tasks taskA,taskB] [--work-category bugfix|feature|refactor|ops|improvement|unknown] [--base-ref <branch|tag|sha>] [--clarification-response <previous-final-report>] [--approved-plan <plan-path>] [--approve] --project-id <project-id> --task-group <task-group> --task-id <task-id> --task-brief <brief-path> [--directive <directive>] [--fix-cycle <yes|no>]
55
56
  ```
56
57
 
57
58
  후속 phase 단축 형식(기존 task-manifest.json이 존재할 때):
@@ -289,6 +290,11 @@ scripts/okstra.sh --task-type implementation-planning ... \
289
290
  --directive "Phase 2개(Part 1 ~4d, Part 2 ~5d, 순차)로 총 ~10d. Gantt 꼭 그려줘 (임계 경로 표시)."
290
291
  ```
291
292
 
293
+ ### `--fix-cycle`
294
+
295
+ - `--fix-cycle <yes|no>` — release-handoff 까지 완료된 task 에 entry phase (`requirements-discovery` / `error-analysis` / `implementation-planning`) 로 재진입할 때, 이번 재진입을 버그 픽스 사이클로 기록할지 여부. 미지정 시 기록하지 않습니다 (okstra-run wizard 경로는 `fix_cycle_confirm` 단계가 같은 입력을 받습니다).
296
+ - `yes` 는 두 조건을 모두 만족해야 새 cycle 을 엽니다 — task-type 이 entry phase 이고, manifest 의 `workflow.lastCompletedPhase` 가 `release-handoff` 여야 합니다. 둘 중 하나라도 어긋나면 prepare 가 거부합니다. cycle 이 이미 open 이면 같은 task 의 이후 run 은 이 플래그 없이도 자동으로 부착됩니다.
297
+
292
298
  ### `--workers`
293
299
 
294
300
  이번 run에서 사용할 worker 목록을 직접 지정합니다.