Key Architectural Decisions

This document records significant architectural decisions and their rationale.

ADR-001: Digest-First Release Identity

Status: Accepted

Context: Container images can be referenced by tags (e.g., v1.2.3) or digests (e.g., sha256:abc123...). Tags are mutable - the same tag can point to different images over time.

Decision: All releases are identified by immutable OCI digests, never tags. Tags are accepted as input but immediately resolved to digests at release creation time.

Consequences:


ADR-002: Evidence for Every Decision

Status: Accepted

Context: Compliance and audit requirements demand proof of what was deployed, when, by whom, and why.

Decision: Every promotion and deployment produces a cryptographically signed evidence packet that is immutable and append-only.

Consequences:


ADR-003: Plugin Architecture for Integrations

Status: Accepted

Context: Organizations use diverse toolchains (registries, CI/CD, vaults, notification systems). Hard-coding integrations limits adoption.

Decision: All integrations are implemented as plugins via a three-surface contract (Manifest, Connector Runtime, Step Provider). Core orchestration is stable and plugin-agnostic.

Consequences:


ADR-004: No Feature Gating

Status: Accepted

Context: Enterprise software often gates security features behind premium tiers, creating “pay for security” anti-patterns.

Decision: All plans include all features. Pricing is based only on:

Consequences:


ADR-005: Offline-First Operation

Status: Accepted

Context: Many organizations operate in air-gapped or restricted network environments. Dependency on external services limits adoption.

Decision: All core operations must work in air-gapped environments. External data is synced via mirror bundles. Plugins may require connectivity; core does not.

Consequences:


ADR-006: Agent-Based and Agentless Deployment

Status: Accepted

Context: Some organizations prefer agents for security isolation; others prefer agentless for simplicity.

Decision: Support both agent-based (persistent daemon on targets) and agentless (SSH/WinRM on demand) deployment models.

Consequences:


ADR-007: PostgreSQL as Primary Database

Status: Accepted

Context: Database choice affects scalability, operations, and feature availability.

Decision: PostgreSQL (16+) as the primary database with:

Consequences:


ADR-008: Workflow Engine with DAG Execution

Status: Accepted

Context: Deployment workflows need conditional logic, parallel execution, error handling, and rollback support.

Decision: Implement a DAG-based workflow engine where:

Consequences:


ADR-009: Separation of Duties Enforcement

Status: Accepted

Context: Compliance requires that the person requesting a change cannot be the same person approving it.

Decision: Separation of Duties (SoD) is enforced at the approval gateway level, preventing self-approval when SoD is enabled for an environment.

Consequences:


ADR-010: Version Stickers for Drift Detection

Status: Accepted

Context: Knowing what’s actually deployed on targets is essential for audit and troubleshooting.

Decision: Every deployment writes a stella.version.json sticker file on the target containing release ID, digests, deployment timestamp, and deployer identity.

Consequences:


ADR-011: Security Gate Integration

Status: Accepted

Context: Security scanning exists as a separate concern; release orchestration should leverage but not duplicate it.

Decision: Security scanning remains in existing modules (Scanner, VEX). Release orchestration consumes scan results through a security gate that evaluates vulnerability thresholds.

Consequences:


ADR-012: gRPC for Agent Communication

Status: Accepted

Context: Agent communication requires efficient, bidirectional, and secure data transfer.

Decision: Use gRPC for agent communication with:

Consequences:


References