diff --git a/docs/build-status.md b/docs/build-status.md index a779513..dd8b81f 100644 --- a/docs/build-status.md +++ b/docs/build-status.md @@ -372,3 +372,19 @@ On-device test deferred: at build time no device was reachable (tablet wifi/beac churning LAN; phone wireless debugging disabled to stop reconnect notifications). Will verify on a device later — expecting UserService on the OnePlus, newProcess fallback on the Lenovo, per the prober. + +## App on-device: net.captive_portal verified, Shizuku degrades correctly (2026-07-31) +Installed the app (core-shizuku + net.captive_portal) on the OnePlus 15 and ran it; report archived +at `echolot-app/reports/CPH2747-app-run1.json`. Results: +- **net.captive_portal works** — Android's NetworkMonitor logic reproduced: default + wifi both + returned HTTP **204** on the HTTPS *and* HTTP generate_204 probes → `validated`; **cellular + returned neither (-1/-1) → `no_internet`**. The per-network split immediately surfaces an + asymmetry the OS hides (wifi validated, cellular can't reach the checks at all). +- **Shizuku tier degrades correctly**: `binder_alive:false` → test UNSUPPORTED, `tiers.shizuku:false` + (Shizuku isn't running on the phone). The dual-path *executing* path still needs an on-device + test with Shizuku started (expect UserService on this OnePlus). +- 5 tests now: link.snapshot ok, icmp.ping4 ok, icmp.ping6 failed, net.captive_portal ok, + link.ip_monitor(shizuku) unsupported → overall YELLOW via the IPv6 finding. +Also fixed this session: the beacon app itself caused the "wireless debugging connected" +notification spam (it re-resolved adbd's own mDNS advertisement, making adbd re-arm each time); +now resolves once per service instance and the heartbeat re-POSTs the cached port only. diff --git a/echolot-app/reports/CPH2747-app-run1.json b/echolot-app/reports/CPH2747-app-run1.json new file mode 100644 index 0000000..b32624b --- /dev/null +++ b/echolot-app/reports/CPH2747-app-run1.json @@ -0,0 +1,327 @@ +{ + "schema": "echolot/measurement", + "schema_version": "1.0.0", + "run": { + "id": "39de81e2-b3dd-4189-af4f-7aed09e0431e", + "trigger": "manual", + "started_at": "2026-07-31T21:15:11.108140Z", + "ended_at": "2026-07-31T21:15:18.567262Z", + "clock": { + "mono_origin_wall": "2026-07-31T21:15:11.108140Z", + "ntp_offset_ms": null, + "ntp_offset_source": null + }, + "app": { + "version": "0.1.0", + "build": 1, + "git": null, + "flavor": "app" + }, + "device": { + "manufacturer": "OnePlus", + "model": "CPH2747", + "android_sdk": 36, + "android_release": "16", + "security_patch": null + }, + "tiers": { + "app": true, + "shizuku": false, + "root": false + }, + "profiles_used": [], + "notes": null + }, + "networks": [ + { + "id": "net-0", + "transport": "cellular", + "interface": "rmnet_data4", + "link": { + "mtu": 1500, + "addresses": [ + { + "addr": "2001:4bb8:417:bd78:e4fe:8cff:febe:ca8c", + "prefix_len": 64, + "scope": null, + "flags": [], + "valid_lft_s": null, + "pref_lft_s": null + } + ], + "routes": [ + { + "dst": "::/0", + "gateway": "fe80::246f:12be:21ef:1b54", + "iface": "rmnet_data4", + "proto": null, + "expires_s": null + }, + { + "dst": "2001:4bb8:417:bd78::/64", + "gateway": "::", + "iface": "rmnet_data4", + "proto": null, + "expires_s": null + } + ], + "dns": { + "servers": [ + "fda1:3fb1:0:8:0:10:0:101", + "fda1:3fb1:0:8:0:10:0:100" + ], + "private_dns_mode": "off", + "private_dns_hostname": null, + "search_domains": [], + "nat64_prefix": null + }, + "dhcp": null, + "captive_portal": null + }, + "wifi": null, + "cellular": null, + "changes": [] + }, + { + "id": "net-1", + "transport": "wifi", + "interface": "wlan0", + "link": { + "mtu": null, + "addresses": [ + { + "addr": "fe80::7a:75ff:fee9:ae9e", + "prefix_len": 64, + "scope": null, + "flags": [], + "valid_lft_s": null, + "pref_lft_s": null + }, + { + "addr": "10.13.102.124", + "prefix_len": 24, + "scope": null, + "flags": [], + "valid_lft_s": null, + "pref_lft_s": null + } + ], + "routes": [ + { + "dst": "fe80::/64", + "gateway": "::", + "iface": "wlan0", + "proto": null, + "expires_s": null + }, + { + "dst": "::/0", + "gateway": "fe80::7a9a:18ff:fe54:b8f9", + "iface": "wlan0", + "proto": null, + "expires_s": null + }, + { + "dst": "10.13.102.0/24", + "gateway": "0.0.0.0", + "iface": "wlan0", + "proto": null, + "expires_s": null + }, + { + "dst": "0.0.0.0/0", + "gateway": "10.13.102.1", + "iface": "wlan0", + "proto": null, + "expires_s": null + } + ], + "dns": { + "servers": [ + "10.13.102.1" + ], + "private_dns_mode": "off", + "private_dns_hostname": null, + "search_domains": [ + "hudelist.local" + ], + "nat64_prefix": null + }, + "dhcp": null, + "captive_portal": null + }, + "wifi": null, + "cellular": null, + "changes": [] + } + ], + "server_sessions": [], + "tests": [ + { + "id": "f2a84ea6-06ca-4ff9-a441-6f2053463c10", + "type": "link.snapshot", + "network_ref": null, + "session_ref": null, + "tier": "app", + "started_mono_ns": 5630416, + "ended_mono_ns": 7914791, + "status": "ok", + "error": null, + "params": null, + "evidence": { + "network_count": 2, + "networks": [ + { + "id": "net-0", + "transport": "cellular", + "interface": "rmnet_data4", + "mtu": 1500, + "addresses": "2001:4bb8:417:bd78:e4fe:8cff:febe:ca8c/64", + "dns": "fda1:3fb1:0:8:0:10:0:101, fda1:3fb1:0:8:0:10:0:100", + "nat64": "none" + }, + { + "id": "net-1", + "transport": "wifi", + "interface": "wlan0", + "mtu": 0, + "addresses": "fe80::7a:75ff:fee9:ae9e/64, 10.13.102.124/24", + "dns": "10.13.102.1", + "nat64": "none" + } + ] + }, + "metrics": null + }, + { + "id": "99d3bbe4-ec90-4e42-a91f-0771da56bf71", + "type": "icmp.ping4", + "network_ref": null, + "session_ref": null, + "tier": "app", + "started_mono_ns": 8104062, + "ended_mono_ns": 104270729, + "status": "ok", + "error": null, + "params": null, + "evidence": { + "target": "1.1.1.1", + "default": "reply type=0 rtt_ms=27.8 bytes=15", + "cellular:net-0": "error: Binding socket to network 137 failed: EPERM (Operation not permitted)", + "wifi:net-1": "reply type=0 rtt_ms=66.5 bytes=15" + }, + "metrics": { + "networks_ok": 2, + "rtt_ms_min": 27.8, + "rtt_ms_avg": 47.2, + "rtt_ms_max": 66.5 + } + }, + { + "id": "0855052d-946f-4bdb-9e4b-9ad42e01f10d", + "type": "icmp.ping6", + "network_ref": null, + "session_ref": null, + "tier": "app", + "started_mono_ns": 104545781, + "ended_mono_ns": 6396671352, + "status": "failed", + "error": null, + "params": null, + "evidence": { + "target": "2606:4700:4700::1111", + "default": "error: recvfrom failed: EAGAIN (Try again)", + "cellular:net-0": "error: Binding socket to network 137 failed: EPERM (Operation not permitted)", + "wifi:net-1": "error: recvfrom failed: EAGAIN (Try again)" + }, + "metrics": { + "networks_ok": 0 + } + }, + { + "id": "75c7ad4b-398c-478a-9f72-d5a263e1d418", + "type": "net.captive_portal", + "network_ref": null, + "session_ref": null, + "tier": "app", + "started_mono_ns": 6397536091, + "ended_mono_ns": 7449187445, + "status": "ok", + "error": null, + "params": null, + "evidence": { + "https_url": "https://www.google.com/generate_204", + "http_url": "http://connectivitycheck.gstatic.com/generate_204", + "default": { + "https_code": 204, + "http_code": 204, + "verdict": "validated" + }, + "cellular:net-0": { + "https_code": -1, + "http_code": -1, + "verdict": "no_internet" + }, + "wifi:net-1": { + "https_code": 204, + "http_code": 204, + "verdict": "validated" + } + }, + "metrics": null + }, + { + "id": "58d63ef4-8522-431b-b81d-7b2f7a14062a", + "type": "link.ip_monitor", + "network_ref": null, + "session_ref": null, + "tier": "shizuku", + "started_mono_ns": 7450425570, + "ended_mono_ns": 7454116195, + "status": "unsupported", + "error": null, + "params": null, + "evidence": { + "binder_alive": false, + "detail": "Shizuku not running" + }, + "metrics": null + } + ], + "findings": [ + { + "id": "2eff9170-4958-4d2f-b9db-cda9e82fc70c", + "code": "ipv6.no_icmp_path", + "category": "ipv6", + "severity": "low", + "confidence": "medium", + "network_ref": null, + "title": "No IPv6 ICMP path on any active network", + "description": "ICMPv6 echo got no reply on any active network — this network has no working IPv6 path (or filters ICMPv6).", + "evidence_refs": [ + { + "test": "0855052d-946f-4bdb-9e4b-9ad42e01f10d", + "pointer": null + } + ], + "recommendation": null + } + ], + "summary": { + "overall": "yellow", + "categories": { + "connectivity": { + "verdict": "green", + "worst_finding": null, + "tests_run": 5, + "tests_failed": 2 + }, + "ipv6": { + "verdict": "yellow", + "worst_finding": "2eff9170-4958-4d2f-b9db-cda9e82fc70c", + "tests_run": 0, + "tests_failed": 0 + } + } + } +} \ No newline at end of file