Fixes Tachyon startup abort when migrated config has no dns_server or
bootstrap_dns_server (forkop/podkop did not require these fields).
Changes:
- migration.uc: add ensure_dns_server_defaults migration that injects
77.88.8.8 as fallback when either dns list is empty
- default config: pre-mark orphan_section_interface_cleanup and
ensure_dns_server_defaults as applied so fresh installs skip them
- tests/config_migration.sh: regression tests for both missing-DNS cases
and stable named-marker assertion for the new migration
- tests/package_contract.sh: enforce that default config ships both new
migration IDs in applied_migrations
- tests/docker_e2e_test.sh: also install luci-app-tachyon and verify
menu.d + acl.d files are present after install (LuCI menu bug class)
- i1–i5/j1–j3: классический hex конвертируется в теги <b 0x…>;
userspace WireGuard extended/lx молча игнорирует голый hex,
handshake не завершался (#39#41#42)
- j1/j2/j3/itime эмитятся только для extended ≤2.6.0: в 2.6.1+
поля удалены из схемы, sing-box падает на unknown fields
- j1–j3 больше не ломаются uci_bin_to_hex
- h1–h4: диапазоны «min-max» на обеих ветках
- MTProto: секрет канонизируется в ee-hex из любой формы
(hex/base64), валидатор даёт понятную ошибку вместо
FATAL decode psk (#23)
- XHTTP v2: парсинг и экспорт ключей подписок
- валидатор: warp/masque/openvpn/snell/mieru/sudoku — только extended
- тесты: stat→ucode (busybox), раннеры исключены из E2E,
новые server_mtproto.sh и awg_variant_schema.sh