Five coding questions, GPT-6 Astra with a bash tool. Each one run with no tool, with RTK, with Headroom, and with both; three times each, 60 sessions, all 60 answers correct. The only thing that changed between setups was what the model saw.
Total cost of the five tasks per setup, mean of three runs. Green lowest, orange highest; with three runs per cell the order between the middle two can still flip on a re-run.
| Task | No toolruns 1, 2, 3 | RTKruns 1, 2, 3 | Headroomruns 1, 2, 3 | Bothruns 1, 2, 3 |
|---|---|---|---|---|
| Which file defines the CLI enum, how many variantsgrep + read one file | $0.049$0.043$0.035 | $0.057$0.055$0.037 | $0.034$0.074$0.024 | $0.074$0.067$0.055 |
Show all 12 runs: every command and answerNo tool · run 1 · 4 turns · $0.049
Astra answered `src/main.rs` — 86 variants. correct No tool · run 2 · 5 turns · $0.043
Astra answered `src/main.rs` — 86 variants. correct No tool · run 3 · 5 turns · $0.035
Astra answered `src/main.rs` — 86 variants. correct RTK · run 1 · 5 turns · $0.057
Astra answered `src/main.rs` — 86 variants. correct RTK · run 2 · 5 turns · $0.055
Astra answered src/main.rs — 86 variants. correct RTK · run 3 · 7 turns · $0.037
Astra answered src/main.rs 86 correct Headroom · run 1 · 4 turns · $0.034
Astra answered `src/main.rs` — 86 variants. correct Headroom · run 2 · 5 turns · $0.074
Astra answered `src/main.rs` — 86 variants. correct Headroom · run 3 · 4 turns · $0.024
Astra answered `src/main.rs` — 86 variants. correct Both · run 1 · 6 turns · $0.074
Astra answered src/main.rs — 86 variants. correct Both · run 2 · 7 turns · $0.067
Astra answered src/main.rs 86 correct Both · run 3 · 5 turns · $0.055
Astra answered src/main.rs — 86 variants. correct | ||||
| Which SQLite table does `rtk gain` read, where is the path setscoped grep over three paths | $0.123$0.066$0.094 | $0.042$0.060$0.055 | $0.121$0.123$0.051 | $0.110$0.090$0.061 |
Show all 12 runs: every command and answerNo tool · run 1 · 6 turns · $0.123
Astra answered SQLite table: `commands` Database location defined in: `src/core/tracking.rs` (`get_db_path()`). correct No tool · run 2 · 4 turns · $0.066
Astra answered - SQLite table: `commands` - Database location defined in: `src/core/tracking.rs` (`get_db_path()`) correct No tool · run 3 · 5 turns · $0.094
Astra answered - SQLite table: `commands` - Database location defined in: `src/core/tracking.rs` (`get_db_path()`) correct RTK · run 1 · 4 turns · $0.042
Astra answered `rtk gain` reads savings data from the SQLite **`commands`** table. The database location is defined by `get_db_path()` in **`src/core/tracking.rs`**. correct RTK · run 2 · 4 turns · $0.060
Astra answered - SQLite table: `commands` - Database location defined in: `src/core/tracking.rs` (`get_db_path`) correct RTK · run 3 · 4 turns · $0.055
Astra answered - SQLite table: `commands` - Database location defined in: `src/core/tracking.rs` (`get_db_path()`) correct Headroom · run 1 · 5 turns · $0.121
Astra answered - **SQLite table:** `commands` - **Database location defined in:** `src/core/tracking.rs:1492`, in `get_db_path()`. correct Headroom · run 2 · 5 turns · $0.123
Astra answered SQLite table: `commands` Database location defined in: `src/core/tracking.rs` (`get_db_path()`). correct Headroom · run 3 · 4 turns · $0.051
Astra answered - SQLite table: `commands` - Database location defined in: `src/core/tracking.rs` (`get_db_path()`) correct Both · run 1 · 5 turns · $0.110
Astra answered - **SQLite table:** `commands` - **Database location defined in:** `src/core/tracking.rs` (`get_db_path()`) correct Both · run 2 · 6 turns · $0.090
Astra answered - **SQLite table:** `commands` - **Database location defined in:** `src/core/tracking.rs`, in `get_db_path()`. correct Both · run 3 · 5 turns · $0.061
Astra answered `rtk gain` reads savings data from the SQLite **`commands`** table. The database location is defined in **`src/core/tracking.rs`**, in `get_db_path()`. correct | ||||
| How many subfolders under src/cmds, which has most .rs filesdirectory listing (RTK's turf) | $0.004$0.004$0.004 | $0.004$0.052$0.019 | $0.004$0.004$0.004 | $0.020$0.004$0.004 |
Show all 12 runs: every command and answerNo tool · run 1 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct No tool · run 2 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct No tool · run 3 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct RTK · run 1 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct RTK · run 2 · 9 turns · $0.052
Astra answered 12, system correct RTK · run 3 · 5 turns · $0.019
Astra answered 12 subdirectories; `system` contains the most `.rs` files. correct Headroom · run 1 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct Headroom · run 2 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct Headroom · run 3 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct Both · run 1 · 5 turns · $0.020
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct Both · run 2 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct Both · run 3 · 2 turns · $0.004
Astra answered 12 subdirectories; `system` contains the most `.rs` files (17). correct | ||||
| Top-level keys of `rtk gain --format json`, name of the date fielda JSON tool result (Headroom's turf) | $0.007$0.007$0.007 | $0.007$0.007$0.007 | $0.005$0.005$0.005 | $0.005$0.005$0.005 |
Show all 12 runs: every command and answerNo tool · run 1 · 2 turns · $0.007
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field inside each `daily` item: `date`. correct No tool · run 2 · 2 turns · $0.007
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field in each `daily` item: `date`. correct No tool · run 3 · 2 turns · $0.007
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field inside each `daily` item: `date`. correct RTK · run 1 · 2 turns · $0.007
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field inside each `daily` item: `date`. correct RTK · run 2 · 2 turns · $0.007
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field in each `daily` item: `date`. correct RTK · run 3 · 2 turns · $0.007
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field in each `daily` item: `date`. correct Headroom · run 1 · 2 turns · $0.005
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field inside each `daily` item: `date`. correct Headroom · run 2 · 2 turns · $0.005
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field inside each `daily` item: `date`. correct Headroom · run 3 · 2 turns · $0.005
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field in each `daily` item: `date`. correct Both · run 1 · 2 turns · $0.005
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field in each `daily` item: `date`. correct Both · run 2 · 2 turns · $0.005
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field in each `daily` item: `date`. correct Both · run 3 · 2 turns · $0.005
Astra answered Top-level keys: `summary`, `daily`, `weekly`, `monthly`. Date field in each `daily` item: `date`. correct | ||||
| What `estimate_tokens` returns for "", and the formula's lineone large file | $0.006$0.006$0.006 | $0.006$0.006$0.006 | $0.006$0.006$0.006 | $0.015$0.006$0.006 |
Show all 12 runs: every command and answerNo tool · run 1 · 2 turns · $0.006
Astra answered 0, line 1659. correct No tool · run 2 · 2 turns · $0.006
Astra answered 0, line 1659. correct No tool · run 3 · 2 turns · $0.006
Astra answered 0, line 1659. correct RTK · run 1 · 2 turns · $0.006
Astra answered 0, line 1659. correct RTK · run 2 · 2 turns · $0.006
Astra answered 0, line 1659. correct RTK · run 3 · 2 turns · $0.006
Astra answered 0, line 1659. correct Headroom · run 1 · 2 turns · $0.006
Astra answered 0, line 1659. correct Headroom · run 2 · 2 turns · $0.006
Astra answered 0, line 1659. correct Headroom · run 3 · 2 turns · $0.006
Astra answered 0, line 1659. correct Both · run 1 · 2 turns · $0.015
Astra answered 0, line 1659. correct Both · run 2 · 2 turns · $0.006
Astra answered 0, line 1659. correct Both · run 3 · 2 turns · $0.006
Astra answered 0, line 1659. correct | ||||
| All five | $0.154 | $0.139 | $0.158 | $0.175 |
The four setups landed within 5 cents of each other on every task, usually within two. Why so close: the model chooses its own commands, and it chose differently each run. On the grep task, Astra saw between 2,830 and 3,379 tool tokens with no tool, and between 2,555 and 4,252 with Headroom, because one run added | head -70 and another did not. That gap exists before any tool acts. On the directory-listing task, the three RTK runs took 2, 5 and 9 turns; in the 9-turn run Astra re-ran the listing with small variations before committing. 9 of the 20 cells stayed within 10% across all three runs; 5 spread by 2x or more.
Each cell shows all three runs, top to bottom, cost with cache. Green is the cheapest run in the row, orange the most expensive. The totals row is the mean of the three runs summed over the five tasks, so it will not match a sum of any single column above. Click "Show all 12 runs" under any task for every command Astra ran and the answer it gave.
The only cell where a tool beat no-tool in every run by a clear margin is RTK on the multi-file grep, where it grouped the output by file. Headroom's edge on the JSON task, the payload it is built for, is a fraction of a cent. Running both tools was never lowest.
The single largest reduction any tool made across all 40 runs. SQLite task, RTK setup, run 2, turn 2: Astra ran this to find where the database path is set.
rg -n 'db_path|\.db|FROM commands' src/core/tracking* src/analytics/gain* src/core/config.rs
src/core/tracking.rs:9://! - Storage: SQLite database (~/.local/share/rtk/tracking.db)
src/core/tracking.rs:76:/// - Linux: `~/.local/share/rtk/tracking.db`
src/core/tracking.rs:77:/// - macOS: `~/Library/Application Support/rtk/tracking.db`
src/core/tracking.rs:78:/// - Windows: `%APPDATA%\rtk\tracking.db`
src/core/tracking.rs:178:/// `rtk_version` for direct inspection (`sqlite3 tracking.db`), but nothing in Rust
src/core/tracking.rs:349: "SELECT EXISTS(SELECT 1 FROM commands WHERE project_path IS NULL)",
src/core/tracking.rs:551: "DELETE FROM commands WHERE timestamp < ?1",
src/core/tracking.rs:570: DELETE FROM commands;
src/core/tracking.rs:832: FROM commands
src/core/tracking.rs:890: FROM commands
src/core/tracking.rs:918: FROM commands
src/core/tracking.rs:968: FROM commands
src/core/tracking.rs:1042: FROM commands
src/core/tracking.rs:1116: FROM commands
src/core/tracking.rs:1191: FROM commands
src/core/tracking.rs:1218: "SELECT COUNT(*) FROM commands WHERE timestamp >= ?1",
src/core/tracking.rs:1228: "SELECT rtk_cmd, COUNT(*) as cnt FROM commands
src/core/tracking.rs:1242: "SELECT COALESCE(SUM(input_tokens), 0), COALESCE(SUM(saved_tokens), 0) FROM commands",
src/core/tracking.rs:1256: "SELECT COALESCE(SUM(saved_tokens), 0) FROM commands",
src/core/tracking.rs:1267: "SELECT COALESCE(SUM(saved_tokens), 0) FROM commands WHERE timestamp >= ?1",
src/core/tracking.rs:1279: COUNT(*) as cnt FROM commands
src/core/tracking.rs:1305: "SELECT rtk_cmd, AVG(savings_pct) as avg_sav FROM commands
src/core/tracking.rs:1325: FROM commands WHERE input_tokens > 0
src/core/tracking.rs:1338: "SELECT COUNT(*) FROM commands WHERE rtk_cmd LIKE ?1 || '%'",
src/core/tracking.rs:1350: .query_row("SELECT MIN(timestamp) FROM commands", [], |row| row.get(0))
src/core/tracking.rs:1375: "SELECT COUNT(DISTINCT DATE(timestamp)) FROM commands WHERE timestamp >= ?1",
src/core/tracking.rs:1386: .query_row("SELECT COUNT(*) FROM commands", [], |row| row.get(0))?;
src/core/tracking.rs:1393: "SELECT COUNT(*) FROM commands WHERE input_tokens > 0 AND timestamp >= datetime('now', '-90 days')",
src/core/tracking.rs:1401: "SELECT rtk_cmd, COUNT(*) as cnt FROM commands
src/core/tracking.rs:1431: "SELECT COALESCE(SUM(saved_tokens), 0) FROM commands WHERE timestamp >= ?1",
… 57 more lines87 matches in 2 files:
src/core/config.rs:251:/// `tracking::get_db_path` (called via `Tracker::new()` for `hook_decisions`
src/core/tracking.rs:9://! - Storage: SQLite database (~/.local/share/rtk/tracking.db)
src/core/tracking.rs:76:/// - Linux: `~/.local/share/rtk/tracking.db`
src/core/tracking.rs:77:/// - macOS: `~/Library/Application Support/rtk/tracking.db`
src/core/tracking.rs:78:/// - Windows: `%APPDATA%\rtk\tracking.db`
src/core/tracking.rs:178:/// `rtk_version` for direct inspection (`sqlite3 tracking.db`), but nothing ...
src/core/tracking.rs:349:"SELECT EXISTS(SELECT 1 FROM commands WHERE project_path IS NULL)",
src/core/tracking.rs:551:"DELETE FROM commands WHERE timestamp < ?1",
src/core/tracking.rs:570:DELETE FROM commands;
src/core/tracking.rs:832:FROM commands
src/core/tracking.rs:890:FROM commands
src/core/tracking.rs:918:FROM commands
src/core/tracking.rs:968:FROM commands
src/core/tracking.rs:1042:FROM commands
src/core/tracking.rs:1116:FROM commands
src/core/tracking.rs:1191:FROM commands
src/core/tracking.rs:1218:"SELECT COUNT(*) FROM commands WHERE timestamp >= ?1",
src/core/tracking.rs:1228:"SELECT rtk_cmd, COUNT(*) as cnt FROM commands
src/core/tracking.rs:1242:"SELECT COALESCE(SUM(input_tokens), 0), COALESCE(SUM(saved_tokens), 0) FROM c...
src/core/tracking.rs:1256:"SELECT COALESCE(SUM(saved_tokens), 0) FROM commands",
src/core/tracking.rs:1267:"SELECT COALESCE(SUM(saved_tokens), 0) FROM commands WHERE timestamp >= ?1",
src/core/tracking.rs:1279:COUNT(*) as cnt FROM commands
src/core/tracking.rs:1305:"SELECT rtk_cmd, AVG(savings_pct) as avg_sav FROM commands
src/core/tracking.rs:1325:FROM commands WHERE input_tokens > 0
src/core/tracking.rs:1338:"SELECT COUNT(*) FROM commands WHERE rtk_cmd LIKE ?1 || '%'",
src/core/tracking.rs:1350:.query_row("SELECT MIN(timestamp) FROM commands", [], |row| row.get(0))
+61 more in src/core/tracking.rs [see remaining: tail -n +26 ~/.local/share/rtk/tee/1788952114_grep_1_s_f115cc.log]RTK groups matches by file and trims long lines. The lines Astra needed (tracking.rs, the db path function) are in both. This is what a good case looks like: 71% fewer tokens on one command, worth about $0.014 at first send. Most commands in these runs were already small enough that there was nothing to group.
Tool output the model actually read, summed over the five tasks: no tool 6,165 tokens, RTK 5,462 (11% less), Headroom 6,071, both 5,442. Astra scoped most reads itself with rg | head and sed -n, so there was little for either tool to remove.
Two things to know. A sixth task (the subject line and author of the 10th most recent commit) is not in the grid: Astra had the correct answer in its tool output on turn 1 and then re-ran git log with small variations until the turn cap, never writing a reply, in every run. One task, one behaviour, no conclusion drawn from it. And this is a bare API loop that re-sends full history every turn; Codex CLI and similar agents compact history, so absolute numbers there are lower, though the ordering between setups should not change.
Model prices and the tools chasing them change weekly. This test came out of the release feed I keep at BlogNetwork: one page, every AI release, updated every two hours.
See this week's releases