ADF
Rawl · github.com/christianbalevski/adf
ADF stores an agent's config, instructions, memory, loop history, code, sealed credentials and Ed25519 identity key in a single SQLite file. It runs on an MIT-licensed Electron, daemon or CLI runtime with any model provider, including local endpoints. It scores strongly on portability, transparency, modifiability and control, and its portable DID, signed ALF messages and message ids recorded on both sides meet tests that most runtimes fail. Edits to its action record are not detectable, actions proceed when recording fails, and reproducible builds are not documented.
- Whole agent in one documented SQLite file; export is a file copy
- Portable Ed25519 did:key identity; ALF messages signed by default
- Every system prompt and dynamic instruction persisted to the loop
- Agents cannot write adf_ system tables; restricted tools gated by owner approval
- Any provider, including local OpenAI-compatible models; no license checks
- Integration credentials sealed in the file and portable with it
- Edits to the action record are not detectable, so there is nothing to verify independently
- Actions proceed when the loop write fails
- Hot-path lambda activity only in a capped, trimmed log table
- Outbound allow/block lists enforced only for same-runtime peers
- Hourly update check in packaged app with no opt-out
- Reproducible builds not documented
All 34 findings
christianbalevski/adf main at commit beed74e (2026-09-26), ADF Studio 0.7.2, ADF spec v0.2 (storage schema 30) and ALF spec v0.1; default configuration.
Portable · Can you leave, and take the whole agent with you?
100%- P1Round-trip portability
In Studio the owner saves the agent as one .adf file (Share, then Save copy, or drag it out) and restores it on another machine by opening or dragging in that file. Provider keys, channel and MCP credentials can be stored encrypted in the file, so the copy runs with no further setup. Shared copies deliberately leave out the owner's signing identity, which moves only when the owner migrates their own agent.
Pass - P2Complete export
The single `.adf` file carries config, primary document and mind.md, files and code, loop history, inbox/outbox, timers, tasks, logs, audit snapshots, the sealed Ed25519 identity key and sealed credentials, so everything that defines the agent leaves with it. Installed MCP packages, container images and app-level provider keys belong to the runtime and are not included.
Pass - P3Independent execution
The MIT-licensed runtime runs as the Electron Studio, a headless daemon or a CLI, and accepts any OpenAI-compatible endpoint such as Ollama or LM Studio, so no Rawl server is required.
Pass - P4Identity continuity
Peers can verify continuity without Rawl: the agent's did:key comes from an Ed25519 key that travels sealed inside the file, so when the same owner imports their mnemonic on a new machine the agent keeps its DID and signing key. A file opened by a different owner must be re-keyed to a new DID.
Pass - P5No kill switch
No license check or remote enablement flag was found in the source. The packaged app checks GitHub Releases for updates but downloads only when the user clicks, and unpackaged builds never check.
Pass - P6Capability independence
Tools, triggers, timers, messaging, memory and lambdas are executed by the runtime and stored in the file, and no provider-native tools are used. Swapping to another provider, including a local OpenAI-compatible model with tool calling, keeps the same capability set.
Pass
Transparent · Can you see everything the agent is, with ordinary tools?
92%- T1Open storage format
The `.adf` file is a SQLite 3 database with a published schema and a per-column data dictionary, readable with sqlite3 or any SQLite client.
Pass - T2No hidden instructions
The runtime writes each new system prompt and every dynamic instruction into `adf_loop` as `[Context: ...]` entries. The `bare_prompt` flag removes all runtime-authored prompt text.
Pass - T3No shadow memory
All agent state is in the local file. Rawl runs no hosted service, and the only Rawl-controlled endpoints the app contacts are GitHub-hosted update and registry files, which carry no owner data.
Pass - T4Complete action history
LLM-loop tool calls and results are kept in `adf_loop`, archived to `adf_audit` on compaction, and leave with the file. Lambda, timer and API activity outside the loop is kept only in `adf_logs`, a ring buffer capped at 10,000 rows by default, and message and file deletions are not recorded by default, so the history is incomplete.
Partial - T5Readable logic
Skills, lambdas, middleware and API handlers are stored as TypeScript/JavaScript and Markdown source in `adf_files`, and the runtime is open source.
Pass - T6No third-party influence channel
No advertising, sponsorship or ranking channel was found. The curated MCP and agent registries fetched from the repo are catalogs shown to the owner in the UI, not model context.
Pass
Auditable · Can you reconstruct exactly what the agent did?
70%- A1No unrecorded actions
Each loop entry, including tool calls, is written to `adf_loop` as it happens, and loop clears and compactions archive rows in the same transaction as the delete. Actions still proceed when recording fails: a failed loop write is buffered for retry while the turn continues, and hot-path lambda actions are recorded only in the capped log table.
Partial - A2Tamper evidence
Edits to or deletions from `adf_loop`, `adf_audit` or `adf_logs` cannot be detected, because rows carry no hashes, chaining or signatures, and a tamper-evident event log is deferred to a design document. Signed ALF messages let a counterparty check a message's content but reveal neither deletions nor changes to other actions.
Fail - A3Separation from the audited
The agent cannot alter its own record: `db_execute` rejects any statement that touches `adf_` tables, and no tool mutates `adf_audit`. The exception is host compute, which needs both an agent flag and an owner-only setting and gives direct access to the `.adf` file.
Pass - A4Readable with ordinary tools
Loop, inbox, outbox, task and log tables are plain SQLite. `adf_audit` blobs are brotli-compressed JSON, readable with sqlite3 plus any brotli decoder.
Pass - A5Corroborated interactions
Each ALF message carries a globally unique, signed id recorded as `message_id` in both the sender's `adf_outbox` and the receiver's `adf_inbox`, so the two sides' records of an exchange can be matched. Message deletions are not recorded by default (see T4).
Pass
Verifiable · Can you prove the agent runs what it claims?
60%- V1Open, reproducible runtime
The runtime is MIT-licensed and releases are built in public GitHub Actions from package-lock.json with `npm ci`, then signed. Reproducible builds are not claimed or documented.
Partial - V2Active config is inspectable config
Agent config is the JSON in `adf_config`, but the running agent also depends on app-level runtime settings outside the file (host access, provider keys, MCP environment). The executor may also carry in-memory config additions that are never persisted.
Partial - V3Attributable messages
ALF messages are signed by default (security level 1) with the agent's Ed25519 key, which travels sealed in the file, so recipients can verify the sender DID before and after migration. Messages sent through channel adapters such as Telegram or email cannot be verified this way.
Pass - V4Independently checkable record
The action record carries no integrity data, so no tool, open or otherwise, can confirm it is unaltered. A verifiable event log is proposed only in a deferred design document.
Fail - V5Comparable state
All agent state is one SQLite file, so the owner can copy it at any two points and compare the copies with open tools such as `sha256sum` or SQLite's `sqldiff`. No built-in state digest is provided, so the comparison is a manual step.
Pass
Modifiable · Can you change anything, without asking?
100%- M1Instructions
Instructions are stored in `adf_config` and owner-editable, and the runtime base prompt can be dropped with `include_base_prompt: false` or `bare_prompt: true`.
Pass - M2Memory
Memory is stored as `mind.md` and other files in `adf_files`, plus loop and local tables, all of which the owner can edit or delete in Studio or with SQLite.
Pass - M3Logic
Lambdas, skills and middleware are editable source files inside the agent, and the runtime is MIT-licensed.
Pass - M4Tools and permissions
The owner can enable, hide or restrict each tool, add any MCP server, and set locked fields that the agent cannot change.
Pass - M5Model choice
Supported providers are Anthropic, OpenAI, OpenRouter, ChatGPT/Grok subscriptions and any OpenAI-compatible endpoint, including local Ollama, LM Studio, vLLM and llama.cpp. Tools remain runtime-side, provided the model supports tool calling.
Pass - M6No gatekeeping
No license key, paid tier or remote feature flag was found in the source.
Pass
Controllable · Is your word final?
92%- C1Communication boundaries
Owner-configured outbox and fetch middleware runs in the runtime pipeline before any message is sent or HTTP request is made and can reject it, so any recipient, domain or channel policy the owner writes is enforced below the model. The agent is hard-denied from changing the middleware configuration, middleware must come from owner-authorized files by default, and sandbox code has no direct network access. WebSocket and shell tools (both off by default) and owner-installed MCP servers sit outside this pipeline.
Pass - C2Approval gates
Tools marked `restricted` require owner approval before running from the LLM loop. Approvals are tracked as `adf_tasks` rows, and only the owner or authorized code can resolve them.
Pass - C3Immediate halt
`abort` immediately cancels the current turn. Setting state to `off` tears down the LLM request, triggers, MCP servers, adapters and sandboxes, and CLI `stop` does this after a 5-second grace period.
Pass - C4Data sovereignty
No analytics or telemetry SDK was found, and content goes only to owner-configured providers and peers. The packaged app checks GitHub Releases hourly with no opt-out, and it fetches the MCP registry from GitHub. No network-inspection verification was performed.
Partial - C5Credential custody
MCP, channel-adapter and agent secrets are stored in `adf_identity`, AES-256-GCM-sealed to owner and runtime keys, and they travel with the file and can be inspected and deleted in the Identity panel. App-level provider keys and subscription OAuth sessions stay in local OS-keychain storage and do not travel with the file.
Pass - C6Full deletion
Deleting an agent in Studio stops it and unlinks the `.adf` file and its WAL files, which destroys the private key. Rawl holds no copy, though stale `.bak.*` backups and compute workspaces may remain on the owner's disk.
Pass
Vendors and the public can dispute any finding with evidence. Disputes and their resolutions are published.