Skip to content

Architecture Decision Records (ADRs) for Hop3

Architectural Decision Records (or ADR) are documents that capture important architectural decisions made along with their context and consequences.

This process is inspired by Python's PEP process and Gel's RFC process.

ADR Index

Type
Status

#TitleTypeStatus
001Config Files for Hop3FeatureAccepted
002Detailed `hop3.toml` FormatFeatureAccepted
003Config Parsing and ValidationFeatureAccepted
004Development ToolingProcessActive
005Web Terminal for Application ManagementFeatureDeferred
006Nix Integration with Hop3FeatureAccepted
007Nix Builders for Existing Packages (Nixpkgs Mode)FeatureSuperseded
008Template-Based Nix Expression GenerationFeatureFinal
009Nix Runtime IntegrationFeatureDeferred
010Security and Resilience (Umbrella)FeatureAccepted
011Data Encryption and ProtectionFeatureAccepted
012Multi-Factor Authentication (MFA)FeatureDeferred
013Software Supply Chain Security and SBOMsFeatureAccepted
014Authentication Bootstrap ProcessFeatureFinal
015Documentation and Community EngagementProcessActive
016Backup StrategyFeatureAccepted
017Distributed, Agent-Based ArchitectureFeatureDraft
018CLI-Server CommunicationFeatureFinal
019Basic Commands for the Hop3 Command-LineFeatureAccepted
020Pluggable Architecture for Core Deployment WorkflowFeatureFinal
021Proxy Plugin System for Reverse Proxy ConfigurationFeatureFinal
022Build and Deployment Plugin SystemFeatureFinal
023Runtime Stack ReplacementFeatureDraft
024Backup and Restore SystemFeatureFinal
025CLI User Experience ImprovementsFeatureFinal
026Dashboard UI Test ClassificationGuidelineSuperseded
027Configuration System Refactoring for TestabilityFeatureFinal
028Pluggy + Dishka Integration for Plugin-Contributed ServicesFeatureFinal
029Application Reconciliation and Health Check SystemFeatureAccepted
030Two-Level Build ArchitectureFeatureFinal
031Project Terminology (Ubiquitous Language)GuidelineActive
032Deployment Strategies and Artifact LifecycleFeatureAccepted
033Docker Integration StrategyFeatureFinal
034Streaming Deployment LogsFeatureFinal
035Build Artifacts as Runtime ContractArchitectureFinal
036CLI Ergonomics and Command SurfaceDesignAccepted
037Git-Based Deployment ArchitectureArchitectureFinal
038Multi-Service Application SupportFeatureAccepted
039Python Deploy Strategies: Clarify and Make ExplicitFeatureAccepted
040Network firewall and per-app port exposureFeatureSuperseded
041Privileged Operations Agent (hop3-rootd)ArchitectureAccepted
042CLI Context Model: Context = Deploy EnvironmentFeatureAccepted
043Unified Testing ArchitectureProcessAccepted
044Nightly Test Lab: a Web App to Run and Report on the Full Test SuiteArchitectureAccepted
045Fixed-Port Registry: Exclusive Host Ports for Non-HTTP AppsArchitectureAccepted
046Declarative Application Resources: Generated Secrets, Persistent Volumes, Dynamic Env, and Resource LimitsFeatureAccepted
047CLI Invocation Context: transmit the resolved app and environment with every callFeatureDraft
048Server Configuration and Secret StorageArchitectureAccepted
049Catalog Distribution: Fetching App Specs from a Central SourceFeatureAccepted
050Layer-7 Web Application Firewall (LeWAF)FeatureAccepted
051Config Injection: Wiring config-file and DB apps from the injected environmentArchitectureDraft
052CLI Argument Consistency: one flag lexicon across every Hop3 command-line toolGuidelineAccepted
053Nix Closure Lifetime: keeping a running app's store paths alive across garbage collectionArchitectureAccepted
054Email: a backing service with a swappable backendArchitectureAccepted

ADR Types

An ADR can describe one of three types:

Type Description Final Status
Feature New functionality or capability in Hop3 Final
Architecture Cross-cutting structural decisions (build, deploy, agents) Implemented / Accepted
Design Interface/UX and command-surface decisions Accepted
Process How we do things (workflows, development practices) Active
Guideline Conventions, best practices, standards Active

ADR Statuses

Lifecycle

                    ┌─────────────┐
                    │    Draft    │
                    └──────┬──────┘
              ┌────────────┼────────────┐
              ▼            ▼            ▼
        ┌──────────┐ ┌──────────┐ ┌──────────┐
        │ Accepted │ │ Rejected │ │ Deferred │
        └────┬─────┘ └──────────┘ └──────────┘
      ┌──────┴──────┐
      ▼             ▼
┌──────────┐  ┌──────────┐
│  Final   │  │  Active  │
│(features)│  │(process/ │
└──────────┘  │guideline)│
              └────┬─────┘
             ┌──────────┐
             │ Inactive │
             └──────────┘

Status Definitions

Status Description
Draft Initial proposal, not yet reviewed or discussed
Accepted Approved after discussion, ready for implementation
Rejected Explicitly decided against after discussion
Deferred Parked for later consideration (not rejected, just not now)
Final Feature is fully implemented (note which version)
Active Process or guideline is in effect
Inactive Process or guideline has been abandoned or replaced
Superseded Replaced by a newer ADR (reference the replacement)

ADR Structure

Required Preamble

Every ADR should start with a structured metadata block:

# ADR NNN: Title

**Status**: Draft | Accepted | Rejected | Deferred | Final | Active | Inactive | Superseded
**Type**: Feature | Process | Guideline
**Created**: YYYY-MM-DD
**Authors**: Name <email> (optional)
**Implemented-In**: vX.Y.Z (for Final status)
**Superseded-By**: ADR NNN (if superseded)
**Related-ADRs**: NNN, NNN, NNN

Required Sections

  1. Context - What is the issue motivating this decision?
  2. Decision - What change are we proposing?
  3. Consequences - What are the positive and negative outcomes?
  • Motivation - Why is the existing situation inadequate?
  • Detailed Design - Technical specification
  • Examples - Practical scenarios demonstrating the decision
  • Alternatives Considered - Other options and why they were rejected
  • Security Implications - Security considerations
  • Backwards Compatibility - Impact on existing functionality

ADR Guidelines

ADRs should provide:

  1. Decision-focused content - Why we made these choices
  2. Complete interfaces - Anyone can implement against the design
  3. Concrete examples - Not abstract, but simplified
  4. Configuration guidance - How to use and configure
  5. Trade-offs documentation - Alternatives considered and why rejected

ADRs should NOT include:

  • Exhaustive feature lists for each implementation
  • Step-by-step integration guides
  • Implementation details for all variants
  • Detailed testing procedures

The ADRs are architectural specifications with sufficient detail to understand responsibilities and implement functionalities, while remaining focused on decisions rather than becoming implementation manuals.


Full Template

# ADR NNN: Title

**Status**: Draft
**Type**: Feature
**Created**: YYYY-MM-DD
**Authors**: Name <email>
**Related-ADRs**: NNN, NNN

## Context

What is the issue that we're seeing that is motivating this decision or change?

- Current situation (as-is state)
- Pain points or limitations
- Stakeholders affected

## Motivation

Why is the existing situation inadequate to address the problem?

- Why now? What triggered this decision?
- What happens if we do nothing?

## Decision

What is the change that we're proposing and/or doing?

- High-level summary of the approach
- Key principles or tenets guiding this decision

## Detailed Design

Explain the design in enough detail for someone familiar with the ecosystem
to understand and implement.

- Architecture and components
- Interfaces and protocols
- Configuration options
- Corner cases and edge conditions

## Examples

Illustrate the detailed design with examples.

- Common use cases
- Configuration examples
- API usage examples

## Consequences

### Positive

- Benefits and improvements
- Problems solved

### Negative

- Trade-offs and limitations
- New complexity introduced
- Migration or compatibility concerns

## Security Implications

Security considerations for this decision.

- Authentication/authorization impact
- Data protection concerns
- Attack surface changes

## Backwards Compatibility

Impact on existing functionality.

- Breaking changes
- Migration path
- Deprecation timeline

## Alternatives Considered

What other options did we consider? Why were they rejected?

- Alternative A: Description, pros, cons, why rejected
- Alternative B: Description, pros, cons, why rejected

## Prior Art

How do other projects solve this problem?

- Similar solutions in other systems
- Lessons learned from previous attempts

## Unresolved Questions

What parts of the design are still TBD?

- Open issues to be resolved during implementation
- Questions needing further research

## Future Work

What future work is implied by this decision?

- Follow-up ADRs needed
- Features enabled by this decision
- Technical debt to address later

## References

- Links to relevant documentation, issues, or discussions
- External specifications or standards

Minimal Template

For smaller decisions, a minimal template may suffice:

# ADR NNN: Title

**Status**: Draft
**Type**: Feature
**Created**: YYYY-MM-DD
**Authors**: Name <email>

## Context

[Brief description of the problem]

## Decision

[What we decided to do]

## Consequences

[Key positive and negative outcomes]

More Information