Home / Projects / Orchestrata Ultimate / Decisions / ADR index / ADR-0062

ADR-0062: Production runs from a pinned-ref git checkout under /opt/orchestrata

field value
Status Proposed — Proposed (awaiting Mohamed's ruling)
Date 2026-09-23
Register factory (docs/adr, 4-digit ids)
Source docs/adr/0062-prod-is-a-pinned-checkout-under-opt-orchestrata.md — permalink at 66cf00858 (unchanged on master since that commit)
Wiki register entry ADR-0062 (wiki status: Proposed)

← ADR-0061 · ADR-0063 →

The record

Date: 2026-09-23 · Status: Proposed (awaiting Mohamed's ruling)

Context

RUL-027 (2026-08-08) moved production off the development tree and named ~/prod/orchestrata-ultimate as the dedicated checkout every prod unit executes from. Measured read-only on 2026-09-23 (plan baseline): ~/prod does not exist on this host and never ran anything here, and /opt/orchestrata is absent on the host as well. ADR-0053 records Mohamed's deliberate deletion of the prod stack and the law that follows from it — infrastructure claims carry live probe evidence or are violations, and a document asserting dead infrastructure is a defect. A ruling whose path clause names a directory that does not exist is that defect.

Meanwhile the test container app (10.53.2.13, project orchestrata-test) already runs a git-archive copy of the tree at /opt/orchestrata (VERSION 3cf440b39, architecture branch) under SYSTEM units, so host and container disagree about what the production root is. Master's provision_app_container.sh is still the bind-mount version hard-coding the -architecture path.

The deployment methodology (claude/workflow/deployment.md) states the five properties without which a service is not deployed:

  1. copies under /opt/<name>, outside every working tree;
  2. its own uv venv on python3.14t (/opt/<name>/.venv);
  3. the source commit recorded in the deployed tree;
  4. an installer that re-deploys from a pinned git ref — git reset --hard <ref>, never a merge;
  5. a verification step that REFUSES success unless the running thing is the deployed thing.

The promotion package (src/orchestrata_ultimate/promotion/{runner,stages, models,projects}.py) already implements the tree/drift/rollback stages, and its advance_tree, drift and _rollback need .git in the target.

Decision (proposed)

Rulings R1 and R5 of the 2026-09-23 plan, recorded as one decision:

Alternatives rejected

  1. Keep ~/prod/orchestrata-ultimate as the git checkout (RUL-027 as written). Rejected: three shapes across dev/test/prod (workspace tree, container archive at /opt/orchestrata, ~/prod checkout), and a mutable HEAD in a home directory as the only record of what is deployed. It also does not exist on this host, which ADR-0053 makes a violation to keep asserting.
  2. A git-archive copy at /opt/orchestrata (the install-tools.sh pattern the test container runs; R1's first phrasing). Rejected for prod by R5: promote_env's tree/drift/rollback stages need .git, so an archive copy forks the promotion path and turns rollback into a re-install. The container keeps its archive copy — same layout, the one documented divergence — because nothing promotes into it.

Consequences

Provenance

Ruled by Mohamed on 2026-09-23 in the codetools planning session: rulings R1 and R5 (and R3, R4 above) in /home/mohamed/workspace/orchestrata.codetools/plans/PLAN-2026-09-23-production-deployable-tools.md, sections "Rulings from Mohamed" and "Design: orchestrata-ultimate production path". Plan mode forbade commits, so this file is a Round-0 task and the ruling text in the plan is authoritative until this record is Accepted. Baseline facts (~/prod and /opt/orchestrata absent on the host; container app running an archive copy under system units; next free id 0062 because 0059–0061 exist on the architecture branch) were measured read-only on 2026-09-23. Status stays Proposed until Mohamed flips it.

Rulings cited

Specs cited

None (or no spec page exists for the ones named).