Skip to content

Hillclimb graff vs grok-build on grok-4.6 list-price axes - #684

Closed
justrach wants to merge 8 commits into
mainfrom
cursor/hillclimb-grok-4ffc
Closed

Hillclimb graff vs grok-build on grok-4.6 list-price axes#684
justrach wants to merge 8 commits into
mainfrom
cursor/hillclimb-grok-4ffc

Conversation

@justrach

@justrach justrach commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Score evals at xAI grok-4.6 list price, then copy what grok-build actually does — not a side bet.

The fix (shared -p / REPL path)

The 127M tax was learn_auto byte-copying zig-out/bin/graff into .graff/learn-kit/graff-pinned after five API calls (~38s CPU on fix-fib). grok-build does not do that.

Skipping learn-auto on -p hid the copy from oneshots and left the REPL/TUI still doing it. That path split is retracted.

This revision:

  1. Hardlink graff-pinned (same inode, O(1); graff update replacing the live path leaves the pin). Copy only when the filesystem cannot. Proven at /tmp/graff-pin-proof: pin and zig-out/bin/graff share inode 1478920, nlink=2.
  2. -p, piped graff repl, and TTY graff tui share one learn-auto path. Scripted graff repl prints the same [usage] footer so both surfaces score.
  3. Session-end learn init is detached (ADR 0045) — same process-group spawn as a background trial. Suite generation is still ~38s of CPU; teardown no longer waits on it.

x_search stays on (ADR 0031). grok-build 1.0.5 still lists web_search / web_fetch. Heap and catalog untouched (ADR 0024).

Live A/B — run-20260830-042417.jsonl

Same SuperGrok / grok OAuth, grok-4.6, one rep, three core tasks. x_search on. -p and scripted graff repl were measured the same way.

harness pass wall first calls tokens list$ RSS
graff-dev (-p) 3/3 22.2s 2.8s 8 ~32k $0.0374 90.7M
grok-build 3/3 37.0s 3.9s 7 ~116k $0.1474 155.4M
graff-dev-repl 3/3 25.2s 0.03s (echo) 9 ~64k $0.1185 91.8M

REPL is fatter than -p because it is not lean-oneshot. REPL first_out_s is composer echo — ignore it; it is not time-to-first-model-token.

task graff -p wall / $ / calls grok wall / $ / calls
exact-reply 2.55s / $0.0067 / 1 2.68s / $0.0322 / 1
fix-fib 10.63s / $0.0170 / 4 26.90s / $0.0708 / 4
file-ops 8.99s / $0.0137 / 3 7.39s / $0.0444 / 2

This run's fix-fib used 4 API calls, so learn-auto did not fire (threshold is 5). No pin in those sandboxes.

Interactive TUI (same fix-fib)

graff tui --yolo --model grok-4.6 on a PTY (Ctrl+Q): test printed OK at 5.9s, turn 7.4s, session 9.3s including boot/quit. .graff was 52K. No graff-pinned, no extra 127M inode. Four API-call traces (quit during the fourth after the test passed), so learn-auto did not fire — same threshold miss as the -p row. First model token 2.6s.

Not strict Pareto

No. Grok-build still wins calls (7 vs 8 on -p, 7 vs 9 on REPL) and file-ops wall. We win wall, tokens, list$, and RSS. Pass is a tie. Do not claim a 5-axis win. Heap still theirs (155M vs 91M) — not stolen.

On this 3-point set both -p and grok-build are non-dominated (they own calls; we own the rest). That is a shared front, not a win.

Frontier graph

Two 2D projections of that live 3-task set (lower-left is better). Source: graff-evals/hillclimb/frontier-20260830.svg and baseline.md.

Pareto projections: wall vs list$ and calls vs list$

point 5-axis wall vs $ calls vs $
graff-dev (-p) on (cheaper / faster) on (best both) on (cheaper)
grok-build on (fewer calls) interior on (fewer calls)
graff-dev-repl interior (dominated by -p) interior interior
flowchart LR
  subgraph front[5-axis frontier - neither dominates]
    P[graff-dev -p: 22.2s / $0.0374 / 8 calls / on via cheaper and faster]
    G[grok-build: 37.0s / $0.1474 / 7 calls / on via fewer calls]
  end
  R[graff-dev-repl: 25.2s / $0.1185 / 9 calls / interior, dominated by -p]
  P -->|wins wall, calls, tokens, list$, RSS| R
Loading

Open in Web Open in Cursor

Score graff-evals at xAI grok-4.6 list prices instead of SuperGrok's
$0.0000 footer, and keep harness changes only when wall / first-token
latency / calls / tokens / USD improve. Refuse grok-build heap and a
4-tool catalog. Historical paired JSONL is the scored baseline;
grok-build is unsigned-in on this host.
Same-day A/B on exact-reply, file-ops, and fix-fib: GRAFF_XAI_X_SEARCH=0
cut wall 15%, first-token 38%, tokens 38%, and list-price USD 49% vs
the x_search-on champion. Calls and pass held. grok-build still wins
summed wall on fix-fib and uses ~6x the tokens once cache is counted.
Promote the knob onto the eval harnesses only; product default stays
ADR 0031. Heap and catalog untouched.
@justrach
justrach marked this pull request as ready for review August 30, 2026 03:50
grok-build 1.0.5 still has web_search on; x_search-off was the wrong
steal. Their headless path does not copy a 127M binary into cwd.
graff -p with ≥5 API calls was materializing .graff/learn-kit/graff-pinned
and burning ~38s CPU on fix-fib. One-shot/json now skip that bootstrap.
Lean intro takes their 'prefer file tools, do local work this turn'.
graff-dev 3/3 in 21.8s / $0.048 vs grok-build 27.3s / $0.142 on the
same three grok-4.6 tasks. fix-fib sandbox is 76K (was 127M).
x_search stays on; x-search-off is not a grok-build copy.
The 127M tax was copyExecutable after five API calls, not hosted search.
Skipping learn-auto on -p hid it from oneshots and left the TUI/REPL
copying zig-out/bin/graff into .graff/learn-kit/graff-pinned. Pin with a
hardlink (same inode, survives graff update) and copy only when the
filesystem cannot. Scripted `graff repl` now prints the same [usage]
footer so evals can score both surfaces.
autoInitLearning now spawns `graff learn init` in its own process group,
same pattern as a background trial. Suite generation was ~38s of CPU after
the pin became a hardlink; that tax no longer sits on teardown.

Live 3-task A/B (run-20260830-042417): we win wall/tokens/list$/RSS and
lose calls — not Pareto vs grok-build. ADR 0045.
Two 2D projections of run-20260830-042417 (wall vs list$, calls vs
list$). Honest: we are not strict Pareto — grok still wins calls (7 vs
8/9). graff-dev sits on the frontier via cheaper/faster; grok via fewer
calls; the REPL point is interior (dominated by -p). REPL first-token
is composer echo and is not plotted.
Interactive graff tui --yolo --model grok-4.6: test printed OK at 5.9s,
no graff-pinned, no 127M extra inode. Same 4-call miss of the learn-auto
threshold as the -p row. Still not Pareto vs grok-build (they win calls).
@justrach

Copy link
Copy Markdown
Owner Author

Hillclimb product/evals landed via 281 (#687/#688/#690). Held items (oneshot skip, x_search off) stay out of tip. Closing as superseded.

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.

2 participants