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.
- package/README.md +23 -9
- package/docs/architecture/storage-model.md +39 -65
- package/docs/architecture.md +68 -60
- package/docs/cli.md +40 -23
- package/docs/for-ai/skills/okstra-run.md +13 -34
- package/docs/performance-improvement-plan-v2.md +2 -2
- package/docs/pr-template-usage.md +1 -1
- package/docs/project-structure-overview.md +26 -22
- package/docs/task-process/README.md +4 -4
- package/docs/task-process/common-flow.md +12 -12
- package/docs/task-process/final-verification.md +2 -2
- package/docs/task-process/implementation.md +1 -1
- package/docs/task-process/release-handoff.md +1 -1
- package/package.json +2 -2
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/antigravity-worker.md +2 -2
- package/runtime/agents/workers/claude-worker.md +1 -1
- package/runtime/agents/workers/codex-worker.md +2 -2
- package/runtime/agents/workers/grok-worker.md +256 -0
- package/runtime/agents/workers/kimi-worker.md +256 -0
- package/runtime/agents/workers/report-writer-worker.md +12 -12
- package/runtime/bin/lib/okstra/cli.sh +13 -1
- package/runtime/bin/lib/okstra/globals.sh +3 -0
- package/runtime/bin/lib/okstra/usage.sh +17 -12
- package/runtime/bin/okstra-grok-exec.sh +5 -0
- package/runtime/bin/okstra-kimi-exec.sh +5 -0
- package/runtime/bin/okstra-provider-exec.py +235 -0
- package/runtime/bin/okstra-render-final-report.py +4 -4
- package/runtime/bin/okstra-render-report-views.py +100 -12
- package/runtime/bin/okstra.sh +3 -0
- package/runtime/prompts/lead/adapters/antigravity.md +48 -0
- package/runtime/prompts/lead/adapters/claude-code.md +13 -11
- package/runtime/prompts/lead/adapters/codex.md +7 -7
- package/runtime/prompts/lead/okstra-lead-contract.md +5 -5
- package/runtime/prompts/lead/report-writer.md +16 -12
- package/runtime/prompts/profiles/_coding-conventions-preflight.md +1 -1
- package/runtime/prompts/profiles/_common-contract.md +16 -10
- package/runtime/prompts/profiles/_implementation-deliverable.md +2 -2
- package/runtime/prompts/profiles/_implementation-diff-review.md +1 -1
- package/runtime/prompts/profiles/_implementation-executor.md +12 -12
- package/runtime/prompts/profiles/_implementation-self-check.md +4 -4
- package/runtime/prompts/profiles/_implementation-verifier.md +3 -3
- package/runtime/prompts/profiles/change-impact-analysis.md +2 -0
- package/runtime/prompts/profiles/error-analysis.md +2 -0
- package/runtime/prompts/profiles/feature-analysis.md +2 -0
- package/runtime/prompts/profiles/final-verification.md +3 -1
- package/runtime/prompts/profiles/forbidden-actions.json +4 -4
- package/runtime/prompts/profiles/implementation-planning.md +3 -1
- package/runtime/prompts/profiles/implementation.md +2 -2
- package/runtime/prompts/profiles/improvement-discovery.md +6 -2
- package/runtime/prompts/profiles/project-analysis.md +2 -0
- package/runtime/prompts/profiles/release-handoff.md +7 -7
- package/runtime/prompts/profiles/requirements-discovery.md +2 -0
- package/runtime/prompts/wizard/prompts.ko.json +9 -1
- package/runtime/python/okstra_ctl/codex_dispatch.py +68 -87
- package/runtime/python/okstra_ctl/dispatch_core.py +4 -22
- package/runtime/python/okstra_ctl/final_report_schema.py +37 -12
- package/runtime/python/okstra_ctl/lead_events.py +1 -1
- package/runtime/python/okstra_ctl/lead_runtime.py +13 -2
- package/runtime/python/okstra_ctl/models.py +156 -8
- package/runtime/python/okstra_ctl/path_hints.py +9 -25
- package/runtime/python/okstra_ctl/paths.py +1 -1
- package/runtime/python/okstra_ctl/render.py +172 -74
- package/runtime/python/okstra_ctl/render_final_report.py +136 -28
- package/runtime/python/okstra_ctl/report_contract.py +124 -0
- package/runtime/python/okstra_ctl/report_finalize.py +1 -1
- package/runtime/python/okstra_ctl/report_html/__init__.py +10 -0
- package/runtime/python/okstra_ctl/report_html/common.py +86 -0
- package/runtime/python/okstra_ctl/report_html/filters.py +104 -0
- package/runtime/python/okstra_ctl/report_html/models.py +59 -0
- package/runtime/python/okstra_ctl/report_html/render.py +76 -0
- package/runtime/python/okstra_ctl/report_html/router.py +40 -0
- package/runtime/python/okstra_ctl/report_html/view_models/__init__.py +1 -0
- package/runtime/python/okstra_ctl/report_html/view_models/change_impact_analysis.py +39 -0
- package/runtime/python/okstra_ctl/report_html/view_models/error_analysis.py +49 -0
- package/runtime/python/okstra_ctl/report_html/view_models/feature_analysis.py +39 -0
- package/runtime/python/okstra_ctl/report_html/view_models/final_verification.py +47 -0
- package/runtime/python/okstra_ctl/report_html/view_models/implementation.py +47 -0
- package/runtime/python/okstra_ctl/report_html/view_models/implementation_planning.py +103 -0
- package/runtime/python/okstra_ctl/report_html/view_models/improvement_discovery.py +43 -0
- package/runtime/python/okstra_ctl/report_html/view_models/project_analysis.py +54 -0
- package/runtime/python/okstra_ctl/report_html/view_models/release_handoff.py +54 -0
- package/runtime/python/okstra_ctl/report_html/view_models/requirements_discovery.py +55 -0
- package/runtime/python/okstra_ctl/report_html/visualizations.py +139 -0
- package/runtime/python/okstra_ctl/report_view_artifacts.py +4 -1
- package/runtime/python/okstra_ctl/report_views.py +15 -43
- package/runtime/python/okstra_ctl/run.py +276 -51
- package/runtime/python/okstra_ctl/runner_resolution.py +103 -0
- package/runtime/python/okstra_ctl/schema_excerpt.py +7 -17
- package/runtime/python/okstra_ctl/team.py +2 -7
- package/runtime/python/okstra_ctl/wizard.py +194 -21
- package/runtime/python/okstra_ctl/worker_artifacts.py +46 -0
- package/runtime/python/okstra_ctl/workers.py +3 -1
- package/runtime/python/okstra_ctl/workflow.py +4 -2
- package/runtime/python/okstra_token_usage/__init__.py +1 -0
- package/runtime/python/okstra_token_usage/collect.py +32 -23
- package/runtime/python/okstra_token_usage/pricing.py +35 -3
- package/runtime/schemas/final-report-v2.0.schema.json +3923 -0
- package/runtime/skills/okstra-run/SKILL.md +31 -42
- package/runtime/templates/prd/pr-body.template.md +1 -1
- package/runtime/templates/reports/final-report-v2.template.md +66 -0
- package/runtime/templates/reports/html/assets/base.css +41 -0
- package/runtime/templates/reports/html/assets/base.js +5 -0
- package/runtime/templates/reports/html/base.template.html +79 -0
- package/runtime/templates/reports/html/macros/forms.html +47 -0
- package/runtime/templates/reports/html/macros/layout.html +19 -0
- package/runtime/templates/reports/html/macros/visualizations.html +27 -0
- package/runtime/templates/reports/html/tasks/change-impact-analysis.template.html +40 -0
- package/runtime/templates/reports/html/tasks/error-analysis.template.html +40 -0
- package/runtime/templates/reports/html/tasks/feature-analysis.template.html +40 -0
- package/runtime/templates/reports/html/tasks/final-verification.template.html +39 -0
- package/runtime/templates/reports/html/tasks/implementation-planning.template.html +47 -0
- package/runtime/templates/reports/html/tasks/implementation.template.html +40 -0
- package/runtime/templates/reports/html/tasks/improvement-discovery.template.html +29 -0
- package/runtime/templates/reports/html/tasks/project-analysis.template.html +57 -0
- package/runtime/templates/reports/html/tasks/release-handoff.template.html +36 -0
- package/runtime/templates/reports/html/tasks/requirements-discovery.template.html +37 -0
- package/runtime/templates/reports/report.js +21 -4
- package/runtime/templates/reports/settings.template.json +4 -0
- package/runtime/templates/reports/task-brief.template.md +7 -7
- package/runtime/validators/validate-report-views.py +86 -4
- package/runtime/validators/validate-run.py +73 -15
- package/runtime/validators/validate_improvement_report.py +55 -0
- package/runtime/validators/validate_session_conformance.py +2 -1
- package/src/cli-registry.mjs +4 -4
- package/src/commands/execute/codex-dispatch.mjs +7 -10
- package/src/commands/execute/render-bundle.mjs +3 -3
- package/src/commands/execute/run.mjs +17 -52
- package/src/commands/execute/wizard.mjs +4 -1
- package/src/commands/lifecycle/doctor.mjs +6 -3
- package/src/commands/lifecycle/install.mjs +49 -21
- package/src/commands/report/finalize.mjs +2 -3
- package/src/commands/report/render-final-report.mjs +4 -2
- package/src/commands/report/render-views.mjs +8 -8
- package/src/lib/runtime-manifest.mjs +1 -1
- package/src/lib/runtime-resolver.mjs +2 -2
- 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
|
|
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
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
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
|
-
|
|
246
|
-
hydrated["
|
|
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
|
-
|
|
255
|
-
|
|
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"
|
|
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"
|
|
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"
|