What's New in v0.4.4
🇧🇷 Versão em português · 📋 Full CHANGELOG · 📦 Download
The release that makes personal WhatsApp work on a fresh install and gives
operators who run Garra in a pod an explicit way to hand the agent full power.
In v0.4.3, "install + garra whatsapp link" never answered: the channel refused
to start because every new install gets an MCP server. That is fixed. And for
anyone who wants a fully autonomous agent inside a disposable container, there
is now the isolated-pod execution profile, with one rule: full power inside
the isolated pod; no implicit access outside the pod.
Personal WhatsApp on a fresh install
- The channel starts with MCP registered (#1327). The
FerramentaMcpRegistradarefusal compensated for aToolGategap closed in #1288 and had become obsolete; because thefilesystemserver is provisioned on first boot, it switched the channel off on every default install. Thesearchfloor still denies MCP tools by name on every turn. - Both
garraandgarraiaexist (#1328).install.shcreatesgarraas a relative symlink togarraia,install.ps1writes agarra.cmdshim, and the.deb/.rpmpackages ship/usr/bin/garra. Agarrathe installer did not create is kept, with a warning. - Every instruction names the executable that is running (#1329). The
post-link message says
garraia startwhen you rangarraia(andgarra startwhen you rangarra); the same holds forgarraia whatsapp status, the/api/diagnosticsnext step, the gateway log when the channel does not start, andwhatsapp linkfailures. - The boot no longer warns
unknown channel type: whatsapp_linked, and every reason the channel does not start is aWARNthat states the action.
Execution profiles: standard and isolated-pod (ADR 0024)
standard (default) | isolated-pod | |
|---|---|---|
| How to enable | nothing to do | execution.profile: isolated-pod or GARRAIA_EXECUTION_PROFILE=isolated-pod (env wins) |
| WhatsApp owner, 1:1 chat | search floor | code floor: bash, file_write, subagents and every MCP tool |
| Paired-only contact, admitted non-owner, any group | search floor | search floor — full power is never inherited |
Auto-provisioned MCP filesystem root | agent.file_roots, else <data_dir>/workspace | execution.pod_root, else <data_dir>/workspace |
| Risky-command gate, file-tool jail, sandbox | on | on |
execution:
profile: isolated-pod
pod_root: /workspace # optional; absolute path inside the pod
channels:
whatsapp_linked:
type: whatsapp_linked
enabled: true
owners: ["5511999998888"] # only declared owners, only in 1:1 chats
- Explicit, never inferred. No code reads
/.dockerenvor cgroups to pick the profile (two tests scan the source). An invalid value refuses the boot and is anErroringarraia config check(exit 2), in the file and in the env. - Auditable. At boot, a single
WARNsays what the profile unlocks, what it does not isolate (host filesystem, Docker/Podman socket, host namespaces, undeclared mounts, host secrets) and how to revert. The profile and its source (default/file/env) show inconfig check, theexecution.profilecheck of/api/diagnostics, thesecurity.execution_profilerow of/api/settings/effectiveandgarraia whatsapp status. Each WhatsApp turn logs the applied profile (completo/padrao) and mode, identifying the sender only by the last 4 digits. - The owner is a declared identity. Only entries in
ownersget the full profile, and only in 1:1 chats. Pairing by code admits a contact but never makes an owner. Use digits (5511999998888) or the@lidJID;config checkwarns when an…@s.whatsapp.netentry can never match.
MCP filesystem without $HOME
The server provisioned on first boot no longer points at your home directory in
either profile. Only the default <data_dir>/workspace is created; a
declared root that does not exist skips provisioning (with a warning) instead of
falling back to anything wider. An existing mcp.json is never rewritten —
if your install predates v0.4.4, the mcp.filesystem_root check of
/api/diagnostics warns in standard and says how to fix it.
tool_program: several steps in one turn, gated per step
The model can send a program of up to 16 steps (tool_program) and the runtime
runs it without going back to the LLM between steps (#1226 S-B). Every step goes
through the same dispatch as the normal loop: same ToolGate, same budget, same
confirmation pause. The auto, code and ask modes expose tool_program;
the whitelist modes (search, architect, debug, orchestrator, review,
edit) do not. The post-merge review closed eleven findings before the release:
an unresolved $name fails the step, a pause gives the model what earlier steps
already did, and a one-step program no longer slips past the loop detector.
Other fixes
- Command approval only covers the request that paused the turn (#1339).
A page read by
web_fetch, a file, or an MCP result that carried a copy of a real confirmation marker could compete with the actual request, and your "ok" covered the wrong command. Now only the request itself carries a valid marker in the history. config checkand the bind (#1261): the check judges the bind by whatgarraia startuses (HOST/PORTenv, else127.0.0.1:3888) and flags the file'sgateway.host/gateway.portas keysstartdoes not read. The behavior decisions (refusing an exposed bind without credentials, the fate of those keys) remain with the owner in #1261.- Update notice (#1320): only announces a release newer than the binary.
- Docker image builds again with the WhatsApp bridge, and the release's aarch64 AppImage is packaged again.
- CI: the Security Gate no longer times out after the tests pass (#1332).
Upgrading
garraia update
- Nothing changes without configuration: with no
executionsection, the profile isstandard. - To enable the profile in a pod, see
docs/execution-profiles.md. - Installs whose
filesystemstill points at$HOME: change the last argument offilesystemin<config_dir>/mcp.jsonto a directory inside the declared roots and restart. garraia config check --strictmay start exiting 2 on wizard-generated configs withhost: 0.0.0.0(a keystartdoes not read); see #1261.
Known limitations
isolated-podtrusts the pod boundary you built: if the container has the Docker socket,--privilegedor--pid=host, so does the agent.- The profile only changes the floor of personal WhatsApp; other channels are unchanged.
- The native file-tool jail still applies in
isolated-pod: also declare the pod root inagent.file_rootsif you wantfile_writeoutside the workspace.