okstra 0.36.0 → 0.36.2
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.kr.md +3 -5
- package/README.md +3 -5
- package/docs/project-structure-overview.md +2 -7
- package/docs/superpowers/plans/2026-05-24-implementation-lead-context-slimming.md +1700 -0
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/SKILL.md +18 -5
- package/runtime/agents/workers/claude-worker.md +5 -6
- package/runtime/agents/workers/codex-worker.md +10 -9
- package/runtime/agents/workers/gemini-worker.md +7 -6
- package/runtime/agents/workers/report-writer-worker.md +13 -11
- package/runtime/prompts/launch.template.md +1 -0
- package/runtime/prompts/profiles/_implementation-deliverable.md +53 -0
- package/runtime/prompts/profiles/_implementation-executor.md +60 -0
- package/runtime/prompts/profiles/_implementation-verifier.md +76 -0
- package/runtime/prompts/profiles/implementation.md +27 -134
- package/runtime/python/okstra_ctl/paths.py +3 -0
- package/runtime/python/okstra_ctl/render.py +19 -5
- package/runtime/python/okstra_ctl/render_final_report.py +4 -1
- package/runtime/python/okstra_ctl/run.py +7 -1
- package/runtime/python/okstra_ctl/session.py +65 -7
- package/runtime/python/okstra_token_usage/report.py +6 -2
- package/runtime/skills/okstra-brief/SKILL.md +2 -211
- package/runtime/skills/okstra-inspect/SKILL.md +581 -0
- package/runtime/skills/okstra-run/SKILL.md +3 -3
- package/runtime/skills/okstra-schedule/SKILL.md +10 -153
- package/runtime/skills/okstra-setup/SKILL.md +1 -1
- package/runtime/skills/okstra-team-contract/SKILL.md +15 -106
- package/runtime/templates/reports/brief.template.md +204 -0
- package/runtime/templates/reports/schedule.template.md +12 -3
- package/runtime/templates/worker-prompt-preamble.md +108 -0
- package/src/uninstall.mjs +7 -3
- package/runtime/prompts/profiles/kr/_common-contract.md +0 -92
- package/runtime/prompts/profiles/kr/error-analysis.md +0 -36
- package/runtime/prompts/profiles/kr/final-verification.md +0 -48
- package/runtime/prompts/profiles/kr/implementation-planning.md +0 -90
- package/runtime/prompts/profiles/kr/implementation.md +0 -144
- package/runtime/prompts/profiles/kr/improvement-discovery.md +0 -42
- package/runtime/prompts/profiles/kr/release-handoff.md +0 -104
- package/runtime/prompts/profiles/kr/requirements-discovery.md +0 -42
- package/runtime/skills/okstra-history/SKILL.md +0 -165
- package/runtime/skills/okstra-logs/SKILL.md +0 -173
- package/runtime/skills/okstra-report-finder/SKILL.md +0 -111
- package/runtime/skills/okstra-status/SKILL.md +0 -246
- 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-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
453
|
+
The two rules below complement the template — they encode COMPUTATION that the template scaffold cannot carry inline.
|
|
454
454
|
|
|
455
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
467
|
+
### `[NEEDS-OKSTRA-RUN]` / `[PARSE-ERROR: <section>]` placement
|
|
611
468
|
|
|
612
|
-
|
|
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-
|
|
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
|
|
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
|
|
89
|
+
### Required Reading + Error Reporting via Worker Preamble (SSOT)
|
|
87
90
|
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
98
|
+
Audience-scoped file enumeration (BLOCKING — performance optimization):
|
|
93
99
|
|
|
94
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
---
|