Skip to content

Release v3.24.0 - #123

Merged
atomantic merged 16 commits into
releasefrom
main
Jul 12, 2026
Merged

Release v3.24.0#123
atomantic merged 16 commits into
releasefrom
main

Conversation

@atomantic

Copy link
Copy Markdown
Owner

Summary

Minor release: v3.23.0 → v3.24.0.

Task planning

  • [issue-111] Enhance drafted issues before filing/do:plan-task gains a --enhance-with <list> flag that routes the drafted issue through a sequential pipeline of enhancement agents (codex, claude, agy, grok) before the approval gate, each sharpening the previous one's draft.

Code review

  • [issue-120] Grok as a code reviewergrok is now a first-class --review-with reviewer everywhere reviewers run, with per-reviewer model pinning via grok[<model>] and saveable defaults through /do:config.

Release-gate hardening (found during pre-release review)

  • enhance-loop: per-entry model-flag recompute, in-process claude EXIT_CODE reset, read-only contract verification with git-baseline revert
  • TIMEOUT_CMD converted to a shell array in all three loops (zsh does not word-split an unquoted string expansion)
  • Parallel-mode aggregate now counts cli-error as inconclusive
  • Stale reviewer enumerations updated for grok (pr.md, release.md, README)

Full Diff: v3.23.0...v3.24.0

Test plan

  • npm test — 173/173 passing
  • Full release diff reviewed file-by-file against the review checklist (9 findings, all fixed)

atomantic and others added 16 commits July 12, 2026 10:09
…al draft-enhancement pipeline

Route a drafted issue through an ordered pipeline of enhancement agents
(codex, claude, agy, grok) before the approval gate — each sharpens the
previous agent's output for a more decision-complete issue. New shared
lib/enhance-loop.md mirrors local-agent-review-loop's binary pre-flight,
background+poll invocation, and missing-binary-skip-never-substitute rule.

Defines grok as a first-class enhancement agent (grok -p / -m /
--permission-mode bypassPermissions); its dependency #112 (per-agent
[model] bracket grammar) has landed, so the codex[o3]-style selector works.
Grok as a --review-with reviewer is a larger cross-cutting change tracked
separately in #120.

Closes #111
Add --enhance-with to /do:plan-task for a sequential draft-enhancement pipeline
Grok is an agentic local CLI, so it plugs into the local-agent review loop
alongside codex/agy/claude: add its slug, binary resolution, and headless
invocation (grok -p / --permission-mode bypassPermissions / --model), driven
by the same self-contained $LOCAL_PROMPT in both review-only and
reviewer-applies modes. Thread the grok slug and its grok[<model>] bracket
through the multi-reviewer loop (validation, dedup identity, effective-model
resolution, binary probe, dispatch) and every command that documents
--review-with (pr, rpr, review, better, better-swift, depfree, release,
config) plus review-config-defaults and the README reviewer table — so the
accepted-slug lists and 'Unknown --review-with value' abort messages stay
consistent across the codebase. Add a config round-trip test covering
grok[<model>] in review-with and a review-models.grok entry.

Follow-up to #111, which defined the grok headless invocation for --enhance-with.

Closes #120
…r dispatch table

release.md advertised grok in its abort text but its accepted-values list
(line 13), model-bracket note (15), and dispatch table (176) still omitted it,
so --review-with grok was rejected/unrouted there. Swept every remaining
local-agent enumeration: review.md dispatch, rpr.md loop heading, the commit-
attribution slug list, and ollama-review-loop's 'unlike the agentic reviewers'
contrast.
Make grok a first-class --review-with reviewer
…m release review

Release-gate review findings: recompute per-entry MODEL_FLAG/AGY_ENH_MODEL so a
prior agent's [model] bracket can't leak into the next pass; set EXIT_CODE=0 on
the in-process claude path so a stale subprocess exit code can't void a good
enhancement; verify the enhancer's read-only contract with git baselines and
revert violations; make TIMEOUT_CMD a shell array in all three loops (a two-word
string is executed as one bogus command under zsh, failing exactly when coreutils
IS installed); add cli-error to the parallel-mode inconclusive list; add grok to
the stale reviewer enumerations in pr.md/release.md/README.
…ct checks

- reset --mixed (never --hard) when a contract-violating enhancer committed,
  so the caller's pre-existing uncommitted work swept into its commit survives
- diff-hash baseline + stash-create snapshot to detect and restore edits to
  files that were already dirty (identical porcelain line either way)
- least-privilege invocations: codex --sandbox read-only, grok dontAsk
- stderr to a separate file so post-answer CLI noise can't leak into the
  parsed issue body
- load drafts via quoted heredocs so $(...)/backticks in issue markdown are
  never shell-expanded
- parallel-mode carve-out: cli-error from an optional reviewer still blocks
…eredoc-load REPO_CONTEXT

git checkout -- restores from the index, so an enhancer killed between add and
commit kept its staged edits through the 'restore'; use git restore
--source=HEAD_BASELINE --staged --worktree (and git rm --cached for staged new
files). REPO_CONTEXT gets the same quoted-heredoc loading as the draft fields —
it carries the same backtick/$() expansion hazard.
…nce-loop rollback

git diff HEAD and git stash create both ignore untracked files, so an enhancer
that edited or deleted a caller's untracked work-in-progress file was undetected
(unchanged ?? porcelain line) and unrestorable. Add an untracked content tarball
plus a path+hash baseline to the step-2 snapshot and a matching detect/restore
branch in step 4.
…plan-task

A model selector with spaces (agy[Gemini 3.5 Flash (High)]) split on whitespace
leaks its tail into the free-form task description that follows the flags in
this command; end the value at the first whitespace outside brackets.
…d runs, explicit detach instruction

dontAsk does not dependably auto-approve grok's headless tool calls, so an
unattended enhance pass could hang waiting for approval and degrade to no-op;
keep bypassPermissions (grok has no read-only sandbox) with the step-4 git
contract check as the write backstop. Also state that the launch snippet must
run via the host's background mode (or a trailing &) — it is not self-detaching,
and a foreground run is killed at the host's ~10-min cap before polling starts.
…oop rollback

Per-path rollback choreography kept growing destructive edge cases (mixed reset
wipes the caller's staged state, then porcelain-line comparison misreads 'M ' as
' M' and restores the caller's own edit away). Replace it: snapshot the full
pre-pass state (HEAD, index via write-tree, tracked worktree via stash commit,
untracked via tar) and on violation restore all four layers wholesale — soft
reset, read-tree, restore --source, tar re-extract — then re-verify against the
baselines. Sequence validated end-to-end in a sandbox repo (staged + unstaged +
untracked + agent-commit case).
…gitignored-file writes

The untracked-files hash piped filenames through xargs -I{} into sh -c, so an
untracked file named $(cmd).txt would execute cmd during snapshotting; switch
to git hash-object --stdin-paths (no shell sees the names — verified in a
sandbox repo). Gitignored files stay outside the snapshot/restore guarantee
(tarring node_modules is unbounded) but now get cheap mtime-window detection
and a loud not-auto-restorable warning instead of silence.
@atomantic
atomantic merged commit 86f0e00 into release Jul 12, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant