| semantic-links |
|
|---|
| ADR | Date | Title | Short Description |
|---|---|---|---|
| 20240227164834 | 2024-02-27 | Use plural for modules containing collections | Module names should use plural when they contain multiple types with the same responsibility (e.g. requests/, responses/). |
| 20260420200013 | 2026-04-20 | Adopt a custom, GitHub-Copilot-aligned agent framework | Use AGENTS.md, Agent Skills, and Custom Agent profiles instead of third-party agent frameworks. |
| 20260429000000 | 2026-04-29 | Keep Database as an aggregate supertrait |
Split the 18-method monolithic Database trait into four narrow context traits (SchemaMigrator, TorrentMetricsStore, WhitelistStore, AuthKeyStore) while keeping Database as an empty aggregate supertrait with a blanket impl. |
| 20260512102000 | 2026-05-12 | Define tracker-client peer ID convention | Adopt -RC3000- Azureus-style defaults for tracker-client, use a once-per-process randomized production suffix, and keep deterministic RC test fixtures without cross-package constant coupling. |
| 20260519000000 | 2026-05-19 | Define the global CLI output contract | All first-party binaries use JSON on stdout (result data) and stderr (NDJSON diagnostics/progress). No plain text. TTY refusal for stdout-result-data commands. Exit codes 0/1/2. Prescriptive; migration is progressive. |
| 20260527175600 | 2026-05-27 | Keep protocol and domain types decoupled | Keep protocol-local and domain-local value types (for example NumberOfBytes) and map at boundaries so HTTP/UDP wire evolution does not force domain-wide refactors and domain changes do not force protocol redesign. |
| 20260603000000 | 2026-06-03 | Keep unit tests inside the container build process | Unit tests must run inside the Containerfile build (not on the GHA host) because only the container build environment proves the binary works on the actual target infrastructure (Debian trixie, distroless runtime, specific glibc). |
| 20260617093046 | 2026-06-17 | Reject wildcard IPs as invalid external_ip values |
Reject 0.0.0.0/:: in external_ip config at startup, change default to None. Fail fast on invalid config. |
| 20260620000000 | 2026-06-20 | Add ipv6_v6only config option for separate sockets |
Add ipv6_v6only boolean flag to UdpTracker and HttpTracker configs, defaulting to false (dual-stack), so operators can opt into separate IPv4/IPv6 sockets. |
| 20260623200526 | 2026-06-23 | Adopt a contract-first architecture for the REST API | Structure the REST API into four layers: protocol contract, application/use-case, runtime adapter, and transport adapter. Enables a future tracker-agnostic REST API standard. |
| 20260629000000 | 2026-06-29 | Adopt independent package versioning | All workspace packages version independently. Path dependencies guarantee compatibility, so linked versions are unnecessary. Enables per-package publishing and aligns with EPIC #1669 extraction goals. |
| 20260716000000 | 2026-07-16 | Accept only IP addresses in HTTP announce ip param |
The HTTP announce ip GET parameter accepts only valid IpAddr values; DNS names are silently ignored. Matches de-facto standard of opentracker, chihaya, and all other known trackers. |
| 20260721000000 | 2026-07-21 | Make network configuration per tracker instance | Schema v3 uses an optional network block on each tracker and removes global core.net and flat tracker networking fields without fallback. |
| 20260721100000 | 2026-07-21 | Use newtypes for domain-constrained configuration field types | Configuration fields whose value space is smaller than the raw primitive (e.g. scheme-constrained URLs) must use typed newtypes that encode the invariant in the type, validated once at deserialization and never re-checked in consumers. |
| 20260723184019 | 2026-07-23 | Separate configuration value invariants from consistency validation | Validate a single constrained value with a typed newtype; reserve Validator for multi-option consistency and bootstrap checks for environment-dependent validity. |
| 20260727000000 | 2026-07-27 | Events are objective facts | Event variants must describe what happened — a neutral, observable fact. Policy and mode decisions belong in the consumer or the enforcement point, never in the event definition. |
| 20260727180000 | 2026-07-27 | Shared services across tracker instances | Peer repository and ban service are shared across all listener instances. Per-listener settings that affect shared services must be global to avoid inconsistency. |
| 20260728115400 | 2026-07-28 | Define Registar as the runtime service registry | Registar is the authoritative internal registry of started local services, their final bindings, and stable roles; health checks are one consumer of that metadata. |
An ADR merged into develop or main is accepted. The PR review process is the acceptance
gate — no explicit - Status: Accepted or - Status: Proposed header is needed or written.
A - Status: header appears in an ADR file only for special terminal states, for example:
- Status: Superseded by [ADR link]— this decision has been replaced by a newer ADR.
Additional states (e.g. Deprecated) may be introduced as needed.