okstra 0.174.0 → 0.176.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 (419) hide show
  1. package/README.md +18 -9
  2. package/bin/okstra +8 -4
  3. package/dist/cli-registry.d.mts +16 -0
  4. package/dist/cli-registry.mjs +560 -0
  5. package/dist/cli-registry.mjs.map +1 -0
  6. package/dist/commands/execute/agent-prompt.d.mts +1 -0
  7. package/{src → dist}/commands/execute/agent-prompt.mjs +10 -11
  8. package/dist/commands/execute/agent-prompt.mjs.map +1 -0
  9. package/dist/commands/execute/codex-dispatch.d.mts +3 -0
  10. package/dist/commands/execute/codex-dispatch.mjs +6 -0
  11. package/dist/commands/execute/codex-dispatch.mjs.map +1 -0
  12. package/dist/commands/execute/codex-run.d.mts +3 -0
  13. package/{src → dist}/commands/execute/codex-run.mjs +30 -37
  14. package/dist/commands/execute/codex-run.mjs.map +1 -0
  15. package/dist/commands/execute/convergence.d.mts +1 -0
  16. package/{src → dist}/commands/execute/convergence.mjs +15 -16
  17. package/dist/commands/execute/convergence.mjs.map +1 -0
  18. package/dist/commands/execute/error-log.d.mts +1 -0
  19. package/{src → dist}/commands/execute/error-log.mjs +2 -3
  20. package/dist/commands/execute/error-log.mjs.map +1 -0
  21. package/dist/commands/execute/git-reconcile.d.mts +1 -0
  22. package/{src → dist}/commands/execute/git-reconcile.mjs +10 -11
  23. package/dist/commands/execute/git-reconcile.mjs.map +1 -0
  24. package/dist/commands/execute/handoff.d.mts +1 -0
  25. package/{src → dist}/commands/execute/handoff.mjs +10 -11
  26. package/dist/commands/execute/handoff.mjs.map +1 -0
  27. package/dist/commands/execute/incremental-carry.d.mts +1 -0
  28. package/{src → dist}/commands/execute/incremental-carry.mjs +2 -3
  29. package/dist/commands/execute/incremental-carry.mjs.map +1 -0
  30. package/dist/commands/execute/incremental-scope.d.mts +1 -0
  31. package/{src → dist}/commands/execute/incremental-scope.mjs +2 -3
  32. package/dist/commands/execute/incremental-scope.mjs.map +1 -0
  33. package/dist/commands/execute/integrate-stages.d.mts +1 -0
  34. package/{src → dist}/commands/execute/integrate-stages.mjs +10 -11
  35. package/dist/commands/execute/integrate-stages.mjs.map +1 -0
  36. package/dist/commands/execute/pane-title.d.mts +1 -0
  37. package/dist/commands/execute/pane-title.mjs +20 -0
  38. package/dist/commands/execute/pane-title.mjs.map +1 -0
  39. package/dist/commands/execute/plan-items.d.mts +1 -0
  40. package/dist/commands/execute/plan-items.mjs +9 -0
  41. package/dist/commands/execute/plan-items.mjs.map +1 -0
  42. package/dist/commands/execute/plan-validate.d.mts +1 -0
  43. package/dist/commands/execute/plan-validate.mjs +68 -0
  44. package/dist/commands/execute/plan-validate.mjs.map +1 -0
  45. package/dist/commands/execute/plan-verify.d.mts +1 -0
  46. package/{src → dist}/commands/execute/plan-verify.mjs +13 -16
  47. package/dist/commands/execute/plan-verify.mjs.map +1 -0
  48. package/dist/commands/execute/render-bundle.d.mts +3 -0
  49. package/{src → dist}/commands/execute/render-bundle.mjs +65 -61
  50. package/dist/commands/execute/render-bundle.mjs.map +1 -0
  51. package/dist/commands/execute/run.d.mts +24 -0
  52. package/dist/commands/execute/run.mjs +196 -0
  53. package/dist/commands/execute/run.mjs.map +1 -0
  54. package/dist/commands/execute/spawn-followups.d.mts +1 -0
  55. package/{src → dist}/commands/execute/spawn-followups.mjs +6 -7
  56. package/dist/commands/execute/spawn-followups.mjs.map +1 -0
  57. package/dist/commands/execute/team.d.mts +3 -0
  58. package/{src → dist}/commands/execute/team.mjs +29 -36
  59. package/dist/commands/execute/team.mjs.map +1 -0
  60. package/dist/commands/execute/token-usage.d.mts +1 -0
  61. package/{src → dist}/commands/execute/token-usage.mjs +2 -3
  62. package/dist/commands/execute/token-usage.mjs.map +1 -0
  63. package/dist/commands/execute/wizard.d.mts +8 -0
  64. package/dist/commands/execute/wizard.mjs +191 -0
  65. package/dist/commands/execute/wizard.mjs.map +1 -0
  66. package/dist/commands/execute/worker-audit-check.d.mts +1 -0
  67. package/{src → dist}/commands/execute/worker-audit-check.mjs +11 -12
  68. package/dist/commands/execute/worker-audit-check.mjs.map +1 -0
  69. package/dist/commands/execute/worker-dispatch.d.mts +7 -0
  70. package/{src → dist}/commands/execute/worker-dispatch.mjs +34 -46
  71. package/dist/commands/execute/worker-dispatch.mjs.map +1 -0
  72. package/dist/commands/execute/worker-state.d.mts +1 -0
  73. package/{src → dist}/commands/execute/worker-state.mjs +15 -16
  74. package/dist/commands/execute/worker-state.mjs.map +1 -0
  75. package/dist/commands/execute/worktree-lookup.d.mts +1 -0
  76. package/{src → dist}/commands/execute/worktree-lookup.mjs +38 -37
  77. package/dist/commands/execute/worktree-lookup.mjs.map +1 -0
  78. package/dist/commands/execute/worktree-status.d.mts +1 -0
  79. package/{src → dist}/commands/execute/worktree-status.mjs +52 -46
  80. package/dist/commands/execute/worktree-status.mjs.map +1 -0
  81. package/dist/commands/inspect/code-review.d.mts +1 -0
  82. package/{src → dist}/commands/inspect/code-review.mjs +16 -19
  83. package/dist/commands/inspect/code-review.mjs.map +1 -0
  84. package/dist/commands/inspect/container.d.mts +1 -0
  85. package/{src → dist}/commands/inspect/container.mjs +11 -13
  86. package/dist/commands/inspect/container.mjs.map +1 -0
  87. package/dist/commands/inspect/context-cost.d.mts +1 -0
  88. package/{src → dist}/commands/inspect/context-cost.mjs +11 -13
  89. package/dist/commands/inspect/context-cost.mjs.map +1 -0
  90. package/dist/commands/inspect/design-prep.d.mts +1 -0
  91. package/{src → dist}/commands/inspect/design-prep.mjs +10 -11
  92. package/dist/commands/inspect/design-prep.mjs.map +1 -0
  93. package/dist/commands/inspect/error-report.d.mts +1 -0
  94. package/{src → dist}/commands/inspect/error-report.mjs +11 -13
  95. package/dist/commands/inspect/error-report.mjs.map +1 -0
  96. package/dist/commands/inspect/error-zip.d.mts +1 -0
  97. package/{src → dist}/commands/inspect/error-zip.mjs +11 -12
  98. package/dist/commands/inspect/error-zip.mjs.map +1 -0
  99. package/dist/commands/inspect/log-report.d.mts +1 -0
  100. package/{src → dist}/commands/inspect/log-report.mjs +11 -13
  101. package/dist/commands/inspect/log-report.mjs.map +1 -0
  102. package/dist/commands/inspect/profile-show.d.mts +1 -0
  103. package/{src → dist}/commands/inspect/profile-show.mjs +10 -11
  104. package/dist/commands/inspect/profile-show.mjs.map +1 -0
  105. package/dist/commands/inspect/recap.d.mts +1 -0
  106. package/{src → dist}/commands/inspect/recap.mjs +11 -13
  107. package/dist/commands/inspect/recap.mjs.map +1 -0
  108. package/dist/commands/inspect/resolve-task-key.d.mts +1 -0
  109. package/{src → dist}/commands/inspect/resolve-task-key.mjs +11 -13
  110. package/dist/commands/inspect/resolve-task-key.mjs.map +1 -0
  111. package/dist/commands/inspect/rollup.d.mts +1 -0
  112. package/{src → dist}/commands/inspect/rollup.mjs +11 -13
  113. package/dist/commands/inspect/rollup.mjs.map +1 -0
  114. package/dist/commands/inspect/run-audit.d.mts +1 -0
  115. package/{src → dist}/commands/inspect/run-audit.mjs +11 -12
  116. package/dist/commands/inspect/run-audit.mjs.map +1 -0
  117. package/dist/commands/inspect/set-work-status.d.mts +1 -0
  118. package/{src → dist}/commands/inspect/set-work-status.mjs +11 -13
  119. package/dist/commands/inspect/set-work-status.mjs.map +1 -0
  120. package/dist/commands/inspect/stage-map.d.mts +1 -0
  121. package/dist/commands/inspect/stage-map.mjs +110 -0
  122. package/dist/commands/inspect/stage-map.mjs.map +1 -0
  123. package/dist/commands/inspect/task-list.d.mts +1 -0
  124. package/dist/commands/inspect/task-list.mjs +103 -0
  125. package/dist/commands/inspect/task-list.mjs.map +1 -0
  126. package/dist/commands/inspect/task-show.d.mts +1 -0
  127. package/dist/commands/inspect/task-show.mjs +108 -0
  128. package/dist/commands/inspect/task-show.mjs.map +1 -0
  129. package/dist/commands/inspect/time-report.d.mts +1 -0
  130. package/{src → dist}/commands/inspect/time-report.mjs +11 -13
  131. package/dist/commands/inspect/time-report.mjs.map +1 -0
  132. package/dist/commands/inspect/usage-report.d.mts +1 -0
  133. package/{src → dist}/commands/inspect/usage-report.mjs +11 -13
  134. package/dist/commands/inspect/usage-report.mjs.map +1 -0
  135. package/dist/commands/inspect/user-response.d.mts +1 -0
  136. package/{src → dist}/commands/inspect/user-response.mjs +10 -11
  137. package/dist/commands/inspect/user-response.mjs.map +1 -0
  138. package/dist/commands/inspect/worker-liveness.d.mts +1 -0
  139. package/{src → dist}/commands/inspect/worker-liveness.mjs +11 -13
  140. package/dist/commands/inspect/worker-liveness.mjs.map +1 -0
  141. package/dist/commands/lifecycle/check-project.d.mts +21 -0
  142. package/dist/commands/lifecycle/check-project.mjs +175 -0
  143. package/dist/commands/lifecycle/check-project.mjs.map +1 -0
  144. package/dist/commands/lifecycle/config.d.mts +1 -0
  145. package/dist/commands/lifecycle/config.mjs +369 -0
  146. package/dist/commands/lifecycle/config.mjs.map +1 -0
  147. package/dist/commands/lifecycle/doctor.d.mts +10 -0
  148. package/dist/commands/lifecycle/doctor.mjs +317 -0
  149. package/dist/commands/lifecycle/doctor.mjs.map +1 -0
  150. package/dist/commands/lifecycle/install.d.mts +17 -0
  151. package/dist/commands/lifecycle/install.mjs +1077 -0
  152. package/dist/commands/lifecycle/install.mjs.map +1 -0
  153. package/dist/commands/lifecycle/migrate.d.mts +1 -0
  154. package/{src → dist}/commands/lifecycle/migrate.mjs +10 -11
  155. package/dist/commands/lifecycle/migrate.mjs.map +1 -0
  156. package/dist/commands/lifecycle/model.d.mts +1 -0
  157. package/dist/commands/lifecycle/model.mjs +22 -0
  158. package/dist/commands/lifecycle/model.mjs.map +1 -0
  159. package/dist/commands/lifecycle/paths.d.mts +1 -0
  160. package/dist/commands/lifecycle/paths.mjs +102 -0
  161. package/dist/commands/lifecycle/paths.mjs.map +1 -0
  162. package/dist/commands/lifecycle/preflight.d.mts +1 -0
  163. package/dist/commands/lifecycle/preflight.mjs +124 -0
  164. package/dist/commands/lifecycle/preflight.mjs.map +1 -0
  165. package/dist/commands/lifecycle/setup.d.mts +1 -0
  166. package/dist/commands/lifecycle/setup.mjs +297 -0
  167. package/dist/commands/lifecycle/setup.mjs.map +1 -0
  168. package/dist/commands/lifecycle/uninstall.d.mts +4 -0
  169. package/dist/commands/lifecycle/uninstall.mjs +262 -0
  170. package/dist/commands/lifecycle/uninstall.mjs.map +1 -0
  171. package/dist/commands/manager.d.mts +3 -0
  172. package/{src → dist}/commands/manager.mjs +25 -32
  173. package/dist/commands/manager.mjs.map +1 -0
  174. package/dist/commands/memory/memory.d.mts +1 -0
  175. package/dist/commands/memory/memory.mjs +569 -0
  176. package/dist/commands/memory/memory.mjs.map +1 -0
  177. package/dist/commands/pr/pr.d.mts +33 -0
  178. package/dist/commands/pr/pr.mjs +296 -0
  179. package/dist/commands/pr/pr.mjs.map +1 -0
  180. package/dist/commands/report/agent-activity.d.mts +1 -0
  181. package/{src → dist}/commands/report/agent-activity.mjs +11 -12
  182. package/dist/commands/report/agent-activity.mjs.map +1 -0
  183. package/dist/commands/report/finalize.d.mts +4 -0
  184. package/{src → dist}/commands/report/finalize.mjs +25 -32
  185. package/dist/commands/report/finalize.mjs.map +1 -0
  186. package/dist/commands/report/inject-report-index.d.mts +1 -0
  187. package/{src → dist}/commands/report/inject-report-index.mjs +6 -7
  188. package/dist/commands/report/inject-report-index.mjs.map +1 -0
  189. package/dist/commands/report/render-final-report.d.mts +1 -0
  190. package/{src → dist}/commands/report/render-final-report.mjs +6 -7
  191. package/dist/commands/report/render-final-report.mjs.map +1 -0
  192. package/dist/commands/report/render-views.d.mts +1 -0
  193. package/{src → dist}/commands/report/render-views.mjs +6 -7
  194. package/dist/commands/report/render-views.mjs.map +1 -0
  195. package/dist/commands/report/translate.d.mts +1 -0
  196. package/{src → dist}/commands/report/translate.mjs +6 -7
  197. package/dist/commands/report/translate.mjs.map +1 -0
  198. package/dist/lib/helper-scripts.d.mts +3 -0
  199. package/{src → dist}/lib/helper-scripts.mjs +11 -14
  200. package/dist/lib/helper-scripts.mjs.map +1 -0
  201. package/dist/lib/host-registry-client.d.mts +25 -0
  202. package/dist/lib/host-registry-client.mjs +152 -0
  203. package/dist/lib/host-registry-client.mjs.map +1 -0
  204. package/dist/lib/install-assets.d.mts +8 -0
  205. package/{src → dist}/lib/install-assets.mjs +17 -20
  206. package/dist/lib/install-assets.mjs.map +1 -0
  207. package/dist/lib/okstra-dirs.d.mts +4 -0
  208. package/{src → dist}/lib/okstra-dirs.mjs +3 -6
  209. package/dist/lib/okstra-dirs.mjs.map +1 -0
  210. package/dist/lib/paths.d.mts +4 -0
  211. package/dist/lib/paths.mjs +78 -0
  212. package/dist/lib/paths.mjs.map +1 -0
  213. package/dist/lib/proc.d.mts +3 -0
  214. package/dist/lib/proc.mjs +31 -0
  215. package/dist/lib/proc.mjs.map +1 -0
  216. package/dist/lib/python-helper.d.mts +8 -0
  217. package/dist/lib/python-helper.mjs +123 -0
  218. package/dist/lib/python-helper.mjs.map +1 -0
  219. package/dist/lib/runtime-manifest.d.mts +7 -0
  220. package/dist/lib/runtime-manifest.mjs +73 -0
  221. package/dist/lib/runtime-manifest.mjs.map +1 -0
  222. package/dist/lib/skill-catalog.d.mts +4 -0
  223. package/dist/lib/skill-catalog.mjs +50 -0
  224. package/dist/lib/skill-catalog.mjs.map +1 -0
  225. package/dist/lib/types.d.mts +129 -0
  226. package/dist/lib/types.mjs +2 -0
  227. package/dist/lib/types.mjs.map +1 -0
  228. package/dist/lib/version.d.mts +2 -0
  229. package/dist/lib/version.mjs +27 -0
  230. package/dist/lib/version.mjs.map +1 -0
  231. package/docs/architecture/storage-model.md +6 -2
  232. package/docs/architecture.md +29 -20
  233. package/docs/cli.md +40 -16
  234. package/docs/contributor-change-matrix.md +2 -2
  235. package/docs/for-ai/skills/okstra-inspect.md +2 -3
  236. package/docs/for-ai/skills/okstra-rollup.md +1 -0
  237. package/docs/project-structure-overview.md +72 -62
  238. package/docs/task-process/README.md +12 -8
  239. package/docs/task-process/common-flow.md +13 -16
  240. package/docs/task-process/error-analysis.md +9 -10
  241. package/docs/task-process/final-verification.md +7 -7
  242. package/docs/task-process/implementation-planning.md +9 -9
  243. package/docs/task-process/implementation.md +6 -6
  244. package/docs/task-process/release-handoff.md +8 -7
  245. package/docs/task-process/requirements-discovery.md +8 -8
  246. package/package.json +11 -5
  247. package/runtime/BUILD.json +2 -2
  248. package/runtime/agents/workers/claude-worker.md +2 -1
  249. package/runtime/agents/workers/report-writer-worker.md +3 -1
  250. package/runtime/agents/workers/translator-worker.md +3 -1
  251. package/runtime/bin/lib/okstra/cli.sh +12 -0
  252. package/runtime/bin/lib/okstra/globals.sh +3 -0
  253. package/runtime/bin/lib/okstra/interactive.sh +12 -6
  254. package/runtime/bin/lib/okstra/usage.sh +7 -6
  255. package/runtime/bin/okstra-error-log.py +27 -0
  256. package/runtime/bin/okstra-provider-exec.py +217 -5
  257. package/runtime/bin/okstra-spawn-followups.py +4 -2
  258. package/runtime/bin/okstra.sh +10 -0
  259. package/runtime/prompts/launch.template.md +2 -2
  260. package/runtime/prompts/lead/context-loader.md +1 -2
  261. package/runtime/prompts/lead/convergence.md +27 -18
  262. package/runtime/prompts/lead/okstra-lead-contract.md +6 -5
  263. package/runtime/prompts/lead/plan-body-verification.md +10 -3
  264. package/runtime/prompts/lead/report-writer.md +15 -1
  265. package/runtime/prompts/lead/team-contract.md +17 -13
  266. package/runtime/prompts/profiles/_implementation-deliverable.md +1 -1
  267. package/runtime/prompts/profiles/_implementation-executor.md +0 -3
  268. package/runtime/prompts/profiles/_implementation-verifier.md +3 -7
  269. package/runtime/prompts/profiles/change-impact-analysis.md +20 -0
  270. package/runtime/prompts/profiles/error-analysis.md +27 -1
  271. package/runtime/prompts/profiles/feature-analysis.md +20 -0
  272. package/runtime/prompts/profiles/final-verification.md +20 -1
  273. package/runtime/prompts/profiles/implementation-option-selection.md +20 -0
  274. package/runtime/prompts/profiles/implementation-planning.md +26 -0
  275. package/runtime/prompts/profiles/implementation.md +19 -0
  276. package/runtime/prompts/profiles/improvement-discovery.md +21 -1
  277. package/runtime/prompts/profiles/project-analysis.md +20 -0
  278. package/runtime/prompts/profiles/release-handoff.md +4 -0
  279. package/runtime/prompts/profiles/requirements-discovery.md +27 -1
  280. package/runtime/prompts/wizard/prompts.ko.json +35 -0
  281. package/runtime/python/okstra_ctl/adapters/dispatch/cli_wrapper.py +8 -0
  282. package/runtime/python/okstra_ctl/adapters/dispatch/cmux.py +8 -0
  283. package/runtime/python/okstra_ctl/adapters/dispatch/native_team.py +13 -0
  284. package/runtime/python/okstra_ctl/adapters/hosts/antigravity/adapter.py +2 -2
  285. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/adapter.py +25 -5
  286. package/runtime/python/okstra_ctl/adapters/hosts/codex/adapter.py +2 -2
  287. package/runtime/python/okstra_ctl/adapters/hosts/external/adapter.py +4 -1
  288. package/runtime/python/okstra_ctl/adapters/hosts/grok/adapter.py +2 -2
  289. package/runtime/python/okstra_ctl/adapters/hosts/kimi/adapter.py +2 -2
  290. package/runtime/python/okstra_ctl/adapters/providers/antigravity/adapter.py +79 -11
  291. package/runtime/python/okstra_ctl/adapters/providers/claude/adapter.py +95 -25
  292. package/runtime/python/okstra_ctl/adapters/providers/codex/adapter.py +59 -14
  293. package/runtime/python/okstra_ctl/adapters/providers/grok/adapter.py +55 -9
  294. package/runtime/python/okstra_ctl/adapters/providers/kimi/adapter.py +51 -12
  295. package/runtime/python/okstra_ctl/adapters/runtime/__init__.py +1 -0
  296. package/runtime/python/okstra_ctl/adapters/runtime/assembly.py +27 -0
  297. package/runtime/python/okstra_ctl/adapters/runtime/cli_wrapper.py +49 -0
  298. package/runtime/python/okstra_ctl/adapters/runtime/cmux.py +74 -0
  299. package/runtime/python/okstra_ctl/agent_activity.py +5 -1
  300. package/runtime/python/okstra_ctl/agent_invocation.py +608 -14
  301. package/runtime/python/okstra_ctl/agent_prompt_cli.py +249 -50
  302. package/runtime/python/okstra_ctl/application/open_worker.py +29 -0
  303. package/runtime/python/okstra_ctl/application/resolve_assignment.py +53 -12
  304. package/runtime/python/okstra_ctl/assignment_environment.py +102 -0
  305. package/runtime/python/okstra_ctl/assignment_resolver.py +790 -0
  306. package/runtime/python/okstra_ctl/attempt_evidence.py +342 -0
  307. package/runtime/python/okstra_ctl/convergence.py +409 -3
  308. package/runtime/python/okstra_ctl/convergence_engine.py +248 -15
  309. package/runtime/python/okstra_ctl/convergence_store.py +170 -1
  310. package/runtime/python/okstra_ctl/dispatch_core.py +1204 -155
  311. package/runtime/python/okstra_ctl/dispatch_state.py +696 -11
  312. package/runtime/python/okstra_ctl/doctor.py +14 -0
  313. package/runtime/python/okstra_ctl/domain/host.py +34 -1
  314. package/runtime/python/okstra_ctl/domain/provider.py +212 -6
  315. package/runtime/python/okstra_ctl/domain/role.py +125 -0
  316. package/runtime/python/okstra_ctl/domain/wizard/interaction.py +18 -0
  317. package/runtime/python/okstra_ctl/domain/worker_exec.py +34 -1
  318. package/runtime/python/okstra_ctl/domain/worker_role.py +13 -3
  319. package/runtime/python/okstra_ctl/domain/worker_runtime.py +44 -0
  320. package/runtime/python/okstra_ctl/domain/worker_stream.py +24 -0
  321. package/runtime/python/okstra_ctl/error_log_write.py +9 -0
  322. package/runtime/python/okstra_ctl/error_report.py +21 -1
  323. package/runtime/python/okstra_ctl/execution_identity.py +529 -0
  324. package/runtime/python/okstra_ctl/execution_manifest.py +1281 -0
  325. package/runtime/python/okstra_ctl/execution_mutation_audit.py +619 -0
  326. package/runtime/python/okstra_ctl/implementation_outcome.py +21 -5
  327. package/runtime/python/okstra_ctl/index.py +6 -2
  328. package/runtime/python/okstra_ctl/initial_prompt_materialization.py +43 -3
  329. package/runtime/python/okstra_ctl/legacy_model_selection.py +578 -0
  330. package/runtime/python/okstra_ctl/manager_sync.py +4 -1
  331. package/runtime/python/okstra_ctl/model_cli.py +278 -0
  332. package/runtime/python/okstra_ctl/model_defaults.py +46 -0
  333. package/runtime/python/okstra_ctl/model_discovery.py +26 -7
  334. package/runtime/python/okstra_ctl/model_pool.py +501 -0
  335. package/runtime/python/okstra_ctl/models.py +47 -27
  336. package/runtime/python/okstra_ctl/mutation_recovery.py +293 -0
  337. package/runtime/python/okstra_ctl/next_phase.py +236 -0
  338. package/runtime/python/okstra_ctl/pane_title.py +151 -0
  339. package/runtime/python/okstra_ctl/ports/host_model.py +48 -17
  340. package/runtime/python/okstra_ctl/ports/worker_dispatch.py +4 -0
  341. package/runtime/python/okstra_ctl/ports/worker_runtime.py +26 -0
  342. package/runtime/python/okstra_ctl/recap.py +4 -1
  343. package/runtime/python/okstra_ctl/registry/provider_registry.py +8 -4
  344. package/runtime/python/okstra_ctl/render.py +124 -57
  345. package/runtime/python/okstra_ctl/render_final_report.py +19 -0
  346. package/runtime/python/okstra_ctl/report_contract.py +39 -0
  347. package/runtime/python/okstra_ctl/report_finalize.py +16 -0
  348. package/runtime/python/okstra_ctl/report_html/render.py +1 -0
  349. package/runtime/python/okstra_ctl/role_requirements.py +210 -0
  350. package/runtime/python/okstra_ctl/rollup.py +4 -1
  351. package/runtime/python/okstra_ctl/run.py +1210 -258
  352. package/runtime/python/okstra_ctl/run_index_row.py +7 -1
  353. package/runtime/python/okstra_ctl/stage_fix_carry.py +17 -1
  354. package/runtime/python/okstra_ctl/team.py +14 -18
  355. package/runtime/python/okstra_ctl/time_report.py +38 -4
  356. package/runtime/python/okstra_ctl/usage_identity.py +86 -0
  357. package/runtime/python/okstra_ctl/usage_report.py +15 -3
  358. package/runtime/python/okstra_ctl/wizard.py +1449 -66
  359. package/runtime/python/okstra_ctl/worker_audit_ledger.py +68 -65
  360. package/runtime/python/okstra_ctl/worker_prompt_body.py +18 -2
  361. package/runtime/python/okstra_ctl/worker_prompt_contract.py +40 -9
  362. package/runtime/python/okstra_ctl/worker_prompt_headers.py +16 -1
  363. package/runtime/python/okstra_ctl/worker_request.py +7 -1
  364. package/runtime/python/okstra_ctl/worker_runner.py +130 -5
  365. package/runtime/python/okstra_ctl/workers.py +7 -5
  366. package/runtime/python/okstra_ctl/workflow.py +18 -32
  367. package/runtime/python/okstra_ctl/worktree.py +3 -3
  368. package/runtime/python/okstra_ctl/worktree_registry.py +5 -4
  369. package/runtime/python/okstra_ctl/write_policy.py +571 -0
  370. package/runtime/python/okstra_project/state.py +54 -6
  371. package/runtime/schemas/convergence-groups-v2.0.schema.json +128 -0
  372. package/runtime/schemas/execution-manifest-v2.schema.json +340 -0
  373. package/runtime/schemas/final-report-v2.0.schema.json +68 -5
  374. package/runtime/skills/okstra-inspect/facets/recap.md +2 -0
  375. package/runtime/skills/okstra-inspect/facets/report.md +1 -1
  376. package/runtime/skills/okstra-inspect/facets/status.md +15 -13
  377. package/runtime/skills/okstra-rollup/SKILL.md +1 -0
  378. package/runtime/skills/okstra-run/SKILL.md +14 -14
  379. package/runtime/templates/implementation-worker-preamble.md +3 -18
  380. package/runtime/templates/project-docs/task-index.template.md +0 -1
  381. package/runtime/templates/report-writer-prompt-preamble.md +2 -0
  382. package/runtime/templates/reports/final-report-v2.template.md +7 -1
  383. package/runtime/templates/reports/html/base.template.html +21 -0
  384. package/runtime/templates/reports/html/i18n/en.json +4 -0
  385. package/runtime/templates/reports/html/i18n/ko.json +4 -0
  386. package/runtime/templates/reports/html/macros/forms.html +5 -4
  387. package/runtime/templates/reports/html/tasks/final-verification.template.html +1 -1
  388. package/runtime/templates/reports/html/tasks/implementation.template.html +1 -1
  389. package/runtime/templates/worker-prompt-preamble.md +6 -35
  390. package/runtime/validators/lib/fixtures.sh +49 -16
  391. package/runtime/validators/validate-run.py +486 -134
  392. package/runtime/validators/validate_session_conformance.py +25 -7
  393. package/src/cli-registry.mjs +0 -539
  394. package/src/commands/execute/codex-dispatch.mjs +0 -10
  395. package/src/commands/execute/plan-items.mjs +0 -9
  396. package/src/commands/execute/plan-validate.mjs +0 -68
  397. package/src/commands/execute/run.mjs +0 -208
  398. package/src/commands/execute/wizard.mjs +0 -167
  399. package/src/commands/inspect/stage-map.mjs +0 -98
  400. package/src/commands/inspect/task-list.mjs +0 -97
  401. package/src/commands/inspect/task-show.mjs +0 -100
  402. package/src/commands/lifecycle/check-project.mjs +0 -187
  403. package/src/commands/lifecycle/config.mjs +0 -385
  404. package/src/commands/lifecycle/doctor.mjs +0 -308
  405. package/src/commands/lifecycle/install.mjs +0 -1170
  406. package/src/commands/lifecycle/paths.mjs +0 -104
  407. package/src/commands/lifecycle/preflight.mjs +0 -125
  408. package/src/commands/lifecycle/setup.mjs +0 -333
  409. package/src/commands/lifecycle/uninstall.mjs +0 -279
  410. package/src/commands/memory/memory.mjs +0 -524
  411. package/src/commands/pr/pr.mjs +0 -261
  412. package/src/lib/host-registry-client.mjs +0 -176
  413. package/src/lib/paths.mjs +0 -86
  414. package/src/lib/proc.mjs +0 -31
  415. package/src/lib/python-helper.mjs +0 -142
  416. package/src/lib/runtime-manifest.mjs +0 -70
  417. package/src/lib/skill-catalog.mjs +0 -53
  418. package/src/lib/version.mjs +0 -20
  419. /package/{src → dist}/commands/pr/default.md +0 -0
@@ -24,16 +24,16 @@ flowchart TD
24
24
  Type --> PlanPick[approved plan pick]
25
25
  PlanPick --> Approved[approval marker confirm]
26
26
  Approved --> Stage[stage pick<br/>whole-task or stage number]
27
- Stage --> Defaults[Use defaults / Customize]
28
- Defaults -->|defaults| Workers[worker roster pick<br/>claude/codex/report-writer default]
29
- Defaults -->|customize| Models[lead + worker model prompts]
30
- Models --> Extras[directive, related tasks, clarification]
31
- Extras --> Workers
32
- Workers --> Confirm[confirmation]
27
+ Stage --> Leader[leader session read-only]
28
+ Leader --> RoleCount[role-count min..max<br/>omit uses recommended; skip if min==max]
29
+ RoleCount --> RoleModel[role-model provider/model per slot]
30
+ RoleModel --> RoleAdd[min=0 roles via role-add only<br/>default skip]
31
+ RoleAdd --> Extras[directive, related tasks, clarification]
32
+ Extras --> Confirm[confirmation]
33
33
  Confirm --> Render[render-bundle]
34
34
  ```
35
35
 
36
- `final-verification` is a non-implementation phase that has an analyser roster. So even if you pick `Use defaults`, the worker roster prompt still appears. The default required workers are `claude`, `codex`, and `report-writer`, and `antigravity` is opt-in.
36
+ Launch selection uses role slots and model refs only: leader is the current session (read-only), then each static role's count in `min..max` (default **recommended**; the count step is skipped when `min == max`), then one `provider/model` per slot. Roles with `min = 0` stay closed unless the user opens them with role-add (default skip). Duplicate model refs in the same role are rejected. There is no provider roster multi-pick and no `Use defaults / Customize` fork. Dynamic verifiers are not chosen at launch. `--workers` is a CLI compatibility input only, not a launch picker.
37
37
 
38
38
  This phase does not ask for `base-ref` directly. The wizard selects whole-task or a single stage from the approved plan's Stage Map, and prepare resolves `VERIFICATION_TARGET` from the registry / `consumers.jsonl` / git state.
39
39
 
@@ -27,19 +27,17 @@ flowchart TD
27
27
  Input -->|rerun| Prior[prior planning report via clarification-response]
28
28
  Direction --> Worktree{active task worktree?}
29
29
  Prior --> Worktree
30
- Worktree -->|yes| Defaults[Use defaults / Customize]
30
+ Worktree -->|yes| Leader[leader session read-only]
31
31
  Worktree -->|no| BaseRef[base-ref pick/text]
32
- BaseRef --> Defaults
33
- Defaults --> Workers[worker multi-pick<br/>claude/codex + optional antigravity]
34
- Workers --> Branch{customize?}
35
- Branch -->|no| Confirm
36
- Branch -->|yes| Models[lead, claude, codex, antigravity if selected, report-writer models]
37
- Models --> Extras[directive, related tasks, clarification]
32
+ BaseRef --> Leader
33
+ Leader --> RoleCount[role-count min..max<br/>omit uses recommended]
34
+ RoleCount --> RoleModel[role-model provider/model per slot]
35
+ RoleModel --> Extras[directive, related tasks, clarification]
38
36
  Extras --> Confirm
39
37
  Confirm --> Render[render-bundle]
40
38
  ```
41
39
 
42
- For a new plan, the wizard asks for a validated option-selection report and passes it as `--selected-direction`. A planning clarification rerun passes its own prior report through `--clarification-response`. The wizard currently does not ask about `--no-plan-verification`; on the okstra-run path, plan-body verification is prepared as enabled by default.
40
+ For a new plan, the wizard asks for a validated option-selection report and passes it as `--selected-direction`. A planning clarification rerun passes its own prior report through `--clarification-response`. Launch selection uses role slots and model refs only: planner count in `min..max` (default recommended), then one `provider/model` per slot. Duplicate model refs in the same role are rejected. There is no provider roster multi-pick. The wizard currently does not ask about `--no-plan-verification`; on the okstra-run path, plan-body verification is prepared as enabled by default.
43
41
 
44
42
  ## 3. prepare_task_bundle handling
45
43
 
@@ -59,12 +57,14 @@ sequenceDiagram
59
57
  P->>P: provision/reuse task worktree
60
58
  P->>R: _build_convergence_block()
61
59
  R-->>M: convergence.planBodyVerification.enabled=true
62
- P->>M: workflow nextRecommendedPhase=implementation
60
+ P->>M: workflow nextRecommendedPhase inherited, ready lowered to pending
63
61
  P-->>W: prepared lead prompt
64
62
  ```
65
63
 
66
64
  Prepare rejects a new plan without a selected-direction report. Comparison mode requires a valid `DIRECTION SELECTION` sidecar, while preselected-validation mode uses the confirmed upstream direction without one. The normalized snapshot binds the source report, source-data digest, option ID, direction body, requirements, and invariants.
67
65
 
66
+ Prepare does not name the next phase. It carries the inherited `workflow.nextRecommendedPhase` forward and lowers a `ready` pointer to `pending`, because this run has not finished and a `ready` pointer would read as an invitation to start the following phase. The pointer becomes `ready` at `implementation` only when Phase 7 projects it from this run's `implementationPlanning.outcome` of `plan-ready`.
67
+
68
68
  ## 4. lead execution flow
69
69
 
70
70
  ```mermaid
@@ -31,16 +31,16 @@ flowchart TD
31
31
  Approved -->|no| Retry[re-prompt same step]
32
32
  Approved -->|yes| Stage[stage multi-pick<br/>ready/active markers]
33
33
  Stage --> Chain[render-args<br/>stage + chain-stages]
34
- Chain --> Executor[executor pick<br/>claude/codex/antigravity]
35
- Executor --> Defaults[Use defaults / Customize]
36
- Defaults -->|defaults| Confirm
37
- Defaults -->|customize| Models[lead + executor model + report-writer model]
38
- Models --> Extras[directive, related tasks, clarification]
34
+ Chain --> Leader[leader session read-only]
35
+ Leader --> RoleCount[role-count min..max<br/>omit uses recommended; skip if min==max]
36
+ RoleCount --> RoleModel[role-model provider/model per slot]
37
+ RoleModel --> RoleAdd[min=0 roles via role-add only<br/>default skip]
38
+ RoleAdd --> Extras[directive, related tasks, clarification]
39
39
  Extras --> Confirm
40
40
  Confirm --> Render[render-bundle]
41
41
  ```
42
42
 
43
- `implementation` has no worker override question. The wizard `render_args()` emits `workers` as an empty string, and the runtime uses the profile default roster. `stage_pick` is a multi-pick that shows done/in-progress/ready/waiting status. The selected stage set goes through dependency closure and topological sort into a `chain-stages` CSV, and each actual run executes only one of those stages.
43
+ Launch selection uses role slots and model refs only: leader is the current session (read-only), then each static role's count in `min..max` (default **recommended**; the count step is skipped when `min == max`), then one `provider/model` per slot. Roles with `min = 0` stay closed unless the user opens them with role-add (default skip). Duplicate model refs in the same role are rejected. There is no provider roster multi-pick and no defaults-vs-customize fork. `executor` is only a compatibility alias for `implementer` in model refs; implementer slots are chosen through role-count / role-model. Dynamic verifiers are not chosen at launch. `--workers` is a CLI compatibility input only, not a launch picker. `stage_pick` is a multi-pick that shows done/in-progress/ready/waiting status. The selected stage set goes through dependency closure and topological sort into a `chain-stages` CSV, and each actual run executes only one of those stages.
44
44
 
45
45
  The current okstra-run wizard path does not expose `--approve` that directly flips the approval checkbox. The plan file must already have a recognized approval marker.
46
46
 
@@ -27,19 +27,20 @@ flowchart TD
27
27
  Type --> Plan[approved plan auto/pick]
28
28
  Plan --> Scope[handoff stage pick<br/>whole-task or eligible stages]
29
29
  Scope --> Worktree{active task worktree?}
30
- Worktree -->|yes| Defaults[Use defaults / Customize]
30
+ Worktree -->|yes| Leader[leader session read-only]
31
31
  Worktree -->|no| BaseRef[base-ref pick/text]
32
- BaseRef --> Defaults
33
- Defaults -->|defaults| Confirm[confirmation]
34
- Defaults -->|customize| Models[lead model prompt]
35
- Models --> Extras[directive, related tasks, clarification]
32
+ BaseRef --> Leader
33
+ Leader --> RoleCount[role-count min..max<br/>omit uses recommended; skip if min==max]
34
+ RoleCount --> RoleModel[role-model provider/model per slot]
35
+ RoleModel --> RoleAdd[min=0 roles via role-add only<br/>default skip]
36
+ RoleAdd --> Extras[directive, related tasks, clarification]
36
37
  Extras --> Template[PR template override?]
37
38
  Template --> TemplateScope[save template to project/global?]
38
- TemplateScope --> Confirm
39
+ TemplateScope --> Confirm[confirmation]
39
40
  Confirm --> Render[render-bundle]
40
41
  ```
41
42
 
42
- `release-handoff` has no worker roster prompt. The wizard outcome's `renderArgs` includes `pr-template-path` only for release-handoff, and the runtime forces the worker list to empty. Scope selection finishes before prepare, and the project/global save runs before `render-bundle` via the `config.set pr-template-path` action of `outcome.persistActions[]`. whole-task requires an accepted whole-task verification report, and for stage-group only the stages that were marked `verified` by an accepted single-stage verification in the Stage Lifecycle Snapshot but not yet covered by a `pr` become candidates.
43
+ `release-handoff` has no analysis-worker dispatch. Launch selection still shows the leader session (read-only) and any applicable role-count / role-model steps; there is no provider roster multi-pick and no `Use defaults / Customize` fork. Dynamic verifiers are not chosen at launch. `--workers` is not a launch picker, and the runtime forces the worker list to empty. The wizard outcome's `renderArgs` includes `pr-template-path` only for release-handoff. Scope selection finishes before prepare, and the project/global save runs before `render-bundle` via the `config.set pr-template-path` action of `outcome.persistActions[]`. whole-task requires an accepted whole-task verification report, and for stage-group only the stages that were marked `verified` by an accepted single-stage verification in the Stage Lifecycle Snapshot but not yet covered by a `pr` become candidates.
43
44
 
44
45
  Note that this phase is also a target of task worktree provisioning. The normal flow reuses the implementation/final-verification result of the same task-key. Starting a new task may create a new branch, and it is likely to be blocked at the entry gate's "implementation commit exists" condition.
45
46
 
@@ -31,18 +31,18 @@ flowchart TD
31
31
  Keep -->|keep| Base
32
32
  Keep -->|change/no brief| Brief
33
33
  Type --> Base{active task worktree?}
34
- Base -->|yes| Defaults[Use defaults / Customize]
34
+ Base -->|yes| Leader[leader session read-only]
35
35
  Base -->|no| BaseRef[base-ref pick/text]
36
- BaseRef --> Defaults
37
- Defaults --> Workers[worker multi-pick<br/>still asked even on defaults]
38
- Workers --> Custom{customize?}
39
- Custom -->|yes| ModelsAndExtras[models, directive, related tasks, clarification]
40
- Custom -->|no| Confirm
41
- ModelsAndExtras --> Confirm
36
+ BaseRef --> Leader
37
+ Leader --> RoleCount[role-count min..max<br/>omit uses recommended; skip if min==max]
38
+ RoleCount --> RoleModel[role-model provider/model per slot]
39
+ RoleModel --> RoleAdd[min=0 roles via role-add only<br/>default skip]
40
+ RoleAdd --> Extras[directive, related tasks, clarification]
41
+ Extras --> Confirm
42
42
  Confirm --> Render[render-bundle]
43
43
  ```
44
44
 
45
- In the worker multi-pick, the picker does not show `report-writer` as an option. Even if the user selects only `claude`, the wizard force-appends `report-writer`. The optional `antigravity` is included only when the user selects it.
45
+ Launch selection uses role slots and model refs only: leader is the current session (read-only), then each static role's count in `min..max` (default **recommended**; the count step is skipped when `min == max`), then one `provider/model` per slot. Roles with `min = 0` stay closed unless the user opens them with role-add (default skip). Duplicate model refs in the same role are rejected. There is no provider roster multi-pick and no `Use defaults / Customize` fork. Dynamic verifiers are not chosen at launch. `--workers` is a CLI compatibility input only, not a launch picker.
46
46
 
47
47
  ## 3. prepare_task_bundle handling
48
48
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okstra",
3
- "version": "0.174.0",
3
+ "version": "0.176.0",
4
4
  "description": "Host-aware multi-provider cross-verification orchestrator runtime and agent skills.",
5
5
  "license": "MIT",
6
6
  "author": "devonshin",
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "files": [
16
16
  "bin/",
17
- "src/",
17
+ "dist/",
18
18
  "runtime/",
19
19
  "docs/architecture.md",
20
20
  "docs/architecture/",
@@ -30,15 +30,21 @@
30
30
  "README.md"
31
31
  ],
32
32
  "engines": {
33
- "node": ">=18"
33
+ "node": ">=22"
34
34
  },
35
35
  "scripts": {
36
- "build": "node tools/build.mjs",
37
- "prepack": "node tools/build.mjs",
36
+ "build:ts": "tsc --project tsconfig.json",
37
+ "typecheck": "tsc --project tsconfig.json --noEmit",
38
+ "build": "npm run build:ts && node tools/build.mjs",
39
+ "prepack": "npm run build",
38
40
  "test:js": "node --test tests-js/*.test.mjs",
39
41
  "test:py": "python3 -m pytest tests/",
40
42
  "test:workflow": "bash validators/validate-workflow.sh",
41
43
  "test:e2e": "bash tests-e2e/run-all.sh",
42
44
  "check": "npm run build && npm run test:js && npm run test:py && npm run test:workflow && npm run test:e2e"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^26.2.0",
48
+ "typescript": "^7.0.2"
43
49
  }
44
50
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "package": "0.174.0",
3
- "builtAt": "2026-08-17T05:25:03.210Z",
2
+ "package": "0.176.0",
3
+ "builtAt": "2026-08-18T08:36:47.903Z",
4
4
  "repoRoot": "/home/runner/work/okstra/okstra"
5
5
  }
@@ -26,7 +26,8 @@ invocation. The final prompt's duty contract owns the role boundary,
26
26
  responsibility, and prohibited actions. This file owns Claude tool usage,
27
27
  artifact persistence, and liveness procedure only. Do not shell out to another
28
28
  model CLI, and refuse a dispatch whose prompt has no adjacent verified
29
- invocation metadata.
29
+ invocation metadata. Consume the stored `executionLabel`; do not infer a role
30
+ from the provider name. `lead` is a compatibility alias for `leader`.
30
31
 
31
32
  ## Execution Rules
32
33
 
@@ -18,7 +18,9 @@ This is the Claude host execution adapter for a materialized Okstra invocation.
18
18
  The final prompt's `report-writer` duty contract owns the role boundary,
19
19
  required responsibility, and prohibited actions. This file owns only how that
20
20
  contract is executed with Claude host tools. Refuse a dispatch whose prompt has
21
- no adjacent verified invocation metadata.
21
+ no adjacent verified invocation metadata. Consume the stored `executionLabel`.
22
+ The final-report `executionRoles[]` set must equal the execution-manifest
23
+ `roleExecutions[]` set.
22
24
 
23
25
  - The `**Report Language:**` header in your dispatch prompt is already
24
26
  resolved to `en` or `ko` by the lead. Copy it verbatim into
@@ -18,7 +18,9 @@ This is the Claude host execution adapter for a materialized Okstra invocation.
18
18
  The final prompt's `translator` duty contract owns the role boundary,
19
19
  responsibility, and prohibited actions. This file owns only the extraction,
20
20
  translation-sidecar, and verification tool procedure. Refuse a dispatch whose
21
- prompt has no adjacent verified invocation metadata.
21
+ prompt has no adjacent verified invocation metadata. Consume the stored
22
+ `executionLabel`; the translator role remains `translator` even without a team
23
+ roster.
22
24
 
23
25
  ## Procedure
24
26
 
@@ -67,6 +67,18 @@ while [[ $# -gt 0 ]]; do
67
67
  WORKERS_OVERRIDE="$(require_option_value --workers "${2-}")"
68
68
  shift 2
69
69
  ;;
70
+ --role-count)
71
+ ROLE_COUNTS+=("$(require_option_value --role-count "${2-}")")
72
+ shift 2
73
+ ;;
74
+ --role-model)
75
+ ROLE_MODELS+=("$(require_option_value --role-model "${2-}")")
76
+ shift 2
77
+ ;;
78
+ --host-session-context-json)
79
+ HOST_SESSION_CONTEXT_JSON="$(require_option_value --host-session-context-json "${2-}")"
80
+ shift 2
81
+ ;;
70
82
  --lead-model)
71
83
  LEAD_MODEL_OVERRIDE="$(require_option_value --lead-model "${2-}")"
72
84
  shift 2
@@ -19,6 +19,9 @@ RESUME_CLARIFICATION_MODE="false"
19
19
  RESUME_SESSION_MODE="false"
20
20
  RESUME_SESSION_ID=""
21
21
  WORKERS_OVERRIDE=""
22
+ ROLE_COUNTS=()
23
+ ROLE_MODELS=()
24
+ HOST_SESSION_CONTEXT_JSON=""
22
25
  LEAD_MODEL_OVERRIDE=""
23
26
  LEAD_PROVIDER_OVERRIDE=""
24
27
  CLAUDE_MODEL_OVERRIDE=""
@@ -192,8 +192,15 @@ PY
192
192
  need_brief_val="$([[ -z "$BRIEF_PATH" ]] && printf '1' || printf '0')"
193
193
  need_type_val="$([[ -z "$TASK_TYPE" ]] && printf '1' || printf '0')"
194
194
  local autofill_output=""
195
- autofill_output="$(python3 - "$manifest_path" "$need_brief_val" "$need_type_val" <<'PY'
195
+ # autofill 은 편의 기능이라 실패해도 run 을 끊으면 안 된다. heredoc 이
196
+ # okstra_ctl 을 import 하므로 설치가 깨지면 non-zero 로 끝나는데, okstra.sh 는
197
+ # `set -euo pipefail` 이라 이 평범한 대입 하나가 run 을 통째로 중단시킨다.
198
+ # 위 reconcile 호출(:189)이 같은 이유로 `|| true` 를 달고 있다.
199
+ autofill_output="$(PYTHONPATH="$OKSTRA_PYTHONPATH:${PYTHONPATH-}" python3 - "$manifest_path" "$need_brief_val" "$need_type_val" <<'PY'
196
200
  import json, sys
201
+
202
+ from okstra_ctl import next_phase
203
+
197
204
  path = sys.argv[1]
198
205
  need_brief = sys.argv[2] == "1"
199
206
  need_type = sys.argv[3] == "1"
@@ -208,15 +215,14 @@ task_type = ""
208
215
  if need_brief:
209
216
  brief = (data.get("taskBriefPath") or "").strip()
210
217
  if need_type:
211
- workflow = data.get("workflow") or {}
212
- task_type = (workflow.get("nextRecommendedPhase") or "").strip()
213
- if task_type in ("", "pending-routing-decision", "done-or-follow-up"):
214
- task_type = ""
218
+ # 포인터 판정은 Python SSOT 가 갖는다 — `ready` 가 아니면 빈 문자열이라
219
+ # 셸이 센티널 목록을 따로 들고 있을 이유가 없다.
220
+ task_type = next_phase.autofill_task_type(data)
215
221
 
216
222
  print(f"BRIEF={brief}")
217
223
  print(f"TYPE={task_type}")
218
224
  PY
219
- )"
225
+ )" || true
220
226
 
221
227
  local manifest_brief=""
222
228
  local manifest_type=""
@@ -74,8 +74,9 @@ optional arguments:
74
74
  plans.
75
75
  --task-key <project-id:task-group:task-id>
76
76
  Shorthand for --project-id/--task-group/--task-id. When the matching task-manifest.json
77
- exists, brief-path and task-type are auto-filled from it (taskBriefPath and
78
- workflow.nextRecommendedPhase). Explicit flags always win.
77
+ exists, brief-path and task-type are auto-filled from it (taskBriefPath, and
78
+ workflow.nextRecommendedPhase.phase only while its status is \`ready\`).
79
+ Explicit flags always win.
79
80
 
80
81
  options:
81
82
  --render-only Render the host-neutral lead handoff prompt only. Do not launch a session.
@@ -104,8 +105,8 @@ options:
104
105
  --lead-runtime Registered host ID or alias. Default: claude-code. In-host runs
105
106
  use current-session; terminal launch uses spawn-process readiness.
106
107
  --executor Provider that performs the Executor role during --task-type=implementation.
107
- One of: claude | codex | antigravity. Default: OKSTRA_DEFAULT_EXECUTOR or claude.
108
- The Executor is the only worker allowed to mutate project files; the other two
108
+ One of: claude | codex | antigravity | grok | kimi. Default: OKSTRA_DEFAULT_EXECUTOR or claude.
109
+ The Executor is the only worker allowed to mutate project files; the other
109
110
  providers are dispatched as read-only verifiers regardless of this selection.
110
111
  Has no effect on other task types.
111
112
  --critic Provider for the opt-in Phase 5.6 critic pass (coverage gaps /
@@ -132,9 +133,9 @@ model defaults:
132
133
  Claude worker: OKSTRA_DEFAULT_CLAUDE_MODEL or opus
133
134
  Codex worker: OKSTRA_DEFAULT_CODEX_MODEL or gpt-5.6-sol
134
135
  Antigravity worker: OKSTRA_DEFAULT_ANTIGRAVITY_MODEL or gemini-3.1-pro
135
- Grok worker: grok-build-0.1 (analyser) or grok-4.5 (critic)
136
+ Grok worker: grok-4.6
136
137
  Kimi worker: kimi-k2.7-code (analyser) or kimi-k3 (critic)
137
- Implementation executor: OKSTRA_DEFAULT_EXECUTOR or claude (one of: claude | codex | antigravity)
138
+ Implementation executor: OKSTRA_DEFAULT_EXECUTOR or claude (one of: claude | codex | antigravity | grok | kimi)
138
139
 
139
140
  output:
140
141
  Stable task bundles are stored under:
@@ -72,6 +72,7 @@ def _build_parser():
72
72
  grp.add_argument("--stderr-excerpt-file", default=None)
73
73
  obs.add_argument("--context-json", default=None,
74
74
  help="JSON object string for context")
75
+ _add_identity_flags(obs)
75
76
 
76
77
  dump = sub.add_parser("append-from-worker",
77
78
  help="Dump worker sidecar errors[] into errors.jsonl")
@@ -81,9 +82,33 @@ def _build_parser():
81
82
  dump.add_argument("--agent", required=True, choices=sorted(ALLOWED_AGENTS))
82
83
  dump.add_argument("--agent-role", required=True, choices=sorted(ALLOWED_AGENT_ROLES))
83
84
  dump.add_argument("--model", required=True)
85
+ _add_identity_flags(dump)
84
86
  return p
85
87
 
86
88
 
89
+ def _add_identity_flags(parser):
90
+ parser.add_argument("--participant-ref", default="")
91
+ parser.add_argument("--role-execution-ref", default="")
92
+ parser.add_argument("--invocation-ref", default="")
93
+ parser.add_argument("--attempt", type=int, default=None)
94
+ parser.add_argument("--execution-label", default="")
95
+
96
+
97
+ def _identity_from_args(args):
98
+ payload = {}
99
+ if args.participant_ref:
100
+ payload["participantRef"] = args.participant_ref
101
+ if args.role_execution_ref:
102
+ payload["roleExecutionRef"] = args.role_execution_ref
103
+ if args.invocation_ref:
104
+ payload["invocationRef"] = args.invocation_ref
105
+ if args.attempt is not None:
106
+ payload["attempt"] = args.attempt
107
+ if args.execution_label:
108
+ payload["executionLabel"] = args.execution_label
109
+ return payload or None
110
+
111
+
87
112
  def _read_stderr(args):
88
113
  if args.stderr_excerpt_file:
89
114
  return Path(args.stderr_excerpt_file).read_text()
@@ -114,6 +139,7 @@ def main(argv=None):
114
139
  message=args.message,
115
140
  stderr_excerpt=_read_stderr(args),
116
141
  context=_read_context(args),
142
+ identity=_identity_from_args(args),
117
143
  )
118
144
  return 0
119
145
  if args.cmd == "append-from-worker":
@@ -124,6 +150,7 @@ def main(argv=None):
124
150
  agent=args.agent,
125
151
  agent_role=args.agent_role,
126
152
  model=args.model,
153
+ identity=_identity_from_args(args),
127
154
  )
128
155
  print(n)
129
156
  return 0