Browse documentation

ADR 006: Per-server discovery bundles

On this page

Status: Accepted · 2026-10

Context

Scheduler exports are collected machine by machine. Without metadata, Atlas cannot tell nightly-export on APP01 from nightly-export on APP02, and the natural-key fingerprint would merge them. It must also never guess the execution host from a task’s Author, UserId, URI, or a hostname that merely appears in a command.

Decision

A bundle is a directory containing a server.json manifest:

{
  "hostname": "APP-SERVER-01",
  "fqdn": "app-server-01.corp.example",
  "os": "windows",
  "environment": "production"
}

Only hostname is required. server.json is metadata, not a config file to mine: no scanner claims it.

Scoping

Relationships

Each scheduled job/script in a bundle gets a job --RUNS_ON--> server edge. RUNS_ON has influence server -> job, so a server change correctly impacts the jobs it hosts. Execution hosts stay separate from dependency hosts: a script that connects to a host still gets its own CONNECTS_TO dependency host, distinct from the execution server entity.

Missing metadata

An import with no server.json still works; the job simply has no server metadata, is not scoped, and gets no RUNS_ON edge. The execution server is effectively unknown rather than invented.

Cron formats

Collection is read-only

Collection scripts only copy/read/export artefacts. Discovered jobs are never executed, imported or evaluated. See docs/server-bundles.md for Windows and Linux collection examples.