D-113 (PROPOSED): is OPNsense the right edge platform? -- and a confound in D-112
Operator asked, after a five-bug day, whether something is better suited than OPNsense for
the simulated edges. Written up with alternatives; NOT RULED.

Honest cost accounting: of the five bugs, TWO (DOCFIX-188 memory_unit, DOCFIX-190 ACPI) were
libvirt module bugs that would have hit any guest and whose fixes now protect every VR1 VM --
not OPNsense's fault. The other three (DOCFIX-191 no sshd/key, DOCFIX-192 no console,
DOCFIX-193 no DHCP) share ONE root cause: hand-authoring the appliance's internal, GUI-owned
config.xml. 2026-07-13 adds a fourth of the same kind -- a full-config push drops ~667
migration-populated elements including the only two firewall pass rules, and works ONLY
because OPNsense regenerates them on boot. We depend on an undocumented self-heal of an
internal format. That, not the boot bugs, is the ongoing cost.

THE CONFOUND, and the reason this is worth ruling rather than waving through: D-112 adopted
option (c) with the explicit rationale "C since it is the way people automate opnsense" --
i.e. the REST API (opn-cli, the Ansible collection). What we actually BUILT is config.xml
templating delivered over scp. That satisfies (c)'s letter (provision over the network, post
boot) but NOT the rationale it was ruled on. Every OPNsense-specific bug we are charging
against the platform is an artifact of hand-authoring XML -- precisely what the API exists to
avoid. So the fair comparison is not OPNsense vs VyOS; it is:

  (a1) OPNsense + config.xml templating  -- status quo; cost COMPOUNDS per feature
  (a2) OPNsense + REST API               -- what D-112's rationale actually called for
  (b)  VyOS                              -- blank-sheet best; discards a working edge
  (c)  plain Linux (nftables/Kea/FRR + cloud-init) -- max fidelity to our own tooling
  (d)  pfSense                           -- REJECT, same config-format lineage

Recommendation (operator rules): stay on OPNsense, and the real choice is a1 vs a2 -- I lean
a2. The hard part is done and measured working, and edges 2/3 reuse the module, so the cost
paid was one-time. But (a1) compounds, and (a2) is the honest reading of D-112's own ruling.

Rule BEFORE Stage 3: it builds two more edges from this module, so ruling later means
migrating three edges instead of one.

Revert: git revert this commit (docs only; nothing built or migrated).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B6Fzre1CxCY8tzwFCudu57
1 parent 792490d commit 00951971bd8318a35709c761c16ef77fc0b625ac
@JANeumatrix JANeumatrix authored 21 hours ago
Showing 2 changed files
View
docs/design-decisions.md
View
docs/session-ledger.md