okstra 0.173.0 → 0.175.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) 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/dist/commands/execute/team.mjs +56 -0
  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/dist/commands/execute/worktree-status.mjs +115 -0
  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/dist/commands/report/finalize.mjs +64 -0
  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 +17 -3
  232. package/docs/architecture.md +12 -22
  233. package/docs/cli.md +29 -8
  234. package/docs/container.md +1 -1
  235. package/docs/contributor-change-matrix.md +3 -3
  236. package/docs/project-structure-overview.md +29 -20
  237. package/docs/task-process/README.md +3 -1
  238. package/docs/task-process/implementation-planning.md +2 -2
  239. package/docs/task-process/implementation.md +1 -1
  240. package/package.json +11 -5
  241. package/runtime/BUILD.json +2 -2
  242. package/runtime/agents/workers/claude-worker.md +3 -2
  243. package/runtime/agents/workers/report-writer-worker.md +3 -1
  244. package/runtime/agents/workers/translator-worker.md +3 -1
  245. package/runtime/bin/lib/okstra/cli.sh +12 -0
  246. package/runtime/bin/lib/okstra/globals.sh +4 -1
  247. package/runtime/bin/lib/okstra/usage.sh +4 -4
  248. package/runtime/bin/okstra-error-log.py +27 -0
  249. package/runtime/bin/okstra-provider-exec.py +245 -16
  250. package/runtime/bin/okstra-trace-cleanup.sh +58 -129
  251. package/runtime/bin/okstra.sh +10 -0
  252. package/runtime/prompts/lead/adapters/cmux.md +2 -0
  253. package/runtime/prompts/lead/convergence.md +27 -18
  254. package/runtime/prompts/lead/okstra-lead-contract.md +4 -2
  255. package/runtime/prompts/lead/plan-body-verification.md +13 -6
  256. package/runtime/prompts/lead/report-writer.md +6 -6
  257. package/runtime/prompts/lead/team-contract.md +1 -1
  258. package/runtime/prompts/profiles/_common-contract.md +2 -2
  259. package/runtime/prompts/profiles/_implementation-executor.md +2 -0
  260. package/runtime/prompts/profiles/_implementation-verifier.md +2 -2
  261. package/runtime/prompts/profiles/change-impact-analysis.md +16 -0
  262. package/runtime/prompts/profiles/error-analysis.md +21 -1
  263. package/runtime/prompts/profiles/feature-analysis.md +16 -0
  264. package/runtime/prompts/profiles/final-verification.md +16 -0
  265. package/runtime/prompts/profiles/implementation-option-selection.md +16 -0
  266. package/runtime/prompts/profiles/implementation-planning.md +32 -9
  267. package/runtime/prompts/profiles/implementation.md +17 -1
  268. package/runtime/prompts/profiles/improvement-discovery.md +16 -0
  269. package/runtime/prompts/profiles/project-analysis.md +16 -0
  270. package/runtime/prompts/profiles/release-handoff.md +5 -1
  271. package/runtime/prompts/profiles/requirements-discovery.md +20 -0
  272. package/runtime/prompts/wizard/prompts.ko.json +18 -0
  273. package/runtime/python/okstra_ctl/adapters/dispatch/__init__.py +1 -6
  274. package/runtime/python/okstra_ctl/adapters/dispatch/cli_wrapper.py +8 -0
  275. package/runtime/python/okstra_ctl/adapters/dispatch/cmux.py +8 -0
  276. package/runtime/python/okstra_ctl/adapters/dispatch/native_team.py +13 -0
  277. package/runtime/python/okstra_ctl/adapters/hosts/antigravity/adapter.py +2 -2
  278. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/adapter.py +25 -5
  279. package/runtime/python/okstra_ctl/adapters/hosts/codex/adapter.py +2 -2
  280. package/runtime/python/okstra_ctl/adapters/hosts/external/adapter.py +4 -1
  281. package/runtime/python/okstra_ctl/adapters/hosts/external/relay.md +4 -4
  282. package/runtime/python/okstra_ctl/adapters/hosts/grok/adapter.py +2 -2
  283. package/runtime/python/okstra_ctl/adapters/hosts/kimi/adapter.py +2 -2
  284. package/runtime/python/okstra_ctl/adapters/providers/antigravity/adapter.py +79 -11
  285. package/runtime/python/okstra_ctl/adapters/providers/claude/adapter.py +100 -25
  286. package/runtime/python/okstra_ctl/adapters/providers/codex/adapter.py +59 -14
  287. package/runtime/python/okstra_ctl/adapters/providers/grok/adapter.py +55 -9
  288. package/runtime/python/okstra_ctl/adapters/providers/kimi/adapter.py +51 -12
  289. package/runtime/python/okstra_ctl/agent_activity.py +5 -1
  290. package/runtime/python/okstra_ctl/agent_invocation.py +608 -14
  291. package/runtime/python/okstra_ctl/agent_prompt_cli.py +249 -50
  292. package/runtime/python/okstra_ctl/application/resolve_assignment.py +53 -12
  293. package/runtime/python/okstra_ctl/assignment_environment.py +102 -0
  294. package/runtime/python/okstra_ctl/assignment_resolver.py +790 -0
  295. package/runtime/python/okstra_ctl/attempt_evidence.py +342 -0
  296. package/runtime/python/okstra_ctl/conformance.py +68 -0
  297. package/runtime/python/okstra_ctl/convergence.py +409 -3
  298. package/runtime/python/okstra_ctl/convergence_engine.py +248 -15
  299. package/runtime/python/okstra_ctl/convergence_store.py +170 -1
  300. package/runtime/python/okstra_ctl/dispatch_core.py +1181 -102
  301. package/runtime/python/okstra_ctl/dispatch_state.py +835 -22
  302. package/runtime/python/okstra_ctl/doctor.py +16 -2
  303. package/runtime/python/okstra_ctl/domain/host.py +32 -1
  304. package/runtime/python/okstra_ctl/domain/provider.py +212 -6
  305. package/runtime/python/okstra_ctl/domain/role.py +125 -0
  306. package/runtime/python/okstra_ctl/domain/wizard/interaction.py +13 -0
  307. package/runtime/python/okstra_ctl/domain/worker_exec.py +39 -1
  308. package/runtime/python/okstra_ctl/domain/worker_role.py +13 -3
  309. package/runtime/python/okstra_ctl/domain/worker_stream.py +24 -0
  310. package/runtime/python/okstra_ctl/error_log_write.py +9 -0
  311. package/runtime/python/okstra_ctl/error_report.py +21 -1
  312. package/runtime/python/okstra_ctl/execution_identity.py +529 -0
  313. package/runtime/python/okstra_ctl/execution_manifest.py +1281 -0
  314. package/runtime/python/okstra_ctl/execution_mutation_audit.py +619 -0
  315. package/runtime/python/okstra_ctl/final_report_schema.py +5 -4
  316. package/runtime/python/okstra_ctl/index.py +6 -2
  317. package/runtime/python/okstra_ctl/initial_prompt_materialization.py +43 -3
  318. package/runtime/python/okstra_ctl/legacy_model_selection.py +490 -0
  319. package/runtime/python/okstra_ctl/model_cli.py +278 -0
  320. package/runtime/python/okstra_ctl/model_defaults.py +46 -0
  321. package/runtime/python/okstra_ctl/model_discovery.py +26 -7
  322. package/runtime/python/okstra_ctl/model_pool.py +501 -0
  323. package/runtime/python/okstra_ctl/models.py +47 -27
  324. package/runtime/python/okstra_ctl/mutation_recovery.py +293 -0
  325. package/runtime/python/okstra_ctl/pane_reclaim.py +13 -22
  326. package/runtime/python/okstra_ctl/pane_title.py +151 -0
  327. package/runtime/python/okstra_ctl/ports/host_model.py +48 -17
  328. package/runtime/python/okstra_ctl/ports/worker_dispatch.py +4 -0
  329. package/runtime/python/okstra_ctl/registry/provider_registry.py +8 -4
  330. package/runtime/python/okstra_ctl/render.py +78 -10
  331. package/runtime/python/okstra_ctl/render_final_report.py +34 -19
  332. package/runtime/python/okstra_ctl/report_contract.py +39 -1
  333. package/runtime/python/okstra_ctl/report_finalize.py +84 -9
  334. package/runtime/python/okstra_ctl/report_html/render.py +1 -0
  335. package/runtime/python/okstra_ctl/role_requirements.py +217 -0
  336. package/runtime/python/okstra_ctl/run.py +1250 -260
  337. package/runtime/python/okstra_ctl/run_index_row.py +7 -1
  338. package/runtime/python/okstra_ctl/schema_excerpt.py +1 -1
  339. package/runtime/python/okstra_ctl/scope_provenance.py +1 -1
  340. package/runtime/python/okstra_ctl/session.py +69 -12
  341. package/runtime/python/okstra_ctl/team.py +51 -25
  342. package/runtime/python/okstra_ctl/time_report.py +38 -4
  343. package/runtime/python/okstra_ctl/tmux.py +19 -149
  344. package/runtime/python/okstra_ctl/usage_identity.py +86 -0
  345. package/runtime/python/okstra_ctl/usage_report.py +15 -3
  346. package/runtime/python/okstra_ctl/wizard.py +1253 -62
  347. package/runtime/python/okstra_ctl/worker_audit_ledger.py +68 -65
  348. package/runtime/python/okstra_ctl/worker_request.py +9 -1
  349. package/runtime/python/okstra_ctl/worker_runner.py +130 -5
  350. package/runtime/python/okstra_ctl/workers.py +7 -5
  351. package/runtime/python/okstra_ctl/worktree.py +69 -3
  352. package/runtime/python/okstra_ctl/write_policy.py +571 -0
  353. package/runtime/python/okstra_token_usage/cli.py +1 -1
  354. package/runtime/python/okstra_token_usage/collect.py +66 -6
  355. package/runtime/schemas/convergence-groups-v2.0.schema.json +128 -0
  356. package/runtime/schemas/execution-manifest-v2.schema.json +340 -0
  357. package/runtime/schemas/final-report-v2.0.schema.json +25 -0
  358. package/runtime/skills/okstra-run/SKILL.md +9 -9
  359. package/runtime/skills/okstra-setup/references/project-config.md +11 -0
  360. package/runtime/templates/report-writer-prompt-preamble.md +2 -0
  361. package/runtime/templates/reports/final-report-v2.template.md +7 -1
  362. package/runtime/templates/reports/html/base.template.html +21 -0
  363. package/runtime/templates/reports/html/i18n/en.json +4 -0
  364. package/runtime/templates/reports/html/i18n/ko.json +4 -0
  365. package/runtime/templates/reports/settings.template.json +0 -24
  366. package/runtime/templates/worker-prompt-preamble.md +6 -2
  367. package/runtime/validators/lib/fixtures.sh +98 -33
  368. package/runtime/validators/validate-implementation-plan-stages.py +63 -3
  369. package/runtime/validators/validate-run.py +443 -508
  370. package/runtime/validators/validate_session_conformance.py +26 -8
  371. package/runtime/bin/okstra-subagent-reclaim.sh +0 -26
  372. package/runtime/schemas/final-report-v1.0.schema.json +0 -6366
  373. package/runtime/templates/reports/final-report.template.md +0 -1258
  374. package/src/cli-registry.mjs +0 -532
  375. package/src/commands/execute/codex-dispatch.mjs +0 -10
  376. package/src/commands/execute/plan-items.mjs +0 -9
  377. package/src/commands/execute/plan-validate.mjs +0 -68
  378. package/src/commands/execute/run.mjs +0 -208
  379. package/src/commands/execute/team.mjs +0 -63
  380. package/src/commands/execute/wizard.mjs +0 -167
  381. package/src/commands/inspect/stage-map.mjs +0 -98
  382. package/src/commands/inspect/task-list.mjs +0 -97
  383. package/src/commands/inspect/task-show.mjs +0 -100
  384. package/src/commands/lifecycle/check-project.mjs +0 -187
  385. package/src/commands/lifecycle/config.mjs +0 -385
  386. package/src/commands/lifecycle/doctor.mjs +0 -308
  387. package/src/commands/lifecycle/install.mjs +0 -1172
  388. package/src/commands/lifecycle/paths.mjs +0 -104
  389. package/src/commands/lifecycle/preflight.mjs +0 -125
  390. package/src/commands/lifecycle/setup.mjs +0 -333
  391. package/src/commands/lifecycle/uninstall.mjs +0 -279
  392. package/src/commands/memory/memory.mjs +0 -524
  393. package/src/commands/pr/pr.mjs +0 -261
  394. package/src/commands/report/finalize.mjs +0 -64
  395. package/src/lib/host-registry-client.mjs +0 -176
  396. package/src/lib/paths.mjs +0 -86
  397. package/src/lib/proc.mjs +0 -31
  398. package/src/lib/python-helper.mjs +0 -142
  399. package/src/lib/runtime-manifest.mjs +0 -70
  400. package/src/lib/skill-catalog.mjs +0 -53
  401. package/src/lib/version.mjs +0 -20
  402. /package/{src → dist}/commands/pr/default.md +0 -0
@@ -0,0 +1,128 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://okstra.dev/schemas/convergence-groups-v2.0.json",
4
+ "title": "OKSTRA Convergence Grouped Input (v2.0)",
5
+ "type": "object",
6
+ "required": [
7
+ "schemaVersion",
8
+ "executionIdentityVersion",
9
+ "taskKey",
10
+ "runManifestPath",
11
+ "config",
12
+ "workers",
13
+ "groups"
14
+ ],
15
+ "additionalProperties": false,
16
+ "properties": {
17
+ "schemaVersion": { "const": "2.0" },
18
+ "executionIdentityVersion": { "const": 2 },
19
+ "taskKey": { "type": "string", "pattern": "\\S" },
20
+ "runManifestPath": {
21
+ "type": "string",
22
+ "pattern": "^\\.okstra/(?!\\.{1,2}(?:/|$))(?!.*?/\\.{1,2}(?:/|$))[^/\\\\\\r\\n]+(?:/[^/\\\\\\r\\n]+)*$"
23
+ },
24
+ "config": { "$ref": "#/$defs/Config" },
25
+ "workers": {
26
+ "type": "array",
27
+ "minItems": 1,
28
+ "items": { "$ref": "#/$defs/Worker" }
29
+ },
30
+ "groups": {
31
+ "type": "array",
32
+ "items": { "$ref": "#/$defs/Group" }
33
+ }
34
+ },
35
+ "$defs": {
36
+ "Config": {
37
+ "type": "object",
38
+ "required": ["enabled", "adversarial", "maxRounds", "effectiveMaxRounds", "verificationMode"],
39
+ "additionalProperties": false,
40
+ "properties": {
41
+ "enabled": { "type": "boolean" },
42
+ "adversarial": { "type": "boolean" },
43
+ "maxRounds": { "type": "integer", "minimum": 1, "maximum": 3 },
44
+ "effectiveMaxRounds": { "type": "integer", "minimum": 1, "maximum": 3 },
45
+ "verificationMode": { "enum": ["lightweight", "full-reanalysis"] }
46
+ }
47
+ },
48
+ "Worker": {
49
+ "type": "object",
50
+ "required": [
51
+ "workerId",
52
+ "audience",
53
+ "participantRef",
54
+ "sourceRoleExecutionRef"
55
+ ],
56
+ "additionalProperties": false,
57
+ "properties": {
58
+ "workerId": { "type": "string", "pattern": "\\S" },
59
+ "audience": { "enum": ["analysis", "report-writer"] },
60
+ "participantRef": { "type": "string", "pattern": "\\S" },
61
+ "sourceRoleExecutionRef": { "type": "string", "pattern": "\\S" }
62
+ }
63
+ },
64
+ "Group": {
65
+ "type": "object",
66
+ "required": ["findingId", "summary", "category", "ticketIds", "originWorker", "originEvidence", "discoveredBy", "sourceItems"],
67
+ "additionalProperties": false,
68
+ "properties": {
69
+ "findingId": { "type": "string", "pattern": "\\S" },
70
+ "summary": { "type": "string", "pattern": "\\S" },
71
+ "category": { "type": "string", "pattern": "\\S" },
72
+ "ticketIds": {
73
+ "type": "array",
74
+ "items": { "type": "string", "pattern": "\\S" }
75
+ },
76
+ "originWorker": { "type": "string", "pattern": "\\S" },
77
+ "originEvidence": { "type": "string", "pattern": "\\S" },
78
+ "evidenceArtifacts": {
79
+ "type": "array",
80
+ "minItems": 1,
81
+ "items": { "$ref": "#/$defs/EvidenceArtifact" }
82
+ },
83
+ "discoveredBy": {
84
+ "type": "object",
85
+ "minProperties": 1,
86
+ "additionalProperties": { "$ref": "#/$defs/Discovery" }
87
+ },
88
+ "sourceItems": {
89
+ "type": "array",
90
+ "minItems": 1,
91
+ "items": { "$ref": "#/$defs/SourceItem" }
92
+ }
93
+ }
94
+ },
95
+ "EvidenceArtifact": {
96
+ "type": "object",
97
+ "required": ["path", "sha256", "command", "environment"],
98
+ "additionalProperties": false,
99
+ "properties": {
100
+ "path": {
101
+ "type": "string",
102
+ "pattern": "^\\.okstra/(?!\\.{1,2}(?:/|$))(?!.*?/\\.{1,2}(?:/|$))[^/\\\\\\r\\n]+(?:/[^/\\\\\\r\\n]+)*$"
103
+ },
104
+ "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
105
+ "command": { "type": "string", "pattern": "\\S" },
106
+ "environment": { "type": "string", "pattern": "\\S" }
107
+ }
108
+ },
109
+ "Discovery": {
110
+ "type": "object",
111
+ "required": ["itemId", "evidence"],
112
+ "additionalProperties": false,
113
+ "properties": {
114
+ "itemId": { "type": "string", "pattern": "\\S" },
115
+ "evidence": { "type": "string", "pattern": "\\S" }
116
+ }
117
+ },
118
+ "SourceItem": {
119
+ "type": "object",
120
+ "required": ["worker", "itemId"],
121
+ "additionalProperties": false,
122
+ "properties": {
123
+ "worker": { "type": "string", "pattern": "\\S" },
124
+ "itemId": { "type": "string", "pattern": "\\S" }
125
+ }
126
+ }
127
+ }
128
+ }
@@ -0,0 +1,340 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://okstra.dev/schemas/execution-manifest-v2.json",
4
+ "title": "OKSTRA Execution Manifest (v2)",
5
+ "type": "object",
6
+ "required": [
7
+ "schemaVersion",
8
+ "executionIdentityVersion",
9
+ "entryMode",
10
+ "participantAssignments",
11
+ "roleExecutions",
12
+ "invocations",
13
+ "attempts",
14
+ "attemptEvidenceSeals",
15
+ "mutationRecoveryDecisions"
16
+ ],
17
+ "properties": {
18
+ "schemaVersion": {"const": "2.0"},
19
+ "executionIdentityVersion": {"const": 2},
20
+ "entryMode": {"enum": ["current-session", "new-session"]},
21
+ "participantAssignments": {
22
+ "type": "array",
23
+ "items": {"$ref": "#/$defs/ParticipantAssignment"}
24
+ },
25
+ "roleExecutions": {
26
+ "type": "array",
27
+ "items": {"$ref": "#/$defs/RoleExecution"}
28
+ },
29
+ "invocations": {
30
+ "type": "array",
31
+ "items": {"$ref": "#/$defs/Invocation"}
32
+ },
33
+ "attempts": {
34
+ "type": "array",
35
+ "items": {"$ref": "#/$defs/Attempt"}
36
+ },
37
+ "attemptEvidenceSeals": {
38
+ "type": "array",
39
+ "items": {"$ref": "#/$defs/AttemptEvidenceSeal"}
40
+ },
41
+ "mutationRecoveryDecisions": {
42
+ "type": "array",
43
+ "items": {"$ref": "#/$defs/MutationRecoveryDecision"}
44
+ }
45
+ },
46
+ "additionalProperties": true,
47
+ "$defs": {
48
+ "Digest": {
49
+ "type": "string",
50
+ "pattern": "^sha256:[0-9a-f]{64}$"
51
+ },
52
+ "NullableDigest": {
53
+ "type": ["string", "null"],
54
+ "pattern": "^sha256:[0-9a-f]{64}$"
55
+ },
56
+ "WorkerWriteCapability": {
57
+ "type": ["object", "null"],
58
+ "required": ["maxBoundaryPrecision"],
59
+ "properties": {
60
+ "maxBoundaryPrecision": {
61
+ "enum": ["exact-path", "directory-boundary", "none"]
62
+ }
63
+ },
64
+ "additionalProperties": false
65
+ },
66
+ "ParticipantAssignment": {
67
+ "type": "object",
68
+ "required": [
69
+ "participantRef",
70
+ "provider",
71
+ "modelRef",
72
+ "modelId",
73
+ "runner",
74
+ "hostRuntime",
75
+ "hostModelValue",
76
+ "sessionRef",
77
+ "windowRef",
78
+ "workerWriteCapability",
79
+ "entryMode",
80
+ "status"
81
+ ],
82
+ "properties": {
83
+ "participantRef": {"type": "string", "pattern": "\\S"},
84
+ "provider": {"type": "string", "pattern": "\\S"},
85
+ "modelRef": {"type": ["string", "null"]},
86
+ "modelId": {"type": "string", "pattern": "\\S"},
87
+ "runner": {"type": "string", "pattern": "\\S"},
88
+ "hostRuntime": {"type": "string", "pattern": "\\S"},
89
+ "hostModelValue": {"type": ["string", "null"]},
90
+ "sessionRef": {"type": ["string", "null"]},
91
+ "windowRef": {"type": ["string", "null"]},
92
+ "workerWriteCapability": {"$ref": "#/$defs/WorkerWriteCapability"},
93
+ "entryMode": {"enum": ["current-session", "new-session"]},
94
+ "status": {"type": "string", "pattern": "\\S"}
95
+ },
96
+ "additionalProperties": false
97
+ },
98
+ "HostModelBinding": {
99
+ "type": ["object", "null"],
100
+ "required": [
101
+ "runner",
102
+ "catalogExecutionValue",
103
+ "resolvedExecutionValue",
104
+ "hostModelValue",
105
+ "bindingFidelity",
106
+ "workerWriteCapability"
107
+ ],
108
+ "properties": {
109
+ "runner": {"type": "string", "pattern": "\\S"},
110
+ "catalogExecutionValue": {"type": "string"},
111
+ "resolvedExecutionValue": {"type": "string"},
112
+ "hostModelValue": {"type": ["string", "null"]},
113
+ "bindingFidelity": {"enum": ["exact", "channel", "unsupported"]},
114
+ "workerWriteCapability": {"$ref": "#/$defs/WorkerWriteCapability"}
115
+ },
116
+ "additionalProperties": false
117
+ },
118
+ "ServedModelAttestation": {
119
+ "type": "object",
120
+ "required": ["observedModel", "normalizedModelRef", "level", "source"],
121
+ "properties": {
122
+ "observedModel": {"type": ["string", "null"]},
123
+ "normalizedModelRef": {"type": ["string", "null"]},
124
+ "level": {"enum": ["exact", "channel", "unknown"]},
125
+ "source": {
126
+ "enum": ["provider-output", "native-api", "cli-handoff", "unavailable"]
127
+ }
128
+ },
129
+ "additionalProperties": false
130
+ },
131
+ "WritePolicy": {
132
+ "type": "object",
133
+ "required": ["artifactPolicy", "sourcePolicy", "gitPolicy", "auxiliaryPolicy"],
134
+ "properties": {
135
+ "artifactPolicy": {
136
+ "type": "object",
137
+ "required": ["allowedRoot", "allowedPaths"],
138
+ "properties": {
139
+ "allowedRoot": {"type": "string", "pattern": "^/"},
140
+ "allowedPaths": {"type": "array", "items": {"type": "string", "pattern": "\\S"}, "minItems": 1, "uniqueItems": true}
141
+ },
142
+ "additionalProperties": false
143
+ },
144
+ "sourcePolicy": {
145
+ "type": "object",
146
+ "required": ["mode", "allowedRoot", "plannedPaths", "protectedPaths"],
147
+ "properties": {
148
+ "mode": {"enum": ["source-readonly", "project-mutation"]},
149
+ "allowedRoot": {"type": "string", "pattern": "^/"},
150
+ "plannedPaths": {"type": "array", "items": {"type": "string", "pattern": "\\S"}, "uniqueItems": true},
151
+ "protectedPaths": {"type": "array", "items": {"type": "string", "pattern": "\\S"}, "uniqueItems": true}
152
+ },
153
+ "additionalProperties": false
154
+ },
155
+ "gitPolicy": {
156
+ "type": "object",
157
+ "required": ["mode"],
158
+ "properties": {
159
+ "mode": {"enum": ["disabled", "fast-forward-descendant-chain"]},
160
+ "worktreeGitDir": {"type": "string", "pattern": "^/"},
161
+ "gitCommonDir": {"type": "string", "pattern": "^/"},
162
+ "expectedBaseCommit": {"type": "string", "pattern": "\\S"},
163
+ "allowedBranchRef": {"type": "string", "pattern": "^refs/heads/"},
164
+ "commitMode": {"const": "fast-forward-descendant-chain"}
165
+ },
166
+ "additionalProperties": false
167
+ },
168
+ "auxiliaryPolicy": {
169
+ "type": "object",
170
+ "required": ["scratchRoots", "generatedPaths", "externalRoots"],
171
+ "properties": {
172
+ "scratchRoots": {"type": "array", "items": {"type": "string", "pattern": "^/"}, "uniqueItems": true},
173
+ "generatedPaths": {"type": "array", "items": {"type": "string", "pattern": "\\S"}, "uniqueItems": true},
174
+ "externalRoots": {"type": "array", "items": {"type": "string", "pattern": "^/"}, "uniqueItems": true}
175
+ },
176
+ "additionalProperties": false
177
+ }
178
+ },
179
+ "additionalProperties": false
180
+ },
181
+ "WriteEnforcement": {
182
+ "type": "object",
183
+ "required": ["boundaryPrecision", "mutationAudit", "attribution", "auditedRoots", "observationCoverage", "unobservedWriteSurfaces"],
184
+ "properties": {
185
+ "boundaryPrecision": {"enum": ["exact-path", "directory-boundary", "none"]},
186
+ "mutationAudit": {"enum": ["none", "batch"]},
187
+ "attribution": {"enum": ["call", "batch-unattributed"]},
188
+ "auditedRoots": {"type": "array", "items": {"type": "string", "pattern": "^/"}, "minItems": 1, "uniqueItems": true},
189
+ "observationCoverage": {"enum": ["complete", "scoped", "partial"]},
190
+ "unobservedWriteSurfaces": {"type": "array", "items": {"type": "string", "pattern": "\\S"}, "uniqueItems": true}
191
+ },
192
+ "additionalProperties": false
193
+ },
194
+ "RoleExecution": {
195
+ "type": "object",
196
+ "required": [
197
+ "roleExecutionRef",
198
+ "participantRef",
199
+ "sourceRoleExecutionRef",
200
+ "role",
201
+ "provider",
202
+ "modelRef",
203
+ "modelId",
204
+ "ordinal",
205
+ "executionLabel",
206
+ "modelSpecDigest",
207
+ "binding",
208
+ "servedModelAttestation",
209
+ "status"
210
+ ],
211
+ "properties": {
212
+ "roleExecutionRef": {"type": "string", "pattern": "\\S"},
213
+ "participantRef": {"type": "string", "pattern": "\\S"},
214
+ "sourceRoleExecutionRef": {"type": ["string", "null"]},
215
+ "role": {"type": "string", "pattern": "\\S"},
216
+ "provider": {"type": "string", "pattern": "\\S"},
217
+ "modelRef": {"type": ["string", "null"]},
218
+ "modelId": {"type": "string", "pattern": "\\S"},
219
+ "ordinal": {"type": "integer", "minimum": 1},
220
+ "executionLabel": {"type": "string", "pattern": "\\S"},
221
+ "modelSpecDigest": {"$ref": "#/$defs/NullableDigest"},
222
+ "binding": {"$ref": "#/$defs/HostModelBinding"},
223
+ "servedModelAttestation": {"$ref": "#/$defs/ServedModelAttestation"},
224
+ "status": {"type": "string", "pattern": "\\S"}
225
+ },
226
+ "additionalProperties": false
227
+ },
228
+ "Invocation": {
229
+ "type": "object",
230
+ "required": [
231
+ "invocationRef",
232
+ "participantRef",
233
+ "roleExecutionRef",
234
+ "sourceInvocationRef",
235
+ "recoveryRef",
236
+ "dutyId",
237
+ "dispatchKind",
238
+ "round",
239
+ "inputDigest",
240
+ "writePolicy",
241
+ "writePolicyDigest",
242
+ "writeEnforcement"
243
+ ],
244
+ "properties": {
245
+ "invocationRef": {"type": "string", "pattern": "\\S"},
246
+ "participantRef": {"type": "string", "pattern": "\\S"},
247
+ "roleExecutionRef": {"type": "string", "pattern": "\\S"},
248
+ "sourceInvocationRef": {"type": ["string", "null"]},
249
+ "recoveryRef": {"type": ["string", "null"]},
250
+ "dutyId": {"type": "string", "pattern": "\\S"},
251
+ "dispatchKind": {"type": "string", "pattern": "\\S"},
252
+ "round": {"type": "integer", "minimum": 1},
253
+ "inputDigest": {"$ref": "#/$defs/Digest"},
254
+ "writePolicy": {"$ref": "#/$defs/WritePolicy"},
255
+ "writePolicyDigest": {"$ref": "#/$defs/Digest"},
256
+ "writeEnforcement": {"$ref": "#/$defs/WriteEnforcement"}
257
+ },
258
+ "additionalProperties": false
259
+ },
260
+ "Attempt": {
261
+ "type": "object",
262
+ "required": [
263
+ "invocationRef",
264
+ "attempt",
265
+ "startedAt",
266
+ "finishedAt",
267
+ "status",
268
+ "resultPath",
269
+ "errorPath",
270
+ "changeSummary",
271
+ "evidenceSealRef"
272
+ ],
273
+ "properties": {
274
+ "invocationRef": {"type": "string", "pattern": "\\S"},
275
+ "attempt": {"type": "integer", "minimum": 1},
276
+ "startedAt": {"type": "string", "pattern": "\\S"},
277
+ "finishedAt": {"type": ["string", "null"]},
278
+ "status": {"type": "string", "pattern": "\\S"},
279
+ "resultPath": {"type": ["string", "null"]},
280
+ "errorPath": {"type": ["string", "null"]},
281
+ "changeSummary": {"type": "object"},
282
+ "evidenceSealRef": {"type": ["string", "null"]}
283
+ },
284
+ "additionalProperties": false
285
+ },
286
+ "AttemptEvidenceSeal": {
287
+ "type": "object",
288
+ "required": [
289
+ "sealRef",
290
+ "attemptRef",
291
+ "capturedAt",
292
+ "sourceDiffDigest",
293
+ "gitProjectionDigest",
294
+ "changedPaths",
295
+ "hostEventStream",
296
+ "artifacts"
297
+ ],
298
+ "properties": {
299
+ "sealRef": {"type": "string", "pattern": "\\S"},
300
+ "attemptRef": {"type": "string", "pattern": "\\S"},
301
+ "capturedAt": {"type": "string", "pattern": "\\S"},
302
+ "sourceDiffDigest": {"$ref": "#/$defs/Digest"},
303
+ "gitProjectionDigest": {"$ref": "#/$defs/Digest"},
304
+ "changedPaths": {"type": "array", "items": {"type": "string"}},
305
+ "hostEventStream": {"type": "object"},
306
+ "hostEventStreamRef": {"type": ["string", "null"]},
307
+ "artifacts": {"type": "array", "items": {"type": "object"}}
308
+ },
309
+ "additionalProperties": true
310
+ },
311
+ "MutationRecoveryDecision": {
312
+ "type": "object",
313
+ "required": [
314
+ "recoveryRef",
315
+ "sourceInvocationRef",
316
+ "sourceAttemptRef",
317
+ "decision"
318
+ ],
319
+ "properties": {
320
+ "recoveryRef": {"type": "string", "pattern": "\\S"},
321
+ "sourceInvocationRef": {"type": "string"},
322
+ "sourceAttemptRef": {"type": "string"},
323
+ "sourceEvidenceSealRef": {"type": ["string", "null"]},
324
+ "originalBaselineDigest": {"type": "string"},
325
+ "terminalSourceDiffDigest": {"type": "string"},
326
+ "terminalGitChainDigest": {"type": "string"},
327
+ "verifierRoleExecutionRef": {"type": ["string", "null"]},
328
+ "verifierInvocationRef": {"type": ["string", "null"]},
329
+ "recoveredEvidenceRefs": {"type": "array"},
330
+ "recoveredOutOfPlanEdits": {"type": "array"},
331
+ "unmetObligations": {"type": "array", "items": {"type": "string"}},
332
+ "decision": {
333
+ "enum": ["carry-forward", "reject", "cleanup-confirmed"]
334
+ },
335
+ "reason": {"type": "string"}
336
+ },
337
+ "additionalProperties": true
338
+ }
339
+ }
340
+ }
@@ -29,6 +29,31 @@
29
29
  "const": "2.0",
30
30
  "description": "Schema version. Renderer refuses to process unknown versions."
31
31
  },
32
+ "executionIdentityVersion": {
33
+ "type": "integer",
34
+ "enum": [1, 2]
35
+ },
36
+ "executionRoles": {
37
+ "type": "array",
38
+ "items": {
39
+ "type": "object",
40
+ "required": [
41
+ "roleExecutionRef",
42
+ "role",
43
+ "executionLabel"
44
+ ],
45
+ "properties": {
46
+ "roleExecutionRef": {"type": "string"},
47
+ "role": {"type": "string"},
48
+ "provider": {"type": "string"},
49
+ "modelRef": {"type": ["string", "null"]},
50
+ "ordinal": {"type": "integer"},
51
+ "executionLabel": {"type": "string"},
52
+ "status": {"type": "string"}
53
+ },
54
+ "additionalProperties": true
55
+ }
56
+ },
32
57
  "humanSummary": {
33
58
  "$ref": "#/$defs/HumanSummary"
34
59
  },
@@ -220,9 +220,9 @@ When `next.kind == "done"`, fetch the public wizard outcome:
220
220
  okstra wizard outcome --state-file /var/folders/.../okstra-wizard.AbCd.json
221
221
  ```
222
222
 
223
- Output: `{ok: true, outcome: {renderArgs: {...}, orchestration: {chainStages: "..."}, persistActions: [...], confirmationText: "..."}}`.
223
+ Output: `{ok: true, outcome: {renderArgv: ["--lead-runtime", "...", ...], renderArgs: {...}, orchestration: {chainStages: "..."}, persistActions: [...], confirmationText: "..."}}`.
224
224
 
225
- `renderArgs` holds only flags `okstra render-bundle` accepts, which is what makes the pass-everything rule below safe. `orchestration` holds signals this skill acts on itself — never pass its entries to `render-bundle`.
225
+ `renderArgv` is the canonical ordered `okstra render-bundle` argument list. Pass its tokens verbatim and in order. Repeated `--role-count` and `--role-model` flags are intentional. `renderArgs` is a compatibility and inspection view only; do not reconstruct an invocation from it. `orchestration` holds signals this skill acts on itself — never pass its entries to `render-bundle`.
226
226
 
227
227
  Run every `outcome.persistActions[]` entry BEFORE `render-bundle`. The only supported action is:
228
228
 
@@ -243,19 +243,19 @@ Before rendering the next phase's bundle — and between worker rounds within a
243
243
 
244
244
  Before you ask the user for any approval, clarification, or decision after workers have been dispatched, run the same reclaim first: `$HOME/.okstra/bin/okstra-trace-cleanup.sh --list --run-dir "<RUN_DIR>" [--keep report-writer-worker]` to count the panes, then the same command without `--list` to close them, emit `PROGRESS: phase-gate-cleanup panes=<n>`, and `TaskStop` each completed worker. A `TaskStop` by itself idles the task but leaves the pane open — the `trace-cleanup` call is what actually closes it. This keeps a user gate from being shown while finished worker panes remain; in-flight workers and an in-flight report writer are preserved.
245
245
 
246
- Build the `okstra render-bundle` invocation from `outcome.renderArgs`, passing each key as `--<key>` and the value verbatim (including empty strings — they are intentional `use phase default` markers).
246
+ Build the `okstra render-bundle` invocation from `outcome.renderArgv`, passing every token verbatim and in order (including empty strings — they are intentional `use phase default` markers).
247
247
 
248
- Analysis sidetracks therefore forward wizard-owned entries such as `--analysis-target "<args.analysis-target>"` and `--evidence-inputs "<args.evidence-inputs>"` when those keys are present. These are examples of the generic mapping rule, not a separate hard-coded argument list.
248
+ Analysis sidetracks therefore forward wizard-owned tokens such as `--analysis-target "<value>"` and `--evidence-inputs "<value>"` when they are present. These are examples of the verbatim token rule, not a separate hard-coded argument list.
249
249
 
250
- Step 3's empty-answer and escaping rules apply verbatim: every flag whose value is the empty string MUST still be passed explicitly as `--<key> ""` (e.g. `--workers ""`, `--directive ""`) — `render-bundle` distinguishes "flag absent" from "flag present with empty value", and the wizard's intent is always the latter.
250
+ Step 3's empty-answer and escaping rules apply verbatim: every flag in `renderArgv` whose following value is the empty string MUST still be passed explicitly (e.g. `--workers ""`, `--directive ""`) — `render-bundle` distinguishes "flag absent" from "flag present with empty value", and the wizard's intent is always the latter.
251
251
 
252
- Add `--lead-runtime <host-runtime>` from Step 1. Pass every `outcome.renderArgs` entry exactly once; do not enumerate a fixed provider list in this skill because the wizard and provider registry own those keys. If `renderArgs` ever contains `lead-runtime`, replace it with the Step 1 host value rather than emitting the flag twice.
252
+ `renderArgv` already contains exactly one `--lead-runtime <host-runtime>` pair. Do not add or replace it. Do not enumerate a fixed provider list in this skill because the wizard and role model pool own the ordered tokens.
253
253
 
254
254
  ```bash
255
255
  okstra render-bundle \
256
- --lead-runtime <host-runtime> \
257
- --<first-renderArgs-key> "<first-renderArgs-value>" \
258
- --<each-remaining-renderArgs-key> "<corresponding-value>"
256
+ <outcome.renderArgv token 1> \
257
+ <outcome.renderArgv token 2> \
258
+ <each remaining outcome.renderArgv token in order>
259
259
  ```
260
260
 
261
261
  `render-bundle` auto-supplies `--workspace-root` and forces `--render-only`. Stdout prints `okstra task root:`, `okstra instruction-set:`, `okstra run manifest:`, and the full rendered lead prompt. Parse the labelled lines for `TASK_ROOT`, `INSTRUCTION_SET_PATH`, and `RUN_MANIFEST_PATH`. Also watch for an optional `okstra concurrent-run stages:` label line — present only when a concurrent run is detected (see "Concurrent-run detection branch" below).
@@ -16,6 +16,17 @@ shared state. The built-in default is `.project-docs`, `.scratch`,
16
16
  okstra-owned context and writes still stay under `<PROJECT_ROOT>/.okstra/**`
17
17
  unless the task brief explicitly authorizes a non-okstra path.
18
18
 
19
+ `.claude` is the one entry materialised as a real directory whose children are
20
+ symlinked one by one, instead of a single symlink for the whole directory. git
21
+ does not follow a symlink, so a symlinked directory is one file to it, and a
22
+ project that ignores host config by its contents (`.claude/*`) matches every
23
+ child but never the bare `.claude` path — the directory would be invisible in
24
+ the main checkout and `?? .claude` in the task worktree. Linking the children
25
+ reproduces the main checkout's shape, so the project's own ignore rules decide
26
+ the outcome in both places. The other entries stay whole-directory symlinks
27
+ because okstra writes into them, and the directory symlink is what makes a
28
+ newly created top-level entry land in the main checkout.
29
+
19
30
  To override per-project, add a `worktreeSyncDirs` array to `project.json`.
20
31
  Empty array disables the feature; the field is preserved across the runtime's
21
32
  auto-upserts (only `projectId`, `projectRoot`, `createdAt`, `updatedAt` are
@@ -22,6 +22,8 @@ Write `- PROGRESS: <stage> <ISO-8601-UTC>` there before reading and at least eve
22
22
 
23
23
  The generated prompt selects this file through `**Worker Preamble Path:**` and includes `**Worker Error Contract Path:**`, `**Audit sidecar path:**`, error paths, and read scope. It never includes `**Coding preflight pack:**`.
24
24
 
25
+ The adjacent v2 prompt metadata supplies `participantRef`, `roleExecutionRef`, `executionLabel`, `invocationRef`, and `attempt`. Copy those values into report and audit identity fields without deriving them from the provider or model. Legacy v1 `workerId` is a read-only compatibility projection and is not written into v2 artifacts.
26
+
25
27
  ## Return message to the lead
26
28
 
27
29
  Begin the inline return with the exact `**Model:** Report writer worker, <modelExecutionValue>` line from the prompt, followed by the artifact status. Never invent or abbreviate the model.
@@ -25,7 +25,7 @@ schema-version: {{ schemaVersion | yaml_scalar }}
25
25
  is a non-authoritative index of `finalVerdict`, which §Final Verdict already
26
26
  carries in full.
27
27
  -#}
28
- {{ md_claim("schemaVersion", "meta", "frontmatter", "header", "humanSummary", "verdictCard") }}
28
+ {{ md_claim("schemaVersion", "meta", "frontmatter", "header", "humanSummary", "verdictCard", "executionRoles", "executionIdentityVersion") }}
29
29
 
30
30
  # {{ frontmatter.title }}
31
31
 
@@ -44,6 +44,12 @@ schema-version: {{ schemaVersion | yaml_scalar }}
44
44
  - Rationale IDs: {{ finalVerdict.rationaleRowIds | join(", ") }}
45
45
  - Blocking IDs: {{ aiBlockingIds | join(", ") if aiBlockingIds else "none" }}
46
46
  - Next step: {{ finalVerdict.nextStep }}
47
+ {% if executionIdentityVersion == 2 %}
48
+
49
+ ## Execution Roles
50
+
51
+ {{ executionRolesTable }}
52
+ {% endif %}
47
53
 
48
54
  ## Decision Context
49
55
 
@@ -21,6 +21,27 @@
21
21
  </dl>
22
22
  <p class="lede">{{ humanSummary.headline | inline_code }}</p>
23
23
  <p>{{ humanSummary.outcome | inline_code }}</p>
24
+ {% if executionRoles %}
25
+ <section data-report-section="execution-roles">
26
+ <h2>{{ t('base.execution-roles') }}</h2>
27
+ <table>
28
+ <thead><tr>
29
+ <th scope="col">{{ t('base.role') }}</th>
30
+ <th scope="col">{{ t('base.execution-label') }}</th>
31
+ <th scope="col">{{ t('base.status') }}</th>
32
+ </tr></thead>
33
+ <tbody>
34
+ {% for row in executionRoles %}
35
+ <tr>
36
+ <td>{{ row.role }}</td>
37
+ <td><code>{{ row.executionLabel }}</code></td>
38
+ <td>{{ row.status }}</td>
39
+ </tr>
40
+ {% endfor %}
41
+ </tbody>
42
+ </table>
43
+ </section>
44
+ {% endif %}
24
45
  </header>
25
46
  <main id="main-content" data-report-role="human-main">
26
47
  {% block human_content %}{% endblock %}
@@ -96,6 +96,10 @@
96
96
  "skip-to-report-content": "Skip to report content",
97
97
  "contents": "Contents",
98
98
  "task": "Task",
99
+ "execution-roles": "Execution roles",
100
+ "role": "Role",
101
+ "execution-label": "Execution label",
102
+ "status": "Status",
99
103
  "task-key": "Task key",
100
104
  "written": "Written",
101
105
  "elapsed": "Elapsed",
@@ -96,6 +96,10 @@
96
96
  "skip-to-report-content": "리포트 본문으로 건너뛰기",
97
97
  "contents": "목차",
98
98
  "task": "태스크",
99
+ "execution-roles": "실행 역할",
100
+ "role": "역할",
101
+ "execution-label": "실행 표지",
102
+ "status": "상태",
99
103
  "task-key": "태스크 키",
100
104
  "written": "작성",
101
105
  "elapsed": "소요 시간",