okstra 0.123.0 → 0.125.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +1 -0
  2. package/docs/architecture/storage-model.md +3 -1
  3. package/docs/architecture.md +16 -2
  4. package/docs/cli.md +3 -1
  5. package/docs/for-ai/README.md +41 -35
  6. package/docs/for-ai/skills/okstra-brief-gen.md +105 -105
  7. package/docs/for-ai/skills/okstra-container-build.md +61 -61
  8. package/docs/for-ai/skills/okstra-graphify.md +64 -0
  9. package/docs/for-ai/skills/okstra-inspect.md +87 -86
  10. package/docs/for-ai/skills/okstra-manager.md +32 -32
  11. package/docs/for-ai/skills/okstra-memory.md +49 -50
  12. package/docs/for-ai/skills/okstra-pr-gen.md +48 -0
  13. package/docs/for-ai/skills/okstra-rollup.md +58 -58
  14. package/docs/for-ai/skills/okstra-run.md +95 -95
  15. package/docs/for-ai/skills/okstra-schedule-gen.md +106 -106
  16. package/docs/for-ai/skills/okstra-setup.md +63 -64
  17. package/docs/for-ai/skills/okstra-user-response.md +48 -0
  18. package/docs/performance-improvement-plan-v2.md +6 -6
  19. package/docs/pr-template-usage.md +34 -34
  20. package/docs/project-structure-overview.md +91 -70
  21. package/docs/task-process/README.md +33 -33
  22. package/docs/task-process/common-flow.md +26 -26
  23. package/docs/task-process/error-analysis.md +20 -21
  24. package/docs/task-process/final-verification.md +41 -41
  25. package/docs/task-process/implementation-planning.md +33 -33
  26. package/docs/task-process/implementation.md +38 -38
  27. package/docs/task-process/release-handoff.md +46 -46
  28. package/docs/task-process/requirements-discovery.md +22 -23
  29. package/package.json +1 -1
  30. package/runtime/BUILD.json +2 -2
  31. package/runtime/agents/workers/antigravity-worker.md +4 -4
  32. package/runtime/agents/workers/claude-worker.md +2 -2
  33. package/runtime/agents/workers/codex-worker.md +4 -4
  34. package/runtime/agents/workers/report-writer-worker.md +4 -4
  35. package/runtime/bin/lib/okstra/usage.sh +1 -1
  36. package/runtime/prompts/coding-preflight/frameworks/node-server.md +1 -1
  37. package/runtime/prompts/launch.template.md +1 -1
  38. package/runtime/prompts/lead/convergence.md +10 -20
  39. package/runtime/prompts/lead/okstra-lead-contract.md +15 -17
  40. package/runtime/prompts/lead/plan-body-verification.md +18 -18
  41. package/runtime/prompts/lead/report-writer.md +46 -44
  42. package/runtime/prompts/lead/team-contract.md +11 -122
  43. package/runtime/prompts/profiles/_common-contract.md +15 -22
  44. package/runtime/prompts/profiles/_implementation-deliverable.md +1 -1
  45. package/runtime/prompts/profiles/_implementation-executor.md +1 -1
  46. package/runtime/prompts/profiles/_implementation-verifier.md +28 -2
  47. package/runtime/prompts/profiles/error-analysis.md +2 -2
  48. package/runtime/prompts/profiles/final-verification.md +1 -1
  49. package/runtime/prompts/profiles/implementation-planning.md +13 -13
  50. package/runtime/prompts/profiles/implementation.md +2 -1
  51. package/runtime/prompts/profiles/improvement-discovery.md +1 -1
  52. package/runtime/prompts/profiles/release-handoff.md +3 -3
  53. package/runtime/prompts/profiles/requirements-discovery.md +17 -18
  54. package/runtime/python/okstra_ctl/models.py +4 -2
  55. package/runtime/python/okstra_ctl/run.py +8 -2
  56. package/runtime/python/okstra_ctl/stage_fix_carry.py +112 -0
  57. package/runtime/schemas/final-report-v1.0.schema.json +6 -6
  58. package/runtime/skills/_fragments/bash-invocation-rule.md +1 -0
  59. package/runtime/skills/_fragments/preflight-outdated-cli.md +1 -0
  60. package/runtime/skills/_fragments/python-bootstrap-note.md +1 -0
  61. package/runtime/skills/okstra-brief-gen/SKILL.md +117 -122
  62. package/runtime/skills/okstra-container-build/SKILL.md +24 -14
  63. package/runtime/skills/okstra-graphify/SKILL.md +12 -4
  64. package/runtime/skills/okstra-inspect/SKILL.md +39 -747
  65. package/runtime/skills/okstra-inspect/facets/cost.md +84 -0
  66. package/runtime/skills/okstra-inspect/facets/error-zip.md +41 -0
  67. package/runtime/skills/okstra-inspect/facets/errors.md +69 -0
  68. package/runtime/skills/okstra-inspect/facets/history.md +90 -0
  69. package/runtime/skills/okstra-inspect/facets/logs.md +89 -0
  70. package/runtime/skills/okstra-inspect/facets/recap.md +96 -0
  71. package/runtime/skills/okstra-inspect/facets/report.md +61 -0
  72. package/runtime/skills/okstra-inspect/facets/status.md +145 -0
  73. package/runtime/skills/okstra-inspect/facets/time.md +56 -0
  74. package/runtime/skills/okstra-manager/SKILL.md +1 -1
  75. package/runtime/skills/okstra-memory/SKILL.md +3 -3
  76. package/runtime/skills/okstra-pr-gen/SKILL.md +3 -3
  77. package/runtime/skills/okstra-rollup/SKILL.md +12 -6
  78. package/runtime/skills/okstra-run/SKILL.md +49 -88
  79. package/runtime/skills/okstra-schedule-gen/SKILL.md +36 -30
  80. package/runtime/skills/okstra-setup/SKILL.md +1 -1
  81. package/runtime/skills/okstra-setup/references/project-config.md +17 -16
  82. package/runtime/skills/okstra-usage/SKILL.md +5 -2
  83. package/runtime/skills/okstra-user-response/SKILL.md +15 -3
  84. package/runtime/templates/prd/brief.template.md +92 -92
  85. package/runtime/templates/project-docs/task-index.template.md +1 -1
  86. package/runtime/templates/reports/error-analysis-input.template.md +1 -1
  87. package/runtime/templates/reports/fan-out-unit.template.md +6 -6
  88. package/runtime/templates/reports/final-verification-input.template.md +6 -6
  89. package/runtime/templates/reports/implementation-input.template.md +1 -1
  90. package/runtime/templates/reports/implementation-planning-input.template.md +1 -1
  91. package/runtime/templates/reports/improvement-discovery-input.template.md +1 -1
  92. package/runtime/templates/reports/quick-input.template.md +1 -1
  93. package/runtime/templates/reports/release-handoff-input.template.md +1 -1
  94. package/runtime/templates/reports/schedule.template.md +22 -22
  95. package/runtime/templates/reports/task-brief.template.md +3 -3
  96. package/runtime/templates/reports/user-response.template.md +20 -20
  97. package/runtime/templates/worker-prompt-preamble.md +111 -13
  98. package/runtime/validators/validate-schedule.py +1 -1
@@ -22,7 +22,7 @@ taskType: "{{FM_TASK_TYPE}}"
22
22
  - Task Key: `<project-id>:<task-group>:<task-id>`
23
23
  - Related Tasks:
24
24
  - Issue / Ticket:
25
- - 값이 비면 워커는 `Task ID`로 폴백한다 (prefix 없이 `8852`처럼). run 여러 ticket을 동시에 다루면 콤마로 구분 (`TICKET-123, TICKET-456`). 어느 쪽으로도 식별 불가하면 `unknown`을 허용한다.
25
+ - If the value is empty, the worker falls back to `Task ID` (without a prefix, like `8852`). If a single run handles multiple tickets at once, separate them with commas (`TICKET-123, TICKET-456`). If it cannot be identified either way, `unknown` is allowed.
26
26
  - Task Type:
27
27
  - Requested Outcome:
28
28
  - Owner:
@@ -112,7 +112,7 @@ taskType: "{{FM_TASK_TYPE}}"
112
112
 
113
113
  ### Standing Ticket-Tagging Rule (always applied by every worker)
114
114
 
115
- - 모든 항목 행에 ticket을 명시한다. 형식은 `Ticket ID` 컬럼, bullet/번호목록·섹션 헤더는 `[TICKETID: <id>]` 태그를 사용한다. 채움 우선순위·폴백·다중 ticket 규칙은 `team-contract` SKILL의 Ticket Tagging 절을 따른다.
115
+ - Specify a ticket on every item and table row. Tables use a `Ticket ID` column; bullet/numbered lists and section headers use a `[TICKETID: <id>]` tag. The fill priority, fallback, and multi-ticket rules follow the Ticket Tagging section of the `team-contract` SKILL.
116
116
 
117
117
  ### Standing Scope-Discipline Questions (always answered by every worker)
118
118
 
@@ -139,7 +139,7 @@ taskType: "{{FM_TASK_TYPE}}"
139
139
 
140
140
  - This okstra run executes the lifecycle phase named in `Task Type` and stops there. Outputs that belong to any other phase MUST NOT be produced inside this run.
141
141
  - Allowed and forbidden actions for each task type are listed in `Lifecycle Phase Boundaries` of the okstra skill (`prompts/lead/okstra-lead-contract.md`). The lead and every worker stay inside that boundary.
142
- - "다음 단계 진행해" or any equivalent user phrase is interpreted as "complete the remaining outputs of the current phase," never as "start the next lifecycle phase." The next phase begins only via a fresh okstra invocation with the new `--task-type`.
142
+ - "proceed to the next step" or any equivalent user phrase is interpreted as "complete the remaining outputs of the current phase," never as "start the next lifecycle phase." The next phase begins only via a fresh okstra invocation with the new `--task-type`.
143
143
  - For `implementation-planning` specifically: produce a plan document with the sections listed in `okstra-implementation-planning-input.template.md` `## Required Plan Deliverable`. Do not edit project source code, run builds/migrations/deployments, or write artifacts outside the run's own directories.
144
144
  - For `implementation` specifically: edits are bounded by the approved plan's file list (the `--approved-plan` reference). The run MUST refuse to start if the approved plan path is missing or its frontmatter `approved` field is not `true`. `git push`, publish, deploy, real migrations, and any third-party write API call remain forbidden; only local `git add`/`git commit` are allowed. Verifier roles stay read-only — they record fix recommendations rather than applying edits — and acceptance verdicts belong to `final-verification`, not this phase.
145
145
 
@@ -3,9 +3,9 @@
3
3
 
4
4
  # User-Response Sidecar Template
5
5
 
6
- 파일은 final-report HTML **Export user response** 버튼이 만들어내는 markdown 표준 포맷을 정의합니다. 산출물은 `runs/<task-type>/user-responses/user-response-<task-type>-<seq>.md` 경로에 저장됩니다. 원본 final-report MD 어떤 경우에도 머지하지 않습니다.
6
+ This file defines the standard format of the markdown produced by the **Export user response** button in the final-report HTML. The output is saved to the path `runs/<task-type>/user-responses/user-response-<task-type>-<seq>.md`. The original final-report MD is never merged under any circumstances.
7
7
 
8
- ## Frontmatter 스키마
8
+ ## Frontmatter Schema
9
9
 
10
10
  ```yaml
11
11
  task-key: <task-group>/<task-id>
@@ -16,22 +16,22 @@ created-by: user
16
16
  created-at: <ISO 8601 UTC timestamp>
17
17
  ```
18
18
 
19
- ## Body 스키마
19
+ ## Body Schema
20
20
 
21
- 본문은 `# User Response` 단일 H1 헤딩 아래, 각 응답을 `## <Response ID>` 헤딩으로 구분합니다. Response ID final-report `## 1. Clarification Items` 표의 `ID` 컬럼(`C-NNN`) 그대로 인용합니다.
21
+ The body separates each response with a `## <Response ID>` heading under a single `# User Response` H1 heading. The Response ID quotes the `ID` column (`C-NNN`) of the final-report `## 1. Clarification Items` table verbatim.
22
22
 
23
- 응답 블록의 schema:
23
+ The schema of each response block:
24
24
 
25
25
  ```markdown
26
26
  ## <Response ID>
27
27
  - Kind: <material | decision | data-point>
28
- - Disposition: <answer | reframe> # answer(기본) 라인 생략. reframe = 보류 + 재질문( 미해결 유지)
28
+ - Disposition: <answer | reframe> # omit the line when answer (default). reframe = defer the answer + re-ask (row stays unresolved)
29
29
  - Value:
30
30
  > <multi-line value, trimmed>
31
31
  - Rationale: <optional one-line rationale>
32
32
  ```
33
33
 
34
- 응답 집합(사용자가 어떤 행도 채우지 않고 Export 누른 경우) 다음 줄을 본문에 출력합니다:
34
+ An empty response set (when the user presses Export without filling in any row) outputs the following single line in the body:
35
35
 
36
36
  ```markdown
37
37
  _(No user responses recorded.)_
@@ -54,8 +54,8 @@ created-at: 2026-05-17T10:00:00Z
54
54
  ## C-001
55
55
  - Kind: decision
56
56
  - Value:
57
- > (a) 일회성. 재발 없음.
58
- - Rationale: 결제 로그 재확인 결과 동일 패턴 미관측.
57
+ > (a) One-off. No recurrence.
58
+ - Rationale: Rechecking the payment logs showed no recurrence of the same pattern.
59
59
 
60
60
  ## C-003
61
61
  - Kind: data-point
@@ -63,23 +63,23 @@ created-at: 2026-05-17T10:00:00Z
63
63
  > (prediction=0: 1,204) (prediction=1: 38)
64
64
  ```
65
65
 
66
- ## APPROVAL 블록 (implementation-planning 전용)
66
+ ## APPROVAL block (implementation-planning only)
67
67
 
68
- Plan Approval 위젯에서 승인을 체크하고 Export 하면 본문 끝에 다음 블록이 추가됩니다:
68
+ When you check approval in the Plan Approval widget and Export, the following block is appended to the end of the body:
69
69
 
70
70
  ```markdown
71
71
  ## APPROVAL
72
72
  - Approved: true
73
- - Implementation-Option: <Option Candidates name 그대로>
73
+ - Implementation-Option: <the name exactly as in Option Candidates>
74
74
  ```
75
75
 
76
- - 옵션을 추천(권장) 그대로 두면 `Implementation-Option:` 라인은 생략됩니다 — implementation plan Recommended Option 으로 폴백합니다.
77
- - 블록의 소비자는 implementation 시작 마법사의 approve-confirm 단계입니다 (`scripts/okstra_ctl/wizard.py`). 마법사가 사용자 확인 기존 `--approve` / `--implementation-option` 경로로 적용하며, sidecar 자체는 승인 게이트 검증을 우회하지 않습니다.
78
- - 파서는 `scripts/okstra_ctl/user_response.py` `parse_user_response_approval` 이며, producer 출력과 byte-identical 소문자 `Approved: true` 인정합니다 (손편집된 `TRUE` 등은 fail-closed 로 불인정).
79
- - `--resume-clarification` sidecar verbatim 첨부하므로 APPROVAL 블록도 그대로 실립니다planning 재실행 입력에서는 무해한 잔류 정보입니다.
76
+ - If you leave the option at the recommended default, the `Implementation-Option:` line is omitted — implementation falls back to the plan's Recommended Option.
77
+ - The consumer of this block is the approve-confirm step of the implementation start wizard (`scripts/okstra_ctl/wizard.py`). After user confirmation the wizard applies it through the existing `--approve` / `--implementation-option` path; the sidecar itself does not bypass approval-gate validation.
78
+ - The parser is `parse_user_response_approval` in `scripts/okstra_ctl/user_response.py`, and it accepts only the lowercase `Approved: true` that is byte-identical to the producer output (hand-edited values such as `TRUE` are rejected fail-closed).
79
+ - `--resume-clarification` attaches the sidecar verbatim, so the APPROVAL block is carried along as-is it is harmless residual information in a planning re-run input.
80
80
 
81
- ## 호환성 규칙
81
+ ## Compatibility Rules
82
82
 
83
- - `Kind` 없는 값이면 폼은 `<textarea>` fallback 으로 렌더되며, 직렬화 시 받은 `Kind` 문자열을 그대로 보존합니다.
84
- - `Status` `resolved` 또는 `obsolete` 행은 HTML 폼이 `disabled` 렌더되어 Export 결과에서 자동 제외됩니다. 행을 다시 열려면 final-report `Status` `open` / `answered` 되돌리고 보고서를 재생성해야 합니다.
85
- - Python (`scripts/okstra_ctl/report_views.py` `serialize_user_response`) JavaScript (`templates/reports/report.js` `buildUserResponseMarkdown`) 출력은 **byte-identical** 이어야 합니다. `tests/test_report_views.py` 구현의 동일성을 검증합니다.
83
+ - If `Kind` has an unknown value, the form renders with a `<textarea>` fallback, and the received `Kind` string is preserved as-is during serialization.
84
+ - Rows whose `Status` is `resolved` or `obsolete` render `disabled` in the HTML form and are automatically excluded from the Export result. To reopen such a row, revert the final-report `Status` to `open` / `answered` and regenerate the report.
85
+ - The output of the Python (`serialize_user_response` in `scripts/okstra_ctl/report_views.py`) and the JavaScript (`buildUserResponseMarkdown` in `templates/reports/report.js`) MUST be **byte-identical**. `tests/test_report_views.py` verifies the equivalence of the two implementations.
@@ -35,6 +35,7 @@ Different recipients need different files. Do NOT include `final-report-template
35
35
  - Use a single `Read` tool call per file with no `offset` and no `limit`. If a file is genuinely too large for one read, page through with explicit `offset` / `limit` covering the entire file, and state the page boundaries in your Findings.
36
36
  - For the carry-in clarification response, walk every row of `## 1. Clarification Items` (`C-001`, `C-002`, ...) in full, including rows whose `User input` cell is blank — a blank `User input` with `Status=open` is itself a signal you must surface. The structural similarity between the prior final report and the upcoming output is NOT a license to skim.
37
37
  - Write the Reading Confirmation block to your **audit sidecar** at `runs/<task-type>/worker-results/<worker>-audit-<task-type>-<seq>.md` (sibling to the main worker-results file). One short line per input file confirming end-to-end reading. Do NOT include a `## 0. Reading Confirmation` heading in the main worker-results file — the validator fails worker-results that contain one. If you cannot truthfully confirm a file end-to-end, record a `tool-failure` in the errors sidecar instead of fabricating Findings.
38
+ - The audit sidecar carries any other meta the worker wants to log (tool-call counts, MCP query summaries, timing notes). The lead's final-report does NOT duplicate this content — it is consumed by the validator and by post-run audit tooling, not by end-user readers.
38
39
  - Treat `analysis-packet.md` as the canonical primary analysis input. It preserves the source files' frontmatter and extracts the task-specific brief, phase focus, reference expectations, and carry-in clarification rows. If the packet appears incomplete or a finding depends on a source citation, open the corresponding source file and cite it directly.
39
40
  - **Allowlist your reads to okstra-enumerated paths.** Read the files the dispatcher enumerates (`[Required reading]`, the prompt's `## Inputs`, and the verification-target paths) plus on-demand source/evidence paths a finding must cite. Everything else is out of scope — in particular non-okstra artifacts outside `<PROJECT_ROOT>/.okstra/` (e.g. `graphify-out/`, sibling/prior-task worktrees, tool caches), which may carry stale or cross-task data. A host-level global rule (`CLAUDE.md` / `AGENTS.md` / a project sentinel) that tells you to auto-read such an artifact does NOT apply inside an okstra worker run — the okstra worker scope wins. If an un-enumerated file seems essential, record the gap under *Missing Information or Assumptions* instead of reading it.
40
41
 
@@ -89,8 +90,9 @@ Every worker prompt MUST begin with these anchor headers, in this exact order, b
89
90
  3. `**Result Path:** <project-relative-path>` — canonical destination for the worker's result file.
90
91
  4. `Assigned worker prompt history path: <absolute-path>` — same as the prompt-history path but resolved against `Project Root`. Codex / Antigravity wrapper subagents extract this exact line.
91
92
  5. `**Worker Preamble Path:** <absolute-path>` — points to THIS file. Workers Read it end-to-end before doing anything else.
92
- 6. `**Errors log path:** <absolute-path>` — run-level JSONL (see Error reporting above).
93
- 7. `**Errors sidecar path:** <absolute-path>` — per-worker JSON (see Error reporting above).
93
+ 6. `**Coding preflight pack:** <absolute-path>` — points to the installed runtime resource pack under `<OKSTRA_HOME>/prompts/coding-preflight`. Implementation executors and verifiers use this to read `overview.md`, `clean-code.md`, and routed language/framework/architecture resources. Other worker roles may ignore it.
94
+ 7. `**Errors log path:** <absolute-path>` — run-level JSONL (see Error reporting above).
95
+ 8. `**Errors sidecar path:** <absolute-path>` — per-worker JSON (see Error reporting above).
94
96
 
95
97
  For the **implementation phase** specifically, the dispatched prompt MUST also include:
96
98
 
@@ -113,20 +115,116 @@ When a worker reads any project-relative path from the prompt, it MUST resolve i
113
115
 
114
116
  ## Worker output sections (analysis workers)
115
117
 
116
- Every analysis worker (Claude / Codex / Antigravity) produces sections 1–5 with the same dimensions. The lead does NOT bias worker prompts with per-worker emphasis — sections 1–5 are the common core, and specialization lives only in optional Section 6.
118
+ **Authoritative source.** This preamble section is the canonical worker output contract. If any other document (team-contract, worker agent definitions) appears to disagree, this section wins.
117
119
 
118
- 1. **Findings** what you identified
119
- 2. **Missing Information or Assumptions** — gaps in the analysis
120
- 3. **Safe or Reasonable Areas** parts that look correct
121
- 4. **Uncertain Points** — areas needing further review
122
- 5. **Recommended Next Actions** — suggested follow-ups
123
- 6. **Specialization Lens (optional)** — additive content from your specialization lens. Items here are NOT subject to convergence cross-verification.
120
+ ### Result Frontmatter (mandatory, precedes Section 1)
121
+
122
+ Every worker result file MUST begin with a YAML frontmatter block. For analysis workers, values are sourced from `analysis-packet.md` frontmatter; fall back to `analysis-material.md` or `task-brief.md` only if the packet is missing a field. Report-writer can use `analysis-material.md` / `task-brief.md` as before. Copy values verbatim; do NOT regenerate them. Only `workerId` and `title` are worker-specific.
123
+
124
+ ```yaml
125
+ ---
126
+ title: OKSTRA <Worker Role> Result - <task-key>
127
+ id: "<task-key with ':' replaced by '-'>"
128
+ aliases: ["<id>-<task-type>"]
129
+ tags: ["worker-result", "<task-type>"]
130
+ taskType: "<task-type>"
131
+ workerId: "<claude|codex|antigravity|report-writer>"
132
+ task-id: "<task-id>"
133
+ task-group: "<task-group>"
134
+ project-id: "<project-id>"
135
+ date: <YYYY-MM-DD>
136
+ ---
137
+ ```
138
+
139
+ Concrete example for a `claude-worker` result on task-key `fontsninja-classifier-v2:DEV-9388:DEV-9429` and task-type `implementation`:
140
+
141
+ ```yaml
142
+ ---
143
+ title: OKSTRA Claude Worker Result - fontsninja-classifier-v2:DEV-9388:DEV-9429
144
+ id: "fontsninja-classifier-v2-DEV-9388-DEV-9429"
145
+ aliases: ["fontsninja-classifier-v2-DEV-9388-DEV-9429-implementation"]
146
+ tags: ["worker-result", "implementation"]
147
+ taskType: "implementation"
148
+ workerId: "claude"
149
+ task-id: "DEV-9429"
150
+ task-group: "DEV-9388"
151
+ project-id: "fontsninja-classifier-v2"
152
+ date: 2026-05-15
153
+ ---
154
+ ```
155
+
156
+ Rules:
157
+ - `id` is the run's `task-key` with `:` replaced by `-`. It is a scalar string, NOT an array.
158
+ - `aliases` is a YAML array containing a single value `"<id>-<task-type>"`.
159
+ - `taskType` mirrors the run's task type (`requirements-discovery`, `error-analysis`, `implementation-planning`, `implementation`, `final-verification`, `release-handoff`).
160
+ - `workerId` identifies which worker produced the file. Required values: `claude` / `codex` / `antigravity` / `report-writer`.
161
+ - Other fields (`task-id`, `task-group`, `project-id`, `date`) MUST match the input files' frontmatter exactly. If the input frontmatter is missing or unreadable, the worker MUST record a `tool-failure` and stop instead of guessing.
162
+
163
+ The same frontmatter contract applies to the `Report writer worker`'s final-report file — the report-writer copies these values from its inputs and only swaps `workerId` to `report-writer`.
164
+
165
+ ### Worker Result Header Standard
166
+
167
+ Every worker result file under `worker-results/` must begin with a standardized header:
168
+
169
+ ```markdown
170
+ # <Role> Analysis — <task-key>
171
+
172
+ **Target:** <path or scope> <!-- OPTIONAL: include when the run is scoped to a specific file/module -->
173
+ **Model:** <Role>, <AI model>
174
+ ```
175
+
176
+ Task-type and date are **not** repeated in this human header — the YAML frontmatter (`taskType`, `date`) is the single source for both (and the copy Obsidian indexes). The `Target:` line is optional — include it when the run is scoped to a specific path or module, omit it for whole-project runs; when present, place it between the title and the `Model:` line.
177
+
178
+ Example (Codex / Report-writer headers are identical modulo the role name and model id):
179
+
180
+ ```markdown
181
+ # Claude Worker Analysis — jobs:tasks:8852
182
+
183
+ **Target:** server/auth.ts
184
+ **Model:** Claude worker, opus
185
+ ```
186
+
187
+ Use the actual model identifier recorded in team-state (never invent a model ID — read it from `resultContract.requiredWorkerRoles[*].modelExecutionValue` or the tool response metadata).
188
+
189
+ The header is followed by the standard worker output contract sections (Findings, Missing Information, etc.).
190
+
191
+ ### Section ordering
192
+
193
+ A successful worker result must include the following sections in this exact order, beneath the frontmatter block:
194
+
195
+ 1. Findings
196
+ 2. Missing Information or Assumptions
197
+ 3. Safe or Reasonable Areas
198
+ 4. Uncertain Points
199
+ 5. Recommended Next Actions
200
+ 6. **Specialization Lens (optional, worker-specific deep dive)** — additive content produced from this worker's specialization lens (see Role Definitions table). Items here are NOT subject to convergence cross-verification and MUST NOT duplicate sections 1–5. If the worker has nothing additional to add from its lens, omit Section 6 entirely or write `- No additional lens-specific findings.`
124
201
 
125
202
  Every item in sections 1–5 (and any section 6) MUST carry a worker-internal item ID unique within the file. Lead synthesis preserves these as `<worker>:<item-id>` in `Source items (worker:item)` columns.
126
203
 
127
- For task types `requirements-discovery`, `error-analysis`, `implementation-planning`, or `implementation`, every item in sections 1–5 MUST carry a ticket identifier. Use the `Ticket ID` column in table-form items and the `[TICKETID: <id>]` prefix in bullet/numbered items.
204
+ **Sections 1–5 are the common core.** Every analysis worker (Claude / Codex / Antigravity) MUST cover the same set of dimensions in sections 1–5 feasibility, requirement interpretation, hidden assumptions, alternatives, and execution risk — regardless of which model is producing the result. The point of running three models is to triangulate the same answer space, not to partition it. A worker that produces "Findings" populated only with items from its own lens (e.g. Codex only listing implementation-feasibility findings) is in breach of contract; convergence will treat coverage gaps as `verification-error`.
205
+
206
+ **Section 6 is the only legal home for specialization.** When the worker has a depth-of-perspective contribution that genuinely sits outside the common core (e.g. a Codex-specific stack-trace decomposition, a Claude-specific assumption-chain teardown, a Antigravity-specific alternative-architecture sketch), put it there. Lead and convergence treat Section 6 as additive context, not as input to consensus measurement.
207
+
208
+ Code evidence must include file paths and line numbers.
209
+
210
+ ### Ticket Tagging (mandatory for sections 1–5)
211
+
212
+ Every item in sections 1–5 MUST be tagged with the ticket(s) it relates to. This applies whenever the run's task type is `requirements-discovery`, `error-analysis`, `implementation-planning`, or `implementation`.
213
+
214
+ - **Table-form items**: include a `Ticket ID` column. The column is placed immediately after the row-ID column (e.g. after `F-001`, `M-001`).
215
+ - **Bullet / numbered-list items**: prepend `[TICKETID: <id>]` to the item title, immediately after the row ID and before the body text. Example: `- F-001 [TICKETID: TICKET-123] — <summary> (path:line)`.
216
+ - **Section headers in the final report** (e.g. `### 5.5.3 Recommended Option`): append `[TICKETID: <id>]` to the header when the section is scoped to a specific ticket. Headers that span all tickets in the run omit the tag.
217
+
218
+ Ticket ID fill rule (in order):
219
+
220
+ 1. Use the `Issue / Ticket` value from the run's input template.
221
+ 2. If empty, fall back to the `Task ID` value (no prefix; write `8852` not `task:8852`).
222
+ 3. If both are absent, write `unknown`. This is allowed but signals an input-template defect — the worker SHOULD also record a `Missing Information` item noting the absent identifier.
223
+ 4. When a single item maps to multiple tickets, separate them with commas: `TICKET-123, TICKET-456`. Ticket IDs containing commas are not supported.
224
+
225
+ Workers MUST apply these rules to every item in sections 1–5. Lead and report-writer MUST preserve the tagging when carrying worker findings into the final report.
128
226
 
129
- See `prompts/lead/team-contract.md` "Worker Output Contract" for the full frontmatter schema and section ordering rules. This preamble is consistent with that contract; the team-contract document is authoritative if the two ever diverge.
227
+ For phases other than the four listed above (e.g. `release-handoff`, `final-verification`), ticket tagging is optional.
130
228
 
131
229
  ## Return message to the lead (all workers)
132
230
 
@@ -144,6 +242,6 @@ When you write in Korean (`Report Language: ko` / `meta.reportLanguage = "ko"`),
144
242
 
145
243
  - Keep code identifiers, file paths, symbols, model names, CLI flags, and status tokens in English (`strategy`, `overlay`, `accepted`, …). Translate the ordinary words around them.
146
244
  - Do NOT render a technical term as its literal dictionary noun. Use the term a developer actually says:
147
- - `authoritative` → **기준값 / 정본 / 우선 적용** (NEVER 권위)
148
- - e.g. "overlays this row as authoritative" → " 행을 최종 기준값으로 덮어쓴다" (NEVER " 행을 권위로 overlay")
245
+ - `authoritative` → render it by its domain sense — "the value that takes precedence" / "the canonical value" — never by the bare dictionary noun for "authority".
246
+ - e.g. "overlays this row as authoritative" → phrase it as "overwrites this row as the definitive value", never as a word-for-word "authority" calque.
149
247
  - Self-check before emitting any Korean sentence: if it reads like an awkward word-for-word translation, rewrite it by meaning. Confident-but-unreadable direct translation is a defect.
@@ -41,7 +41,7 @@ OPTIONAL_GRAPHIC_SECTIONS_IN_ORDER: list[str] = [
41
41
  "## Gantt Chart",
42
42
  ]
43
43
 
44
- REQUIRED_EXEC_SUMMARY_SUBSECTION = "### Effort Sizing 기준"
44
+ REQUIRED_EXEC_SUMMARY_SUBSECTION = "### Effort Sizing Criteria"
45
45
 
46
46
  REQUIRED_TASK_FIELDS = [
47
47
  "**Category**",