okstra 0.202.0 → 0.204.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 (258) hide show
  1. package/README.md +3 -3
  2. package/dist/cli-registry.mjs +7 -7
  3. package/dist/cli-registry.mjs.map +1 -1
  4. package/dist/commands/lifecycle/install.mjs +50 -124
  5. package/dist/commands/lifecycle/install.mjs.map +1 -1
  6. package/dist/commands/memory/memory.mjs +41 -8
  7. package/dist/commands/memory/memory.mjs.map +1 -1
  8. package/dist/lib/install-assets.mjs +3 -0
  9. package/dist/lib/install-assets.mjs.map +1 -1
  10. package/dist/lib/runtime-manifest.mjs +2 -1
  11. package/dist/lib/runtime-manifest.mjs.map +1 -1
  12. package/dist/lib/types.d.mts +2 -1
  13. package/docs/architecture/storage-model.md +14 -11
  14. package/docs/architecture.md +25 -19
  15. package/docs/cli.md +15 -12
  16. package/docs/contributor-change-matrix.md +3 -2
  17. package/docs/performance-improvement-plan-v2.md +2 -3
  18. package/docs/project-structure-overview.md +35 -9
  19. package/docs/task-process/README.md +1 -1
  20. package/docs/task-process/common-flow.md +1 -1
  21. package/docs/task-process/final-verification.md +3 -1
  22. package/docs/task-process/implementation.md +1 -1
  23. package/docs/task-process/release-handoff.md +36 -39
  24. package/package.json +1 -2
  25. package/runtime/BUILD.json +2 -2
  26. package/runtime/agents/common.json +28 -0
  27. package/runtime/agents/operations/code-review.json +6 -0
  28. package/runtime/agents/operations/report-translation.json +6 -0
  29. package/runtime/agents/operations/schedule-verification.json +6 -0
  30. package/runtime/agents/roles/analyser.json +18 -0
  31. package/runtime/agents/roles/critic.json +18 -0
  32. package/runtime/agents/roles/designer.json +18 -0
  33. package/runtime/agents/roles/implementer.json +20 -0
  34. package/runtime/agents/roles/leader.json +20 -0
  35. package/runtime/agents/roles/planner.json +18 -0
  36. package/runtime/agents/roles/report-writer.json +19 -0
  37. package/runtime/agents/roles/translator.json +19 -0
  38. package/runtime/agents/roles/verifier.json +18 -0
  39. package/runtime/bin/lib/okstra/usage.sh +5 -5
  40. package/runtime/prompts/duties/acceptance-critic.json +32 -0
  41. package/runtime/prompts/duties/acceptance-verifier.json +32 -0
  42. package/runtime/prompts/duties/analysis-worker.json +32 -0
  43. package/runtime/prompts/duties/code-reviewer.json +32 -0
  44. package/runtime/prompts/duties/diagnosis-worker.json +32 -0
  45. package/runtime/prompts/duties/direction-selection-worker.json +32 -0
  46. package/runtime/prompts/duties/discovery-worker.json +32 -0
  47. package/runtime/prompts/duties/implementation-executor.json +32 -0
  48. package/runtime/prompts/duties/implementation-verifier.json +32 -0
  49. package/runtime/prompts/duties/lead.json +32 -0
  50. package/runtime/prompts/duties/planning-worker.json +36 -0
  51. package/runtime/prompts/duties/report-writer.json +32 -0
  52. package/runtime/prompts/duties/reverification-worker.json +32 -0
  53. package/runtime/prompts/duties/schedule-verifier.json +32 -0
  54. package/runtime/prompts/duties/scope-critic.json +32 -0
  55. package/runtime/prompts/duties/technical-verification-worker.json +32 -0
  56. package/runtime/prompts/duties/translator.json +32 -0
  57. package/runtime/prompts/launch.template.md +2 -1
  58. package/runtime/prompts/lead/adapters/cmux.md +1 -1
  59. package/runtime/prompts/lead/convergence.md +4 -4
  60. package/runtime/prompts/lead/okstra-lead-contract.md +113 -4
  61. package/runtime/prompts/lead/plan-body-verification.md +6 -6
  62. package/runtime/prompts/lead/report-writer.md +3 -3
  63. package/runtime/prompts/profiles/_common-contract.md +2 -2
  64. package/runtime/prompts/profiles/_implementation-executor.md +4 -1
  65. package/runtime/prompts/profiles/_implementation-verifier.md +2 -2
  66. package/runtime/prompts/profiles/change-impact-analysis.json +31 -0
  67. package/runtime/prompts/profiles/change-impact-analysis.md +0 -20
  68. package/runtime/prompts/profiles/error-analysis.json +39 -0
  69. package/runtime/prompts/profiles/error-analysis.md +0 -25
  70. package/runtime/prompts/profiles/feature-analysis.json +31 -0
  71. package/runtime/prompts/profiles/feature-analysis.md +0 -20
  72. package/runtime/prompts/profiles/final-verification.json +30 -0
  73. package/runtime/prompts/profiles/final-verification.md +3 -22
  74. package/runtime/prompts/profiles/forbidden-actions.json +4 -3
  75. package/runtime/prompts/profiles/implementation-option-selection.json +31 -0
  76. package/runtime/prompts/profiles/implementation-option-selection.md +0 -20
  77. package/runtime/prompts/profiles/implementation-planning.json +40 -0
  78. package/runtime/prompts/profiles/implementation-planning.md +4 -29
  79. package/runtime/prompts/profiles/implementation.json +30 -0
  80. package/runtime/prompts/profiles/implementation.md +1 -20
  81. package/runtime/prompts/profiles/improvement-discovery.json +31 -0
  82. package/runtime/prompts/profiles/improvement-discovery.md +0 -20
  83. package/runtime/prompts/profiles/project-analysis.json +31 -0
  84. package/runtime/prompts/profiles/project-analysis.md +0 -20
  85. package/runtime/prompts/profiles/release-handoff.json +5 -0
  86. package/runtime/prompts/profiles/release-handoff.md +71 -73
  87. package/runtime/prompts/profiles/requirements-discovery.json +39 -0
  88. package/runtime/prompts/profiles/requirements-discovery.md +0 -25
  89. package/runtime/prompts/profiles/technical-verification.json +39 -0
  90. package/runtime/prompts/profiles/technical-verification.md +0 -25
  91. package/runtime/prompts/wizard/prompts.ko.json +12 -17
  92. package/runtime/python/okstra_ctl/adapters/hosts/antigravity/relay.md +1 -0
  93. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/adapter.py +3 -0
  94. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/manifest.json +1 -1
  95. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/relay.md +4 -3
  96. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/worker-session.md +108 -0
  97. package/runtime/python/okstra_ctl/adapters/hosts/codex/relay.md +1 -0
  98. package/runtime/python/okstra_ctl/adapters/hosts/grok/relay.md +2 -0
  99. package/runtime/python/okstra_ctl/adapters/hosts/kimi/relay.md +2 -0
  100. package/runtime/python/okstra_ctl/adapters/providers/antigravity/adapter.py +8 -1
  101. package/runtime/python/okstra_ctl/adapters/providers/claude/adapter.py +8 -0
  102. package/runtime/python/okstra_ctl/adapters/providers/codex/adapter.py +23 -6
  103. package/runtime/python/okstra_ctl/adapters/providers/grok/adapter.py +6 -2
  104. package/runtime/python/okstra_ctl/agent/invocation.py +168 -113
  105. package/runtime/python/okstra_ctl/agent/prompt_cli/cli.py +120 -0
  106. package/runtime/python/okstra_ctl/agent/prompt_cli/materialize.py +107 -2
  107. package/runtime/python/okstra_ctl/agent/prompt_cli/run_identity.py +0 -49
  108. package/runtime/python/okstra_ctl/analysis_packet.py +4 -1
  109. package/runtime/python/okstra_ctl/application/open_worker.py +6 -1
  110. package/runtime/python/okstra_ctl/assignment_resolver.py +16 -5
  111. package/runtime/python/okstra_ctl/cmux.py +69 -20
  112. package/runtime/python/okstra_ctl/code_review_target.py +16 -8
  113. package/runtime/python/okstra_ctl/conformance.py +43 -0
  114. package/runtime/python/okstra_ctl/consumers.py +6 -3
  115. package/runtime/python/okstra_ctl/container.py +31 -8
  116. package/runtime/python/okstra_ctl/context_cost.py +11 -15
  117. package/runtime/python/okstra_ctl/contract_refreeze.py +156 -0
  118. package/runtime/python/okstra_ctl/convergence_provenance.py +7 -1
  119. package/runtime/python/okstra_ctl/design_prep.py +34 -1
  120. package/runtime/python/okstra_ctl/dispatch_core.py +53 -27
  121. package/runtime/python/okstra_ctl/domain/host.py +5 -0
  122. package/runtime/python/okstra_ctl/domain/worker_runtime.py +10 -0
  123. package/runtime/python/okstra_ctl/error_report.py +4 -3
  124. package/runtime/python/okstra_ctl/execution_manifest.py +71 -18
  125. package/runtime/python/okstra_ctl/handoff.py +167 -277
  126. package/runtime/python/okstra_ctl/implementation_stage.py +9 -0
  127. package/runtime/python/okstra_ctl/initial_prompt_materialization.py +113 -0
  128. package/runtime/python/okstra_ctl/lead_progress.py +1 -1
  129. package/runtime/python/okstra_ctl/legacy_model_selection.py +2 -2
  130. package/runtime/python/okstra_ctl/manager_cli.py +92 -4
  131. package/runtime/python/okstra_ctl/manager_launch.py +1 -1
  132. package/runtime/python/okstra_ctl/manager_paths.py +14 -3
  133. package/runtime/python/okstra_ctl/manager_store.py +210 -3
  134. package/runtime/python/okstra_ctl/manager_sync.py +4 -1
  135. package/runtime/python/okstra_ctl/manager_view.py +2 -1
  136. package/runtime/python/okstra_ctl/model_discovery.py +30 -0
  137. package/runtime/python/okstra_ctl/model_io/lines.py +14 -1
  138. package/runtime/python/okstra_ctl/model_io/renderers.py +4 -3
  139. package/runtime/python/okstra_ctl/models.py +1 -1
  140. package/runtime/python/okstra_ctl/next_phase.py +16 -6
  141. package/runtime/python/okstra_ctl/operation_invocation.py +86 -0
  142. package/runtime/python/okstra_ctl/option_comparison.py +168 -0
  143. package/runtime/python/okstra_ctl/path_hints.py +9 -0
  144. package/runtime/python/okstra_ctl/paths.py +3 -0
  145. package/runtime/python/okstra_ctl/profile_show.py +42 -1
  146. package/runtime/python/okstra_ctl/registry/host_discovery.py +20 -12
  147. package/runtime/python/okstra_ctl/registry/host_registry.py +11 -0
  148. package/runtime/python/okstra_ctl/render.py +50 -0
  149. package/runtime/python/okstra_ctl/report_contract.py +1 -1
  150. package/runtime/python/okstra_ctl/report_html/view_models/release_handoff.py +21 -3
  151. package/runtime/python/okstra_ctl/report_synthesis_packet.py +177 -17
  152. package/runtime/python/okstra_ctl/report_translation.py +2 -1
  153. package/runtime/python/okstra_ctl/report_translation_dispatch.py +69 -9
  154. package/runtime/python/okstra_ctl/role_requirements.py +142 -129
  155. package/runtime/python/okstra_ctl/rollup.py +3 -1
  156. package/runtime/python/okstra_ctl/run.py +76 -29
  157. package/runtime/python/okstra_ctl/schedule_semantics.py +17 -6
  158. package/runtime/python/okstra_ctl/stage_fix_carry.py +23 -4
  159. package/runtime/python/okstra_ctl/stage_integrate.py +178 -18
  160. package/runtime/python/okstra_ctl/stage_map.py +16 -2
  161. package/runtime/python/okstra_ctl/stage_targets.py +209 -43
  162. package/runtime/python/okstra_ctl/team.py +22 -13
  163. package/runtime/python/okstra_ctl/time_report.py +2 -1
  164. package/runtime/python/okstra_ctl/usage_report.py +3 -1
  165. package/runtime/python/okstra_ctl/wizard/confirmation.py +3 -9
  166. package/runtime/python/okstra_ctl/wizard/ids.py +1 -1
  167. package/runtime/python/okstra_ctl/wizard/registry.py +1 -1
  168. package/runtime/python/okstra_ctl/wizard/state.py +3 -5
  169. package/runtime/python/okstra_ctl/wizard/steps_plan.py +3 -23
  170. package/runtime/python/okstra_ctl/worker_prompt_contract.py +5 -1
  171. package/runtime/python/okstra_ctl/worker_prompt_headers.py +35 -7
  172. package/runtime/python/okstra_ctl/worker_prompt_policy.py +66 -48
  173. package/runtime/python/okstra_ctl/workflow.py +1 -1
  174. package/runtime/python/okstra_ctl/worktree/__init__.py +3 -1
  175. package/runtime/python/okstra_ctl/worktree/naming.py +9 -0
  176. package/runtime/python/okstra_ctl/worktree_registry.py +38 -9
  177. package/runtime/python/okstra_token_usage/pricing.py +6 -4
  178. package/runtime/schemas/agent-common-v1.schema.json +34 -0
  179. package/runtime/schemas/agent-duty-v1.schema.json +38 -0
  180. package/runtime/schemas/agent-operation-v1.schema.json +11 -0
  181. package/runtime/schemas/agent-profile-v1.schema.json +46 -0
  182. package/runtime/schemas/agent-role-v1.schema.json +29 -0
  183. package/runtime/schemas/final-report-v2.0.schema.json +118 -97
  184. package/runtime/schemas/final-report-v3.0.schema.json +118 -97
  185. package/runtime/skills/okstra-brief-gen/SKILL.md +84 -4
  186. package/runtime/skills/okstra-chat/SKILL.md +2 -2
  187. package/runtime/skills/okstra-code-review/SKILL.md +23 -9
  188. package/runtime/skills/okstra-container-build/SKILL.md +10 -10
  189. package/runtime/skills/okstra-inspect/SKILL.md +1 -1
  190. package/runtime/skills/okstra-inspect/facets/cost.md +1 -1
  191. package/runtime/skills/okstra-inspect/facets/error-zip.md +9 -9
  192. package/runtime/skills/okstra-inspect/facets/errors.md +16 -16
  193. package/runtime/skills/okstra-inspect/facets/logs.md +7 -7
  194. package/runtime/skills/okstra-inspect/facets/recap.md +2 -2
  195. package/runtime/skills/okstra-inspect/facets/report.md +1 -1
  196. package/runtime/skills/okstra-inspect/facets/status.md +4 -3
  197. package/runtime/skills/okstra-inspect/facets/time.md +11 -10
  198. package/runtime/skills/okstra-manager/SKILL.md +18 -2
  199. package/runtime/skills/okstra-pr-gen/SKILL.md +6 -5
  200. package/runtime/skills/okstra-rollup/SKILL.md +5 -5
  201. package/runtime/skills/okstra-run/SKILL.md +31 -12
  202. package/runtime/skills/okstra-schedule-gen/SKILL.md +19 -14
  203. package/runtime/skills/okstra-setup/SKILL.md +12 -10
  204. package/runtime/skills/okstra-setup/references/project-config.md +7 -6
  205. package/runtime/skills/okstra-usage/SKILL.md +1 -1
  206. package/runtime/skills/okstra-user-response/SKILL.md +1 -1
  207. package/runtime/templates/manager/view.template.html +1 -0
  208. package/runtime/templates/report-writer-prompt-preamble.md +8 -0
  209. package/runtime/templates/reports/brief.template.md +14 -4
  210. package/runtime/templates/reports/html/i18n/en.json +5 -4
  211. package/runtime/templates/reports/html/i18n/ko.json +5 -4
  212. package/runtime/templates/reports/html/tasks/release-handoff.template.html +8 -5
  213. package/runtime/templates/reports/i18n/en.json +1 -1
  214. package/runtime/templates/reports/md/tasks/release-handoff.template.md +1 -1
  215. package/runtime/templates/reports/release-handoff-input.template.md +6 -4
  216. package/runtime/templates/translator-prompt-preamble.md +36 -0
  217. package/runtime/validators/checks/validate-assets-01.py +7 -8
  218. package/runtime/validators/validate-brief.py +70 -0
  219. package/runtime/validators/validate-implementation-plan-stages.py +2 -1
  220. package/runtime/validators/validate-run.py +59 -9
  221. package/runtime/validators/validate-schedule.py +9 -0
  222. package/docs/for-ai/README.md +0 -68
  223. package/docs/for-ai/skills/okstra-brief-gen.md +0 -262
  224. package/docs/for-ai/skills/okstra-chat.md +0 -34
  225. package/docs/for-ai/skills/okstra-code-review.md +0 -57
  226. package/docs/for-ai/skills/okstra-container-build.md +0 -129
  227. package/docs/for-ai/skills/okstra-inspect.md +0 -262
  228. package/docs/for-ai/skills/okstra-manager.md +0 -86
  229. package/docs/for-ai/skills/okstra-memory.md +0 -126
  230. package/docs/for-ai/skills/okstra-pr-gen.md +0 -49
  231. package/docs/for-ai/skills/okstra-rollup.md +0 -114
  232. package/docs/for-ai/skills/okstra-run.md +0 -250
  233. package/docs/for-ai/skills/okstra-schedule-gen.md +0 -240
  234. package/docs/for-ai/skills/okstra-setup.md +0 -167
  235. package/docs/for-ai/skills/okstra-usage.md +0 -29
  236. package/docs/for-ai/skills/okstra-user-response.md +0 -72
  237. package/runtime/agents/workers/claude-worker.md +0 -128
  238. package/runtime/agents/workers/report-writer-worker.md +0 -37
  239. package/runtime/agents/workers/translator-worker.md +0 -63
  240. package/runtime/prompts/duties/acceptance-critic.md +0 -44
  241. package/runtime/prompts/duties/acceptance-verifier.md +0 -44
  242. package/runtime/prompts/duties/analysis-worker.md +0 -44
  243. package/runtime/prompts/duties/code-reviewer.md +0 -44
  244. package/runtime/prompts/duties/common.md +0 -39
  245. package/runtime/prompts/duties/diagnosis-worker.md +0 -44
  246. package/runtime/prompts/duties/direction-selection-worker.md +0 -44
  247. package/runtime/prompts/duties/discovery-worker.md +0 -44
  248. package/runtime/prompts/duties/implementation-executor.md +0 -44
  249. package/runtime/prompts/duties/implementation-verifier.md +0 -44
  250. package/runtime/prompts/duties/lead.md +0 -44
  251. package/runtime/prompts/duties/planning-worker.md +0 -52
  252. package/runtime/prompts/duties/report-writer.md +0 -44
  253. package/runtime/prompts/duties/reverification-worker.md +0 -44
  254. package/runtime/prompts/duties/schedule-verifier.md +0 -44
  255. package/runtime/prompts/duties/scope-critic.md +0 -44
  256. package/runtime/prompts/duties/technical-verification-worker.md +0 -44
  257. package/runtime/prompts/duties/translator.md +0 -44
  258. package/runtime/python/okstra_ctl/pane_title.py +0 -154
@@ -1,30 +1,5 @@
1
1
  # Requirements Discovery Profile
2
2
 
3
- ```yaml
4
- roles:
5
- - role: analyser
6
- min: 2
7
- recommended: 3
8
- max: 5
9
- duty: discovery-worker
10
- - role: critic
11
- min: 0
12
- recommended: 1
13
- max: 1
14
- duty: scope-critic
15
- - role: report-writer
16
- min: 1
17
- recommended: 1
18
- max: 1
19
- duty: report-writer
20
- - role: verifier
21
- min: 0
22
- recommended: 0
23
- max: 0
24
- duty: reverification-worker
25
- dynamic: true
26
- ```
27
-
28
3
  - Purpose: classify the work request, identify missing requirement evidence, and route the task to the safest next lifecycle phase before implementation starts
29
4
  - Required workers:
30
5
  - claude
@@ -0,0 +1,39 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "id": "technical-verification",
4
+ "roles": [
5
+ {
6
+ "mode": "static",
7
+ "roleId": "analyser",
8
+ "dutyId": "technical-verification-worker",
9
+ "min": 2,
10
+ "recommended": 2,
11
+ "max": 5
12
+ },
13
+ {
14
+ "mode": "static",
15
+ "roleId": "critic",
16
+ "dutyId": "scope-critic",
17
+ "min": 0,
18
+ "recommended": 1,
19
+ "max": 1
20
+ },
21
+ {
22
+ "mode": "static",
23
+ "roleId": "report-writer",
24
+ "dutyId": "report-writer",
25
+ "min": 1,
26
+ "recommended": 1,
27
+ "max": 1
28
+ },
29
+ {
30
+ "mode": "dynamic",
31
+ "roleId": "verifier",
32
+ "dutyId": "reverification-worker",
33
+ "sourceRoleIds": [
34
+ "analyser"
35
+ ],
36
+ "activation": "per-selected-source"
37
+ }
38
+ ]
39
+ }
@@ -1,30 +1,5 @@
1
1
  # Technical Verification Profile
2
2
 
3
- ```yaml
4
- roles:
5
- - role: analyser
6
- min: 2
7
- recommended: 2
8
- max: 5
9
- duty: technical-verification-worker
10
- - role: critic
11
- min: 0
12
- recommended: 1
13
- max: 1
14
- duty: scope-critic
15
- - role: report-writer
16
- min: 1
17
- recommended: 1
18
- max: 1
19
- duty: report-writer
20
- - role: verifier
21
- min: 0
22
- recommended: 0
23
- max: 0
24
- duty: reverification-worker
25
- dynamic: true
26
- ```
27
-
28
3
  - Purpose: collect experimental evidence for unresolved technical facts before a new implementation comparison.
29
4
  - Required workers:
30
5
  - claude
@@ -101,7 +101,7 @@
101
101
  "echo_template": "task-type: {value}"
102
102
  },
103
103
  "selected_direction_pick": {
104
- "label": "상세 계획의 입력으로 사용할 확정 구현 방향 보고서를 선택하세요 (같은 task의 최신 3개). 고른 보고서의 user-responses/ 답변(방향 선택·C-NNN 답)이 함께 전달됩니다 — clarification-response 단계는 필요 없습니다",
104
+ "label": "상세 계획의 입력으로 쓸 확정 구현 방향 보고서를 고르세요 (같은 task 의 최신 3개). 고른 보고서에 딸린 답변 — 어느 방향을 골랐는지와 확인 질문(C-NNN) 답 — 이 함께 전달되므로 뒤의 clarification 단계는 건너뜁니다",
105
105
  "echo_template": "selected-direction: {value}",
106
106
  "errors": {
107
107
  "none": "같은 task에서 선택할 implementation-option-selection 최종 보고서를 찾을 수 없습니다.",
@@ -189,37 +189,33 @@
189
189
  "echo_template": "analysis-target: {value}"
190
190
  },
191
191
  "handoff_stage_pick": {
192
- "label": "PR 로 내보낼 범위를 선택하세요 (복수 선택 가능 — 검증 accepted + 미-PR stage 만 표시). 제외된 stage: {blocked}",
193
- "echo_template": "handoff-scope: {value}",
192
+ "label": "PR 을 열 stage 를 선택하세요 (복수 선택 가능, stage 하나가 PR 하나 — 검증 accepted + 미-PR stage 만 표시). 제외된 stage: {blocked}",
193
+ "echo_template": "handoff-stages: {value}",
194
194
  "labels": {
195
- "whole_task": "전체 task — whole-task 검증 기반 단일 PR (단독 선택)",
196
195
  "stage": "stage {stage} (depends-on: {deps})",
197
196
  "blocked_none": "없음"
198
197
  },
199
198
  "echo_variants": {
200
- "whole_task": "handoff scope: 전체 task (whole-task 검증 기반)",
201
- "stage_group": "handoff scope: stage-group ({stages})"
199
+ "stages": "handoff stages: {stages}"
202
200
  },
203
201
  "errors": {
204
202
  "no_plan": "release-handoff 는 이 task 의 implementation-planning final-report 가 필요합니다 — implementation-planning → implementation → final-verification 을 먼저 진행하세요.",
205
203
  "plan_not_approved": "최신 plan 이 approved 상태가 아닙니다: {plan} — implementation 이 완료된 task 에서만 release-handoff 를 시작할 수 있습니다.",
206
- "nothing_eligible": "PR 로 내보낼 수 있는 범위가 없습니다 — 제외 사유: {blocked}. 단독-stage final-verification 의 accepted 기록(okstra handoff record-verified) 또는 whole-task 검증을 먼저 완료하세요.",
207
- "none_selected": "최소 1개의 범위를 선택하세요",
208
- "whole_task_exclusive": "'전체 task' 는 단독 선택만 가능합니다 — stage 묶음을 원하면 stage 번호들만 선택하세요",
209
- "whole_task_missing": "accepted whole-task final-verification 보고서가 없습니다",
204
+ "nothing_eligible": "PR 로 내보낼 수 있는 stage 가 없습니다 — 제외 사유: {blocked}. 단독-stage final-verification 의 accepted 기록(okstra handoff record-verified)을 먼저 완료하세요.",
205
+ "none_selected": "최소 1개의 stage 를 선택하세요",
210
206
  "not_eligible": "eligible 하지 않은 stage: {bad} (선택 가능: {eligible})"
211
207
  }
212
208
  },
213
209
  "brief_carry": {
214
- "label": "이 task 에 carry-in 할 brief 가 없습니다. {task_type} 는 entry phase 의 brief 를 이어받는 단계입니다 — 어떻게 진행할까요?",
210
+ "label": "이 task 에는 이어받을 brief 가 없습니다. {task_type} 는 앞 단계가 쓴 brief 를 물려받아 도는 단계라 그 brief 없이는 시작할 수 없습니다 — 어떻게 할까요?",
215
211
  "echo_template": "brief-carry: {value}",
216
212
  "options": {
217
- "__switch_entry__": "entry phase 로 전환 (추천) — requirements-discovery / error-analysis / improvement-discovery 부터 시작",
213
+ "__switch_entry__": "brief 를 처음 쓰는 단계부터 시작 (추천) — requirements-discovery / error-analysis / improvement-discovery",
218
214
  "__free_input__": "brief 경로 직접 입력",
219
215
  "__abort__": "중단"
220
216
  },
221
217
  "echo_variants": {
222
- "switch_entry": "brief-carry: entry phase 로 전환 — task-type 을 다시 선택합니다",
218
+ "switch_entry": "brief-carry: brief 를 처음 쓰는 단계로 전환 — task-type 을 다시 선택합니다",
223
219
  "abort": "brief-carry: 중단"
224
220
  }
225
221
  },
@@ -402,7 +398,7 @@
402
398
  }
403
399
  },
404
400
  "clarification_pick": {
405
- "label": "clarification-response 를 넘길까요? (follow-up 시에만 — final-report 선택 시 user-responses/ 폴더의 답변도 함께 첨부됩니다)",
401
+ "label": "지난 run 이 남긴 확인 질문(C-NNN)에 답한 파일을 이번 입력으로 넘길까요? 이어서 도는 run 에서만 해당합니다 — 최근 final-report 를 고르면 그 리포트에 딸린 답변도 함께 전달됩니다",
406
402
  "echo_template": "clarification(pick): {value}",
407
403
  "options": {
408
404
  "__skip__": "없음 (건너뛰기)",
@@ -590,7 +586,7 @@
590
586
  "echo_template": "related-tasks: {value}"
591
587
  },
592
588
  "clarification": {
593
- "label": "clarification-response 파일 경로 (follow-up 시에만, 없으면 빈 줄)",
589
+ "label": "지난 run 의 확인 질문에 답한 파일 경로 (이어서 도는 run 에서만, 없으면 빈 줄)",
594
590
  "echo_template": "clarification: {value}"
595
591
  },
596
592
  "pr_template": {
@@ -670,7 +666,6 @@
670
666
  "reverify_scope_user_carry_all": " reverify-scope: carry-all (사용자 지정 — 재검증 없이 직전 판정 전부 이월, 새 stage 만 검증; 브랜치가 움직였으면 full 로 내려감)",
671
667
  "reverify_scope_user_stages": " reverify-scope: stage {stages} 재검증 지정 (사용자 지정 — 하위 stage 포함, 나머지는 직전 판정 이월)",
672
668
  "stage_whole_task": "전체 task",
673
- "handoff_scope_whole_task": "전체 task (whole-task 검증 기반)",
674
- "handoff_scope_stage_group": "stage-group ({stages})"
669
+ "handoff_scope_stages": "stage {stages} (stage 당 PR 1건)"
675
670
  }
676
671
  }
@@ -89,6 +89,7 @@ Render every numbered item as its option label followed by its description verba
89
89
  - For convergence reverify, consume the persisted round plan exactly. This adapter may map and transport each returned batch, but it cannot change batch membership and does not classify findings or branch on task type, provider, or model identity.
90
90
  - The current Antigravity session is the lead. Never launch another provider as a replacement lead.
91
91
  - The prepared run manifest and team-state are the assignment authority. Keep `runner=native-session` assignments in the current host and route `runner=cli-wrapper` assignments through the registered wrapper.
92
+ - This host declares no worker session contract. A `runner=native-session` worker therefore receives no host session rules beyond its duty contract, the selected preamble, and the task instructions; the dispatch prompt carries no `**Host Session Contract Path:**` header. Declaring one means adding `workerSessionContract` to this adapter's `manifest.json` and descriptor — it is never installed into a host-global discovery path.
92
93
  - Do not infer the current host from an installed `agy` binary. The `antigravity` runtime must come from the active host skill or an explicit runtime flag.
93
94
  - Unsupported workers or unavailable models fail before dispatch; do not change the provider, model, or runner silently.
94
95
  - Reverify and critic retries use fresh attempts and persist the core-supplied `dispatchKind`.
@@ -42,6 +42,9 @@ DESCRIPTOR = HostDescriptor(
42
42
  session_accounting="claude-jsonl",
43
43
  has_claude_session=True,
44
44
  relay_contract=str(Path(__file__).with_name("relay.md").resolve()),
45
+ worker_session_contract=str(
46
+ Path(__file__).with_name("worker-session.md").resolve()
47
+ ),
45
48
  initial_prompt_delivery_mode="eager-include",
46
49
  )
47
50
 
@@ -1 +1 @@
1
- {"schemaVersion": 1, "id": "claude-code", "factory": "adapter.py:create_adapter", "nativeProviderId": "claude", "requiredExecutables": ["claude"], "relayContract": "relay.md"}
1
+ {"schemaVersion": 1, "id": "claude-code", "factory": "adapter.py:create_adapter", "nativeProviderId": "claude", "requiredExecutables": ["claude"], "relayContract": "relay.md", "workerSessionContract": "worker-session.md"}
@@ -158,7 +158,7 @@ The `confirm` prompt's `label` is the selection summary (one line per resolved i
158
158
  | `read_artifacts` | Use the host file-read primitive and preserve the core contract's read order. |
159
159
  | `write_artifact` | Use the host file-write primitive only for paths authorized by the active lifecycle phase. |
160
160
  | `prompt_user` | Use `AskUserQuestion` for approvals and clarifications that fit `nativeLimits`. Do not print a numbered list in chat while that tool is available. Emit the question as the last thing in that turn: assistant text emitted after the call renders below the question and separates it from the user's answer. Do not infer an answer from silence. |
161
- | `dispatch_worker` | First verify the materialized invocation metadata. Dispatch `runner=native-session` through `Agent(name: "<role>", run_in_background: true)` without `team_name`, with `hostModelValue` and a summon message only — never the prompt body. The summon is exactly: `Your complete dispatch instructions are the document at <absolute promptPath>. Read that document in full before doing anything else — every line, continuing with offset until end of file — then execute it exactly. Do not act on this message alone.` The verified `promptPath` is already persisted and metadata-verified; inlining its body into the `Agent` call duplicates it in the lead context and lets the two copies drift. Dispatch `runner=cli-wrapper` with the deterministic shell command `okstra worker-dispatch --project-root <root> --run-manifest <path> --workers <ids>`; never wrap that process in another `Agent(...)` call. **Not in a cmux run:** when the run manifest's `terminalBackend` is `cmux-pane`, `prompts/lead/adapters/cmux.md` overrides this row. |
161
+ | `dispatch_worker` | First verify the materialized invocation metadata. Dispatch `runner=native-session` through `Agent(name: "<role>", run_in_background: true)` without `team_name`, with `hostModelValue` and a summon message only — never the prompt body. The summon is exactly: `Your complete dispatch instructions are the document at <absolute promptPath>. Read that document in full before doing anything else — every line, continuing with offset until end of file — then execute it exactly. Do not act on this message alone. If this message carries no such path, return `CLAUDE_PROMPT_PATH_MISSING: dispatch prompt document path was not provided` and do nothing else.` The verified `promptPath` is already persisted and metadata-verified; inlining its body into the `Agent` call duplicates it in the lead context and lets the two copies drift. The summon carries the read requirement because nothing else can: every other rule the worker follows lives inside the document it is being told to open. This host declares a worker session contract (`worker-session.md`), which the materialized prompt delivers to `runner=native-session` workers as `**Host Session Contract Path:**`. Dispatch `runner=cli-wrapper` with the deterministic shell command `okstra worker-dispatch --project-root <root> --run-manifest <path> --workers <ids>`; never wrap that process in another `Agent(...)` call. **Not in a cmux run:** when the run manifest's `terminalBackend` is `cmux-pane`, `prompts/lead/adapters/cmux.md` overrides this row. |
162
162
  | `await_workers` | Arm one background shell poll for the pending Result Paths; the spawn acknowledgement is not completion. |
163
163
  | `redispatch_worker` | Materialize and verify a fresh invocation, then use a fresh native `Agent(...)` session or `okstra worker-dispatch` attempt according to the persisted runner. |
164
164
  | `shutdown_workers` | For each confirmed-complete worker selected for cleanup, send `SendMessage(to: <name>, message: { type: "shutdown_request" })` to idle the roster member **and** call `TaskStop(task_id: "<name>")` to stop its background task. Both are required; neither subsumes the other. |
@@ -169,14 +169,15 @@ The `confirm` prompt's `label` is the selection summary (one line per resolved i
169
169
 
170
170
  - The session owns one implicit team. `TeamCreate` and `TeamDelete` are absent on current Claude Code builds; never probe for them and never pass `team_name`.
171
171
  - Set `name` to the core-assigned functional role label so token attribution can match `agentName`.
172
- - Map a `runner=native-session` Claude assignment to the real host execution definition for its function (`claude-worker`, `report-writer-worker`, or `translator-worker`). A CLI-wrapper assignment has no Claude agent definition; `worker-dispatch` starts its registered provider process directly.
172
+ - A `runner=native-session` Claude assignment opens a general-purpose session: pass no `subagent_type`. okstra registers no agent definitions in this host's discovery path, so there is none to name (ADR-0017). Everything the worker must do reaches it through the summon message and the document that message points at. A CLI-wrapper assignment does not enter this layer at all; `worker-dispatch` starts its registered provider process directly.
173
+ - The native worker primitive for this host is the `Agent` tool. Host session rules — working directory, shell invocation, MCP call shape, and when to return — are owned by this host's worker session contract, not by an execution definition, so they reach a native worker through `**Host Session Contract Path:**` and never reach a CLI-wrapper worker.
173
174
  - For `runner=native-session`, pass the persisted `hostModelValue` as the `model` argument. For `runner=cli-wrapper`, `worker-dispatch` passes the persisted `modelExecutionValue` to the provider process. Never interchange the two fields.
174
175
  - Immediately before every native host primitive, run `okstra agent-prompt record-dispatch` with the project root, run manifest, verified metadata path, and `--enforcement-mode host-native-spec-link-gate`. After the Result Path exists, run `okstra agent-prompt link-result` with `--dispatch-id <invocationId>:attempt-1` and that path before accepting or parsing it. CLI-wrapper calls are recorded by `worker-dispatch` itself.
175
176
  - A resumed lead can dispatch a fresh worker; resume is not a valid reason to omit a rostered role.
176
177
 
177
178
  ### Dispatch-time model enforcement
178
179
 
179
- - A native Claude execution definition declares `model: inherit`; the lead MUST override it with the verified assignment's `hostModelValue`.
180
+ - A native call inherits nothing: pass the verified assignment's `hostModelValue` as the `model` argument on every dispatch.
180
181
  - CLI-wrapper assignments never enter the Agent layer. `okstra worker-dispatch` validates the metadata and passes `modelExecutionValue` to the registered provider script.
181
182
  - Missing or unsupported family-token mapping is a pre-dispatch contract failure. Never inherit the lead model, choose a nearby alias, or switch provider silently.
182
183
  - Every analysis dispatch sets `name: "<workerId>-worker"`; convergence retries append `-reverify-r<N>`, implementation uses the functional `-executor` / `-verifier` suffix, and report writing uses `report-writer`. These values are retained as `agentName` in session JSONL for usage attribution.
@@ -0,0 +1,108 @@
1
+ # Claude Code Worker Session Contract
2
+
3
+ This file is the host contract for a worker running **inside** a Claude Code
4
+ session (`runner=native-session`). The dispatch prompt names it as
5
+ `**Host Session Contract Path:**`. It owns only what is true because the worker
6
+ shares the lead's host session; the duty contract owns the role, the selected
7
+ preamble owns the audience procedure, and the task instructions own this run's
8
+ inputs and outputs. A `runner=cli-wrapper` worker runs as its own provider
9
+ process and never receives this file.
10
+
11
+ ## Dispatch verification
12
+
13
+ The summon message carried the absolute path of your dispatch prompt document,
14
+ not the prompt itself. You have already read that document; these checks confirm
15
+ you read the right one.
16
+
17
+ 1. Extract the absolute `Project Root` (a line starting with `**Project Root:**`
18
+ or `Project Root:`). If it is absent, return
19
+ `CLAUDE_PROJECT_ROOT_MISSING: absolute Project Root was not provided in the lead prompt`
20
+ and do nothing else.
21
+ 2. Check that the path you were summoned with matches the document's
22
+ `Assigned worker prompt history path:` header, resolving a relative header
23
+ value against `Project Root`. On a mismatch, return
24
+ `CLAUDE_PROMPT_PATH_MISSING: summon path does not match the document's assigned prompt history path`.
25
+ The lead persisted and verified that document before dispatch, so never
26
+ rewrite it.
27
+
28
+ ## Working directory and shell
29
+
30
+ Anchor every file operation to the absolute `Project Root`. Use absolute paths;
31
+ do not rely on inherited cwd, and never use `cd` to move the session.
32
+
33
+ - **Executor exception (implementation runs).** When you are the `Executor` and
34
+ the prompt provides an `EXECUTOR_WORKTREE_PATH` that differs from the
35
+ session's cwd, prefix cwd-sensitive Bash commands (`cargo *`, `npm *`,
36
+ `pnpm *`, `bun *`, `pytest`, `make *`, `go *`, and other toolchain
37
+ build/test commands) with `cd <EXECUTOR_WORKTREE_PATH> && ` in the same Bash
38
+ invocation. Pass the chained command directly to the Bash tool; do not wrap it
39
+ in `bash -lc "..."` or `bash -c "..."`, because the leading `cd` token has to
40
+ stay visible to the permission layer. The `cd` is scoped to that one subshell
41
+ and does not move the session, which is why it does not contradict the rule
42
+ above.
43
+ - **Verifier QA-gate exception.** A verifier may use the same
44
+ `cd <WORKTREE> && <cmd>` shape for the project-declared `qaCommands` (lint,
45
+ format, typecheck, test) from `project.json`, since those are cwd-sensitive by
46
+ nature. Outside the QA gate a verifier still reads by absolute path only.
47
+ - **No chaining beyond `cd && cmd`.** The permission matcher allows exactly the
48
+ two-segment shape. Appending a pipe, semicolon, redirect, or second `&&` — for
49
+ example `cd ... && cargo test ... 2>&1 | tail -20; echo "exit:$?"` —
50
+ disqualifies the prefix match and raises a permission prompt on every
51
+ dispatch. Let the host capture stdout, stderr, and the exit code natively. If
52
+ you genuinely need less output, run the command and read the result in a
53
+ separate call.
54
+ - **Commands must not be able to prompt.** Your Bash calls see the user's own
55
+ shell, where `cp`, `mv`, and `rm` are commonly aliased to their `-i` form. The
56
+ confirmation that alias raises has nobody to answer it, and the dispatch hangs
57
+ until it is killed. Invoke these as `command cp` / `command mv` /
58
+ `command rm`, which skips alias expansion. Do not reach for `-f` instead: it
59
+ also changes what the tool does on failure, and `rm -f` reports success on a
60
+ path that never existed.
61
+
62
+ ## MCP
63
+
64
+ The run's available MCP servers and tools are listed in the analysis packet's
65
+ `Available MCP Servers` section. When that section is absent or says none, treat
66
+ MCP as unavailable for this run and never infer tools from host configuration.
67
+ Call a listed tool directly by name (`mcp__<server>__<tool>`); do not shell out
68
+ via `claude --mcp-cli call ...` and do not run a tool name as a Bash command.
69
+ When a server you need is not listed, record `MCP not available for this run` in
70
+ your output rather than guessing a tool name.
71
+
72
+ ## Post-write gates (implementation executor)
73
+
74
+ An executor prompt carries two gate blocks the lead appends after the coding
75
+ preflight: `Pre-commit diff review sweep` and `Implementation self-check`.
76
+ Execute both and record their coverage lines exactly as the blocks specify. The
77
+ provider wrappers refuse to launch an executor prompt that lacks them
78
+ (`*_POSTWRITE_GATE_MISSING`); a worker in this session has no wrapper, so the
79
+ contract lands on you. If either block is missing, record a typed `tool-failure`
80
+ through `okstra error-log append-observed` and tell the lead to re-dispatch with
81
+ the blocks included.
82
+
83
+ ## Returning
84
+
85
+ The lead's dispatch returns as soon as the session is spawned and does not block
86
+ on you. It detects completion by polling your result file, so that file's
87
+ appearance at `**Result Path:**` is the only completion signal it has. Lingering
88
+ after the file is on disk extends the phase's wall-clock time for the whole run.
89
+
90
+ After the write succeeds:
91
+
92
+ 1. Return your final message immediately, beginning with your model identity as
93
+ the selected preamble specifies.
94
+ 2. Do not perform further `Read`, `Grep`, `Glob`, or MCP calls, and do not
95
+ re-review your own output.
96
+ 3. Do not rewrite the result file. If a correction is genuinely required, make a
97
+ single `Edit` and return.
98
+ 4. The one exception is recording a `tool-failure` when the failure happened
99
+ after the write; return immediately after that command.
100
+
101
+ **Enforced:** `validators/validate-run.py` `validate_team_state` fails a run
102
+ whose worker carries a terminal status with no saved result file at its assigned
103
+ Result Path.
104
+
105
+ If you catch yourself thinking "let me double-check section 3" after the write
106
+ succeeded, stop. Convergence and the report writer reconcile gaps across all
107
+ workers; extra depth in one worker at the cost of returning late is a net loss
108
+ for the run.
@@ -205,6 +205,7 @@ The worker's `--sandbox danger-full-access` flag only selects the child Codex po
205
205
  - For convergence reverify, consume the persisted round plan exactly. This adapter may map and transport each returned batch, but it cannot change batch membership and does not classify findings or branch on task type, provider, or model identity.
206
206
  - Do not invoke Claude Code team or subagent tools.
207
207
  - The prepared run manifest and team-state are the dispatch authority. A `runner=native-session` assignment stays in the current Codex host; a `runner=cli-wrapper` assignment uses the registered provider wrapper. Unsupported explicitly requested workers fail; an adapter must not silently change the roster.
208
+ - This host declares no worker session contract. A `runner=native-session` worker therefore receives no host session rules beyond its duty contract, the selected preamble, and the task instructions; the dispatch prompt carries no `**Host Session Contract Path:**` header. Declaring one means adding `workerSessionContract` to this adapter's `manifest.json` and descriptor — it is never installed into a host-global discovery path.
208
209
  - The report-writer follows its persisted provider, model, and runner assignment exactly. It has no Codex-only provider override or separate opt-in gate.
209
210
  - Reverify and critic retries invoke a fresh worker attempt and persist the core-supplied `dispatchKind` (`reverify-r<N>` or `critic`) in the dispatch record; never reuse a prior rollout as a new vote.
210
211
  - Native calls use only `hostModelValue`. Immediately before the host primitive, run `okstra agent-prompt record-dispatch` with the project root, run manifest, verified metadata path, and `--enforcement-mode host-native-spec-link-gate`; after the Result Path exists, run `okstra agent-prompt link-result` with `--dispatch-id <invocationId>:attempt-1` and that path before accepting it. CLI calls use only `modelExecutionValue` through `worker-dispatch`, which records its own dispatch. The native linkage proves association with a verified specification, not observed prompt delivery.
@@ -161,6 +161,8 @@ For a `host-text` mapping, render each numbered item as its option label followe
161
161
  | `record_lead_event` | Append progress and activity records to the manifest-provided `leadEventsPath`. Use `okstra lead-progress append --phase <phase-id>` for a checkpoint and `okstra agent-activity append --kind <kind>` for an activity record; both resolve the ledger path from the run manifest. Emit the matching `PROGRESS:` line — the command prints it as `progressLine` — and, when an activity record is required, the immediately following `ACTIVITY:` line from the same structured fields. |
162
162
  | `collect_usage` | Return explicit unavailable lead usage until Grok registers a session transcript or CLI usage artifact contract. |
163
163
 
164
+ - This host declares no worker session contract. A `runner=native-session` worker therefore receives no host session rules beyond its duty contract, the selected preamble, and the task instructions; the dispatch prompt carries no `**Host Session Contract Path:**` header. Declaring one means adding `workerSessionContract` to this adapter's `manifest.json` and descriptor — it is never installed into a host-global discovery path.
165
+
164
166
  ## Completion, cleanup, and resume
165
167
 
166
168
  - Do not infer the current host from an installed `grok` executable. The runtime must come from an explicit request or current-session declaration.
@@ -83,6 +83,8 @@ Render every numbered item as its option label followed by its description verba
83
83
  | `record_lead_event` | Append progress and activity records to the manifest-provided `leadEventsPath`. Use `okstra lead-progress append --phase <phase-id>` for a checkpoint and `okstra agent-activity append --kind <kind>` for an activity record; both resolve the ledger path from the run manifest. Emit the matching `PROGRESS:` line — the command prints it as `progressLine` — and, when an activity record is required, the immediately following `ACTIVITY:` line from the same structured fields. |
84
84
  | `collect_usage` | Return explicit unavailable lead usage until Kimi registers a session transcript or CLI usage artifact contract. |
85
85
 
86
+ - This host declares no worker session contract. A `runner=native-session` worker therefore receives no host session rules beyond its duty contract, the selected preamble, and the task instructions; the dispatch prompt carries no `**Host Session Contract Path:**` header. Declaring one means adding `workerSessionContract` to this adapter's `manifest.json` and descriptor — it is never installed into a host-global discovery path.
87
+
86
88
  ## Completion, cleanup, and resume
87
89
 
88
90
  - Do not infer the current host from an installed `kimi` executable. The runtime must come from an explicit request or current-session declaration.
@@ -33,9 +33,16 @@ ANTIGRAVITY = {
33
33
  "gemini-3.1-pro", "Gemini 3.1 Pro", "gemini-3.1-pro",
34
34
  aliases=("gemini 3.1 pro",),
35
35
  ),
36
+ "gemini-3.8-flash": ModelSpec(
37
+ "gemini-3.8-flash", "Gemini 3.8 Flash", "gemini-3.8-flash",
38
+ aliases=("gemini 3.8 flash",),
39
+ ),
40
+ # picker 에서는 감춘다: Flash 계열의 최신은 3.8 이다(`agy models` 2026-09-23
41
+ # 확인). 엔트리는 남긴다 — 이 모델로 디스패치된 과거 task 의 서빙 모델
42
+ # 관측값이 카탈로그에서 자기 행을 찾아야 게이트를 통과한다.
36
43
  "gemini-3.7-flash": ModelSpec(
37
44
  "gemini-3.7-flash", "Gemini 3.7 Flash", "gemini-3.7-flash",
38
- aliases=("gemini 3.7 flash",),
45
+ aliases=("gemini 3.7 flash",), selectable=False,
39
46
  ),
40
47
  }
41
48
 
@@ -41,6 +41,14 @@ CLAUDE = {
41
41
  "opus-5", "opus-5", "claude-opus-5", aliases=("claude-opus-5",),
42
42
  channel_family="opus", selectable=False,
43
43
  ),
44
+ # opus 채널이 지금 서빙하는 점-릴리스. 엔트리가 없으면 served-model 게이트가
45
+ # 관측값을 카탈로그에서 못 찾아 dispatch 가 exit 78 로 실패한다 — 실측
46
+ # 2026-09-23, 두 프로젝트에서 `claude-opus-5-5` 로 같은 실패(dev-10860
47
+ # stage-3·4·5). haiku-4-5-20251001 과 같은 이유의 엔트리다.
48
+ "opus-5-5": ModelSpec(
49
+ "opus-5-5", "opus-5-5", "claude-opus-5-5", aliases=("claude-opus-5-5",),
50
+ channel_family="opus", selectable=False,
51
+ ),
44
52
  "sonnet": ModelSpec(
45
53
  "sonnet", "sonnet", "sonnet", version_kind="channel", channel_family="sonnet"
46
54
  ),
@@ -17,9 +17,21 @@ import okstra_ctl.model_discovery as model_discovery
17
17
 
18
18
 
19
19
  # 모델 식별자와 순서는 Codex의 `~/.codex/models_cache.json`을 따른다
20
- # (2026-09-07 확인, 클라이언트 0.153.4): astra / sol / terra / luna.
21
- # `gpt-5.6` is not a slug that catalog offers at all, so it is gone from here;
22
- # its rate moved to `_LEGACY_CODEX_PRICING` so past runs still price.
20
+ # (2026-09-23 확인, 클라이언트 0.155.0): gpt-6 astra / sol / luna 와 5.6 계열의
21
+ # sol / terra / luna. `gpt-5.6` is not a slug that catalog offers at all, so it
22
+ # is gone from here; its rate moved to `_LEGACY_CODEX_PRICING` so past runs
23
+ # still price.
24
+ #
25
+ # 노출 규칙: 티어(astra·sol·terra·luna)마다, **이 계정이 실제로 서빙하는** 최신
26
+ # 세대 하나만 selectable 로 둔다. 카탈로그가 슬러그를 내놓는 것과 계정이 그것을
27
+ # 실행하는 것은 다르다 — 실측 2026-09-23(jobs dev-10860
28
+ # implementation-option-selection-002): ChatGPT 계정으로 로그인한 이 기계에서
29
+ # `gpt-6-sol` 디스패치가 두 번 다 400 으로 거절됐다
30
+ # ("The 'gpt-6-sol' model is not supported when using Codex with a ChatGPT
31
+ # account"). 같은 계정의 `models_cache.json` 도 6세대로는 astra 만 싣는다.
32
+ # 그래서 sol·luna 티어는 5.6 행이 선택 가능한 행이고, gpt-6 의 두 행은 엔트리만
33
+ # 남긴다 — 서빙하는 계정이 그 값을 쓰거나 과거 run 을 정산할 때 필요하다.
34
+ # astra 는 이 계정에서 실제로 돌아 gpt-6 행이 선택 가능하다.
23
35
  CODEX = {
24
36
  # 비용은 계정이 구독이든 API 든 공개 API 단가(입력·캐시 입력·출력 USD/1M)로
25
37
  # 추정한다 — 리포트가 답하는 것은 "얼마나 썼는가" 이지 "청구서에 얼마가
@@ -28,12 +40,17 @@ CODEX = {
28
40
  # 계상된다(실측 2026-09-08). 출처: OpenAI 표준 등급, 2026-09 기준
29
41
  # (morphllm.com/openai-api-pricing, cloudzero.com/blog/openai-pricing,
30
42
  # layer3labs.io/guides/gpt-6-astra-api-pricing).
43
+ # gpt-6 단가는 OpenAI 모델 문서의 표준 등급(2026-09-23 확인):
44
+ # developers.openai.com/api/docs/models/gpt-6-sol, .../gpt-6-luna.
31
45
  "gpt-6-astra": ModelSpec("gpt-6-astra", "gpt-6-astra", "gpt-6-astra", pricing=(10.0, 1.0, 50.0)),
32
- "gpt-5.6-sol": ModelSpec("gpt-5.6-sol", "gpt-5.6-sol", "gpt-5.6-sol", pricing=(5.0, 0.50, 30.0)),
46
+ # picker 에서는 감춘다: 이 계정이 400 으로 거절한다(위 노출 규칙). 엔트리는
47
+ # 남긴다 — 서빙하는 계정의 값이고, 과거 run 의 단가도 이 표에서 찾는다.
48
+ "gpt-6-sol": ModelSpec("gpt-6-sol", "gpt-6-sol", "gpt-6-sol", pricing=(2.0, 0.20, 10.0), selectable=False),
49
+ "gpt-6-luna": ModelSpec("gpt-6-luna", "gpt-6-luna", "gpt-6-luna", pricing=(0.10, 0.01, 0.50), selectable=False),
33
50
  "gpt-5.6-terra": ModelSpec("gpt-5.6-terra", "gpt-5.6-terra", "gpt-5.6-terra", pricing=(2.0, 0.20, 12.0)),
51
+ "gpt-5.6-sol": ModelSpec("gpt-5.6-sol", "gpt-5.6-sol", "gpt-5.6-sol", pricing=(5.0, 0.50, 30.0)),
34
52
  "gpt-5.6-luna": ModelSpec("gpt-5.6-luna", "gpt-5.6-luna", "gpt-5.6-luna", pricing=(0.20, 0.02, 1.20)),
35
- # picker 에서는 감춘다. 엔트리는 남긴다 — 과거 run 의 토큰 사용량을
36
- # 정산할 때 pricing 을 이 표에서 찾는다.
53
+ # picker 에서는 감춘다(사유는 위와 동일 — 더 이상 카탈로그가 내놓지 않는다).
37
54
  "gpt-5.4-mini": ModelSpec("gpt-5.4-mini", "gpt-5.4-mini", "gpt-5.4-mini", pricing=(0.75, 0.075, 4.50), selectable=False),
38
55
  "codex-auto-review": ModelSpec("codex-auto-review", "codex-auto-review", "codex-auto-review", selectable=False),
39
56
  }
@@ -21,7 +21,11 @@ from okstra_ctl.domain.worker_stream import StreamEvent, Text, ToolCall, ToolRes
21
21
 
22
22
 
23
23
  GROK = {
24
- "grok-4.6": ModelSpec("grok-4.6", "grok-4.6", "grok-4.6", pricing=(2.00, 0.50, 6.00)),
24
+ "grok-4.7": ModelSpec("grok-4.7", "grok-4.7", "grok-4.7", pricing=(2.00, 0.50, 6.00)),
25
+ # picker 에서는 감춘다: grok-4.7 이 같은 계열의 최신이다(`grok` CLI 1.0.40 의
26
+ # 기본값도 4.7, 2026-09-23 확인). 엔트리는 남긴다 — 과거 run 의 정산이 이
27
+ # 표의 단가를 읽고, 서빙 모델 게이트가 옛 관측값을 여기서 찾는다.
28
+ "grok-4.6": ModelSpec("grok-4.6", "grok-4.6", "grok-4.6", pricing=(2.00, 0.50, 6.00), selectable=False),
25
29
  # picker 에서는 감춘다(사유는 codex 의 gpt-5.4-mini 와 동일).
26
30
  "grok-build-0.1": ModelSpec("grok-build-0.1", "grok-build-0.1", "grok-build-0.1", pricing=(1.00, 0.20, 2.00), selectable=False),
27
31
  }
@@ -294,7 +298,7 @@ def create_provider() -> ProviderSpec:
294
298
  display_label="Grok",
295
299
  models=GROK,
296
300
  default_models={
297
- role: "grok-4.6"
301
+ role: "grok-4.7"
298
302
  for role in (
299
303
  "lead",
300
304
  "analyser",