All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
[0.1.0] - 2026-07-04
Added
Arcadic.Conn— pure-data connection handle (redactingInspect) andArcadic.connect/3/Arcadic.with_database/2to build and derive handles.Arcadic.query/4+query!/4(idempotent read endpoint) andArcadic.command/4+command!/4(write endpoint), params-only ($name), Cypher-default with SQL/Gremlin/GraphQL/Mongo/SQLScript opt-in.Arcadic.command_async/4— fire-and-forget write (server enqueues, returns:okon HTTP 202).- Session transactions:
Arcadic.transaction/3(commit on return, reraise on exception) andArcadic.rollback/2(intentional abort →{:error, reason}). Arcadic.Server— server admin:create_database/2(+!),drop_database/2(+!),database_exists?/2,list_databases/1,ready?/1.Arcadic.Error/Arcadic.TransportError— typed error taxonomy with boundary redaction (quarantineddetail, value-free reasons).Arcadic.Transport— the transport behaviour seam, with the defaultArcadic.Transport.HTTP(Req/Finch) implementation.Arcadic.Telemetry— value-free:telemetry.span/3spans (no statement, params, values, or database name).Arcadic.Identifier— allowlist identifier validation.- Migration runner:
Arcadic.Migration(behaviour),Arcadic.MigrationRegistry(use+migrations [...]), andArcadic.Migrator(migrate/2,status/2,rollback/3,reset/2,pending_migrations/2), tracking applied versions in_arcadic_migrations. Arcadic.Transport.Bolt— optional Bolt transport (Bolt v4, non-TLS scheme) via the optionalboltxdependency; server admin remains HTTP-only.Arcadic.query_stream/4— Bolt-only lazyStream.t()of raw row maps, chunked over BoltPULL/has_more(defaultchunk_size: 1000); a:timeoutopt bounds each RUN/PULL receive (default:infinity), raising%Arcadic.TransportError{reason: :timeout}on breach; guarded off HTTP and inside transactions with a typed:not_supported.Arcadic.Transport.Bolt.setup/1— single-sourcetransport_optionsbuilder ([bolt: pool, bolt_opts: opts]).Arcadic.Telemetry.event/3— allowlist-validated manual telemetry for lazy ops;[:arcadic, :query_stream, :start | :stop]events (value-free).
Fixed
Arcadic.Transport.Boltnow threadsconn.databaseinto every Bolt RUN/BEGIN, sowith_database/2selects the database on Bolt (was hitting the connection default).- Bolt
transaction/3maps a commit-failure to a typed%Arcadic.Error{reason: :transaction_error}instead of leaking DBConnection's bare:rollbackatom. Arcadic.Transport.Bolt— a failed Bolt connect (wrong password, or a Bolt conn pointed at a non-Bolt port) no longer leaks a:gen_tcpsocket. arcadic now owns the connect handshake and HELLO on both the per-stream connection and the DBConnection pool, closing the socket on every failure; a bad-password stream connect surfaces:unauthorized, and the connect HELLO is bounded byconnect_timeout. Connect-time errors are redacted on both sites: a HELLO response arcadic's parser cannot classify returns a value-free:bolt_protocol_errorinstead of a raw exception carrying server bytes, and the DBConnection pool's connect error drops the server-supplied failure message (keeping the error code/class) so it cannot ride a connect-failure log line.