0.1.0 — 2026-09-10

Extracted from the Axonn umbrella (apps/ash_sandbox) into a standalone package, carrying its full commit history via git subtree split. No behavior changed by the extraction itself.

Public interface at extraction: AshSandbox.RegistryTemplate, AshSandbox.ProjectTemplate, AshSandbox.EnvironmentTemplate, AshSandbox.TemplateTemplate, AshSandbox.OperationRecordTemplate, AshSandbox.SandboxCredentialTemplate, and AshSandbox.EncryptedSecret (public by consequence). See priv/boundary.md for the full contract.

AshSandbox.RunPolicy, the AshSandbox.Resource DSL extension, and AshSandbox.Plug were withdrawn from the umbrella before extraction (R-12) and do not exist in this package.

Fixed during extraction

Update actions raised MustBeAtomic on every non-PostgreSQL data layer. MEASURED 2026-09-10: each of the registry's seven mark_* transitions and the project's :rename failed on Ash.DataLayer.Ets, while passing on PostgreSQL. An identity carrying pre_check_with makes Ash add an eager_validate_identities before_action hook, and any before_action hook makes an update non-atomic. This falsified 012-FR-009, the data-layer independence these templates exist to provide — and no test had caught it, because the ETS host app in test/support/host_app.ex had only ever been read from and created through, never updated through.

AshSandbox.Internal.DataLayerSection.require_atomic/1 now emits require_atomic?(false) for every data layer except AshPostgres.DataLayer, which keeps the atomicity expr(now()) buys where it is available. :record_request is unchanged: it already carried an unconditional require_atomic? false for its own reason.

Documentation

The package now ships a Diátaxis documentation set under docs/, published as ExDoc extras: a getting-started tutorial executed as a test (test/getting_started_doc_test.exs), two how-to guides, an explanation of why the host owns the resource module, and reference pages decoding the requirement IDs and the citations to the originating umbrella.

test/public_interface_test.exs asserts that the four statements of the public interface — use Boundary's exports:, priv/boundary.md, the AshSandbox moduledoc, and the README — name the same seven modules, and that the shipped boundary document resolves through Application.app_dir/2. The moduledoc had drifted to naming one module of the seven.

mix precommit now runs mix docs --warnings-as-errors.