TunnelVision

Architecture Decision Records

Each ADR captures one decision: its context, the choice, and the consequences. They are immutable once accepted — to change a decision, add a new ADR that supersedes the old one (note it in both).

Index

# Decision Status
0001 Use NEPacketTunnelProvider (NetworkExtension) for on-device capture Accepted
0002 Use GRDB/SQLite for history instead of SwiftData/Core Data Accepted
0003 Never bypass third-party SSL pinning Accepted
0004 Live IPC via mmap ring buffer + Darwin signal Accepted
0005 Userspace TCP termination for TLS inspection Accepted
0006 Pass UDP/QUIC through without termination Accepted
0007 Decrypted content: its own switch, its own shorter retention, its own deletion Accepted
0008 TR-03161 audit workflow: core scope, published per finished increment, attribution by controlled session + baseline Accepted; publication rule superseded by 0009
0009 Development happens directly in the public repository; the private one is only a notebook Accepted

Template

# NNNN — Title

- Status: Proposed | Accepted | Superseded by NNNN
- Date: YYYY-MM-DD

## Context
What forces are at play; what problem needs deciding.

## Decision
The choice, stated plainly.

## Consequences
What becomes easier, what becomes harder, what we accept.

## Alternatives considered
Each option and why it lost.