okstra 0.36.0 → 0.36.1

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 (43) hide show
  1. package/README.kr.md +3 -5
  2. package/README.md +3 -5
  3. package/docs/project-structure-overview.md +2 -7
  4. package/docs/superpowers/plans/2026-05-24-implementation-lead-context-slimming.md +1700 -0
  5. package/package.json +1 -1
  6. package/runtime/BUILD.json +2 -2
  7. package/runtime/agents/SKILL.md +18 -5
  8. package/runtime/agents/workers/claude-worker.md +5 -6
  9. package/runtime/agents/workers/codex-worker.md +10 -9
  10. package/runtime/agents/workers/gemini-worker.md +7 -6
  11. package/runtime/agents/workers/report-writer-worker.md +13 -11
  12. package/runtime/prompts/launch.template.md +1 -0
  13. package/runtime/prompts/profiles/_implementation-deliverable.md +53 -0
  14. package/runtime/prompts/profiles/_implementation-executor.md +60 -0
  15. package/runtime/prompts/profiles/_implementation-verifier.md +76 -0
  16. package/runtime/prompts/profiles/implementation.md +27 -134
  17. package/runtime/python/okstra_ctl/paths.py +3 -0
  18. package/runtime/python/okstra_ctl/render.py +19 -5
  19. package/runtime/python/okstra_ctl/run.py +7 -1
  20. package/runtime/python/okstra_ctl/session.py +65 -7
  21. package/runtime/skills/okstra-brief/SKILL.md +2 -211
  22. package/runtime/skills/okstra-inspect/SKILL.md +581 -0
  23. package/runtime/skills/okstra-run/SKILL.md +3 -3
  24. package/runtime/skills/okstra-schedule/SKILL.md +10 -153
  25. package/runtime/skills/okstra-setup/SKILL.md +1 -1
  26. package/runtime/skills/okstra-team-contract/SKILL.md +15 -106
  27. package/runtime/templates/reports/brief.template.md +204 -0
  28. package/runtime/templates/reports/schedule.template.md +12 -3
  29. package/runtime/templates/worker-prompt-preamble.md +108 -0
  30. package/src/uninstall.mjs +7 -3
  31. package/runtime/prompts/profiles/kr/_common-contract.md +0 -92
  32. package/runtime/prompts/profiles/kr/error-analysis.md +0 -36
  33. package/runtime/prompts/profiles/kr/final-verification.md +0 -48
  34. package/runtime/prompts/profiles/kr/implementation-planning.md +0 -90
  35. package/runtime/prompts/profiles/kr/implementation.md +0 -144
  36. package/runtime/prompts/profiles/kr/improvement-discovery.md +0 -42
  37. package/runtime/prompts/profiles/kr/release-handoff.md +0 -104
  38. package/runtime/prompts/profiles/kr/requirements-discovery.md +0 -42
  39. package/runtime/skills/okstra-history/SKILL.md +0 -165
  40. package/runtime/skills/okstra-logs/SKILL.md +0 -173
  41. package/runtime/skills/okstra-report-finder/SKILL.md +0 -111
  42. package/runtime/skills/okstra-status/SKILL.md +0 -246
  43. package/runtime/skills/okstra-time-summary/SKILL.md +0 -172
@@ -18,7 +18,7 @@ The skill runs as a single Claude lead synthesis (lightweight mode). A `--cross-
18
18
  - User wants a single document that summarizes all non-done tasks with effort, risk, and dependencies
19
19
  - A `task-group` exists in `.project-docs/okstra/discovery/task-catalog.json` with at least one task whose `workStatus` is not `done`
20
20
 
21
- **Do NOT use** for single-task analysis (use `okstra-status` instead) or when the user wants to actually execute one task (use the parent `okstra` skill).
21
+ **Do NOT use** for single-task analysis (use `okstra-inspect status` instead) or when the user wants to actually execute one task (use the parent `okstra` skill).
22
22
 
23
23
  ## Trigger Patterns (recognize both)
24
24
 
@@ -78,7 +78,7 @@ This skill performs cross-task synthesis (multi-task classification, dependency
78
78
 
79
79
  Since the `feat(scripts/render): project workStatus fields into task-catalog entries` change (commit `c44c36b`), `workStatus` is also surfaced directly inside each catalog entry — Step 1 still re-reads each `task-manifest.json` because the manifest is authoritative, but no extra fetch is needed beyond that.
80
80
 
81
- For inference rules when `workStatus` is missing or empty, **defer to the inference table in `skills/okstra-status/SKILL.md` ("Step 4 → Inferring workStatus")** instead of duplicating it here. Apply that table to derive a working value, then filter:
81
+ For inference rules when `workStatus` is missing or empty, **defer to the inference table in `skills/okstra-inspect/SKILL.md` (`status.4`"Default value convention")** instead of duplicating it here. Apply that table to derive a working value, then filter:
82
82
 
83
83
  - If the resolved value is `done` (set by the user OR inferred via `currentStatus == "completed"` + terminal next-phase) → exclude.
84
84
  - Otherwise (`todo` / `in-progress` / `blocked` / `phase-done` / explicit user value / inferred non-done) → include.
@@ -444,45 +444,15 @@ After writing the file and before printing the completion message in Step 7, you
444
444
  python3 validators/validate-schedule.py <output-path>
445
445
  ```
446
446
  3. If the validator exits non-zero, **fix the file and re-validate**. Do not print the completion message until the validator passes.
447
- 4. If `validators/validate-schedule.py` is not present in the repo, fall back to a manual checklist: confirm each of the 11 mandatory headings appears in the file with the exact spelling above, the title ends with `— Work Schedule`, and the metadata `> Generated:` block is present.
447
+ 4. If `validators/validate-schedule.py` is not present in the repo, fall back to a manual checklist: confirm each of the 11 mandatory headings from `### MUST — exact ordered heading list` (above) appears in the file with that exact spelling, the title ends with `— Work Schedule`, and the metadata `> Generated:` block is present.
448
448
 
449
449
  ## Schedule Document Template
450
450
 
451
- The generated Markdown file MUST follow this structure exactly, mirroring `templates/reports/schedule.template.md`. Do not omit sections; if data is unavailable for a section, include the section with the placeholder `_없음_` rather than skipping it.
451
+ [`templates/reports/schedule.template.md`](../../templates/reports/schedule.template.md) is the byte-for-byte SSOT for section ordering, heading spelling, table columns, and per-section HTML-comment guidance (Dependency Graph Shape A/B, Gantt rules, optional Glossary gate). Do not omit sections; if data is unavailable, render the section with `_없음_` rather than skipping it.
452
452
 
453
- ### Required Top Header
453
+ The two rules below complement the template — they encode COMPUTATION that the template scaffold cannot carry inline.
454
454
 
455
- ```markdown
456
- # <Title> — Work Schedule
457
-
458
- > Generated: <YYYY-MM-DD HH:MM> | Project: <project-id> | Task Group: <task-group>
459
- > Source: okstra <mode> (<N> tasks included, <M> done excluded)
460
-
461
- ---
462
- ```
463
-
464
- ### Section: At a Glance (FIRST content section after header)
465
-
466
- This section gives the reader the entire schedule scope at a single screen.
467
-
468
- ```markdown
469
- ## At a Glance
470
-
471
- **총 <N>개 task / 예상 소요: <X.X> ~ <Y.Y> days (Effort 합산)**
472
-
473
- | # | Task ID | Title | Category | Priority | Effort | Days | taskType | Risk | Phase |
474
- |---|---------|-------|----------|----------|--------|------|----------|------|-------|
475
- | 1 | <TASK-ID> | <Title> | <category> | <P0~P3> | <S/M/L/XL> | <range> | <taskType> | <risk> | <1/2/3> |
476
- | ... |
477
-
478
- **Effort 분포**: S × <n> / M × <n> / L × <n> / XL × <n>
479
- **Risk 분포**: Very Low × <n> / Low × <n> / Medium × <n> / Med-High × <n> / High × <n>
480
- **Repo별 영향**: <repo1> (<n>) / <repo2> (<n>) / ...
481
-
482
- ---
483
- ```
484
-
485
- Effort-to-Day mapping (used to compute the total day range):
455
+ ### Effort-to-Day mapping (At a Glance total)
486
456
 
487
457
  | Size | Day(s) |
488
458
  |------|----------|
@@ -491,131 +461,18 @@ Effort-to-Day mapping (used to compute the total day range):
491
461
  | L | 3 - 5 |
492
462
  | XL | 5 - 10 |
493
463
  | XXL | 10 - |
494
- Sum the lower bounds for the lower total and the upper bounds for the upper total.
495
-
496
- ### Section: Executive Summary
497
-
498
- ```markdown
499
- ## Executive Summary
500
-
501
- <Phase 분류 요약 + 진행 전략 — 2~4문장>
502
-
503
- - **Phase 1 (Critical Fixes)**: <n>개 task — <summary>
504
- - **Phase 2 (Enhancements)**: <n>개 task — <summary>
505
- - **Phase 3 (Architecture)**: <n>개 task — <summary>
506
-
507
- ### Effort Sizing 기준
508
-
509
- | Size | 기준 | Day(s) |
510
- |------|------|--------|
511
- | **S** | 1-2 files, 1 repo, 테스트 수정만, DB 변경 없음 | 0.5 - 1 |
512
- | **M** | 3-5 files, 1 repo, 신규 테스트 포함, DB 변경 없음 | 2 - 3 |
513
- | **L** | 5-15 files, 2-3 repos, 순차 배포, 패키지 릴리스 포함 가능 | 3 - 5 |
514
- | **XL** | 15+ files, 3+ repos + infra, frontend 동시 변경, 아키텍처 전환 | 5 - 10 |
515
- | **XXL** | 작업 더 세분화 필요 | 10 - |
516
-
517
- ---
518
- ```
519
-
520
- ### Section: Task Dependency Graph
521
-
522
- This section MUST follow ONE of two exact shapes — free-form ASCII art, mermaid, PlantUML, or Graphviz are all forbidden.
523
-
524
- **Shape A — no dependency data.** Single italicized blockquote-line under the heading, literal Korean:
525
-
526
- ```
527
- _의존 정보 없음_
528
- ```
529
-
530
- **Shape B — adjacency-list inside a plain fence.** When dependency edges are extracted from per-task reports, emit them as a fenced block with NO language tag. Each non-empty line is one of:
531
-
532
- - An adjacency line: `<TASK-ID> -> <TASK-ID>[, <TASK-ID>]*`
533
- - A comment line starting with `#` (free prose, max one per group)
534
- - A blank line (group separator)
535
-
536
- ```
537
- DEV-1 -> DEV-2, DEV-3
538
- DEV-2 -> DEV-4
539
- # Phase 3 fan-out
540
- DEV-5 -> DEV-6
541
- ```
542
-
543
- Rules:
544
- - Use ASCII arrow `->` only. Unicode `→` is rejected so downstream tooling does not have to handle both.
545
- - Both endpoints MUST be `TASK-ID` literals (the same identifiers used in the At a Glance table). Free text is forbidden.
546
- - Fence MUST be plain ` ``` ` with no language tag. ` ```mermaid `, ` ```plantuml `, ` ```graphviz `, ` ```dot ` are all rejected.
547
- - If only one task is in scope (no dependencies), use Shape A — do NOT emit an empty fence.
548
-
549
- ### Section: Phase 1 / Phase 2 / Phase 3
550
-
551
- For each phase, repeat the per-task block:
552
-
553
- ````markdown
554
- ## Phase <N>: <Name>
555
-
556
- ### <N>-<i>. <TASK-ID> — <Title>
557
-
558
- | Item | Detail |
559
- |------|--------|
560
- | **Category** | <category> |
561
- | **Priority** | <P0~P3> |
562
- | **Effort** | **<S/M/L/XL>** (<scope summary>) |
563
- | **Status** | <workStatus + currentPhase summary> |
564
- | **Risk** | <risk> |
565
- | **Scope** | <files / repos summary> |
566
- | **Repo** | <repos> |
567
-
568
- **Problem**: <…>
569
-
570
- **Solution**: <…>
571
-
572
- **Work Breakdown**:
573
-
574
- | Step | File | Action | Detail |
575
- |------|------|--------|--------|
576
- | 1 | <path> | CREATE/MODIFY/VERIFY | <detail> |
577
- | ... |
578
-
579
- **Verification Commands**:
580
- ```bash
581
- <commands>
582
- ```
583
-
584
- **Rollback**: <…>
585
-
586
- ---
587
- ````
588
-
589
- If a task entry is `[NEEDS-OKSTRA-RUN]` or `[PARSE-ERROR: <section>]`, place the marker immediately under the task heading and fill only the available fields.
590
-
591
- ### Section: Execution Priority Matrix
592
-
593
- ```markdown
594
- ## Execution Priority Matrix
595
-
596
- | Priority | Task | Effort | Risk | Next Action |
597
- |----------|------|--------|------|-------------|
598
- ```
599
-
600
- Each row summarizes the next concrete engineering action per task in priority order. No `Done` / `Ready?` / `Blocking Decisions` columns — schedule is a client-facing plan, not an internal todo board.
601
-
602
- ### Section: Cross-Task Dependencies & Shared Concerns
603
-
604
- Free-form prose listing inter-task overlaps, shared packages, release order, etc.
605
-
606
- ### Section: Risk Mitigation Strategy
607
464
 
608
- Enumerate phase-level risk strategies as numbered list.
465
+ Sum the lower bounds across all in-scope tasks for the lower total, and the upper bounds for the upper total. The same table is rendered as descriptive reference under `### Effort Sizing 기준`; this copy is the source-of-truth for the At a Glance computation.
609
466
 
610
- ### Section: Recommended Immediate Actions
467
+ ### `[NEEDS-OKSTRA-RUN]` / `[PARSE-ERROR: <section>]` placement
611
468
 
612
- Markdown bullet list of next concrete engineering actions, one item per line: `- <action>`. Numbered lists (`1. …`) and checkbox lists (`- [ ] …`) are both forbidden the schedule is a client-facing plan, not an internal todo.
469
+ When a task entry is tagged with one of these markers, place the marker immediately under the per-task heading inside the corresponding Phase section and fill only the available fields. Do NOT relocate it to a sibling section.
613
470
 
614
471
  ## Edge Cases
615
472
 
616
473
  | Case | Handling |
617
474
  |------|----------|
618
- | `workStatus` field absent or empty | Resolve via the okstra-status inference table; include unless the resolved value is `done` |
475
+ | `workStatus` field absent or empty | Resolve via the `okstra-inspect status.4` inference table; include unless the resolved value is `done` |
619
476
  | Filtered task count is 0 | Emit "모든 task가 done" message; do NOT create a file |
620
477
  | `latestReportPath` missing or unreadable | Tag entry with `[NEEDS-OKSTRA-RUN]`; include manifest metadata only |
621
478
  | Report parsing fails for a specific section | Tag with `[PARSE-ERROR: <section>]`; continue with the rest |
@@ -17,7 +17,7 @@ machine, or when adopting okstra in a new project.
17
17
  ## When NOT to use
18
18
 
19
19
  - A task is already in flight → use [`okstra-run`](../okstra-run/SKILL.md) or
20
- [`okstra-status`](../okstra-status/SKILL.md).
20
+ [`okstra-inspect status`](../okstra-inspect/SKILL.md).
21
21
  - Day-to-day usage in a project that already has `project.json` — skip this skill.
22
22
 
23
23
  ## Prerequisites
@@ -70,8 +70,11 @@ Every worker prompt MUST start with the following anchor headers, in this exact
70
70
 
71
71
  1. `**Project Root:** <absolute-path>` — absolute target project root (from `{{PROJECT_ROOT}}` in the lead's prompt). Required so the worker can self-anchor without relying on inherited cwd.
72
72
  2. `**Prompt History Path:** <project-relative-path>`
73
- 3. `**Result Path:** <project-relative-path>` — canonical destination for the worker's result file. Workers resolve it to absolute against `**Project Root:**` and use it for the post-completion existence check (see codex-worker / gemini-worker step 8c, and Lead's redispatch policy below). The path identifies a single file; do NOT deliver a directory.
73
+ 3. `**Result Path:** <project-relative-path>` — canonical destination for the worker's result file. Workers resolve it to absolute against `**Project Root:**` and use it for the post-completion existence check (see CLI wrapper agents' step 8c, and Lead's redispatch policy below). The path identifies a single file; do NOT deliver a directory.
74
74
  4. `Assigned worker prompt history path: <absolute-path>` — same as the prompt-history path but resolved against `Project Root`. Codex/Gemini wrapper subagents extract this exact line.
75
+ 5. `**Worker Preamble Path:** <absolute-path>` — points to `~/.okstra/templates/worker-prompt-preamble.md` (canonical SSOT for Required Reading + Error Reporting + Anchor / Output sections). Workers Read this file end-to-end before producing any output. This anchor replaces the ~80 lines of inlined `[Required reading]` / `[Error reporting]` boilerplate that earlier versions injected into every dispatch.
76
+ 6. `**Errors log path:** <absolute-path>` — run-level errors JSONL.
77
+ 7. `**Errors sidecar path:** <absolute-path>` — this worker's per-run sidecar JSON.
75
78
 
76
79
  The body must include: role name, task type, task key, required bundle paths, assigned model, output contract, evidence handling rules, and any relevant config/deployment expectations from `reference-expectations.md`.
77
80
 
@@ -83,120 +86,26 @@ Before dispatching any required worker, lead persists the exact worker prompt to
83
86
 
84
87
  Send byte-identical dispatch prompts to every analysis worker (Claude / Codex / Gemini), modulo the role label and the wrapper-specific path headers enumerated in the "Dispatch-prompt invariant" rule of the Role Definitions section. The prior "role-specific emphasis" guidance is retired — emphasis in the body biases each worker toward its lens and silently kills convergence (see Role Definitions for the failure mode). Specialization lives in Section 6 of the worker output, not in the dispatch prompt body.
85
88
 
86
- ### Required reading clause (analysis workers + report-writer worker)
89
+ ### Required Reading + Error Reporting via Worker Preamble (SSOT)
87
90
 
88
- Inject the following clause verbatim into every analysis worker's prompt and into the report-writer worker's prompt. Workers tend to skim long input documents — especially when the carry-in clarification response is structurally similar to the file they will write into next. This clause is the single biggest lever against that failure mode; do not paraphrase it, do not move it lower in the prompt, and do not omit any input file path.
91
+ The lead does NOT inline `[Required reading]` or `[Error reporting]` blocks into worker prompts. Both contracts live in a single canonical file at `~/.okstra/templates/worker-prompt-preamble.md` (source: `templates/worker-prompt-preamble.md`). The lead injects the path via the `**Worker Preamble Path:**` anchor header (header #5 above) and each worker Reads that file end-to-end before producing output.
89
92
 
90
- Replace placeholder file paths in the `[Required reading]` block with the actual project-relative paths derived from the run's `instruction-set/` and (if applicable) the carry-in clarification response.
93
+ What the lead MUST still do per dispatch:
94
+ - Inject the input file enumeration into the dispatch prompt body via an `## Inputs` section (or any heading the recipient agent expects), listing the actual project-relative paths derived from the run's `instruction-set/` and the carry-in clarification response if any. The preamble describes the rules; the lead provides the specific paths for THIS run.
95
+ - Inject the absolute `**Errors log path:**` and `**Errors sidecar path:**` headers (#6 and #7 above) — workers cannot synthesize these paths.
96
+ - Omit the preamble pointer for reverify dispatches (Phase 5.5 lightweight mode) — see [okstra-convergence](../okstra-convergence/SKILL.md) "Reverify prompt: required-reading suppression".
91
97
 
92
- **Audience-scoped enumeration (BLOCKING — performance optimization):**
98
+ Audience-scoped file enumeration (BLOCKING — performance optimization):
93
99
 
94
- Different recipients need different files. Do NOT include `final-report-template.md` in analysis worker prompts: analysis workers produce findings (not the final report), and forcing them to read the template inflates token usage without changing finding quality.
95
-
96
- | Recipient | Files included in `[Required reading]` |
100
+ | Recipient | Files the lead lists under `## Inputs` |
97
101
  |---|---|
98
102
  | Claude / Codex / Gemini analysis workers | task-brief, analysis-profile, analysis-material (if present), reference-expectations, clarification-response (if carry-in) |
99
103
  | Report writer worker (Phase 6) | all of the above **plus** `final-report-template.md` |
100
- | Reverify dispatches (Phase 5.5, lightweight mode) | **do NOT inject the `[Required reading]` clause at all** see [okstra-convergence](../okstra-convergence/SKILL.md) "Reverify prompt: required-reading suppression". |
101
-
102
- **Asymmetry between claude-worker and codex/gemini-worker prompts (NOT a bug):**
103
-
104
- The dispatch prompt the lead constructs for `claude-worker` is intentionally shorter than for `codex-worker` / `gemini-worker`. Do NOT "fix" this by re-injecting `[Required reading]` / `[Error reporting]` / `[Output Contract]` blocks into the claude-worker prompt:
105
-
106
- - `claude-worker` is an in-process Claude subagent. The Agent SDK auto-loads `agents/claude-worker.md`, which already contains `## Required Reading Before Any Analysis`, `## Worker Output Structure`, and `## Error reporting`. Re-injecting them is redundant and wastes tokens.
107
- - `codex-worker` / `gemini-worker` shell out to a CLI. The CLI never sees the agent definition file — it only sees the prompt body passed via stdin. Therefore the lead MUST inject those three blocks into the dispatch prompt for those two workers.
108
-
109
- Worker definition file size (claude-worker ~106 lines vs codex/gemini ~175–179 lines) is NOT evidence of incompleteness — it reflects the in-process vs CLI-wrapper distinction.
110
-
111
- ```
112
- [Required reading]
113
- You are required to read every input file listed below from the very first
114
- character to the very last character before you produce any analysis output.
115
- Skimming, partial reads, jumping to a single section, or relying on prior
116
- knowledge of a similar file's structure is not acceptable. Each file may
117
- contain decisive context that is not surfaced in its summary or first page.
118
-
119
- Required files for this run (read in this order, end-to-end, no exceptions):
120
-
121
- 1. <Project Root>/<instruction-set>/task-brief.md
122
- 2. <Project Root>/<instruction-set>/analysis-profile.md
123
- 3. <Project Root>/<instruction-set>/analysis-material.md (only if present)
124
- 4. <Project Root>/<instruction-set>/reference-expectations.md
125
- 5. <Project Root>/<instruction-set>/clarification-response.md (only if a carry-in was provided for this run)
126
- 6. <Project Root>/<instruction-set>/final-report-template.md (REPORT WRITER ONLY — omit for analysis workers and reverify dispatches)
127
-
128
- Reading rules:
129
-
130
- - Use a single Read tool call per file with no offset and no limit. Do not
131
- page through the file with offset/limit unless the file is genuinely too
132
- large for one read; if you must page, you MUST cover the entire file
133
- before moving on, and you MUST state the page boundaries you used in your
134
- Findings section.
135
- - For the carry-in clarification response, read the conditional
136
- `## 0. Clarification Response Carried In From Previous Run` section
137
- (rendered only when carry-in is non-empty) and every row of
138
- `## 5. Clarification Items` (`C-001`, `C-002`, ...) in full,
139
- including rows whose `User input` cell is blank. The fact that you
140
- will write your output into a file with a structurally similar
141
- section 5 is NOT an excuse to skim — the prior `C-*` rows carry
142
- context you cannot reconstruct from the new run alone.
143
- - Write the Reading Confirmation block to your **audit sidecar** at
144
- `runs/<task-type>/worker-results/<worker>-audit-<task-type>-<seq>.md`
145
- (sibling to the main worker-results file). One short line per input
146
- file confirming end-to-end reading, e.g. "Read task-brief.md
147
- end-to-end (147 lines)." Do NOT include a `## 0. Reading Confirmation`
148
- heading in the main worker-results file — the validator now fails
149
- worker-results that contain one. If you cannot truthfully confirm a
150
- file end-to-end, record a `tool-failure` in the errors sidecar
151
- instead of fabricating Findings.
152
- - Do not collapse multiple input files into a single mental summary before
153
- reading them all individually. Each file has its own canonical role
154
- (brief = the user's request, profile = the lead's rules for this phase,
155
- reference-expectations = ground-truth config/deployment values,
156
- clarification-response = prior run's open questions and the user's
157
- answers, final-report-template = the structure your eventual writeup
158
- must conform to). Conflating them loses signal.
159
- ```
160
-
161
- ### Error reporting clause (analysis workers)
104
+ | Reverify dispatches | none the lead provides only the items to reverify |
162
105
 
163
- Inject the following clause verbatim into every analysis worker's prompt
164
- (Claude / Codex / Gemini). All three workers' subagent definitions already
165
- include the same contract — the prompt clause exists as a redundant safety
166
- net so any worker dispatched without its custom definition still receives
167
- identical instructions.
168
-
169
- ```
170
- [Error reporting]
171
- If any tool call you make (Bash, Read, Edit, MCP, etc.) returns a non-zero
172
- exit code, raises an exception, or otherwise fails its intended effect,
173
- append a single entry to your worker errors sidecar at:
174
-
175
- runs/<task-type>/worker-results/<role-slug>-errors-<task-type>-<seq>.json
176
-
177
- Schema (create the file with {"schemaVersion": 1, "errors": []} if absent):
178
-
179
- {
180
- "ts": "<ISO 8601 UTC>",
181
- "phase": "<current okstra phase>",
182
- "errorType": "tool-failure",
183
- "command": "<failed command/tool signature>",
184
- "commandKind": "bash | tool:Read | tool:Edit | mcp | ...",
185
- "exitCode": <int or null>,
186
- "durationMs": <int or null>,
187
- "message": "<one-line human summary>",
188
- "stderrExcerpt": "<first ~2KB of stderr, or null>",
189
- "context": { ... or null }
190
- }
191
-
192
- Do NOT include source / recordedAt / agent / agentRole / model / taskKey —
193
- Lead will fill those in. Do NOT use errorType values other than
194
- "tool-failure" in the sidecar. Continue your task after recording; do not
195
- abort unless the failure makes the task impossible.
196
- ```
106
+ Asymmetry note: `claude-worker` runs in-process and the Agent SDK auto-loads its agent definition; lead's dispatch prompt body for claude-worker can therefore be shorter than for codex/gemini. The Worker Preamble pointer is still emitted for all three so the contract source is identical regardless of dispatch path.
197
107
 
198
- The substituted `<role-slug>` is `claude-worker`, `codex-worker`, or
199
- `gemini-worker` matching the receiving role.
108
+ Send byte-identical dispatch prompts to every analysis worker (Claude / Codex / Gemini), modulo the role label and the wrapper-specific path headers. The prior "role-specific emphasis" guidance is retired — specialization lives in Section 6 of the worker output, not in the dispatch prompt body.
200
109
 
201
110
  ## Terminal Statuses
202
111
 
@@ -0,0 +1,204 @@
1
+ ---
2
+ type: brief
3
+ brief-id: <ticket-id>-<file-title> # equals the filename stem
4
+ parent-id: self # always `self` at root; child briefs use parent's brief-id
5
+ ticket-id: <LIN-1234 | PROJ-42 | gh-repo-123 | notion-abcdef12 | "">
6
+ source-type: <file | linear | jira | github | notion | url | user-input>
7
+ task-group: <task-group>
8
+ depth: 0 # 0=parent/single, 1=child, 2=grandchild, ...
9
+ created: <YYYY-MM-DD>
10
+ generator: okstra-brief
11
+ reporter-confirmations: <complete | partial | pending | skipped> # set by Step 6.5
12
+ # codebase-scan variant frontmatter (omit for reporter-input briefs):
13
+ scope: <reporter-input | codebase> # 'codebase' for codebase-scan variant; omit for reporter-input variant
14
+ priority-lenses: [] # codebase-scan only: lens enum subset, size 1..4
15
+ scan-scope: [] # codebase-scan only: 1+ paths
16
+ out-of-scope: [] # codebase-scan only: optional
17
+ candidate-cap: 8 # codebase-scan only: 1..12, default 8
18
+ ---
19
+
20
+ # Task Brief: <task_group>/<filename-without-ext>
21
+
22
+ > Generated: okstra-brief · <YYYY-MM-DD>
23
+ > Source type: <file | linear | jira | github | notion | url | user-input>
24
+ > Tracker key (if any): <LIN-1234 | PROJ-42 | gh-repo-123 | notion-abcdef12>
25
+ > Parent brief (child briefs only): <relative path>
26
+ > Recommended next phase: <requirements-discovery | error-analysis> ← from Step 6
27
+ > Handoff contract: see `prompts/profiles/_common-contract.md` § "Brief handoff contract"
28
+
29
+ ## Source Material
30
+
31
+ <!-- author guidance — strip out at fill-in time:
32
+ Paste each source separately and as-is. No paraphrasing, summarizing, or
33
+ restructuring. Format conversion (e.g. Jira ADF → Markdown) is allowed and
34
+ must be annotated in the header meta. Heading was originally
35
+ "Source Material (verbatim — do not modify)" — the parenthetical is a
36
+ reviewer note, not body text.
37
+ -->
38
+
39
+ ### Source 1 — <type: file | linear | jira | github | notion | url | user-input>
40
+
41
+ - ref: <abs file path | LIN-1234 | https://... | "conversation synthesis">
42
+ - fetched-via: <Read | mcp__linear__getIssue | mcp__notion__... | gh issue view | WebFetch | user-paste>
43
+ - fetched-at: <YYYY-MM-DD HH:MM>
44
+ - format: <as-is | "Jira ADF → Markdown (semantics preserved)" | "tool-truncated — missing body requested from reporter">
45
+
46
+ ```
47
+ <Paste the raw source here without changing a single character.>
48
+ ```
49
+
50
+ <!-- Repeat `### Source N — …` blocks as needed. -->
51
+
52
+ ## Context
53
+
54
+ <Background / scope / why now. If self-evident from Source Material, quote
55
+ it briefly and stop. Use the blockquote below when augmentation is needed.>
56
+
57
+ > augmented: <label> — <Interpretation added by the skill or user.>
58
+
59
+ <!-- label MUST be one of: `evidence-link` / `format-conversion` /
60
+ `terminology-mapping` / `intent-inference`. Do NOT add any extra
61
+ interpretation outside the `> augmented:` blockquote. -->
62
+
63
+ ## Problem / Symptom
64
+
65
+ <Current state. For bugs: repro / observed / expected. For greenfield: gap
66
+ between current and desired.>
67
+
68
+ <!-- Same source-quote + `> augmented:` rule as the Context section. -->
69
+
70
+ ## Desired Outcome
71
+
72
+ <Shape of success.>
73
+
74
+ <!-- Do NOT prescribe a solution — that belongs to implementation-planning. -->
75
+
76
+ ## Constraints
77
+
78
+ <Deadlines, compatibility, technical/operational limits. Use _(none)_ if
79
+ none.>
80
+
81
+ ## Scan Scope
82
+
83
+ <!-- codebase-scan variant only — omit this section for reporter-input briefs. -->
84
+ <!-- Author guidance: one bullet per `scan-scope` path with a short description of what lives there. -->
85
+
86
+ - <path>: <one-line description of contents / responsibility>
87
+
88
+ ## Priority Lenses
89
+
90
+ <!-- codebase-scan variant only — omit this section for reporter-input briefs. -->
91
+ <!-- Author guidance: one bullet per priority lens explaining why it is a priority for THIS scope. -->
92
+
93
+ - <lens>: <short rationale tying this lens to the scope's risk surface>
94
+
95
+ ## Related Artifacts
96
+
97
+ - <file path / URL / issue / prior task-key>
98
+
99
+ ## Open Questions
100
+
101
+ <!-- author guidance — strip out at fill-in time:
102
+ Prefix every row with one of these signals so the next phase knows how to
103
+ handle it. Free-form rows are allowed only as `general:`.
104
+
105
+ Allowed signals:
106
+ - `general: <unresolved question the user flagged>`
107
+ - `terminology: <reporter word> — needs canonical resolution against
108
+ <PROJECT_ROOT>/.project-docs/okstra/glossary.md`
109
+ - `intent-check: <restated inference> — confirm with reporter`
110
+ (auto-paired with every `intent-inference` augmentation)
111
+ - `conversion-block: <reporter statement> — could not be mapped to project
112
+ vocabulary; reporter query required`
113
+ - `adr-candidate: <topic>` — signal only; `implementation-planning`
114
+ evaluates and, if accepted, drafts a decision file at
115
+ `<PROJECT_ROOT>/.project-docs/okstra/decisions/<NNNN>-<slug>.md`.
116
+
117
+ Use `_(none)_` only if every signal is empty. `intent-check:` and
118
+ `conversion-block:` rows that are answered in Step 6.5 are NOT removed
119
+ from this list — they receive a `[CONFIRMED <YYYY-MM-DD> → RC-N]`
120
+ marker that links to the corresponding entry under
121
+ `## Reporter Confirmations`.
122
+ -->
123
+
124
+ - <fill in one row per signal, or replace with `_(none)_`>
125
+
126
+ ## Reporter Confirmations
127
+
128
+ <!-- Populated by Step 6.5. Each subsection records one reporter answer
129
+ verbatim, with a link back to the originating `Open Questions` row. -->
130
+
131
+ _(none — pending or skipped)_
132
+
133
+ <!-- when populated, the shape is:
134
+ ### RC-1 — <intent-check: or conversion-block: row id / topic>
135
+ - asked: <YYYY-MM-DD HH:MM>
136
+ - linked-row: `<exact Open Questions row text>`
137
+ - answer (verbatim):
138
+
139
+ > <reporter's answer, byte-for-byte>
140
+ -->
141
+
142
+ ## Augmentation
143
+
144
+ <!-- author guidance — strip out at fill-in time:
145
+ Cross-references / interpretation / context added by the user or skill that
146
+ is not in the original source. May be empty. Keep this section visually
147
+ separated from Source Material — never inline it inside Source Material.
148
+
149
+ Every entry below must start with one of the four labels:
150
+ `evidence-link` / `format-conversion` / `terminology-mapping` /
151
+ `intent-inference`. Unlabelled entries are forbidden.
152
+ -->
153
+
154
+ ### Domain alignment
155
+
156
+ <!-- author guidance — strip out at fill-in time:
157
+ Observations from Step 3b and the outcome of Step 4.5 (glossary applied
158
+ vs. skipped). The actual glossary edits live in
159
+ `<PROJECT_ROOT>/.project-docs/okstra/glossary.md` when applied; this
160
+ section records what happened. Decision candidates are NOT recorded here —
161
+ they flow through `Open Questions` as `adr-candidate:` rows for
162
+ `implementation-planning` to evaluate (and, if accepted, draft into
163
+ `<PROJECT_ROOT>/.project-docs/okstra/decisions/`).
164
+
165
+ Allowed entry shapes:
166
+ - `terminology-mapping: <reporter word> → <okstra glossary canonical>` —
167
+ routine glossary alignment, paired with `terminology:` in Open Questions
168
+ when unresolved.
169
+ - `terminology-mapping: applied glossary: <term> → <PROJECT_ROOT>/.project-docs/okstra/glossary.md`
170
+ - `terminology-mapping: skipped glossary: <term> = <definition>` —
171
+ Step 4.5 outcomes.
172
+ Use `_(none)_` if every alignment entry is empty.
173
+ -->
174
+
175
+ - <fill in one entry per alignment, or replace with `_(none)_`>
176
+
177
+ ### Evidence links (file / symbol resolution)
178
+
179
+ <!-- Allowed entry shapes:
180
+ `evidence-link: <reporter phrase> → <relative path>:<line>` or
181
+ `evidence-link: <reporter phrase> → <symbol> in <relative path>`.
182
+ Use `_(none)_` if none. -->
183
+
184
+ - <fill in one entry per link, or replace with `_(none)_`>
185
+
186
+ ### Intent inferences
187
+
188
+ <!-- Every entry here is an unverified hypothesis. Each one MUST have a
189
+ paired `intent-check:` row under Open Questions.
190
+
191
+ Allowed entry shape:
192
+ `intent-inference: <reporter phrase> → <qualitative restatement>`
193
+ (qualitative only — never invent numeric thresholds).
194
+ Use `_(none)_` if none. -->
195
+
196
+ - <fill in one entry per inference, or replace with `_(none)_`>
197
+
198
+ ### Format conversions
199
+
200
+ <!-- Allowed entry shape:
201
+ `format-conversion: <ref> — <e.g. Jira ADF → Markdown, semantics preserved>`.
202
+ Use `_(none)_` if none. -->
203
+
204
+ - <fill in one entry per conversion, or replace with `_(none)_`>
@@ -55,14 +55,23 @@ taskType: "{{FM_TASK_TYPE}}"
55
55
  ## Task Dependency Graph
56
56
 
57
57
  <!-- Use ONE of:
58
- (A) literal `_의존 정보 없음_` when no edges exist;
59
- (B) plain ``` fenced adjacency-list block see SKILL §"Section: Task Dependency Graph".
58
+ (A) literal `_의존 정보 없음_` when no edges exist (single-task scope or no extracted edges).
59
+ (B) plain ``` fenced adjacency-list block. Each non-empty line is one of:
60
+ - adjacency: `<TASK-ID> -> <TASK-ID>[, <TASK-ID>]*`
61
+ - comment: `# <free prose>` (max one per group)
62
+ - blank: group separator
60
63
  Example (B):
61
64
  ```
62
65
  DEV-1 -> DEV-2, DEV-3
63
66
  DEV-2 -> DEV-4
67
+ # Phase 3 fan-out
68
+ DEV-5 -> DEV-6
64
69
  ```
65
- Mermaid / PlantUML / Graphviz / Unicode '→' are all forbidden. -->
70
+ Rules:
71
+ - ASCII arrow `->` only; Unicode `→` is rejected so downstream tooling does not handle both.
72
+ - Both endpoints MUST be `TASK-ID` literals (same identifiers as the At a Glance table). Free text is forbidden.
73
+ - Fence MUST be plain ``` with NO language tag. ```mermaid / ```plantuml / ```graphviz / ```dot are all rejected.
74
+ - If only one task is in scope (no dependencies), use Shape A — do NOT emit an empty fence. -->
66
75
  _의존 정보 없음_
67
76
 
68
77
  ---