Records of significant architectural decisions made during rustbgpd development. Each record captures the context, decision, and consequences so future contributors understand why, not just what.
| ADR | Title | Status | Date |
|---|---|---|---|
| 0001 | Typed + raw hybrid model for path attributes | Accepted | 2026-02-27 |
| 0002 | Inherent methods, not traits, for codec API | Accepted | 2026-02-27 |
| 0003 | NOTIFICATION subcodes as constants, not enums | Accepted | 2026-02-27 |
| 0004 | Proptest for property-based testing | Accepted | 2026-02-27 |
| 0005 | Pure state machine FSM with no Result return | Accepted | 2026-02-27 |
| 0006 | validate_open returns Result<NegotiatedSession, NotificationMessage> | Accepted | 2026-02-27 |
| 0007 | Explicit Prometheus registry, not global default | Accepted | 2026-02-27 |
| 0008 | Single tokio task per peer for M0 | Accepted | 2026-02-27 |
| 0009 | Iterative action loop to avoid async recursion | Accepted | 2026-02-27 |
| 0010 | Minimal TCP metrics server, no HTTP framework | Accepted | 2026-02-27 |
| 0011 | Unknown variant for NOTIFICATION error codes | Accepted | 2026-02-27 |
| 0012 | Separate structural decode from semantic validation for UPDATEs | Accepted | 2026-02-27 |
| 0013 | Single-task RIB manager with channel-based ownership | Accepted | 2026-02-27 |
| 0014 | Best-path comparison as standalone function with deterministic MED | Accepted | 2026-02-27 |
| 0015 | Adj-RIB-Out inside RibManager with per-peer outbound channels | Accepted | 2026-02-27 |
| 0016 | socket2 for TCP MD5 and GTSM socket options | Accepted | 2026-02-27 |
| 0017 | PeerManager — channel-based single-task ownership | Accepted | 2026-02-27 |
| 0018 | Broadcast channel for WatchRoutes streaming | Accepted | 2026-02-27 |
| 0019 | Inbound TCP listener for passive peering | Accepted | 2026-02-27 |
| 0020 | GlobalService, ControlService, and coordinated shutdown | Accepted | 2026-02-27 |
| 0021 | TCP collision detection via PeerManager coordination | Accepted | 2026-02-28 |
| 0022 | gRPC server supervision — unexpected exit triggers shutdown | Accepted | 2026-02-28 |
| 0023 | Prefix enum and AFI-agnostic RIB for MP-BGP | Accepted | 2026-02-28 |
| 0024 | Graceful Restart — Receiving Speaker (RFC 4724) | Accepted | 2026-03-01 |
| 0025 | Extended Communities (RFC 4360) | Accepted | 2026-03-01 |
| 0026 | Extended Community Policy Matching | Accepted | 2026-03-01 |
| 0027 | Route Refresh (RFC 2918) | Accepted | 2026-03-02 |
| 0028 | Standard Community Policy Matching (RFC 1997) | Accepted | 2026-03-02 |
| 0029 | Route Reflector (RFC 4456) | Accepted | 2026-03-02 |
| 0030 | Policy Actions and AS_PATH Regex | Accepted | 2026-03-02 |
| 0031 | Large Communities (RFC 8092) | Accepted | 2026-03-02 |
| 0032 | Extended Messages (RFC 8654) | Accepted | 2026-03-02 |
| 0033 | Add-Path (RFC 7911) | Accepted | 2026-03-02 |
| 0034 | RPKI Origin Validation (RFC 6811 + RFC 8210) | Accepted | 2026-03-03 |
| 0035 | FlowSpec (RFC 8955 / RFC 8956) | Accepted | 2026-03-03 |
| 0036 | Policy Chaining + Named Policies | Accepted | 2026-03-04 |
| 0037 | Extended Next Hop Encoding (RFC 8950) | Accepted | 2026-03-04 |
| 0038 | Enhanced Route Refresh (RFC 7313) | Accepted | 2026-03-04 |
| 0039 | Transparent Route Server Mode | Accepted | 2026-03-04 |
| 0040 | Graceful Restart — Minimal Restarting Speaker Mode | Accepted | 2026-03-04 |
| 0041 | BMP Exporter (RFC 7854) | Accepted | 2026-03-04 |
| 0042 | Long-Lived Graceful Restart (RFC 9494) | Accepted | 2026-03-05 |
| 0043 | Config Persistence and SIGHUP Reload | Accepted | 2026-03-05 |
| 0044 | MRT Dump Export (RFC 6396) | Accepted | 2026-03-05 |
| 0045 | Private AS Removal | Accepted | 2026-03-05 |
| 0046 | Notification GR (RFC 8538) | Accepted | 2026-03-05 |
| 0047 | gRPC Security Hardening | Accepted | 2026-03-06 |
| 0048 | RIB Memory Optimizations | Accepted | 2026-03-08 |
New ADRs should follow this format:
# ADR-NNNN: Title
**Status:** Proposed | Accepted | Deprecated | Superseded by ADR-XXXX
**Date:** YYYY-MM-DD
## Context
What is the issue or question being addressed?
## Decision
What was decided?
## Consequences
What are the results — positive, negative, and neutral?