Distribution manifest and lock¶
The manifest records the source-controlled desired selection. The lock is the
resolved, exact build input. Current Composer resolves workspace artifacts
only.
distribution: { id: atlas.default, version: "2026.09" }
core: { version: 0.1.0 }
plugins:
- id: atlas.inventory # unique plugin id
version: 0.1.0 # must match resolved artifact
disabled: false # optional; defaults false
backend: { package: atlas-plugin-inventory, source: workspace }
frontend: { package: "@atlas/plugin-inventory", source: workspace }
config: # validated by the descriptor schema
token: { fromEnv: INVENTORY_TOKEN }
distribution.id and distribution.version identify the build; core.version
is checked against plugin atlasCore ranges. Each plugin has an id, version,
at least one artifact, and optionally disabled and config. Artifact fields
are package and source; registry source names may be accepted by the schema but
are not currently resolved by this checkout. A workspace backend that is not in
core/backend/uv.lock, such as an example-only plugin, can add path, a
repo-relative directory whose pyproject.toml names the package; the lock then
records the version from that pyproject.toml. fromEnv references an environment
variable and never puts the secret value in source control.
The lock records distribution as id@version, core, and plugins keyed by
id@version. Each selected backend and frontend has package and exact version.
Integrity of installed artifacts comes from uv.lock and package-lock.json,
not from the lock. Generate the lock instead of editing it by hand:
uv run --project composer atlas-compose resolve distributions/default/manifest.yaml -o distributions/default/lock.yaml
uv run --project composer atlas-compose validate distributions/default/manifest.yaml distributions/default/lock.yaml
For procedures and failure correction, use Assembling a distribution and composition errors.
Authentication¶
auth.providers is an ordered, non-empty list of provider policy objects.
auth.default must name one selected id. Legacy string entries are rejected.
auth:
publicOrigin: https://atlas.example
sessionMaxAgeSeconds: 28800
trustedProxyAddresses: []
adminPassword: {mode: disabled, principalIds: []}
outboundTrust:
allowedDestinations: [https://idp.example]
allowDevelopmentHttp: false
passwordPolicy:
minimumLength: 15
maximumLength: 128
rejectCommon: true
rejectUserSimilarity: true
recovery:
mode: operator-managed
verifiedAddressesRequired: true
tokenMaxAgeSeconds: 3600
providers:
- id: atlas.auth.oidc
signup: disabled
principalProvisioning: automatic
actorProvisioning: automatic
profileFields: [username, displayName, email]
sourceBinding:
sourceId: https://idp.example
configurationFingerprint: reviewed-issuer-v1
groupSync:
mode: exact
snapshotRequirement: required
maxAgeSeconds: 28800
mappings: {engineering: platform-owners}
restrictedAttributes: []
default: atlas.auth.oidc
| Provider field | Accepted values and behavior |
|---|---|
signup |
disabled or enabled; only local auth may enable it |
principalProvisioning |
preprovisioned, automatic, or restricted |
actorProvisioning |
manual or automatic |
profileFields |
Unique entries from username, displayName, and email |
restrictedAttributes |
Required only with restricted; each item names accepted verified-ownership or authority-managed provenance |
sourceBinding |
Non-empty immutable sourceId and non-secret configurationFingerprint |
groupSync.mode |
none, additive, or exact |
groupSync.snapshotRequirement |
unsupported for none; best-effort or required for additive; required for exact |
groupSync.maxAgeSeconds |
Positive finite freshness, default 28,800 seconds |
groupSync.mappings |
External value to existing Atlas Group; invalid with none |
sessionMaxAgeSeconds and recovery token age must be positive. publicOrigin
contains only scheme and authority and uses HTTPS outside loopback development.
Trusted proxy entries are IP addresses. Break-glass admin password login needs
a non-empty unique list of positive Principal ids. Password minimum is at least
15 and maximum at least 64.
The lock adds resolved public provider metadata and Core policy while keeping secret references unresolved. It must never contain submitted credentials, client/bind secrets, or tokens. See authentication routes and diagnostics and Choose an authentication method.