okstra 0.122.0 → 0.124.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 (108) hide show
  1. package/README.md +5 -2
  2. package/docs/architecture/storage-model.md +15 -1
  3. package/docs/architecture.md +45 -7
  4. package/docs/cli.md +47 -5
  5. package/docs/for-ai/README.md +42 -36
  6. package/docs/for-ai/skills/okstra-brief-gen.md +105 -105
  7. package/docs/for-ai/skills/okstra-container-build.md +61 -61
  8. package/docs/for-ai/skills/okstra-graphify.md +64 -0
  9. package/docs/for-ai/skills/okstra-inspect.md +86 -86
  10. package/docs/for-ai/skills/okstra-manager.md +32 -32
  11. package/docs/for-ai/skills/okstra-memory.md +49 -50
  12. package/docs/for-ai/skills/okstra-pr-gen.md +48 -0
  13. package/docs/for-ai/skills/okstra-rollup.md +58 -58
  14. package/docs/for-ai/skills/okstra-run.md +95 -95
  15. package/docs/for-ai/skills/okstra-schedule-gen.md +320 -0
  16. package/docs/for-ai/skills/okstra-setup.md +63 -64
  17. package/docs/for-ai/skills/okstra-user-response.md +48 -0
  18. package/docs/performance-improvement-plan-v2.md +4 -4
  19. package/docs/pr-template-usage.md +34 -34
  20. package/docs/project-structure-overview.md +92 -70
  21. package/docs/task-process/README.md +33 -33
  22. package/docs/task-process/common-flow.md +26 -26
  23. package/docs/task-process/error-analysis.md +20 -21
  24. package/docs/task-process/final-verification.md +41 -41
  25. package/docs/task-process/implementation-planning.md +52 -28
  26. package/docs/task-process/implementation.md +51 -32
  27. package/docs/task-process/release-handoff.md +46 -46
  28. package/docs/task-process/requirements-discovery.md +22 -23
  29. package/package.json +1 -1
  30. package/runtime/BUILD.json +2 -2
  31. package/runtime/agents/workers/antigravity-worker.md +4 -4
  32. package/runtime/agents/workers/claude-worker.md +2 -2
  33. package/runtime/agents/workers/codex-worker.md +4 -4
  34. package/runtime/agents/workers/report-writer-worker.md +4 -4
  35. package/runtime/bin/lib/okstra/usage.sh +3 -3
  36. package/runtime/prompts/coding-preflight/frameworks/node-server.md +1 -1
  37. package/runtime/prompts/launch.template.md +6 -3
  38. package/runtime/prompts/lead/convergence.md +11 -21
  39. package/runtime/prompts/lead/okstra-lead-contract.md +16 -18
  40. package/runtime/prompts/lead/plan-body-verification.md +47 -18
  41. package/runtime/prompts/lead/report-writer.md +50 -45
  42. package/runtime/prompts/lead/team-contract.md +11 -122
  43. package/runtime/prompts/profiles/_common-contract.md +15 -22
  44. package/runtime/prompts/profiles/_implementation-deliverable.md +4 -2
  45. package/runtime/prompts/profiles/_implementation-executor.md +6 -1
  46. package/runtime/prompts/profiles/_implementation-verifier.md +3 -3
  47. package/runtime/prompts/profiles/error-analysis.md +2 -2
  48. package/runtime/prompts/profiles/final-verification.md +3 -1
  49. package/runtime/prompts/profiles/implementation-planning.md +24 -14
  50. package/runtime/prompts/profiles/implementation.md +1 -1
  51. package/runtime/prompts/profiles/improvement-discovery.md +1 -1
  52. package/runtime/prompts/profiles/release-handoff.md +3 -3
  53. package/runtime/prompts/profiles/requirements-discovery.md +18 -18
  54. package/runtime/prompts/wizard/prompts.ko.json +44 -0
  55. package/runtime/python/okstra_ctl/codex_dispatch.py +23 -1
  56. package/runtime/python/okstra_ctl/design_prep.py +1462 -0
  57. package/runtime/python/okstra_ctl/design_surfaces.py +243 -0
  58. package/runtime/python/okstra_ctl/final_report_schema.py +33 -1
  59. package/runtime/python/okstra_ctl/implementation_stage.py +35 -0
  60. package/runtime/python/okstra_ctl/incremental_carry.py +294 -21
  61. package/runtime/python/okstra_ctl/incremental_scope.py +51 -5
  62. package/runtime/python/okstra_ctl/material.py +1 -1
  63. package/runtime/python/okstra_ctl/model_discovery.py +98 -0
  64. package/runtime/python/okstra_ctl/models.py +8 -3
  65. package/runtime/python/okstra_ctl/render.py +5 -0
  66. package/runtime/python/okstra_ctl/run.py +53 -5
  67. package/runtime/python/okstra_ctl/user_response.py +67 -2
  68. package/runtime/python/okstra_ctl/wizard.py +283 -3
  69. package/runtime/python/okstra_token_usage/report.py +11 -0
  70. package/runtime/schemas/final-report-v1.0.schema.json +336 -0
  71. package/runtime/skills/_fragments/bash-invocation-rule.md +1 -0
  72. package/runtime/skills/_fragments/preflight-outdated-cli.md +1 -0
  73. package/runtime/skills/_fragments/python-bootstrap-note.md +1 -0
  74. package/runtime/skills/okstra-brief-gen/SKILL.md +117 -122
  75. package/runtime/skills/okstra-container-build/SKILL.md +24 -14
  76. package/runtime/skills/okstra-graphify/SKILL.md +12 -4
  77. package/runtime/skills/okstra-inspect/SKILL.md +105 -99
  78. package/runtime/skills/okstra-manager/SKILL.md +1 -1
  79. package/runtime/skills/okstra-memory/SKILL.md +3 -3
  80. package/runtime/skills/okstra-rollup/SKILL.md +12 -6
  81. package/runtime/skills/okstra-run/SKILL.md +49 -88
  82. package/runtime/skills/{okstra-schedule → okstra-schedule-gen}/SKILL.md +38 -32
  83. package/runtime/skills/okstra-setup/SKILL.md +1 -1
  84. package/runtime/skills/okstra-setup/references/project-config.md +17 -16
  85. package/runtime/skills/okstra-usage/SKILL.md +5 -2
  86. package/runtime/skills/okstra-user-response/SKILL.md +23 -9
  87. package/runtime/templates/prd/brief.template.md +92 -92
  88. package/runtime/templates/reports/error-analysis-input.template.md +1 -1
  89. package/runtime/templates/reports/fan-out-unit.template.md +6 -6
  90. package/runtime/templates/reports/final-report.template.md +67 -0
  91. package/runtime/templates/reports/final-verification-input.template.md +6 -6
  92. package/runtime/templates/reports/i18n/en.json +31 -0
  93. package/runtime/templates/reports/i18n/ko.json +31 -0
  94. package/runtime/templates/reports/implementation-input.template.md +1 -1
  95. package/runtime/templates/reports/implementation-planning-input.template.md +1 -1
  96. package/runtime/templates/reports/improvement-discovery-input.template.md +1 -1
  97. package/runtime/templates/reports/quick-input.template.md +1 -1
  98. package/runtime/templates/reports/release-handoff-input.template.md +1 -1
  99. package/runtime/templates/reports/schedule.template.md +22 -22
  100. package/runtime/templates/reports/task-brief.template.md +3 -3
  101. package/runtime/templates/reports/user-response.template.md +20 -20
  102. package/runtime/templates/worker-prompt-preamble.md +111 -13
  103. package/runtime/validators/validate-run.py +426 -5
  104. package/runtime/validators/validate-schedule.py +5 -5
  105. package/src/cli-registry.mjs +7 -0
  106. package/src/commands/inspect/design-prep.mjs +23 -0
  107. package/src/lib/skill-catalog.mjs +2 -1
  108. package/docs/for-ai/skills/okstra-schedule.md +0 -320
@@ -1,72 +1,72 @@
1
1
  # okstra-brief-gen AI Manual
2
2
 
3
- ## 원천
3
+ ## Source
4
4
 
5
- - 스킬 원문: [`skills/okstra-brief-gen/SKILL.md`](../../../skills/okstra-brief-gen/SKILL.md)
6
- - brief 템플릿: [`templates/reports/brief.template.md`](../../../templates/reports/brief.template.md)
5
+ - Skill source: [`skills/okstra-brief-gen/SKILL.md`](../../../skills/okstra-brief-gen/SKILL.md)
6
+ - brief template: [`templates/reports/brief.template.md`](../../../templates/reports/brief.template.md)
7
7
  - brief validator: [`validators/validate-brief.py`](../../../validators/validate-brief.py)
8
8
  - lens enum SSOT: [`scripts/okstra_ctl/improvement_lenses.py`](../../../scripts/okstra_ctl/improvement_lenses.py)
9
9
 
10
- ## 목적
10
+ ## Purpose
11
11
 
12
- `okstra-brief-gen`는 okstra pipeline에 넣을 task brief를 만든다. brief는 pre-discovery 산출물이다. 요구사항을 구현 계획으로 바꾸는 문서가 아니라, reporter가 준 원문과 AI가 확인한 증거/해석을 라벨로 분리해 다음 phase가 질문 없이 출발하게 만드는 handoff 문서다.
12
+ `okstra-brief-gen` produces a task brief to feed into the okstra pipeline. A brief is a pre-discovery artifact. It is not a document that turns requirements into an implementation plan; it is a handoff document that separates the reporter's verbatim material from the AI-verified evidence/interpretation using labels, so the next phase can start without questions.
13
13
 
14
- 출력 위치:
14
+ Output location:
15
15
 
16
16
  ```text
17
17
  <PROJECT_ROOT>/.okstra/briefs/<task-group>/<brief-id>.md
18
18
  <PROJECT_ROOT>/.okstra/briefs/<task-group>/sub/.../<brief-id>.md
19
19
  ```
20
20
 
21
- ## 세 가지 variant
21
+ ## Three variants
22
22
 
23
- | Variant | 입력 | Recommended next phase |
23
+ | Variant | Input | Recommended next phase |
24
24
  |---|---|---|
25
- | Reporter input | 파일, 티켓, URL, 대화/자유 텍스트 | `requirements-discovery` 또는 `error-analysis` |
25
+ | Reporter input | files, tickets, URLs, conversation/free text | `requirements-discovery` or `error-analysis` |
26
26
  | Codebase scan | scan scope, priority lenses, candidate cap, context | `improvement-discovery` |
27
- | Error feedback | `okstra error-zip`이 만든 zip의 단일 error cluster | `error-analysis` |
27
+ | Error feedback | a single error cluster from the zip produced by `okstra error-zip` | `error-analysis` |
28
28
 
29
- ## 핵심 불변식
29
+ ## Core invariants
30
30
 
31
- 1. Source Material은 원문 보존 영역이다. paraphrase, 요약, 재정렬을 하지 않는다.
32
- 2. AI의 해석, 파일 링크, 용어 매핑, format 변환은 모두 `Augmentation` 또는 `> augmented:` blockquote에 둔다.
33
- 3. augmentation은 네 label 중 하나를 가진다: `evidence-link`, `format-conversion`, `terminology-mapping`, `intent-inference`.
34
- 4. `intent-inference`는 `Open Questions`의 `intent-check:`와 짝을 이룬다. 이 관계는 `validators/validate-brief.py`가 검사한다.
35
- 5. `terminology-mapping` augmentation은 `Open Questions`의 `terminology:`와 짝을 이룬다(validator 검사). 단 Step 4.5 결과 marker `applied glossary:` / `skipped glossary:`는 예외 — 짝 row가 필요 없다.
36
- 6. reporter만 답할 수 있는 질문은 Step 6.5에서 모아 `## Reporter Confirmations`에 verbatim으로 기록한다.
37
- 7. 티켓 분리/연결/순서 관계는 `## Related Task Graph`의 구조화된 table에 둔다. parent-id만으로 작업 순서를 추론하지 않는다.
38
- 8. 모든 okstra-owned write는 `<PROJECT_ROOT>/.okstra/` 안에 둔다. 외부 파일은 reporter가 source로 명시한 경우에만 읽는다.
39
- 9. `Open Questions`의 모든 row는 다섯 prefix 중 하나로 시작한다: `general:`, `terminology:`, `intent-check:`, `conversion-block:`, `adr-candidate:` (validator 강제). `adr-candidate:`는 신호일 뿐 — decision file은 `implementation-planning`이 `<PROJECT_ROOT>/.okstra/decisions/`에 쓴다.
31
+ 1. Source Material is a verbatim-preservation area. Do not paraphrase, summarize, or reorder.
32
+ 2. The AI's interpretation, file links, terminology mapping, and format conversion all go under `Augmentation` or a `> augmented:` blockquote.
33
+ 3. An augmentation carries one of four labels: `evidence-link`, `format-conversion`, `terminology-mapping`, `intent-inference`.
34
+ 4. `intent-inference` is paired with `intent-check:` in `Open Questions`. This relationship is checked by `validators/validate-brief.py`.
35
+ 5. A `terminology-mapping` augmentation is paired with `terminology:` in `Open Questions` (validator-checked). Exception: the Step 4.5 result markers `applied glossary:` / `skipped glossary:` need no paired row.
36
+ 6. Questions only the reporter can answer are collected in Step 6.5 and recorded verbatim under `## Reporter Confirmations`.
37
+ 7. Ticket split/link/order relations go in the structured table of `## Related Task Graph`. Do not infer work order from parent-id alone.
38
+ 8. Every okstra-owned write stays inside `<PROJECT_ROOT>/.okstra/`. External files are read only when the reporter explicitly cited them as source.
39
+ 9. Every row in `Open Questions` starts with one of five prefixes: `general:`, `terminology:`, `intent-check:`, `conversion-block:`, `adr-candidate:` (validator-enforced). `adr-candidate:` is only a signal — the decision file is written by `implementation-planning` into `<PROJECT_ROOT>/.okstra/decisions/`.
40
40
 
41
41
  ## Preflight
42
42
 
43
- 단일 호출로 실행한다.
43
+ Run as a single call.
44
44
 
45
45
  ```bash
46
46
  okstra preflight --runtime claude-code --json
47
47
  ```
48
48
 
49
- runtime이나 project setup이 없으면 `/okstra-setup`을 안내하고 멈춘다. 이 스킬에서 `npx` fallback을 쓰지 않는다.
49
+ If runtime or project setup is missing, guide the user to `/okstra-setup` and stop. This skill does not use an `npx` fallback.
50
50
 
51
- ## 입력 수집
51
+ ## Input collection
52
52
 
53
53
  ### Reporter input
54
54
 
55
- 소스 종류는 하나 이상 가능하지만 각 소스는 `Source Material`에 별도 block으로 저장한다.
55
+ More than one source type is allowed, but each source is stored as a separate block under `Source Material`.
56
56
 
57
- - File: 전체 파일을 읽고 그대로 넣는다.
58
- - Issue tracker ticket: Linear/Jira/GitHub/Notion을 감지하고 MCP 또는 `gh` CLI를 사용한다. 접근 도구가 없으면 사용자에게 body paste 또는 skip을 묻는다.
59
- - Link URL: fetch한다. 실패/로그인 wall/본문 truncation이면 사용자에게 paste를 요청한다.
60
- - User input: 대화 맥락이 충분하면 conversation synthesis, 부족하면 한 번만 free-text를 받는다.
57
+ - File: read the entire file and insert it as-is.
58
+ - Issue tracker ticket: detect Linear/Jira/GitHub/Notion and use MCP or the `gh` CLI. If no access tool is available, ask the user to paste the body or skip.
59
+ - Link URL: fetch it. On failure / login wall / body truncation, ask the user to paste.
60
+ - User input: if conversation context is sufficient, use conversation synthesis; if thin, take a single free-text input.
61
61
 
62
- 티켓에 child/sub-task가 있으면 parent에서 한 번만 tree 처리 방식을 묻는다.
62
+ If a ticket has children/sub-tasks, ask once at the parent how to handle the tree.
63
63
 
64
- - Full tree: descendant별 brief 생성.
65
- - Parent only: child key/URL을 Related Artifacts에 두고 `Related Task Graph`에는 `parent-of` edge를 남긴다.
66
- - Selected: 선택한 direct child branch만 재귀 처리.
64
+ - Full tree: generate a brief per descendant.
65
+ - Parent only: put child keys/URLs in Related Artifacts and leave a `parent-of` edge in `Related Task Graph`.
66
+ - Selected: recurse only into the chosen direct-child branch.
67
67
 
68
- 재귀 시 visited set은 `<tracker>:<ticket-id>`로 관리하고, 재실행에서는 기존 brief frontmatter의 `ticket-id` + `source-type`으로 reseed한다.
69
- Full tree 또는 Selected로 여러 brief를 만들면 모든 생성 brief에 같은 `Related Task Graph`를 복사한다. 그래야 child brief 하나만 downstream phase에 전달돼도 split topology, 선행/후행 관계, 중복 방지 신호가 유지된다.
68
+ During recursion, manage the visited set as `<tracker>:<ticket-id>`, and on re-run reseed from the existing brief frontmatter's `ticket-id` + `source-type`.
69
+ When Full tree or Selected produces multiple briefs, copy the same `Related Task Graph` into every generated brief. That way, even if only one child brief is passed to a downstream phase, the split topology, predecessor/successor relations, and de-duplication signals are preserved.
70
70
 
71
71
  `Related Task Graph` table schema:
72
72
 
@@ -77,39 +77,39 @@ Full tree 또는 Selected로 여러 brief를 만들면 모든 생성 brief에
77
77
  | To | task key, brief id, tracker id, or URL |
78
78
  | Direction | `directed` or `undirected` |
79
79
  | Source | tracker linked issue, task-list checkbox, reporter statement, manual split, prior okstra task |
80
- | Impact | downstream phase가 보존해야 할 의미 |
80
+ | Impact | meaning the downstream phase must preserve |
81
81
 
82
- `depends-on`, `blocks`, parent/child, follow-up, split 관계는 `directed`다. `duplicates`, `related-to`는 `undirected`다. source가 없는 관계는 만들지 않는다.
82
+ `depends-on`, `blocks`, parent/child, follow-up, and split relations are `directed`. `duplicates` and `related-to` are `undirected`. Do not create a relation with no source.
83
83
 
84
84
  ### Codebase scan
85
85
 
86
- 수집값:
86
+ Collected values:
87
87
 
88
- - `scan_scope`: 프로젝트 내부 실제 경로 목록.
89
- - `priority_lenses`: `LENSES` enum 중 1-4개.
90
- - `out_of_scope`: 선택.
91
- - `candidate_cap`: 1-12, 기본 8.
88
+ - `scan_scope`: a list of real paths inside the project.
89
+ - `priority_lenses`: 1–4 of the `LENSES` enum.
90
+ - `out_of_scope`: optional.
91
+ - `candidate_cap`: 1–12, default 8.
92
92
  - context, desired outcome, constraints.
93
93
 
94
- 경로 존재, lens enum subset, candidate cap 범위는 작성 전 확인한다. 최종 검증은 `validate-brief.py`가 `scope: codebase`, `Scan Scope`, `Priority Lenses`를 검사한다.
94
+ Verify path existence, the lens enum subset, and the candidate-cap range before writing. Final validation is done by `validate-brief.py`, which checks `scope: codebase`, `Scan Scope`, and `Priority Lenses`.
95
95
 
96
96
  ### Error feedback
97
97
 
98
- 입력은 `okstra error-zip --out <path>`가 만든 zip이다.
98
+ The input is the zip produced by `okstra error-zip --out <path>`.
99
99
 
100
- 처리:
100
+ Processing:
101
101
 
102
- 1. zip에 `report.md`, `errors/anonymized.jsonl`이 있는지 확인한다.
103
- 2. 빈발 cluster 표에서 cluster 하나만 선택한다.
104
- 3. 선택 cluster의 anonymized records만 Source Material에 옮긴다.
105
- 4. 서로 다른 errorType을 한 brief에 섞지 않는다.
106
- 5. 다음 단계 안내는 `error-analysis`로 둔다.
102
+ 1. Confirm the zip contains `report.md` and `errors/anonymized.jsonl`.
103
+ 2. Pick exactly one cluster from the frequent-cluster table.
104
+ 3. Move only the chosen cluster's anonymized records into Source Material.
105
+ 4. Do not mix different errorTypes into one brief.
106
+ 5. Set the next-step guidance to `error-analysis`.
107
107
 
108
- ## task-group과 파일명
108
+ ## task-group and filename
109
109
 
110
- task-group은 기존 group 추천을 먼저 보여준다. `okstra task-list`를 호출해 `tasks[]`의 distinct `taskGroup`을 최신순으로 뽑고, 최근 2개 + 직접 입력을 제공한다. tracker recursion에서는 child path를 만들기 전에 task-group을 먼저 받아야 한다.
110
+ For task-group, show existing-group recommendations first. Call `okstra task-list`, extract the distinct `taskGroup` values from `tasks[]` in most-recent order, and offer the 2 most recent + enter-directly. In tracker recursion, task-group must be obtained before building any child path.
111
111
 
112
- 파일 경로 규칙:
112
+ File path rule:
113
113
 
114
114
  ```text
115
115
  depth 0: .okstra/briefs/<task-group>/<ticket-id>-<file-title>.md
@@ -117,56 +117,56 @@ depth 1: .okstra/briefs/<task-group>/sub/<ticket-id>-<file-title>.md
117
117
  depth N: .okstra/briefs/<task-group>/<sub/ repeated N>/<ticket-id>-<file-title>.md
118
118
  ```
119
119
 
120
- frontmatter의 `depth`는 path의 `sub/` 개수와 같아야 한다. validator가 검사한다.
120
+ The frontmatter's `depth` must equal the number of `sub/` segments in the path. The validator checks this.
121
121
 
122
- 충돌 시 기본은 Skip이다. Append suffix 또는 Overwrite를 제공할 수 있다. tracker multi-generation에서 bulk overwrite를 조용히 수행하지 않는다.
122
+ On collision, the default is Skip. You may offer Append suffix or Overwrite. Do not silently perform a bulk overwrite in tracker multi-generation.
123
123
 
124
124
  ## Domain alignment
125
125
 
126
- 먼저 okstra 내부 memory를 본다.
126
+ First look at okstra's internal memory.
127
127
 
128
128
  - `<PROJECT_ROOT>/.okstra/glossary.md`
129
129
  - `<PROJECT_ROOT>/.okstra/decisions/`
130
- - 관련 task의 `history/fix-cycles.jsonl`
130
+ - the related task's `history/fix-cycles.jsonl`
131
131
 
132
- 외부 domain docs는 reporter가 source material로 명시했을 때만 읽는다. 충돌/모호 용어는 `Augmentation > Domain alignment`에 `terminology-mapping`으로 기록하고, `Open Questions`에 `terminology:` row를 둔다.
132
+ Read external domain docs only when the reporter explicitly cited them as source material. Record conflicting/ambiguous terms under `Augmentation > Domain alignment` with `terminology-mapping`, and put a `terminology:` row in `Open Questions`.
133
133
 
134
- 파일 path나 symbol이 언급되면 `Read`/`Grep`으로 실제 in-repo reference를 찾고 `evidence-link`로 남긴다. 매핑할 수 없으면 추측하지 않고 `conversion-block:` row로 둔다.
134
+ When a file path or symbol is mentioned, find the actual in-repo reference with `Read`/`Grep` and record it as `evidence-link`. If it cannot be mapped, do not guess — leave a `conversion-block:` row.
135
135
 
136
136
  ## Sharpening pass
137
137
 
138
- full interview를 하지 않는다. source와 codebase로 채울 수 없는 gap만 묻는다.
138
+ Do not run a full interview. Ask only about gaps that source and codebase cannot fill.
139
139
 
140
- 기본 budget:
140
+ Default budget:
141
141
 
142
- - 원문 스킬이 채움 대상으로 지정한 section당 최대 1문항.
143
- - terminology/fuzzy disambiguation 최대 2문항.
144
- - 전체 최대 6문항.
145
- - codebase-scan은 최대 8문항.
142
+ - at most 1 question per section the source skill designates as fill-in.
143
+ - at most 2 questions for terminology/fuzzy disambiguation.
144
+ - at most 6 questions overall.
145
+ - codebase-scan up to 8 questions.
146
146
 
147
- 질문보다 codebase-first 확인을 우선한다. 남은 gap은 `_(none)_` 또는 `Open Questions`에 둔다.
147
+ Prefer codebase-first checks over questions. Put remaining gaps in `_(none)_` or `Open Questions`.
148
148
 
149
- ## template 작성 규칙
149
+ ## template writing rules
150
150
 
151
- 템플릿은 `templates/reports/brief.template.md`가 SSOT다. section 순서, frontmatter key, top blockquote shape, HTML comment guidance를 따른다.
151
+ The template `templates/reports/brief.template.md` is the SSOT. Follow the section order, frontmatter keys, top blockquote shape, and HTML comment guidance.
152
152
 
153
- Reporter input과 Error feedback:
153
+ Reporter input and Error feedback:
154
154
 
155
- - `## Source Material` 유지.
156
- - `## Problem / Symptom` 유지.
157
- - `## Scan Scope`, `## Priority Lenses` 생략.
155
+ - keep `## Source Material`.
156
+ - keep `## Problem / Symptom`.
157
+ - omit `## Scan Scope`, `## Priority Lenses`.
158
158
 
159
159
  Codebase scan:
160
160
 
161
- - frontmatter에 `scope: codebase`.
162
- - `## Source Material`, `## Problem / Symptom` 생략.
163
- - `## Scan Scope`, `## Priority Lenses` 유지.
161
+ - `scope: codebase` in frontmatter.
162
+ - omit `## Source Material`, `## Problem / Symptom`.
163
+ - keep `## Scan Scope`, `## Priority Lenses`.
164
164
 
165
- 빈 섹션을 날조하지 않는다. 값이 없으면 `_(none)_`를 사용한다.
165
+ Do not fabricate empty sections. When there is no value, use `_(none)_`.
166
166
 
167
167
  ## frontmatter key
168
168
 
169
- 모든 brief는 다음 key를 가진다. key set은 `validate-brief.py`에서 검사한다.
169
+ Every brief carries the following keys. The key set is checked by `validate-brief.py`.
170
170
 
171
171
  - `type`
172
172
  - `brief-id`
@@ -179,42 +179,42 @@ Codebase scan:
179
179
  - `generator`
180
180
  - `reporter-confirmations`
181
181
 
182
- `brief-id`는 filename stem과 같아야 한다. depth 0의 `parent-id`는 `self`, descendant의 `parent-id`는 direct parent의 `brief-id`다.
182
+ `brief-id` must equal the filename stem. At depth 0 the `parent-id` is `self`; a descendant's `parent-id` is its direct parent's `brief-id`.
183
183
 
184
184
  ## Recommended next phase
185
185
 
186
- brief 본문 top blockquote의 `Recommended next phase:`에 쓴다.
186
+ Write it into the `Recommended next phase:` of the brief body's top blockquote.
187
187
 
188
188
  - observable error, repro, stack trace, error-zip record: `error-analysis`
189
- - ambiguity나 Open Questions가 큰 요구사항: `requirements-discovery`
189
+ - a requirement with ambiguity or large Open Questions: `requirements-discovery`
190
190
  - `scope: codebase`: `improvement-discovery`
191
- - 애매하면 `requirements-discovery`
191
+ - if ambiguous: `requirements-discovery`
192
192
 
193
- `okstra-run`을 자동으로 시작하지 않는다.
193
+ Do not auto-start `okstra-run`.
194
194
 
195
195
  ## Reporter Confirmations
196
196
 
197
- `Open Questions`에서 reporter만 답할 수 있는 row를 모은다.
197
+ Collect the rows in `Open Questions` that only the reporter can answer.
198
198
 
199
199
  - `intent-check:`
200
200
  - `conversion-block:`
201
201
 
202
- 이미 `[CONFIRMED <date> → RC-N]` marker가 있으면 pending에서 제외한다. 사용자에게 지금 답할지 묻고, 답하면 `## Reporter Confirmations`에 verbatim으로 기록한다. row는 삭제하지 않고 marker를 붙인다.
202
+ If a `[CONFIRMED <date> → RC-N]` marker already exists, exclude it from pending. Ask the user whether to answer now; if they answer, record it verbatim under `## Reporter Confirmations`. Do not delete the row — attach a marker.
203
203
 
204
- 한 run당 최대 12문항. pending이 12개를 넘으면 `conversion-block:` → `intent-check:` 순으로 상위 12개만 묻고, 나머지는 `partial`로 남긴 뒤 어떤 row가 남았는지 사용자에게 알린다.
204
+ At most 12 questions per run. If pending exceeds 12, ask only the top 12 in `conversion-block:` → `intent-check:` order, leave the rest as `partial`, then tell the user which rows remain.
205
205
 
206
- 상태값:
206
+ Status values:
207
207
 
208
- - `complete`: pending reporter-only row가 모두 답변됨. validator는 모든 `intent-check:`/`conversion-block:` row에 `[CONFIRMED …]` marker가 있는지 검사한다.
209
- - `partial`: 일부만 답변됨. validator는 최소 1개 row에 `[CONFIRMED …]` marker가 있는지 검사한다(아무것도 못 받았으면 `skipped`).
210
- - `skipped`: 사용자가 downstream phase에 넘기기로 함.
211
- - `pending`: handoff 전 상태로 보고 진행하지 않는다.
208
+ - `complete`: all pending reporter-only rows are answered. The validator checks that every `intent-check:`/`conversion-block:` row has a `[CONFIRMED …]` marker.
209
+ - `partial`: only some are answered. The validator checks that at least one row has a `[CONFIRMED …]` marker (if nothing was received, `skipped`).
210
+ - `skipped`: the user chose to defer to a downstream phase.
211
+ - `pending`: treated as a pre-handoff state; do not proceed.
212
212
 
213
- ## 검증
213
+ ## Validation
214
214
 
215
- 작성 후 handoff 메시지를 내기 전에 validator를 실행한다.
215
+ After writing, run the validator before emitting the handoff message.
216
216
 
217
- 설치본:
217
+ Installed copy:
218
218
 
219
219
  ```bash
220
220
  ~/.okstra/lib/validators/validate-brief.sh "<PROJECT_ROOT>/.okstra/briefs" --briefs-root "<PROJECT_ROOT>/.okstra/briefs"
@@ -226,19 +226,19 @@ repo checkout:
226
226
  validators/validate-brief.sh "<PROJECT_ROOT>/.okstra/briefs" --briefs-root "<PROJECT_ROOT>/.okstra/briefs"
227
227
  ```
228
228
 
229
- 실패하면 cited brief를 고치고 재실행한다. validator가 없을 때만 manual checklist로 대체한다.
230
- validator는 `Related Task Graph`가 있으면 table header, relation enum, direction enum, directed/undirected mismatch도 검사한다.
229
+ On failure, fix the cited brief and re-run. Fall back to a manual checklist only when the validator is absent.
230
+ When a `Related Task Graph` is present, the validator also checks the table header, relation enum, direction enum, and directed/undirected mismatch.
231
231
 
232
- ## 완료 메시지
232
+ ## Completion message
233
233
 
234
- 단일 brief:
234
+ Single brief:
235
235
 
236
236
  ```text
237
237
  brief saved: <abs-path>
238
238
  next: /okstra-run (recommended task-type: <phase>)
239
239
  ```
240
240
 
241
- multi-brief:
241
+ Multi-brief:
242
242
 
243
243
  ```text
244
244
  briefs saved (N):
@@ -247,12 +247,12 @@ briefs saved (N):
247
247
  next: /okstra-run
248
248
  ```
249
249
 
250
- ## 금지 패턴
250
+ ## Forbidden patterns
251
251
 
252
- - Source Material을 요약하거나 정리해서 넣기.
253
- - tracker/URL 내용을 도구 확인 없이 추측하기.
254
- - unlabelled augmentation 작성하기.
255
- - `intent-inference`를 `intent-check:` 없이 남기기.
256
- - 외부 docs/ADR에 decision file을 쓰기. okstra decision은 `<PROJECT_ROOT>/.okstra/decisions/`에만 해당한다.
257
- - child tree 전체를 silent overwrite하기.
258
- - brief 생성 직후 자동으로 `okstra-run` 시작하기.
252
+ - Summarizing or tidying Source Material before inserting it.
253
+ - Guessing tracker/URL content without tool verification.
254
+ - Writing unlabelled augmentation.
255
+ - Leaving `intent-inference` without `intent-check:`.
256
+ - Writing a decision file into external docs/ADR. okstra decisions belong only in `<PROJECT_ROOT>/.okstra/decisions/`.
257
+ - Silently overwriting an entire child tree.
258
+ - Auto-starting `okstra-run` right after brief generation.
@@ -1,89 +1,89 @@
1
1
  # okstra-container-build AI Manual
2
2
 
3
- ## 원천
3
+ ## Source
4
4
 
5
- - 스킬 원문: [`skills/okstra-container-build/SKILL.md`](../../../skills/okstra-container-build/SKILL.md)
5
+ - Skill source: [`skills/okstra-container-build/SKILL.md`](../../../skills/okstra-container-build/SKILL.md)
6
6
  - container CLI wrapper: [`src/commands/inspect/container.mjs`](../../../src/commands/inspect/container.mjs)
7
7
  - container runtime: [`scripts/okstra_ctl/container.py`](../../../scripts/okstra_ctl/container.py)
8
8
  - container registry: [`scripts/okstra_ctl/container_registry.py`](../../../scripts/okstra_ctl/container_registry.py)
9
9
  - stage integration gate: [`scripts/okstra_ctl/stage_targets.py`](../../../scripts/okstra_ctl/stage_targets.py)
10
10
 
11
- ## 목적
11
+ ## Purpose
12
12
 
13
- `okstra-container-build`는 implementation task worktree의 `docker-compose.yml`을 이용해 사용자 테스트용 container group을 관리한다. okstra는 compose group에 task/run trace label을 붙이고, tmux watcher pane으로 로그/상태를 관찰한다.
13
+ `okstra-container-build` manages a user-test container group using the `docker-compose.yml` in an implementation task worktree. okstra labels the compose group with the task/run trace and observes logs/status through a tmux watcher pane.
14
14
 
15
15
  ## sub-command
16
16
 
17
- | Sub-command | 역할 | side effect |
17
+ | Sub-command | Role | side effect |
18
18
  |---|---|---|
19
- | `up` | implementation stages를 task worktree에 통합하고 `docker compose up -d`, healthcheck poll, watcher pane attach | container 생성/시작, watcher pane 생성 |
20
- | `status` | label query 기반 running container와 watcher metadata 확인 | 읽기 |
21
- | `logs` | watcher findings dir와 watcher entries 안내 | 읽기 |
22
- | `stop-watcher` | watcher/tail tmux panes만 회수 | container 유지, pane 제거 |
23
- | `down` | label query로 container group 제거, orphan watcher panes 회수 | container 종료/제거 |
19
+ | `up` | Integrate the implementation stages into the task worktree, then `docker compose up -d`, poll healthchecks, attach the watcher pane | create/start containers, create watcher pane |
20
+ | `status` | Check running containers (by label query) plus watcher metadata | read |
21
+ | `logs` | Point at the watcher findings dir and watcher entries | read |
22
+ | `stop-watcher` | Reap the watcher/tail tmux panes only | keep containers, remove panes |
23
+ | `down` | Remove the container group by label query, reap orphan watcher panes | stop/remove containers |
24
24
 
25
25
  ## Preflight
26
26
 
27
- 단일 호출:
27
+ Single call:
28
28
 
29
29
  ```bash
30
30
  okstra preflight --runtime claude-code --json
31
31
  ```
32
32
 
33
- project setup이 없으면 `/okstra-setup` 안내 후 멈춘다. Docker daemon이 필요하다. Docker connection error가 나오면 Docker Desktop/daemon을 시작하라고 안내하고, 직접 Docker를 시작하지 않는다.
33
+ If the project is not set up, point to `/okstra-setup` and stop. A Docker daemon is required. On a Docker connection error, tell the user to start Docker Desktop/daemon; do not start Docker yourself.
34
34
 
35
- ## task-key 해석
35
+ ## task-key resolution
36
36
 
37
- 대부분 sub-command는 full task-key가 필요하다.
37
+ Most sub-commands need a full task-key.
38
38
 
39
- 1. full task-key가 있으면 그대로 사용.
40
- 2. bare task-id는 resolver 사용:
39
+ 1. If a full task-key is given, use it as-is.
40
+ 2. For a bare task-id, use the resolver:
41
41
 
42
42
  ```bash
43
43
  okstra resolve-task-key <task-id> --project-root <projectRoot> --json
44
44
  ```
45
45
 
46
- 3. multiple match면 후보를 보여주고 선택 받는다.
47
- 4. `down --all`만 task-key 없이 실행할 수 있다.
46
+ 3. On multiple matches, show the candidates and let the user pick.
47
+ 4. Only `down --all` can run without a task-key.
48
48
 
49
49
  ## intent routing
50
50
 
51
- 명확한 동사:
51
+ Clear verbs:
52
52
 
53
- - "띄워", "올려", "up": `up`
54
- - "상태", "status": `status`
55
- - "로그", "logs": `logs`
56
- - "watcher 멈춰", "stop-watcher": `stop-watcher`
57
- - "내려", "down", "종료": `down`
53
+ - "bring up/deploy", "up": `up`
54
+ - "status": `status`
55
+ - "logs": `logs`
56
+ - "stop watcher", "stop-watcher": `stop-watcher`
57
+ - "tear down", "down": `down`
58
58
 
59
- 애매하면 full facet list를 보여주고 직접 입력 option을 둔다. 여러 facet이 한 메시지에 있으면 Step 0은 한 번만 실행하고 sub-command를 순차 실행한다.
59
+ If ambiguous, show the full facet list and offer an Enter directly option. When multiple facets are in one message, run Step 0 once and execute the sub-commands sequentially.
60
60
 
61
61
  ## up
62
62
 
63
- 실행:
63
+ Run:
64
64
 
65
65
  ```bash
66
66
  okstra container up --project-root <projectRoot> --task-key <task-key>
67
67
  ```
68
68
 
69
- 전제:
69
+ Preconditions:
70
70
 
71
- - task는 implementation worktree가 registry에 있어야 한다.
72
- - worktree root에 `docker-compose.yml`이 있어야 한다.
73
- - approved plan의 모든 stage가 `done`이어야 한다. partial stage 상태를 완성 task처럼 deploy하지 않는다.
71
+ - The task must have an implementation worktree registered in the registry.
72
+ - The worktree root must contain a `docker-compose.yml`.
73
+ - Every stage of the approved plan must be `done`. Do not deploy a partial-stage state as if it were a complete task.
74
74
 
75
- 실패 메시지 처리:
75
+ Handling failure messages:
76
76
 
77
- - registry에 task worktree가 없다는 메시지: implementation phase를 먼저 실행하라고 말한다.
78
- - compose file 없음: CLI 메시지를 그대로 보여준다.
79
- - `final-verification(whole-task): stage N not done`: 해당 stage를 implementation으로 끝내야 한다고 말한다.
80
- - healthcheck 실패: failing service와 CLI가 제공한 `docker compose ... logs` line을 그대로 전달한다.
77
+ - Message that the task worktree is not in the registry: tell the user to run the implementation phase first.
78
+ - No compose file: show the CLI message verbatim.
79
+ - `final-verification(whole-task): stage N not done`: tell the user to finish that stage via implementation.
80
+ - healthcheck failure: relay the failing service and the `docker compose ... logs` line the CLI provides, verbatim.
81
81
 
82
- 성공하면 stdout JSON을 파싱해 services, watcher pane, published ports를 요약한다. 이후 관리는 `okstra container status <task-key>`와 `down <task-key>`로 한다고 안내한다. 띄운 뒤 *무엇을 확인할지*는 implementation 리포트의 §5.7.9 Manual User Test (Draft)를 가리킨다 — 그 단계와 기대 결과가 이 빌드의 수동 테스트 스크립트다.
82
+ On success, parse the stdout JSON and summarize services, watcher pane, and published ports. Tell the user that management from here is via `okstra container status <task-key>` and `down <task-key>`. For *what to verify* once it is up, point to the implementation report's §5.7.9 Manual User Test (Draft) — those steps and expected results are the manual test script for this build.
83
83
 
84
84
  ## status
85
85
 
86
- 실행:
86
+ Run:
87
87
 
88
88
  ```bash
89
89
  okstra container status --project-root <projectRoot> --task-key <task-key>
@@ -92,14 +92,14 @@ okstra container status --project-root <projectRoot> --task-key <task-key>
92
92
  stdout JSON:
93
93
 
94
94
  - `projectName`: compose project name
95
- - `containers`: run-trace label로 찾은 running containers
96
- - `watchers`: registry의 watcher metadata
95
+ - `containers`: running containers found by run-trace label
96
+ - `watchers`: watcher metadata from the registry
97
97
 
98
- alive 여부는 `containers` label query가 authoritative다. watcher registry는 lag할 수 있다. `containers`가 비어 있으면 group이 실행 중이 아니라고 말하고 `up`을 제안한다.
98
+ The `containers` label query is authoritative for whether it is alive. The watcher registry can lag. If `containers` is empty, say the group is not running and offer `up`.
99
99
 
100
100
  ## logs
101
101
 
102
- 실행:
102
+ Run:
103
103
 
104
104
  ```bash
105
105
  okstra container logs --project-root <projectRoot> --task-key <task-key>
@@ -111,49 +111,49 @@ service scope:
111
111
  okstra container logs --project-root <projectRoot> --task-key <task-key> --service <service>
112
112
  ```
113
113
 
114
- stdout JSON의 `watchersDir`, `watchers`를 보여준다. live stream은 file이 아니라 tmux watcher pane에 있다. raw compose logs가 필요하면 `status`에서 `projectName`을 확인한 뒤 사용자가 `docker compose -p <projectName> logs -f <service>`를 실행할 수 있다고 안내한다.
114
+ Show the stdout JSON's `watchersDir` and `watchers`. The live stream is in the tmux watcher pane, not a file. If raw compose logs are needed, get `projectName` from `status`, then tell the user they can run `docker compose -p <projectName> logs -f <service>`.
115
115
 
116
116
  ## stop-watcher
117
117
 
118
- 실행:
118
+ Run:
119
119
 
120
120
  ```bash
121
121
  okstra container stop-watcher --project-root <projectRoot> --task-key <task-key>
122
122
  ```
123
123
 
124
- watcher/tail panes만 제거하고 containers는 유지한다. stdout JSON의 `reapedPanes`, `note`를 요약한다. 사용자가 containers까지 내리려는 의도면 `down`으로 라우팅한다.
124
+ Remove only the watcher/tail panes and keep the containers. Summarize the stdout JSON's `reapedPanes` and `note`. If the user actually intends to bring the containers down, route to `down`.
125
125
 
126
126
  ## down
127
127
 
128
- 단일 task:
128
+ Single task:
129
129
 
130
130
  ```bash
131
131
  okstra container down --project-root <projectRoot> --task-key <task-key>
132
132
  ```
133
133
 
134
- 프로젝트 전체:
134
+ Whole project:
135
135
 
136
136
  ```bash
137
137
  okstra container down --project-root <projectRoot> --all
138
138
  ```
139
139
 
140
- 단일 task down은 task-key 해석 후 실행해도 된다. `--all`은 프로젝트의 모든 okstra container group을 내리므로 실행 전 사용자 확인을 받는다.
140
+ A single-task down is fine to run after resolving the task-key. `--all` takes down every okstra container group in the project, so confirm with the user before running it.
141
141
 
142
- stdout JSON의 `downed`, `orphanPanesReaped`를 보고한다. 각 `projectName`과 회수된 panes를 표시한다.
142
+ Report the stdout JSON's `downed` and `orphanPanesReaped`. Show each `projectName` and the reaped panes.
143
143
 
144
- ## 출력 규칙
144
+ ## Output rules
145
145
 
146
- - stdout JSON이 source of truth다.
147
- - raw `docker` 명령으로 second-guess하지 않는다. CLI가 실패했고 사용자가 manual fallback을 요청한 경우만 예외다.
148
- - resolved task-key를 heading이나 첫 줄에 표시한다.
149
- - CLI failure message는 remediation line을 포함해 그대로 보여준다.
150
- - container/service state는 JSON 값을 normalize하지 않고 보여준다.
146
+ - The stdout JSON is the source of truth.
147
+ - Do not second-guess it with raw `docker` commands. The only exception is when the CLI failed and the user asked for a manual fallback.
148
+ - Show the resolved task-key in the heading or on the first line.
149
+ - Show CLI failure messages verbatim, including the remediation line.
150
+ - Show container/service state as the JSON values, without normalizing.
151
151
 
152
- ## 금지 패턴
152
+ ## Forbidden patterns
153
153
 
154
- - Docker daemon을 직접 시작하려고 하기.
155
- - `up` 실패 원인을 추측해서 compose를 수정하기.
156
- - partial stage task를 deploy 가능한 것으로 포장하기.
157
- - watcher registry만 보고 container alive라고 판단하기.
158
- - `down --all`을 사용자 확인 없이 실행하기.
159
- - raw docker query로 CLI 결과를 임의로 덮어쓰기.
154
+ - Trying to start the Docker daemon yourself.
155
+ - Guessing the cause of an `up` failure and editing the compose file.
156
+ - Dressing up a partial-stage task as deployable.
157
+ - Judging a container as alive from the watcher registry alone.
158
+ - Running `down --all` without user confirmation.
159
+ - Overriding the CLI result arbitrarily with a raw docker query.