okstra 0.123.0 → 0.125.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 (98) hide show
  1. package/README.md +1 -0
  2. package/docs/architecture/storage-model.md +3 -1
  3. package/docs/architecture.md +16 -2
  4. package/docs/cli.md +3 -1
  5. package/docs/for-ai/README.md +41 -35
  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 +87 -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 +106 -106
  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 +6 -6
  19. package/docs/pr-template-usage.md +34 -34
  20. package/docs/project-structure-overview.md +91 -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 +33 -33
  26. package/docs/task-process/implementation.md +38 -38
  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 +1 -1
  36. package/runtime/prompts/coding-preflight/frameworks/node-server.md +1 -1
  37. package/runtime/prompts/launch.template.md +1 -1
  38. package/runtime/prompts/lead/convergence.md +10 -20
  39. package/runtime/prompts/lead/okstra-lead-contract.md +15 -17
  40. package/runtime/prompts/lead/plan-body-verification.md +18 -18
  41. package/runtime/prompts/lead/report-writer.md +46 -44
  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 +1 -1
  45. package/runtime/prompts/profiles/_implementation-executor.md +1 -1
  46. package/runtime/prompts/profiles/_implementation-verifier.md +28 -2
  47. package/runtime/prompts/profiles/error-analysis.md +2 -2
  48. package/runtime/prompts/profiles/final-verification.md +1 -1
  49. package/runtime/prompts/profiles/implementation-planning.md +13 -13
  50. package/runtime/prompts/profiles/implementation.md +2 -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 +17 -18
  54. package/runtime/python/okstra_ctl/models.py +4 -2
  55. package/runtime/python/okstra_ctl/run.py +8 -2
  56. package/runtime/python/okstra_ctl/stage_fix_carry.py +112 -0
  57. package/runtime/schemas/final-report-v1.0.schema.json +6 -6
  58. package/runtime/skills/_fragments/bash-invocation-rule.md +1 -0
  59. package/runtime/skills/_fragments/preflight-outdated-cli.md +1 -0
  60. package/runtime/skills/_fragments/python-bootstrap-note.md +1 -0
  61. package/runtime/skills/okstra-brief-gen/SKILL.md +117 -122
  62. package/runtime/skills/okstra-container-build/SKILL.md +24 -14
  63. package/runtime/skills/okstra-graphify/SKILL.md +12 -4
  64. package/runtime/skills/okstra-inspect/SKILL.md +39 -747
  65. package/runtime/skills/okstra-inspect/facets/cost.md +84 -0
  66. package/runtime/skills/okstra-inspect/facets/error-zip.md +41 -0
  67. package/runtime/skills/okstra-inspect/facets/errors.md +69 -0
  68. package/runtime/skills/okstra-inspect/facets/history.md +90 -0
  69. package/runtime/skills/okstra-inspect/facets/logs.md +89 -0
  70. package/runtime/skills/okstra-inspect/facets/recap.md +96 -0
  71. package/runtime/skills/okstra-inspect/facets/report.md +61 -0
  72. package/runtime/skills/okstra-inspect/facets/status.md +145 -0
  73. package/runtime/skills/okstra-inspect/facets/time.md +56 -0
  74. package/runtime/skills/okstra-manager/SKILL.md +1 -1
  75. package/runtime/skills/okstra-memory/SKILL.md +3 -3
  76. package/runtime/skills/okstra-pr-gen/SKILL.md +3 -3
  77. package/runtime/skills/okstra-rollup/SKILL.md +12 -6
  78. package/runtime/skills/okstra-run/SKILL.md +49 -88
  79. package/runtime/skills/okstra-schedule-gen/SKILL.md +36 -30
  80. package/runtime/skills/okstra-setup/SKILL.md +1 -1
  81. package/runtime/skills/okstra-setup/references/project-config.md +17 -16
  82. package/runtime/skills/okstra-usage/SKILL.md +5 -2
  83. package/runtime/skills/okstra-user-response/SKILL.md +15 -3
  84. package/runtime/templates/prd/brief.template.md +92 -92
  85. package/runtime/templates/project-docs/task-index.template.md +1 -1
  86. package/runtime/templates/reports/error-analysis-input.template.md +1 -1
  87. package/runtime/templates/reports/fan-out-unit.template.md +6 -6
  88. package/runtime/templates/reports/final-verification-input.template.md +6 -6
  89. package/runtime/templates/reports/implementation-input.template.md +1 -1
  90. package/runtime/templates/reports/implementation-planning-input.template.md +1 -1
  91. package/runtime/templates/reports/improvement-discovery-input.template.md +1 -1
  92. package/runtime/templates/reports/quick-input.template.md +1 -1
  93. package/runtime/templates/reports/release-handoff-input.template.md +1 -1
  94. package/runtime/templates/reports/schedule.template.md +22 -22
  95. package/runtime/templates/reports/task-brief.template.md +3 -3
  96. package/runtime/templates/reports/user-response.template.md +20 -20
  97. package/runtime/templates/worker-prompt-preamble.md +111 -13
  98. package/runtime/validators/validate-schedule.py +1 -1
@@ -1,77 +1,77 @@
1
1
  # okstra-schedule-gen AI Manual
2
2
 
3
- ## 원천
3
+ ## Source
4
4
 
5
- - 스킬 원문: [`skills/okstra-schedule-gen/SKILL.md`](../../../skills/okstra-schedule-gen/SKILL.md)
6
- - schedule 템플릿: [`templates/reports/schedule.template.md`](../../../templates/reports/schedule.template.md)
5
+ - Skill source: [`skills/okstra-schedule-gen/SKILL.md`](../../../skills/okstra-schedule-gen/SKILL.md)
6
+ - schedule template: [`templates/reports/schedule.template.md`](../../../templates/reports/schedule.template.md)
7
7
  - schedule validator: [`validators/validate-schedule.py`](../../../validators/validate-schedule.py)
8
- - workStatus inference 참조: [`skills/okstra-inspect/SKILL.md`](../../../skills/okstra-inspect/SKILL.md)
8
+ - workStatus inference reference: [`skills/okstra-inspect/SKILL.md`](../../../skills/okstra-inspect/SKILL.md)
9
9
 
10
- ## 목적
10
+ ## Purpose
11
11
 
12
- `okstra-schedule-gen`은 task-group 안의 non-done task들을 모아 클라이언트용 작업 일정 Markdown 만든다. 실행 task 시작하는 스킬이 아니며, 단일 task 분석도 아니다.
12
+ `okstra-schedule-gen` gathers the non-done tasks within a task-group and produces a client-facing work-schedule Markdown. It is not a skill for starting an execution task, and it is not a single-task analysis.
13
13
 
14
- 출력 위치:
14
+ Output location:
15
15
 
16
16
  ```text
17
17
  <PROJECT_ROOT>/.okstra/tasks/<task-group-segment>/schedule/<task-group-segment>-plan-<YYYY-MM-DD_HH-MM-SS>.md
18
18
  ```
19
19
 
20
- ## 사용 조건
20
+ ## When to Use
21
21
 
22
- 사용한다:
22
+ Use it when:
23
23
 
24
- - 사용자가 task-group 전체의 "일정", "schedule", "작업 계획표" 요청한다.
25
- - `.okstra/discovery/task-catalog.json`에 해당 task-group 있고, `done`이 아닌 task 하나 이상 있다.
24
+ - The user requests a "schedule", "work plan", or work-schedule table for an entire task-group.
25
+ - `.okstra/discovery/task-catalog.json` contains that task-group and it has at least one task that is not `done`.
26
26
 
27
- 사용하지 않는다:
27
+ Do not use it when:
28
28
 
29
- - 단일 task 상태/분석: `okstra-inspect status`
30
- - 실제 phase 실행: `okstra-run`
31
- - 이미 완료된 task-group: 파일을 만들지 않고 모든 task가 done이라고 말한다.
29
+ - Single-task status/analysis: `okstra-inspect status`
30
+ - Actual phase execution: `okstra-run`
31
+ - An already-completed task-group: do not create a file; state that all tasks are done.
32
32
 
33
33
  ## Preflight
34
34
 
35
- 단일 Bash 호출:
35
+ A single Bash call:
36
36
 
37
37
  ```bash
38
38
  okstra preflight --runtime claude-code --json
39
39
  ```
40
40
 
41
- runtime이나 project setup 없으면 `/okstra-setup` 안내 후 멈춘다.
41
+ If there is no runtime or project setup, point the user to `/okstra-setup` and stop.
42
42
 
43
- ## task-group 해석
43
+ ## Resolving the task-group
44
44
 
45
- 1. `.okstra/discovery/task-catalog.json`을 읽는다.
46
- 2. 사용자 입력 task-group lowercase하고 `[a-z0-9]` 외 문자를 제거한다.
47
- 3. catalog entry `taskGroupPathSegment`에도 같은 변환을 적용해 비교한다.
48
- 4. raw `taskGroup` fallback은 쓰지 않는다.
49
- 5. 매칭된 task `task-manifest.json`을 직접 읽는다. catalog stale 있고 manifest authoritative다.
45
+ 1. Read `.okstra/discovery/task-catalog.json`.
46
+ 2. Lowercase the user-supplied task-group and strip characters outside `[a-z0-9]`.
47
+ 3. Apply the same transform to each catalog entry's `taskGroupPathSegment` and compare.
48
+ 4. Do not fall back to the raw `taskGroup`.
49
+ 5. Read each matched task's `task-manifest.json` directly. The catalog may be stale; the manifest is authoritative.
50
50
 
51
- 0개 매칭이면 `해당 task-group 찾을 없습니다.`를 출력하고 멈춘다.
51
+ On zero matches, output `That task-group could not be found.` and stop.
52
52
 
53
53
  ## workStatus filter
54
54
 
55
- manifest에서 workStatus 확인한다. 없거나 비어 있으면 `okstra-inspect`의 `status.4` inference table을 적용한다.
55
+ Check the workStatus in each manifest. When it is missing or empty, apply `okstra-inspect`'s `status.4` inference table.
56
56
 
57
- 제외:
57
+ Exclude:
58
58
 
59
59
  - explicit `done`
60
60
  - inferred `done`
61
61
 
62
- 포함:
62
+ Include:
63
63
 
64
64
  - `todo`
65
65
  - `in-progress`
66
66
  - `blocked`
67
67
  - `phase-done`
68
- - 밖의 non-done inferred/display 상태
68
+ - other non-done inferred/display states
69
69
 
70
- 필터 0개면 schedule file 만들지 않고 `해당 task-group 모든 task가 done 상태입니다. 생성할 schedule 없습니다.`를 출력한다.
70
+ If 0 remain after filtering, do not create a schedule file; output `All tasks in this task-group are done. There is no schedule to generate.`
71
71
 
72
72
  ## per-task data extraction
73
73
 
74
- manifest에서 읽는다:
74
+ Read from the manifest:
75
75
 
76
76
  - `taskId`, `taskGroup`, `taskKey`
77
77
  - `workCategory`
@@ -81,7 +81,7 @@ manifest에서 읽는다:
81
81
  - `workStatus`
82
82
  - `latestReportPath`
83
83
 
84
- report에서 파싱한다:
84
+ Parse from the report:
85
85
 
86
86
  - Title / Problem statement
87
87
  - Solution / Architecture
@@ -90,45 +90,45 @@ report에서 파싱한다:
90
90
  - Rollback strategy
91
91
  - Effort, Risk, Priority, Scope, Repos
92
92
 
93
- report 없거나 manifest pointer stale이면 fallback:
93
+ If there is no report or the manifest pointer is stale, fall back:
94
94
 
95
- 1. `taskRootPath`를 기준으로 `runs/<taskType>/reports/final-report-*.md`에서 mtime이 최신인 파일을 찾는다.
96
- 2. 없으면 `runs/*/reports/final-report-*.md`도 본다.
97
- 3. 찾으면 parse하고 schedule task block에 fallback note 넣는다.
98
- 4. 끝까지 없으면 `[NEEDS-OKSTRA-RUN]`으로 표시하고 manifest metadata만 사용한다.
95
+ 1. From `taskRootPath`, find the newest-mtime file under `runs/<taskType>/reports/final-report-*.md`.
96
+ 2. If none, also look at `runs/*/reports/final-report-*.md`.
97
+ 3. If found, parse it and put a fallback note in the schedule task block.
98
+ 4. If still nothing, mark it `[NEEDS-OKSTRA-RUN]` and use only the manifest metadata.
99
99
 
100
- 특정 section parse 실패는 `[PARSE-ERROR: <section>]`으로 표시하고 계속한다.
100
+ Mark a specific section's parse failure as `[PARSE-ERROR: <section>]` and continue.
101
101
 
102
102
  ## client-facing audience rule
103
103
 
104
- schedule 클라이언트용 작업 계획이다. 내부 report approval, blocking decision, 사용자 확인 필요 항목을 schedule에 노출하지 않는다.
104
+ The schedule is a client-facing work plan. Do not surface the internal report's approval, blocking decisions, or items requiring user confirmation in the schedule.
105
105
 
106
- 출력에서 제거한다:
106
+ Remove from the output:
107
107
 
108
- - permission/authority 확인 step
108
+ - permission/authority confirmation steps
109
109
  - approval waiting buffer
110
110
  - stakeholder coordination
111
- - 법무/조직 sign-off
111
+ - legal/organizational sign-off
112
112
  - `Consolidated User Decision Checklist`
113
- - `#### 사용자 확인 필요 항목`
113
+ - `#### Items requiring user confirmation`
114
114
  - `Done`, `Ready?`, `Blocking Decisions` column
115
115
  - checkbox list/cell
116
116
 
117
- effort Gantt engineering duration 반영한다.
117
+ effort and Gantt reflect engineering duration only.
118
118
 
119
119
  ## phase classification
120
120
 
121
- 기본 mapping:
121
+ Default mapping:
122
122
 
123
123
  | workCategory | phase |
124
124
  |---|---|
125
- | `bugfix` | High/Med-High risk이면 Phase 1, 아니면 Phase 2 |
125
+ | `bugfix` | Phase 1 when High/Med-High risk, otherwise Phase 2 |
126
126
  | `feature` | Phase 2 |
127
127
  | `improvement` | Phase 2 |
128
128
  | `refactor` | Phase 3 |
129
129
  | `ops` | Phase 3 |
130
130
  | `docs` / `doc` | Phase 2 |
131
- | `unknown` 또는 미정의 | Phase 2, rationale note 추가 |
131
+ | `unknown` or undefined | Phase 2, add a rationale note |
132
132
 
133
133
  priority override:
134
134
 
@@ -136,16 +136,16 @@ priority override:
136
136
  - `P1`, `P2`: Phase 2
137
137
  - `P3`: Phase 3
138
138
 
139
- ambiguous하면 가장 가까운 phase 두고 rationale phase section 상단에 쓴다. rationale은 현재 validator gap으로 문서에서 책임진다.
139
+ When ambiguous, place it in the closest phase and write the rationale at the top of the phase section. This rationale is a current validator gap, so the document owns it.
140
140
 
141
141
  ## section contract
142
142
 
143
- 템플릿의 heading 순서와 spelling 따른다. `validate-schedule.py`가 section order, title suffix, metadata, field labels, enum, Gantt axis 등을 검사한다.
143
+ Follow the template's heading order and spelling. `validate-schedule.py` checks section order, title suffix, metadata, field labels, enum, Gantt axis, and more.
144
144
 
145
- top-level 계약 sections:
145
+ top-level contract sections:
146
146
 
147
147
  1. `## At a Glance`
148
- 2. `## Executive Summary` (필수 subsection `### Effort Sizing 기준` 포함 — `validate-schedule.py`가 검사)
148
+ 2. `## Executive Summary` (includes the mandatory subsection `### Effort Sizing Criteria`checked by `validate-schedule.py`)
149
149
  3. `## Task Dependency Graph`
150
150
  4. `## Phase 1: Critical Fixes`
151
151
  5. `## Phase 2: Enhancements`
@@ -157,14 +157,14 @@ top-level 계약 sections:
157
157
 
158
158
  optional sections:
159
159
 
160
- - `## Gantt Chart`: `Task Dependency Graph`와 `Phase 1` 사이.
161
- - `## Glossary`: 마지막 section. opaque code가 본문에 남을 때만 사용.
160
+ - `## Gantt Chart`: between `Task Dependency Graph` and `Phase 1`.
161
+ - `## Glossary`: last section. Use only when opaque codes remain in the body.
162
162
 
163
- phase task 없어도 heading을 유지하고 `_없음_`을 쓴다.
163
+ Keep the heading even when a phase has no task, and write `_none_`.
164
164
 
165
165
  ## top header
166
166
 
167
- 형태:
167
+ Shape:
168
168
 
169
169
  ```markdown
170
170
  # <Title> — Work Schedule
@@ -173,32 +173,32 @@ phase에 task가 없어도 heading을 유지하고 `_없음_`을 쓴다.
173
173
  > Source: okstra <mode> (<N> tasks included, <M> done excluded)
174
174
  ```
175
175
 
176
- title suffix `— Work Schedule`은 validator가 검사한다. `<project-id>`는 `task-catalog.json` 최상위 `projectId`를 우선 쓰고, 없으면 매칭 manifest `projectId`를 쓴다. 임의 생성 금지.
176
+ The validator checks the title suffix `— Work Schedule`. For `<project-id>`, prefer `task-catalog.json`'s top-level `projectId`, and if absent use the first matched manifest's `projectId`. Do not invent a value.
177
177
 
178
178
  ## At a Glance
179
179
 
180
- 다음 totals line 정확히 있어야 한다.
180
+ This totals line must be present exactly.
181
181
 
182
182
  ```markdown
183
- **총 <N>개 task / 예상 소요: <X.X> ~ <Y.Y> days (Effort 합산)**
183
+ **<N> tasks total / estimated effort: <X.X> ~ <Y.Y> days (Effort sum)**
184
184
  ```
185
185
 
186
- Effort-to-day mapping template `### Effort Sizing 기준` table SSOT다. lower/upper 합산으로 total day range 만든다.
186
+ The Effort-to-day mapping's SSOT is the template's `### Effort Sizing Criteria` table. Build the total day range by summing the lower/upper bounds.
187
187
 
188
- enum 값:
188
+ enum values:
189
189
 
190
- | Field | |
190
+ | Field | value |
191
191
  |---|---|
192
192
  | Effort | `S`, `M`, `L`, `XL`, `XXL` |
193
193
  | Priority | `P0`, `P1`, `P2`, `P3` |
194
194
  | Risk | `Very Low`, `Low`, `Medium`, `Med-High`, `High` |
195
195
  | Phase | `1`, `2`, `3` |
196
196
 
197
- `Med-High`가 canonical이다.
197
+ `Med-High` is canonical.
198
198
 
199
199
  ## per-task block
200
200
 
201
- 모든 task block `| Item | Detail |` table 가진다. field row 순서:
201
+ Every task block has a `| Item | Detail |` table. field row order:
202
202
 
203
203
  1. `**Category**`
204
204
  2. `**Priority**`
@@ -208,25 +208,25 @@ enum 값:
208
208
  6. `**Scope**`
209
209
  7. `**Repo**`
210
210
 
211
- subsection 순서:
211
+ Then the subsection order:
212
212
 
213
213
  1. `**Problem**:`
214
214
  2. `**Solution**:`
215
- 3. `**Work Breakdown**:` — 뒤에 `| Step | File | Action | Detail |` table
216
- 4. `**Verification Commands**:` — 뒤에 ` ```bash ` fenced block
215
+ 3. `**Work Breakdown**:` — followed by a `| Step | File | Action | Detail |` table
216
+ 4. `**Verification Commands**:` — followed by a ` ```bash ` fenced block
217
217
  5. `**Rollback**:`
218
218
 
219
- `[NEEDS-OKSTRA-RUN]` 또는 `[PARSE-ERROR: <section>]` task 가능한 field만 채우되 marker task heading 바로 아래 둔다.
219
+ For a `[NEEDS-OKSTRA-RUN]` or `[PARSE-ERROR: <section>]` task, fill only the available fields but place the marker right below the task heading.
220
220
 
221
221
  ## Task Dependency Graph
222
222
 
223
- dependency 없으면 literal:
223
+ When there is no dependency, literal:
224
224
 
225
225
  ```markdown
226
- _의존 정보 없음_
226
+ _none_
227
227
  ```
228
228
 
229
- dependency가 있으면 plain fenced block 사용한다. language tag를 붙이지 않는다.
229
+ When dependencies exist, use a plain fenced block. Do not attach a language tag.
230
230
 
231
231
  ````
232
232
  ```
@@ -235,28 +235,28 @@ DEV-2 -> DEV-4
235
235
  ```
236
236
  ````
237
237
 
238
- arrow는 ASCII `->`만 사용한다.
238
+ Use only the ASCII arrow `->`.
239
239
 
240
240
  ## Gantt Chart
241
241
 
242
- **directive override (최우선):** 아래 휴리스틱 적용 directive source `## Directive` section 먼저 확인한다. 해석 순서(first hit): (1) `--directive-file <abs-path>` 인자, (2) `<PROJECT_ROOT>/.okstra/tasks/<task-group-segment>/schedule/instruction-set/analysis-material.md`, (3) 없으면 휴리스틱 그대로(정상 경로경고·중단 없음). directive Gantt 렌더/생략을 지시하면 휴리스틱·skip 규칙을 덮어쓰고, 해당 section `> _Per Directive directive: <verbatim 발췌>._` 줄을 남긴다. directive day allocation·phase weight·sub-task 분해를 주면 bar 길이에 verbatim 반영한다.
242
+ **directive override (highest priority):** before applying the heuristic below, first check the directive source's `## Directive` section. Resolution order (first hit): (1) the `--directive-file <abs-path>` argument, (2) `<PROJECT_ROOT>/.okstra/tasks/<task-group-segment>/schedule/instruction-set/analysis-material.md`, (3) if none, the heuristic as-is (normal pathno warning·stop). When the directive instructs Gantt render/skip, it overrides the heuristic·skip rules, and leave one line in that section: `> _Per Directive directive: <verbatim short excerpt>._`. When the directive supplies day allocation·phase weight·sub-task decomposition, reflect it verbatim in bar length.
243
243
 
244
- 기본은 렌더한다. day signal 하나라도 있으면 rough estimate라도 chart를 만든다.
244
+ By default, render. If there is any day signal, produce a chart even as a rough estimate.
245
245
 
246
- 렌더 조건 예:
246
+ Render-condition examples:
247
247
 
248
- - 2 이상 task에 effort sizing이 있다.
249
- - 1 task라도 effort range가 있다.
250
- - source report Part/Phase/Step decomposition이 있다.
251
- - total effort 3 days 이상이다.
248
+ - 2+ tasks have effort sizing.
249
+ - Even 1 task has an effort range.
250
+ - The source report has Part/Phase/Step decomposition.
251
+ - Total effort is 3 days or more.
252
252
 
253
- skip은 모든 task XXL이고 decomposition 없거나, 모든 task에 effort decomposition 없을 때만 한다. skip하면 `Gantt Chart` 위치에 다음 blockquote를 둔다.
253
+ Skip only when every task is XXL with no decomposition, or when all tasks lack both effort and decomposition. On skip, place the following blockquote at the `Gantt Chart` position.
254
254
 
255
255
  ```markdown
256
- > _Gantt Chart 생략: <actual data를 근거로 이유>._
256
+ > _Gantt Chart skipped: <concrete reason referencing the actual data>._
257
257
  ```
258
258
 
259
- Gantt plain fenced ASCII다. Mermaid, PlantUML, Graphviz, date axis를 쓰지 않는다.
259
+ The Gantt is plain fenced ASCII. Do not use Mermaid, PlantUML, Graphviz, or a date axis.
260
260
 
261
261
  ````
262
262
  ```
@@ -269,52 +269,52 @@ Phase 2
269
269
  ```
270
270
  ````
271
271
 
272
- axis relative day count 사용한다. calendar date, weekday, "오늘 + N"을 넣지 않는다.
272
+ The axis uses relative day count only. Do not put in a calendar date, weekday, or "today + N".
273
273
 
274
- ## opaque code 처리
274
+ ## handling opaque code
275
275
 
276
- 내부 report code(`FC-5`, `UC-3`, `M2` ) 그대로 노출하지 않는다.
276
+ Do not surface internal report codes (`FC-5`, `UC-3`, `M2`, etc.) as-is.
277
277
 
278
- 선택 A: 짧은 설명으로 inline replacement.
278
+ Option A: inline replacement with a short description.
279
279
 
280
- 선택 B: 반복되는 code 많으면 마지막 `## Glossary`에 모든 code를 해석한다. glossary table header 정확히 `| Code | Description |`(영문 literal — validator가 검사). milestone code(`M1`, `M2` …) `FC-N`과 동일하게 glossary 미해석 validator fail.
280
+ Option B: when many codes recur, resolve every code in a final `## Glossary`. The glossary table header is exactly `| Code | Description |` (English literal — checked by the validator). Milestone codes (`M1`, `M2` …) also fail the validator when left unresolved in the glossary, just like `FC-N`.
281
281
 
282
- decision-item letter code(`A1`, `B2`, `C3`, `D4`) schedule에 넣지 않는다.
282
+ Do not put decision-item letter codes (`A1`, `B2`, `C3`, `D4`) in the schedule.
283
283
 
284
284
  ## validation
285
285
 
286
- 작성 완료 메시지 전에 다시 읽고 validator 실행한다.
286
+ After writing, re-read it and run the validator before the completion message.
287
287
 
288
288
  ```bash
289
289
  python3 ~/.okstra/lib/validators/validate-schedule.py <output-path>
290
290
  ```
291
291
 
292
- 설치본 validator 없으면 repo validator를 쓴다.
292
+ If the installed validator is absent, use the repo validator.
293
293
 
294
294
  ```bash
295
295
  python3 validators/validate-schedule.py <output-path>
296
296
  ```
297
297
 
298
- 실패하면 파일을 고치고 재검증한다. validator가 없을 때만 manual checklist 대체한다.
298
+ On failure, fix the file and re-validate. Fall back to a manual checklist only when there is no validator.
299
299
 
300
- ## 완료 메시지
300
+ ## completion message
301
301
 
302
302
  ```text
303
- Schedule 생성 완료: <relative-path>
304
- - 포함 task: N
305
- - 제외(done) task: M
306
- - 예상 소요: X.X ~ Y.Y days (Effort 합산)
307
- - 모드: lightweight
303
+ Schedule generated: <relative-path>
304
+ - Included tasks: N
305
+ - Excluded (done) tasks: M
306
+ - Estimated effort: X.X ~ Y.Y days (Effort sum)
307
+ - Mode: lightweight
308
308
  ```
309
309
 
310
- ## 금지 패턴
311
-
312
- - heading 한국어/프랑스어 등으로 번역하기.
313
- - `## Cumulative Timeline` 추가.
314
- - `## Effort-to-Day 매핑` 같은 extra top-level section 추가.
315
- - Gantt mermaid로 렌더하기.
316
- - Gantt axis에 calendar date 넣기.
317
- - checkbox, Done, Ready, Blocking Decisions column 만들기.
318
- - internal approval/blocker/user-decision 항목을 클라이언트 schedule에 노출하기.
319
- - report가 없다고 task 제외하기. `[NEEDS-OKSTRA-RUN]`으로 포함한다.
320
- - timestamp collision 기존 파일을 덮어쓰기. `-2`, `-3` suffix를 붙인다.
310
+ ## Forbidden patterns
311
+
312
+ - Translating a heading into Korean/French/etc.
313
+ - Adding `## Cumulative Timeline`.
314
+ - Adding an extra top-level section such as `## Effort-to-Day mapping`.
315
+ - Rendering the Gantt as mermaid.
316
+ - Putting a calendar date on the Gantt axis.
317
+ - Creating a checkbox, Done, Ready, or Blocking Decisions column.
318
+ - Surfacing internal approval/blocker/user-decision items in the client schedule.
319
+ - Excluding a task because it has no report. Include it as `[NEEDS-OKSTRA-RUN]`.
320
+ - Overwriting an existing file on a timestamp collision. Append a `-2`, `-3` suffix.
@@ -1,52 +1,52 @@
1
1
  # okstra-setup AI Manual
2
2
 
3
- ## 원천
3
+ ## Source
4
4
 
5
- - 스킬 원문: [`skills/okstra-setup/SKILL.md`](../../../skills/okstra-setup/SKILL.md)
5
+ - Skill source: [`skills/okstra-setup/SKILL.md`](../../../skills/okstra-setup/SKILL.md)
6
6
  - CLI registry: [`src/cli-registry.mjs`](../../../src/cli-registry.mjs)
7
- - project 등록 구현: `src/commands/lifecycle/setup.mjs`
8
- - install/ensure-installed 구현: `src/commands/lifecycle/install.mjs`
7
+ - project registration impl: `src/commands/lifecycle/setup.mjs`
8
+ - install/ensure-installed impl: `src/commands/lifecycle/install.mjs`
9
9
 
10
- ## 목적
10
+ ## Purpose
11
11
 
12
- `okstra-setup`은 가지를 처리한다.
12
+ `okstra-setup` handles two things.
13
13
 
14
- 1. 머신 단위 runtime 설치: `~/.okstra/`, `~/.claude/skills/`, `~/.claude/agents/`
15
- 2. 프로젝트 단위 등록: `<PROJECT_ROOT>/.okstra/project.json`
14
+ 1. Machine-level runtime install: `~/.okstra/`, `~/.claude/skills/`, `~/.claude/agents/`
15
+ 2. Project-level registration: `<PROJECT_ROOT>/.okstra/project.json`
16
16
 
17
- 일상적인 task 실행 스킬이 아니다. task 이미 준비된 상태면 `okstra-run` 또는 `okstra-inspect`로 라우팅한다.
17
+ It is not a day-to-day task-running skill. If a task is already prepared, route to `okstra-run` or `okstra-inspect`.
18
18
 
19
- ## 사용 조건
19
+ ## When to use
20
20
 
21
- 사용한다:
21
+ Use it when:
22
22
 
23
- - 사용자가 "okstra setup", "setup okstra", "initialize okstra", "okstra init", "처음 설정"을 요청한다.
24
- - `~/.okstra/version`이 없거나 오래된 것으로 보인다.
25
- - 현재 프로젝트에 `.okstra/project.json`이 없다.
23
+ - The user asks for "okstra setup", "setup okstra", "initialize okstra", "okstra init", "first time setup".
24
+ - `~/.okstra/version` is missing or looks stale.
25
+ - The current project has no `.okstra/project.json`.
26
26
 
27
- 사용하지 않는다:
27
+ Do not use it when:
28
28
 
29
- - task run 시작하려는 경우. 이때는 `okstra-run`.
30
- - status/history/report 보려는 경우. 이때는 `okstra-inspect`.
31
- - 이미 `.okstra/project.json`이 있고 day-to-day 사용만 필요한 경우.
29
+ - The user wants to start a task run. Use `okstra-run` instead.
30
+ - The user wants to view status/history/report. Use `okstra-inspect` instead.
31
+ - `.okstra/project.json` already exists and only day-to-day usage is needed.
32
32
 
33
- ## 실행 전 확인
33
+ ## Pre-run checks
34
34
 
35
- 사용자에게 Node 18+, Python 3.10+가 필요하다고 알린다. 현재 working directory okstra 메타데이터를 프로젝트 안인지 불명확하면, 프로젝트 루트를 먼저 확인한다.
35
+ Tell the user that Node 18+ and Python 3.10+ are required. If it is unclear whether the current working directory is inside the project that will host the okstra metadata, confirm the project root first.
36
36
 
37
- 설치 명령:
37
+ Install command:
38
38
 
39
39
  ```bash
40
40
  npx -y okstra@latest install --runtime claude-code
41
41
  ```
42
42
 
43
- 명령은 idempotent 취급한다. 이미 설치되어 있어도 다시 실행해 runtime, skill, agent payload 현재 package 버전과 맞춘다(agent payload = `~/.claude/agents/<worker>.md` worker 정의 + `~/.okstra/installed-agents.json` manifest). 실패하면 stderr 그대로 사용자에게 보여준다. legacy `okstra-install.sh`로 우회하지 않는다.
43
+ Treat this command as idempotent. Even if already installed, re-run it to align the runtime, skill, and agent payload with the current package version (agent payload = the `~/.claude/agents/<worker>.md` worker definitions + the `~/.okstra/installed-agents.json` manifest). If it fails, show the stderr to the user verbatim. Do not fall back to the legacy `okstra-install.sh`.
44
44
 
45
- ## 명령 호출 규칙
45
+ ## Command invocation rule
46
46
 
47
- `okstra install` 이후에는 후속 명령이 모두 `okstra` literal token으로 시작해야 한다.
47
+ After `okstra install`, every subsequent command must begin with the literal `okstra` token.
48
48
 
49
- 허용되는 형태:
49
+ Allowed forms:
50
50
 
51
51
  ```bash
52
52
  okstra check-project --json
@@ -54,87 +54,86 @@ okstra setup --yes --project-root /abs/project --project-id my-project
54
54
  okstra doctor --runtime claude-code
55
55
  ```
56
56
 
57
- 피해야 하는 형태:
57
+ Forms to avoid:
58
58
 
59
59
  - `export PYTHONPATH=...`
60
60
  - `eval "$(okstra paths --shell)"`
61
- - `$PROJECT_ROOT` 같은 shell 변수
61
+ - shell variables like `$PROJECT_ROOT`
62
62
  - `$(...)` command substitution
63
- - `if`, `&&`, `||`로 감싼 okstra 호출
63
+ - okstra calls wrapped in `if`, `&&`, `||`
64
64
 
65
- `okstra <subcmd>`가 자체적으로 Python path 부트스트랩하므로 `okstra paths --shell`은 스킬에서 쓰지 않는다. 경로가 필요하면 `okstra paths --json`을 별도 호출로 실행하고 JSON 값을 읽는다.
65
+ Because `okstra <subcmd>` bootstraps its own Python path, do not use `okstra paths --shell` in this skill. If you need a path, run `okstra paths --json` as a separate call and read the JSON value.
66
66
 
67
- ## 프로젝트 루트 해석
67
+ ## Project root resolution
68
68
 
69
- 먼저 실행:
69
+ Run first:
70
70
 
71
71
  ```bash
72
72
  okstra check-project --json
73
73
  ```
74
74
 
75
- 결과 처리:
75
+ Handle the result:
76
76
 
77
- - `ok: true`: 이미 등록된 프로젝트다. `projectRoot`, `projectJsonPath`, `projectId`를 사용자에게 보여주고 유지 여부를 확인한다.
78
- - `ok: false`, `stage: "resolve"`: 사용자에게 절대 project root 받아 `okstra check-project --cwd /abs/path --json`을 다시 실행한다.
79
- - `ok: false`, `stage: "project_json_missing"`: 정상 생성 경로로 진행한다.
80
- - 실패 stage: JSON `reason`을 그대로 보여주고, 원문이 지시하는 recovery 따른다.
77
+ - `ok: true`: already a registered project. Show `projectRoot`, `projectJsonPath`, `projectId` to the user and confirm whether to keep it.
78
+ - `ok: false`, `stage: "resolve"`: get an absolute project root from the user and re-run `okstra check-project --cwd /abs/path --json`.
79
+ - `ok: false`, `stage: "project_json_missing"`: proceed with the normal create path.
80
+ - any other failure stage: show the JSON `reason` verbatim and follow the recovery the source names.
81
81
 
82
- ## project.json 생성 또는 유지
82
+ ## Create or keep project.json
83
83
 
84
- `<PROJECT_ROOT>/.okstra/project.json`이 있으면 `projectId`와 `projectRoot`를 보여주고 유지/덮어쓰기 여부를 확인한다. 기본은 유지다. 기존 `projectId`를 바꾸려면 파일 삭제가 필요하므로 자동으로 덮어쓰지 않는다.
84
+ If `<PROJECT_ROOT>/.okstra/project.json` exists, show `projectId` and `projectRoot` and confirm whether to keep or overwrite. The default is keep. Changing the existing `projectId` requires deleting the file, so do not overwrite automatically.
85
85
 
86
- 파일이 없으면 project id 물어본다. 답변은 비어 있지 않고 alphanumeric 문자를 하나 이상 포함해야 한다. 값으로 `okstra setup --yes`를 호출하면 실패하므로 다시 묻는다.
86
+ If the file does not exist, ask for a project id. The answer must be non-empty and contain at least one alphanumeric character. Calling `okstra setup --yes` with an empty value fails, so re-ask.
87
87
 
88
- 생성 명령:
88
+ Create command:
89
89
 
90
90
  ```bash
91
91
  okstra setup --yes --project-root /abs/project --project-id my-project
92
92
  ```
93
93
 
94
- ## 선택 설정
94
+ ## Optional configuration
95
95
 
96
- 원문상 Step 3.5 사용자가 명시적으로 원할 때만 수행하는 선택 설정이다 상세 절차는 스킬 디렉터리의 `references/project-config.md` 읽는다. 기본값으로 충분하면 건너뛰고 doctor로 간다.
96
+ Per the source, Step 3.5 is optional configuration performed only when the user explicitly wants it read `references/project-config.md` in the skill directory for the detailed procedure. If the defaults are enough, skip it and go to doctor.
97
97
 
98
- 선택 설정:
98
+ Optional settings:
99
99
 
100
- - `worktreeSyncDirs`: task worktree에 symlink 프로젝트 상대 디렉터리 목록. 기본은 `.project-docs`, `.scratch`, `graphify-out`, `.claude`.
101
- - `qaCommands`: implementation verifier가 실행할 check-only lint/format/typecheck/test 명령.
102
- - `qaEnv`: Tier 3 conformance script가 사용할 replica/test DB, local app URL, env file, surface patterns.
100
+ - `worktreeSyncDirs`: a list of project-relative directories to symlink into the task worktree. The default is `.project-docs`, `.scratch`, `graphify-out`, `.claude`.
101
+ - `qaCommands`: check-only lint/format/typecheck/test commands the implementation verifier runs.
102
+ - `qaEnv`: the replica/test DB, local app URL, env file, and surface patterns the Tier 3 conformance script uses.
103
103
  - PR body template: `okstra config set pr-template-path "<path>" --scope project|global`
104
104
  - final report language: `okstra config set report-language <en|ko|auto> --scope project`
105
105
 
106
- `qaCommands.cmd`는 mutation을 암시하는 token 담으면 verifier 거부한다. deny-list 실제 권위는 `scripts/okstra_ctl/qa_commands.py`다.
106
+ If `qaCommands.cmd` contains a token implying mutation, the verifier refuses it. The actual authority for the deny-list is `scripts/okstra_ctl/qa_commands.py`.
107
107
 
108
- ## 자동 Claude 설정 symlink
108
+ ## Automatic Claude settings symlink
109
109
 
110
- `okstra setup`은 `<PROJECT_ROOT>/.claude/settings.local.json`을 `~/.okstra/templates/settings.local.json` symlink로 provision한다. 기존 regular file 있으면 `.bak.<timestamp>`로 백업한 symlink 둔다. 실패 메시지가 나오면 사용자가 기존 project-specific rule을 수동 병합해야 한다.
110
+ `okstra setup` provisions `<PROJECT_ROOT>/.claude/settings.local.json` as a symlink to `~/.okstra/templates/settings.local.json`. If an existing regular file is present, it backs it up as `.bak.<timestamp>` and then places the symlink. If a failure message appears, the user must manually merge the existing project-specific rules.
111
111
 
112
- ## 검증
112
+ ## Verify
113
113
 
114
- 마지막에 실행:
114
+ Run last:
115
115
 
116
116
  ```bash
117
117
  okstra doctor --runtime claude-code
118
118
  ```
119
119
 
120
- 모든 check OK setup 완료로 보고한다. 실패가 있으면 출력 내용을 그대로 보여주고, 재설치/스킵 여부는 사용자가 결정하게 한다.
120
+ If every check is OK, report setup complete. If any check fails, show the output verbatim and let the user decide whether to reinstall or skip.
121
121
 
122
- ## 완료 메시지
122
+ ## Completion message
123
123
 
124
- 짧게 다음 정보를 포함한다.
124
+ Keep it short and include the following.
125
125
 
126
- - runtime 위치: `~/.okstra` (설치 요약의 `version stamp: x.y.z` 줄을 함께 보여준다)
126
+ - runtime location: `~/.okstra` (also show the `version stamp: x.y.z` line from the install summary)
127
127
  - project metadata: `<PROJECT_ROOT>/.okstra/project.json`
128
128
  - `projectId`
129
- - 다음 단계: `/okstra-run`
129
+ - next step: `/okstra-run`
130
130
 
131
- ## 흔한 실패 처리
131
+ ## Common failure handling
132
132
 
133
- | 증상 | 처리 |
133
+ | Symptom | Handling |
134
134
  |---|---|
135
- | `command not found: npx` | Node 18+ 설치 안내 |
136
- | `--project-id is required` | project id 다시 물어보고 non-empty 값으로 재실행 |
137
- | `projectId mismatch` | 어떤 id canonical인지 사용자에게 확인. 자동 삭제하지 않음 |
138
- | `.okstra/` 쓰기 EACCES | ownership/writability 문제를 설명 |
139
- | `.claude/settings.local.json` symlink warning | 백업 파일과 symlink 상태를 사용자에게 보여주고 수동 병합 안내 |
140
-
135
+ | `command not found: npx` | Point to installing Node 18+ |
136
+ | `--project-id is required` | Re-ask for the project id and re-run with a non-empty value |
137
+ | `projectId mismatch` | Confirm with the user which id is canonical. Do not delete automatically |
138
+ | `.okstra/` write EACCES | Explain the ownership/writability problem |
139
+ | `.claude/settings.local.json` symlink warning | Show the backup file and symlink state to the user and guide a manual merge |