@@ -11,6 +11,66 @@ behaviours between releases.
1111
1212## [ Unreleased]
1313
14+ ## [ 1.3.0] — 2026-05-19
15+
16+ Minor release. Two real-environment audit findings on a Meituan
17+ corp network drove a vendor-lookup upgrade and a LAN-host detail
18+ modal enrichment; one smaller UX fix rides along.
19+
20+ ### Added
21+ - ** Full IEEE OUI registry (~ 250 entries → 39,444).** The bundled
22+ ` *_ouis.json ` data files were a hand-curated subset; replaced
23+ with the full IEEE Registration Authority MA-L (24-bit) registry.
24+ Both ` bluetooth_ouis.json ` (used by BLE and the LAN host list)
25+ and ` wifi_ouis.json ` (used by Wi-Fi BSSID resolution) now ship
26+ the same canonical 39 k-entry dataset. On corp networks, gateway
27+ / enterprise-switch OUIs (Cisco, Aruba, H3C, HPE, Huawei, etc.)
28+ now resolve to vendor names instead of ` (unknown) ` . File size:
29+ ~ 20 KB → ~ 1.5 MB each; in-memory heap +~ 5 MB; lookup speed O(1)
30+ unchanged.
31+ - ** ` scripts/refresh_ouis.py ` .** New CLI that pulls the canonical
32+ CSV from ` https://standards-oui.ieee.org/oui/oui.csv ` , parses +
33+ dedupes, and rewrites both data files. Run before each release
34+ to pick up newly-registered OUIs. IEEE attribution added in
35+ ` _meta ` and README.
36+ - ** ` LANHost.last_rtt_ms ` and ` LANHost.last_reachable_at ` .** New
37+ fields populated from each sweep's per-host ICMP results.
38+ ` last_seen ` (ARP cache observation) and ` last_reachable_at `
39+ (most recent successful ICMP echo) are tracked separately so a
40+ host that's in ARP but offline shows the freshness gap. Fields
41+ are preserved across silent ticks — a temporarily-quiet host's
42+ last-known RTT stays visible in the modal.
43+ - ** LANDetailScreen Network section: Latency + Reachable rows.**
44+ ` Latency X.X ms ` (omitted when last_rtt_ms is None);
45+ ` Reachable this sweep | Xs ago | never ` (always rendered).
46+ Parsed from the new ` _ping_one ` return tuple
47+ ` (reachable, rtt_ms | None) ` .
48+ - ** LANDetailScreen Bonjour services empty-state placeholder.**
49+ When the host has no Bonjour services, the section now renders
50+ ` (no Bonjour services) ` instead of being hidden entirely —
51+ users had no signal that the cross-reference channel was
52+ checked.
53+
54+ ### Changed
55+ - ** ` _ping_one ` and ` _sweep ` return shape.** ` _ping_one ` now
56+ returns ` tuple[bool, float | None] ` parsed from ` time=X.XXX ms `
57+ in macOS ping stdout. ` _sweep ` returns
58+ ` dict[str, tuple[bool, float | None]] ` so the merge step can
59+ populate per-host RTT and reachability without re-running probes.
60+
61+ ### Fixed
62+ - ** Duplicate ZH labels in LAN diagnostics.** `子网 子网
63+ 11.10.158.0/24` and ` 上次扫描 上次扫描 38s` doubled because both
64+ the row prefix and the value template translated to the same ZH
65+ word. Dropped the lowercase prefix from the value templates;
66+ the row label alone identifies the row.
67+ - ** Title bar showed ` 扫描间隔 7s ` on every view.** That's the
68+ Wi-Fi CoreWLAN scan interval — but on the LAN view the user
69+ could reasonably think LAN swept at 7s, when it actually sweeps
70+ at 60s. Made the cadence view-specific: ` scan 7s ` on wifi,
71+ ` sweep 60s ` on lan, dropped entirely on BLE / Bonjour
72+ (push-driven pollers).
73+
1474## [ 1.2.0] — 2026-05-19
1575
1676Minor release. Headline: a new fourth panel that answers "who's on
0 commit comments