OpenRig Instance Layout
An OpenRig instance keeps its managed state under one configured
$OPENRIG_HOME. rig daemon start and direct daemon first start reconcile the
same additive layout before the database is opened or the listener binds.
$OPENRIG_HOME/
config.json # typed instance settings; created as an empty object
state/ # runtime-owned durable state
context/ # addressable context library (`context.root`)
system/
system-world.yaml # selected baseline context + skill identities
skills/ # managed skill catalog (`skills.root`)
workspace/ # project work tree (`workspace.root`)
SPEC.md # project intent
project.yaml # project context and skill selection
workspace.yaml # project-location catalog
.gitignore
missions/
exhaust/
specs/ # canonical instance spec library
topology/ # instance, rig, pod, and seat continuity tree
plugins/ # installed OpenRig plugins
run/ # process coordination files
logs/ # daemon and operation logs
transcripts/ # durable per-seat terminal transcripts
backups/ # operator-created recovery artifacts
secrets/ # local connector and host secrets
The initializer creates only missing managed entries. It never overwrites an existing file, and it checks every managed path before the first write. A path with the wrong type is reported by its exact location; unrelated user-owned content is preserved. A second run against an already-converged instance writes nothing.
The workspace subtree is owned by the Project Workspace
Contract. The instance initializer calls that owner
rather than carrying another copy of its file bytes. skills/ and topology/
are created as empty roots; their respective catalog and topology workflows own
their contents.
Context library setting
The addressable context library has one typed setting and one environment override:
| Surface | Value |
|---|---|
| Config key | context.root |
| Environment | OPENRIG_CONTEXT_ROOT |
| Default | $OPENRIG_HOME/context |
| Resolved property | contextRoot |
The removed context.packs_root, context.packsRoot, and
OPENRIG_CONTEXT_PACKS_ROOT spellings are refused with guidance to use
context.root; they are not compatibility aliases. Bundle installation and
rig context add both resolve the same configured landing root.
System World
The System World is the instance-wide baseline selected before topology/role
and Project World material. Its versioned manifest contains ordered context-pack
references plus managed skill identities; it never contains authoritative skill
bytes. The default manifest is installed additively at
$OPENRIG_HOME/context/system/system-world.yaml.
| Surface | Value |
|---|---|
| Config key | context.system_world |
| Environment | OPENRIG_CONTEXT_SYSTEM_WORLD |
| Default | default |
| Resolved property | systemWorld |
default selects the installed manifest, a safe relative or absolute path
selects an explicit replacement, and disabled is an explicit off state.
Missing or malformed selections fail; absence is never inferred as disablement.
rig context work-install --json reports the effective state, source, manifest,
context selectors, and skills. With --runtime, its managed skill loadout then
combines System World, topology, and Project World selectors with provenance.
For a pre-0.5.9 home, use the openrig-upgrade skill's
migrate-telemetry-state-0.5.9.mjs helper as an Agent-Operated Migration. Its
order is plan → --apply-state → separately activate the target runtime →
paired new-root samples newer than any bounded legacy tail → --verify → the
non-destructive finalizer --apply-library. During activation, runtime readers
are canonical-first with legacy-fallback and a custom context-library root
remains stable. Verification binds exact accepted tail bytes; finalization
revalidates them, copies without overwrite, and switches config last. It never
removes the legacy telemetry or library. --rollback reverses only helper-owned
config, System World, empty-directory, and copied-library effects. The helper
must stop rather than claim success if writer/reader convergence, resumed legacy
writes, byte drift, collision, or any migration-owned path cannot be proved.
--help prints the phase grammar without inventorying; no phase flag is the
intentional read-only plan, and unknown options fail nonzero before plan or
mutation.
Existing spec libraries
Creating $OPENRIG_HOME/specs does not migrate existing launch-era specs.
Upgraded installations may still have a separate legacy specs library that the
runtime reads for compatibility. Treat the two-home state as an explicit
limitation: use the live spec-library commands to determine where a spec is
served from, and do not infer convergence merely because the canonical
directory exists.
Config updates publish a complete replacement file atomically where directory
permissions and the filesystem allow it. On POSIX systems, replacement preserves
the existing owner, group, and read/write/execute permission bits. If creating or
preparing the replacement, or renaming it, fails with EACCES, EPERM, or EBUSY,
the stores write the writable target in place, preserving compatibility with
unwritable directories and single-file bind mounts. This fallback is not atomic
and retains the previous partial-write risk. Read-only config files are refused.
Other errors, including ENOSPC, leave the original file intact on the atomic
path. Atomic replacement does not carry extended ACLs or other inode metadata;
a hard-linked second name continues to refer to the previous file.