ESS Orrery
Security and trust

An instrument this honest about its own reach.

Orrery is asked to reach every box in a fleet and sit near every secret it has. That is exactly the kind of software that should not be trusted on reputation. Here is what it actually does, stated as plainly as a drift finding, and what it does not do yet.

Trust properties

Six properties, each one load-bearing.

None of these are marketing claims layered on afterward. Each one is a property of the architecture, checkable by reading the source, because the source is the whole product.

01

Read-only by construction

The reconciler measures and reports; it never changes a box. The Box abstraction every check runs against exposes exactly four methods, and none of them writes.

Structural, not a policy
02

Value-blind secret graph

secret-edges maps each secret to its consumers by a non-secret identity, a vault path or an env var name, and is fail-closed: anything that is not a constrained identity shape is refused, never scanned, never echoed.

Operational
03

No phone-home

The core is identity-free and runs entirely on the operator's own boxes. It has zero runtime dependencies and makes no outbound network call of its own; the only network traffic it initiates is the ssh read a profile explicitly declares.

Structural, not a policy
04

Auditable in full

The core is AGPL-3.0-or-later, source-available and copyleft, with zero runtime dependencies. Software with this much reach should be readable end to end, not taken on faith.

AGPL-3.0-or-later
05

Enforced in code, not asked of a model

Rules live below the model, in the guard and the architecture. fleet-reach refuses a host string that is not a safe ssh alias; secret-edges refuses anything outside its identity allowlist, before either one runs. A safety you must remember to honor is not a safety.

Structural, not a policy
06

Self-verifying install

orrery doctor confirms an installation actually stands, cold, on a blank box. The reconciler then keeps watching for drift afterward, so nothing here is trusted blind a month later.

Operational
The read surface

The whole read surface, in four methods.

Every check the reconciler runs, against a local box or a remote one over ssh, is written against one interface. This is the entire contact surface with a measured box: no method on it can write. On a remote box each read is a bounded, timed-out, BatchMode ssh command, and every path is shell-quoted so a profile value cannot become a remote flag or reach the remote shell.

# orrery/reconciler/box.py, the target a reconciler measures
class Box(Protocol):
    def exists(self, path: str) -> bool: ...

    def read_text(self, path: str) -> str | None:
        """Return file contents, or None if absent or unreadable. Never raises."""

    def list_files(self, root: str, max_files: int) -> list[str] | None:
        """Return up to max_files file paths under root, or None if unlistable."""

    def file_meta(self, path: str) -> tuple[int, int] | None:
        """Return (owner uid, permission bits) for path, or None if absent/unreadable."""

Verbatim from the shipping source. LocalBox and SshBox both implement exactly this interface; there is no fifth method and no write path in either class.

Why it holds up

Why it holds up under an adversarial read.

Measure, do not read

The graph is identity, never the value.

secret-edges is checked against a denylist of known secret-value shapes (private keys, cloud and API tokens) as a backstop, and an allowlist of what an identity is allowed to look like as the actual gate. A secret's value is never read into a finding or printed anywhere.

Bounded, not blind

Reads cannot run away.

File listing stops at a declared file count and skips anything over 1MB. Text reads are capped in the same way on a remote box. A large or unusual file cannot stall or exhaust a run.

Narrow by default

The reach is what you declare.

Orrery only reaches a box a profile names. There is no discovery step that reaches out to boxes you did not declare, and fleet-reach itself treats a reopened edge you had declared closed as drift, not as progress.

Built and not built

What is built, and what is not.

Measure, do not read applies to this page too. The commercial layer described elsewhere on this site (linked secret rotation, a hosted control plane, a GUI) is not part of this repository and is not audited here. What follows is the trust-relevant state of the core, stated plainly rather than implied.

Shipped, in the core4
box.pyLive

Read-only Box abstraction

Four methods, LocalBox and SshBox, no write path in either.

secret-edgesLive

Value-blind secret graph

Identity allowlist, secret-value denylist backstop, fail-closed.

doctorLive

Self-verifying install

orrery doctor confirms the install stands on a blank box.

licenseLive

AGPL-3.0-or-later core

Zero runtime dependencies, source-available, copyleft.

True today, by design2
networkBy design

No phone-home

No telemetry or licensing call exists in the core; the only outbound traffic is the ssh read a profile declares.

identityBy design

Identity-free core

No account, no key, no server-side check is required to run the core at all; it is free software, not gated software.

Not built yet3
vaultNot built

Linked secret rotation

Does not exist. It would walk the secret-edges graph to rotate a credential everywhere it is consumed. Will not ship until breakglass recovery is proven first, because a half-applied rotation is the one failure mode that can lock an operator out of their own fleet.

hostedNot built

Hosted control plane

Does not exist yet. When it ships it is a separate proprietary product, not part of this repository, and will carry its own security review.

guiNot built

Graphical fleet view

Does not exist yet. Today's operator surface is the CLI and the terminal deck.

Responsible disclosure

Found a problem, tell us.

If you find a way to make a check write instead of read, a way to get a secret value scanned or printed instead of just its identity, or any other issue that would undercut what this page claims, report it to orrery@eveningstar.app. Include what you found, how to reproduce it, and its impact. We will confirm receipt and work a fix before any public disclosure timeline.

Because Orrery only reaches boxes a profile explicitly declares and never writes to any of them, most findings will be about the boundary itself: the identity allowlist in secret-edges, the shell-quoting in SshBox, or a way to widen a read past what a check needs.

There is not yet a dedicated security-only inbox separate from general product support; orrery@eveningstar.app is the working channel until that changes.

In service to Life