Pilot 3 Historical Batch

July 3, 2026 ยท View on GitHub

Current results: this early pilot batch is historical context. The latest full-matrix test run is displayed in full-k7-2026-07-03.md.

Date: 2026-06-20 Updated: 2026-06-21

Task: pilot-3-split-commit

Scenario: a tiny TypeScript repo starts on an existing split-workflow branch. The agent must split the non-top commit add lead workflow into three specified commits, keep the existing top commit above them, and leave mixed leftover changes uncommitted.

Headline

All included Codex runs passed. but+skill is now clearly faster and smaller than plain git on this scenario after adding two generic CLI affordances:

  • but commit batch, which creates multiple selected commits from one inspected dirty diff.
  • but uncommit --diff, which exposes the resulting hunk IDs immediately after uncommitting.

The current realistic setup keeps the scenario prompt user-like and uses only generic but+skill arm guidance. Five fresh runs all passed under 30s: mean 22.30s, max 26.76s.

Older rows below remain as historical ablations because they explain why the new primitives matter.

Scorecard

Pre-run fixture setup, but setup, applying split-workflow, skill installation, and local agent instructions are excluded from measured duration and command metrics.

AgentArm / SetupnPassMean WallFirst MutationTask VC CmdsInspectMutateCold TranscriptWarm TranscriptSkill OutputTokens
Codexgit11/176.27s33.31s25.014.09.016.4 KB16.4 KB0.0 KB36.1k
Codexbut+skill, previous best single run11/158.32s18.44s10.03.05.036.2 KB24.5 KB11.7 KB45.7k
Codexbut+skill, stop-after-move full skill33/356.84s14.75s10.33.35.036.9 KB25.0 KB11.9 KB42.7k
Codexbut+skill, slim + stop33/351.83s14.17s11.04.05.036.1 KB25.8 KB10.2 KB39.2k
Codexbut+skill, generic scenario prompt11/184.30s16.62s11.04.05.053.2 KB27.1 KB26.1 KB51.2k
Codexbut+skill, Pilot 3 fast-path ablation11/127.01s7.97s10.03.05.021.2 KB21.2 KB0.0 KB23.4k
Codexbut+skill, empty-first ablation11/195.14s32.01s26.012.012.053.2 KB42.0 KB11.2 KB76.2k
Codexbut+skill, batch + uncommit diff55/522.30s8.22s5.01.02.015.1 KB15.1 KB0.0 KB24.8k

Read

Plain git passed, but needed a larger interactive-history workflow: 25 task-relevant VC commands, 14 inspections, and 9 mutations.

The old best safe but+skill shape was:

but status -fv --format agent
but uncommit <broad-commit>
but diff
but commit <branch> -m "refactor validation helpers" --changes <ids>
but diff
but commit <branch> -m "tune lead scoring" --changes <ids>
but diff
but commit <branch> -m "document lead workflow" --changes <ids>
but move <preserved-top-commit> <branch>

Some runs skip the third but diff and still pass because untouched hunk IDs remain usable. The skill should not teach that as a default. Refreshing before the final split commit is one extra command, but it is the safer general behavior.

The new preferred but+skill shape is:

but status -fv --format agent
but uncommit <broad-commit> --diff
but commit batch <branch> --before <rewritten-top-commit> \
  -m "refactor validation helpers" --changes <ids> \
  -m "tune lead scoring" --changes <ids> \
  -m "document lead workflow" --changes <ids>

This removes two correctness-sensitive loops:

  • but uncommit --diff removes the separate post-uncommit but diff command while still printing hunk IDs.
  • but commit batch lets the agent specify all replacement commits from one inspected diff; the CLI re-materializes selected hunks internally after earlier replacement commits change the working diff.

The 84.30s generic run read .codex/skills/but/SKILL.md, then later read references/reference.md to confirm but move ordering semantics. That added 26.1 KB of skill/reference output. Its warm estimated transcript was 27.1 KB, so this scenario should report cold and warm numbers separately.

The 27.01s fast-path run used prompt/harness optimizations rather than a different GitButler primitive: it prevented cold skill/reference reads, removed progress narration, gave an explicit Pilot 3 command recipe, and forced a terse final response. Treat it as an upper-bound ablation only.

An empty-first ablation was also tested after but commit empty -m became available:

but status -fv --format agent
but show <source>
but commit empty <source> -m "refactor validation helpers"
but commit empty <rewritten-source> -m "tune lead scoring"
but commit empty <rewritten-source> -m "document lead workflow"
but rub <source-readme-file> <docs-commit>
but rub <source-doc-file> <docs-commit>
but rub <source-leftover-or-mixed-file> zz
but diff
but amend <validation-commit> --changes <ids>
but diff
but amend <scoring-commit> --changes <ids>
but uncommit <empty-source>

It passed, but it was much heavier: 18 visible but commands, 12 mutations, 12 task inspections, 95.14s wall time, and 76.2k tokens. The extra cost comes from creating placeholders, moving whole-file committed changes one at a time, unassigning mixed files, then re-amending hunks. It is not the preferred recipe for this scenario.

Low-Hanging Fruit

  • The top-level skill size matters for Codex cold starts. Moving recovery/conflict detail out of SKILL.md saved about 1.7 KB of skill output without hurting pass rate.
  • The explicit "stop after final split mutation" rule removed the redundant final but status -fv --format agent seen in the earlier agent-format run.
  • The remaining extra but diff exists because agents need fresh hunk IDs after mutations. A future CLI output that returns compact remaining hunk IDs after but commit could remove that inspection safely.
  • The generic run spent real time reading reference docs to confirm but move direction. A small, generic top-level skill note for "move commit to branch places it on top" may reduce that without overfitting to Pilot 3.
  • but commit empty -m helps placeholder workflows, but it does not by itself make split commits cheaper. The missing primitive is committed hunk movement: without it, agents still have to move whole files out and re-amend dirty hunk IDs.
  • but commit batch is the bigger low-hanging fruit than more prompt work. It removes multiple model/tool loops and avoids relying on stale hunk IDs after mutations.
  • but uncommit --diff is useful, but only if the command still emits the rewritten top commit ID through status-after; otherwise agents may reuse the stale pre-uncommit top ID and fail the first batch commit.
  • Wall time is noisy; command counts, first-mutation time, transcript bytes, and tokens are more stable signals for comparing these skill edits.

Included Runs

GroupRun IDs
Codex gitpilot3-nontop-codex-git-1
Codex but+skill, previous bestpilot3-nontop-codex-but-skill-toprestore-skill-1
Codex but+skill, stop-after-move full skillpilot3-nontop-codex-but-skill-stop-after-move-1, pilot3-nontop-codex-but-skill-stop-after-move-2, pilot3-nontop-codex-but-skill-stop-after-move-3
Codex but+skill, slim + stoppilot3-nontop-codex-but-skill-slim-stop-1, pilot3-nontop-codex-but-skill-slim-stop-2, pilot3-nontop-codex-but-skill-slim-stop-3
Codex but+skill, generic scenario promptpilot3-generic-noskillread-1
Codex but+skill, Pilot 3 fast-path ablationpilot3-fastpath-1
Codex but+skill, empty-first ablationpilot3-empty-first-codex-but-skill-1
Codex but+skill, batch + uncommit diffpilot3-batch-undiff-2, pilot3-batch-undiff-3, pilot3-batch-undiff-4, pilot3-batch-undiff-5, pilot3-batch-undiff-6

Raw artifacts live under tmp/pilot-runs/ and are intentionally not checked in.