Skip to main content

Architecture decisions

This directory records the architecture decisions behind Package Broker 2.0. Each decision is an ADR (architecture decision record) with a status, a context, the decision and its consequences. The records are grouped by scope, one file per scope.

Index​

ADRTitleStatusDateScope
ADR-001Package Broker 2.0 is a backwards-incompatible open-source rewrite, built rather than boughtAccepted2026-10-15licensing-and-contribution-terms
ADR-002One organization per deployment, with org_id kept as a constant columnAccepted2026-10-15identity-and-sessions
ADR-003Two runtimes, Cloudflare Workers and Docker on Node, behind ports and adaptersAccepted2026-10-15platform-ports-and-adapters
ADR-004Modular build composition at build time with deny-only hooksAccepted2026-10-15plugin-api-and-composition
ADR-005Ecosystems are Composer and npm; Composer v2+ for clients and served endpoints, v1 provider protocol ingested from sourcesAccepted2026-10-14registry-and-sources
ADR-006Private Packagist is not a backend; migration is a one-shot import CLI on the public APIAccepted2026-10-15registry-and-sources
ADR-007Sources at organization and project level with project precedence, digest dedup and live subscriptionAccepted2026-10-15registry-and-sources
ADR-008Restricted public proxies, artifacts persisted by digest, upstream removals kept for one yearAccepted2026-10-15registry-and-sources
ADR-009Identity and access through OIDC single sign-on, grants to SSO groups or emails, configurable rolesAccepted2026-10-15identity-and-sessions
ADR-010Token kinds pat, svc and cst; PATs span projects, service tokens are CI-only and bound to one projectAccepted2026-10-15secrets-and-tokens
ADR-011Database sessions, bounded revocation, re-authentication before token creationAccepted2026-10-15identity-and-sessions
ADR-012Secrets and cryptography with a deployment master key, HKDF, record-bound AAD and a versioned pepperAccepted2026-10-15secrets-and-tokens
ADR-013Outbound fetch policy with denied private ranges and a Docker-only host allowlistAccepted2026-10-15platform-ports-and-adapters
ADR-014Audit log in the application database with hash chaining; export in P1Accepted2026-10-15identity-and-sessions
ADR-015Every UI action in the public API; read-only MCP in the MVP; access as code through a Terraform providerAccepted2026-10-15plugin-api-and-composition
ADR-016Project in the URL path, one Composer http-basic entry per hostAccepted2026-10-15identity-and-sessions
ADR-017GitHub integration through a GitHub App on selected repositories, webhooks, and Git smart HTTPAccepted2026-10-15registry-and-sources
ADR-018Catalogue dates and licence-freeze foundations in the first schemaAccepted2026-10-15registry-and-sources
ADR-019Backup and recovery of application state and catalogue metadataAccepted2026-10-15deployment-and-runtimes
ADR-020EU jurisdiction from the first deployment; residency controls in P1Accepted2026-10-14deployment-and-runtimes
ADR-022Rate limiting and abuse protection deferred to P1 with recorded starting valuesAccepted2026-10-15deployment-and-runtimes
ADR-023Repository strategy, versioning and release processAccepted2026-10-15release-and-versioning
ADR-024Observability through an OTLP-first port; vendors are plugins only where OTLP is not enoughAccepted2026-10-15platform-ports-and-adapters
ADR-025Plugins run in-process; an execution boundary for untrusted plugins is Nice to haveAccepted2026-10-15plugin-api-and-composition
ADR-026Contributor terms are the Developer Certificate of Origin, enforced in CI, in place of a CLAAccepted (supersedes the ADR-001 CLA bullet)2026-10-16licensing-and-contribution-terms

Proposing and superseding a decision​

A decision is proposed in a pull request that adds a section ## ADR-0NN: <title> with the next free number to the scope file it belongs to, with Status: Proposed, <date>, and a row in the index above. Review happens in the pull request; on merge the status becomes Accepted. A decision is never rewritten after acceptance: a later record supersedes it, the superseded record gets a note naming its successor in its status line, and the successor states what it replaces.

Numbering​

ADR numbers are never reused or renumbered, so the sequence has gaps.