okstra 0.85.0 → 0.87.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 (101) hide show
  1. package/docs/kr/architecture.md +27 -27
  2. package/docs/kr/cli.md +21 -21
  3. package/docs/kr/performance-improvement-plan-v2.md +4 -4
  4. package/docs/kr/performance-improvement-plan.md +3 -3
  5. package/docs/project-structure-overview.md +6 -6
  6. package/docs/superpowers/plans/2026-06-17-okstra-error-report.md +724 -0
  7. package/docs/superpowers/specs/2026-06-17-okstra-error-report-design.md +123 -0
  8. package/docs/task-process/error-analysis.md +1 -1
  9. package/docs/task-process/final-verification.md +4 -4
  10. package/docs/task-process/implementation-planning.md +2 -2
  11. package/docs/task-process/implementation.md +3 -3
  12. package/docs/task-process/requirements-discovery.md +2 -2
  13. package/package.json +1 -1
  14. package/runtime/BUILD.json +2 -2
  15. package/runtime/agents/workers/{gemini-worker.md → antigravity-worker.md} +56 -56
  16. package/runtime/agents/workers/claude-worker.md +2 -2
  17. package/runtime/agents/workers/codex-worker.md +1 -1
  18. package/runtime/agents/workers/report-writer-worker.md +2 -2
  19. package/runtime/bin/lib/okstra/cli.sh +3 -3
  20. package/runtime/bin/lib/okstra/globals.sh +8 -8
  21. package/runtime/bin/lib/okstra/interactive.sh +1 -1
  22. package/runtime/bin/lib/okstra/usage.sh +7 -7
  23. package/runtime/bin/lib/okstra-ctl/cmd-reconcile.sh +5 -3
  24. package/runtime/bin/lib/okstra-ctl/prepare.sh +4 -2
  25. package/runtime/bin/{okstra-gemini-exec.sh → okstra-antigravity-exec.sh} +67 -60
  26. package/runtime/bin/okstra-error-log.py +2 -1
  27. package/runtime/bin/okstra-token-usage.py +3 -4
  28. package/runtime/bin/okstra-trace-cleanup.sh +4 -4
  29. package/runtime/bin/okstra-wrapper-status.py +3 -3
  30. package/runtime/bin/okstra.sh +1 -1
  31. package/runtime/prompts/launch.template.md +3 -3
  32. package/runtime/prompts/lead/context-loader.md +1 -1
  33. package/runtime/prompts/lead/convergence.md +8 -8
  34. package/runtime/prompts/lead/okstra-lead-contract.md +15 -15
  35. package/runtime/prompts/lead/report-writer.md +6 -6
  36. package/runtime/prompts/lead/team-contract.md +31 -31
  37. package/runtime/prompts/profiles/_coding-conventions-preflight.md +2 -2
  38. package/runtime/prompts/profiles/_common-contract.md +7 -7
  39. package/runtime/prompts/profiles/_implementation-deliverable.md +1 -1
  40. package/runtime/prompts/profiles/_implementation-executor.md +6 -6
  41. package/runtime/prompts/profiles/_implementation-verifier.md +4 -4
  42. package/runtime/prompts/profiles/_stage-discipline.md +1 -1
  43. package/runtime/prompts/profiles/error-analysis.md +1 -1
  44. package/runtime/prompts/profiles/final-verification.md +1 -1
  45. package/runtime/prompts/profiles/forbidden-actions.json +2 -2
  46. package/runtime/prompts/profiles/implementation-planning.md +1 -1
  47. package/runtime/prompts/profiles/implementation.md +3 -3
  48. package/runtime/prompts/profiles/improvement-discovery.md +3 -3
  49. package/runtime/prompts/profiles/requirements-discovery.md +1 -1
  50. package/runtime/prompts/wizard/prompts.ko.json +9 -5
  51. package/runtime/python/okstra_ctl/__init__.py +2 -0
  52. package/runtime/python/okstra_ctl/analysis_packet.py +1 -1
  53. package/runtime/python/okstra_ctl/clarification_items.py +17 -7
  54. package/runtime/python/okstra_ctl/codex_dispatch.py +2 -2
  55. package/runtime/python/okstra_ctl/context_cost.py +10 -44
  56. package/runtime/python/okstra_ctl/doctor.py +1 -1
  57. package/runtime/python/okstra_ctl/error_report.py +185 -0
  58. package/runtime/python/okstra_ctl/improvement_lenses.py +1 -1
  59. package/runtime/python/okstra_ctl/models.py +10 -10
  60. package/runtime/python/okstra_ctl/paths.py +9 -9
  61. package/runtime/python/okstra_ctl/reconcile.py +74 -11
  62. package/runtime/python/okstra_ctl/render.py +21 -21
  63. package/runtime/python/okstra_ctl/run.py +16 -16
  64. package/runtime/python/okstra_ctl/run_context.py +1 -1
  65. package/runtime/python/okstra_ctl/seeding.py +1 -1
  66. package/runtime/python/okstra_ctl/task_target.py +44 -0
  67. package/runtime/python/okstra_ctl/team.py +1 -1
  68. package/runtime/python/okstra_ctl/wizard.py +55 -30
  69. package/runtime/python/okstra_ctl/workers.py +3 -3
  70. package/runtime/python/okstra_ctl/workflow.py +1 -1
  71. package/runtime/python/okstra_ctl/worktree.py +1 -1
  72. package/runtime/python/okstra_token_usage/__init__.py +2 -3
  73. package/runtime/python/okstra_token_usage/antigravity.py +26 -0
  74. package/runtime/python/okstra_token_usage/blocks.py +4 -0
  75. package/runtime/python/okstra_token_usage/collect.py +20 -15
  76. package/runtime/python/okstra_token_usage/paths.py +0 -1
  77. package/runtime/python/okstra_token_usage/pricing.py +6 -3
  78. package/runtime/schemas/final-report-v1.0.schema.json +1 -1
  79. package/runtime/skills/okstra-brief/SKILL.md +1 -1
  80. package/runtime/skills/okstra-inspect/SKILL.md +85 -21
  81. package/runtime/skills/okstra-run/SKILL.md +3 -3
  82. package/runtime/skills/okstra-setup/SKILL.md +2 -2
  83. package/runtime/templates/prd/brief.template.md +2 -2
  84. package/runtime/templates/reports/i18n/en.json +1 -1
  85. package/runtime/templates/reports/i18n/ko.json +1 -1
  86. package/runtime/templates/reports/settings.template.json +2 -2
  87. package/runtime/templates/reports/task-brief.template.md +2 -2
  88. package/runtime/templates/worker-prompt-preamble.md +7 -7
  89. package/runtime/validators/forbidden_actions.py +1 -1
  90. package/runtime/validators/lib/fixtures.sh +3 -3
  91. package/runtime/validators/lib/validate-assets.sh +1 -1
  92. package/runtime/validators/validate-run.py +8 -8
  93. package/src/cli-registry.mjs +7 -0
  94. package/src/codex-dispatch.mjs +3 -3
  95. package/src/codex-run.mjs +2 -2
  96. package/src/doctor.mjs +1 -1
  97. package/src/error-report.mjs +27 -0
  98. package/src/install.mjs +1 -1
  99. package/src/render-bundle.mjs +1 -1
  100. package/src/uninstall.mjs +2 -2
  101. 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
- GEMINI_MODEL_OVERRIDE=""
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
- GEMINI_WORKER_PROMPT_FILE=""
86
- GEMINI_WORKER_PROMPT_RELATIVE_PATH=""
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
- GEMINI_WORKER_RESULT_FILE=""
107
- GEMINI_WORKER_RESULT_RELATIVE_PATH=""
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
- GEMINI_WORKER_MODEL=""
158
- GEMINI_WORKER_MODEL_EXECUTION_VALUE=""
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
- DEFAULT_GEMINI_WORKER_MODEL_NAME="${OKSTRA_DEFAULT_GEMINI_MODEL:-auto}"
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("--gemini-model", model(inputs.get("geminiModel")))
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>] [--gemini-model <model>] [--report-writer-model <model>] [--lead-runtime claude-code|codex] [--executor claude|codex|gemini] [--critic off|claude|codex|gemini] [--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>]
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
- (Gemini worker is optional; add \`gemini\` explicitly, e.g. --workers claude,codex,gemini,report-writer)
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
- --gemini-model Model for Gemini worker. Default: OKSTRA_DEFAULT_GEMINI_MODEL or auto
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 | gemini. Default: OKSTRA_DEFAULT_EXECUTOR or claude.
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 | gemini.
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
- Gemini worker: OKSTRA_DEFAULT_GEMINI_MODEL or auto
129
- Implementation executor: OKSTRA_DEFAULT_EXECUTOR or claude (one of: claude | codex | gemini)
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
- reconcile_active(Path(os.environ["OKSTRA_HOME_RESOLVED"]),
24
- project=None if target == "all" else target)
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
- reconcile_active(Path(os.environ["OKSTRA_HOME_RESOLVED"]))
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-gemini-exec.sh — wrapper around `gemini -p -` for okstra gemini-worker
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 (stdin/stderr redirects, pipes).
6
- # `gemini -p - -m <model> -o text --include-directories <root> < <prompt-path> 2>/dev/null`
7
- # therefore triggers a permission prompt every dispatch even when `Bash(gemini:*)`
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-gemini-exec.sh:*)
13
+ # Bash($HOME/.okstra/bin/okstra-antigravity-exec.sh:*)
14
14
  #
15
15
  # Usage:
16
- # okstra-gemini-exec.sh <project-root> <model-execution-value> <prompt-path> [worktree-path] [role] [idle-timeout-seconds]
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 `gemini` is SIGTERM'd (then
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 appended to gemini's
32
- # `--include-directories` list (comma-separated) so the model can see and
33
- # operate on the worktree alongside the primary workspace. When omitted or
34
- # empty, only project-root is included (existing analysis-phase behavior).
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 appends it to `--include-directories`. If
42
- # resolution fails (not a linked worktree, or git unavailable), the extra
43
- # include is silently omitted.
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-gemini-exec: idle-timeout-seconds must be a non-negative integer: %q\n' "$idle_timeout_secs" >&2
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-gemini-exec: project-root is missing or not a directory: %q\n' "$project_root" >&2
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-gemini-exec: model-execution-value is empty\n' >&2
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-gemini-exec: prompt-path is missing or not a file: %q\n' "$prompt_path" >&2
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 gemini >/dev/null 2>&1; then
81
- printf 'okstra-gemini-exec: gemini CLI is not installed on PATH\n' >&2
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-gemini-exec: worktree-path was provided but is not a directory: %q\n' "$worktree_path" >&2
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
- include_dirs="$project_root"
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
- include_dirs="$project_root,$worktree_path"
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
- include_dirs="$include_dirs,$common_git_dir"
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. The gemini CLI streams
114
- # its progress over stdout/stderr, but the caller (gemini-worker subagent)
115
- # only polls `BashOutput` on a 60s cadence — so without a sideband, a long
116
- # implementation run produces no visible output until the very end. Mirroring
117
- # both streams into a file alongside the prompt lets the human operator
118
- # `tail -f <log-path>` from a separate pane and watch progress in real time,
119
- # and leaves a post-mortem record on disk.
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. `gemini-worker` step 8c reads `log_path` to capture a diagnostic
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 `gemini-<role>`; the sibling trace
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 `gemini-` prefix (e.g. `worker-reverify-r1`, `executor`), so the
160
- # pane title equals the FleetView teammate name instead of a generic `worker`.
161
- pane_label="gemini-${role}"
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 gemini dispatches are not
195
- # implementation-specific. Title `gemini-<role>-tail` so the operator
196
- # can pair it with its caller pane (`gemini-<role>`). The split is
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
- # stdin redirect, stderr capture, and pipeline mirroring are intentionally
219
- # inside the wrapper — this is the entire reason this script exists. Gemini
220
- # CLI has no `--cd` flag, so workspace correctness is anchored via
221
- # `--include-directories` plus the Project Root referenced in the prompt
222
- # body itself.
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 gemini itself stays a single addressable PID we
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 — mirrors the prior `2>/dev/null`
230
- # contract of keeping the wrapper's stderr stream clean.
231
- # exit: gemini's own exit code is preserved by `wait`.
232
- gemini -p - -m "$model" -o text --include-directories "$include_dirs" \
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
- gemini_pid=$!
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 "$gemini_pid" 2>/dev/null; do
252
+ while kill -0 "$agy_pid" 2>/dev/null; do
246
253
  sleep "$poll_interval"
247
- kill -0 "$gemini_pid" 2>/dev/null || exit 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 gemini (pid=%d)\n' \
253
- "$idle" "$gemini_pid" >> "$log_path" 2>&1 || true
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 "$gemini_pid" 2>/dev/null || true
263
+ kill -TERM "$agy_pid" 2>/dev/null || true
257
264
  sleep 5
258
- kill -KILL "$gemini_pid" 2>/dev/null || true
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 "$gemini_pid"
268
- gemini_exit=$?
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 "$gemini_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
- "gemini-worker", "report-writer",
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
- find_gemini_session,
35
- gemini_cost_usd,
36
- gemini_session_total,
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/gemini wrappers
6
- # (`okstra-codex-exec.sh`, `okstra-gemini-exec.sh`). Worker-compute panes are
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
- # `gemini-worker` / `report-writer-worker`), identified
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*|*gemini-worker*|*report-writer-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/gemini wrappers.
2
+ """okstra-wrapper-status.py — heartbeat sidecar writer for codex/antigravity wrappers.
3
3
 
4
- The codex/gemini wrappers (`okstra-codex-exec.sh`, `okstra-gemini-exec.sh`)
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` / `gemini-worker` step 8c: read `log_path` to capture a
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
@@ -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 "${GEMINI_MODEL_OVERRIDE-}" ]] && PY_ARGS+=(--gemini-model "$GEMINI_MODEL_OVERRIDE")
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
- - Gemini worker: `{{GEMINI_WORKER_ERRORS_SIDECAR_PATH}}`
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/Gemini 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 Gemini 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.
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
- │ ├── gemini-worker-<task-type>-<seq>.md
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/Gemini; for Claude worker timeouts the lead does it).
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 / Gemini) 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".
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/Gemini 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.
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
- "gemini-worker": { "verdict": "supplement", "explanation": "<brief>" }
459
+ "antigravity-worker": { "verdict": "supplement", "explanation": "<brief>" }
460
460
  }
461
461
  }
462
462
  ],
463
- "consensusWorkers": ["claude-worker", "codex-worker", "gemini-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": "gemini-worker", "status": "completed", "durationMs": 201337 }
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` / `gemini-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 / Gemini) 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:
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 `gemini` if opted in), lead constructs a reverify prompt using the template in §"Plan-body reverify prompt" below.
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).