okstra 0.86.0 → 0.87.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/kr/architecture.md +27 -27
- package/docs/kr/cli.md +21 -21
- package/docs/kr/performance-improvement-plan-v2.md +4 -4
- package/docs/kr/performance-improvement-plan.md +3 -3
- package/docs/project-structure-overview.md +6 -6
- package/docs/superpowers/plans/2026-06-17-okstra-error-report.md +724 -0
- package/docs/superpowers/specs/2026-06-17-okstra-error-report-design.md +123 -0
- package/docs/task-process/error-analysis.md +1 -1
- package/docs/task-process/final-verification.md +4 -4
- package/docs/task-process/implementation-planning.md +2 -2
- package/docs/task-process/implementation.md +3 -3
- package/docs/task-process/requirements-discovery.md +2 -2
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/{gemini-worker.md → antigravity-worker.md} +56 -56
- package/runtime/agents/workers/claude-worker.md +2 -2
- package/runtime/agents/workers/codex-worker.md +1 -1
- package/runtime/agents/workers/report-writer-worker.md +2 -2
- package/runtime/bin/lib/okstra/cli.sh +3 -3
- package/runtime/bin/lib/okstra/globals.sh +8 -8
- package/runtime/bin/lib/okstra/interactive.sh +1 -1
- package/runtime/bin/lib/okstra/usage.sh +7 -7
- package/runtime/bin/lib/okstra-ctl/cmd-reconcile.sh +5 -3
- package/runtime/bin/lib/okstra-ctl/prepare.sh +4 -2
- package/runtime/bin/{okstra-gemini-exec.sh → okstra-antigravity-exec.sh} +67 -60
- package/runtime/bin/okstra-error-log.py +2 -1
- package/runtime/bin/okstra-token-usage.py +3 -4
- package/runtime/bin/okstra-trace-cleanup.sh +4 -4
- package/runtime/bin/okstra-wrapper-status.py +3 -3
- package/runtime/bin/okstra.sh +1 -1
- package/runtime/prompts/launch.template.md +3 -3
- package/runtime/prompts/lead/context-loader.md +1 -1
- package/runtime/prompts/lead/convergence.md +8 -8
- package/runtime/prompts/lead/okstra-lead-contract.md +15 -15
- package/runtime/prompts/lead/report-writer.md +6 -6
- package/runtime/prompts/lead/team-contract.md +31 -31
- package/runtime/prompts/profiles/_coding-conventions-preflight.md +2 -2
- package/runtime/prompts/profiles/_common-contract.md +7 -7
- package/runtime/prompts/profiles/_implementation-deliverable.md +1 -1
- package/runtime/prompts/profiles/_implementation-executor.md +6 -6
- package/runtime/prompts/profiles/_implementation-verifier.md +4 -4
- package/runtime/prompts/profiles/_stage-discipline.md +1 -1
- package/runtime/prompts/profiles/error-analysis.md +1 -1
- package/runtime/prompts/profiles/final-verification.md +1 -1
- package/runtime/prompts/profiles/forbidden-actions.json +2 -2
- package/runtime/prompts/profiles/implementation-planning.md +1 -1
- package/runtime/prompts/profiles/implementation.md +3 -3
- package/runtime/prompts/profiles/improvement-discovery.md +3 -3
- package/runtime/prompts/profiles/requirements-discovery.md +1 -1
- package/runtime/prompts/wizard/prompts.ko.json +9 -5
- package/runtime/python/okstra_ctl/__init__.py +2 -0
- package/runtime/python/okstra_ctl/analysis_packet.py +1 -1
- package/runtime/python/okstra_ctl/clarification_items.py +17 -7
- package/runtime/python/okstra_ctl/codex_dispatch.py +2 -2
- package/runtime/python/okstra_ctl/context_cost.py +10 -44
- package/runtime/python/okstra_ctl/doctor.py +1 -1
- package/runtime/python/okstra_ctl/error_report.py +185 -0
- package/runtime/python/okstra_ctl/improvement_lenses.py +1 -1
- package/runtime/python/okstra_ctl/models.py +10 -10
- package/runtime/python/okstra_ctl/paths.py +9 -9
- package/runtime/python/okstra_ctl/reconcile.py +74 -11
- package/runtime/python/okstra_ctl/render.py +21 -21
- package/runtime/python/okstra_ctl/report_views.py +7 -13
- package/runtime/python/okstra_ctl/run.py +16 -16
- package/runtime/python/okstra_ctl/run_context.py +1 -1
- package/runtime/python/okstra_ctl/seeding.py +1 -1
- package/runtime/python/okstra_ctl/task_target.py +44 -0
- package/runtime/python/okstra_ctl/team.py +1 -1
- package/runtime/python/okstra_ctl/wizard.py +55 -30
- package/runtime/python/okstra_ctl/workers.py +3 -3
- package/runtime/python/okstra_ctl/workflow.py +1 -1
- package/runtime/python/okstra_ctl/worktree.py +1 -1
- package/runtime/python/okstra_token_usage/__init__.py +2 -3
- package/runtime/python/okstra_token_usage/antigravity.py +26 -0
- package/runtime/python/okstra_token_usage/blocks.py +4 -0
- package/runtime/python/okstra_token_usage/collect.py +20 -15
- package/runtime/python/okstra_token_usage/paths.py +0 -1
- package/runtime/python/okstra_token_usage/pricing.py +6 -3
- package/runtime/schemas/final-report-v1.0.schema.json +1 -1
- package/runtime/skills/okstra-brief/SKILL.md +1 -1
- package/runtime/skills/okstra-inspect/SKILL.md +85 -21
- package/runtime/skills/okstra-run/SKILL.md +3 -3
- package/runtime/skills/okstra-setup/SKILL.md +2 -2
- package/runtime/templates/prd/brief.template.md +2 -2
- package/runtime/templates/reports/i18n/en.json +1 -1
- package/runtime/templates/reports/i18n/ko.json +1 -1
- package/runtime/templates/reports/report.js +5 -11
- package/runtime/templates/reports/settings.template.json +2 -2
- package/runtime/templates/reports/task-brief.template.md +2 -2
- package/runtime/templates/worker-prompt-preamble.md +7 -7
- package/runtime/validators/forbidden_actions.py +1 -1
- package/runtime/validators/lib/fixtures.sh +3 -3
- package/runtime/validators/lib/validate-assets.sh +1 -1
- package/runtime/validators/validate-run.py +8 -8
- package/src/cli-registry.mjs +7 -0
- package/src/codex-dispatch.mjs +3 -3
- package/src/codex-run.mjs +2 -2
- package/src/doctor.mjs +1 -1
- package/src/error-report.mjs +27 -0
- package/src/install.mjs +1 -1
- package/src/render-bundle.mjs +1 -1
- package/src/uninstall.mjs +2 -2
- package/runtime/python/okstra_token_usage/gemini.py +0 -82
|
@@ -20,7 +20,7 @@ WORKERS_OVERRIDE=""
|
|
|
20
20
|
LEAD_MODEL_OVERRIDE=""
|
|
21
21
|
CLAUDE_MODEL_OVERRIDE=""
|
|
22
22
|
CODEX_MODEL_OVERRIDE=""
|
|
23
|
-
|
|
23
|
+
ANTIGRAVITY_MODEL_OVERRIDE=""
|
|
24
24
|
REPORT_WRITER_MODEL_OVERRIDE=""
|
|
25
25
|
LEAD_RUNTIME="claude-code"
|
|
26
26
|
EXECUTOR_OVERRIDE=""
|
|
@@ -82,8 +82,8 @@ CLAUDE_WORKER_PROMPT_FILE=""
|
|
|
82
82
|
CLAUDE_WORKER_PROMPT_RELATIVE_PATH=""
|
|
83
83
|
CODEX_WORKER_PROMPT_FILE=""
|
|
84
84
|
CODEX_WORKER_PROMPT_RELATIVE_PATH=""
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
ANTIGRAVITY_WORKER_PROMPT_FILE=""
|
|
86
|
+
ANTIGRAVITY_WORKER_PROMPT_RELATIVE_PATH=""
|
|
87
87
|
REPORT_WRITER_WORKER_PROMPT_FILE=""
|
|
88
88
|
REPORT_WRITER_WORKER_PROMPT_RELATIVE_PATH=""
|
|
89
89
|
FINAL_REPORT_PATH=""
|
|
@@ -103,8 +103,8 @@ CLAUDE_WORKER_RESULT_FILE=""
|
|
|
103
103
|
CLAUDE_WORKER_RESULT_RELATIVE_PATH=""
|
|
104
104
|
CODEX_WORKER_RESULT_FILE=""
|
|
105
105
|
CODEX_WORKER_RESULT_RELATIVE_PATH=""
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
ANTIGRAVITY_WORKER_RESULT_FILE=""
|
|
107
|
+
ANTIGRAVITY_WORKER_RESULT_RELATIVE_PATH=""
|
|
108
108
|
REPORT_WRITER_WORKER_RESULT_FILE=""
|
|
109
109
|
REPORT_WRITER_WORKER_RESULT_RELATIVE_PATH=""
|
|
110
110
|
CLAUDE_SESSION_ID=""
|
|
@@ -154,15 +154,15 @@ CLAUDE_WORKER_MODEL=""
|
|
|
154
154
|
CLAUDE_WORKER_MODEL_EXECUTION_VALUE=""
|
|
155
155
|
CODEX_WORKER_MODEL=""
|
|
156
156
|
CODEX_WORKER_MODEL_EXECUTION_VALUE=""
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
ANTIGRAVITY_WORKER_MODEL=""
|
|
158
|
+
ANTIGRAVITY_WORKER_MODEL_EXECUTION_VALUE=""
|
|
159
159
|
REPORT_WRITER_MODEL=""
|
|
160
160
|
REPORT_WRITER_MODEL_EXECUTION_VALUE=""
|
|
161
161
|
DEFAULT_WORKERS="claude,codex,report-writer"
|
|
162
162
|
DEFAULT_LEAD_MODEL_NAME="${OKSTRA_DEFAULT_LEAD_MODEL:-opus}"
|
|
163
163
|
DEFAULT_CLAUDE_WORKER_MODEL_NAME="${OKSTRA_DEFAULT_CLAUDE_MODEL:-opus}"
|
|
164
164
|
DEFAULT_CODEX_WORKER_MODEL_NAME="${OKSTRA_DEFAULT_CODEX_MODEL:-gpt-5.5}"
|
|
165
|
-
|
|
165
|
+
DEFAULT_ANTIGRAVITY_WORKER_MODEL_NAME="${OKSTRA_DEFAULT_ANTIGRAVITY_MODEL:-gemini-3.1-pro}"
|
|
166
166
|
DEFAULT_REPORT_WRITER_MODEL_NAME="${OKSTRA_DEFAULT_REPORT_WRITER_MODEL:-$DEFAULT_LEAD_MODEL_NAME}"
|
|
167
167
|
DISPLAY_COMMAND_NAME="${OKSTRA_COMMAND_NAME:-$(basename "$0")}"
|
|
168
168
|
DISPLAY_TOOL_NAME="${OKSTRA_TOOL_NAME:-okstra}"
|
|
@@ -434,7 +434,7 @@ emit("--workers", workers)
|
|
|
434
434
|
emit("--lead-model", model(inputs.get("leadModel")))
|
|
435
435
|
emit("--claude-model", model(inputs.get("claudeModel")))
|
|
436
436
|
emit("--codex-model", model(inputs.get("codexModel")))
|
|
437
|
-
emit("--
|
|
437
|
+
emit("--antigravity-model", model(inputs.get("antigravityModel")))
|
|
438
438
|
emit("--report-writer-model", model(inputs.get("reportWriterModel")))
|
|
439
439
|
directive = inputs.get("directive")
|
|
440
440
|
emit("--directive", directive if isinstance(directive, str) else "")
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
usage() {
|
|
4
4
|
cat >&2 <<USAGE_EOF
|
|
5
5
|
usage:
|
|
6
|
-
$DISPLAY_COMMAND_NAME [--render-only] [--yes] [--no-plan-verification] --task-type <task-type> [--workers worker1,worker2] [--lead-model <model>] [--claude-model <model>] [--codex-model <model>] [--
|
|
6
|
+
$DISPLAY_COMMAND_NAME [--render-only] [--yes] [--no-plan-verification] --task-type <task-type> [--workers worker1,worker2] [--lead-model <model>] [--claude-model <model>] [--codex-model <model>] [--antigravity-model <model>] [--report-writer-model <model>] [--lead-runtime claude-code|codex] [--executor claude|codex|antigravity] [--critic off|claude|codex|antigravity] [--related-tasks taskA,taskB] --project-id <project-id> [--project-root <path>] --task-group <task-group> --task-id <task-id> --task-brief <brief-path> [--directive <directive>] [--fix-cycle <yes|no>]
|
|
7
7
|
|
|
8
8
|
summary:
|
|
9
9
|
$DISPLAY_TOOL_NAME prepares a task-keyed instruction bundle for Claude Code and launches an interactive Claude session by default.
|
|
@@ -87,23 +87,23 @@ options:
|
|
|
87
87
|
exclusive with --clarification-response and --approved-plan.
|
|
88
88
|
--yes Skip interactive prompting and confirmation. Requires all required arguments.
|
|
89
89
|
--workers Comma-separated worker list for this run. Default: claude,codex,report-writer
|
|
90
|
-
(
|
|
90
|
+
(Antigravity worker is optional; add \`antigravity\` explicitly, e.g. --workers claude,codex,antigravity,report-writer)
|
|
91
91
|
--lead-model Model for Claude lead. Default: OKSTRA_DEFAULT_LEAD_MODEL or opus
|
|
92
92
|
--claude-model Model for Claude worker. Default: OKSTRA_DEFAULT_CLAUDE_MODEL or opus
|
|
93
93
|
--codex-model Model for Codex worker. Default: OKSTRA_DEFAULT_CODEX_MODEL or gpt-5.5
|
|
94
|
-
--
|
|
94
|
+
--antigravity-model Model for Antigravity worker. Default: OKSTRA_DEFAULT_ANTIGRAVITY_MODEL or auto
|
|
95
95
|
--report-writer-model
|
|
96
96
|
Model for report writer worker. Default: OKSTRA_DEFAULT_REPORT_WRITER_MODEL or lead model default
|
|
97
97
|
--lead-runtime Lead runtime adapter. Default: claude-code.
|
|
98
98
|
codex is currently render-only and records Codex adapter
|
|
99
99
|
metadata in prepared artifacts without dispatching workers.
|
|
100
100
|
--executor Provider that performs the Executor role during --task-type=implementation.
|
|
101
|
-
One of: claude | codex |
|
|
101
|
+
One of: claude | codex | antigravity. Default: OKSTRA_DEFAULT_EXECUTOR or claude.
|
|
102
102
|
The Executor is the only worker allowed to mutate project files; the other two
|
|
103
103
|
providers are dispatched as read-only verifiers regardless of this selection.
|
|
104
104
|
Has no effect on other task types.
|
|
105
105
|
--critic Provider for the opt-in Phase 5.6 critic pass (coverage gaps /
|
|
106
|
-
acceptance devil's-advocate). One of: off | claude | codex |
|
|
106
|
+
acceptance devil's-advocate). One of: off | claude | codex | antigravity.
|
|
107
107
|
Default: off.
|
|
108
108
|
--related-tasks Optional comma-separated related task identifiers. Example: auth-token-refresh,frontend-login-ui
|
|
109
109
|
--work-category Work-category classification for this task. One of:
|
|
@@ -125,8 +125,8 @@ model defaults:
|
|
|
125
125
|
Report writer worker: OKSTRA_DEFAULT_REPORT_WRITER_MODEL or Claude lead default
|
|
126
126
|
Claude worker: OKSTRA_DEFAULT_CLAUDE_MODEL or opus
|
|
127
127
|
Codex worker: OKSTRA_DEFAULT_CODEX_MODEL or gpt-5.5
|
|
128
|
-
|
|
129
|
-
Implementation executor: OKSTRA_DEFAULT_EXECUTOR or claude (one of: claude | codex |
|
|
128
|
+
Antigravity worker: OKSTRA_DEFAULT_ANTIGRAVITY_MODEL or auto
|
|
129
|
+
Implementation executor: OKSTRA_DEFAULT_EXECUTOR or claude (one of: claude | codex | antigravity)
|
|
130
130
|
|
|
131
131
|
output:
|
|
132
132
|
Stable task bundles are stored under:
|
|
@@ -18,10 +18,12 @@ _okstra_ctl_reconcile() {
|
|
|
18
18
|
import os, sys
|
|
19
19
|
sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
|
|
20
20
|
from pathlib import Path
|
|
21
|
-
from okstra_ctl import reconcile_active
|
|
21
|
+
from okstra_ctl import reconcile_active, reconcile_recent
|
|
22
22
|
target = os.environ["OK_PROJECT"]
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
home = Path(os.environ["OKSTRA_HOME_RESOLVED"])
|
|
24
|
+
scope = None if target == "all" else target
|
|
25
|
+
reconcile_active(home, project=scope)
|
|
26
|
+
reconcile_recent(home, project=scope)
|
|
25
27
|
PY
|
|
26
28
|
printf 'reconcile complete\n'
|
|
27
29
|
}
|
|
@@ -23,7 +23,9 @@ sys.exit(0 if data.get("backfilledAt") else 1)
|
|
|
23
23
|
import os, sys
|
|
24
24
|
sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
|
|
25
25
|
from pathlib import Path
|
|
26
|
-
from okstra_ctl import reconcile_active
|
|
27
|
-
|
|
26
|
+
from okstra_ctl import reconcile_active, reconcile_recent
|
|
27
|
+
home = Path(os.environ["OKSTRA_HOME_RESOLVED"])
|
|
28
|
+
reconcile_active(home)
|
|
29
|
+
reconcile_recent(home)
|
|
28
30
|
PY
|
|
29
31
|
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# okstra-
|
|
2
|
+
# okstra-antigravity-exec.sh — wrapper around `agy --print` for okstra antigravity-worker
|
|
3
3
|
#
|
|
4
4
|
# Purpose: Claude Code's Bash permission matcher requires explicit approval for
|
|
5
|
-
# commands that contain shell metacharacters (
|
|
6
|
-
# `
|
|
7
|
-
# therefore triggers a permission prompt every dispatch even when `Bash(
|
|
5
|
+
# commands that contain shell metacharacters (stdout/stderr redirects, pipes).
|
|
6
|
+
# `agy --print "<prompt>" --model <model> --add-dir <root> 2>>log > >(tee)`
|
|
7
|
+
# therefore triggers a permission prompt every dispatch even when `Bash(agy:*)`
|
|
8
8
|
# is allowlisted, because the redirect tokens disqualify the simple-prefix match.
|
|
9
9
|
#
|
|
10
10
|
# This wrapper accepts positional arguments and performs the redirect inside
|
|
11
11
|
# the script body, so the caller can allowlist a single non-redirect form:
|
|
12
12
|
#
|
|
13
|
-
# Bash($HOME/.okstra/bin/okstra-
|
|
13
|
+
# Bash($HOME/.okstra/bin/okstra-antigravity-exec.sh:*)
|
|
14
14
|
#
|
|
15
15
|
# Usage:
|
|
16
|
-
# okstra-
|
|
16
|
+
# okstra-antigravity-exec.sh <project-root> <model-execution-value> <prompt-path> [worktree-path] [role] [idle-timeout-seconds]
|
|
17
17
|
#
|
|
18
18
|
# project-root / model-execution-value / prompt-path are required.
|
|
19
19
|
#
|
|
20
20
|
# idle-timeout-seconds is optional (default 600 = 10 minutes). When > 0, an
|
|
21
21
|
# in-process watchdog polls the live-log mtime; if no stdout/stderr write
|
|
22
|
-
# occurs for that many seconds, the underlying `
|
|
22
|
+
# occurs for that many seconds, the underlying `agy` is SIGTERM'd (then
|
|
23
23
|
# SIGKILL'd after a 5-second grace), the status sidecar gets a
|
|
24
24
|
# `{timeout: true, idle_seconds, idle_at_ts, terminated_by: "idle-watchdog"}`
|
|
25
25
|
# marker, and the wrapper exits non-zero. Pass `0` to disable. Kept in
|
|
@@ -28,23 +28,28 @@
|
|
|
28
28
|
#
|
|
29
29
|
# worktree-path is optional and used for okstra implementation phase, where the
|
|
30
30
|
# executor must mutate files inside a git worktree that lives outside
|
|
31
|
-
# project-root. When supplied (non-empty), it is
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
31
|
+
# project-root. When supplied (non-empty), it is added to agy's `--add-dir`
|
|
32
|
+
# workspace list so the model can see and operate on the worktree alongside the
|
|
33
|
+
# primary workspace. When omitted or empty, only project-root is added (existing
|
|
34
|
+
# analysis-phase behavior).
|
|
35
35
|
#
|
|
36
36
|
# For linked worktrees, the per-worktree git metadata (index, HEAD, refs) and
|
|
37
37
|
# the shared object database live in the main repository's `.git` directory —
|
|
38
38
|
# OUTSIDE the worktree-path. Without access there, `git add` / `git commit`
|
|
39
39
|
# from inside the worktree fails on `.git/worktrees/<name>/index.lock`. The
|
|
40
40
|
# wrapper resolves the main repo's git-common-dir via `git rev-parse` against
|
|
41
|
-
# the supplied worktree-path and
|
|
42
|
-
#
|
|
43
|
-
#
|
|
41
|
+
# the supplied worktree-path and adds it via `--add-dir`. If resolution fails
|
|
42
|
+
# (not a linked worktree, or git unavailable), the extra dir is silently
|
|
43
|
+
# omitted.
|
|
44
44
|
#
|
|
45
45
|
# The wrapper exits non-zero on any preflight failure.
|
|
46
46
|
set -euo pipefail
|
|
47
47
|
|
|
48
|
+
# Hard ceiling for agy's print-mode wait (Go duration). The idle watchdog below
|
|
49
|
+
# is the primary stall detector; this is a backstop against a run that never
|
|
50
|
+
# stalls but also never finishes.
|
|
51
|
+
PRINT_TIMEOUT="7200s"
|
|
52
|
+
|
|
48
53
|
if [[ $# -lt 3 || $# -gt 6 ]]; then
|
|
49
54
|
printf 'usage: %s <project-root> <model-execution-value> <prompt-path> [worktree-path] [role] [idle-timeout-seconds]\n' "$(basename "$0")" >&2
|
|
50
55
|
exit 64
|
|
@@ -58,38 +63,40 @@ role="${5:-worker}"
|
|
|
58
63
|
idle_timeout_secs="${6:-600}"
|
|
59
64
|
|
|
60
65
|
if ! [[ "$idle_timeout_secs" =~ ^[0-9]+$ ]]; then
|
|
61
|
-
printf 'okstra-
|
|
66
|
+
printf 'okstra-antigravity-exec: idle-timeout-seconds must be a non-negative integer: %q\n' "$idle_timeout_secs" >&2
|
|
62
67
|
exit 69
|
|
63
68
|
fi
|
|
64
69
|
|
|
65
70
|
if [[ -z "$project_root" || ! -d "$project_root" ]]; then
|
|
66
|
-
printf 'okstra-
|
|
71
|
+
printf 'okstra-antigravity-exec: project-root is missing or not a directory: %q\n' "$project_root" >&2
|
|
67
72
|
exit 65
|
|
68
73
|
fi
|
|
69
74
|
|
|
70
75
|
if [[ -z "$model" ]]; then
|
|
71
|
-
printf 'okstra-
|
|
76
|
+
printf 'okstra-antigravity-exec: model-execution-value is empty\n' >&2
|
|
72
77
|
exit 66
|
|
73
78
|
fi
|
|
74
79
|
|
|
75
80
|
if [[ -z "$prompt_path" || ! -f "$prompt_path" ]]; then
|
|
76
|
-
printf 'okstra-
|
|
81
|
+
printf 'okstra-antigravity-exec: prompt-path is missing or not a file: %q\n' "$prompt_path" >&2
|
|
77
82
|
exit 67
|
|
78
83
|
fi
|
|
79
84
|
|
|
80
|
-
if ! command -v
|
|
81
|
-
printf 'okstra-
|
|
85
|
+
if ! command -v agy >/dev/null 2>&1; then
|
|
86
|
+
printf 'okstra-antigravity-exec: agy (Antigravity CLI) is not installed on PATH\n' >&2
|
|
82
87
|
exit 127
|
|
83
88
|
fi
|
|
84
89
|
|
|
85
90
|
if [[ -n "$worktree_path" && ! -d "$worktree_path" ]]; then
|
|
86
|
-
printf 'okstra-
|
|
91
|
+
printf 'okstra-antigravity-exec: worktree-path was provided but is not a directory: %q\n' "$worktree_path" >&2
|
|
87
92
|
exit 68
|
|
88
93
|
fi
|
|
89
94
|
|
|
90
|
-
|
|
95
|
+
# agy has no `--cd` flag, so workspace correctness is anchored via repeatable
|
|
96
|
+
# `--add-dir` plus the Project Root referenced in the prompt body itself.
|
|
97
|
+
add_dir_args=(--add-dir "$project_root")
|
|
91
98
|
if [[ -n "$worktree_path" ]]; then
|
|
92
|
-
|
|
99
|
+
add_dir_args+=(--add-dir "$worktree_path")
|
|
93
100
|
# For linked worktrees, also open the main repo's `.git` so `git add` /
|
|
94
101
|
# `git commit` can write the per-worktree index/refs and the shared
|
|
95
102
|
# object DB. `--git-common-dir` resolves to the main repo's `.git` for
|
|
@@ -104,26 +111,26 @@ if [[ -n "$worktree_path" ]]; then
|
|
|
104
111
|
fi
|
|
105
112
|
if [[ -d "$common_git_dir" ]]; then
|
|
106
113
|
common_git_dir=$(cd "$common_git_dir" && pwd -P)
|
|
107
|
-
|
|
114
|
+
add_dir_args+=(--add-dir "$common_git_dir")
|
|
108
115
|
fi
|
|
109
116
|
fi
|
|
110
117
|
fi
|
|
111
118
|
fi
|
|
112
119
|
|
|
113
|
-
# Derive a live-progress log path next to the prompt.
|
|
114
|
-
#
|
|
115
|
-
#
|
|
116
|
-
#
|
|
117
|
-
#
|
|
118
|
-
#
|
|
119
|
-
#
|
|
120
|
+
# Derive a live-progress log path next to the prompt. agy streams its progress
|
|
121
|
+
# over stdout/stderr, but the caller (antigravity-worker subagent) only polls
|
|
122
|
+
# `BashOutput` on a 60s cadence — so without a sideband, a long implementation
|
|
123
|
+
# run produces no visible output until the very end. Mirroring both streams into
|
|
124
|
+
# a file alongside the prompt lets the human operator `tail -f <log-path>` from a
|
|
125
|
+
# separate pane and watch progress in real time, and leaves a post-mortem record
|
|
126
|
+
# on disk.
|
|
120
127
|
log_path="${prompt_path%.md}.log"
|
|
121
128
|
[[ "$log_path" == "$prompt_path" ]] && log_path="${prompt_path}.log"
|
|
122
129
|
: > "$log_path"
|
|
123
130
|
|
|
124
131
|
# Heartbeat sidecar (`<prompt>.status.json`). See `okstra-codex-exec.sh` for
|
|
125
132
|
# the full design comment — kept in lock-step. Two consumers:
|
|
126
|
-
# 1. `
|
|
133
|
+
# 1. `antigravity-worker` step 8c reads `log_path` to capture a diagnostic
|
|
127
134
|
# tail when `exit_code == 0` but no Result file was produced.
|
|
128
135
|
# 2. Lead's redispatch policy distinguishes "wrapper never started"
|
|
129
136
|
# from "CLI ran but produced no artifact" via `stage`/`started_ts`.
|
|
@@ -153,12 +160,12 @@ if type okstra_resolve_caller_pane >/dev/null 2>&1; then
|
|
|
153
160
|
caller_pane="$(okstra_resolve_caller_pane)"
|
|
154
161
|
fi
|
|
155
162
|
|
|
156
|
-
# Pane titles: the caller (worker) pane gets `
|
|
163
|
+
# Pane titles: the caller (worker) pane gets `agy-<role>`; the sibling trace
|
|
157
164
|
# pane is that same caller title with a `-tail` suffix, so the operator can
|
|
158
165
|
# visually pair `<caller> ↔ <caller>-tail`. `role` carries the dispatched Agent
|
|
159
|
-
# name minus the `
|
|
160
|
-
# pane title equals the FleetView teammate name instead of a generic `worker`.
|
|
161
|
-
pane_label="
|
|
166
|
+
# name minus the `antigravity-` prefix (e.g. `worker-reverify-r1`, `executor`), so
|
|
167
|
+
# the pane title equals the FleetView teammate name instead of a generic `worker`.
|
|
168
|
+
pane_label="agy-${role}"
|
|
162
169
|
trace_label="${pane_label}-tail"
|
|
163
170
|
|
|
164
171
|
# Capture the caller pane's current title so the EXIT trap can restore it
|
|
@@ -191,9 +198,9 @@ fi
|
|
|
191
198
|
|
|
192
199
|
# When a tmux session is reachable, split a sibling pane tailing the log so
|
|
193
200
|
# the operator can watch progress live. This fires in every phase the
|
|
194
|
-
# wrapper is invoked from — long-running
|
|
195
|
-
# implementation-specific. Title `
|
|
196
|
-
# can pair it with its caller pane (`
|
|
201
|
+
# wrapper is invoked from — long-running agy dispatches are not
|
|
202
|
+
# implementation-specific. Title `agy-<role>-tail` so the operator
|
|
203
|
+
# can pair it with its caller pane (`agy-<role>`). The split is
|
|
197
204
|
# explicitly anchored to the caller pane to avoid attaching to tmux's idle
|
|
198
205
|
# active pane. `role` is the optional 5th positional arg (defaults to
|
|
199
206
|
# `worker`); callers that dispatch a different role (e.g. `worker-reverify-r1`)
|
|
@@ -215,25 +222,25 @@ if [[ -n "$caller_pane" ]]; then
|
|
|
215
222
|
fi
|
|
216
223
|
fi
|
|
217
224
|
|
|
218
|
-
#
|
|
219
|
-
#
|
|
220
|
-
#
|
|
221
|
-
#
|
|
222
|
-
#
|
|
225
|
+
# stdout/stderr capture and pipeline mirroring are intentionally inside the
|
|
226
|
+
# wrapper — this is the entire reason this script exists. agy reads the prompt
|
|
227
|
+
# as the `--print` argument (it does not read stdin), so the prompt file is
|
|
228
|
+
# inlined via command substitution; `--dangerously-skip-permissions` keeps the
|
|
229
|
+
# non-interactive dispatch from blocking on tool-permission prompts (the worker
|
|
230
|
+
# is sandboxed to the supplied `--add-dir` workspace).
|
|
223
231
|
#
|
|
224
232
|
# stdout: tee'd to both the live log (for `tail -f`) AND the wrapper's own
|
|
225
233
|
# stdout (so the subagent's `BashOutput` still captures the final
|
|
226
234
|
# text verbatim for Phase 5 synthesis). Implemented via process
|
|
227
|
-
# substitution so
|
|
235
|
+
# substitution so agy itself stays a single addressable PID we
|
|
228
236
|
# can SIGTERM from the watchdog.
|
|
229
|
-
# stderr: appended to the live log only —
|
|
230
|
-
#
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
< "$prompt_path" \
|
|
237
|
+
# stderr: appended to the live log only — keeps the wrapper's stderr clean.
|
|
238
|
+
# exit: agy's own exit code is preserved by `wait`.
|
|
239
|
+
agy --print "$(cat "$prompt_path")" --model "$model" "${add_dir_args[@]}" \
|
|
240
|
+
--print-timeout "$PRINT_TIMEOUT" --dangerously-skip-permissions \
|
|
234
241
|
2>> "$log_path" \
|
|
235
242
|
> >(tee -a "$log_path") &
|
|
236
|
-
|
|
243
|
+
agy_pid=$!
|
|
237
244
|
|
|
238
245
|
# Idle watchdog — see `okstra-codex-exec.sh` for the full rationale.
|
|
239
246
|
watchdog_pid=""
|
|
@@ -242,20 +249,20 @@ if (( idle_timeout_secs > 0 )); then
|
|
|
242
249
|
(( poll_interval < 5 )) && poll_interval=5
|
|
243
250
|
(( poll_interval > 30 )) && poll_interval=30
|
|
244
251
|
(
|
|
245
|
-
while kill -0 "$
|
|
252
|
+
while kill -0 "$agy_pid" 2>/dev/null; do
|
|
246
253
|
sleep "$poll_interval"
|
|
247
|
-
kill -0 "$
|
|
254
|
+
kill -0 "$agy_pid" 2>/dev/null || exit 0
|
|
248
255
|
last_mtime=$(stat -f %m "$log_path" 2>/dev/null || stat -c %Y "$log_path" 2>/dev/null || printf '0')
|
|
249
256
|
now=$(date +%s)
|
|
250
257
|
idle=$(( now - last_mtime ))
|
|
251
258
|
if (( idle >= idle_timeout_secs )); then
|
|
252
|
-
printf '\n[okstra wrapper] idle-watchdog: %ds without stdout — terminating
|
|
253
|
-
"$idle" "$
|
|
259
|
+
printf '\n[okstra wrapper] idle-watchdog: %ds without stdout — terminating agy (pid=%d)\n' \
|
|
260
|
+
"$idle" "$agy_pid" >> "$log_path" 2>&1 || true
|
|
254
261
|
python3 "$script_dir/okstra-wrapper-status.py" \
|
|
255
262
|
timeout "$status_path" "$now" "$idle" >>"$log_path" 2>&1 || true
|
|
256
|
-
kill -TERM "$
|
|
263
|
+
kill -TERM "$agy_pid" 2>/dev/null || true
|
|
257
264
|
sleep 5
|
|
258
|
-
kill -KILL "$
|
|
265
|
+
kill -KILL "$agy_pid" 2>/dev/null || true
|
|
259
266
|
exit 0
|
|
260
267
|
fi
|
|
261
268
|
done
|
|
@@ -264,8 +271,8 @@ if (( idle_timeout_secs > 0 )); then
|
|
|
264
271
|
fi
|
|
265
272
|
|
|
266
273
|
set +e
|
|
267
|
-
wait "$
|
|
268
|
-
|
|
274
|
+
wait "$agy_pid"
|
|
275
|
+
agy_exit=$?
|
|
269
276
|
set -e
|
|
270
277
|
|
|
271
278
|
if [[ -n "$watchdog_pid" ]]; then
|
|
@@ -275,4 +282,4 @@ fi
|
|
|
275
282
|
|
|
276
283
|
wait 2>/dev/null || true
|
|
277
284
|
|
|
278
|
-
exit "$
|
|
285
|
+
exit "$agy_exit"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
1
2
|
"""OKSTRA error log helper.
|
|
2
3
|
|
|
3
4
|
Single writer for runs/<task-type>/logs/errors-<task-type>-<seq>.jsonl.
|
|
@@ -17,7 +18,7 @@ PIPE_BUF_BYTES = 4096
|
|
|
17
18
|
ALLOWED_ERROR_TYPES = {"tool-failure", "cli-failure", "contract-violation"}
|
|
18
19
|
ALLOWED_AGENTS = {
|
|
19
20
|
"claude-lead", "claude-worker", "codex-worker",
|
|
20
|
-
"
|
|
21
|
+
"antigravity-worker", "report-writer",
|
|
21
22
|
}
|
|
22
23
|
ALLOWED_AGENT_ROLES = {"lead", "worker", "report-writer"}
|
|
23
24
|
SUPPORTED_SIDECAR_SCHEMA_VERSIONS = {1}
|
|
@@ -21,7 +21,6 @@ from okstra_token_usage import ( # noqa: E402,F401
|
|
|
21
21
|
CODEX_PRICING,
|
|
22
22
|
CODEX_SESSIONS,
|
|
23
23
|
GEMINI_PRICING,
|
|
24
|
-
GEMINI_TMP,
|
|
25
24
|
claude_billable_equivalent,
|
|
26
25
|
claude_cost_usd,
|
|
27
26
|
claude_project_dir,
|
|
@@ -31,9 +30,9 @@ from okstra_token_usage import ( # noqa: E402,F401
|
|
|
31
30
|
collect,
|
|
32
31
|
find_claude_team_sessions,
|
|
33
32
|
find_codex_session,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
find_antigravity_session,
|
|
34
|
+
antigravity_session_total,
|
|
35
|
+
antigravity_cost_usd,
|
|
37
36
|
iter_jsonl,
|
|
38
37
|
na_block,
|
|
39
38
|
populate_and_render,
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
#
|
|
3
3
|
# okstra-trace-cleanup.sh — close tmux panes created during okstra runs.
|
|
4
4
|
#
|
|
5
|
-
# Trace panes are `tail -F` siblings spawned by the codex/
|
|
6
|
-
# (`okstra-codex-exec.sh`, `okstra-
|
|
5
|
+
# Trace panes are `tail -F` siblings spawned by the codex/antigravity wrappers
|
|
6
|
+
# (`okstra-codex-exec.sh`, `okstra-antigravity-exec.sh`). Worker-compute panes are
|
|
7
7
|
# tmux-pane backend siblings. Each wrapper/dispatcher tags the pane it owns with
|
|
8
8
|
# a pane-level user option (`@okstra_trace_run=<RUN_DIR>` or
|
|
9
9
|
# `@okstra_worker_run=<RUN_DIR>`), so panes are found server-wide by tag — no
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# (a) trace panes tagged with this run's dir and
|
|
17
17
|
# (b) worker-agent panes the harness gives to dispatched
|
|
18
18
|
# subagents (`claude-worker` / `codex-worker` /
|
|
19
|
-
# `
|
|
19
|
+
# `antigravity-worker` / `report-writer-worker`), identified
|
|
20
20
|
# by a title allowlist scoped to the LEAD's session. The
|
|
21
21
|
# lead pane is read from `<RUN_DIR>/state/lead-pane.id`
|
|
22
22
|
# (recorded once by the lead in its own foreground pane —
|
|
@@ -139,7 +139,7 @@ collect_okstra_panes() {
|
|
|
139
139
|
[[ -n "$pid" ]] || continue
|
|
140
140
|
[[ "$pid" == "$lead_pane" ]] && continue
|
|
141
141
|
case "$title" in
|
|
142
|
-
*claude-worker*|*codex-worker*|*
|
|
142
|
+
*claude-worker*|*codex-worker*|*antigravity-worker*|*report-writer-worker*)
|
|
143
143
|
panes+=("$pid") ;;
|
|
144
144
|
esac
|
|
145
145
|
done < <(tmux list-panes -s -t "$lead_pane" \
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""okstra-wrapper-status.py — heartbeat sidecar writer for codex/
|
|
2
|
+
"""okstra-wrapper-status.py — heartbeat sidecar writer for codex/antigravity wrappers.
|
|
3
3
|
|
|
4
|
-
The codex/
|
|
4
|
+
The codex/antigravity wrappers (`okstra-codex-exec.sh`, `okstra-antigravity-exec.sh`)
|
|
5
5
|
dispatch a long-running CLI under `Bash(run_in_background: true)` and rely on
|
|
6
6
|
`BashOutput` polling for liveness. That polling stream only carries stdout
|
|
7
7
|
plus a binary `running`/`completed` state. Several recovery decisions need
|
|
@@ -11,7 +11,7 @@ finish?" — so the wrappers write a small JSON sidecar at
|
|
|
11
11
|
|
|
12
12
|
Consumers:
|
|
13
13
|
|
|
14
|
-
* `codex-worker` / `
|
|
14
|
+
* `codex-worker` / `antigravity-worker` step 8c: read `log_path` to capture a
|
|
15
15
|
diagnostic tail when `exit_code == 0` but the canonical Result file is
|
|
16
16
|
absent.
|
|
17
17
|
* Lead: cross-check `started_ts` / `ended_ts` to distinguish "wrapper hung
|
package/runtime/bin/okstra.sh
CHANGED
|
@@ -113,7 +113,7 @@ PY_ARGS=(
|
|
|
113
113
|
[[ -n "${LEAD_MODEL_OVERRIDE-}" ]] && PY_ARGS+=(--lead-model "$LEAD_MODEL_OVERRIDE")
|
|
114
114
|
[[ -n "${CLAUDE_MODEL_OVERRIDE-}" ]] && PY_ARGS+=(--claude-model "$CLAUDE_MODEL_OVERRIDE")
|
|
115
115
|
[[ -n "${CODEX_MODEL_OVERRIDE-}" ]] && PY_ARGS+=(--codex-model "$CODEX_MODEL_OVERRIDE")
|
|
116
|
-
[[ -n "${
|
|
116
|
+
[[ -n "${ANTIGRAVITY_MODEL_OVERRIDE-}" ]] && PY_ARGS+=(--antigravity-model "$ANTIGRAVITY_MODEL_OVERRIDE")
|
|
117
117
|
[[ -n "${REPORT_WRITER_MODEL_OVERRIDE-}" ]] && PY_ARGS+=(--report-writer-model "$REPORT_WRITER_MODEL_OVERRIDE")
|
|
118
118
|
[[ -n "${LEAD_RUNTIME-}" ]] && PY_ARGS+=(--lead-runtime "$LEAD_RUNTIME")
|
|
119
119
|
[[ -n "${EXECUTOR_OVERRIDE-}" ]] && PY_ARGS+=(--executor "$EXECUTOR_OVERRIDE")
|
|
@@ -55,7 +55,7 @@ Emit one `PROGRESS: <phase-id> <verb-phrase>` line as plain user-facing text at
|
|
|
55
55
|
- Worker error sidecars (absolute):
|
|
56
56
|
- Claude worker: `{{CLAUDE_WORKER_ERRORS_SIDECAR_PATH}}`
|
|
57
57
|
- Codex worker: `{{CODEX_WORKER_ERRORS_SIDECAR_PATH}}`
|
|
58
|
-
-
|
|
58
|
+
- Antigravity worker: `{{ANTIGRAVITY_WORKER_ERRORS_SIDECAR_PATH}}`
|
|
59
59
|
- Report writer worker: `{{REPORT_WRITER_WORKER_ERRORS_SIDECAR_PATH}}`
|
|
60
60
|
- When dispatching any worker you MUST inject **two header lines** into the dispatch prompt body so the worker subagent can record errors without guessing paths:
|
|
61
61
|
- `**Errors log path:** <absolute run-level errors log path>`
|
|
@@ -79,8 +79,8 @@ Emit one `PROGRESS: <phase-id> <verb-phrase>` line as plain user-facing text at
|
|
|
79
79
|
|
|
80
80
|
{{AVAILABLE_MCP_SERVERS}}
|
|
81
81
|
- The full usage policy and per-phase rules live in the analysis packet's `Available MCP Servers` extract. Inject only the one-line pointer below into each analysis-worker prompt: `**MCP servers:** follow the analysis packet's "Available MCP Servers" section (already in your Required reading).`
|
|
82
|
-
- **Invocation rule (forward to every worker prompt)**: MCP tools are addressed by their tool name through the host's tool interface — **never via `Bash`**. Claude-side workers call the tool directly (e.g. `mcp__<server>__<tool>`). Codex/
|
|
83
|
-
- Codex worker and
|
|
82
|
+
- **Invocation rule (forward to every worker prompt)**: MCP tools are addressed by their tool name through the host's tool interface — **never via `Bash`**. Claude-side workers call the tool directly (e.g. `mcp__<server>__<tool>`). Codex/Antigravity workers call through their CLI's own MCP transport (e.g. `codex mcp call ...`). Running the tool name as a shell command is a contract violation and will always fail regardless of permission grants.
|
|
83
|
+
- Codex worker and Antigravity worker run external CLIs; they can only use these MCP servers if their own CLI configs mirror them. If not, instruct the worker to record `MCP not available in this CLI` in its `Missing Information or Assumptions` block rather than guessing or shell-falling-back.
|
|
84
84
|
- MCP queries are evidence-grade. Cite server, table, and the SELECT used in worker output. MCP must NOT be used as a write path in any phase, including `implementation`.
|
|
85
85
|
|
|
86
86
|
## Clarification Response Carried In
|
|
@@ -89,7 +89,7 @@ After identifying the task root in `task-manifest.json`, derive all paths accord
|
|
|
89
89
|
│ └── worker-results/
|
|
90
90
|
│ ├── claude-worker-<task-type>-<seq>.md
|
|
91
91
|
│ ├── codex-worker-<task-type>-<seq>.md
|
|
92
|
-
│ ├──
|
|
92
|
+
│ ├── antigravity-worker-<task-type>-<seq>.md
|
|
93
93
|
│ └── report-writer-worker-<task-type>-<seq>.md
|
|
94
94
|
└── history/
|
|
95
95
|
└── timeline.json
|
|
@@ -163,7 +163,7 @@ A reverify dispatch that returns a **terminal non-result** (`timeout`, `error`,
|
|
|
163
163
|
Rules:
|
|
164
164
|
|
|
165
165
|
1. For each affected finding, append a `votes[W].verdict = "verification-error"` entry instead of `disagree`, plus the wrapper's captured exit reason in `votes[W].explanation`.
|
|
166
|
-
2. Record one event per failed dispatch via `okstra error-log append-observed --error-type cli-failure --agent <worker> ...` (the worker wrapper does this for Codex/
|
|
166
|
+
2. Record one event per failed dispatch via `okstra error-log append-observed --error-type cli-failure --agent <worker> ...` (the worker wrapper does this for Codex/Antigravity; for Claude worker timeouts the lead does it).
|
|
167
167
|
3. Add an entry to the round's `skippedWorkers[]` with `{worker: <W>, reason: "dispatch-non-result", terminalStatus: <timeout|error|not-run>}`.
|
|
168
168
|
4. If at least one dispatch was issued AND all reverify dispatches in a round terminate as non-result (mirroring the pseudocode's `len(dispatches) > 0` guard), the round is treated as gate-closed: write `round2SkippedReason: "all-reverify-non-result"` (even if the round in question is round 1 — i.e. round 2 never runs because round 1 produced no usable votes), record one `contract-violation` event per non-result dispatch, and exit the WHILE loop.
|
|
169
169
|
5. Section 6 (Specialization Lens) of a worker output is OUT of convergence scope per "Convergence scope" above — its absence is NEVER a `verification-error`.
|
|
@@ -266,7 +266,7 @@ Agent(
|
|
|
266
266
|
|
|
267
267
|
- Agent Teams mode: Spawn within an existing team
|
|
268
268
|
- Fallback mode: Spawn with `run_in_background: true` and no `team_name`
|
|
269
|
-
- CLI (Codex /
|
|
269
|
+
- CLI (Codex / Antigravity) worker: inject `**Pane role:** worker-reverify-r<N>` (the Agent `name` minus the `<cli>-` prefix) into the reverify prompt body so the tmux trace pane reads `<cli>-worker-reverify-r<N>` per [okstra-lead-contract](./okstra-lead-contract.md) "Agent `name` on dispatch".
|
|
270
270
|
|
|
271
271
|
For `tmux-pane` backend runs, do not use the Agent snippet. For each reverify round, write a jobs file at `runs/<task-type>/state/reverify-jobs-r<N>-<task-type>-<seq>.json` with `dispatchKind: "reverify-r<N>"` and worker entries containing `workerId`, `provider`, `role` (set to `worker-reverify-r<N>` for the pane title), `modelExecutionValue`, `promptPath`, `resultPath`, `workerResultPath`, and `completionPaths`; then run `okstra team dispatch --project-root <dir> --run-manifest <path> --dispatch-kind reverify-r<N> --jobs-file <jobs-file>` followed by `okstra team await --project-root <dir> --run-manifest <path>`.
|
|
272
272
|
|
|
@@ -293,7 +293,7 @@ Assigned worker prompt history path: <Project Root>/<Prompt History Path>
|
|
|
293
293
|
|
|
294
294
|
If none of the three is available, **abort the reverify dispatch for that role** and record a `contract-violation` event via `okstra error-log append-observed`. Do NOT guess, do NOT fall back to training-data defaults — for codex this would silently produce `o4-mini` instead of the assigned `gpt-5.5`-class model, which is a real bug class observed in production.
|
|
295
295
|
|
|
296
|
-
For Codex/
|
|
296
|
+
For Codex/Antigravity wrapper subagents, the `**Model:** <role>, <modelExecutionValue>` line is what their wrapper extracts to pass into the underlying CLI's `--model` flag. Omitting it forces the wrapper to fall back to its own training-data knowledge of the CLI's historical default.
|
|
297
297
|
|
|
298
298
|
### Reverify prompt: required-reading suppression (BLOCKING)
|
|
299
299
|
|
|
@@ -456,11 +456,11 @@ Save it to `runs/<task-type>/state/convergence-<task-type>-<seq>.json`.
|
|
|
456
456
|
"round": 1,
|
|
457
457
|
"votes": {
|
|
458
458
|
"codex-worker": { "verdict": "agree", "disagreeBasis": null, "explanation": "<brief>" },
|
|
459
|
-
"
|
|
459
|
+
"antigravity-worker": { "verdict": "supplement", "explanation": "<brief>" }
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
],
|
|
463
|
-
"consensusWorkers": ["claude-worker", "codex-worker", "
|
|
463
|
+
"consensusWorkers": ["claude-worker", "codex-worker", "antigravity-worker"],
|
|
464
464
|
"dissentingWorkers": []
|
|
465
465
|
}
|
|
466
466
|
],
|
|
@@ -472,7 +472,7 @@ Save it to `runs/<task-type>/state/convergence-<task-type>-<seq>.json`.
|
|
|
472
472
|
"carriedForwardCount": 0,
|
|
473
473
|
"dispatches": [
|
|
474
474
|
{ "worker": "codex-worker", "status": "completed", "durationMs": 184221 },
|
|
475
|
-
{ "worker": "
|
|
475
|
+
{ "worker": "antigravity-worker", "status": "completed", "durationMs": 201337 }
|
|
476
476
|
],
|
|
477
477
|
"skippedWorkers": [
|
|
478
478
|
{ "worker": "claude-worker", "reason": "no items to verify" }
|
|
@@ -524,7 +524,7 @@ The critic input is the Round 0 consolidated finding list. Reverify rounds only
|
|
|
524
524
|
- **Gap verification + merge**: only after BOTH the finding-convergence loop has exited AND the critic result is collected, and BEFORE the Phase 6 report-writer dispatch. If the loop exited `aborted-non-result`, do NOT dispatch a gap-verification round — surface the gaps as unverified `clarification` items per §"Gap verification" and record that fact.
|
|
525
525
|
|
|
526
526
|
### Dispatch (reused worker)
|
|
527
|
-
Dispatch ONE pass to the `config.critic.provider`'s existing subagent (`claude-worker` / `codex-worker` / `
|
|
527
|
+
Dispatch ONE pass to the `config.critic.provider`'s existing subagent (`claude-worker` / `codex-worker` / `antigravity-worker`) with `model = config.critic.modelExecutionValue` — no new agent type, `name: "<provider>-worker-critic"`. If `config.critic.modelExecutionValue` is null/empty (model could not be resolved), skip the critic pass and record `critic-skipped: model-unresolved` in the convergence state rather than dispatching with no model. For a CLI (Codex / Antigravity) critic dispatch, inject `**Pane role:** worker-critic` into the prompt body so the trace pane reads `<cli>-worker-critic` per [okstra-lead-contract](./okstra-lead-contract.md) "Agent `name` on dispatch". Result path: `runs/<task-type>/worker-results/<provider>-critic-<task-type>-<seq>.md`. The critic prompt seeds the consolidated findings and asks ONLY for coverage gaps:
|
|
528
528
|
|
|
529
529
|
```
|
|
530
530
|
You are the coverage critic for <task-key>. Below are the consolidated findings
|
|
@@ -685,7 +685,7 @@ Plan-body verification stays **lightweight** even under this posture — the `ve
|
|
|
685
685
|
### Round protocol (single round at default `maxRounds=1`)
|
|
686
686
|
|
|
687
687
|
1. Lead parses the report-writer draft and extracts the `P-*` plan items.
|
|
688
|
-
2. For each analyser worker in the roster (`claude`, `codex`, and `
|
|
688
|
+
2. For each analyser worker in the roster (`claude`, `codex`, and `antigravity` if opted in), lead constructs a reverify prompt using the template in §"Plan-body reverify prompt" below.
|
|
689
689
|
3. Dispatch uses the same wrapper infrastructure as finding convergence. The `--role-slug` is `<role>-plan-verify-r<N>`. Result file path: `runs/<task-type>/worker-results/<role-slug>-plan-verify-r<N>-implementation-planning-<seq>.md`.
|
|
690
690
|
4. After all dispatches return, lead aggregates verdicts per `P-*` item across workers and classifies each:
|
|
691
691
|
- `full-consensus` — all participating analysers `AGREE` (SUPPLEMENT counts as agree on the item itself).
|