okstra 0.146.1 → 0.148.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 (137) hide show
  1. package/README.md +23 -9
  2. package/docs/architecture/storage-model.md +39 -65
  3. package/docs/architecture.md +68 -60
  4. package/docs/cli.md +40 -23
  5. package/docs/for-ai/skills/okstra-run.md +13 -34
  6. package/docs/performance-improvement-plan-v2.md +2 -2
  7. package/docs/pr-template-usage.md +1 -1
  8. package/docs/project-structure-overview.md +26 -22
  9. package/docs/task-process/README.md +4 -4
  10. package/docs/task-process/common-flow.md +12 -12
  11. package/docs/task-process/final-verification.md +2 -2
  12. package/docs/task-process/implementation.md +1 -1
  13. package/docs/task-process/release-handoff.md +1 -1
  14. package/package.json +2 -2
  15. package/runtime/BUILD.json +2 -2
  16. package/runtime/agents/workers/antigravity-worker.md +2 -2
  17. package/runtime/agents/workers/claude-worker.md +1 -1
  18. package/runtime/agents/workers/codex-worker.md +2 -2
  19. package/runtime/agents/workers/grok-worker.md +256 -0
  20. package/runtime/agents/workers/kimi-worker.md +256 -0
  21. package/runtime/agents/workers/report-writer-worker.md +12 -12
  22. package/runtime/bin/lib/okstra/cli.sh +13 -1
  23. package/runtime/bin/lib/okstra/globals.sh +3 -0
  24. package/runtime/bin/lib/okstra/usage.sh +17 -12
  25. package/runtime/bin/okstra-grok-exec.sh +5 -0
  26. package/runtime/bin/okstra-kimi-exec.sh +5 -0
  27. package/runtime/bin/okstra-provider-exec.py +235 -0
  28. package/runtime/bin/okstra-render-final-report.py +4 -4
  29. package/runtime/bin/okstra-render-report-views.py +100 -12
  30. package/runtime/bin/okstra.sh +3 -0
  31. package/runtime/prompts/lead/adapters/antigravity.md +48 -0
  32. package/runtime/prompts/lead/adapters/claude-code.md +13 -11
  33. package/runtime/prompts/lead/adapters/codex.md +7 -7
  34. package/runtime/prompts/lead/okstra-lead-contract.md +5 -5
  35. package/runtime/prompts/lead/report-writer.md +16 -12
  36. package/runtime/prompts/profiles/_coding-conventions-preflight.md +1 -1
  37. package/runtime/prompts/profiles/_common-contract.md +16 -10
  38. package/runtime/prompts/profiles/_implementation-deliverable.md +2 -2
  39. package/runtime/prompts/profiles/_implementation-diff-review.md +1 -1
  40. package/runtime/prompts/profiles/_implementation-executor.md +12 -12
  41. package/runtime/prompts/profiles/_implementation-self-check.md +4 -4
  42. package/runtime/prompts/profiles/_implementation-verifier.md +3 -3
  43. package/runtime/prompts/profiles/change-impact-analysis.md +2 -0
  44. package/runtime/prompts/profiles/error-analysis.md +2 -0
  45. package/runtime/prompts/profiles/feature-analysis.md +2 -0
  46. package/runtime/prompts/profiles/final-verification.md +3 -1
  47. package/runtime/prompts/profiles/forbidden-actions.json +4 -4
  48. package/runtime/prompts/profiles/implementation-planning.md +3 -1
  49. package/runtime/prompts/profiles/implementation.md +2 -2
  50. package/runtime/prompts/profiles/improvement-discovery.md +6 -2
  51. package/runtime/prompts/profiles/project-analysis.md +2 -0
  52. package/runtime/prompts/profiles/release-handoff.md +7 -7
  53. package/runtime/prompts/profiles/requirements-discovery.md +2 -0
  54. package/runtime/prompts/wizard/prompts.ko.json +9 -1
  55. package/runtime/python/okstra_ctl/codex_dispatch.py +68 -87
  56. package/runtime/python/okstra_ctl/dispatch_core.py +4 -22
  57. package/runtime/python/okstra_ctl/final_report_schema.py +37 -12
  58. package/runtime/python/okstra_ctl/lead_events.py +1 -1
  59. package/runtime/python/okstra_ctl/lead_runtime.py +13 -2
  60. package/runtime/python/okstra_ctl/models.py +156 -8
  61. package/runtime/python/okstra_ctl/path_hints.py +9 -25
  62. package/runtime/python/okstra_ctl/paths.py +1 -1
  63. package/runtime/python/okstra_ctl/render.py +172 -74
  64. package/runtime/python/okstra_ctl/render_final_report.py +136 -28
  65. package/runtime/python/okstra_ctl/report_contract.py +124 -0
  66. package/runtime/python/okstra_ctl/report_finalize.py +1 -1
  67. package/runtime/python/okstra_ctl/report_html/__init__.py +10 -0
  68. package/runtime/python/okstra_ctl/report_html/common.py +86 -0
  69. package/runtime/python/okstra_ctl/report_html/filters.py +104 -0
  70. package/runtime/python/okstra_ctl/report_html/models.py +59 -0
  71. package/runtime/python/okstra_ctl/report_html/render.py +76 -0
  72. package/runtime/python/okstra_ctl/report_html/router.py +40 -0
  73. package/runtime/python/okstra_ctl/report_html/view_models/__init__.py +1 -0
  74. package/runtime/python/okstra_ctl/report_html/view_models/change_impact_analysis.py +39 -0
  75. package/runtime/python/okstra_ctl/report_html/view_models/error_analysis.py +49 -0
  76. package/runtime/python/okstra_ctl/report_html/view_models/feature_analysis.py +39 -0
  77. package/runtime/python/okstra_ctl/report_html/view_models/final_verification.py +47 -0
  78. package/runtime/python/okstra_ctl/report_html/view_models/implementation.py +47 -0
  79. package/runtime/python/okstra_ctl/report_html/view_models/implementation_planning.py +103 -0
  80. package/runtime/python/okstra_ctl/report_html/view_models/improvement_discovery.py +43 -0
  81. package/runtime/python/okstra_ctl/report_html/view_models/project_analysis.py +54 -0
  82. package/runtime/python/okstra_ctl/report_html/view_models/release_handoff.py +54 -0
  83. package/runtime/python/okstra_ctl/report_html/view_models/requirements_discovery.py +55 -0
  84. package/runtime/python/okstra_ctl/report_html/visualizations.py +139 -0
  85. package/runtime/python/okstra_ctl/report_view_artifacts.py +4 -1
  86. package/runtime/python/okstra_ctl/report_views.py +15 -43
  87. package/runtime/python/okstra_ctl/run.py +276 -51
  88. package/runtime/python/okstra_ctl/runner_resolution.py +103 -0
  89. package/runtime/python/okstra_ctl/schema_excerpt.py +7 -17
  90. package/runtime/python/okstra_ctl/team.py +2 -7
  91. package/runtime/python/okstra_ctl/wizard.py +194 -21
  92. package/runtime/python/okstra_ctl/worker_artifacts.py +46 -0
  93. package/runtime/python/okstra_ctl/workers.py +3 -1
  94. package/runtime/python/okstra_ctl/workflow.py +4 -2
  95. package/runtime/python/okstra_token_usage/__init__.py +1 -0
  96. package/runtime/python/okstra_token_usage/collect.py +32 -23
  97. package/runtime/python/okstra_token_usage/pricing.py +35 -3
  98. package/runtime/schemas/final-report-v2.0.schema.json +3923 -0
  99. package/runtime/skills/okstra-run/SKILL.md +31 -42
  100. package/runtime/templates/prd/pr-body.template.md +1 -1
  101. package/runtime/templates/reports/final-report-v2.template.md +66 -0
  102. package/runtime/templates/reports/html/assets/base.css +41 -0
  103. package/runtime/templates/reports/html/assets/base.js +5 -0
  104. package/runtime/templates/reports/html/base.template.html +79 -0
  105. package/runtime/templates/reports/html/macros/forms.html +47 -0
  106. package/runtime/templates/reports/html/macros/layout.html +19 -0
  107. package/runtime/templates/reports/html/macros/visualizations.html +27 -0
  108. package/runtime/templates/reports/html/tasks/change-impact-analysis.template.html +40 -0
  109. package/runtime/templates/reports/html/tasks/error-analysis.template.html +40 -0
  110. package/runtime/templates/reports/html/tasks/feature-analysis.template.html +40 -0
  111. package/runtime/templates/reports/html/tasks/final-verification.template.html +39 -0
  112. package/runtime/templates/reports/html/tasks/implementation-planning.template.html +47 -0
  113. package/runtime/templates/reports/html/tasks/implementation.template.html +40 -0
  114. package/runtime/templates/reports/html/tasks/improvement-discovery.template.html +29 -0
  115. package/runtime/templates/reports/html/tasks/project-analysis.template.html +57 -0
  116. package/runtime/templates/reports/html/tasks/release-handoff.template.html +36 -0
  117. package/runtime/templates/reports/html/tasks/requirements-discovery.template.html +37 -0
  118. package/runtime/templates/reports/report.js +21 -4
  119. package/runtime/templates/reports/settings.template.json +4 -0
  120. package/runtime/templates/reports/task-brief.template.md +7 -7
  121. package/runtime/validators/validate-report-views.py +86 -4
  122. package/runtime/validators/validate-run.py +73 -15
  123. package/runtime/validators/validate_improvement_report.py +55 -0
  124. package/runtime/validators/validate_session_conformance.py +2 -1
  125. package/src/cli-registry.mjs +4 -4
  126. package/src/commands/execute/codex-dispatch.mjs +7 -10
  127. package/src/commands/execute/render-bundle.mjs +3 -3
  128. package/src/commands/execute/run.mjs +17 -52
  129. package/src/commands/execute/wizard.mjs +4 -1
  130. package/src/commands/lifecycle/doctor.mjs +6 -3
  131. package/src/commands/lifecycle/install.mjs +49 -21
  132. package/src/commands/report/finalize.mjs +2 -3
  133. package/src/commands/report/render-final-report.mjs +4 -2
  134. package/src/commands/report/render-views.mjs +8 -8
  135. package/src/lib/runtime-manifest.mjs +1 -1
  136. package/src/lib/runtime-resolver.mjs +2 -2
  137. package/src/lib/worker-agent-render.mjs +50 -0
@@ -6,14 +6,14 @@ role default = one ROLE_DEFAULTS line here.
6
6
  from __future__ import annotations
7
7
 
8
8
  from dataclasses import dataclass
9
- from typing import Optional
9
+ from typing import Mapping, Optional
10
10
 
11
11
 
12
12
  @dataclass(frozen=True)
13
13
  class ModelSpec:
14
14
  display: str
15
15
  execution: str
16
- pricing: Optional[tuple] = None # codex only: (input, cached_input, output) USD/1M
16
+ pricing: Optional[tuple[float, float, float]] = None
17
17
  in_picker: bool = False # exposed in the wizard 3-option picker
18
18
 
19
19
 
@@ -31,6 +31,8 @@ CLAUDE = {
31
31
  "opus-4-6": ModelSpec("opus-4-6", "claude-opus-4-6"),
32
32
  "claude-opus-4-6": ModelSpec("opus-4-6", "claude-opus-4-6"),
33
33
  "sonnet": ModelSpec("sonnet", "sonnet", in_picker=True),
34
+ "sonnet-5": ModelSpec("sonnet-5", "claude-sonnet-5", in_picker=True),
35
+ "claude-sonnet-5": ModelSpec("sonnet-5", "claude-sonnet-5"),
34
36
  "sonnet-4-6": ModelSpec("sonnet-4-6", "claude-sonnet-4-6"),
35
37
  "claude-sonnet-4-6": ModelSpec("sonnet-4-6", "claude-sonnet-4-6"),
36
38
  "haiku": ModelSpec("haiku", "haiku", in_picker=True),
@@ -47,6 +49,8 @@ CLAUDE = {
47
49
  ANTIGRAVITY = {
48
50
  "gemini-3.1-pro": ModelSpec("Gemini 3.1 Pro", "gemini-3.1-pro", in_picker=True),
49
51
  "gemini 3.1 pro": ModelSpec("Gemini 3.1 Pro", "gemini-3.1-pro"),
52
+ "gemini-3.6-flash": ModelSpec("Gemini 3.6 Flash", "gemini-3.6-flash", in_picker=True),
53
+ "gemini 3.6 flash": ModelSpec("Gemini 3.6 Flash", "gemini-3.6-flash"),
50
54
  "gemini-3.5-flash": ModelSpec("Gemini 3.5 Flash", "gemini-3.5-flash", in_picker=True),
51
55
  "gemini 3.5 flash": ModelSpec("Gemini 3.5 Flash", "gemini-3.5-flash"),
52
56
  }
@@ -61,12 +65,111 @@ CODEX = {
61
65
  "gpt-5.2": ModelSpec("gpt-5.2", "gpt-5.2", (1.75, 0.175, 14.0)),
62
66
  "codex-auto-review": ModelSpec("codex-auto-review", "codex-auto-review"),
63
67
  }
64
- PROVIDER_MAPPINGS = {"claude": CLAUDE, "antigravity": ANTIGRAVITY, "codex": CODEX}
68
+ GROK = {
69
+ "grok-build-0.1": ModelSpec(
70
+ "grok-build-0.1", "grok-build-0.1", (1.00, 0.20, 2.00), in_picker=True,
71
+ ),
72
+ "grok-4.5": ModelSpec(
73
+ "grok-4.5", "grok-4.5", (2.00, 0.30, 6.00), in_picker=True,
74
+ ),
75
+ }
76
+ KIMI = {
77
+ "kimi-k2.7-code": ModelSpec(
78
+ "Kimi K2.7 Code", "kimi-k2.7-code", (0.95, 0.19, 4.00), in_picker=True,
79
+ ),
80
+ "kimi k2.7 code": ModelSpec("Kimi K2.7 Code", "kimi-k2.7-code"),
81
+ "kimi-for-coding": ModelSpec(
82
+ "Kimi K2.7 Code", "kimi-for-coding", in_picker=True,
83
+ ),
84
+ "kimi-k3": ModelSpec(
85
+ "Kimi K3", "kimi-k3", (3.00, 0.30, 15.00), in_picker=True,
86
+ ),
87
+ "kimi k3": ModelSpec("Kimi K3", "kimi-k3"),
88
+ "k3": ModelSpec("Kimi K3", "k3", in_picker=True),
89
+ "k3-256k": ModelSpec("Kimi K3 256K", "k3-256k", in_picker=True),
90
+ "kimi k3 256k": ModelSpec("Kimi K3 256K", "k3-256k"),
91
+ }
92
+
93
+ ANALYSIS_ROLES = frozenset({"analyser", "critic"})
94
+ IMPLEMENTATION_ROLES = frozenset({"executor", "verifier"})
95
+
96
+
97
+ @dataclass(frozen=True)
98
+ class ProviderSpec:
99
+ provider: str
100
+ display_label: str
101
+ models: Mapping[str, ModelSpec]
102
+ default_models: Mapping[str, str]
103
+ wrapper: str
104
+ supported_roles: frozenset[str]
65
105
 
66
- # ROLE-keyed (not provider): 1:1 with run.py recommended_role_models. "lead" uses
67
- # the claude provider; "report-writer" resolves via the claude provider too.
68
- # report-writer defaults below the lead tier on purpose: it does not vote in
69
- # convergence, and its wall-clock is dominated by sheer report generation.
106
+
107
+ PROVIDERS = {
108
+ "claude": ProviderSpec(
109
+ provider="claude",
110
+ display_label="Claude",
111
+ models=CLAUDE,
112
+ default_models={
113
+ "lead": "opus",
114
+ "analyser": "opus",
115
+ "critic": "opus",
116
+ "executor": "opus",
117
+ "verifier": "opus",
118
+ "report-writer": "sonnet",
119
+ },
120
+ wrapper="okstra-claude-exec.sh",
121
+ supported_roles=frozenset(
122
+ {"lead", "analyser", "critic", "executor", "verifier", "report-writer"}
123
+ ),
124
+ ),
125
+ "antigravity": ProviderSpec(
126
+ provider="antigravity",
127
+ display_label="Antigravity",
128
+ models=ANTIGRAVITY,
129
+ default_models={role: "gemini-3.1-pro" for role in (
130
+ "lead", "analyser", "critic", "executor", "verifier",
131
+ )},
132
+ wrapper="okstra-antigravity-exec.sh",
133
+ supported_roles=frozenset(
134
+ {"lead", "analyser", "critic", "executor", "verifier"}
135
+ ),
136
+ ),
137
+ "codex": ProviderSpec(
138
+ provider="codex",
139
+ display_label="Codex",
140
+ models=CODEX,
141
+ default_models={role: "gpt-5.6-sol" for role in (
142
+ "lead", "analyser", "critic", "executor", "verifier", "report-writer",
143
+ )},
144
+ wrapper="okstra-codex-exec.sh",
145
+ supported_roles=frozenset(
146
+ {"lead", "analyser", "critic", "executor", "verifier", "report-writer"}
147
+ ),
148
+ ),
149
+ "grok": ProviderSpec(
150
+ provider="grok",
151
+ display_label="Grok",
152
+ models=GROK,
153
+ default_models={"analyser": "grok-build-0.1", "critic": "grok-4.5"},
154
+ wrapper="okstra-grok-exec.sh",
155
+ supported_roles=ANALYSIS_ROLES,
156
+ ),
157
+ "kimi": ProviderSpec(
158
+ provider="kimi",
159
+ display_label="Kimi",
160
+ models=KIMI,
161
+ default_models={"analyser": "kimi-k2.7-code", "critic": "kimi-k3"},
162
+ wrapper="okstra-kimi-exec.sh",
163
+ supported_roles=ANALYSIS_ROLES,
164
+ ),
165
+ }
166
+
167
+ PROVIDER_MAPPINGS = {
168
+ provider: spec.models for provider, spec in PROVIDERS.items()
169
+ }
170
+
171
+ # Legacy role-keyed compatibility defaults. Canonical assignments resolve a
172
+ # provider first and then use ProviderSpec.default_models for that role.
70
173
  ROLE_DEFAULTS = {
71
174
  "lead": "opus", "claude": "opus", "codex": "gpt-5.6-sol",
72
175
  "antigravity": "gemini-3.1-pro", "report-writer": "sonnet",
@@ -83,6 +186,51 @@ class UnknownModelError(ValueError):
83
186
  """raw_value 가 provider mapping 에 등록되어 있지 않을 때 발생."""
84
187
 
85
188
 
189
+ class UnknownProviderError(ValueError):
190
+ """Raised when a requested provider is absent from the registry."""
191
+
192
+
193
+ def provider_spec(provider: str) -> ProviderSpec:
194
+ """Return one registered provider or fail before assignment/dispatch."""
195
+ normalized = (provider or "").strip().lower()
196
+ try:
197
+ return PROVIDERS[normalized]
198
+ except KeyError as exc:
199
+ allowed = ", ".join(PROVIDERS)
200
+ raise UnknownProviderError(
201
+ f"unknown provider {provider!r}. Allowed values: {allowed}"
202
+ ) from exc
203
+
204
+
205
+ def provider_ids(role: str | None = None) -> list[str]:
206
+ """Registered provider ids, optionally filtered by functional role."""
207
+ if not role:
208
+ return list(PROVIDERS)
209
+ return [
210
+ provider for provider, spec in PROVIDERS.items()
211
+ if role in spec.supported_roles
212
+ ]
213
+
214
+
215
+ def provider_supports_role(provider: str, role: str) -> bool:
216
+ """Whether the provider has passed the registry gate for a role."""
217
+ return role in provider_spec(provider).supported_roles
218
+
219
+
220
+ def provider_wrappers(role: str | None = None) -> dict[str, str]:
221
+ """Provider-to-wrapper mapping derived from capability entries."""
222
+ return {
223
+ provider: PROVIDERS[provider].wrapper
224
+ for provider in provider_ids(role)
225
+ if PROVIDERS[provider].wrapper
226
+ }
227
+
228
+
229
+ def provider_default_model(provider: str, role: str) -> Optional[str]:
230
+ """Resolve a provider's explicit default for one functional role."""
231
+ return provider_spec(provider).default_models.get(role)
232
+
233
+
86
234
  def resolve_model_metadata(
87
235
  *, provider: str, raw_value: str, default_display: str, default_execution: str,
88
236
  ) -> ModelAssignment:
@@ -120,6 +268,6 @@ def default_model(role: str) -> Optional[str]:
120
268
 
121
269
 
122
270
  def catalog_pricing(provider: str) -> dict:
123
- """Selectable-model pricing for a provider (codex only carries pricing)."""
271
+ """Selectable-model pricing as (input, cached input, output) USD/1M."""
124
272
  mapping = PROVIDER_MAPPINGS.get(provider, {})
125
273
  return {alias: spec.pricing for alias, spec in mapping.items() if spec.pricing is not None}
@@ -13,6 +13,7 @@ from okstra_project.dirs import (
13
13
  )
14
14
 
15
15
  from .paths import runs_dir_of, task_manifest_file, task_timeline_file
16
+ from .worker_artifacts import artifacts_from_context
16
17
 
17
18
  RUN_CONTEXT_KIND = "run-context"
18
19
  RUN_CONTEXT_SCHEMA_VERSION = "2.0"
@@ -162,7 +163,7 @@ def _compact_active_workers(payload: Mapping[str, Any]) -> list[dict[str, Any]]:
162
163
  def _compact_active_worker(worker: Mapping[str, Any]) -> dict[str, Any]:
163
164
  keep = (
164
165
  "workerId", "role", "agent", "agentLabel", "model",
165
- "modelExecutionValue", "attemptRequired",
166
+ "provider", "runner", "modelExecutionValue", "attemptRequired",
166
167
  )
167
168
  return {key: worker.get(key, "") for key in keep}
168
169
 
@@ -242,19 +243,19 @@ def _hydrate_active_worker(
242
243
  ) -> dict[str, Any]:
243
244
  worker_id = str(worker.get("workerId", ""))
244
245
  hydrated = dict(worker)
245
- hydrated["promptPath"] = ctx.get(_worker_path_key(worker_id, "prompt"), "")
246
- hydrated["resultPath"] = ctx.get(_worker_path_key(worker_id, "result"), "")
246
+ paths = artifacts_from_context(ctx, relative=True).get(worker_id, {})
247
+ hydrated["promptPath"] = paths.get("promptPath", "")
248
+ hydrated["resultPath"] = paths.get("resultPath", "")
247
249
  return hydrated
248
250
 
249
251
 
250
252
  def _hydrate_active_error_logs(ctx: Mapping[str, str]) -> dict[str, Any]:
253
+ artifacts = artifacts_from_context(ctx, relative=True)
251
254
  return {
252
255
  "runErrorsLogPath": ctx.get("RUN_ERRORS_LOG_RELATIVE_PATH", ""),
253
256
  "sidecarsByWorkerId": {
254
- "claude": ctx.get("CLAUDE_WORKER_ERRORS_SIDECAR_RELATIVE_PATH", ""),
255
- "codex": ctx.get("CODEX_WORKER_ERRORS_SIDECAR_RELATIVE_PATH", ""),
256
- "antigravity": ctx.get("ANTIGRAVITY_WORKER_ERRORS_SIDECAR_RELATIVE_PATH", ""),
257
- "report-writer": ctx.get("REPORT_WRITER_WORKER_ERRORS_SIDECAR_RELATIVE_PATH", ""),
257
+ worker_id: paths["errorsSidecarPath"]
258
+ for worker_id, paths in artifacts.items()
258
259
  },
259
260
  }
260
261
 
@@ -268,23 +269,6 @@ def _hydrate_active_source_artifacts(ctx: Mapping[str, str]) -> dict[str, str]:
268
269
  }
269
270
 
270
271
 
271
- def _worker_path_key(worker_id: str, kind: str) -> str:
272
- by_worker = {
273
- "claude": ("CLAUDE_WORKER_PROMPT_RELATIVE_PATH", "CLAUDE_WORKER_RESULT_RELATIVE_PATH"),
274
- "codex": ("CODEX_WORKER_PROMPT_RELATIVE_PATH", "CODEX_WORKER_RESULT_RELATIVE_PATH"),
275
- "antigravity": (
276
- "ANTIGRAVITY_WORKER_PROMPT_RELATIVE_PATH",
277
- "ANTIGRAVITY_WORKER_RESULT_RELATIVE_PATH",
278
- ),
279
- "report-writer": (
280
- "REPORT_WRITER_WORKER_PROMPT_RELATIVE_PATH",
281
- "REPORT_WRITER_WORKER_RESULT_RELATIVE_PATH",
282
- ),
283
- }
284
- index = 0 if kind == "prompt" else 1
285
- return by_worker.get(worker_id, ("", ""))[index]
286
-
287
-
288
272
  def _compact_run_hints(ctx: Mapping[str, Any]) -> dict[str, Any]:
289
273
  return {
290
274
  "runRoot": ctx.get("RUN_DIR_RELATIVE_PATH", ""),
@@ -421,7 +405,7 @@ def _run_files(
421
405
  "run_manifest_file": run_manifests / f"run-manifest{suffixes['manifests']}.json",
422
406
  "run_context_file": run_manifests / f"run-context-{task_type_segment}-{sequences['manifests']}.json",
423
407
  "run_inputs_file": run_manifests / f"run-inputs-{task_type_segment}-{sequences['manifests']}.json",
424
- "run_prompt_snapshot": run_prompts / f"claude-execution-prompt{suffixes['prompts']}.md",
408
+ "run_prompt_snapshot": run_prompts / f"lead-execution-prompt{suffixes['prompts']}.md",
425
409
  "claude_worker_prompt": run_prompts / f"claude-worker-prompt{suffixes['prompts']}.md",
426
410
  "codex_worker_prompt": run_prompts / f"codex-worker-prompt{suffixes['prompts']}.md",
427
411
  "antigravity_worker_prompt": run_prompts / f"antigravity-worker-prompt{suffixes['prompts']}.md",
@@ -485,7 +485,7 @@ def compute_run_paths(
485
485
  run_file_suffix = suffixes["reports"]
486
486
 
487
487
  run_manifest_file = run_manifests / f"run-manifest{suffixes['manifests']}.json"
488
- run_prompt_snapshot = run_prompts / f"claude-execution-prompt{suffixes['prompts']}.md"
488
+ run_prompt_snapshot = run_prompts / f"lead-execution-prompt{suffixes['prompts']}.md"
489
489
  claude_worker_prompt = run_prompts / f"claude-worker-prompt{suffixes['prompts']}.md"
490
490
  codex_worker_prompt = run_prompts / f"codex-worker-prompt{suffixes['prompts']}.md"
491
491
  antigravity_worker_prompt = run_prompts / f"antigravity-worker-prompt{suffixes['prompts']}.md"