okstra 0.123.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 (82) hide show
  1. package/README.md +1 -0
  2. package/docs/architecture/storage-model.md +1 -1
  3. package/docs/architecture.md +11 -1
  4. package/docs/cli.md +2 -0
  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 +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 +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 +4 -4
  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/prompts/coding-preflight/frameworks/node-server.md +1 -1
  36. package/runtime/prompts/launch.template.md +1 -1
  37. package/runtime/prompts/lead/convergence.md +10 -20
  38. package/runtime/prompts/lead/okstra-lead-contract.md +14 -16
  39. package/runtime/prompts/lead/plan-body-verification.md +18 -18
  40. package/runtime/prompts/lead/report-writer.md +43 -44
  41. package/runtime/prompts/lead/team-contract.md +11 -122
  42. package/runtime/prompts/profiles/_common-contract.md +15 -22
  43. package/runtime/prompts/profiles/_implementation-deliverable.md +1 -1
  44. package/runtime/prompts/profiles/_implementation-executor.md +1 -1
  45. package/runtime/prompts/profiles/_implementation-verifier.md +2 -2
  46. package/runtime/prompts/profiles/error-analysis.md +2 -2
  47. package/runtime/prompts/profiles/final-verification.md +1 -1
  48. package/runtime/prompts/profiles/implementation-planning.md +13 -13
  49. package/runtime/prompts/profiles/implementation.md +1 -1
  50. package/runtime/prompts/profiles/improvement-discovery.md +1 -1
  51. package/runtime/prompts/profiles/release-handoff.md +3 -3
  52. package/runtime/prompts/profiles/requirements-discovery.md +18 -18
  53. package/runtime/skills/_fragments/bash-invocation-rule.md +1 -0
  54. package/runtime/skills/_fragments/preflight-outdated-cli.md +1 -0
  55. package/runtime/skills/_fragments/python-bootstrap-note.md +1 -0
  56. package/runtime/skills/okstra-brief-gen/SKILL.md +117 -122
  57. package/runtime/skills/okstra-container-build/SKILL.md +24 -14
  58. package/runtime/skills/okstra-graphify/SKILL.md +12 -4
  59. package/runtime/skills/okstra-inspect/SKILL.md +104 -98
  60. package/runtime/skills/okstra-manager/SKILL.md +1 -1
  61. package/runtime/skills/okstra-memory/SKILL.md +3 -3
  62. package/runtime/skills/okstra-rollup/SKILL.md +12 -6
  63. package/runtime/skills/okstra-run/SKILL.md +49 -88
  64. package/runtime/skills/okstra-schedule-gen/SKILL.md +36 -30
  65. package/runtime/skills/okstra-setup/SKILL.md +1 -1
  66. package/runtime/skills/okstra-setup/references/project-config.md +17 -16
  67. package/runtime/skills/okstra-usage/SKILL.md +5 -2
  68. package/runtime/skills/okstra-user-response/SKILL.md +15 -3
  69. package/runtime/templates/prd/brief.template.md +92 -92
  70. package/runtime/templates/reports/error-analysis-input.template.md +1 -1
  71. package/runtime/templates/reports/fan-out-unit.template.md +6 -6
  72. package/runtime/templates/reports/final-verification-input.template.md +6 -6
  73. package/runtime/templates/reports/implementation-input.template.md +1 -1
  74. package/runtime/templates/reports/implementation-planning-input.template.md +1 -1
  75. package/runtime/templates/reports/improvement-discovery-input.template.md +1 -1
  76. package/runtime/templates/reports/quick-input.template.md +1 -1
  77. package/runtime/templates/reports/release-handoff-input.template.md +1 -1
  78. package/runtime/templates/reports/schedule.template.md +22 -22
  79. package/runtime/templates/reports/task-brief.template.md +3 -3
  80. package/runtime/templates/reports/user-response.template.md +20 -20
  81. package/runtime/templates/worker-prompt-preamble.md +111 -13
  82. package/runtime/validators/validate-schedule.py +1 -1
package/README.md CHANGED
@@ -211,6 +211,7 @@ Major workflow changes added to `main` after 0.8.0:
211
211
  - **Profile worker-roster validation** — `--workers <csv>` and the okstra-run Step 6 worker prompt accept only the worker IDs declared in the selected profile's `Required workers:` block. Requesting a worker absent from the profile—for example, `codex` or `antigravity` for `release-handoff`—fails with a clear error, and the interactive prompt shows only workers accepted by that profile.
212
212
  - **Experimental Codex lead adapter** — `okstra codex-run <render-bundle args...>` prepares a `leadRuntime=codex` task bundle without launching Claude Code. `okstra codex-dispatch --project-root <dir> --run-manifest <path>` then executes the supported Codex-side roster subset: Codex and Antigravity CLI workers by default, with a Codex report writer available through `--enable-codex-report-writer --report-writer-codex-model <model>`. A successful Codex report-writer dispatch performs token/cost substitution, HTML view rendering, follow-up stub generation, and run validation in order. It shares the Claude lead path's manifest and schema and does not clone the project into a Codex-specific fork.
213
213
  - **Multi-stage `implementation-planning` / `implementation`** — `implementation-planning` always produces a Stage Map and N stage sections. Each stage has no more than six steps, and stages with `depends-on (none)` can be implemented concurrently in separate `implementation` runs. Each `implementation` invocation runs a single stage, selected with `--stage <auto|N>`, and creates an evidence sidecar at `carry/stage-<N>.json` for automatic carry-in to the next stage. The `implementation-planning` run directory accumulates `consumers.jsonl` reverse links that record which run consumed each stage.
214
+ - **AI-prepared design preparation (implementation-planning → implementation)** — `implementation-planning` detects which stages need design input (domain contract, DB/table schema, external interface, transaction/consistency, transformation mapping, lifecycle, rollout/observability, manual user test) and has the AI draft a concrete proposal first, instead of handing the user an empty design document. Each item is assessed as `ready`, `provisional`, `blocked`, or `not-applicable`; a simple task may declare `no-design-inputs`. Phase 7 materializes an Okstra-owned request under `design-prep-requests/`, and `okstra design-prep <list|show|write>` or the okstra-run wizard records the confirmed answer as an **append-only** revision under `design-prep-inputs/`—neither path ever edits the approved planning snapshot. Before creating its worktree, `implementation` resolves only the items its selected stage cites in `stageRefs`: safe `provisional` assumptions are injected into the executor prompt so work proceeds, while an unsafe open decision makes only that stage wait or replan. A markerless legacy plan continues with a `legacy-unassessed` warning. Storage authorities: [`docs/architecture/storage-model.md`](docs/architecture/storage-model.md). CLI: [`docs/cli.md#okstra-design-prep`](docs/cli.md#okstra-design-prep).
214
215
  - **Phase 6 plan-body verification (implementation-planning only)** — Immediately after the report-writer worker drafts the final report and before the user approval gate, the lead performs one post-verification round. It extracts `P-Opt-*`, `P-Step-*`, `P-Dep-*`, `P-Val-*`, and `P-Rb-*` plan items from the synthesized `## 5.5` implementation plan deliverables and asks every analyzer worker for an `AGREE`, `DISAGREE(a-e)`, or `SUPPLEMENT` verdict. The aggregate result is `passed`, `passed-with-dissent`, `blocked-by-disagreement`, or `aborted-non-result`. The frontmatter `approved` field is always published as `false`; a blocking result keeps it false and becomes a row in `## 1. Clarification Items`. For fast iteration, opt out with `--no-plan-verification`. Contract details: the "Plan-body verification mode" section of [`prompts/lead/convergence.md`](prompts/lead/convergence.md) and [`docs/cli.md#--no-plan-verification`](docs/cli.md#--no-plan-verification).
215
216
  - **Brief as translation layer + Step 6.5 reporter batch confirmation** — `okstra-brief-gen` converts external input—an issue ticket, requirements document, or user message—verbatim and marks okstra-added content as labeled augmentation. Step 6.5 asks the user to confirm in one batch whether that conversion changed meaning and records the result in `Reporter Confirmations`. Every analysis profile requires this section before phase analysis begins; `validators/validate-brief.py` enforces the requirement.
216
217
  - **Artifact-home rule (`.okstra/`)** — `<project>/.okstra/` is the only project artifact root owned by okstra. Anything outside this root is not okstra memory and may be read only when explicitly cited in Source Material or Reporter Confirmations. Writing outside the root requires the same explicit requested path. Internal equivalents are `glossary.md` for terminology and `decisions/<NNNN>-<slug>.md` for decision records, evaluated during `implementation-planning`.
@@ -1,6 +1,6 @@
1
1
  # Storage model & on-disk contracts
2
2
 
3
- > Detailed storage and contract section from [`docs/kr/architecture.md`](../architecture.md). This section was split out after the main document exceeded 1,000 lines.
3
+ > Detailed storage and contract section from [`docs/architecture.md`](../architecture.md). This section was split out after the main document exceeded 1,000 lines.
4
4
 
5
5
  ## Storage model
6
6
 
@@ -225,6 +225,16 @@ implementation-planning Phase 6
225
225
 
226
226
  Resolution is stage-scoped: only items whose `stageRefs` include the selected stage participate, so an unsafe open decision blocks that stage rather than unrelated ready stages. `no-design-inputs` resolves to `proceed`. Plans created before the `implementation-design-prep-v1` report contract also proceed with a `legacy-unassessed` warning and are not rewritten.
227
227
 
228
+ ### Clarification & decision-capture discipline
229
+
230
+ okstra runs a single cross-phase discipline for turning open questions into resolved decisions and durable memory. It is not one module — it is enforced at three sites that share one vocabulary, deliberately split across an interactive layer and a headless layer:
231
+
232
+ - **Interactive sharpening (bounded)** — `skills/okstra-brief-gen/SKILL.md` Step 4 asks one question at a time, each carrying a recommended answer, resolving facts from the codebase before asking. It is intentionally a *bounded* pass, not a decision-making interview: brief is a pre-discovery artifact, so the deep decision walk is pushed downstream.
233
+ - **Headless decision-tree walk** — the `requirements-discovery` and `implementation-planning` profiles walk the decision tree one branch at a time, emitting a static `Clarification Items` table (recommended answer `(a)` + alternatives `(b) (c)`) rather than a live interview, because these phases are headless batch runs. Facts answerable by `Read` / `Grep` are resolved with `path:line` evidence and never escalated.
234
+ - **Decision capture** — resolved terminology becomes okstra memory at `<PROJECT_ROOT>/.okstra/glossary.md` (approval-gated, `okstra-brief-gen` Step 4.5). A decision is recorded as `<PROJECT_ROOT>/.okstra/decisions/<NNNN>-<slug>.md` only when it is hard to reverse, surprising without context, and the result of a real trade-off; `implementation-planning` is the sole owner of that evaluation and `validators/validate-run.py` enforces materialization.
235
+
236
+ When changing any one site, keep the shared vocabulary (recommended-answer, codebase-first, glossary, decision-record) aligned across all three so the discipline does not drift.
237
+
228
238
  ### Concurrency
229
239
 
230
240
  Two types of file locks handle all concurrency.
@@ -596,7 +606,7 @@ Approval format (code truth: `APPROVED_FRONTMATTER_PATTERN` in `scripts/okstra_c
596
606
  - Exactly one line inside the final report's leading `---` YAML fence: `approved: true` or `approved: false`
597
607
  - Case-insensitive. The report writer always publishes `approved: false`; implementation becomes available after the user toggles it to `true`
598
608
 
599
- To treat the CLI invocation itself as approval without editing the approval line directly, add the `--approve` flag. okstra toggles the `approved` field in the `--approved-plan` file's frontmatter to `true`, appends an audit line, and continues into the implementation phase (the former `--ack-approved` alias was removed in 0.8.0). See [`docs/kr/cli.md`](cli.md#--approve) for details.
609
+ To treat the CLI invocation itself as approval without editing the approval line directly, add the `--approve` flag. okstra toggles the `approved` field in the `--approved-plan` file's frontmatter to `true`, appends an audit line, and continues into the implementation phase (the former `--ack-approved` alias was removed in 0.8.0). See [`docs/cli.md`](cli.md#--approve) for details.
600
610
 
601
611
  ```bash
602
612
  scripts/okstra.sh --task-type implementation --workers claude,codex,antigravity --project-id <project-id> --task-group <task-group> --task-id <task-id> --task-brief <brief-path> --approved-plan <runs/implementation-planning/.../reports/final-report.md>
package/docs/cli.md CHANGED
@@ -646,6 +646,8 @@ The `okstra` Node CLI (`bin/okstra`) provides both installer/admin commands and
646
646
  | `okstra task-list [--project-root <path>]` | Combine `list_project_tasks` and `read_latest_task` into JSON containing the task catalog and latest task |
647
647
  | `okstra task-show <task-key> [--project-root <path>]` | Summarize workflow, phase, status, and artifacts from the Task Read-Side Snapshot |
648
648
  | `okstra stage-map <task-key> [--cwd <dir>\|--project <dir>]` | Dump the task's implementation-planning Stage Map as JSON: `{ ok, taskKey, taskRoot, stages:[{stage_number,title,depends_on,step_count}], doneStages:[int] }`. `stages` is `[]` when the task has no implementation-planning Stage Map. `doneStages` is read from the implementation-planning stage consumer state (with carry recovery). This is the read-side source the `okstra-schedule-gen` skill uses to derive stage units and their dependency closure |
649
+ | `okstra incremental-scope <args…>` | Decide re-verify vs carry-forward scope for an `implementation-planning` clarification re-run. Thin shim into `scripts/okstra_ctl/incremental_scope.py` (deterministic pure function): it reads the dependency graph from the prior run `data.json`'s `implementationPlanning.stageMap` and returns `mode:"incremental"` only when the base-ref SHA is unchanged and the affected stages' `downstream_stage_closure` covers at most half of all stages; otherwise it signals a full re-run. Used to bound the cost of a clarification re-run |
650
+ | `okstra incremental-carry <args…>` | Merge carried-forward plan-item verdicts into an incremental re-run. Thin shim into `scripts/okstra_ctl/incremental_carry.py`: it takes the prior run's plan-item verdicts that the current run does not re-verify and merges them into the current `data.json` tagged with `carriedForwardFromSeq`. A `schemaVersion` drift raises `CarryError` and exits non-zero to force a full fallback. Runs after `incremental-scope` returns `mode:"incremental"` |
649
651
  | `okstra set-work-status <token> <todo\|in-progress\|blocked\|done> [--note <text>] [--task-group <g>] [--project-root <dir>]` | Update user-managed `workStatus` in task-manifest.json, along with `workStatusUpdatedAt` and, when `--note` is supplied, `workStatusNote`. `<token>` is a full task key or bare task ID. It uses the manifest renderer's serialization rules and returns `stage:"ambiguous"` plus `matches[]` when ambiguous |
650
652
  | `okstra worktree-lookup <task-key>` | Return the `worktree_registry.lookup` result: reserved path, branch, base ref, and current status |
651
653
  | `okstra plan-validate <plan-path>` | Run `_validate_approved_plan` and report frontmatter `approved` recognition plus unresolved Blocks=approval rows |
@@ -1,52 +1,55 @@
1
1
  # Okstra Skills AI Manuals
2
2
 
3
- 디렉터리는 AI okstra 공개 스킬을 빠르게 선택하고 정확히 실행하기 위한 압축 매뉴얼이다. 원문 계약은 `skills/*/SKILL.md`이고, 문서는 AI 운영 가이드다. 원문 스킬, 템플릿, validator, CLI registry 충돌하면 원문 스킬과 실제 validator/CLI 구현을 우선한다.
3
+ This directory is a compressed manual for an AI to quickly select and precisely run okstra public skills. The authoritative contract is `skills/*/SKILL.md`; this document is the operational guide for the AI. When the source skills, templates, validators, or CLI registry conflict, prefer the source skills and the actual validator/CLI implementation.
4
4
 
5
- ## 확인한 원천
5
+ ## Verified Sources
6
6
 
7
- - 공개 스킬 목록: [`src/lib/skill-catalog.mjs`](../../src/lib/skill-catalog.mjs)
8
- - 스킬 원문: [`skills/`](../../skills/)
9
- - CLI 명령 표면: [`src/cli-registry.mjs`](../../src/cli-registry.mjs)
10
- - brief 템플릿: [`templates/reports/brief.template.md`](../../templates/reports/brief.template.md)
11
- - schedule 템플릿: [`templates/reports/schedule.template.md`](../../templates/reports/schedule.template.md)
12
- - brief 검증기: [`validators/validate-brief.py`](../../validators/validate-brief.py)
13
- - schedule 검증기: [`validators/validate-schedule.py`](../../validators/validate-schedule.py)
7
+ - Public skill list: [`src/lib/skill-catalog.mjs`](../../src/lib/skill-catalog.mjs)
8
+ - Skill sources: [`skills/`](../../skills/)
9
+ - CLI command surface: [`src/cli-registry.mjs`](../../src/cli-registry.mjs)
10
+ - brief template: [`templates/reports/brief.template.md`](../../templates/reports/brief.template.md)
11
+ - schedule template: [`templates/reports/schedule.template.md`](../../templates/reports/schedule.template.md)
12
+ - brief validator: [`validators/validate-brief.py`](../../validators/validate-brief.py)
13
+ - schedule validator: [`validators/validate-schedule.py`](../../validators/validate-schedule.py)
14
14
 
15
- ## 스킬 라우팅
15
+ ## Skill Routing
16
16
 
17
- | 사용자 의도 | 사용할 스킬 | 매뉴얼 |
17
+ | User intent | Skill to use | Manual |
18
18
  |---|---|---|
19
- | 프로젝트나 머신에서 okstra 설치/초기화 | `okstra-setup` | [`skills/okstra-setup.md`](skills/okstra-setup.md) |
20
- | 요구사항, 티켓, 링크, 코드베이스 스캔, error-zip okstra 입력 brief 변환 | `okstra-brief-gen` | [`skills/okstra-brief-gen.md`](skills/okstra-brief-gen.md) |
21
- | 현재 Claude Code 세션에서 okstra run 시작 또는 다음 phase 실행 | `okstra-run` | [`skills/okstra-run.md`](skills/okstra-run.md) |
22
- | 여러 프로젝트에 걸친 okstra task 묶음, 할당, sync snapshot, child launch packet 관리 | `okstra-manager` | [`skills/okstra-manager.md`](skills/okstra-manager.md) |
23
- | 상태, history, report, time, logs, cost, errors, error-zip, recap 확인 | `okstra-inspect` | [`skills/okstra-inspect.md`](skills/okstra-inspect.md) |
24
- | task-group(또는 프로젝트 전체) 여러 task run 결과를 모아 집계·종합 요약 | `okstra-rollup` | [`skills/okstra-rollup.md`](skills/okstra-rollup.md) |
19
+ | Install/initialize okstra on a new project or a new machine | `okstra-setup` | [`skills/okstra-setup.md`](skills/okstra-setup.md) |
20
+ | Turn requirements, tickets, links, a codebase scan, or an error-zip into an okstra input brief | `okstra-brief-gen` | [`skills/okstra-brief-gen.md`](skills/okstra-brief-gen.md) |
21
+ | Start an okstra run or execute the next phase in the current Claude Code session | `okstra-run` | [`skills/okstra-run.md`](skills/okstra-run.md) |
22
+ | Manage okstra tasks across multiple projects bundling, assignment, sync snapshots, child launch packets | `okstra-manager` | [`skills/okstra-manager.md`](skills/okstra-manager.md) |
23
+ | Check status, history, report, time, logs, cost, errors, error-zip, recap | `okstra-inspect` | [`skills/okstra-inspect.md`](skills/okstra-inspect.md) |
24
+ | Collect and aggregate the results of multiple task runs across a task-group (or the whole project) into a synthesized summary | `okstra-rollup` | [`skills/okstra-rollup.md`](skills/okstra-rollup.md) |
25
25
  | Project-wide recent run coverage, tokens, known cost, CPU, and wall-clock usage by task type | `okstra-usage` | [`skills/okstra-usage.md`](skills/okstra-usage.md) |
26
- | task-group 전체의 클라이언트용 작업 일정 생성 | `okstra-schedule-gen` | [`skills/okstra-schedule-gen.md`](skills/okstra-schedule-gen.md) |
27
- | 대화/결정/선호/요구사항을 전역 Memory Book에 저장 또는 검색 | `okstra-memory` | [`skills/okstra-memory.md`](skills/okstra-memory.md) |
28
- | implementation task worktree 기반 docker compose 사용자 테스트 환경 관리 | `okstra-container-build` | [`skills/okstra-container-build.md`](skills/okstra-container-build.md) |
26
+ | Generate a client-facing work schedule for a whole task-group | `okstra-schedule-gen` | [`skills/okstra-schedule-gen.md`](skills/okstra-schedule-gen.md) |
27
+ | Store or search conversations/decisions/preferences/requirements in the global Memory Book | `okstra-memory` | [`skills/okstra-memory.md`](skills/okstra-memory.md) |
28
+ | Manage the implementation-task worktree-based docker compose user-test environment | `okstra-container-build` | [`skills/okstra-container-build.md`](skills/okstra-container-build.md) |
29
+ | Answer the unresolved clarification questions an okstra run left behind in-session and record the approval gate | `okstra-user-response` | [`skills/okstra-user-response.md`](skills/okstra-user-response.md) |
30
+ | Build and query a knowledge graph over the project's own `.okstra` memory (reports, decision records, glossary) | `okstra-graphify` | [`skills/okstra-graphify.md`](skills/okstra-graphify.md) |
31
+ | Register a PR body template or generate a PR description from a branch diff (global, git repository) | `okstra-pr-gen` | [`skills/okstra-pr-gen.md`](skills/okstra-pr-gen.md) |
29
32
 
30
- ## 공통 실행 규칙
33
+ ## Shared Execution Rules
31
34
 
32
- 1. 명령은 스킬 원문이 요구하는 경우 각각 별도의 Bash 호출로 실행한다. 특히 `okstra preflight --runtime claude-code --json`, `okstra wizard ...`, `okstra container ...` 호출을 `&&`, `||`, `$(...)`, 선행 변수 할당, `eval`, `export`로 감싸지 않는다.
33
- 2. `okstra <subcmd>` 호출은 자체적으로 Python path 부트스트랩한다. 스킬에서 명시하지 않는 `okstra paths --shell`이나 `export PYTHONPATH=...`를 만들지 않는다.
34
- 3. `okstra-setup`을 제외한 대부분의 스킬은 `npx` fallback 쓰지 않는다. runtime 없으면 사용자에게 `/okstra-setup`을 실행하라고 알리고 멈춘다. `unknown command: <cmd>`로 실패하면 PATH의 `okstra` 바이너리가 스킬보다 오래된 것이다`/okstra-setup`이 아니라 `npm i -g okstra@latest`를 안내하고 멈춘다.
35
- 4. 프로젝트 산출물은 기본적으로 `<PROJECT_ROOT>/.okstra/` 아래에 둔다. 예외는 `okstra-memory`이며, 스킬은 전역 사용자 메모리 `~/.okstra/memory-book/`을 사용한다.
36
- 5. `runtime/`은 build output이다. 스킬 원문이나 템플릿을 고칠 때는 `skills/`, `templates/`, `validators/`, `scripts/`, `src/`의 source를 수정하고 build로 반영한다.
37
- 6. tracker, URL, 파일, report, log, zip, template, validator 내용을 추측하지 않는다. 도구로 읽거나 실행해서 확인한 내용만 사용한다.
38
- 7. read-side 스킬도 일부 산출물을 만든다. `okstra-inspect errors`는 error report Markdown 만들고, `okstra-inspect error-zip`은 anonymized zip 만든다. 이런 경우에도 CLI stdout JSON source of truth로 둔다.
35
+ 1. Run commands as separate Bash calls whenever the source skill requires it. In particular, do not wrap `okstra preflight --runtime claude-code --json`, `okstra wizard ...`, or `okstra container ...` calls in `&&`, `||`, `$(...)`, a leading variable assignment, `eval`, or `export`.
36
+ 2. An `okstra <subcmd>` call bootstraps its own Python path. Unless a skill states otherwise, do not build `okstra paths --shell` or `export PYTHONPATH=...`.
37
+ 3. Most skills except `okstra-setup` do not use an `npx` fallback. If the runtime is missing, tell the user to run `/okstra-setup` and stop. But if it fails with `unknown command: <cmd>`, the `okstra` binary on PATH is older than the skill point the user to `npm i -g okstra@latest` rather than `/okstra-setup`, and stop.
38
+ 4. Project artifacts go under `<PROJECT_ROOT>/.okstra/` by default. The exception is `okstra-memory`, which uses the global user memory `~/.okstra/memory-book/`.
39
+ 5. `runtime/` is build output. When fixing a source skill or template, edit the source under `skills/`, `templates/`, `validators/`, `scripts/`, `src/` and apply it via a build.
40
+ 6. Do not guess the contents of a tracker, URL, file, report, log, zip, template, or validator. Use only what you have confirmed by reading or running with a tool.
41
+ 7. Read-side skills also produce some artifacts. `okstra-inspect errors` produces an error report Markdown, and `okstra-inspect error-zip` produces an anonymized zip. Even in these cases, keep the CLI stdout JSON as the source of truth.
39
42
 
40
- ## AI 읽는 순서
43
+ ## The Order the AI Reads In
41
44
 
42
- 1. 파일에서 스킬을 고른다.
43
- 2. 해당 `docs/for-ai/skills/<skill>.md`만 읽는다.
44
- 3. 스킬이 실제 실행을 요구하면 원문 [`skills/<skill>/SKILL.md`](../../skills/)에서 해당 step을 확인한다.
45
- 4. brief schedule 쓰는 경우 템플릿과 validator도 함께 확인한다.
45
+ 1. Pick a skill in this file.
46
+ 2. Read only the matching `docs/for-ai/skills/<skill>.md`.
47
+ 3. If the skill requires actual execution, confirm the relevant step in the source [`skills/<skill>/SKILL.md`](../../skills/).
48
+ 4. When writing a brief or schedule, also confirm the template and the validator.
46
49
 
47
- ## 공개 스킬 목록
50
+ ## Public Skill List
48
51
 
49
- AI 매뉴얼에 나열된 공개 스킬은 다음 10개다.
52
+ The public skills listed in this AI manual are the following 13:
50
53
 
51
54
  - `okstra-setup`
52
55
  - `okstra-brief-gen`
@@ -58,3 +61,6 @@
58
61
  - `okstra-usage`
59
62
  - `okstra-schedule-gen`
60
63
  - `okstra-container-build`
64
+ - `okstra-user-response`
65
+ - `okstra-graphify`
66
+ - `okstra-pr-gen`
@@ -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`: 112, 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.