Architecture decision records

Index of the significant decisions about the project, recorded in MADR style.

This directory records significant decisions about myriarch in MADR style. Each record states the context, the decision, its consequences and the alternatives that were considered.

Process

  • A new record copies the shared template 0000-template.md with the sections Status, Date, Related, Context, Decision, Consequences (Positive and Negative) and Alternatives considered.
  • It takes the next free four-digit number and is named NNNN-kebab-title.md.
  • Status values are Proposed, Accepted, Deprecated and Superseded by ADR-NNNN. A record whose decision is replaced only in part keeps its status and names the superseding record (“Superseded in part by ADR-NNNN” or “Accepted; … superseded by ADR-NNNN”).
  • Accepted records are not rewritten. A change of mind is a new record that supersedes the old one.
  • Editorial changes (links, typos, front matter) are allowed and do not change a decision.
  • Records are proposed via pull request with DCO sign-off (ADR-0019).

Records

The records 0001 to 0014 were written during early development, in German, inside the former architecture document. They were migrated to this directory with their original numbers and rewritten in English. Their date is 2026-10-07, the earliest date for which a record is available; the decisions themselves were taken before. The records 0015 and later were written as separate files.

Some early operational decisions were not kept as separate records. They are described in the reference text instead: one outbound proxy and CA setting for all connections, the layout of an artifact mirror without a URL template, Sigstore trust through a proxy or a TUF mirror, and configuration validation without starting the server are covered in the security model and the architecture. The early decision to sign releases with a long-lived key is superseded by ADR-0023.

ADRTitleStatus
0001A single server binary carries all server functionsAccepted
0002PostgreSQL for state, event bus and leader electionAccepted, refined by 0036
0003GitOps is the source of truth; the UI operates within the Git frameAccepted
0004Server-side rendering to one content-addressed configuration per agentAccepted
0005Templating with double brackets and typed whole-expression evaluationAccepted
0006Version updates through exchangeable executorsAccepted
0007Package offers in the upstream draft format with Sigstore bundlesAccepted, refined by 0046
0008Kubernetes: supervisor and collector in one podAccepted, superseded in part by 0024 (own combined image) and refined by 0026
0009Server-sent events for live UI updatesAccepted
0010Standard ServeMux and hand-written DTOs with a contract testAccepted
0011No containers for local development and testsAccepted
0012Agent access through enrollment tokensAccepted, refined by 0046
0013Target version from the UI within the Git frameAccepted, refined by 0046
0014Binary updates in the pod through container modeAccepted, refined by 0026
0015Project name “myriarch” and naming schemeAccepted, superseded in part by 0029 and 0050
0016Trademark usage and protection of the project nameAccepted
0017Repository hosting, maintainer identity and later move to a neutral organizationSuperseded in part by 0029
0018License: Apache-2.0 for code, CC-BY-4.0 for documentationAccepted
0019Contribution model: Developer Certificate of Origin, no CLAAccepted
0020English as the language of documentation and project communicationAccepted
0021Publication gates and scope of the first release (v0.1.0)Accepted
0022White-label meaning and vendor-neutral examplesAccepted
0023Keyless release signing with SigstoreAccepted, superseded in part by 0029
0024Container registry (ghcr.io) and published image setAccepted, superseded in part by 0029
0025Login without an enterprise identity provider: bootstrap adminAccepted
0026Collector version updates on KubernetesAccepted, refined by 0037
0027Model Context Protocol (MCP) access: principlesAccepted, superseded in part by 0029
0028Relationship to OpenTelemetry and path towards a foundationAccepted, superseded in part by 0029
0029Host the project in the GitHub organization “myriarch” from the startAccepted
0030REUSE compliance and third-party noticesAccepted
0031Project website myriarch.dev with Hugo and Docsy, built from the repository and served as static filesAccepted
0032Continuous integration on GitHub Actions with GitHub-owned, SHA-pinned actions and one aggregate checkAccepted, amended by 0033
0033OpenSSF Scorecard as the only third-party action, and policy rules for the Scorecard and release workflowsAccepted
0034Authenticode signing of Windows release artifacts by the SignPath Foundation, with a defined fallback and exceptions for v0.1.0, v0.2.0 and v0.2.1Accepted
0035Release workflow: tag-only, isolated jobs, keyless signing and provenance, verification before an immutable publication, and a frozen signing identityAccepted
0036Database schema compatibility and rollbackAccepted
0037OpAMP Bridge agents are recognised and locked until the Operator integrationAccepted
0038Dependency license policy: a tripwire on the CNCF allowlist for pull requests, a narrower allowlist for releasesAccepted
0046Host installation from the server: versions, artifacts and the installer bundle as data, integrity anchored on the hostAccepted
0050Tagline backed by the documentationAccepted

The Status column names the later records that refine, amend or supersede an earlier record; for example, ADR-0024 supersedes the “own combined image” aspect of ADR-0008 for published artifacts, and ADR-0026 refines ADR-0008 and ADR-0014 (gitops-pr as the Kubernetes default, container mode as an opt-in).


0001. A single server binary carries all server functions

Decision record 0001 (Accepted).

0002. PostgreSQL for state, event bus and leader election

Decision record 0002 (Accepted, refined by ADR-0036).

0003. GitOps is the source of truth; the UI operates within the Git frame

Decision record 0003 (Accepted).

0004. Server-side rendering to one content-addressed configuration per agent

Decision record 0004 (Accepted).

0005. Templating with double brackets and typed whole-expression evaluation

Decision record 0005 (Accepted).

0006. Version updates through exchangeable executors

Decision record 0006 (Accepted).

0007. Package offers in the upstream draft format with Sigstore bundles

Decision record 0007 (Accepted, refined by ADR-0046).

0008. Kubernetes: supervisor and collector in one pod

Decision record 0008 (Accepted, superseded in part by ADR-0024 (own combined image) and refined by ADR-0026).

0009. Server-sent events for live UI updates

Decision record 0009 (Accepted).

0010. Standard ServeMux and hand-written DTOs with a contract test

Decision record 0010 (Accepted).

0011. No containers for local development and tests

Decision record 0011 (Accepted).

0012. Agent access through enrollment tokens

Decision record 0012 (Accepted, refined by ADR-0046).

0013. Target version from the UI within the Git frame

Decision record 0013 (Accepted, refined by ADR-0046).

0014. Binary updates in the pod through container mode

Decision record 0014 (Accepted, refined by ADR-0026).

0015. Project name "myriarch" and naming scheme

Decision record 0015 (Accepted; the owner-specific identifiers (Go module, container images) are superseded by ADR-0029; the tagline and the explanation of the name are superseded by ADR-0050).

0016. Trademark usage and protection of the project name

Decision record 0016 (Accepted).

0017. Repository hosting, maintainer identity and later move to a neutral organization

Decision record 0017 (Superseded in part by ADR-0029 (decision parts 1, 3 and 4; part 2, the maintainer identity, stays in force)).

0018. License: Apache-2.0 for code, CC-BY-4.0 for documentation

Decision record 0018 (Accepted).

0019. Contribution model: Developer Certificate of Origin, no CLA

Decision record 0019 (Accepted).

0020. English as the language of documentation and project communication

Decision record 0020 (Accepted).

0021. Publication gates and scope of the first release (v0.1.0)

Decision record 0021 (Accepted).

0022. White-label meaning and vendor-neutral examples

Decision record 0022 (Accepted).

0023. Keyless release signing with Sigstore

Decision record 0023 (Accepted; the certificate identity and the planned identity change are superseded by ADR-0029).

0024. Container registry (ghcr.io) and published image set

Decision record 0024 (Accepted; the registry owner and the planned path change are superseded by ADR-0029).

0025. Login without an enterprise identity provider: bootstrap admin

Decision record 0025 (Accepted).

0026. Collector version updates on Kubernetes

Decision record 0026 (Accepted, refined by ADR-0037).

0027. Model Context Protocol (MCP) access: principles

Decision record 0027 (Accepted; the MCP registry name is superseded by ADR-0029 (io.github.myriarch/myriarch)).

0028. Relationship to OpenTelemetry and path towards a foundation

Decision record 0028 (Accepted; the precondition “move to a neutral organization” is superseded by ADR-0029 (the project is hosted in the myriarch organization from the start)).

0029. Host the project in the GitHub organization "myriarch" from the start

Decision record 0029 (Accepted).

0030. REUSE compliance and third-party notices

Decision record 0030 (Accepted).

0031. Project website myriarch.dev with Hugo and Docsy, built from the repository and served as static files

Decision record 0031 (Accepted).

0032. Continuous integration on GitHub Actions with GitHub-owned, SHA-pinned actions and one aggregate check

Decision record 0032 (Accepted, amended by ADR-0033 (one third-party action, rule R1)).

0033. OpenSSF Scorecard as the only third-party action, and policy rules for the Scorecard and release workflows

Decision record 0033 (Accepted).

0034. Authenticode signing of Windows release artifacts by the SignPath Foundation, with a defined fallback and exceptions for v0.1.0, v0.2.0 and v0.2.1

Decision record 0034 (Accepted).

0035. Release workflow: tag-only, isolated jobs, keyless signing and provenance, verification before an immutable publication, and a frozen signing identity

Decision record 0035 (Accepted).

0036. Database schema compatibility and rollback

Decision record 0036 (Accepted).

0037. OpAMP Bridge agents are recognised and locked until the Operator integration

Decision record 0037 (Accepted).

0038. Dependency license policy: a tripwire on the CNCF allowlist for pull requests, a narrower allowlist for releases

Decision record 0038 (Accepted).

0046. Host installation from the server: versions, artifacts and the installer bundle as data, integrity anchored on the host

Decision record 0046 (Accepted).

0050. Tagline backed by the documentation

Decision record 0050 (Accepted).