@sabaiway/agent-workflow-kit 12.0.0 → 12.2.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 (36) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +2 -1
  3. package/SKILL.md +5 -1
  4. package/bridges/antigravity-cli-bridge/SKILL.md +16 -13
  5. package/bridges/antigravity-cli-bridge/bin/agy-review.sh +6 -5
  6. package/bridges/antigravity-cli-bridge/bin/agy-review.test.mjs +5 -5
  7. package/bridges/antigravity-cli-bridge/bin/agy.sh +4 -4
  8. package/bridges/antigravity-cli-bridge/bin/agy.test.mjs +2 -2
  9. package/bridges/antigravity-cli-bridge/capability.json +3 -3
  10. package/bridges/antigravity-cli-bridge/references/driving-agy.md +6 -5
  11. package/bridges/antigravity-cli-bridge/references/models-and-flags.md +14 -11
  12. package/bridges/codex-cli-bridge/SKILL.md +14 -12
  13. package/bridges/codex-cli-bridge/bin/codex-exec.sh +16 -15
  14. package/bridges/codex-cli-bridge/bin/codex-exec.test.mjs +9 -9
  15. package/bridges/codex-cli-bridge/bin/codex-review.sh +14 -13
  16. package/bridges/codex-cli-bridge/bin/codex-review.test.mjs +8 -8
  17. package/bridges/codex-cli-bridge/capability.json +4 -4
  18. package/bridges/codex-cli-bridge/references/driving-codex.md +2 -2
  19. package/bridges/codex-cli-bridge/references/sandbox-and-flags.md +6 -6
  20. package/capability.json +1 -1
  21. package/package.json +1 -1
  22. package/references/modes/bridge-settings.md +2 -2
  23. package/references/modes/now.md +30 -0
  24. package/tools/bridge-settings.mjs +1 -1
  25. package/tools/commands.mjs +7 -0
  26. package/tools/feedback-record.mjs +6 -2
  27. package/tools/now-cli.mjs +104 -0
  28. package/tools/now-facts.mjs +67 -0
  29. package/tools/now-plan-facts.mjs +129 -0
  30. package/tools/now-render.mjs +162 -0
  31. package/tools/now-status.mjs +145 -0
  32. package/tools/plan-shape-facts.mjs +1 -1
  33. package/tools/queue-audit-cli.mjs +17 -10
  34. package/tools/queue-audit-rows.mjs +98 -18
  35. package/tools/queue-audit.mjs +58 -12
  36. package/tools/queue-row-name.mjs +149 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,80 @@ Semantically versioned ([semver](https://semver.org)), newest first. The `versio
4
4
  is the current release. `upgrade` mode reads a project's `docs/ai/.workflow-version` and applies
5
5
  every `migrations/<version>-<slug>.md` newer than it, in semver order.
6
6
 
7
+ ## 12.2.0 — the bundled agy bridge defaults to Gemini 3.8 Flash (High) (AD-136; antigravity-cli-bridge 5.7.0)
8
+
9
+ **MINOR: a default moved, nothing was removed.** The kit bundles the agy bridge mirror, so the bridge's pin move rides
10
+ this release; no kit tool changed behaviour.
11
+
12
+ - **`Gemini 3.8 Flash (High)` is the bridge default for both roles** — `agy-run` and `agy-review` — and joins the review
13
+ wrapper's frontier set. The string is what `agy models` on the installed CLI (1.1.28, probed 2026-09-09) prints; a model
14
+ display string is matched exactly, so a stale default is a dispatch that refuses before it spends anything (AD-095).
15
+ `Gemini 3.7 Flash (High)` stays in the frontier set: a host that pins it explicitly keeps an advisory-silent council
16
+ review. Any model remains selectable through `AGY_MODEL`; the sub-frontier advisory is still a warning, never a gate.
17
+ - **The catalog tables gain the three 3.8 rows**, enumerated individually, in the skill, the model reference and the
18
+ driving playbook; the wrapper's header inventory names the 3.8 family. No row is removed.
19
+ - **The posture render follows the pin.** The status line and the D5 posture footer read the bundled manifest, so they
20
+ now print `agy model=Gemini 3.8 Flash (High)`; the posture-parity test pins the pair.
21
+
22
+ ## 12.1.0 — a queue row carries a plain name a person can read, and `now` renders where the work stands from the evidence, never from the plan's own text (AD-134)
23
+
24
+ **MINOR: two additive surfaces, one series, one new refusal.** The name judge is advisory until a gate line opts in, and `now` is
25
+ a new read-only command beside `status`. The one behaviour a deployed `queue-audit --check` line can see change: a heading a row
26
+ swallows (an ATX line indented one to three spaces inside a row's body) now refuses with exit 2 and both one-keystroke corrections,
27
+ where the audit used to scope around it silently and misjudge the rows after it — a document the corpus never writes.
28
+
29
+ **The name judge (plan 1 of the series, landed repo-only in `da196b9`).** `tools/queue-row-name.mjs` cuts a row's display
30
+ title at the id the row PRESENTS as one and judges the rest as a sentence: three or more words, one of the first three carrying
31
+ a lower-case letter, a letter somewhere, never the id restated, never a run of the row's own status segments. `titleOf` returns
32
+ `{ text, name, id, judged, endLine }` from ONE parse and every `auditQueue` row now carries `name`, `id`, `nameFindings` and
33
+ `buckets` — the full line-numbered heading LINEAGE above the row, computed once inside the one parser.
34
+ `queue-audit-cli --check --require-names` is the opt-in that turns a name finding into exit 1; without it every finding is a
35
+ note and a gate line written before this release keeps its verdict byte for byte. A heading a row swallows — an ATX line
36
+ indented one to three spaces inside a row's body — is REFUSED with its line and both one-keystroke corrections, because the
37
+ document and the row scan read that line two ways and the corpus writes none. Two classifier defects fixed red-first: a live
38
+ marker counts at a segment head or wherever dated, and a record prefix owes an adjacent date at every segment head but the title's; `feedback-record`'s
39
+ row writer puts the claim sentence ahead of the id so the kit passes the gate it offers. Measured over this repo's queue: the
40
+ shipped judge reports findings on 165 of the 247 work-carrying rows of `## Pending / backlog` before the migration, and the migration moved no class cell.
41
+
42
+ **`now` (plan 2).** `/agent-workflow-kit now` — `node tools/now-cli.mjs --dir <project> [--format plain|ansi|json | --json]` —
43
+ renders four blocks: **NOW** (every plan `plansInFlight` returns, its derived phase, the current and the next step, the tree
44
+ fingerprint, the per-backend review verdict, the final receipt and the red-proof currency from `buildSummaryState`), **STEPS**
45
+ (the ledger rows of each plan, one status each), **QUEUE** (every work-carrying row of `docs/plans/queue.md` folded under the heading PATH it
46
+ carries, per-bucket per-class counts over all five classes, names never ids — an unnamed row prints `unnamed (line N)`; position is called priority
47
+ ONLY in a bucket whose path passes through `## Pending / backlog`, every other bucket is archive), **CAMPAIGN** (the source-size
48
+ practice's figures and config state; an absent opt-in config is a rendered state). The contract is `docs/ai/specs/kit/now.md`
49
+ (live, S1–S10 bound). Its red line: a status is a function of the row's (path, verb) pair and the evidence at that path — the
50
+ path fact, the changed set (ONE cached `diff --cached --name-only -z --no-renames`, both sides of a rename listed, then
51
+ `computeWorkingState`'s unstaged and untracked
52
+ sets, then the path fact; a path in both staged and unstaged is the named disagreement), and the exclusion fact (ONE cached
53
+ `check-ignore -z --stdin`) — and the row's prose moves none: a checked box or a terminal marker outside quotation is a CLAIM
54
+ printed beside the evidence-derived status wherever the two disagree. Four statuses, a closed set (`landed`, `in progress`, `pending`, `unjudged`); three
55
+ annotations (claim, over-budget anomaly, a red-proof bound to the row's path at the current base). A present, clean `modify`
56
+ row is `unjudged` and the render names WHICH fact is missing — `excluded from git here, no changed-set evidence` or `no
57
+ base-motion reader` — never `landed`. A sweep row (`dir/**`, `modify` only) is judged as a SET: present when its expansion on disk is non-empty, changed when
58
+ its pattern matches any path of a changed set (a deleted member included), excluded only when every member is. A git-dir
59
+ store the summary cannot trust (a malformed receipts or evidence line) withholds the tree line with the store's own cause
60
+ while every plan still renders; the final-run line names the receipt's verdict and gate count before its coverage token.
61
+ Every status line carries its evidence source. The command writes nothing in any state:
62
+ every git query it adds runs under `GIT_OPTIONAL_LOCKS=0`, and the suite proves a recursive content hash of `.git` identical
63
+ before and after a run. Exit 0 whenever anything rendered (a WITHHELD block with its cause included), 1 when nothing did (a
64
+ `--dir` that is not a git work tree), 2 for usage. Five modules — `now-status.mjs` (pure rules), `now-plan-facts.mjs`,
65
+ `now-facts.mjs` (the IO shell), `now-render.mjs`, `now-cli.mjs` — registered in the catalog (Inspect, read-only), `SKILL.md`,
66
+ `references/modes/now.md` and the README; the tarball pin counts 294. Stated residual: no reader in this family tells a
67
+ tracked, unmodified file a plan already rewrote from one it never touched, so STEPS is complete when the base-motion reader
68
+ lands; the write-nothing claim is proved dynamically, the structural read-graph proof waits on the core-evidence decomposition.
69
+
70
+ **Bundled codex bridge 3.8.0 — the pin moves to `gpt-6-astra` at effort `high` (AD-135).** Both wrappers pin the model
71
+ and the effort the maintainer chose; the quality-first guard stays a pin-integrity guard and now refuses `xhigh` exactly as it
72
+ refuses `low` — every shipped sentence that called the pin "the maximum effort" says "the pinned effort", in the wrappers,
73
+ the manifest `posture`, the bridge docs and the kit surfaces composed from the manifest (`recipes --status-line`,
74
+ `bridge-settings`, `procedures`). The Fast tier stays a consented per-host knob (AD-043); its copy carries the codex
75
+ catalog's own words for gpt-6-astra ("2x speed, increased usage", cache fetched 2026-09-05, no credit-rate figure stated)
76
+ and the sol-era figures (~1.5x speed, 2.5x credit rate, probed 2026-07-05) are retired from every reader. The tier caveat
77
+ still rides every render (`SPEND KNOB`). Version anchors: `capability.json`, `SKILL.md`, both `AW_BRIDGE_VERSION`
78
+ lines; the kit mirror is byte-equal to the canon. A host that arms `CODEX_SERVICE_TIER=priority` runs gpt-6-astra /
79
+ high / priority.
80
+
7
81
  ## 12.0.0 — the reader mirror refuses an open-list clause, the outgoing reader becomes a prior, the consult line names the second case and the lens walks around every check (AD-133)
8
82
 
9
83
  **MAJOR by the AD-117 class.** `references/scripts/spec-schema.mjs` and its test are the memory 8.0.0 bodies
package/README.md CHANGED
@@ -232,6 +232,7 @@ file), or run the guarded `/agent-workflow-kit uninstall`.
232
232
  | `/agent-workflow-kit gates` | any time | **project gate runner** — runs the verification commands **your project itself declares** in `docs/ai/gates.json` (seeded at deploy; hand-editable `{ id, title, cmd }` entries plus the optional boolean `lcovProducer`, each `cmd` one bash line) as one batch: a per-gate **PASS/FAIL table** + one machine-readable summary line, exit 0 iff all green; a failing gate's own output is shown verbatim; `--only <id>` re-runs one. Honest distinct outcomes for a missing / empty / malformed declaration — never a silent green. The runner writes nothing **by default** and never commits — opt-in `--final` runs the FULL declared matrix and mints ONE final-run receipt into the git-dir core-evidence store (status green/red, pre/post tree fingerprints, the declaration, the consumed lcov's sha; the receipt the commit-guard binds); it executes only your own declared commands (a batching convenience, not a sandbox). The velocity tier auto-approves only the exact no-`--final` form — the recording run stays explicit. |
233
233
  | `/agent-workflow-kit setup [backend]` | opt-in, any time | **link-only** auto-setup of a bridge: places the bundled bridge skill (only into an absent / empty / managed dir — never overwrites an unmanaged one) + links its wrappers onto `PATH` via managed symlinks (idempotent; refuses to clobber a non-symlink; try `--dry-run` to preview). The binary install + the one-time subscription login stay **manual**: it prints the exact **login** command and points the binary install at each bridge's `setup/README.md`. POSIX wrappers — on Windows use WSL. Never commits, never runs a subscription CLI. |
234
234
  | `/agent-workflow-kit status` | any time | **read-only** single view of **versions + deployment + settings + bridges**: which members (kit / memory / engine / the two bridges) are installed and at what version (with an honest "installed on this machine" note when one is behind) and — in a project — what's deployed (`docs/ai`, the version stamps, and the **visibility**: visible / hidden / unclear), and the **feature-spec adoption state** (`not adopted` / `adopting (N draft)` / `adopted (N live, M draft)` / `could not be read`, plus `declined` when recorded), plus your settings (orchestration recipes, attribution, velocity) and the bridges' readiness. The two version axes (package number vs deployment-structure head) stay decoupled. Never writes, never commits, never runs a subscription CLI. |
235
+ | `/agent-workflow-kit now` | any time | **read-only** answer to where work stands in four blocks: **NOW** names every plan in flight, its phase, current and next step, and the tree evidence; **STEPS** gives every ledger row its evidence-derived status; **QUEUE** folds named rows under their full heading paths and calls position priority only in the judged backlog; **CAMPAIGN** shows the source-size practice figures and config state. The plan's own text never sets a status; a contradicted claim prints beside it. A block that cannot be derived is WITHHELD with its cause; NOW has two halves, plans and tree, each independently a value or WITHHELD, and NOW itself is WITHHELD only when both are. Never writes, never commits, never runs a subscription CLI. |
235
236
  | `/agent-workflow-kit recipes` | any time | **read-only** orchestration advisor: presents five named recipes for composing the carriers of a step — the bridges and the full-tool executor subagent — into plan → execute → review — **Solo / Reviewed / Council / Delegated / Subagent** — plans + recommends one for your environment (degrading with a stated reason when a backend isn't ready, or when the executor vehicle is missing/unusable), and offers the choice. The activity/slot registry (four activities) is rendered by `procedures` and by `set-recipe --help`. The orchestrator runs it via the bridge skills or the executor vehicle and **always commits**; the kit never executes a recipe, never runs a subscription CLI, never commits. |
236
237
  | `/agent-workflow-kit procedures <activity>` | any time | **read-only** activity-procedures advisor: prints a named activity's ordered steps (`plan-authoring` / `plan-execution` / `routine` / `feedback-triage`) read **live** from the engine, plus the **resolved recipe per slot** from your `docs/ai/orchestration.json` (agent-writable via `set-recipe`, or hand-edited) + carrier readiness (`plan-authoring`: author, fold, review; default Reviewed when a backend is ready, Council on request; slot-aware incl. Delegated and Subagent) — and, for every dispatched backend, the **full driving contract at the point of use** (exact copy-pasteable invocation, grounding levers like agy's `--facts`/`--decided`, the round-2 `--continue` delta, guarded passthrough), verbatim from the bridge manifests (drift-guarded; each wrapper's `--help` prints the same) — except `feedback-triage`, whose record-bound block carries the check with `--excerpts`, the resolved member lines (ready bridge commands, the ready lens brief, or explicit skipped members), and either the record round-table command for a bridge obligation or the no-receipt fact otherwise: the record is the artifact. `--override <slot>=<value>` adjusts one slot per run. Composes with `recipes`; never writes, never commits, never runs a subscription CLI. |
237
238
  | `/agent-workflow-kit set-recipe` | any time | **config writer** for `docs/ai/orchestration.json`: tell the agent your preference in plain language and it maps it to explicit `--set <activity>.<slot>=<value>` / `--unset` ops; the kit validates, **previews by default**, and writes only on `--write` (deployment-gated, atomic, symlink/TOCTOU-safe), resolving the effective recipe vs live readiness. Writes **only** that file — **never runs a backend or a subagent, never commits**; hand-editing stays fully supported. |
@@ -251,7 +252,7 @@ file), or run the guarded `/agent-workflow-kit uninstall`.
251
252
  | `/agent-workflow-kit agents` | Claude Code · opt-in | **subagent vehicles** — places the five bundled subagent definitions into `.claude/agents/`: **four read-only vehicles + one full-tool `executor`**. **No read-only vehicle gets `Bash`**, and that is the load-bearing property: a read-only fan-out on a full-tool subagent shells out for facts it could have read, and every shelled command is an approval prompt you never needed to see. Three of the four ride a **cheap model** (haiku, low effort) for mechanical work — extraction sweeps, changelog fact-skeletons, gate-failure triage; the fourth, **`review-lens`**, is an ADDITIONAL independent read-only review opinion on code your configured backends have already seen (never a replacement for your review recipe, advisory like every review). The fifth, **`executor`** (`model: opus`, all tools), is the ONE vehicle with a shell and the instrument behind the **Subagent** recipe: dispatched only for a bounded, file-disjoint execution / authoring / routine slice you verify afterwards — never for read-only work, never as a review backend, and it never commits. Its state (`placed` / `customized` / `unusable` / `missing`) is what a `subagent` slot's readiness resolves from. Writing code and running gates stay off the four read-only vehicles; the executor carries a bounded slice you re-verify on your main lane, and every vehicle's output is verified. Preview by default (`--apply` writes); an existing customized file is **preserved, never overwritten**; never touches `settings*.json`, never commits. |
252
253
  | `/agent-workflow-kit hook` | Claude Code · opt-in | **gate-approval hook** — places a self-contained PreToolUse hook (`.claude/hooks/`) and wires it into `.claude/settings.json`: a Bash command **byte-identical** to a gate you declared in `docs/ai/gates.json` (run from the project root) is auto-approved — no prompt, no idle; a seeded read-only command carrying a runtime residual (output redirection, command substitution, `--output` writes) now **asks** even where an allow rule would have silently passed it (proven live — hook `ask` overrides an allow rule). Detection is a conservative string scan, so it over-asks on a byte that is ordinary text — searching for `=>`, or a read wearing `2>/dev/null`, prompts. That is a documented open limit: 4.1.0 built three mechanisms to narrow it and removed all three in review, each counterexample kept as a test (see Mode: hook). Exact matches only, never patterns; never `deny`; a broken `gates.json` only disables auto-approval, never the guard. An opt-in **read-lane** (`--read-lane` → `docs/ai/lanes.json`, a **separate** file from `gates.json`) additionally auto-approves *compounds* of seeded read-only commands carrying no shell metaprogramming; `--apply --read-lane` verifies the placed hook is current first (delete-to-reseed otherwise). Preview by default; never writes `settings.local.json`; never commits. |
253
254
  | `/agent-workflow-kit state-block-guard` | Claude Code · opt-in | **closing-block detector** — a `Stop` hook that reads the turn's final assistant message and warns when the closing state block is defective: the «what I need from you» slot answering *nothing* (a turn that ENDS always needs a resume, so the answer is false, not merely unhelpful), or a first-person promise of imminent work in a turn that is over. Judged on the slot's first clause, so a real ask followed by a clause break and "nothing else" passes, and a promise gated on something named passes; matching is word-bounded and Unicode-aware, quoted and fenced examples are stripped, and the last STARTED block decides — an incomplete tail counts as no block rather than falling back to an earlier one. A message carrying no block at all is silent unless you pass `--require-block` — this kit does not mandate the block, and a hook that runs every turn must not warn every turn. The judgement is lexical and the mode doc names every residual it leaves. **Detection, never prevention** — a `Stop` hook cannot un-send the message it judges; what it buys is that a silent recurrence becomes a visible one. Warns via `systemMessage` and **exits 0 on every path**: never `deny`, never blocks the stop, never re-enters the model. Reads nothing but the message, makes no network call, approves nothing. This mode is **read-only and has no writer** — it ships the self-contained hook and a paste-ready wiring block you merge into `.claude/settings.json` yourself. |
254
- | `/agent-workflow-kit bridge-settings` | opt-in, any time | **host-level bridge settings** — read or change the bridges' `KEY=VALUE` config file (`${XDG_CONFIG_HOME:-~/.config}/agent-workflow/bridge-settings.conf`), the **one place a knob survives kit upgrades** (it lives outside every kit tree; a refresh never touches it, and now states loudly if it ever overwrote a local edit). First knobs: the **codex Fast tier** (`CODEX_SERVICE_TIER=priority` — ~1.5× speed at a **2.5× credit rate**, quality-neutral, default off — a consented spend), the codex/agy hard timeouts, the codex review byte cap, and `AGY_REVIEW_MAX_TOTAL_BYTES` (the ceiling on what an oversized agy code review may feed before it refuses pre-spend). `AGY_REVIEW_ALLOW_ADDDIR` is a **retired** compatibility key: still recognized so an existing line never warns as unknown, but it arms nothing — the writer refuses to set it and `--unset` clears it. Allowed keys + value rules come from the bundled bridge manifests; **model/effort are never settable** (the quality guard is untouched). **Previews by default**; refuses an unknown key, an out-of-range value, or a duplicate-carrying file; writes atomically (symlink/TOCTOU-safe). Never commits, never runs a subscription CLI. |
255
+ | `/agent-workflow-kit bridge-settings` | opt-in, any time | **host-level bridge settings** — read or change the bridges' `KEY=VALUE` config file (`${XDG_CONFIG_HOME:-~/.config}/agent-workflow/bridge-settings.conf`), the **one place a knob survives kit upgrades** (it lives outside every kit tree; a refresh never touches it, and now states loudly if it ever overwrote a local edit). First knobs: the **codex Fast tier** (`CODEX_SERVICE_TIER=priority` — "2x speed, **increased usage**" in the catalog's own words, quality-neutral, default off — a consented spend), the codex/agy hard timeouts, the codex review byte cap, and `AGY_REVIEW_MAX_TOTAL_BYTES` (the ceiling on what an oversized agy code review may feed before it refuses pre-spend). `AGY_REVIEW_ALLOW_ADDDIR` is a **retired** compatibility key: still recognized so an existing line never warns as unknown, but it arms nothing — the writer refuses to set it and `--unset` clears it. Allowed keys + value rules come from the bundled bridge manifests; **model/effort are never settable** (the quality guard is untouched). **Previews by default**; refuses an unknown key, an out-of-range value, or a duplicate-carrying file; writes atomically (symlink/TOCTOU-safe). Never commits, never runs a subscription CLI. |
255
256
  | `/agent-workflow-kit autonomy-doctor` | opt-in, any time | **guarded sandbox provisioner "doctor"** — can this machine run the Claude sandbox, and (only with your consent) fix it: macOS Seatbelt built-in / Linux+WSL2 needs `bwrap`+`socat` / native Windows → WSL2. Flagless = **FS-only preview** (the diagnosis, the exact absolute-path command it WOULD run, the exact `--apply <pm>:<pkgs>` consent tuple — runs nothing, never claims ready); `--verify` runs the unprivileged proof (a `bwrap` user-namespace smoke + `socat -V`) — the **only** source of a Linux "ready (verified)" claim; `--apply <pm>:<pkgs>` is the consent-gated privileged install (the tuple must equal the previewed plan; everything executed resolves to absolute paths inside `/usr/bin:/bin:/usr/sbin:/sbin`; the exact command is re-printed immediately before execution), then verifies. Honest loud degrades (unknown PM, untrusted location, nested-sandbox INDETERMINATE, root-unproven) and a stated restart step. Sits **outside every velocity auto-approve tier**; never auto-runs, never writes repo files, never commits. |
256
257
 
257
258
  It **never auto-commits** and **never overwrites** an existing `AGENTS.md` without asking.
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: agent-workflow-kit
3
3
  description: Deploy or upgrade a portable AI-agent memory-and-workflow system in any project. Use when the user wants to bootstrap `docs/ai/` + an entry-point `AGENTS.md` (+ `CLAUDE.md` alias) + cap/archive/index enforcement in a new or existing repo, set up the Memory Map and session protocols, install the docs-rotation pre-commit hook, or run `/agent-workflow-kit` / `/agent-workflow-kit upgrade`. Triggers on phrases like "set up the memory system", "deploy the AI workflow here", "bootstrap docs/ai", "upgrade the workflow".
4
4
  disable-model-invocation: true
5
5
  metadata:
6
- version: '12.0.0'
6
+ version: '12.2.0'
7
7
  ---
8
8
 
9
9
  # agent-workflow-kit
@@ -111,6 +111,10 @@ writer — read `${CLAUDE_SKILL_DIR}/references/modes/setup.md` before acting.
111
111
 
112
112
  read-only — read `${CLAUDE_SKILL_DIR}/references/modes/status.md` before acting.
113
113
 
114
+ ### Mode: now
115
+
116
+ read-only — read `${CLAUDE_SKILL_DIR}/references/modes/now.md` before acting.
117
+
114
118
  ### Mode: recommendations
115
119
 
116
120
  read-only — read `${CLAUDE_SKILL_DIR}/references/modes/recommendations.md` before acting.
@@ -2,7 +2,7 @@
2
2
  name: antigravity-cli-bridge
3
3
  description: Delegate work to Google's Antigravity CLI (`agy`) — the successor to Gemini CLI — to reach Gemini, Claude, and GPT-OSS models under a Google AI Pro/Ultra subscription from the terminal. Use when the user wants to run a headless `agy` prompt, hand a focused task or second-opinion review to `agy`, install or authenticate Antigravity CLI, check or economise its quota/models, bridge project context into `agy`, set up a second delegated-execution backend beside Codex, or troubleshoot `agy` flags, models, auth, conversations, or its headless behaviour.
4
4
  metadata:
5
- version: '5.6.0'
5
+ version: '5.7.0'
6
6
  ---
7
7
 
8
8
  # antigravity-cli-bridge
@@ -53,20 +53,23 @@ keep probes short (see *How the main agent drives agy*).
53
53
  ## Models
54
54
 
55
55
  Pass the **exact display string** to `--model` (or set `AGY_MODEL`). The wrapper defaults to
56
- `Gemini 3.7 Flash (High)`. Run `agy models` for the live list — if it differs from this table, the
56
+ `Gemini 3.8 Flash (High)`. Run `agy models` for the live list — if it differs from this table, the
57
57
  live list wins.
58
58
 
59
59
  | Model string | Use it for |
60
60
  |---|---|
61
- | `Gemini 3.7 Flash (Low)` | cheapest; reachability checks, smoke tests, simple transforms |
62
- | `Gemini 3.7 Flash (Medium)` | cheap probes, context-reachability checks, quick summaries |
63
- | `Gemini 3.7 Flash (High)` | wrapper + review default; asserted frontier-grade (fork (a)) |
64
- | `Gemini 3.6 Flash (Low)` | previous Flash generation, still served — prefer 3.7 |
65
- | `Gemini 3.6 Flash (Medium)` | previous Flash generation, still served — prefer 3.7 |
66
- | `Gemini 3.6 Flash (High)` | previous Flash generation, still served — prefer 3.7 |
67
- | `Gemini 3.5 Flash (Low)` | older Flash generation, still served — prefer 3.7 |
68
- | `Gemini 3.5 Flash (Medium)` | older Flash generation, still served — prefer 3.7 |
69
- | `Gemini 3.5 Flash (High)` | older Flash generation, still served — prefer 3.7 |
61
+ | `Gemini 3.8 Flash (Low)` | cheapest; reachability checks, smoke tests, simple transforms |
62
+ | `Gemini 3.8 Flash (Medium)` | cheap probes, context-reachability checks, quick summaries |
63
+ | `Gemini 3.8 Flash (High)` | wrapper + review default; asserted frontier-grade (AD-136) |
64
+ | `Gemini 3.7 Flash (Low)` | previous Flash generation, still served — prefer 3.8 |
65
+ | `Gemini 3.7 Flash (Medium)` | previous Flash generation, still served — prefer 3.8 |
66
+ | `Gemini 3.7 Flash (High)` | previous Flash generation, still frontier-grade for review (fork (a)) |
67
+ | `Gemini 3.6 Flash (Low)` | older Flash generation, still served — prefer 3.8 |
68
+ | `Gemini 3.6 Flash (Medium)` | older Flash generation, still served — prefer 3.8 |
69
+ | `Gemini 3.6 Flash (High)` | older Flash generation, still served — prefer 3.8 |
70
+ | `Gemini 3.5 Flash (Low)` | older Flash generation, still served — prefer 3.8 |
71
+ | `Gemini 3.5 Flash (Medium)` | older Flash generation, still served — prefer 3.8 |
72
+ | `Gemini 3.5 Flash (High)` | older Flash generation, still served — prefer 3.8 |
70
73
  | `Gemini 3.1 Pro (Low)` | cheaper Pro pass for medium reasoning |
71
74
  | `Gemini 3.1 Pro (High)` | hard reasoning, plan critique, architecture review (slower, deeper) |
72
75
  | `Claude Sonnet 4.6 (Thinking)` | a Claude second opinion through the same subscription |
@@ -100,7 +103,7 @@ can ride passthrough (`-- --output-format json`) but this wrapper adds no parsin
100
103
  you need structure, ask for Markdown with explicit headings and validate it yourself. (The `review`
101
104
  role is the one that adopted the JSON envelope — see below.) Wrapper inputs: first argument is the
102
105
  prompt (`text`, `-` for stdin, or `@file`);
103
- `AGY_MODEL` (default `Gemini 3.7 Flash (High)`); `AGY_TIMEOUT` → `--print-timeout` (default `5m`);
106
+ `AGY_MODEL` (default `Gemini 3.8 Flash (High)`); `AGY_TIMEOUT` → `--print-timeout` (default `5m`);
104
107
  `AGY_HARD_TIMEOUT` → hard `timeout(1)` wall-clock cap (default = `AGY_TIMEOUT`); extra `agy` flags
105
108
  after `--`. Full detail: [`references/models-and-flags.md`](references/models-and-flags.md).
106
109
 
@@ -189,7 +192,7 @@ release). `agy-review … --nonce <n>` is the plain-argument equivalent
189
192
  (one seam; flag and a non-empty env must agree, a disagreeing pair refuses pre-spend) — the lane
190
193
  for hosts whose dispatch policy has no env-prefix form.
191
194
 
192
- Frontier default `Gemini 3.7 Flash (High)`; **any** model is allowed (a sub-frontier one earns a
195
+ Frontier default `Gemini 3.8 Flash (High)`; **any** model is allowed (a sub-frontier one earns a
193
196
  silenceable `AGY_PROBE=1` advisory). An oversized `code` review is **DELIVERED, not refused**: the
194
197
  change set is cut into under-cap parts, fed over continuation turns and reviewed in a final turn, and
195
198
  the answer must reproduce a line the wrapper picked from each part — a missing or wrong echo is a
@@ -35,7 +35,7 @@
35
35
  # agy-review --conversation <id> [--decided @f] [--focus "…"] # resume a specific conversation
36
36
  #
37
37
  # Environment (every optional var has an explicit default so a no-env run is safe under set -u):
38
- # AGY_MODEL default "Gemini 3.7 Flash (High)"; ANY model allowed (advisory warn off-frontier).
38
+ # AGY_MODEL default "Gemini 3.8 Flash (High)"; ANY model allowed (advisory warn off-frontier).
39
39
  # Set empty (AGY_MODEL=) to drop --model and use agy's settings.json.
40
40
  # AGY_HARD_TIMEOUT default 30m (duration string; the timeout(1) hard cap via agy-run)
41
41
  # AGY_TIMEOUT default = AGY_HARD_TIMEOUT (agy's soft --print-timeout)
@@ -339,11 +339,11 @@ aw_resolve_timeout_bin() {
339
339
  printf '%s' "$bin"
340
340
  }
341
341
 
342
- DEFAULT_AGY_REVIEW_MODEL="Gemini 3.7 Flash (High)"
342
+ DEFAULT_AGY_REVIEW_MODEL="Gemini 3.8 Flash (High)"
343
343
  # Review-receipt identity (AD-038). AW_BRIDGE_VERSION mirrors this bridge's SKILL.md/capability.json
344
344
  # version (drift-guarded by agy-review.test.mjs against capability.json).
345
345
  AW_RECEIPT_BACKEND="agy"
346
- AW_BRIDGE_VERSION="5.6.0" # aw-version-anchor
346
+ AW_BRIDGE_VERSION="5.7.0" # aw-version-anchor
347
347
  # `-` not `:-` so an EXPLICIT empty AGY_MODEL= survives (drop --model, use settings.json — agy.sh:52).
348
348
  AGY_MODEL="${AGY_MODEL-$DEFAULT_AGY_REVIEW_MODEL}"
349
349
  # D5 control-byte screen — IMMEDIATELY after resolution, BEFORE the off-frontier advisory (or any
@@ -353,8 +353,9 @@ if [[ "$AGY_MODEL" == *[$'\x01'-$'\x1f'$'\x7f']* ]]; then
353
353
  exit 2
354
354
  fi
355
355
  # Frontier review models. ANY model is allowed; a sub-frontier one only earns a soft, silenceable
356
- # warning. Gemini 3.7 Flash (High) is asserted frontier-grade (fork (a), maintainer 2026-08-14).
357
- FRONTIER_SET=("Gemini 3.7 Flash (High)" "Gemini 3.1 Pro (High)" "Claude Opus 4.6 (Thinking)" "Claude Sonnet 4.6 (Thinking)")
356
+ # warning. Gemini 3.8 Flash (High) is asserted frontier-grade (AD-136, maintainer 2026-09-09); 3.7 Flash
357
+ # (High) stays in the set (fork (a), maintainer 2026-08-14).
358
+ FRONTIER_SET=("Gemini 3.8 Flash (High)" "Gemini 3.7 Flash (High)" "Gemini 3.1 Pro (High)" "Claude Opus 4.6 (Thinking)" "Claude Sonnet 4.6 (Thinking)")
358
359
 
359
360
  # Duration-string timeouts (NOT codex's bare seconds): agy-run forwards a duration to --print-timeout,
360
361
  # and the timeout(1) hard cap is a duration too — never numerically compared, so 30m vs 2h is fine.
@@ -42,10 +42,10 @@ describe('agy-review.sh — model policy advisory (1)', { concurrency: 2 }, () =
42
42
  rmSync(sb.home, { recursive: true, force: true });
43
43
  assert.equal(r.status, 0, r.stderr);
44
44
  assert.doesNotMatch(r.stderr, /non-frontier model/);
45
- assert.match(r.argv, /Gemini 3\.7 Flash \(High\)/, 'the frontier default reaches agy');
45
+ assert.match(r.argv, /Gemini 3\.8 Flash \(High\)/, 'the frontier default reaches agy');
46
46
  });
47
47
 
48
- it('an explicit Gemini 3.7 Flash (High) is FRONTIER — no advisory (fork (a), maintainer 2026-08-14)', async () => {
48
+ it('an explicit Gemini 3.7 Flash (High) stays FRONTIER after the 3.8 pin move — no advisory (AD-136)', async () => {
49
49
  const sb = makeSandbox();
50
50
  const r = await run(sb, { args: ['code', '--facts', 'a tiny fact'], env: { AGY_MODEL: 'Gemini 3.7 Flash (High)' } });
51
51
  rmSync(sb.home, { recursive: true, force: true });
@@ -2776,8 +2776,8 @@ describe('agy-review.sh — dispatch-posture labeling (D5)', { concurrency: 2 },
2776
2776
  const receipts = readReceipts(sb.repo);
2777
2777
  rmSync(sb.home, { recursive: true, force: true });
2778
2778
  assert.equal(r.status, 0, r.stderr);
2779
- assert.match(r.stderr, /review posture: model=Gemini 3\.7 Flash \(High\)/, 'the banner states the actual run posture');
2780
- assert.deepEqual(receipts[0].posture, { model: 'Gemini 3.7 Flash (High)' }, 'banner ↔ receipt parity');
2779
+ assert.match(r.stderr, /review posture: model=Gemini 3\.8 Flash \(High\)/, 'the banner states the actual run posture');
2780
+ assert.deepEqual(receipts[0].posture, { model: 'Gemini 3.8 Flash (High)' }, 'banner ↔ receipt parity');
2781
2781
  assert.deepEqual(Object.keys(receipts[0]), Object.keys(RECEIPT_FIXTURE), 'fixture key set + order');
2782
2782
  });
2783
2783
 
@@ -2830,7 +2830,7 @@ describe('agy-review.sh — dispatch-posture labeling (D5)', { concurrency: 2 },
2830
2830
  const receipts = readReceipts(sb.repo);
2831
2831
  rmSync(sb.home, { recursive: true, force: true });
2832
2832
  assert.equal(r.status, 0, r.stderr);
2833
- assert.match(r.stderr, /^review posture: model=Gemini 3\.7 Flash \(High\) timeout=30m$/m);
2833
+ assert.match(r.stderr, /^review posture: model=Gemini 3\.8 Flash \(High\) timeout=30m$/m);
2834
2834
  assert.deepEqual(Object.keys(receipts[0].posture), ['model'], 'timeout never enters the receipt posture');
2835
2835
  });
2836
2836
 
@@ -19,8 +19,8 @@
19
19
  #
20
20
  # Model families (compact inventory only; run `agy models` for exact display strings, then pass
21
21
  # one via AGY_MODEL):
22
- # Gemini 3.7 Flash (Low|Medium|High), Gemini 3.6 Flash (Low|Medium|High),
23
- # Gemini 3.5 Flash (Low|Medium|High), Gemini 3.1 Pro (Low|High),
22
+ # Gemini 3.8 Flash (Low|Medium|High), Gemini 3.7 Flash (Low|Medium|High),
23
+ # Gemini 3.6 Flash (Low|Medium|High), Gemini 3.5 Flash (Low|Medium|High), Gemini 3.1 Pro (Low|High),
24
24
  # Claude Sonnet 4.6 (Thinking), Claude Opus 4.6 (Thinking), GPT-OSS 120B (Medium)
25
25
  #
26
26
  # Usage (installed on PATH as `agy-run`):
@@ -240,8 +240,8 @@ if ! command -v agy >/dev/null 2>&1; then
240
240
  fi
241
241
 
242
242
  # `-` (empty) => skip --model and let agy use settings.json; default to Flash (High) — asserted
243
- # frontier-grade (fork (a), maintainer 2026-08-14).
244
- AGY_MODEL="${AGY_MODEL-Gemini 3.7 Flash (High)}"
243
+ # frontier-grade (fork (a), maintainer 2026-08-14; the 3.8 pin AD-136, 2026-09-09).
244
+ AGY_MODEL="${AGY_MODEL-Gemini 3.8 Flash (High)}"
245
245
  AGY_TIMEOUT="${AGY_TIMEOUT:-5m}"
246
246
  AGY_TIMEOUT="$(aw_effective_timeout AGY_TIMEOUT 5m)"
247
247
  # Hard wall-clock cap (defaults to AGY_TIMEOUT). agy's own --print-timeout is NOT a reliable
@@ -449,7 +449,7 @@ describe('agy.sh — bridge settings file (bridges 2.3.0)', { concurrency: true
449
449
 
450
450
  // ── the wrapper's OWN default model (fork (a), round-1 council F3) ────────────────
451
451
  describe('agy.sh — default model pin', () => {
452
- it('absent AGY_MODEL → the stub argv carries --model Gemini 3.7 Flash (High)', () => {
452
+ it('absent AGY_MODEL → the stub argv carries --model Gemini 3.8 Flash (High)', () => {
453
453
  const home = makeSandbox(ARGV_STUB);
454
454
  const argvFile = join(home, 'argv.txt');
455
455
  const r = runWrapper(home, { AGY_STUB_ARGV: argvFile });
@@ -457,7 +457,7 @@ describe('agy.sh — default model pin', () => {
457
457
  rmSync(home, { recursive: true, force: true });
458
458
  assert.equal(r.status, 0, r.stderr);
459
459
  assert.match(argv, /^--model$/m, 'the default run passes --model');
460
- assert.match(argv, /^Gemini 3\.7 Flash \(High\)$/m, 'the wrapper default is the probed display string');
460
+ assert.match(argv, /^Gemini 3\.8 Flash \(High\)$/m, 'the wrapper default is the probed display string');
461
461
  });
462
462
 
463
463
  it("explicit AGY_MODEL='' drops --model entirely (settings.json takes over)", () => {
@@ -3,9 +3,9 @@
3
3
  "schema": 1,
4
4
  "name": "antigravity-cli-bridge",
5
5
  "kind": "execution-backend",
6
- "version": "5.6.0",
6
+ "version": "5.7.0",
7
7
  "provides": ["review", "probe"],
8
- "posture": { "model": "Gemini 3.7 Flash (High)" },
8
+ "posture": { "model": "Gemini 3.8 Flash (High)" },
9
9
  "roles": {
10
10
  "review": {
11
11
  "cmd": "agy-review",
@@ -181,7 +181,7 @@
181
181
  ],
182
182
  "guardrails": [
183
183
  { "value": "subscription-only — every *_API_KEY env var is unset before the run", "enforcement": "enforced", "source": "bin/agy.sh" },
184
- { "value": "any model is selectable via AGY_MODEL; the default is Gemini 3.7 Flash (High)", "enforcement": "advisory", "source": "bin/agy.sh" },
184
+ { "value": "any model is selectable via AGY_MODEL; the default is Gemini 3.8 Flash (High)", "enforcement": "advisory", "source": "bin/agy.sh" },
185
185
  { "value": "hard wall-clock cap AGY_HARD_TIMEOUT (built-in default 5m)", "enforcement": "enforced", "condition": "only while timeout(1)/gtimeout is on PATH — otherwise the wrapper warns and runs uncapped", "source": "capability.json settings.AGY_HARD_TIMEOUT" },
186
186
  { "value": "the prompt rides a single argv — over AGY_MAX_PROMPT_BYTES (120000) the run refuses", "enforcement": "enforced", "source": "bin/agy.sh" },
187
187
  { "value": "no review posture, no grounding, no receipt — the reply is raw model output", "enforcement": "advisory", "source": "bin/agy.sh" }
@@ -18,14 +18,15 @@ edits, verification, and final judgment.
18
18
 
19
19
  | Task | Model |
20
20
  |---|---|
21
- | Reachability / smoke / "is it wired?" | `Gemini 3.7 Flash (Low)` |
22
- | Cheap probes, summaries | `Gemini 3.7 Flash (Medium)` |
23
- | Review, reasoning, careful drafting | `Gemini 3.7 Flash (High)` (wrapper default; asserted frontier-grade) |
21
+ | Reachability / smoke / "is it wired?" | `Gemini 3.8 Flash (Low)` |
22
+ | Cheap probes, summaries | `Gemini 3.8 Flash (Medium)` |
23
+ | Review, reasoning, careful drafting | `Gemini 3.8 Flash (High)` (wrapper default; asserted frontier-grade, AD-136) |
24
+ | The previous Flash generation, still frontier-grade for review | `Gemini 3.7 Flash (High)` (fork (a)) |
24
25
  | Slower, deeper reasoning pass | `Gemini 3.1 Pro (High)` |
25
26
  | Same Pro reasoning, lower quota cost | `Gemini 3.1 Pro (Low)` |
26
27
  | A different engine's opinion | `Claude Sonnet 4.6 (Thinking)`, `Claude Opus 4.6 (Thinking)`, or `GPT-OSS 120B (Medium)` |
27
28
 
28
- The 3.6 / 3.5 Flash families remain served — prefer 3.7 (newest generation at the same tiers).
29
+ The 3.7 / 3.6 / 3.5 Flash families remain served — prefer 3.8 (newest generation at the same tiers).
29
30
  Don't reach for Pro by reflex — Flash answers most reachability/probe questions for a fraction of the
30
31
  quota.
31
32
 
@@ -95,7 +96,7 @@ What it does for you, and what YOU must supply:
95
96
  `AGY_REVIEW_ALLOW_ADDDIR` is **RETIRED** (recognized, arms nothing): headless `agy` auto-denies its
96
97
  own `read_file`, so the offload it armed could return a confident fabrication with no way to tell.
97
98
  The kit never grants that permission — the feed exists so none is needed.
98
- - **Model:** frontier default `Gemini 3.7 Flash (High)`; any model is allowed (a sub-frontier one earns a
99
+ - **Model:** frontier default `Gemini 3.8 Flash (High)`; any model is allowed (a sub-frontier one earns a
99
100
  silenceable `AGY_PROBE=1` advisory). The service can still **stall on large/substantive prompts**
100
101
  (Issue-001) — keep reviews **focused**; the hard timeout is the guard.
101
102
  - **Posture banner — quote it verbatim.** Every review states its ACTUAL posture on ONE stderr line
@@ -46,7 +46,7 @@ Environment:
46
46
 
47
47
  | Var | Default | Effect |
48
48
  |---|---|---|
49
- | `AGY_MODEL` | `Gemini 3.7 Flash (High)` | model display string; set empty (`AGY_MODEL=`) to drop `--model` and let `agy` use `settings.json` |
49
+ | `AGY_MODEL` | `Gemini 3.8 Flash (High)` | model display string; set empty (`AGY_MODEL=`) to drop `--model` and let `agy` use `settings.json` |
50
50
  | `AGY_TIMEOUT` | `5m` | value passed to `--print-timeout` |
51
51
  | `AGY_HARD_TIMEOUT` | `= AGY_TIMEOUT` | hard `timeout(1)` wall-clock cap (a duration string) |
52
52
  | `AGY_MAX_PROMPT_BYTES` | `120000` | single-argv byte ceiling. `agy` takes the prompt as ONE `-p` argv; past `MAX_ARG_STRLEN` (~131072) `execve` fails with a cryptic `Argument list too long`. The wrapper measures the resolved `-`/`@file` prompt and fails loud over the ceiling. A huge **literal** `agy-run "<huge>"` fails at the wrapper's own `exec`, so route large prompts via `-`/`@file`. |
@@ -71,7 +71,7 @@ agy-review --continue | --conversation <id> [--decided @f] [--focus "…"] #
71
71
 
72
72
  | Var | Default | Effect |
73
73
  |---|---|---|
74
- | `AGY_MODEL` | `Gemini 3.7 Flash (High)` | frontier default (fork (a), 2026-08-14); **any** model is allowed — a sub-frontier one earns a silenceable advisory (quality-first, not a gate) |
74
+ | `AGY_MODEL` | `Gemini 3.8 Flash (High)` | frontier default (AD-136, 2026-09-09; 3.7 Flash (High) stays frontier, fork (a)); **any** model is allowed — a sub-frontier one earns a silenceable advisory (quality-first, not a gate) |
75
75
  | `AGY_PROBE` | `0` | `1` silences the off-frontier model advisory AND lets `code` run without `--facts` (an ungrounded probe never attests — its receipt is probe-marked) |
76
76
  | `AGY_REVIEW_MAX_TOTAL_BYTES` | `240000` | the ceiling on the SUM of all outgoing prompt bytes an oversized `code` review's chunked feed may send; checked BEFORE the first turn is spent |
77
77
  | `AGY_REVIEW_ALLOW_ADDDIR` | `0` | **RETIRED** — recognized so an existing settings line never warns as unknown, but it arms nothing. An oversized `code` review is a chunked feed with a per-part delivery proof; the `--add-dir` offload it armed could not be verified (headless `agy` auto-denies `read_file`) |
@@ -97,15 +97,18 @@ Pass the **exact display string** from `agy models`, or set `AGY_MODEL`.
97
97
 
98
98
  | Model string | Practical use |
99
99
  |---|---|
100
- | `Gemini 3.7 Flash (Low)` | lowest-cost smoke tests, cheap probes, simple rewrites (newest Flash) |
101
- | `Gemini 3.7 Flash (Medium)` | fast summaries, context-reachability checks |
102
- | `Gemini 3.7 Flash (High)` | wrapper + review default — asserted frontier-grade (fork (a)) |
103
- | `Gemini 3.6 Flash (Low)` | previous Flash generation, still served — prefer 3.7 |
104
- | `Gemini 3.6 Flash (Medium)` | previous Flash generation, still served — prefer 3.7 |
105
- | `Gemini 3.6 Flash (High)` | previous Flash generation, still served — prefer 3.7 |
106
- | `Gemini 3.5 Flash (Low)` | older Flash generation, still served — prefer 3.7 |
107
- | `Gemini 3.5 Flash (Medium)` | older Flash generation, still served — prefer 3.7 |
108
- | `Gemini 3.5 Flash (High)` | older Flash generation, still served — prefer 3.7 |
100
+ | `Gemini 3.8 Flash (Low)` | lowest-cost smoke tests, cheap probes, simple rewrites (newest Flash) |
101
+ | `Gemini 3.8 Flash (Medium)` | fast summaries, context-reachability checks |
102
+ | `Gemini 3.8 Flash (High)` | wrapper + review default — asserted frontier-grade (AD-136) |
103
+ | `Gemini 3.7 Flash (Low)` | previous Flash generation, still served — prefer 3.8 |
104
+ | `Gemini 3.7 Flash (Medium)` | previous Flash generation, still served — prefer 3.8 |
105
+ | `Gemini 3.7 Flash (High)` | previous Flash generation, still frontier-grade for review (fork (a)) |
106
+ | `Gemini 3.6 Flash (Low)` | older Flash generation, still served — prefer 3.8 |
107
+ | `Gemini 3.6 Flash (Medium)` | older Flash generation, still served — prefer 3.8 |
108
+ | `Gemini 3.6 Flash (High)` | older Flash generation, still served — prefer 3.8 |
109
+ | `Gemini 3.5 Flash (Low)` | older Flash generation, still served — prefer 3.8 |
110
+ | `Gemini 3.5 Flash (Medium)` | older Flash generation, still served — prefer 3.8 |
111
+ | `Gemini 3.5 Flash (High)` | older Flash generation, still served — prefer 3.8 |
109
112
  | `Gemini 3.1 Pro (Low)` | cheaper Pro pass for medium reasoning |
110
113
  | `Gemini 3.1 Pro (High)` | hard reasoning, plan critique, architecture review (slower, deeper) |
111
114
  | `Claude Sonnet 4.6 (Thinking)` | cross-vendor reasoning comparison |
@@ -2,7 +2,7 @@
2
2
  name: codex-cli-bridge
3
3
  description: Delegate work to the OpenAI Codex CLI (`codex`) under a ChatGPT subscription — run plan/instruction EXECUTION in a sandboxed workspace, or get a read-only ADVISORY review of a plan or working-tree diff — as a second delegated-execution backend beside Antigravity. Use when the user wants to hand a bounded coding task or plan to `codex exec`, get a second-opinion review from codex, install or authenticate Codex CLI, understand its sandbox/network/approval policy, drive codex efficiently from the main agent (exec vs review, resume, the commit boundary), bridge project context (`AGENTS.md`) into codex, or troubleshoot codex flags, models, auth, or its no-TTY headless behaviour.
4
4
  metadata:
5
- version: '3.7.0'
5
+ version: '3.8.0'
6
6
  ---
7
7
 
8
8
  # codex-cli-bridge
@@ -48,9 +48,9 @@ this skill. Both wrappers enforce the subscription path before invoking codex:
48
48
 
49
49
  ## Models quality-first pinned
50
50
 
51
- Delegated codex work ALWAYS runs on the **PINNED model at maximum reasoning effort**: the wrappers
52
- **pin** `gpt-5.6-sol` / `xhigh` and **refuse** (exit 2, loud) a non-default `CODEX_MODEL` / `CODEX_EFFORT`
53
- — knowingly-worse output is never traded for quota. The pin is deliberate: an explicit `-m gpt-5.6-sol`
51
+ Delegated codex work ALWAYS runs on the **PINNED model at the PINNED reasoning effort**: the wrappers
52
+ **pin** `gpt-6-astra` / `high` and **refuse** (exit 2, loud) a non-default `CODEX_MODEL` / `CODEX_EFFORT`
53
+ — knowingly-worse output is never traded for quota. The pin is deliberate: an explicit `-m gpt-6-astra`
54
54
  names one model rather than following the CLI's current default. That the pinned id is also the
55
55
  *strongest* selectable Codex model is a **separate, time-bounded claim**, checked BY HAND against
56
56
  <https://developers.openai.com/codex/models>. There is **no automated gate and this file records no
@@ -63,8 +63,10 @@ either way between releases:
63
63
  available until someone re-checks the page.
64
64
 
65
65
  The guard is therefore a **pin-integrity** guard, not a quality guarantee: it enforces that runs use
66
- the id named here, and it refuses a *stronger* model exactly as it refuses a weaker one. Read a
67
- refusal as "not the pinned id", never as "a downgrade was prevented".
66
+ the id named here, and it refuses a *stronger* model exactly as it refuses a weaker one. The effort
67
+ pin is the same kind of decision: `high` is a deliberate posture, not the catalog maximum (`xhigh`,
68
+ `max` and `ultra` exist above it), and the guard refuses a higher effort exactly as it refuses a lower
69
+ one. Read a refusal as "not the pinned id", never as "a downgrade was prevented".
68
70
 
69
71
  Economy comes only from **quality-neutral waste removal** (clean capture, a hard timeout,
70
72
  a precomputed review diff, `resume` instead of re-sending context), never from a downgrade.
@@ -75,8 +77,8 @@ output as real delegated work.
75
77
 
76
78
  | Variable | Default | Effect |
77
79
  |---|---|---|
78
- | `CODEX_MODEL` | `gpt-5.6-sol` (pinned) | model passed to `-m`; a non-default is REFUSED unless `CODEX_PROBE=1` |
79
- | `CODEX_EFFORT` | `xhigh` (pinned) | reasoning effort (`-c model_reasoning_effort=…`); non-default REFUSED unless `CODEX_PROBE=1` |
80
+ | `CODEX_MODEL` | `gpt-6-astra` (pinned) | model passed to `-m`; a non-default is REFUSED unless `CODEX_PROBE=1` |
81
+ | `CODEX_EFFORT` | `high` (pinned) | reasoning effort (`-c model_reasoning_effort=…`); non-default REFUSED unless `CODEX_PROBE=1` |
80
82
 
81
83
  `codex --version` reports the CLI version, **not** the model list. Quota is metered in **messages**
82
84
  (a rolling 5h window + a weekly cap), not raw tokens — which is why the levers above are about removing
@@ -156,10 +158,10 @@ defeat a policy is guarded — see [§ Models](#models-quality-first-pinned).
156
158
 
157
159
  | Variable | Default | Effect |
158
160
  |---|---|---|
159
- | `CODEX_MODEL` | `gpt-5.6-sol` (pinned) | model; non-default REFUSED unless `CODEX_PROBE=1` |
160
- | `CODEX_EFFORT` | `xhigh` (pinned) | reasoning effort; non-default REFUSED unless `CODEX_PROBE=1` |
161
+ | `CODEX_MODEL` | `gpt-6-astra` (pinned) | model; non-default REFUSED unless `CODEX_PROBE=1` |
162
+ | `CODEX_EFFORT` | `high` (pinned) | reasoning effort; non-default REFUSED unless `CODEX_PROBE=1` |
161
163
  | `CODEX_HARD_TIMEOUT` | `3600` (exec) / `1800` (review) | hard wall-clock cap (seconds) via `timeout`/`gtimeout`; exit 124/137 ⇒ "exceeded hard cap". No `timeout` binary ⇒ a nonce-less exec warns loudly + runs uncapped, a **nonced** exec REFUSES pre-spend (an accounted dispatch that cannot be capped can never honour the terminal-exit rule), and `codex-review` REFUSES pre-spend (fail-closed preflight). |
162
- | `CODEX_SERVICE_TIER` | unset (standard tier) | **SPEND knob**: `priority` (catalog name "Fast") = ~1.5× token speed at a **2.5× credit rate** on gpt-5.6-sol — quality-neutral (same model). codex accepts any `-c service_tier` string silently (probe-pinned 2026-07-05), so the wrapper validates: an unsupported value warns and runs standard. Env or settings file. |
164
+ | `CODEX_SERVICE_TIER` | unset (standard tier) | **SPEND knob**: `priority` (catalog name "Fast") = "2x speed, **increased usage**" in the codex catalog's own words for gpt-6-astra (cache fetched 2026-09-05); it states no credit-rate figure — quality-neutral (same model). codex accepts any `-c service_tier` string silently (probe-verified), so the wrapper validates: an unsupported value warns and runs standard. Env or settings file. |
163
165
  | `CODEX_SESSION_FILE` | `./.codex-last-session` | where `codex-exec` records the session id and where `--resume-last` reads it |
164
166
  | `CODEX_REVIEW_MAX_TOTAL_BYTES` | `1500000` | `codex-review code`: above this the assembled diff goes via a git-dir temp file instead of inline — never truncated |
165
167
  | `AW_REVIEW_NONCE` | unset | the flow dispatch nonce (safe grammar `[A-Za-z0-9._-]{1,64}` — anything else refuses pre-spend). `codex-review … --nonce <n>` is the plain-argument equivalent (one seam; flag and a non-empty env must agree, a disagreeing pair refuses pre-spend) — the lane for hosts whose dispatch policy has no env-prefix form. When supplied, a successful review first mints the finding MANIFEST `agent-workflow-finding-manifest-codex-<nonce>.json` beside the receipts file (atomic, no-clobber, ORDERED before the receipt append) — a failed mint EXCLUDES the receipt, so a nonce-supplied dispatch never lands a receipt without its readable manifest; nonce-less runs add no nonce field and mint nothing (the `wrapperVersion` field every receipt carries moves with each release) |
@@ -210,7 +212,7 @@ skipped entirely without a nonce: the wrapper is byte-unchanged, writes no artif
210
212
  `${XDG_CONFIG_HOME:-~/.config}/agent-workflow/bridge-settings.conf` holds `KEY=VALUE` lines,
211
213
  **parsed, never sourced** — a file line can never execute code. Precedence: explicit env (even
212
214
  empty — `KEY=` disables a knob for one run) > file > built-in default. File-settable keys for this
213
- bridge: `CODEX_SERVICE_TIER` (the Fast tier — **2.5× credit rate**; enabling it is a consented
215
+ bridge: `CODEX_SERVICE_TIER` (the Fast tier — **increased usage**; enabling it is a consented
214
216
  per-host spend decision, never a default), `CODEX_HARD_TIMEOUT`, `CODEX_REVIEW_MAX_TOTAL_BYTES` —
215
217
  exactly the manifest `settings` block (the single source; the wrapper constants and `--help` are
216
218
  drift-guarded against it). Model/effort keys are **not** file-settable — the quality guard above
@@ -13,12 +13,12 @@
13
13
  # - network access OFF: new dependencies / network installs are done by a human
14
14
  # - approval_policy=never: there is no TTY in exec; anything needing escalation
15
15
  # is refused and reported, then handled by hand
16
- # - the PINNED model at maximum reasoning effort (quality-first — see below)
16
+ # - the PINNED model at the PINNED reasoning effort (quality-first — see below)
17
17
  # - git WRITES are blocked by a physical shim (codex spawns git via execve, which
18
18
  # bypasses shell functions) — the orchestrator owns the commit boundary.
19
19
  #
20
20
  # Quality-first (hard rule): delegated codex work ALWAYS runs on the PINNED
21
- # model at maximum reasoning effort. The defaults below are pinned and the wrapper
21
+ # model at the PINNED reasoning effort. The defaults below are pinned and the wrapper
22
22
  # REFUSES a non-default CODEX_MODEL/CODEX_EFFORT — knowingly-worse output is never
23
23
  # traded for quota. The ONLY exception is a throwaway probe whose result does not
24
24
  # depend on effort: set CODEX_PROBE=1 (echoed loudly) to relax the guard. Economy
@@ -149,7 +149,7 @@ Notes:
149
149
 
150
150
  Settings file (KEY=VALUE, parsed never sourced; env wins over file, file wins over built-in default):
151
151
  ${XDG_CONFIG_HOME:-~/.config}/agent-workflow/bridge-settings.conf
152
- CODEX_SERVICE_TIER — service tier: 'priority' (Fast — ~1.5x speed at a 2.5x credit rate on gpt-5.6-sol); a consented SPEND knob, default off (standard tier)
152
+ CODEX_SERVICE_TIER — service tier: 'priority' (Fast — "2x speed, increased usage", the codex catalog's own words for gpt-6-astra, cache fetched 2026-09-05; it states no credit-rate figure); a consented SPEND knob, default off (standard tier)
153
153
  CODEX_HARD_TIMEOUT — hard wall-clock cap, integer seconds 1..86400 (built-in default 3600)
154
154
 
155
155
  Environment: CODEX_HARD_TIMEOUT (seconds, default 3600), CODEX_PROBE=1 (throwaway probe only), AW_DISPATCH_NONCE (delegation dispatch nonce — mints the exec receipt; the --nonce <n> flag is its plain-argument equivalent), AW_DELEGATION_STORE (absolute delegation-store path; its dirname is where the receipt lands).
@@ -319,19 +319,20 @@ aw_resolve_timeout_bin() {
319
319
  printf '%s' "$bin"
320
320
  }
321
321
 
322
- DEFAULT_CODEX_MODEL="gpt-5.6-sol" # pinned model id (see SKILL.md: strongest-model status is hand-checked, ungated)
323
- DEFAULT_CODEX_EFFORT="xhigh" # maximum reasoning effort — pinned
322
+ DEFAULT_CODEX_MODEL="gpt-6-astra" # pinned model id (see SKILL.md: strongest-model status is hand-checked, ungated)
323
+ DEFAULT_CODEX_EFFORT="high" # pinned reasoning effort — a deliberate posture, not the catalog maximum
324
324
  CODEX_MODEL="${CODEX_MODEL:-$DEFAULT_CODEX_MODEL}"
325
325
  CODEX_EFFORT="${CODEX_EFFORT:-$DEFAULT_CODEX_EFFORT}"
326
- # Generous hard wall-clock cap, sized for a slow xhigh run (subscription latency
326
+ # Generous hard wall-clock cap, sized for a slow run at the pinned effort (subscription latency
327
327
  # varies — a trivial reply was observed taking minutes). Raise for a known-healthy
328
328
  # long run; lowering it only risks killing real work.
329
329
  CODEX_HARD_TIMEOUT="${CODEX_HARD_TIMEOUT:-3600}"
330
- # Codex service tier (quality-neutral speed knob; live-probed 2026-07-05): default EMPTY ⇒ no
330
+ # Codex service tier (quality-neutral speed knob): default EMPTY ⇒ no
331
331
  # service_tier flag (standard tier) — enabling Fast is a consented per-host SPEND act, never a
332
332
  # silent default. The only server-catalog tier id on this subscription is 'priority' (catalog
333
- # display name "Fast": ~1.5x token speed at a 2.5x credit rate on gpt-5.6-sol; quality-neutral —
334
- # same model). codex itself accepts ANY -c service_tier string silently (probe-verified), so
333
+ # display name "Fast": "2x speed, increased usage" in the catalog's own words for gpt-6-astra, cache
334
+ # fetched 2026-09-05; it states no credit-rate figure; quality-neutral — same model). codex itself
335
+ # accepts ANY -c service_tier string silently (probe-verified), so
335
336
  # the wrapper validates the effective value: an unsupported one warns and runs on the standard
336
337
  # tier — a typo can never silently masquerade as Fast.
337
338
  CODEX_SERVICE_TIER="${CODEX_SERVICE_TIER:-}"
@@ -372,14 +373,14 @@ CHATGPT_LOGIN_GUARD="Logged in using ChatGPT"
372
373
  # receipt this wrapper mints; scripts/release/version-sync.mjs bumps it under the one-anchor-per-file
373
374
  # rule, so a release can never leave it behind (the AD-053 drift class).
374
375
  AW_RECEIPT_BACKEND="codex"
375
- AW_BRIDGE_VERSION="3.7.0" # aw-version-anchor
376
+ AW_BRIDGE_VERSION="3.8.0" # aw-version-anchor
376
377
  # The kill grace handed to timeout(1) as --kill-after, and recorded in the receipt as killGraceS:
377
378
  # ONE constant, so the number the ledger checks against the dispatch deadline is the number the run
378
379
  # actually applied.
379
380
  CODEX_KILL_GRACE_S=15
380
381
 
381
382
  # --- Quality-first guard: refuse any non-pinned model/effort ---------------
382
- # Real delegated runs must use the pinned model at max effort. A throwaway probe
383
+ # Real delegated runs must use the pinned model at the pinned effort. A throwaway probe
383
384
  # (effort-independent result) may opt out with CODEX_PROBE=1, announced loudly.
384
385
  if [[ "${CODEX_PROBE:-}" == "1" ]]; then
385
386
  echo "warning: CODEX_PROBE=1 — THROWAWAY PROBE MODE. Quality guards relaxed; do NOT use this run's" >&2
@@ -387,13 +388,13 @@ if [[ "${CODEX_PROBE:-}" == "1" ]]; then
387
388
  else
388
389
  if [[ "$CODEX_MODEL" != "$DEFAULT_CODEX_MODEL" ]]; then
389
390
  echo "error: CODEX_MODEL='$CODEX_MODEL' is not the pinned model '$DEFAULT_CODEX_MODEL'." >&2
390
- echo " Delegated codex work must run on the pinned model at max effort (quality-first)." >&2
391
+ echo " Delegated codex work must run on the pinned model at the pinned effort (quality-first)." >&2
391
392
  echo " For a throwaway probe whose result is effort-independent, set CODEX_PROBE=1." >&2
392
393
  exit 2
393
394
  fi
394
395
  if [[ "$CODEX_EFFORT" != "$DEFAULT_CODEX_EFFORT" ]]; then
395
- echo "error: CODEX_EFFORT='$CODEX_EFFORT' is not the pinned max effort '$DEFAULT_CODEX_EFFORT'." >&2
396
- echo " Delegated codex work must run at max reasoning effort (quality-first)." >&2
396
+ echo "error: CODEX_EFFORT='$CODEX_EFFORT' is not the pinned effort '$DEFAULT_CODEX_EFFORT'." >&2
397
+ echo " Delegated codex work must run at the pinned reasoning effort (quality-first)." >&2
397
398
  echo " For a throwaway probe whose result is effort-independent, set CODEX_PROBE=1." >&2
398
399
  exit 2
399
400
  fi
@@ -932,7 +933,7 @@ if [[ -n "$resume_mode" ]]; then
932
933
  else
933
934
  # `-o` writes ONLY codex's final message; `--json` streams structured events
934
935
  # (thread.started carries the session id). CoT is dropped and colour disabled, so
935
- # the captured surfaces stay clean. Reasoning still runs at xhigh — quality is
936
+ # the captured surfaces stay clean. Reasoning still runs at the pinned effort — quality is
936
937
  # unchanged; we only stop printing the noise.
937
938
  codex_cmd=(codex exec
938
939
  --ignore-user-config