okstra 0.186.7 → 0.187.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 (541) hide show
  1. package/README.md +1 -1
  2. package/dist/cli-registry.d.mts +88 -1
  3. package/dist/cli-registry.mjs +68 -111
  4. package/dist/cli-registry.mjs.map +1 -1
  5. package/dist/commands/execute/render-bundle.mjs +0 -1
  6. package/dist/commands/execute/render-bundle.mjs.map +1 -1
  7. package/dist/commands/execute/run.mjs +8 -3
  8. package/dist/commands/execute/run.mjs.map +1 -1
  9. package/dist/commands/lifecycle/check-project.mjs +1 -14
  10. package/dist/commands/lifecycle/check-project.mjs.map +1 -1
  11. package/dist/commands/lifecycle/config.mjs +38 -40
  12. package/dist/commands/lifecycle/config.mjs.map +1 -1
  13. package/dist/commands/lifecycle/doctor.d.mts +22 -7
  14. package/dist/commands/lifecycle/doctor.mjs +77 -49
  15. package/dist/commands/lifecycle/doctor.mjs.map +1 -1
  16. package/dist/commands/lifecycle/install.d.mts +12 -10
  17. package/dist/commands/lifecycle/install.mjs +104 -39
  18. package/dist/commands/lifecycle/install.mjs.map +1 -1
  19. package/dist/commands/lifecycle/paths.mjs +8 -3
  20. package/dist/commands/lifecycle/paths.mjs.map +1 -1
  21. package/dist/commands/lifecycle/preflight.mjs +2 -1
  22. package/dist/commands/lifecycle/preflight.mjs.map +1 -1
  23. package/dist/commands/lifecycle/setup.mjs +22 -36
  24. package/dist/commands/lifecycle/setup.mjs.map +1 -1
  25. package/dist/commands/lifecycle/uninstall.d.mts +4 -2
  26. package/dist/commands/lifecycle/uninstall.mjs +59 -15
  27. package/dist/commands/lifecycle/uninstall.mjs.map +1 -1
  28. package/dist/commands/memory/memory.mjs +7 -1
  29. package/dist/commands/memory/memory.mjs.map +1 -1
  30. package/dist/lib/helper-scripts.d.mts +1 -1
  31. package/dist/lib/helper-scripts.mjs +10 -18
  32. package/dist/lib/helper-scripts.mjs.map +1 -1
  33. package/dist/lib/host-config.d.mts +72 -0
  34. package/dist/lib/host-config.mjs +404 -0
  35. package/dist/lib/host-config.mjs.map +1 -0
  36. package/dist/lib/host-registry-client.d.mts +2 -2
  37. package/dist/lib/host-registry-client.mjs +0 -3
  38. package/dist/lib/host-registry-client.mjs.map +1 -1
  39. package/dist/lib/install-assets.d.mts +1 -0
  40. package/dist/lib/install-assets.mjs +4 -0
  41. package/dist/lib/install-assets.mjs.map +1 -1
  42. package/dist/lib/proc.d.mts +2 -0
  43. package/dist/lib/proc.mjs +12 -0
  44. package/dist/lib/proc.mjs.map +1 -1
  45. package/dist/lib/python-command.d.mts +2 -0
  46. package/dist/lib/python-command.mjs +52 -0
  47. package/dist/lib/python-command.mjs.map +1 -0
  48. package/dist/lib/python-helper.d.mts +2 -5
  49. package/dist/lib/python-helper.mjs +3 -52
  50. package/dist/lib/python-helper.mjs.map +1 -1
  51. package/dist/lib/runtime-payload.d.mts +23 -0
  52. package/dist/lib/runtime-payload.mjs +57 -0
  53. package/dist/lib/runtime-payload.mjs.map +1 -0
  54. package/dist/lib/types.d.mts +24 -13
  55. package/docs/architecture/storage-model.md +21 -5
  56. package/docs/architecture.md +37 -36
  57. package/docs/cli.md +55 -76
  58. package/docs/coding-rules.md +295 -0
  59. package/docs/container.md +10 -36
  60. package/docs/contributor-change-matrix.md +1 -1
  61. package/docs/for-ai/skills/okstra-code-review.md +0 -1
  62. package/docs/for-ai/skills/okstra-container-build.md +8 -41
  63. package/docs/for-ai/skills/okstra-inspect.md +4 -4
  64. package/docs/for-ai/skills/okstra-manager.md +2 -2
  65. package/docs/for-ai/skills/okstra-rollup.md +0 -1
  66. package/docs/for-ai/skills/okstra-run.md +3 -3
  67. package/docs/for-ai/skills/okstra-user-response.md +0 -1
  68. package/docs/performance-improvement-plan-v2.md +1 -1
  69. package/docs/project-structure-overview.md +62 -62
  70. package/docs/task-process/README.md +3 -3
  71. package/docs/task-process/common-flow.md +1 -1
  72. package/docs/task-process/error-analysis.md +3 -3
  73. package/docs/task-process/implementation-planning.md +3 -1
  74. package/docs/task-process/release-handoff.md +1 -1
  75. package/package.json +3 -2
  76. package/runtime/BUILD.json +2 -2
  77. package/runtime/agents/workers/claude-worker.md +6 -11
  78. package/runtime/agents/workers/report-writer-worker.md +1 -1
  79. package/runtime/bin/lib/okstra/cli.sh +4 -0
  80. package/runtime/bin/lib/okstra/globals.sh +2 -0
  81. package/runtime/bin/lib/okstra/interactive.sh +26 -173
  82. package/runtime/bin/lib/okstra/project-resolver.sh +23 -61
  83. package/runtime/bin/lib/okstra/usage.sh +3 -3
  84. package/runtime/bin/okstra-compact-reminder.sh +1 -5
  85. package/runtime/bin/okstra-error-log.py +19 -2
  86. package/runtime/bin/okstra-import-check.py +26 -0
  87. package/runtime/bin/okstra-inject-report-index.py +5 -4
  88. package/runtime/bin/okstra-provider-exec.py +22 -17
  89. package/runtime/bin/okstra-render-final-report.py +16 -6
  90. package/runtime/bin/okstra-render-report-views.py +25 -18
  91. package/runtime/bin/okstra-report-translate.py +30 -18
  92. package/runtime/bin/okstra-spawn-followups.py +4 -0
  93. package/runtime/bin/okstra-token-usage.py +3 -0
  94. package/runtime/bin/okstra.sh +4 -2
  95. package/runtime/bin/okstra_bootstrap.py +58 -0
  96. package/runtime/prompts/coding-preflight/overview.md +1 -1
  97. package/runtime/prompts/duties/planning-worker.md +1 -1
  98. package/runtime/prompts/launch.template.md +35 -9
  99. package/runtime/prompts/lead/convergence.md +96 -87
  100. package/runtime/prompts/lead/okstra-lead-contract.md +63 -12
  101. package/runtime/prompts/lead/plan-body-verification.md +65 -46
  102. package/runtime/prompts/lead/report-writer.md +34 -4
  103. package/runtime/prompts/lead/team-contract.md +4 -1
  104. package/runtime/prompts/profiles/_clarification-recommendation.md +2 -1
  105. package/runtime/prompts/profiles/_coding-conventions-preflight.md +1 -1
  106. package/runtime/prompts/profiles/_common-contract.md +3 -3
  107. package/runtime/prompts/profiles/_coverage-critic.md +1 -1
  108. package/runtime/prompts/profiles/_implementation-deliverable.md +2 -2
  109. package/runtime/prompts/profiles/_implementation-executor.md +3 -1
  110. package/runtime/prompts/profiles/_implementation-verifier.md +16 -2
  111. package/runtime/prompts/profiles/error-analysis.md +4 -3
  112. package/runtime/prompts/profiles/final-verification.md +2 -2
  113. package/runtime/prompts/profiles/implementation-planning.md +22 -17
  114. package/runtime/prompts/profiles/implementation.md +3 -2
  115. package/runtime/prompts/profiles/requirements-discovery.md +2 -1
  116. package/runtime/prompts/wizard/prompts.ko.json +29 -8
  117. package/runtime/python/okstra_ctl/__init__.py +6 -27
  118. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/relay.md +4 -5
  119. package/runtime/python/okstra_ctl/adapters/hosts/codex/adapter.py +21 -2
  120. package/runtime/python/okstra_ctl/adapters/hosts/external/adapter.py +3 -12
  121. package/runtime/python/okstra_ctl/adapters/providers/antigravity/adapter.py +40 -22
  122. package/runtime/python/okstra_ctl/adapters/providers/claude/adapter.py +14 -21
  123. package/runtime/python/okstra_ctl/adapters/providers/codex/adapter.py +37 -20
  124. package/runtime/python/okstra_ctl/adapters/providers/grok/adapter.py +86 -14
  125. package/runtime/python/okstra_ctl/adapters/providers/kimi/adapter.py +12 -12
  126. package/runtime/python/okstra_ctl/adapters/runtime/cmux.py +4 -7
  127. package/runtime/python/okstra_ctl/agent/__init__.py +1 -0
  128. package/runtime/python/okstra_ctl/{agent_activity.py → agent/activity.py} +12 -1
  129. package/runtime/python/okstra_ctl/{agent_invocation.py → agent/invocation.py} +34 -5
  130. package/runtime/python/okstra_ctl/agent/prompt_cli/__init__.py +19 -0
  131. package/runtime/python/okstra_ctl/agent/prompt_cli/__main__.py +11 -0
  132. package/runtime/python/okstra_ctl/agent/prompt_cli/cli.py +215 -0
  133. package/runtime/python/okstra_ctl/agent/prompt_cli/dynamic_verifier.py +155 -0
  134. package/runtime/python/okstra_ctl/agent/prompt_cli/emit.py +66 -0
  135. package/runtime/python/okstra_ctl/agent/prompt_cli/inputs.py +138 -0
  136. package/runtime/python/okstra_ctl/agent/prompt_cli/materialize.py +408 -0
  137. package/runtime/python/okstra_ctl/agent/prompt_cli/results.py +197 -0
  138. package/runtime/python/okstra_ctl/agent/prompt_cli/run_identity.py +107 -0
  139. package/runtime/python/okstra_ctl/analysis_packet.py +47 -4
  140. package/runtime/python/okstra_ctl/approval_decisions.py +260 -8
  141. package/runtime/python/okstra_ctl/assignment_resolver.py +0 -12
  142. package/runtime/python/okstra_ctl/attempt_evidence.py +12 -24
  143. package/runtime/python/okstra_ctl/blocking_checks.py +251 -0
  144. package/runtime/python/okstra_ctl/brief_frontmatter.py +0 -7
  145. package/runtime/python/okstra_ctl/clarification_items/__init__.py +102 -0
  146. package/runtime/python/okstra_ctl/clarification_items/carry.py +224 -0
  147. package/runtime/python/okstra_ctl/clarification_items/dispositions.py +135 -0
  148. package/runtime/python/okstra_ctl/clarification_items/parsing.py +253 -0
  149. package/runtime/python/okstra_ctl/clarification_items/rows.py +115 -0
  150. package/runtime/python/okstra_ctl/clarification_items/scan.py +215 -0
  151. package/runtime/python/okstra_ctl/clarification_items/sidecars.py +211 -0
  152. package/runtime/python/okstra_ctl/cmux.py +38 -31
  153. package/runtime/python/okstra_ctl/code_review_target.py +163 -1
  154. package/runtime/python/okstra_ctl/conformance.py +23 -0
  155. package/runtime/python/okstra_ctl/container.py +38 -421
  156. package/runtime/python/okstra_ctl/context_cost.py +16 -2
  157. package/runtime/python/okstra_ctl/contract_graph_cli.py +7 -0
  158. package/runtime/python/okstra_ctl/convergence.py +101 -15
  159. package/runtime/python/okstra_ctl/convergence_critic_prompt.py +345 -0
  160. package/runtime/python/okstra_ctl/convergence_engine.py +382 -70
  161. package/runtime/python/okstra_ctl/convergence_store.py +5 -29
  162. package/runtime/python/okstra_ctl/design_prep.py +108 -12
  163. package/runtime/python/okstra_ctl/design_snapshot.py +11 -1
  164. package/runtime/python/okstra_ctl/design_surfaces.py +29 -2
  165. package/runtime/python/okstra_ctl/dispatch_core.py +102 -25
  166. package/runtime/python/okstra_ctl/dispatch_state.py +268 -39
  167. package/runtime/python/okstra_ctl/doctor_cli.py +48 -0
  168. package/runtime/python/okstra_ctl/domain/worker_exec.py +10 -5
  169. package/runtime/python/okstra_ctl/domain/worker_presentation.py +21 -1
  170. package/runtime/python/okstra_ctl/domain/worker_stream.py +52 -21
  171. package/runtime/python/okstra_ctl/domain/write_policy.py +219 -0
  172. package/runtime/python/okstra_ctl/entrypoints/hosts.py +9 -2
  173. package/runtime/python/okstra_ctl/error_log_core.py +1 -1
  174. package/runtime/python/okstra_ctl/error_report.py +14 -0
  175. package/runtime/python/okstra_ctl/error_zip.py +18 -2
  176. package/runtime/python/okstra_ctl/execution_identity.py +100 -7
  177. package/runtime/python/okstra_ctl/execution_manifest.py +67 -20
  178. package/runtime/python/okstra_ctl/execution_mutation_audit.py +90 -8
  179. package/runtime/python/okstra_ctl/final_report_paths.py +17 -0
  180. package/runtime/python/okstra_ctl/final_report_schema.py +90 -16
  181. package/runtime/python/okstra_ctl/git_reconcile.py +22 -2
  182. package/runtime/python/okstra_ctl/handoff.py +24 -1
  183. package/runtime/python/okstra_ctl/ids.py +6 -16
  184. package/runtime/python/okstra_ctl/implementation_direction.py +142 -33
  185. package/runtime/python/okstra_ctl/implementation_options.py +25 -11
  186. package/runtime/python/okstra_ctl/implementation_outcome.py +5 -2
  187. package/runtime/python/okstra_ctl/improvement_lenses.py +0 -14
  188. package/runtime/python/okstra_ctl/incremental_carry.py +69 -8
  189. package/runtime/python/okstra_ctl/incremental_scope.py +173 -12
  190. package/runtime/python/okstra_ctl/index.py +2 -2
  191. package/runtime/python/okstra_ctl/initial_prompt_materialization.py +48 -8
  192. package/runtime/python/okstra_ctl/interactive_cli.py +223 -0
  193. package/runtime/python/okstra_ctl/json_boundary.py +10 -0
  194. package/runtime/python/okstra_ctl/listing.py +0 -91
  195. package/runtime/python/okstra_ctl/locks.py +5 -19
  196. package/runtime/python/okstra_ctl/log_report.py +14 -0
  197. package/runtime/python/okstra_ctl/manager_cli.py +22 -3
  198. package/runtime/python/okstra_ctl/manager_launch.py +4 -8
  199. package/runtime/python/okstra_ctl/material.py +2 -2
  200. package/runtime/python/okstra_ctl/migrate.py +23 -1
  201. package/runtime/python/okstra_ctl/model_cli.py +19 -5
  202. package/runtime/python/okstra_ctl/model_discovery.py +46 -47
  203. package/runtime/python/okstra_ctl/model_io/__init__.py +1 -0
  204. package/runtime/python/okstra_ctl/model_io/lines.py +163 -0
  205. package/runtime/python/okstra_ctl/model_io/references.py +370 -0
  206. package/runtime/python/okstra_ctl/model_io/renderers.py +498 -0
  207. package/runtime/python/okstra_ctl/model_io_cli.py +30 -945
  208. package/runtime/python/okstra_ctl/model_pool.py +10 -6
  209. package/runtime/python/okstra_ctl/models.py +8 -8
  210. package/runtime/python/okstra_ctl/mutation_recovery.py +5 -63
  211. package/runtime/python/okstra_ctl/next_phase.py +121 -69
  212. package/runtime/python/okstra_ctl/pane_reclaim.py +23 -0
  213. package/runtime/python/okstra_ctl/pane_title.py +11 -8
  214. package/runtime/python/okstra_ctl/path_hints.py +36 -11
  215. package/runtime/python/okstra_ctl/paths.py +76 -8
  216. package/runtime/python/okstra_ctl/plan_items.py +132 -16
  217. package/runtime/python/okstra_ctl/plan_items_cli.py +486 -36
  218. package/runtime/python/okstra_ctl/plan_run_root.py +1 -1
  219. package/runtime/python/okstra_ctl/plan_validate_cli.py +51 -0
  220. package/runtime/python/okstra_ctl/plan_verify_cli.py +80 -0
  221. package/runtime/python/okstra_ctl/prepare_error.py +20 -0
  222. package/runtime/python/okstra_ctl/prior_planning.py +157 -0
  223. package/runtime/python/okstra_ctl/profile_show.py +18 -1
  224. package/runtime/python/okstra_ctl/project_setup_cli.py +140 -0
  225. package/runtime/python/okstra_ctl/recap.py +22 -1
  226. package/runtime/python/okstra_ctl/reconcile.py +84 -0
  227. package/runtime/python/okstra_ctl/registry/host_registry.py +18 -1
  228. package/runtime/python/okstra_ctl/render.py +98 -32
  229. package/runtime/python/okstra_ctl/render_final_report.py +3 -7
  230. package/runtime/python/okstra_ctl/report_assembly.py +297 -7
  231. package/runtime/python/okstra_ctl/report_contract.py +30 -7
  232. package/runtime/python/okstra_ctl/report_finalize.py +206 -15
  233. package/runtime/python/okstra_ctl/report_html/common.py +2 -2
  234. package/runtime/python/okstra_ctl/report_html/render.py +8 -12
  235. package/runtime/python/okstra_ctl/report_language.py +8 -4
  236. package/runtime/python/okstra_ctl/report_narrative.py +90 -3
  237. package/runtime/python/okstra_ctl/report_projections.py +8 -2
  238. package/runtime/python/okstra_ctl/report_synthesis_packet.py +258 -1
  239. package/runtime/python/okstra_ctl/report_translation.py +2 -35
  240. package/runtime/python/okstra_ctl/report_views.py +4 -22
  241. package/runtime/python/okstra_ctl/resolve_task_key.py +13 -0
  242. package/runtime/python/okstra_ctl/rollup.py +13 -0
  243. package/runtime/python/okstra_ctl/run.py +639 -138
  244. package/runtime/python/okstra_ctl/run_audit.py +13 -0
  245. package/runtime/python/okstra_ctl/run_index_row.py +0 -12
  246. package/runtime/python/okstra_ctl/seeding.py +21 -11
  247. package/runtime/python/okstra_ctl/sequence.py +1 -1
  248. package/runtime/python/okstra_ctl/session.py +64 -14
  249. package/runtime/python/okstra_ctl/set_work_status.py +18 -0
  250. package/runtime/python/okstra_ctl/stage_integrate.py +15 -1
  251. package/runtime/python/okstra_ctl/stage_ledger.py +1 -1
  252. package/runtime/python/okstra_ctl/stage_map.py +57 -11
  253. package/runtime/python/okstra_ctl/stage_map_cli.py +83 -0
  254. package/runtime/python/okstra_ctl/stage_map_view.py +65 -0
  255. package/runtime/python/okstra_ctl/stage_targets.py +3 -12
  256. package/runtime/python/okstra_ctl/task_list_cli.py +138 -0
  257. package/runtime/python/okstra_ctl/task_show_cli.py +66 -0
  258. package/runtime/python/okstra_ctl/task_target.py +4 -16
  259. package/runtime/python/okstra_ctl/team.py +49 -2
  260. package/runtime/python/okstra_ctl/time_report.py +17 -2
  261. package/runtime/python/okstra_ctl/usage_report.py +11 -0
  262. package/runtime/python/okstra_ctl/user_response.py +55 -218
  263. package/runtime/python/okstra_ctl/user_response_values.py +242 -0
  264. package/runtime/python/okstra_ctl/validation_contract.py +3 -0
  265. package/runtime/python/okstra_ctl/verification_target.py +68 -0
  266. package/runtime/python/okstra_ctl/wizard.py +457 -92
  267. package/runtime/python/okstra_ctl/worker_artifacts.py +75 -16
  268. package/runtime/python/okstra_ctl/worker_audit_check.py +22 -0
  269. package/runtime/python/okstra_ctl/worker_dispatch.py +21 -0
  270. package/runtime/python/okstra_ctl/worker_liveness.py +33 -0
  271. package/runtime/python/okstra_ctl/worker_prompt_body.py +15 -2
  272. package/runtime/python/okstra_ctl/worker_prompt_contract.py +98 -7
  273. package/runtime/python/okstra_ctl/worker_prompt_headers.py +24 -2
  274. package/runtime/python/okstra_ctl/worker_prompt_policy.py +18 -3
  275. package/runtime/python/okstra_ctl/worker_request.py +2 -1
  276. package/runtime/python/okstra_ctl/worker_runner.py +16 -9
  277. package/runtime/python/okstra_ctl/worker_state.py +16 -1
  278. package/runtime/python/okstra_ctl/workflow.py +18 -1
  279. package/runtime/python/okstra_ctl/worktree/__init__.py +92 -0
  280. package/runtime/python/okstra_ctl/worktree/cleanliness.py +89 -0
  281. package/runtime/python/okstra_ctl/worktree/decisions.py +127 -0
  282. package/runtime/python/okstra_ctl/worktree/git_ops.py +165 -0
  283. package/runtime/python/okstra_ctl/worktree/linking.py +249 -0
  284. package/runtime/python/okstra_ctl/worktree/naming.py +91 -0
  285. package/runtime/python/okstra_ctl/worktree/provision.py +385 -0
  286. package/runtime/python/okstra_ctl/worktree/sync_config.py +181 -0
  287. package/runtime/python/okstra_ctl/worktree_cli.py +75 -0
  288. package/runtime/python/okstra_ctl/worktree_lookup_cli.py +39 -0
  289. package/runtime/python/okstra_ctl/worktree_registry.py +7 -0
  290. package/runtime/python/okstra_ctl/worktree_status_cli.py +53 -0
  291. package/runtime/python/okstra_ctl/write_policy.py +90 -213
  292. package/runtime/python/okstra_project/__init__.py +0 -4
  293. package/runtime/python/okstra_project/dirs.py +2 -2
  294. package/runtime/python/okstra_project/phase_pointer.py +84 -0
  295. package/runtime/python/okstra_project/slug.py +24 -0
  296. package/runtime/python/okstra_project/state.py +22 -230
  297. package/runtime/python/okstra_token_usage/claude.py +9 -1
  298. package/runtime/python/okstra_token_usage/cli.py +3 -1
  299. package/runtime/python/okstra_token_usage/collect.py +71 -10
  300. package/runtime/python/okstra_token_usage/cursor.py +2 -0
  301. package/runtime/python/okstra_token_usage/grok.py +1 -5
  302. package/runtime/python/okstra_token_usage/paths.py +26 -0
  303. package/runtime/python/okstra_token_usage/pricing.py +19 -7
  304. package/runtime/schemas/convergence-critic-results-v1.0.schema.json +5 -0
  305. package/runtime/schemas/execution-manifest-v2.schema.json +10 -10
  306. package/runtime/schemas/final-report-v2.0.schema.json +9 -26
  307. package/runtime/schemas/final-report-v3.0.schema.json +173 -41
  308. package/runtime/schemas/report-narrative-v3.0.schema.json +3 -2
  309. package/runtime/skills/okstra-brief-gen/SKILL.md +35 -2
  310. package/runtime/skills/okstra-container-build/SKILL.md +16 -47
  311. package/runtime/skills/okstra-inspect/facets/history.md +1 -1
  312. package/runtime/skills/okstra-inspect/facets/status.md +7 -6
  313. package/runtime/skills/okstra-pr-gen/SKILL.md +1 -1
  314. package/runtime/skills/okstra-run/SKILL.md +7 -5
  315. package/runtime/templates/report-writer-prompt-preamble.md +1 -1
  316. package/runtime/templates/reports/brief.template.md +6 -2
  317. package/runtime/templates/reports/error-analysis-input.template.md +2 -0
  318. package/runtime/templates/reports/final-verification-input.template.md +2 -0
  319. package/runtime/templates/reports/implementation-input.template.md +7 -1
  320. package/runtime/templates/reports/implementation-planning-input.template.md +4 -0
  321. package/runtime/templates/reports/quick-input.template.md +2 -0
  322. package/runtime/templates/reports/release-handoff-input.template.md +6 -1
  323. package/runtime/templates/reports/report.js +20 -3
  324. package/runtime/templates/reports/schedule.template.md +2 -0
  325. package/runtime/templates/reports/settings.template.json +0 -10
  326. package/runtime/templates/reports/task-brief.template.md +3 -0
  327. package/runtime/templates/reports/user-response.template.md +7 -3
  328. package/runtime/validators/checks/fixtures-01.py +57 -0
  329. package/runtime/validators/checks/fixtures-02.py +565 -0
  330. package/runtime/validators/checks/runners-01.py +108 -0
  331. package/runtime/validators/checks/validate-assets-01.py +60 -0
  332. package/runtime/validators/checks/validate-prompt-metadata-01.py +261 -0
  333. package/runtime/validators/checks/validate-tasks-01.py +46 -0
  334. package/runtime/validators/checks/validate-tasks-02.py +85 -0
  335. package/runtime/validators/checks/validate-tasks-03.py +61 -0
  336. package/runtime/validators/checks/validate-tasks-04.py +118 -0
  337. package/runtime/validators/forbidden_actions.py +73 -3
  338. package/runtime/validators/lib/common.sh +5 -0
  339. package/runtime/validators/lib/fixtures.sh +7 -591
  340. package/runtime/validators/lib/paths.sh +13 -0
  341. package/runtime/validators/lib/runners.sh +6 -104
  342. package/runtime/validators/lib/summary.sh +1 -1
  343. package/runtime/validators/lib/validate-assets.sh +6 -56
  344. package/runtime/validators/lib/validate-prompt-metadata.sh +6 -257
  345. package/runtime/validators/lib/validate-tasks.sh +9 -294
  346. package/runtime/validators/validate-implementation-plan-stages.py +4 -4
  347. package/runtime/validators/validate-run.py +1369 -2654
  348. package/runtime/validators/validate-workflow.sh +56 -16
  349. package/runtime/validators/validate_improvement_report.py +2 -1
  350. package/runtime/validators/validate_session_conformance.py +295 -49
  351. package/dist/commands/execute/agent-prompt.d.mts +0 -1
  352. package/dist/commands/execute/agent-prompt.mjs +0 -24
  353. package/dist/commands/execute/agent-prompt.mjs.map +0 -1
  354. package/dist/commands/execute/codex-dispatch.d.mts +0 -3
  355. package/dist/commands/execute/codex-dispatch.mjs +0 -6
  356. package/dist/commands/execute/codex-dispatch.mjs.map +0 -1
  357. package/dist/commands/execute/codex-run.d.mts +0 -3
  358. package/dist/commands/execute/codex-run.mjs +0 -62
  359. package/dist/commands/execute/codex-run.mjs.map +0 -1
  360. package/dist/commands/execute/convergence.d.mts +0 -1
  361. package/dist/commands/execute/convergence.mjs +0 -38
  362. package/dist/commands/execute/convergence.mjs.map +0 -1
  363. package/dist/commands/execute/error-log.d.mts +0 -1
  364. package/dist/commands/execute/error-log.mjs +0 -18
  365. package/dist/commands/execute/error-log.mjs.map +0 -1
  366. package/dist/commands/execute/git-reconcile.d.mts +0 -1
  367. package/dist/commands/execute/git-reconcile.mjs +0 -30
  368. package/dist/commands/execute/git-reconcile.mjs.map +0 -1
  369. package/dist/commands/execute/handoff.d.mts +0 -1
  370. package/dist/commands/execute/handoff.mjs +0 -31
  371. package/dist/commands/execute/handoff.mjs.map +0 -1
  372. package/dist/commands/execute/incremental-carry.d.mts +0 -1
  373. package/dist/commands/execute/incremental-carry.mjs +0 -20
  374. package/dist/commands/execute/incremental-carry.mjs.map +0 -1
  375. package/dist/commands/execute/incremental-scope.d.mts +0 -1
  376. package/dist/commands/execute/incremental-scope.mjs +0 -29
  377. package/dist/commands/execute/incremental-scope.mjs.map +0 -1
  378. package/dist/commands/execute/integrate-stages.d.mts +0 -1
  379. package/dist/commands/execute/integrate-stages.mjs +0 -24
  380. package/dist/commands/execute/integrate-stages.mjs.map +0 -1
  381. package/dist/commands/execute/pane-title.d.mts +0 -1
  382. package/dist/commands/execute/pane-title.mjs +0 -20
  383. package/dist/commands/execute/pane-title.mjs.map +0 -1
  384. package/dist/commands/execute/plan-items.d.mts +0 -1
  385. package/dist/commands/execute/plan-items.mjs +0 -9
  386. package/dist/commands/execute/plan-items.mjs.map +0 -1
  387. package/dist/commands/execute/plan-validate.d.mts +0 -1
  388. package/dist/commands/execute/plan-validate.mjs +0 -68
  389. package/dist/commands/execute/plan-validate.mjs.map +0 -1
  390. package/dist/commands/execute/plan-verify.d.mts +0 -1
  391. package/dist/commands/execute/plan-verify.mjs +0 -43
  392. package/dist/commands/execute/plan-verify.mjs.map +0 -1
  393. package/dist/commands/execute/spawn-followups.d.mts +0 -1
  394. package/dist/commands/execute/spawn-followups.mjs +0 -22
  395. package/dist/commands/execute/spawn-followups.mjs.map +0 -1
  396. package/dist/commands/execute/team.d.mts +0 -3
  397. package/dist/commands/execute/team.mjs +0 -66
  398. package/dist/commands/execute/team.mjs.map +0 -1
  399. package/dist/commands/execute/token-usage.d.mts +0 -1
  400. package/dist/commands/execute/token-usage.mjs +0 -19
  401. package/dist/commands/execute/token-usage.mjs.map +0 -1
  402. package/dist/commands/execute/worker-audit-check.d.mts +0 -1
  403. package/dist/commands/execute/worker-audit-check.mjs +0 -34
  404. package/dist/commands/execute/worker-audit-check.mjs.map +0 -1
  405. package/dist/commands/execute/worker-dispatch.d.mts +0 -7
  406. package/dist/commands/execute/worker-dispatch.mjs +0 -64
  407. package/dist/commands/execute/worker-dispatch.mjs.map +0 -1
  408. package/dist/commands/execute/worker-state.d.mts +0 -1
  409. package/dist/commands/execute/worker-state.mjs +0 -28
  410. package/dist/commands/execute/worker-state.mjs.map +0 -1
  411. package/dist/commands/execute/worktree-lookup.d.mts +0 -1
  412. package/dist/commands/execute/worktree-lookup.mjs +0 -92
  413. package/dist/commands/execute/worktree-lookup.mjs.map +0 -1
  414. package/dist/commands/execute/worktree-status.d.mts +0 -1
  415. package/dist/commands/execute/worktree-status.mjs +0 -121
  416. package/dist/commands/execute/worktree-status.mjs.map +0 -1
  417. package/dist/commands/inspect/code-review.d.mts +0 -1
  418. package/dist/commands/inspect/code-review.mjs +0 -32
  419. package/dist/commands/inspect/code-review.mjs.map +0 -1
  420. package/dist/commands/inspect/container.d.mts +0 -1
  421. package/dist/commands/inspect/container.mjs +0 -25
  422. package/dist/commands/inspect/container.mjs.map +0 -1
  423. package/dist/commands/inspect/context-cost.d.mts +0 -1
  424. package/dist/commands/inspect/context-cost.mjs +0 -25
  425. package/dist/commands/inspect/context-cost.mjs.map +0 -1
  426. package/dist/commands/inspect/design-prep.d.mts +0 -1
  427. package/dist/commands/inspect/design-prep.mjs +0 -22
  428. package/dist/commands/inspect/design-prep.mjs.map +0 -1
  429. package/dist/commands/inspect/error-report.d.mts +0 -1
  430. package/dist/commands/inspect/error-report.mjs +0 -25
  431. package/dist/commands/inspect/error-report.mjs.map +0 -1
  432. package/dist/commands/inspect/error-zip.d.mts +0 -1
  433. package/dist/commands/inspect/error-zip.mjs +0 -24
  434. package/dist/commands/inspect/error-zip.mjs.map +0 -1
  435. package/dist/commands/inspect/log-report.d.mts +0 -1
  436. package/dist/commands/inspect/log-report.mjs +0 -26
  437. package/dist/commands/inspect/log-report.mjs.map +0 -1
  438. package/dist/commands/inspect/model-io.d.mts +0 -1
  439. package/dist/commands/inspect/model-io.mjs +0 -25
  440. package/dist/commands/inspect/model-io.mjs.map +0 -1
  441. package/dist/commands/inspect/profile-show.d.mts +0 -1
  442. package/dist/commands/inspect/profile-show.mjs +0 -28
  443. package/dist/commands/inspect/profile-show.mjs.map +0 -1
  444. package/dist/commands/inspect/recap.d.mts +0 -1
  445. package/dist/commands/inspect/recap.mjs +0 -30
  446. package/dist/commands/inspect/recap.mjs.map +0 -1
  447. package/dist/commands/inspect/resolve-task-key.d.mts +0 -1
  448. package/dist/commands/inspect/resolve-task-key.mjs +0 -24
  449. package/dist/commands/inspect/resolve-task-key.mjs.map +0 -1
  450. package/dist/commands/inspect/rollup.d.mts +0 -1
  451. package/dist/commands/inspect/rollup.mjs +0 -25
  452. package/dist/commands/inspect/rollup.mjs.map +0 -1
  453. package/dist/commands/inspect/run-audit.d.mts +0 -1
  454. package/dist/commands/inspect/run-audit.mjs +0 -25
  455. package/dist/commands/inspect/run-audit.mjs.map +0 -1
  456. package/dist/commands/inspect/set-work-status.d.mts +0 -1
  457. package/dist/commands/inspect/set-work-status.mjs +0 -29
  458. package/dist/commands/inspect/set-work-status.mjs.map +0 -1
  459. package/dist/commands/inspect/stage-map.d.mts +0 -1
  460. package/dist/commands/inspect/stage-map.mjs +0 -131
  461. package/dist/commands/inspect/stage-map.mjs.map +0 -1
  462. package/dist/commands/inspect/task-list.d.mts +0 -1
  463. package/dist/commands/inspect/task-list.mjs +0 -149
  464. package/dist/commands/inspect/task-list.mjs.map +0 -1
  465. package/dist/commands/inspect/task-show.d.mts +0 -1
  466. package/dist/commands/inspect/task-show.mjs +0 -108
  467. package/dist/commands/inspect/task-show.mjs.map +0 -1
  468. package/dist/commands/inspect/time-report.d.mts +0 -1
  469. package/dist/commands/inspect/time-report.mjs +0 -24
  470. package/dist/commands/inspect/time-report.mjs.map +0 -1
  471. package/dist/commands/inspect/usage-report.d.mts +0 -1
  472. package/dist/commands/inspect/usage-report.mjs +0 -23
  473. package/dist/commands/inspect/usage-report.mjs.map +0 -1
  474. package/dist/commands/inspect/user-response.d.mts +0 -1
  475. package/dist/commands/inspect/user-response.mjs +0 -35
  476. package/dist/commands/inspect/user-response.mjs.map +0 -1
  477. package/dist/commands/inspect/worker-liveness.d.mts +0 -1
  478. package/dist/commands/inspect/worker-liveness.mjs +0 -45
  479. package/dist/commands/inspect/worker-liveness.mjs.map +0 -1
  480. package/dist/commands/lifecycle/contract-check.d.mts +0 -1
  481. package/dist/commands/lifecycle/contract-check.mjs +0 -18
  482. package/dist/commands/lifecycle/contract-check.mjs.map +0 -1
  483. package/dist/commands/lifecycle/migrate.d.mts +0 -1
  484. package/dist/commands/lifecycle/migrate.mjs +0 -30
  485. package/dist/commands/lifecycle/migrate.mjs.map +0 -1
  486. package/dist/commands/lifecycle/model.d.mts +0 -1
  487. package/dist/commands/lifecycle/model.mjs +0 -22
  488. package/dist/commands/lifecycle/model.mjs.map +0 -1
  489. package/dist/commands/manager.d.mts +0 -3
  490. package/dist/commands/manager.mjs +0 -50
  491. package/dist/commands/manager.mjs.map +0 -1
  492. package/dist/commands/report/agent-activity.d.mts +0 -1
  493. package/dist/commands/report/agent-activity.mjs +0 -20
  494. package/dist/commands/report/agent-activity.mjs.map +0 -1
  495. package/dist/commands/report/approval-decision.d.mts +0 -1
  496. package/dist/commands/report/approval-decision.mjs +0 -21
  497. package/dist/commands/report/approval-decision.mjs.map +0 -1
  498. package/dist/commands/report/design-snapshot.d.mts +0 -1
  499. package/dist/commands/report/design-snapshot.mjs +0 -19
  500. package/dist/commands/report/design-snapshot.mjs.map +0 -1
  501. package/dist/commands/report/finalize.d.mts +0 -4
  502. package/dist/commands/report/finalize.mjs +0 -64
  503. package/dist/commands/report/finalize.mjs.map +0 -1
  504. package/dist/commands/report/inject-report-index.d.mts +0 -1
  505. package/dist/commands/report/inject-report-index.mjs +0 -21
  506. package/dist/commands/report/inject-report-index.mjs.map +0 -1
  507. package/dist/commands/report/render-final-report.d.mts +0 -1
  508. package/dist/commands/report/render-final-report.mjs +0 -23
  509. package/dist/commands/report/render-final-report.mjs.map +0 -1
  510. package/dist/commands/report/render-views.d.mts +0 -1
  511. package/dist/commands/report/render-views.mjs +0 -27
  512. package/dist/commands/report/render-views.mjs.map +0 -1
  513. package/dist/commands/report/translate.d.mts +0 -1
  514. package/dist/commands/report/translate.mjs +0 -33
  515. package/dist/commands/report/translate.mjs.map +0 -1
  516. package/runtime/bin/lib/okstra/tmux-pane.sh +0 -40
  517. package/runtime/bin/lib/okstra-ctl/cmd-batch.sh +0 -59
  518. package/runtime/bin/lib/okstra-ctl/cmd-list.sh +0 -35
  519. package/runtime/bin/lib/okstra-ctl/cmd-open.sh +0 -36
  520. package/runtime/bin/lib/okstra-ctl/cmd-projects.sh +0 -26
  521. package/runtime/bin/lib/okstra-ctl/cmd-reconcile.sh +0 -29
  522. package/runtime/bin/lib/okstra-ctl/cmd-reindex.sh +0 -38
  523. package/runtime/bin/lib/okstra-ctl/cmd-rerun.sh +0 -345
  524. package/runtime/bin/lib/okstra-ctl/cmd-show.sh +0 -27
  525. package/runtime/bin/lib/okstra-ctl/cmd-tail.sh +0 -92
  526. package/runtime/bin/lib/okstra-ctl/main.sh +0 -41
  527. package/runtime/bin/lib/okstra-ctl/prepare.sh +0 -31
  528. package/runtime/bin/lib/okstra-ctl/usage.sh +0 -23
  529. package/runtime/bin/okstra-central.sh +0 -152
  530. package/runtime/bin/okstra-incremental-carry.py +0 -10
  531. package/runtime/bin/okstra-incremental-scope.py +0 -10
  532. package/runtime/bin/okstra-team-reconcile.sh +0 -36
  533. package/runtime/python/okstra_ctl/agent_prompt_cli.py +0 -1156
  534. package/runtime/python/okstra_ctl/batch.py +0 -60
  535. package/runtime/python/okstra_ctl/clarification_items.py +0 -1050
  536. package/runtime/python/okstra_ctl/container_registry.py +0 -72
  537. package/runtime/python/okstra_ctl/improvement_assignment.py +0 -61
  538. package/runtime/python/okstra_ctl/resolver.py +0 -54
  539. package/runtime/python/okstra_ctl/team_reconcile.py +0 -275
  540. package/runtime/python/okstra_ctl/tmux.py +0 -134
  541. package/runtime/python/okstra_ctl/worktree.py +0 -1099
@@ -251,7 +251,7 @@
251
251
  },
252
252
  "verdictCard": {
253
253
  "type": "object",
254
- "description": "Top-of-report at-a-glance card. It carries no verdict token — the token lives once, in finalVerdict. `direction` and `nextStep` MUST byte-match finalVerdict and recommendedNextSteps[0].",
254
+ "description": "Top-of-report at-a-glance card. It carries no verdict token — the token lives once, in finalVerdict, and additionalProperties:false keeps it from being copied here. Authoring guideline: write `direction` to agree with finalVerdict.direction and `nextStep` to agree with recommendedNextSteps[0]. Nothing compares the two copies afterwards — assembly rewrites `nextStep` on both cards together when the plan-body gate passes, and leaves `direction` as the writer wrote it — so a disagreement between them is published as written.",
255
255
  "required": [
256
256
  "finalConclusion",
257
257
  "direction",
@@ -312,9 +312,8 @@
312
312
  },
313
313
  "summary": {
314
314
  "type": "array",
315
- "description": "## Summary of the Problem or Verification Target. 3-5 rows.",
315
+ "description": "## Summary of the Problem or Verification Target. Usually 3-5 rows; no upper limit.",
316
316
  "minItems": 1,
317
- "maxItems": 8,
318
317
  "items": {
319
318
  "$ref": "#/$defs/SummaryRow"
320
319
  }
@@ -3897,8 +3896,8 @@
3897
3896
  },
3898
3897
  "summary": {
3899
3898
  "type": "string",
3900
- "minLength": 1,
3901
- "maxLength": 120
3899
+ "minLength": 1
3900
+
3902
3901
  },
3903
3902
  "details": {
3904
3903
  "type": "string",
@@ -7527,8 +7526,8 @@
7527
7526
  },
7528
7527
  "summary": {
7529
7528
  "type": "string",
7530
- "minLength": 1,
7531
- "maxLength": 120
7529
+ "minLength": 1
7530
+
7532
7531
  },
7533
7532
  "details": {
7534
7533
  "type": "string",
@@ -9030,24 +9029,6 @@
9030
9029
  "type": "string",
9031
9030
  "minLength": 1
9032
9031
  }
9033
- },
9034
- "rewrittenPaths": {
9035
- "type": "array",
9036
- "description": "data.json paths this round actually rewrote for this cause group. A self-fix round is contractually a targeted correction, not a full draft regeneration; recording the reach is what makes that claim checkable later.",
9037
- "uniqueItems": true,
9038
- "items": {
9039
- "type": "string",
9040
- "minLength": 1
9041
- }
9042
- },
9043
- "outsideScopePaths": {
9044
- "type": "array",
9045
- "description": "The subset of rewrittenPaths that lies outside the sections this group's itemIds point at. Carrying a correction to its contradictions legitimately reaches further than the flagged item, so this is a measurement, not a violation.",
9046
- "uniqueItems": true,
9047
- "items": {
9048
- "type": "string",
9049
- "minLength": 1
9050
- }
9051
9032
  }
9052
9033
  }
9053
9034
  },
@@ -9569,10 +9550,12 @@
9569
9550
  "minLength": 1
9570
9551
  },
9571
9552
  "verdict": {
9553
+ "description": "`not-run` is not a rejection: the verifier produced no verdict at all (timeout, error, usage limit). `FAIL` rejects the diff and opens the stage fix cycle, so spending it on a verifier that never ran manufactures a defect nobody found \u2014 see `_implementation-verifier.md` \"All-verifier-failure policy\".",
9572
9554
  "enum": [
9573
9555
  "PASS",
9574
9556
  "CONCERNS",
9575
- "FAIL"
9557
+ "FAIL",
9558
+ "not-run"
9576
9559
  ]
9577
9560
  },
9578
9561
  "readOnlyCommandLog": {
@@ -251,7 +251,7 @@
251
251
  },
252
252
  "verdictCard": {
253
253
  "type": "object",
254
- "description": "Top-of-report at-a-glance card. It carries no verdict token — the token lives once, in finalVerdict. `direction` and `nextStep` MUST byte-match finalVerdict and recommendedNextSteps[0].",
254
+ "description": "Top-of-report at-a-glance card. It carries no verdict token — the token lives once, in finalVerdict, and additionalProperties:false keeps it from being copied here. Authoring guideline: write `direction` to agree with finalVerdict.direction and `nextStep` to agree with recommendedNextSteps[0]. Nothing compares the two copies afterwards — assembly rewrites `nextStep` on both cards together when the plan-body gate passes, and leaves `direction` as the writer wrote it — so a disagreement between them is published as written.",
255
255
  "required": [
256
256
  "finalConclusion",
257
257
  "direction",
@@ -312,9 +312,8 @@
312
312
  },
313
313
  "summary": {
314
314
  "type": "array",
315
- "description": "## Summary of the Problem or Verification Target. 3-5 rows.",
315
+ "description": "## Summary of the Problem or Verification Target. Usually 3-5 rows; no upper limit.",
316
316
  "minItems": 1,
317
- "maxItems": 8,
318
317
  "items": {
319
318
  "$ref": "#/$defs/SummaryRow"
320
319
  }
@@ -3043,10 +3042,7 @@
3043
3042
  "$ref": "#/$defs/ImplementationOptionDecisionContext"
3044
3043
  },
3045
3044
  "evaluationCriteria": {
3046
- "type": "array",
3047
- "items": {
3048
- "$ref": "#/$defs/ImplementationOptionEvaluationCriterion"
3049
- }
3045
+ "$ref": "#/$defs/ImplementationOptionEvaluationCriteria"
3050
3046
  },
3051
3047
  "candidateAudit": {
3052
3048
  "type": "array",
@@ -3149,6 +3145,62 @@
3149
3145
  }
3150
3146
  }
3151
3147
  },
3148
+ "ImplementationOptionEvaluationCriteria": {
3149
+ "type": "array",
3150
+ "minItems": 8,
3151
+ "maxItems": 8,
3152
+ "prefixItems": [
3153
+ {
3154
+ "allOf": [
3155
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3156
+ {"properties": {"criterion": {"const": "requirement-fit"}}}
3157
+ ]
3158
+ },
3159
+ {
3160
+ "allOf": [
3161
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3162
+ {"properties": {"criterion": {"const": "architecture-fit"}}}
3163
+ ]
3164
+ },
3165
+ {
3166
+ "allOf": [
3167
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3168
+ {"properties": {"criterion": {"const": "change-locality"}}}
3169
+ ]
3170
+ },
3171
+ {
3172
+ "allOf": [
3173
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3174
+ {"properties": {"criterion": {"const": "implementation-complexity"}}}
3175
+ ]
3176
+ },
3177
+ {
3178
+ "allOf": [
3179
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3180
+ {"properties": {"criterion": {"const": "correctness-risk"}}}
3181
+ ]
3182
+ },
3183
+ {
3184
+ "allOf": [
3185
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3186
+ {"properties": {"criterion": {"const": "reversibility"}}}
3187
+ ]
3188
+ },
3189
+ {
3190
+ "allOf": [
3191
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3192
+ {"properties": {"criterion": {"const": "verification-cost"}}}
3193
+ ]
3194
+ },
3195
+ {
3196
+ "allOf": [
3197
+ {"$ref": "#/$defs/ImplementationOptionEvaluationCriterion"},
3198
+ {"properties": {"criterion": {"const": "rollout-cost"}}}
3199
+ ]
3200
+ }
3201
+ ],
3202
+ "items": false
3203
+ },
3152
3204
  "ImplementationOptionCandidateAudit": {
3153
3205
  "type": "object",
3154
3206
  "required": [
@@ -3237,11 +3289,7 @@
3237
3289
  "$ref": "#/$defs/ImplementationOptionCoverageSummary"
3238
3290
  },
3239
3291
  "criterionScores": {
3240
- "type": "array",
3241
- "minItems": 1,
3242
- "items": {
3243
- "$ref": "#/$defs/ImplementationOptionCriterionScore"
3244
- }
3292
+ "$ref": "#/$defs/ImplementationOptionCriterionScores"
3245
3293
  },
3246
3294
  "weightedScore": {
3247
3295
  "type": "number",
@@ -3339,11 +3387,7 @@
3339
3387
  "$ref": "#/$defs/ImplementationOptionExactCoverageSummary"
3340
3388
  },
3341
3389
  "criterionScores": {
3342
- "type": "array",
3343
- "minItems": 1,
3344
- "items": {
3345
- "$ref": "#/$defs/ImplementationOptionCriterionScore"
3346
- }
3390
+ "$ref": "#/$defs/ImplementationOptionCriterionScores"
3347
3391
  },
3348
3392
  "weightedScore": {
3349
3393
  "type": "number",
@@ -3575,6 +3619,62 @@
3575
3619
  }
3576
3620
  }
3577
3621
  },
3622
+ "ImplementationOptionCriterionScores": {
3623
+ "type": "array",
3624
+ "minItems": 8,
3625
+ "maxItems": 8,
3626
+ "prefixItems": [
3627
+ {
3628
+ "allOf": [
3629
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3630
+ {"properties": {"criterion": {"const": "requirement-fit"}}}
3631
+ ]
3632
+ },
3633
+ {
3634
+ "allOf": [
3635
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3636
+ {"properties": {"criterion": {"const": "architecture-fit"}}}
3637
+ ]
3638
+ },
3639
+ {
3640
+ "allOf": [
3641
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3642
+ {"properties": {"criterion": {"const": "change-locality"}}}
3643
+ ]
3644
+ },
3645
+ {
3646
+ "allOf": [
3647
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3648
+ {"properties": {"criterion": {"const": "implementation-complexity"}}}
3649
+ ]
3650
+ },
3651
+ {
3652
+ "allOf": [
3653
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3654
+ {"properties": {"criterion": {"const": "correctness-risk"}}}
3655
+ ]
3656
+ },
3657
+ {
3658
+ "allOf": [
3659
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3660
+ {"properties": {"criterion": {"const": "reversibility"}}}
3661
+ ]
3662
+ },
3663
+ {
3664
+ "allOf": [
3665
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3666
+ {"properties": {"criterion": {"const": "verification-cost"}}}
3667
+ ]
3668
+ },
3669
+ {
3670
+ "allOf": [
3671
+ {"$ref": "#/$defs/ImplementationOptionCriterionScore"},
3672
+ {"properties": {"criterion": {"const": "rollout-cost"}}}
3673
+ ]
3674
+ }
3675
+ ],
3676
+ "items": false
3677
+ },
3578
3678
  "ImplementationOptionFeasibilityVote": {
3579
3679
  "type": "object",
3580
3680
  "required": [
@@ -3905,8 +4005,8 @@
3905
4005
  },
3906
4006
  "summary": {
3907
4007
  "type": "string",
3908
- "minLength": 1,
3909
- "maxLength": 120
4008
+ "minLength": 1
4009
+
3910
4010
  },
3911
4011
  "details": {
3912
4012
  "type": "string",
@@ -7302,7 +7402,8 @@
7302
7402
  "properties": {
7303
7403
  "id": {
7304
7404
  "type": "string",
7305
- "pattern": "^C-\\d{3,}$"
7405
+ "pattern": "^C[V]?-\\d{3,}$",
7406
+ "description": "Converged-finding row id. New reports are numbered `CV-NNN` so `C-NNN` names a clarification and nothing else; `C-NNN` stays accepted here only because reports written before that split are still read and re-validated. The generator emits `CV-` only — see report_projections.py and its test."
7306
7407
  },
7307
7408
  "ticketId": {
7308
7409
  "$ref": "#/$defs/TicketId"
@@ -7522,8 +7623,8 @@
7522
7623
  },
7523
7624
  "summary": {
7524
7625
  "type": "string",
7525
- "minLength": 1,
7526
- "maxLength": 120
7626
+ "minLength": 1
7627
+
7527
7628
  },
7528
7629
  "details": {
7529
7630
  "type": "string",
@@ -8318,6 +8419,53 @@
8318
8419
  "rationale": {
8319
8420
  "type": "string",
8320
8421
  "description": "Required when disposition is not `addressed`: why this phase does not account for the id."
8422
+ },
8423
+ "blockedBy": {
8424
+ "type": "object",
8425
+ "description": "What holds this end state back. Required by validate-run.py when `disposition` is `blocked`, because that word alone carries five different situations and only one of them is something a person can answer. Derived from the 82 blocked rows on disk at the time it was added.",
8426
+ "required": [
8427
+ "kind"
8428
+ ],
8429
+ "additionalProperties": false,
8430
+ "properties": {
8431
+ "kind": {
8432
+ "type": "string",
8433
+ "enum": [
8434
+ "clarification",
8435
+ "finding",
8436
+ "execution",
8437
+ "upstream",
8438
+ "not-observed"
8439
+ ],
8440
+ "description": "`clarification` — a decision only the reporter can make; the run cannot proceed without an answer. `finding` — a cross-verification finding or approval blocker this run must resolve. `execution` — a command or environment failure in this run (a server that would not boot, a placeholder credential, an artifact not reproducible at its tag). `upstream` — carried from an earlier report or stage that already recorded the same disposition. `not-observed` — this run did not re-check it and records no disproof."
8441
+ },
8442
+ "ref": {
8443
+ "type": "string",
8444
+ "description": "The blocker's id. Required for `clarification` (a `C-NNN` row of this report, or one carried in) and for `finding`. Only the `clarification` ref is resolved by validate-run.py — a `finding` ref legitimately names a row of the approved plan or an upstream report (`VC-003`, `CA-001`), which this document cannot see."
8445
+ }
8446
+ },
8447
+ "allOf": [
8448
+ {
8449
+ "if": {
8450
+ "properties": {
8451
+ "kind": {
8452
+ "enum": [
8453
+ "clarification",
8454
+ "finding"
8455
+ ]
8456
+ }
8457
+ },
8458
+ "required": [
8459
+ "kind"
8460
+ ]
8461
+ },
8462
+ "then": {
8463
+ "required": [
8464
+ "ref"
8465
+ ]
8466
+ }
8467
+ }
8468
+ ]
8321
8469
  }
8322
8470
  }
8323
8471
  },
@@ -9025,24 +9173,6 @@
9025
9173
  "type": "string",
9026
9174
  "minLength": 1
9027
9175
  }
9028
- },
9029
- "rewrittenPaths": {
9030
- "type": "array",
9031
- "description": "data.json paths this round actually rewrote for this cause group. A self-fix round is contractually a targeted correction, not a full draft regeneration; recording the reach is what makes that claim checkable later.",
9032
- "uniqueItems": true,
9033
- "items": {
9034
- "type": "string",
9035
- "minLength": 1
9036
- }
9037
- },
9038
- "outsideScopePaths": {
9039
- "type": "array",
9040
- "description": "The subset of rewrittenPaths that lies outside the sections this group's itemIds point at. Carrying a correction to its contradictions legitimately reaches further than the flagged item, so this is a measurement, not a violation.",
9041
- "uniqueItems": true,
9042
- "items": {
9043
- "type": "string",
9044
- "minLength": 1
9045
- }
9046
9176
  }
9047
9177
  }
9048
9178
  },
@@ -9561,10 +9691,12 @@
9561
9691
  "minLength": 1
9562
9692
  },
9563
9693
  "verdict": {
9694
+ "description": "`not-run` is not a rejection: the verifier produced no verdict at all (timeout, error, usage limit). `FAIL` rejects the diff and opens the stage fix cycle, so spending it on a verifier that never ran manufactures a defect nobody found \u2014 see `_implementation-verifier.md` \"All-verifier-failure policy\".",
9564
9695
  "enum": [
9565
9696
  "PASS",
9566
9697
  "CONCERNS",
9567
- "FAIL"
9698
+ "FAIL",
9699
+ "not-run"
9568
9700
  ]
9569
9701
  },
9570
9702
  "readOnlyCommandLog": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://okstra.dev/schemas/report-narrative-v3.0.json",
4
4
  "title": "OKSTRA Report Writer Narrative Input (v3.0)",
5
- "description": "Parsed report-writer Markdown. Only report-writer-owned judgments, plans, summaries, and user explanations are accepted.",
5
+ "description": "Parsed report-writer Markdown: the allowlist of top-level fields the report writer owns. Only report-writer-owned judgments, plans, summaries, and user explanations are accepted. This file constrains NAMES only \u2014 the per-value constraints (enums, required properties, item shapes) come from final-report-v3.0.schema.json, which okstra_ctl.report_narrative restricts to these names at parse time. Do not copy value constraints here; two copies drift.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "properties": {
@@ -25,6 +25,7 @@
25
25
  "implementation": {"type": "object"},
26
26
  "finalVerification": {"type": "object"},
27
27
  "recommendedNextSteps": {"type": "array"},
28
- "followUpTasks": {"type": "array"}
28
+ "followUpTasks": {"type": "array"},
29
+ "endStateCoverage": {"type": "array"}
29
30
  }
30
31
  }
@@ -120,9 +120,13 @@ Run one Bash tool call, starting with the literal token `okstra` (never wrapped
120
120
  <!-- END FRAGMENT: bash-invocation-rule -->
121
121
 
122
122
  ```bash
123
- okstra preflight --runtime claude-code
123
+ okstra preflight --runtime <current-host-runtime>
124
124
  ```
125
125
 
126
+ Resolve `<current-host-runtime>` from the live harness or launcher's
127
+ `OKSTRA_RUNTIME_HOST`; do not assume `claude-code` when the skill is running
128
+ inside Codex or another registered host.
129
+
126
130
  On `Okstra preflight: ready`, carry the fixed `Project root` line as a literal string into the steps below. On `Okstra preflight: failed` (or `okstra` not on `PATH` at all), show the fixed `Reason` and `Recovery` lines, then stop.
127
131
 
128
132
  <!-- BEGIN FRAGMENT: preflight-outdated-cli -->
@@ -131,6 +135,22 @@ If the call fails with `unknown command: preflight`, the `okstra` binary on PATH
131
135
 
132
136
  Do **not** try `npx -y okstra@latest ...` as a fallback.
133
137
 
138
+ ### Host-native choice prompts
139
+
140
+ Use the current host's native single-select control whenever it is available
141
+ for an authored question with two or three mutually exclusive options. Keep a
142
+ selection and the material it collects as separate interactions: a native
143
+ choice selects the input path, and the next free-text interaction receives a
144
+ path, URL, ticket reference, or body.
145
+
146
+ In Codex, call `request_user_input` with the two or three listed options in
147
+ their stated order. Do not add an `Other` option: the Codex client adds its
148
+ own free-text `Other` row. When the user supplies a value through that row,
149
+ classify it through the normal reporter-source rules (ticket, URL, or user
150
+ input) and do not ask them to repeat it. If the host does not expose a
151
+ compatible native control, render the same options as a numbered text choice
152
+ and retain the explicit free-text follow-up where this skill specifies one.
153
+
134
154
  ## Step 1: Choose input source
135
155
 
136
156
  ### 1.0. brief variant
@@ -143,11 +163,16 @@ Do **not** try `npx -y okstra@latest ...` as a fallback.
143
163
  2. `Codebase scan` — take only the codebase scope + lens priorities and generate the input for the `improvement-discovery` phase.
144
164
  3. `Error feedback` (`error-feedback`) — convert one frequent cluster from the `.zip` produced by `okstra error-zip` into an `error-analysis` brief (for okstra self-repair).
145
165
 
166
+ The three variants must be presented as a native choice when the current host
167
+ supports it. A Codex `Other` response is direct Reporter input, not a fourth
168
+ brief variant. Continue with Step 1.A using that response as the already
169
+ collected source material, then classify a ticket reference or URL normally.
170
+
146
171
  ### 1.A. Reporter input (variant 1)
147
172
 
148
173
  If the user picked `Reporter input`, proceed to Step 1.A's sub-flow below — this is the existing 4-source flow. Choose ONE of:
149
174
 
150
- `AskUserQuestion` (tool constraint: max 4 options):
175
+ `AskUserQuestion` (single-select):
151
176
 
152
177
  - **Label**: "Source of this brief?"
153
178
  - **Options** (single-select):
@@ -159,6 +184,14 @@ If the user picked `Reporter input`, proceed to Step 1.A's sub-flow below — th
159
184
  (default: conversation synthesis. If context is thin, fall back to a
160
185
  single free-text question.)
161
186
 
187
+ When the current native control accepts only two or three options, present
188
+ `File`, `Issue tracker ticket`, and `Link URL`; use its built-in `Other` row
189
+ for `User input`. A value typed through `Other` is the source input itself;
190
+ classify a file path, ticket reference, or URL normally and otherwise treat
191
+ it as the user-input body without another free-text question. On a host
192
+ without that control, render all four options as the numbered text choice
193
+ above.
194
+
162
195
  If the user wants to bundle multiple sources into one brief (e.g. "this
163
196
  Linear ticket + this PR link"), repeat this step to collect them. Preserve
164
197
  each source's raw content **separately** under the `Source Material
@@ -1,20 +1,18 @@
1
1
  ---
2
2
  name: okstra-container-build
3
3
  description: |
4
- Use to bring up, inspect, or tear down the okstra user-test container runtime for an implementation task — the docker-compose group okstra deploys from a task's worktree so a human can poke at the running build. Trigger words include "okstra container", "okstra container up", "okstra container down", "bring up the container", "spin up the container", "tear down the container", "container status", "container logs", "user-test environment", "user test environment", "docker compose up please", "spin up this task in a container", "stop the watcher", "stop watcher", "stop monitoring".
4
+ Use to bring up, inspect, or tear down the okstra user-test container runtime for an implementation task — the docker-compose group okstra deploys from a task's worktree so a human can poke at the running build. Trigger words include "okstra container", "okstra container up", "okstra container down", "bring up the container", "spin up the container", "tear down the container", "container status", "user-test environment", "user test environment", "docker compose up please", "spin up this task in a container".
5
5
  ---
6
6
 
7
7
  # OKSTRA Container Build
8
8
 
9
- Single entry point for the okstra user-test container runtime. okstra provisions a docker-compose group from an `implementation` task's worktree (the `docker-compose.yml` at the worktree root), labels it with the task's run-trace so later sub-commands can find the group, and tails it through a tmux watcher pane. This skill drives that lifecycle. Sub-commands:
9
+ Single entry point for the okstra user-test container runtime. okstra provisions a docker-compose group from an `implementation` task's worktree (the `docker-compose.yml` at the worktree root), and labels it with the task's run-trace so later sub-commands can find the group. This skill drives that lifecycle. Sub-commands:
10
10
 
11
11
  | Sub-command | What it does |
12
12
  |---|---|
13
- | `up` | Integrate the task's stages into the worktree, run `docker compose up -d`, poll healthchecks, and attach a watcher pane. |
14
- | `status` | Query the running containers (by run-trace label) plus the watcher metadata for a task-key. |
15
- | `logs` | Point at the watcher findings dir and per-service watcher state (logs live in the tmux pane, not a file). |
16
- | `stop-watcher` | Reap the watcher/tail panes only — the containers keep running. |
17
- | `down` | Tear down the containers (label query) and reap orphan watcher panes; `--all` covers every container group in the project. |
13
+ | `up` | Integrate the task's stages into the worktree, run `docker compose up -d`, and poll healthchecks. |
14
+ | `status` | Query the running containers for a task-key (by run-trace label). |
15
+ | `down` | Tear down the containers (label query); `--all` covers every container group in the project. |
18
16
 
19
17
  ## Step 0: Preflight (shared)
20
18
 
@@ -44,14 +42,14 @@ Every subsequent `okstra <subcmd>` call self-bootstraps its Python path, so this
44
42
 
45
43
  Classify the user's request into one sub-command using the sub-command table above.
46
44
 
47
- - Clear verbs route directly: "bring up/deploy/up" → `up`; "status" → `status`; "logs" → `logs`; "stop watcher/stop-watcher" → `stop-watcher`; "tear down/down" → `down`.
45
+ - Clear verbs route directly: "bring up/deploy/up" → `up`; "status" → `status`; "tear down/down" → `down`.
48
46
  - If the request is ambiguous (e.g. "take a look at the okstra container"), present a numbered picker. Recommend the 1–2 most likely facets first, and make the **last option always "Enter directly"** so the user can name any facet:
49
47
 
50
48
  ```
51
49
  What would you like to do?
52
- 1. status — check running containers / watcher state (recommended)
50
+ 1. status — check the running containers (recommended)
53
51
  2. up — bring up this task's containers
54
- 3. Enter directly (one of up / status / logs / stop-watcher / down)
52
+ 3. Enter directly (one of up / status / down)
55
53
  ```
56
54
 
57
55
  The full facet list is the `Sub-command | What it does` table above — never hide a facet; if the user picks "Enter directly", let them name any row.
@@ -68,7 +66,7 @@ Every sub-command needs a **task-key** (`<project-id>:<task-group>:<task-id>`)
68
66
 
69
67
  ## up
70
68
 
71
- Brings up the task's container group: integrates the implementation stages into the task worktree, synthesizes the compose env override, runs `docker compose up -d`, polls healthchecks, and attaches a tmux watcher pane.
69
+ Brings up the task's container group: integrates the implementation stages into the task worktree, synthesizes the compose env override, runs `docker compose up -d`, and polls healthchecks.
72
70
 
73
71
  **Preconditions** (state them if unmet, do not guess):
74
72
  - The task must be an `implementation` task whose worktree is registered in `~/.okstra/worktrees/registry.json`. If `up` fails with "task worktree is not in the registry" → the task has no implementation worktree yet; tell the user to run the `implementation` phase first.
@@ -81,7 +79,7 @@ Run:
81
79
  okstra container up --project-root <projectRoot> --task-key <task-key> --text
82
80
  ```
83
81
 
84
- Read the fixed output fields and report the provisioned services and watcher pane. If a service failed its healthcheck, the call surfaces the failing services and the `docker compose ... logs` line to inspect — relay that line; do not invent your own.
82
+ Read the fixed output fields and report the provisioned services. If a service failed its healthcheck, the call surfaces the failing services and the `docker compose ... logs` line to inspect — relay that line; do not invent your own.
85
83
 
86
84
  After a successful `up`, run the `status --text` command below and read its numbered container `ports` fields to tell the user how to reach the running build. Also explain that `okstra container status <task-key>` / `okstra container down <task-key>` manage it from here. For *what to verify* once it is up, point the user to the implementation report's §5.7.9 Manual User Test (Draft) — its steps and expected results are the manual test script for this build.
87
85
 
@@ -89,57 +87,28 @@ After a successful `up`, run the `status --text` command below and read its numb
89
87
 
90
88
  ## status
91
89
 
92
- Reports the running containers (queried by run-trace label — the source of truth for "is it up") plus the watcher metadata recorded in the registry.
90
+ Reports the running containers, queried by the run-trace label — the source of truth for "is it up".
93
91
 
94
92
  ```bash
95
93
  okstra container status --project-root <projectRoot> --task-key <task-key> --text
96
94
  ```
97
95
 
98
- Read the fixed `Project name`, `Containers`, and `Watchers` fields and report:
96
+ Read the fixed `Project name` and numbered `Container` fields and report:
99
97
 
100
98
  | Field | Meaning |
101
99
  |---|---|
102
100
  | `projectName` | the compose project name (label group) |
103
101
  | `containers` | running containers found by label — empty array means nothing is up |
104
- | `watchers` | per-service watcher metadata from the registry (auxiliary; may lag the label query) |
105
102
 
106
- If `containers` is empty, say the group is not running and offer `up`. Treat the label query — not the registry `watchers` — as authoritative for whether containers are alive.
103
+ If `containers` is empty, say the group is not running and offer `up`.
107
104
 
108
- ---
109
-
110
- ## logs
111
-
112
- The live log stream lives in the tmux watcher pane, not in a file. This sub-command points at the watcher findings directory and the per-service watcher state.
113
-
114
- ```bash
115
- okstra container logs --project-root <projectRoot> --task-key <task-key> --text
116
- ```
117
-
118
- Add `--service <name>` to scope to one service:
119
-
120
- ```bash
121
- okstra container logs --project-root <projectRoot> --task-key <task-key> --service <service> --text
122
- ```
123
-
124
- Read the fixed `Watchers dir` and numbered `Watchers` fields. Report the host path and watcher entries. Explain that the live stream is in the attached tmux pane; to see raw container logs the user runs `docker compose -p <projectName> logs -f <service>` (get `<projectName>` from `status`).
125
-
126
- ---
127
-
128
- ## stop-watcher
129
-
130
- Reaps the watcher/tail tmux panes for the task **without stopping the containers**. Use when the user wants to silence the monitor but keep the build running.
131
-
132
- ```bash
133
- okstra container stop-watcher --project-root <projectRoot> --task-key <task-key> --text
134
- ```
135
-
136
- Read the fixed `Reaped panes` and `Note` fields. Confirm which panes were reaped and that the containers are still running. If the user actually wants the containers gone, route to `down`.
105
+ To follow a service's live logs, the user runs `docker compose -p <projectName> logs -f <service>` (get `<projectName>` from `status`).
137
106
 
138
107
  ---
139
108
 
140
109
  ## down
141
110
 
142
- Tears down the container group (removes containers found by the run-trace label) and reaps orphan watcher panes.
111
+ Tears down the container group — removes the containers found by the run-trace label.
143
112
 
144
113
  Single task:
145
114
 
@@ -153,7 +122,7 @@ Every container group in the project (no task-key needed):
153
122
  okstra container down --project-root <projectRoot> --all --text
154
123
  ```
155
124
 
156
- Read the fixed `Downed` and `Orphan panes reaped` fields. Report each torn-down project name and the orphan panes reaped. `down` runs `docker compose -p <name> down --remove-orphans` — a compose-native teardown that removes the project's containers and the compose network, but deliberately keeps named volumes (e.g. DB data) by NOT passing `-v`. Confirm with the user before running `--all`, since it takes down every okstra container group in the project at once. A single-task `down` is safe to run directly once the task-key is resolved.
125
+ Read the fixed `Downed` fields and report each torn-down project name. `down` runs `docker compose -p <name> down --remove-orphans` — a compose-native teardown that removes the project's containers and the compose network, but deliberately keeps named volumes (e.g. DB data) by NOT passing `-v`. Confirm with the user before running `--all`, since it takes down every okstra container group in the project at once. A single-task `down` is safe to run directly once the task-key is resolved.
157
126
 
158
127
  ---
159
128
 
@@ -58,7 +58,7 @@ Builds a fresh run — new run-seq, new manifest, new report — using parameter
58
58
  - `taskType` → `--task-type`
59
59
  - `taskBriefPath` → `--task-brief`
60
60
  3. Optional arguments (include only when present in source):
61
- - `recommendedWorkers` → `--workers` (comma-separated)
61
+ - `Workers` → `--workers` (comma-separated provider ids; the projection already folds roster slot ids like `codex-verifier` down to their provider, so pass the line verbatim and never hand-assemble it from a roster)
62
62
  - `relatedTasks` → `--related-tasks`
63
63
  - model overrides → `--claude-model`, `--codex-model`, `--antigravity-model`
64
64
  - for `taskType: implementation`: `teamContract.executor.provider` → `--executor <claude|codex|antigravity>` when different from `claude`.