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.
- package/README.md +5 -2
- package/docs/architecture/storage-model.md +15 -1
- package/docs/architecture.md +45 -7
- package/docs/cli.md +47 -5
- package/docs/for-ai/README.md +42 -36
- package/docs/for-ai/skills/okstra-brief-gen.md +105 -105
- package/docs/for-ai/skills/okstra-container-build.md +61 -61
- package/docs/for-ai/skills/okstra-graphify.md +64 -0
- package/docs/for-ai/skills/okstra-inspect.md +86 -86
- package/docs/for-ai/skills/okstra-manager.md +32 -32
- package/docs/for-ai/skills/okstra-memory.md +49 -50
- package/docs/for-ai/skills/okstra-pr-gen.md +48 -0
- package/docs/for-ai/skills/okstra-rollup.md +58 -58
- package/docs/for-ai/skills/okstra-run.md +95 -95
- package/docs/for-ai/skills/okstra-schedule-gen.md +320 -0
- package/docs/for-ai/skills/okstra-setup.md +63 -64
- package/docs/for-ai/skills/okstra-user-response.md +48 -0
- package/docs/performance-improvement-plan-v2.md +4 -4
- package/docs/pr-template-usage.md +34 -34
- package/docs/project-structure-overview.md +92 -70
- package/docs/task-process/README.md +33 -33
- package/docs/task-process/common-flow.md +26 -26
- package/docs/task-process/error-analysis.md +20 -21
- package/docs/task-process/final-verification.md +41 -41
- package/docs/task-process/implementation-planning.md +52 -28
- package/docs/task-process/implementation.md +51 -32
- package/docs/task-process/release-handoff.md +46 -46
- package/docs/task-process/requirements-discovery.md +22 -23
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/antigravity-worker.md +4 -4
- package/runtime/agents/workers/claude-worker.md +2 -2
- package/runtime/agents/workers/codex-worker.md +4 -4
- package/runtime/agents/workers/report-writer-worker.md +4 -4
- package/runtime/bin/lib/okstra/usage.sh +3 -3
- package/runtime/prompts/coding-preflight/frameworks/node-server.md +1 -1
- package/runtime/prompts/launch.template.md +6 -3
- package/runtime/prompts/lead/convergence.md +11 -21
- package/runtime/prompts/lead/okstra-lead-contract.md +16 -18
- package/runtime/prompts/lead/plan-body-verification.md +47 -18
- package/runtime/prompts/lead/report-writer.md +50 -45
- package/runtime/prompts/lead/team-contract.md +11 -122
- package/runtime/prompts/profiles/_common-contract.md +15 -22
- package/runtime/prompts/profiles/_implementation-deliverable.md +4 -2
- package/runtime/prompts/profiles/_implementation-executor.md +6 -1
- package/runtime/prompts/profiles/_implementation-verifier.md +3 -3
- package/runtime/prompts/profiles/error-analysis.md +2 -2
- package/runtime/prompts/profiles/final-verification.md +3 -1
- package/runtime/prompts/profiles/implementation-planning.md +24 -14
- package/runtime/prompts/profiles/implementation.md +1 -1
- package/runtime/prompts/profiles/improvement-discovery.md +1 -1
- package/runtime/prompts/profiles/release-handoff.md +3 -3
- package/runtime/prompts/profiles/requirements-discovery.md +18 -18
- package/runtime/prompts/wizard/prompts.ko.json +44 -0
- package/runtime/python/okstra_ctl/codex_dispatch.py +23 -1
- package/runtime/python/okstra_ctl/design_prep.py +1462 -0
- package/runtime/python/okstra_ctl/design_surfaces.py +243 -0
- package/runtime/python/okstra_ctl/final_report_schema.py +33 -1
- package/runtime/python/okstra_ctl/implementation_stage.py +35 -0
- package/runtime/python/okstra_ctl/incremental_carry.py +294 -21
- package/runtime/python/okstra_ctl/incremental_scope.py +51 -5
- package/runtime/python/okstra_ctl/material.py +1 -1
- package/runtime/python/okstra_ctl/model_discovery.py +98 -0
- package/runtime/python/okstra_ctl/models.py +8 -3
- package/runtime/python/okstra_ctl/render.py +5 -0
- package/runtime/python/okstra_ctl/run.py +53 -5
- package/runtime/python/okstra_ctl/user_response.py +67 -2
- package/runtime/python/okstra_ctl/wizard.py +283 -3
- package/runtime/python/okstra_token_usage/report.py +11 -0
- package/runtime/schemas/final-report-v1.0.schema.json +336 -0
- package/runtime/skills/_fragments/bash-invocation-rule.md +1 -0
- package/runtime/skills/_fragments/preflight-outdated-cli.md +1 -0
- package/runtime/skills/_fragments/python-bootstrap-note.md +1 -0
- package/runtime/skills/okstra-brief-gen/SKILL.md +117 -122
- package/runtime/skills/okstra-container-build/SKILL.md +24 -14
- package/runtime/skills/okstra-graphify/SKILL.md +12 -4
- package/runtime/skills/okstra-inspect/SKILL.md +105 -99
- package/runtime/skills/okstra-manager/SKILL.md +1 -1
- package/runtime/skills/okstra-memory/SKILL.md +3 -3
- package/runtime/skills/okstra-rollup/SKILL.md +12 -6
- package/runtime/skills/okstra-run/SKILL.md +49 -88
- package/runtime/skills/{okstra-schedule → okstra-schedule-gen}/SKILL.md +38 -32
- package/runtime/skills/okstra-setup/SKILL.md +1 -1
- package/runtime/skills/okstra-setup/references/project-config.md +17 -16
- package/runtime/skills/okstra-usage/SKILL.md +5 -2
- package/runtime/skills/okstra-user-response/SKILL.md +23 -9
- package/runtime/templates/prd/brief.template.md +92 -92
- package/runtime/templates/reports/error-analysis-input.template.md +1 -1
- package/runtime/templates/reports/fan-out-unit.template.md +6 -6
- package/runtime/templates/reports/final-report.template.md +67 -0
- package/runtime/templates/reports/final-verification-input.template.md +6 -6
- package/runtime/templates/reports/i18n/en.json +31 -0
- package/runtime/templates/reports/i18n/ko.json +31 -0
- package/runtime/templates/reports/implementation-input.template.md +1 -1
- package/runtime/templates/reports/implementation-planning-input.template.md +1 -1
- package/runtime/templates/reports/improvement-discovery-input.template.md +1 -1
- package/runtime/templates/reports/quick-input.template.md +1 -1
- package/runtime/templates/reports/release-handoff-input.template.md +1 -1
- package/runtime/templates/reports/schedule.template.md +22 -22
- package/runtime/templates/reports/task-brief.template.md +3 -3
- package/runtime/templates/reports/user-response.template.md +20 -20
- package/runtime/templates/worker-prompt-preamble.md +111 -13
- package/runtime/validators/validate-run.py +426 -5
- package/runtime/validators/validate-schedule.py +5 -5
- package/src/cli-registry.mjs +7 -0
- package/src/commands/inspect/design-prep.mjs +23 -0
- package/src/lib/skill-catalog.mjs +2 -1
- package/docs/for-ai/skills/okstra-schedule.md +0 -320
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
# okstra-schedule AI Manual
|
|
2
|
-
|
|
3
|
-
## 원천
|
|
4
|
-
|
|
5
|
-
- 스킬 원문: [`skills/okstra-schedule/SKILL.md`](../../../skills/okstra-schedule/SKILL.md)
|
|
6
|
-
- schedule 템플릿: [`templates/reports/schedule.template.md`](../../../templates/reports/schedule.template.md)
|
|
7
|
-
- schedule validator: [`validators/validate-schedule.py`](../../../validators/validate-schedule.py)
|
|
8
|
-
- workStatus inference 참조: [`skills/okstra-inspect/SKILL.md`](../../../skills/okstra-inspect/SKILL.md)
|
|
9
|
-
|
|
10
|
-
## 목적
|
|
11
|
-
|
|
12
|
-
`okstra-schedule`은 task-group 안의 non-done task들을 모아 클라이언트용 작업 일정 Markdown을 만든다. 실행 task를 시작하는 스킬이 아니며, 단일 task 분석도 아니다.
|
|
13
|
-
|
|
14
|
-
출력 위치:
|
|
15
|
-
|
|
16
|
-
```text
|
|
17
|
-
<PROJECT_ROOT>/.okstra/tasks/<task-group-segment>/schedule/<task-group-segment>-plan-<YYYY-MM-DD_HH-MM-SS>.md
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## 사용 조건
|
|
21
|
-
|
|
22
|
-
사용한다:
|
|
23
|
-
|
|
24
|
-
- 사용자가 task-group 전체의 "일정", "schedule", "작업 계획표"를 요청한다.
|
|
25
|
-
- `.okstra/discovery/task-catalog.json`에 해당 task-group이 있고, `done`이 아닌 task가 하나 이상 있다.
|
|
26
|
-
|
|
27
|
-
사용하지 않는다:
|
|
28
|
-
|
|
29
|
-
- 단일 task 상태/분석: `okstra-inspect status`
|
|
30
|
-
- 실제 phase 실행: `okstra-run`
|
|
31
|
-
- 이미 완료된 task-group: 파일을 만들지 않고 모든 task가 done이라고 말한다.
|
|
32
|
-
|
|
33
|
-
## Preflight
|
|
34
|
-
|
|
35
|
-
단일 Bash 호출:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
okstra preflight --runtime claude-code --json
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
runtime이나 project setup이 없으면 `/okstra-setup` 안내 후 멈춘다.
|
|
42
|
-
|
|
43
|
-
## task-group 해석
|
|
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다.
|
|
50
|
-
|
|
51
|
-
0개 매칭이면 `해당 task-group을 찾을 수 없습니다.`를 출력하고 멈춘다.
|
|
52
|
-
|
|
53
|
-
## workStatus filter
|
|
54
|
-
|
|
55
|
-
각 manifest에서 workStatus를 확인한다. 없거나 비어 있으면 `okstra-inspect`의 `status.4` inference table을 적용한다.
|
|
56
|
-
|
|
57
|
-
제외:
|
|
58
|
-
|
|
59
|
-
- explicit `done`
|
|
60
|
-
- inferred `done`
|
|
61
|
-
|
|
62
|
-
포함:
|
|
63
|
-
|
|
64
|
-
- `todo`
|
|
65
|
-
- `in-progress`
|
|
66
|
-
- `blocked`
|
|
67
|
-
- `phase-done`
|
|
68
|
-
- 그 밖의 non-done inferred/display 상태
|
|
69
|
-
|
|
70
|
-
필터 후 0개면 schedule file을 만들지 않고 `해당 task-group의 모든 task가 done 상태입니다. 생성할 schedule이 없습니다.`를 출력한다.
|
|
71
|
-
|
|
72
|
-
## per-task data extraction
|
|
73
|
-
|
|
74
|
-
manifest에서 읽는다:
|
|
75
|
-
|
|
76
|
-
- `taskId`, `taskGroup`, `taskKey`
|
|
77
|
-
- `workCategory`
|
|
78
|
-
- `workflow.currentPhase`
|
|
79
|
-
- `workflow.currentPhaseState`
|
|
80
|
-
- `taskType`
|
|
81
|
-
- `workStatus`
|
|
82
|
-
- `latestReportPath`
|
|
83
|
-
|
|
84
|
-
report에서 파싱한다:
|
|
85
|
-
|
|
86
|
-
- Title / Problem statement
|
|
87
|
-
- Solution / Architecture
|
|
88
|
-
- Work Breakdown
|
|
89
|
-
- Verification Commands
|
|
90
|
-
- Rollback strategy
|
|
91
|
-
- Effort, Risk, Priority, Scope, Repos
|
|
92
|
-
|
|
93
|
-
report가 없거나 manifest pointer가 stale이면 fallback:
|
|
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만 사용한다.
|
|
99
|
-
|
|
100
|
-
특정 section parse 실패는 `[PARSE-ERROR: <section>]`으로 표시하고 계속한다.
|
|
101
|
-
|
|
102
|
-
## client-facing audience rule
|
|
103
|
-
|
|
104
|
-
schedule은 클라이언트용 작업 계획이다. 내부 report의 approval, blocking decision, 사용자 확인 필요 항목을 schedule에 노출하지 않는다.
|
|
105
|
-
|
|
106
|
-
출력에서 제거한다:
|
|
107
|
-
|
|
108
|
-
- permission/authority 확인 step
|
|
109
|
-
- approval waiting buffer
|
|
110
|
-
- stakeholder coordination
|
|
111
|
-
- 법무/조직 sign-off
|
|
112
|
-
- `Consolidated User Decision Checklist`
|
|
113
|
-
- `#### 사용자 확인 필요 항목`
|
|
114
|
-
- `Done`, `Ready?`, `Blocking Decisions` column
|
|
115
|
-
- checkbox list/cell
|
|
116
|
-
|
|
117
|
-
effort와 Gantt는 engineering duration만 반영한다.
|
|
118
|
-
|
|
119
|
-
## phase classification
|
|
120
|
-
|
|
121
|
-
기본 mapping:
|
|
122
|
-
|
|
123
|
-
| workCategory | phase |
|
|
124
|
-
|---|---|
|
|
125
|
-
| `bugfix` | High/Med-High risk이면 Phase 1, 아니면 Phase 2 |
|
|
126
|
-
| `feature` | Phase 2 |
|
|
127
|
-
| `improvement` | Phase 2 |
|
|
128
|
-
| `refactor` | Phase 3 |
|
|
129
|
-
| `ops` | Phase 3 |
|
|
130
|
-
| `docs` / `doc` | Phase 2 |
|
|
131
|
-
| `unknown` 또는 미정의 | Phase 2, rationale note 추가 |
|
|
132
|
-
|
|
133
|
-
priority override:
|
|
134
|
-
|
|
135
|
-
- `P0`: Phase 1
|
|
136
|
-
- `P1`, `P2`: Phase 2
|
|
137
|
-
- `P3`: Phase 3
|
|
138
|
-
|
|
139
|
-
ambiguous하면 가장 가까운 phase에 두고 rationale을 phase section 상단에 쓴다. 이 rationale은 현재 validator gap으로 문서에서 책임진다.
|
|
140
|
-
|
|
141
|
-
## section contract
|
|
142
|
-
|
|
143
|
-
템플릿의 heading 순서와 spelling을 따른다. `validate-schedule.py`가 section order, title suffix, metadata, field labels, enum, Gantt axis 등을 검사한다.
|
|
144
|
-
|
|
145
|
-
top-level 계약 sections:
|
|
146
|
-
|
|
147
|
-
1. `## At a Glance`
|
|
148
|
-
2. `## Executive Summary` (필수 subsection `### Effort Sizing 기준` 포함 — `validate-schedule.py`가 검사)
|
|
149
|
-
3. `## Task Dependency Graph`
|
|
150
|
-
4. `## Phase 1: Critical Fixes`
|
|
151
|
-
5. `## Phase 2: Enhancements`
|
|
152
|
-
6. `## Phase 3: Architecture`
|
|
153
|
-
7. `## Execution Priority Matrix`
|
|
154
|
-
8. `## Cross-Task Dependencies & Shared Concerns`
|
|
155
|
-
9. `## Risk Mitigation Strategy`
|
|
156
|
-
10. `## Recommended Immediate Actions`
|
|
157
|
-
|
|
158
|
-
optional sections:
|
|
159
|
-
|
|
160
|
-
- `## Gantt Chart`: `Task Dependency Graph`와 `Phase 1` 사이.
|
|
161
|
-
- `## Glossary`: 마지막 section. opaque code가 본문에 남을 때만 사용.
|
|
162
|
-
|
|
163
|
-
phase에 task가 없어도 heading을 유지하고 `_없음_`을 쓴다.
|
|
164
|
-
|
|
165
|
-
## top header
|
|
166
|
-
|
|
167
|
-
형태:
|
|
168
|
-
|
|
169
|
-
```markdown
|
|
170
|
-
# <Title> — Work Schedule
|
|
171
|
-
|
|
172
|
-
> Generated: <YYYY-MM-DD HH:MM> | Project: <project-id> | Task Group: <task-group>
|
|
173
|
-
> Source: okstra <mode> (<N> tasks included, <M> done excluded)
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
title suffix `— Work Schedule`은 validator가 검사한다. `<project-id>`는 `task-catalog.json` 최상위 `projectId`를 우선 쓰고, 없으면 첫 매칭 manifest의 `projectId`를 쓴다. 임의 값 생성 금지.
|
|
177
|
-
|
|
178
|
-
## At a Glance
|
|
179
|
-
|
|
180
|
-
다음 totals line이 정확히 있어야 한다.
|
|
181
|
-
|
|
182
|
-
```markdown
|
|
183
|
-
**총 <N>개 task / 예상 소요: <X.X> ~ <Y.Y> days (Effort 합산)**
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
Effort-to-day mapping은 template의 `### Effort Sizing 기준` table이 SSOT다. lower/upper 합산으로 total day range를 만든다.
|
|
187
|
-
|
|
188
|
-
enum 값:
|
|
189
|
-
|
|
190
|
-
| Field | 값 |
|
|
191
|
-
|---|---|
|
|
192
|
-
| Effort | `S`, `M`, `L`, `XL`, `XXL` |
|
|
193
|
-
| Priority | `P0`, `P1`, `P2`, `P3` |
|
|
194
|
-
| Risk | `Very Low`, `Low`, `Medium`, `Med-High`, `High` |
|
|
195
|
-
| Phase | `1`, `2`, `3` |
|
|
196
|
-
|
|
197
|
-
`Med-High`가 canonical이다.
|
|
198
|
-
|
|
199
|
-
## per-task block
|
|
200
|
-
|
|
201
|
-
모든 task block은 `| Item | Detail |` table을 가진다. field row 순서:
|
|
202
|
-
|
|
203
|
-
1. `**Category**`
|
|
204
|
-
2. `**Priority**`
|
|
205
|
-
3. `**Effort**`
|
|
206
|
-
4. `**Status**`
|
|
207
|
-
5. `**Risk**`
|
|
208
|
-
6. `**Scope**`
|
|
209
|
-
7. `**Repo**`
|
|
210
|
-
|
|
211
|
-
그 뒤 subsection 순서:
|
|
212
|
-
|
|
213
|
-
1. `**Problem**:`
|
|
214
|
-
2. `**Solution**:`
|
|
215
|
-
3. `**Work Breakdown**:` — 뒤에 `| Step | File | Action | Detail |` table
|
|
216
|
-
4. `**Verification Commands**:` — 뒤에 ` ```bash ` fenced block
|
|
217
|
-
5. `**Rollback**:`
|
|
218
|
-
|
|
219
|
-
`[NEEDS-OKSTRA-RUN]` 또는 `[PARSE-ERROR: <section>]` task는 가능한 field만 채우되 marker를 task heading 바로 아래 둔다.
|
|
220
|
-
|
|
221
|
-
## Task Dependency Graph
|
|
222
|
-
|
|
223
|
-
dependency가 없으면 literal:
|
|
224
|
-
|
|
225
|
-
```markdown
|
|
226
|
-
_의존 정보 없음_
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
dependency가 있으면 plain fenced block을 사용한다. language tag를 붙이지 않는다.
|
|
230
|
-
|
|
231
|
-
````
|
|
232
|
-
```
|
|
233
|
-
DEV-1 -> DEV-2, DEV-3
|
|
234
|
-
DEV-2 -> DEV-4
|
|
235
|
-
```
|
|
236
|
-
````
|
|
237
|
-
|
|
238
|
-
arrow는 ASCII `->`만 사용한다.
|
|
239
|
-
|
|
240
|
-
## Gantt Chart
|
|
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 반영한다.
|
|
243
|
-
|
|
244
|
-
기본은 렌더한다. day signal이 하나라도 있으면 rough estimate라도 chart를 만든다.
|
|
245
|
-
|
|
246
|
-
렌더 조건 예:
|
|
247
|
-
|
|
248
|
-
- 2개 이상 task에 effort sizing이 있다.
|
|
249
|
-
- 1개 task라도 effort range가 있다.
|
|
250
|
-
- source report에 Part/Phase/Step decomposition이 있다.
|
|
251
|
-
- total effort가 3 days 이상이다.
|
|
252
|
-
|
|
253
|
-
skip은 모든 task가 XXL이고 decomposition이 없거나, 모든 task에 effort와 decomposition이 없을 때만 한다. skip하면 `Gantt Chart` 위치에 다음 blockquote를 둔다.
|
|
254
|
-
|
|
255
|
-
```markdown
|
|
256
|
-
> _Gantt Chart 생략: <actual data를 근거로 한 이유>._
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
Gantt는 plain fenced ASCII다. Mermaid, PlantUML, Graphviz, date axis를 쓰지 않는다.
|
|
260
|
-
|
|
261
|
-
````
|
|
262
|
-
```
|
|
263
|
-
Day: 1 5 10 15 20
|
|
264
|
-
| | | | |
|
|
265
|
-
Phase 1
|
|
266
|
-
DEV-1 (M) ██████ ! crit
|
|
267
|
-
Phase 2
|
|
268
|
-
DEV-2 (L) ██████░░ est
|
|
269
|
-
```
|
|
270
|
-
````
|
|
271
|
-
|
|
272
|
-
axis는 relative day count만 사용한다. calendar date, weekday, "오늘 + N"을 넣지 않는다.
|
|
273
|
-
|
|
274
|
-
## opaque code 처리
|
|
275
|
-
|
|
276
|
-
내부 report code(`FC-5`, `UC-3`, `M2` 등)는 그대로 노출하지 않는다.
|
|
277
|
-
|
|
278
|
-
선택 A: 짧은 설명으로 inline replacement.
|
|
279
|
-
|
|
280
|
-
선택 B: 반복되는 code가 많으면 마지막 `## Glossary`에 모든 code를 해석한다. glossary table header는 정확히 `| Code | Description |`(영문 literal — validator가 검사). milestone code(`M1`, `M2` …)도 `FC-N`과 동일하게 glossary 미해석 시 validator fail.
|
|
281
|
-
|
|
282
|
-
decision-item letter code(`A1`, `B2`, `C3`, `D4`)는 schedule에 넣지 않는다.
|
|
283
|
-
|
|
284
|
-
## validation
|
|
285
|
-
|
|
286
|
-
작성 후 완료 메시지 전에 다시 읽고 validator를 실행한다.
|
|
287
|
-
|
|
288
|
-
```bash
|
|
289
|
-
python3 ~/.okstra/lib/validators/validate-schedule.py <output-path>
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
설치본 validator가 없으면 repo validator를 쓴다.
|
|
293
|
-
|
|
294
|
-
```bash
|
|
295
|
-
python3 validators/validate-schedule.py <output-path>
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
실패하면 파일을 고치고 재검증한다. validator가 없을 때만 manual checklist로 대체한다.
|
|
299
|
-
|
|
300
|
-
## 완료 메시지
|
|
301
|
-
|
|
302
|
-
```text
|
|
303
|
-
Schedule 생성 완료: <relative-path>
|
|
304
|
-
- 포함 task: N개
|
|
305
|
-
- 제외(done) task: M개
|
|
306
|
-
- 예상 소요: X.X ~ Y.Y days (Effort 합산)
|
|
307
|
-
- 모드: lightweight
|
|
308
|
-
```
|
|
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를 붙인다.
|