已完成这一轮“跨表全量列对比（model vs 旧库补列逻辑）”，并做了可执行验证。

我做了什么：

- 对比了 `model.Node` / `model.Tunnel` 字段与 `prepareSQLiteLegacyColumns` 的补列清单。
- 结论：
  - `Node` 目前应补的历史增量列：`server_ip_v4`, `server_ip_v6`, `extra_ips`, `tcp_listen_addr`, `udp_listen_addr`, `inx`, `is_remote`, `remote_url`, `remote_token`, `remote_config`
  - `Tunnel` 应补：`inx`, `ip_preference`
- 我已把这个对齐结果固化为回归测试，新增了一个“更老版本库”场景验证：
  - 新测试：`TestOpenMigratesVeryLegacyNodeAndTunnelColumns`
  - 文件：`go-backend/tests/contract/migration_contract_test.go`
  - 该测试从极简旧表结构启动，验证上述所有列都会被自动补齐。
- 测试结果：通过
  - `go test ./tests/contract -run "TestOpenMigratesLegacyNodeDualStackColumns|TestOpenMigratesVeryLegacyNodeAndTunnelColumns"`

最终结论（本轮排查范围内）：

- **Node/Tunnel 这条旧库升级链路已对齐且有测试兜底**。
- 你这类 “no such column” 的同类风险，针对这两个核心表已经基本封住。