@garuda-agent/garuda 0.16.1 → 0.18.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.
- package/CHANGELOG.md +319 -0
- package/README.md +56 -1074
- package/SECURITY.md +9 -2
- package/dist/{acpCommand-OTAYW7BS.js → acpCommand-IUZPLPLI.js} +25 -23
- package/dist/{anthropic-NQDBCHJU.js → anthropic-NQIZLD64.js} +12 -6
- package/dist/{chunk-NP6RIC25.js → chunk-2FIV2VZP.js} +11 -7
- package/dist/{chunk-YQTGMCU6.js → chunk-3MRQJKUO.js} +29 -5
- package/dist/{chunk-HE2K657U.js → chunk-4BVCYCQT.js} +47 -16
- package/dist/{chunk-WMOLXTBU.js → chunk-4LFJFDCF.js} +2 -1
- package/dist/{chunk-44QN5SWZ.js → chunk-55CFEEIN.js} +22 -2
- package/dist/{chunk-USCUXCAU.js → chunk-5B5HDTUR.js} +3 -3
- package/dist/chunk-65NUEOI7.js +143 -0
- package/dist/{chunk-TUUEBHG2.js → chunk-6XHON3Q6.js} +2 -2
- package/dist/chunk-7KBOIPUT.js +157 -0
- package/dist/{chunk-B6FA4I7Q.js → chunk-7TH3NHCQ.js} +2 -2
- package/dist/{chunk-OUCV3FCT.js → chunk-AOGFYUKG.js} +3 -3
- package/dist/{chunk-GXZACJUI.js → chunk-B4SJY7KT.js} +322 -39
- package/dist/{chunk-3EQU2GUX.js → chunk-BHZ6G65V.js} +5 -1
- package/dist/chunk-C57GHLKP.js +9 -0
- package/dist/chunk-DOCDCQVM.js +484 -0
- package/dist/chunk-FOPBOB7W.js +332 -0
- package/dist/{chunk-TILFPYWO.js → chunk-NHWHG3SW.js} +1930 -992
- package/dist/{chunk-BQTUOO4G.js → chunk-OQ26W5L4.js} +81 -32
- package/dist/{chunk-HUIK3WXO.js → chunk-P6XWWIEK.js} +20 -3
- package/dist/chunk-Q4P3W657.js +6372 -0
- package/dist/{chunk-ZAE25JM2.js → chunk-QANRZW7W.js} +8 -1
- package/dist/chunk-UIRJOQQS.js +118 -0
- package/dist/chunk-UKIE4AAM.js +472 -0
- package/dist/{chunk-KKB5W47S.js → chunk-VTMD5IHD.js} +26 -2
- package/dist/cli/index.js +148 -57
- package/dist/config-WV2H64TF.js +23 -0
- package/dist/{create-VXIH2GUZ.js → create-W6BV75QX.js} +18 -12
- package/dist/{deadline-F5RJJ2QW.js → deadline-TP7ZGLT2.js} +4 -2
- package/dist/evalCommand-SKJQ6CW2.js +686 -0
- package/dist/evalTune-CZRCPSZ3.js +295 -0
- package/dist/{export-HN3CT7AV.js → export-SJ3DUP6W.js} +2 -2
- package/dist/{inkChat-WEDGQMCY.js → inkChat-WYYAFZXD.js} +20 -19
- package/dist/install-TKWN5AYH.js +19 -0
- package/dist/{job-3NYDMP2M.js → job-7JOI4YIQ.js} +6 -2
- package/dist/jobCommand-2ODQLHB3.js +33 -0
- package/dist/{launchd-SSX362VG.js → launchd-3A3ONEW5.js} +9 -8
- package/dist/{lspCommand-JRXKRSL7.js → lspCommand-ZZ6R4PA2.js} +7 -6
- package/dist/{manager-773PUDFE.js → manager-TCYTA5XU.js} +15 -14
- package/dist/{nightCommand-65MUEV32.js → nightCommand-WJU6VZA6.js} +26 -20
- package/dist/{openaiCompatible-CJWVJP5M.js → openaiCompatible-6TLDDW5U.js} +29 -15
- package/dist/{policy-EJPLEEXP.js → policy-ZJ7RMOFN.js} +10 -4
- package/dist/{remove-6GDSTAIO.js → remove-42WQNVPX.js} +8 -7
- package/dist/{run-ML6GSPN4.js → run-PTMRQCIU.js} +5 -5
- package/dist/{server-NGKVIQEV.js → server-VEYIJHEU.js} +2 -2
- package/dist/{setupCommand-VA7D5MZK.js → setupCommand-YMF6I3MD.js} +45 -13
- package/dist/text-LS35WSRL.js +17 -0
- package/dist/tune-YVI2KWQF.js +31 -0
- package/native/bin/garuda-reap +0 -0
- package/native/garuda-reap.c +113 -0
- package/package.json +39 -13
- package/dist/chunk-EIXUSVFX.js +0 -116
- package/dist/chunk-R7I2NBPX.js +0 -71
- package/dist/chunk-ULAJPMY7.js +0 -107
- package/dist/chunk-VBZCNMUD.js +0 -9
- package/dist/evalCommand-RGMZRYDR.js +0 -2812
- package/dist/install-EWDSPFFZ.js +0 -18
- package/dist/jobCommand-ACSGSBQ4.js +0 -32
- package/dist/text-J2GD647J.js +0 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,324 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.18.0 (2026-11-04)
|
|
4
|
+
|
|
5
|
+
- Biome 2.6.2 (with @inquirer/prompts 8.7.4, react 19.3.1 and smol-toml 1.9.1, from Dependabot's
|
|
6
|
+
group update). Biome 2.6 formats Markdown and YAML by default: Markdown formatting is off (the
|
|
7
|
+
docs keep their own layout), and pnpm's lockfiles are left out.
|
|
8
|
+
- Dependabot: `@types/node` stays on the oldest supported Node line (no major updates); each other
|
|
9
|
+
major update comes as its own pull request.
|
|
10
|
+
- The Homebrew formula in the repository names 0.17.0 and its tarball hash.
|
|
11
|
+
- Eval evidence, part 1 (T11a): the report gives the pass rate over all attempts with a 95%
|
|
12
|
+
interval (a cluster bootstrap over tasks, so repeats of one task count together), the tasks that
|
|
13
|
+
passed every run or none, the median and p95 of steps, tokens and time, the cost per accepted
|
|
14
|
+
change (all attempts divided by the passes), and unexpected changes (files that a run changed
|
|
15
|
+
but the task did not need; a new `allowChanges` field widens a task's scope). `--shuffle` and
|
|
16
|
+
`--seed` set the run order. `report.json` is version 2, with Garuda's version and commit, the
|
|
17
|
+
model, the OS, the seed, the run order and a hash of each task. A run whose every attempt failed
|
|
18
|
+
with an error gives no interval ("No scored run"), a task with only error runs is not counted as
|
|
19
|
+
"passed none", and an authentication error (401 or 403, for example a refused API key) stops the
|
|
20
|
+
eval at the first run instead of failing every run the same way.
|
|
21
|
+
- `garuda eval compare <a> <b>` (T11a part 2): two reports of the same tasks side by side, the
|
|
22
|
+
difference of the pass rates (B − A) with a paired 95% interval, and each arm's cost per accepted
|
|
23
|
+
change, unexpected changes and median time. It refuses reports whose tasks differ, and a
|
|
24
|
+
difference whose interval contains 0 is "no clear difference". The run report now says when its
|
|
25
|
+
interval is only a rough guide (fewer than 10 tasks, or every draw gave the same rate).
|
|
26
|
+
- The Claude Code baseline (T11b): `garuda eval --agent claude-code` runs `claude -p` on the same
|
|
27
|
+
tasks with the same scratch folders, time limit and grading, so `garuda eval compare` can set
|
|
28
|
+
Garuda against Claude Code. Claude Code runs with every tool allowed, so only in the OS sandbox,
|
|
29
|
+
with network only to `api.anthropic.com`, a new config folder per run, and the API key in its
|
|
30
|
+
environment only. Its turns, tokens and cost come from its JSON result. `eval compare` prints a
|
|
31
|
+
zero difference as "0 pts" and says when every draw gave the same difference. The user's first
|
|
32
|
+
live baseline run found that the proxy for `api.anthropic.com` started only in a Garuda turn, so
|
|
33
|
+
Claude Code had no network: the runner now starts it first (`Runtime.prepareCommands`). An eval
|
|
34
|
+
now also stops at the first run that cannot reach the API (a refused connection, an unknown
|
|
35
|
+
host, a certificate error), as it does for a refused key.
|
|
36
|
+
- `garuda eval compare` also compares the cost per accepted change: the ratio B/A with a paired
|
|
37
|
+
95% interval, and a verdict ("B costs more", "B costs less" or "no clear difference"). An unknown
|
|
38
|
+
cost gives no ratio. The hard-coupon task allows changes in the coupon module and the API routes
|
|
39
|
+
(`allowChanges`): both agents made them in the first baseline runs. Its task hash changes, so
|
|
40
|
+
compare new hard-suite runs only with new ones.
|
|
41
|
+
- A held-out set (T11c): 10 new, harder tasks in TypeScript, Python and Java, apart from every
|
|
42
|
+
suite. `--split heldout` runs them, `--split all` runs them with the dev tasks, and a plain
|
|
43
|
+
`garuda eval` never does (a held-out id with `-t` is refused with the fix). They cover a defect
|
|
44
|
+
whose cause is in another file (3), a refactor across modules (2), tests that a mutation check
|
|
45
|
+
must find good enough (2), conventions from the repository's `AGENTS.md` that a hidden test
|
|
46
|
+
checks (2), and a vague request (1). Each task's hash is recorded in the tests: a changed task
|
|
47
|
+
must change its hash on purpose, and a tuning result seen before the change is invalid.
|
|
48
|
+
`report.json` records the split. `--list` shows the held-out set. The compare note now says
|
|
49
|
+
"the same pass-rate difference".
|
|
50
|
+
- The first held-out run (Haiku 5.5, 3 runs a task: 27/30) found a fault in one task:
|
|
51
|
+
the export-dates task (now `med-export-dates`) failed 0/3 only because the agent, with the right fix each time, added a CSV
|
|
52
|
+
test to the protected test file. Its hidden test decides, so the visible tests are no longer
|
|
53
|
+
protected, and a new test is in scope there and in the two conventions tasks. The hashes of these
|
|
54
|
+
three tasks change: compare held-out runs only with runs made after this change.
|
|
55
|
+
- A harder held-out set (T11c, second version). The first set was at its ceiling for Haiku 5.5,
|
|
56
|
+
so it is now a dev suite, `-s medium` (ids `med-…`), and 10 new tasks took its place. Each has a
|
|
57
|
+
trap: a quick fix that passes the visible tests fails the hidden test or the mutation check (a
|
|
58
|
+
cache key without the currency, a new idempotency key per retry, invoice shares and yen, a
|
|
59
|
+
command registry with unchanged output, settings by the README's rules, 6 subtle mutants in two
|
|
60
|
+
test-writing tasks, a migration and a reset endpoint by `AGENTS.md`, and a slow search that must
|
|
61
|
+
keep every result). Their ids start with `held-out-`. The tests prove each trap. Compare
|
|
62
|
+
held-out runs only with runs made after this change. The run report's id column now fits the
|
|
63
|
+
longest id, so the columns after it line up.
|
|
64
|
+
- The second held-out run (Haiku 5.5, 3 runs a task: 28/30) found two faults, both in the checks.
|
|
65
|
+
`held-out-conventions-migration` failed 2/3 with correct work: the agent named the field
|
|
66
|
+
`dueAt` (as `created_at` suggests), and the hidden test read `dueDate`, which the prompt never
|
|
67
|
+
named. The prompt now names it. The report gave "The check failed:" with nothing after it: a
|
|
68
|
+
guard stopped the check with no output. Each guard now prints what is missing, and a check with
|
|
69
|
+
no output reports its exit code. Four held-out hashes change.
|
|
70
|
+
- Tests: `test/evals.test.ts` self-tests the basic and hard suites only (the medium tasks ran twice
|
|
71
|
+
there), with 60 s for each task. The user's `pnpm check` timed out on `hard-rounding` at 5 s,
|
|
72
|
+
then on the LSP reference sample. `vitest.config.ts` now gives every test 30 s, the limit that
|
|
73
|
+
the release checks used, so `pnpm check` agrees with them.
|
|
74
|
+
- The third held-out run, with the Claude Code baseline, ran an old build: `dist/` was older than
|
|
75
|
+
the checkout, so the old tasks ran, and `report.json` named the checkout's commit, not the
|
|
76
|
+
build's. A build now records the commit it came from (tsup sets it), `report.json` gives it as
|
|
77
|
+
`garuda.commit` and adds `garuda.checkout` when the checkout differs, and `garuda eval` warns
|
|
78
|
+
at the start: "This build is from commit …, but the checkout is at …: run pnpm build first."
|
|
79
|
+
- Held-out prompts with visible tests now say "You may add tests in new files, but do not change
|
|
80
|
+
the existing test files": in the same run the agent appended a correct test to a protected test
|
|
81
|
+
file after "do not change the existing ones". Five held-out hashes change.
|
|
82
|
+
- Same run, same (old) tasks, Haiku 5.5: Garuda 26/30, Claude Code 27/30, no clear difference in
|
|
83
|
+
the pass rate; Claude Code cost ×1.50 per accepted change (paired interval ×1.35 to ×1.71).
|
|
84
|
+
- Design (T11; T11a and T11b built, T11c–d not yet): eval evidence — intervals and consistency over repeated runs, cost per
|
|
85
|
+
accepted change, unexpected changes, a Claude Code baseline runner, a held-out task split, and a
|
|
86
|
+
proposer loop that edits only a prompt addendum (`docs/lld/eval-evidence.md`).
|
|
87
|
+
|
|
88
|
+
- An eval A/B of one MCP server: `garuda eval --mcp <server>` allows that one server from your
|
|
89
|
+
own `~/.garuda/mcp.json` (no other server, and none from a project file), and
|
|
90
|
+
`--mcp-prepare <command>` runs a command in each scratch folder, in the sandbox, before the agent
|
|
91
|
+
starts; what it writes is not counted as the agent's change. For Graphify:
|
|
92
|
+
`--mcp graphify --mcp-prepare "graphify update ."`. Each run records its MCP tool calls; the
|
|
93
|
+
report and `eval compare` show them ("the agent never used the server" when none), compare notes
|
|
94
|
+
when the arms' servers differ, and `report.json` records the server and the command. A server
|
|
95
|
+
that does not start, or a failed prepare command, stops the eval at the first run. The Claude
|
|
96
|
+
Code baseline refuses both options.
|
|
97
|
+
- The prepare command now runs before the agent's runtime starts, so a note that it writes into
|
|
98
|
+
`GARUDA.md` reaches the agent (the user's first Graphify run: the agent never called the server,
|
|
99
|
+
and a note written later would not have been read). A `~/.garuda/mcp.json` whose `"servers"` is a
|
|
100
|
+
list now gets a message that shows the right form, not "expected record, received array".
|
|
101
|
+
- Docs: Graphify as an example MCP server in the tools guide (install, `mcp.json`, the note in
|
|
102
|
+
`GARUDA.md`, and what we measured: ×1.28 cost per accepted change on the hard suite, no change in
|
|
103
|
+
passes). Garuda does not include it. The T11d design gets the user's keep rule: an edit with the
|
|
104
|
+
same passes stays when its cost per accepted change is clearly lower.
|
|
105
|
+
- Tests: `waitUntil` waits up to 20 s by default (it was 5 s), under the 30 s test limit. The
|
|
106
|
+
user's `pnpm check` failed the M5 Ctrl-C test on a busy machine. Two test files had their own
|
|
107
|
+
copy with 4 or 5 s (a second M5 Ctrl-C test then failed the same way); they use `waitUntil`
|
|
108
|
+
now, and a test refuses a new copy.
|
|
109
|
+
|
|
110
|
+
- The proposer loop (T11d): `garuda eval tune --addendum <file>` improves a prompt addendum. A
|
|
111
|
+
proposer model (default `claude-opus-5-5`) reads the dev runs that failed, or each task's cost
|
|
112
|
+
when all passed, and writes a new version; it stays when no task goes from all runs to none and
|
|
113
|
+
it passes 2 more runs (`--margin`) or as many at a clearly lower cost per accepted change (the
|
|
114
|
+
user's rule). Texts that ask to skip or edit tests or checks, or to leave the sandbox, are
|
|
115
|
+
refused before a run; the proposer never sees the held-out tasks; `--max-cost` (default $20)
|
|
116
|
+
stops before a round that would pass it. At the end the held-out set compares no addendum with
|
|
117
|
+
the final one. Garuda never edits the file: the versions, inputs, reports and history go to
|
|
118
|
+
`.garuda/evals/tune-<id>/`. `garuda eval --addendum <file>` runs any suite with an addendum.
|
|
119
|
+
- `eval tune` after the user's first run (Haiku 5.5 agent, Opus 5.5 proposer, $0.65): the kept
|
|
120
|
+
version cut the held-out cost per accepted change to ×0.81 (×0.75 to ×0.88), all runs passing.
|
|
121
|
+
The run also found four faults, now fixed: two of three proposals were refused for phrases in
|
|
122
|
+
rules against cheating ("never modify tests to make them pass") or about reading ("skip tests
|
|
123
|
+
you won't run"), so a negation now clears a phrase and a refused text gets one more try in the
|
|
124
|
+
round; the held-out comparison said the reports had no task hashes; runs went one at a time
|
|
125
|
+
(about 16 minutes a score), so `--parallel` (default 4) runs them together; and nothing printed
|
|
126
|
+
during a score, so each run prints a line. Two runs of one task at the same time can no longer
|
|
127
|
+
take the same session file name (also for `garuda eval --parallel`).
|
|
128
|
+
|
|
129
|
+
- The system prompt tells the agent how to work in few steps: batch tool calls that do not depend
|
|
130
|
+
on each other, find before reading, no exploration with bash, all edits in one step, one narrow
|
|
131
|
+
test run, fix the code not the tests, stop when done. The rules come from the first
|
|
132
|
+
`garuda eval tune` run: on the held-out set, with every run passing, they cut the cost per
|
|
133
|
+
accepted change to ×0.81 (95% interval ×0.75 to ×0.88) with Haiku 5.5 and ×0.87 (×0.79 to
|
|
134
|
+
×0.95) with Sonnet 5.5. The tuned text's rules against `remember` and for one-sentence answers
|
|
135
|
+
are left out: they served the evals, not users. The prompt's own wording, measured against
|
|
136
|
+
0.17.0's prompt on the held-out set (3 runs a task, seed 7): with Sonnet 5.5, 30/30 both and
|
|
137
|
+
×0.90 (×0.84 to ×0.96); with Haiku 5.5, 30/30 and 29/30 (one miss of the invoice refund trap)
|
|
138
|
+
and ×0.88 (×0.79 to ×1.02), so the Haiku saving is likely but not shown with confidence.
|
|
139
|
+
|
|
140
|
+
## 0.17.0 (2026-10-27)
|
|
141
|
+
|
|
142
|
+
- macOS: no command process outlives the command (IPI-04). Seatbelt has no process namespace, so a
|
|
143
|
+
process could leave the command's process group (setsid, setpgid, posix_spawn with SETSID or
|
|
144
|
+
SETPGROUP, Node's detached spawn) and keep running, inside the sandbox. Each sandboxed command now
|
|
145
|
+
gets two marker files in its Seatbelt profile, and after the command a small helper,
|
|
146
|
+
`native/bin/garuda-reap` (C, universal arm64 + x86_64, ad-hoc signed, built in the release
|
|
147
|
+
workflow and shipped in the npm package), kills every process of the user with those markers. On
|
|
148
|
+
the user's Mac all four ways out were found and killed, no other process matched, and one scan took
|
|
149
|
+
12 ms. The bash tool tells the model when Garuda killed such a process. Without the helper (a
|
|
150
|
+
source checkout without the Command Line Tools, the standalone binary) Garuda warns, and the
|
|
151
|
+
strict profile refuses sandboxed commands. The IPI-04 case now expects no escape on macOS too.
|
|
152
|
+
- Node and dependency security (2026-10-21): Garuda warns at start on a Node without the latest
|
|
153
|
+
security fixes of its line (22.23.4, 24.22.1, 26.12.1; the Node.js security release of
|
|
154
|
+
2026-10-21: TLS hostname checks, DNS, Brotli), and `engines` names those versions. CI, the
|
|
155
|
+
release and website workflows take the newest Node of their line (`check-latest`) and stop on an
|
|
156
|
+
older one (`scripts/check-node.mjs`); `pnpm package` refuses one for the standalone binary. A new
|
|
157
|
+
Audit workflow (each push, pull request and Monday) fails on any advisory in a shipped package;
|
|
158
|
+
Dependabot opens weekly updates. `@modelcontextprotocol/client` 2.3.1 fixes two advisories in
|
|
159
|
+
the OAuth and HTTP transport of remote MCP servers (GHSA-6qxp-vccf-f47h, GHSA-6prh-2h8m-c8cw).
|
|
160
|
+
`glob` and `grep` refuse a pattern that brace expansion makes into more than 1000 patterns or
|
|
161
|
+
that nests `{…}` more than 10 deep: `braces` has no fix for GHSA-vfj7-8cjw-p6xm, and such a
|
|
162
|
+
pattern ran Node out of memory. See docs/security-deps.md.
|
|
163
|
+
- zod 4.6.7: GHSA-mrhx-c7xc-m3w5 (high), one oversized array could run Node out of memory
|
|
164
|
+
during validation. zod checks the model's tool input and, in the MCP SDK, the messages of MCP
|
|
165
|
+
servers. The new Audit workflow found it.
|
|
166
|
+
- GitHub Actions: `actions/checkout` 7.0.1 and `actions/setup-node` 7.1.0, which run on Node 24
|
|
167
|
+
(GitHub forces actions built for Node 20 onto Node 24 and warns). Still pinned to full commit
|
|
168
|
+
hashes. The release job turns off setup-node's automatic dependency cache.
|
|
169
|
+
- Indirect prompt injection suite (`test/ipiSuite.test.ts`): ten injected-call cases against the
|
|
170
|
+
real sandbox, permission engine, tools, web_fetch, audit log and approval display, each with a
|
|
171
|
+
control; `pnpm ipi:mutations` shows that every case fails without its defence. Two known gaps are
|
|
172
|
+
recorded: sandboxed commands may write the shared package caches (IPI-03), and on macOS a
|
|
173
|
+
process in a new session outlives the command (IPI-04).
|
|
174
|
+
- Docs: the README is short now (what Garuda does on your machine, install, quick start, links);
|
|
175
|
+
the user guide moved to `docs/guide/` (ten pages; the website shows them as the User guide
|
|
176
|
+
section). New community files: `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, a pull request template
|
|
177
|
+
and issue forms for bugs and features. `SECURITY.md` names 0.16.x as supported.
|
|
178
|
+
- Models: Claude Sonnet 5.5 and Haiku 5.5 with their prices (Haiku 5.5 has a higher price for
|
|
179
|
+
prompts over 100,000 tokens); `sonnet` and `haiku` now name them. `garuda setup` lists the
|
|
180
|
+
models of your Anthropic account (Models API) and saves the list for `/models`; a model that
|
|
181
|
+
this Garuda does not know shows "price unknown". `pnpm models:check` is a release check.
|
|
182
|
+
- Staged commands (T5, off by default): with `"commands": { "mode": "staged" }`, each sandboxed
|
|
183
|
+
command runs in a staging copy of the project; when it changes files that git tracks, you see the
|
|
184
|
+
diff and apply or discard (all or nothing, with `/undo`). Ignored files stay in the copy. No copy:
|
|
185
|
+
the session does not start (no fallback to direct mode). Linux mounts the copy at the project's
|
|
186
|
+
path; macOS runs the command at the copy's path with the project read-only. The question also
|
|
187
|
+
counts the ignored files that the command wrote (never applied) and names sensitive ones.
|
|
188
|
+
- MoE wording (review of 3a9f51b): the `delegate_expert` description and the system prompt no
|
|
189
|
+
longer promise "deep language AST tools"; they name the code index tools and say that results
|
|
190
|
+
outside JS/TS are approximate. A test guards public and model-facing text.
|
|
191
|
+
- Job and night-digest costs (review of 3a9f51b): an incomplete cost shows as "≥ $X (incomplete)"
|
|
192
|
+
and an unknown cost as "unknown" (before: exact $0.5000 and $0.0000), also in the totals and
|
|
193
|
+
for the review. A review attempt with no reported usage marks the review cost incomplete; an
|
|
194
|
+
estimated review response costs 0 as a minimum instead of an estimated price.
|
|
195
|
+
- Executor contract test (Codex review of 1370184): after `shutdown()`, the shell and any sandbox
|
|
196
|
+
wrapper must be gone too, not only the background child.
|
|
197
|
+
- T10 evidence (Codex review of 1370184): the corpus, oracle and source fingerprints are hashed
|
|
198
|
+
with LF line endings, so a Windows checkout with CRLF passes the evidence tests. The published
|
|
199
|
+
values do not change.
|
|
200
|
+
- Token budget (Codex review of 1370184): while tools run, the room that subagents must leave
|
|
201
|
+
for the parent also covers a compaction that is due before the next request.
|
|
202
|
+
- Subagent spend with no report (Codex review of 1370184): a cancelled child's tokens, already in
|
|
203
|
+
the budget, now make the cost "≥ $X (incomplete)" and show the budget line, with the part from
|
|
204
|
+
subagents named.
|
|
205
|
+
- Docs (Codex review of 1370184): Go and Rust experts are heuristic, not AST parsers; MoE
|
|
206
|
+
specialists get the code index tools, not "full AST" tools; the T10 record says that only one
|
|
207
|
+
capture is stored; the README states what the precision/recall figures do and do not cover.
|
|
208
|
+
- T10 evidence guard (Codex review of 1370184): fixed precision/recall floors (Java 33/54 and
|
|
209
|
+
33/36, Python 45/63 and 45/48) apply on every run, also during an evidence refresh; a refresh
|
|
210
|
+
variable set in CI fails the test.
|
|
211
|
+
- Approximate references (Codex review of 1370184): Go and Rust references, and every user or
|
|
212
|
+
project plugin's, now carry the same approximate warning as Java/Python in tools, chat, callers
|
|
213
|
+
and impact. Tool descriptions name these languages.
|
|
214
|
+
- TypeScript references (Codex review of 1370184): the search starts at the declaration's own
|
|
215
|
+
name, not at the first matching word on its line, which could be another symbol (a property of a
|
|
216
|
+
type declared earlier on the line).
|
|
217
|
+
- Jobs (Codex review of 1370184): a review that was asked for but failed (a provider error, no
|
|
218
|
+
budget) gives the verdict "needs a look", never "ready to merge". The error stays in `reviewError`.
|
|
219
|
+
- JSON output (review of 1370184): `total_cost_usd` stays a number for compatibility, but an unknown
|
|
220
|
+
or partial cost is never a bare number: new `total_cost_is_unknown`, `total_cost_is_incomplete` and
|
|
221
|
+
`cost_is_incomplete` flags, beside the existing `cost_is_unknown`.
|
|
222
|
+
- Cost after a failed attempt (review of 1370184): one retry, 529, batch fallback or cancel no
|
|
223
|
+
longer makes the cost unknown for the rest of the session. The cost stays a known minimum, shown
|
|
224
|
+
as "≥ $X (incomplete)" in the turn line, `/usage`, `/sessions`, job reports and eval reports, also
|
|
225
|
+
after a resume. Only a missing price makes the cost unknown.
|
|
226
|
+
- The job review is under the token budget (Codex review of 1370184): its request reserves first
|
|
227
|
+
(a one-token policy no longer lets an 8,192-token request through), every attempt is metered, and
|
|
228
|
+
its usage counts for the session and on resume.
|
|
229
|
+
- Team policy `denyPaths` in the OS sandbox (Codex review of 1370184): when the patterns match more
|
|
230
|
+
than 1,000 paths, commands stop with a message instead of running with only the first 1,000
|
|
231
|
+
protected; the patterns now find files in every folder, also `node_modules` and `.git`
|
|
232
|
+
(review of 3a9f51b: `**/private.txt` had no sandbox rule in `node_modules`).
|
|
233
|
+
- Code intelligence (T10): Java/Python reference results carry `approximate: true`, propagated to
|
|
234
|
+
callers and impact, including empty results. Model tool output starts with a warning; chat adds
|
|
235
|
+
`≈`. Impact risk is labelled heuristic. Matching algorithms are unchanged. A frozen 30-Java/
|
|
236
|
+
30-Python corpus, captured with jdtls 1.61.0 and pyright 1.1.406, records precision and recall;
|
|
237
|
+
offline regression checks verify the oracle, source fingerprints and published results. A
|
|
238
|
+
supplementary manually labelled edge-case sample records stricter alias semantics separately.
|
|
239
|
+
- Token budget, review of b2bf1c2: successful OpenAI-compatible responses with missing, partial
|
|
240
|
+
or invalid usage keep their full reservation charged. Estimates remain labelled on responses
|
|
241
|
+
for context sizing, but do not enter reported session or child totals, avoiding a double charge.
|
|
242
|
+
The existing `unreported` records preserve the charge across resume; affected costs are unknown.
|
|
243
|
+
Usage displays and JSON distinguish budget charges and estimates; evals mark incomplete token
|
|
244
|
+
totals and means unknown. Legacy journals remain readable with their historical totals.
|
|
245
|
+
- Token budget, review of 597104a: every input reservation covers the full current request,
|
|
246
|
+
including changed instructions, tool definitions and server-tool settings on resume. A larger
|
|
247
|
+
previous measured context plus new messages is still kept. Oversized requests stop before a
|
|
248
|
+
provider call; small budgets may refuse calls earlier. Existing journals need no migration.
|
|
249
|
+
- Token budget, review of 6c9f929: metered Anthropic batch submission disables SDK retries;
|
|
250
|
+
reported child debits survive cancellation, parallel failures and resume, without duplicating
|
|
251
|
+
report aggregation. Started parallel calls settle before the turn ends. Complete results are
|
|
252
|
+
capped after hooks and on errors (20 000 characters for subagents, including metadata; 100 000
|
|
253
|
+
otherwise), also for custom/replay runners. The final-answer floor accounts for JSON escaping
|
|
254
|
+
and result-message structure; small budgets can refuse child work earlier. Compaction reserves
|
|
255
|
+
its system prompt and the rest of its full request. Existing journals remain readable.
|
|
256
|
+
- Token budget, review of 31aab17: a subagent's wrap-up request is reserved in full (system prompt
|
|
257
|
+
and tools too); every provider request reserves, also an HTTP retry and a batch job's switch to
|
|
258
|
+
the normal API (the Anthropic SDK no longer retries on its own under the budget; the loop retries,
|
|
259
|
+
also a rate limit); the parent's room for its final answer covers the results of its calls (a
|
|
260
|
+
tool result is at most 100 000 characters, a subagent's answer at most 20 000); charges for
|
|
261
|
+
failed requests stay with the session, also after a resume; `/compact` counts against the budget.
|
|
262
|
+
- One token budget for the turn and its agent tree (review T9): each model call reserves its request
|
|
263
|
+
and output limit first, and the run stops with `token_budget` when they do not fit; subagents,
|
|
264
|
+
compaction and retries reserve in the same budget; parallel subagents cannot pass the parent's cap,
|
|
265
|
+
and they leave the parent room for its final answer. A failed or cancelled call with no reported
|
|
266
|
+
usage counts as fully spent. A small `tokenBudget` now stops a run before the call that would pass
|
|
267
|
+
it, not after.
|
|
268
|
+
- Job write scopes, third review: a job never runs a command outside the sandbox, also when an
|
|
269
|
+
allow rule matches (`outside_sandbox` dropped the scope); an edit through a symbolic link must
|
|
270
|
+
reach a path in the scope, checked by the engine and again by the write tool just before it writes;
|
|
271
|
+
the job's test command has the same scope as every other command, and the approval question says
|
|
272
|
+
so. Claims: without a sandbox, a command (or an MCP call) asks unless an allow rule covers it; undo
|
|
273
|
+
covers the files in its snapshot. The claims test knows these phrases.
|
|
274
|
+
- Job write scopes (review T6): `/schedule` proposes `"writeScope"`, the paths in the worktree that
|
|
275
|
+
the job may change (the plan's edit and write paths, and the build folders), and the question
|
|
276
|
+
shows it. The OS sandbox makes the rest of the worktree read-only for the job's commands, the
|
|
277
|
+
engine denies edits outside it, and a change outside it fails the job with no commit. Jobs without
|
|
278
|
+
a scope say "Commands may write anywhere in the worktree."
|
|
279
|
+
- Design (second review): staged commands never fall back to direct mode and never apply an
|
|
280
|
+
incomplete change list; the shared budget keeps a reservation as spent when a request fails or is
|
|
281
|
+
cancelled with no reported usage (docs/lld/bounded-changes.md).
|
|
282
|
+
- Exact claims, second pass (second review): the sandbox writes the project, temp folders and
|
|
283
|
+
package caches (not "only the project"); a command outside the sandbox asks unless an allow rule
|
|
284
|
+
or a session answer covers it (not "always"); `/undo` restores the files in its snapshot, not
|
|
285
|
+
ignored files (not "what a turn changed"). The claims test now reads whole paragraphs and knows
|
|
286
|
+
these phrases.
|
|
287
|
+
- Audit checkpoint fixes (second review): a failed checkpoint write no longer makes the next audit
|
|
288
|
+
line repeat the sequence number and chain head (the chain was broken); a checkpoint or a folder
|
|
289
|
+
that cannot be read is reported as broken, not as "no checkpoint" or "no files".
|
|
290
|
+
- Audit checkpoint: with `"audit": { "checkpoint": true }` in a policy file (off by default),
|
|
291
|
+
Garuda keeps each log file's last `seq` and `hash`, and `/audit verify` finds lines cut from the end
|
|
292
|
+
of a file and a deleted file. The docs list what verify detects with and without it (review T8).
|
|
293
|
+
- The strict profile: `"profile": "strict"` in a policy file or in `.garuda/settings.json` requires
|
|
294
|
+
the OS sandbox. Without one, Garuda stops at startup with the reason; `"executor": "host"` is an
|
|
295
|
+
error; the `bash` tool has no `outside_sandbox`. A project can turn it on, never off (review T7).
|
|
296
|
+
|
|
297
|
+
- Also in this release: the changes planned as 0.16.2, which was never published. Docs that say
|
|
298
|
+
"0.16.2" mean this release.
|
|
299
|
+
- The design of the bounded-changes work above (staged commands, job write scopes, the strict
|
|
300
|
+
profile, the audit checkpoint, one token budget for the agent tree, approximate labels for Java
|
|
301
|
+
and Python references): docs/lld/bounded-changes.md.
|
|
302
|
+
- Exact safety claims (an external review found an overclaim): edits ask first, but commands in the
|
|
303
|
+
OS sandbox run with no question, inside its limits, so they can change project files (`/undo`
|
|
304
|
+
restores them). The website, the blog posts, the share image, the README and the editor's mode
|
|
305
|
+
text said that every change asks first; they now say what each limit does. A test keeps the old
|
|
306
|
+
phrases out.
|
|
307
|
+
- Tests skip cleanly where a machine has no OS sandbox, refuses Unix sockets, or cannot change a
|
|
308
|
+
file's owner (found by the same review): the sandbox tests no longer fail while they register,
|
|
309
|
+
the editor tests ignore the "No OS sandbox" notice, and the proxy and ownership tests skip with a
|
|
310
|
+
reason. Checked with a PATH that has no bubblewrap: 0 failures.
|
|
311
|
+
- `garuda eval` reports success two ways: over the scored runs (error runs left out) and over all
|
|
312
|
+
attempted runs (error runs count as failures). `report.json` has both in `summary`.
|
|
313
|
+
- The system prompt names Garuda's version and the model, so "which model are you?" gets a true
|
|
314
|
+
answer. After `/models`, the next message tells the model about the switch; the system prompt
|
|
315
|
+
stays the same bytes, so the prompt cache stays valid.
|
|
316
|
+
- Website: a share image and share tags (LinkedIn, X and chat previews) on every page, structured
|
|
317
|
+
data on the landing page, and a place for the Google Search Console tag (`site/src/seo.ts`; see
|
|
318
|
+
docs/release.md). More npm keywords.
|
|
319
|
+
- Website: comments under blog posts (giscus: threads with replies, stored as GitHub Discussions,
|
|
320
|
+
sign-in with GitHub) and a contact page. Both use `site/src/community.ts`; empty values hide them.
|
|
321
|
+
|
|
3
322
|
## 0.16.1 (2026-10-06)
|
|
4
323
|
|
|
5
324
|
- `garuda acp` offers its sign-in (Terminal Auth) also to clients that declare the capability in
|