# AshSandbox v0.1.0 - Table of Contents

> Ash resources modelling sandbox lifecycle, over ex_sandbox -- templates a host `use`s to get a working sandbox registry, project, environment and credential store without writing its own Ash.Domain from scratch.

## Pages

- [AshSandbox](readme.md)

- Tutorial
  - [Getting started](getting-started.md)

- How-to
  - [Choose a template](choose-a-template.md)
  - [Encrypt a credential](encrypt-a-credential.md)

- Reference
  - [The public interface of ash_sandbox](boundary.md)
  - [Changelog](changelog.md)

- Explanation
  - [Why the host owns the module](why-the-host-owns-the-module.md)
  - [Requirement IDs](requirement-ids.md)
  - [Why this library cites documents that are not in it](provenance.md)

## Modules

- Interface
  - [AshSandbox](AshSandbox.md): Ash resources modelling sandbox lifecycle, over `ex_sandbox`.

- Templates
  - [AshSandbox.EnvironmentTemplate](AshSandbox.EnvironmentTemplate.md): A named deployment target within a project (003 T007).
  - [AshSandbox.OperationRecordTemplate](AshSandbox.OperationRecordTemplate.md): The outcome of a lifecycle action (003 T011, FR-025, FR-027).
  - [AshSandbox.ProjectTemplate](AshSandbox.ProjectTemplate.md): A named grouping of environments belonging to one owner (003 T006).
  - [AshSandbox.RegistryTemplate](AshSandbox.RegistryTemplate.md): The sandbox registry resource, as a template the **host** owns (012 T025,
FR-009).
  - [AshSandbox.SandboxCredentialTemplate](AshSandbox.SandboxCredentialTemplate.md): A generated, rotatable credential scoped to one sandbox's data store
(003 T035, FR-018 – FR-021, research R3).
  - [AshSandbox.TemplateTemplate](AshSandbox.TemplateTemplate.md): A pre-built, versioned application environment with dependencies installed
(003 T010, FR-008).

- Types
  - [AshSandbox.EncryptedSecret](AshSandbox.EncryptedSecret.md): A string that is encrypted before it reaches the data layer and decrypted on
the way back (003 T036, data-model.md §SandboxCredential).

- Internal (private -- no compatibility promise)
  - [AshSandbox.Internal.CopyOwnerRefFromProject](AshSandbox.Internal.CopyOwnerRefFromProject.md): Copies the owning `Project`'s `owner_ref` onto a new `Environment` at create
time (018 Phase 1 T002, research R1).
  - [AshSandbox.Internal.OwnerCheck](AshSandbox.Internal.OwnerCheck.md): Filters records to those whose `owner_ref` equals the actor's (003 T050,
`FR-002`, `012-FR-003`).
  - [AshSandbox.Internal.RefuseAllowlistChangeWhileLive](AshSandbox.Internal.RefuseAllowlistChangeWhileLive.md): Refuses a change to an `Environment`'s `network_allowlist` while that
environment has a live sandbox (029 T018 ruling, `FR-011`).
  - [AshSandbox.Internal.SetPurposeFromArgument](AshSandbox.Internal.SetPurposeFromArgument.md): Writes `purpose` from the `:purpose` argument, and only when one was given
(`derive-availability-from-plan-and-purpose` 2.1).

