feat(ios): report the ABI-mismatch reload skip to telemetry - #21
Conversation
Devices that skip the cold-start reload because the installed patch was built for a different engine ABI sat on baseline invisibly. The skip now posts a client-error report (kind: incompatible_reload, stored vs live fingerprints) — fire-and-forget so the boot path never waits on telemetry, and latched once per process: init() can legally run more than once (re-init on resume) and each run re-enters the reload, so without the latch every re-init would re-POST the same stranding event. No server change: the endpoint already stores structured kind/reason reports. Suite 134/134.
🔴 CriticalNone. The change is additive and failure-soft: the new 🟠 Medium
🟡 Low
🟢 Positives
|
The latch was set before the fire-and-forget POST resolved, so a device that booted offline lost the stranding report for the whole process. Extracted into debugReportIncompatibleReload: latch set optimistically (no duplicate in-flight posts), cleared again when the POST never completed an HTTP round trip, so a later re-init retries — mirroring the sibling baseline-mismatch dedup's delivered-only recording. A bool (not a pair-keyed set) stays sufficient: an engine ABI cannot change within a running process. 3 tests against a loopback capture server: payload shape (kind + stored/live fingerprints), delivered-latch, offline-retry. Suite 137/137.
Triage round 1
|
🔴 CriticalNone. The change is additive and failure-soft. The new I also confirmed the two Mediums from the prior automated review are genuinely fixed in
🟠 Medium
🟡 Low
🟢 Positives
|
_reportIncompatibleReload holds the latch+POST logic and is what the reload path calls; debugReportIncompatibleReload is now only the test seam over it — matching the sibling reporter's structure. Suite 137/137.
|
Round 2 triage: 🟠 reload→report wiring test — TABLED as the reviewer suggests (tracked into the follow-up bundle; the gate decision and the report payload/latch are each covered, the untested residue is the argument plumbing between two tested seams). 🟡 naming — FIXED in |
|
Reviewed the current head ( 🔴 CriticalNone. The change is additive and failure-soft. The new 🟠 MediumNone that block. The one open item — the 🟡 Low
🟢 Positives
|
Follow-up tabled on #19, approved for this batch.
Devices that skip the cold-start reload because the installed patch was built for a different engine ABI sat on baseline invisibly. The skip now posts a client-error report —
kind: incompatible_reload, stored vs live fingerprints — so fleet-wide 'engine changed under installed patches' is observable.unawaited): the boot path never waits on telemetry; the helper swallows every error.init()can legally run more than once (re-init on resume) and each run re-enters the reload — without the latch every re-init would re-POST the same stranding event. (Adversarial-review finding; the original comment claimed per-launch bounding that re-inits would have broken.)_reportIncompatibleBaselinegained an optionalkindparam defaulting to the existing value, all current callers unchanged.Suite 134/134.