@@ -27,6 +27,32 @@ helpers for portable modem identity, display naming, ModemManager enums, USB-net
2727classification, capability selection, and shadow-result comparison; these helpers perform
2828no discovery or transport and leave CeraUI integration to a separate cutover.
2929
30+ Sierra groundwork uses exact, evidence-tiered USB model rows for EM74xx, EM75xx, and
31+ EM919x-class application PIDs across Sierra, HP, and Dell branding. These rows provide a
32+ family label only; interface/driver evidence still decides whether a device is MM-managed,
33+ and unknown Sierra PIDs remain unknown. The FCC classifier table separately mirrors the
34+ complete ModemManager 1.24.2 available-tier mapping and does not install or activate links.
35+ RB-18 in [ ` docs/BENCH.md ` ] ( docs/BENCH.md ) records the real identity/composition capture gate;
36+ the 2026-08-25 attempt is a named ` device-not-present ` skip with no fabricated bundle.
37+
38+ The same table now also carries exact Telit (` 1bc7 ` ) and u-blox (` 1546 ` ) module rows plus
39+ one NETGEAR (` 0846 ` ) row for the LB1120, which is labelled a ` router-webui ` family — a
40+ positive claim whose absence elsewhere means nothing, and which still decides no device
41+ class. NETGEAR's vendor id is deliberately NOT treated as cellular evidence: its USB ID
42+ Repository block is mostly Wi-Fi and Ethernet adapters, so a vendor-keyed rule there would
43+ report a Wi-Fi dongle as an uplink. No Telit, u-blox, or NETGEAR provider exists.
44+ [ ` docs/VENDOR-QUIRKS.md ` ] ( docs/VENDOR-QUIRKS.md ) is the sourced per-vendor edge-case
45+ reading list behind those rows — every claim carries a pinned citation, no claim sits above
46+ ` implemented ` on the five-state support ladder, and nothing in it is on a write path.
47+
48+ [ ` docs/COMPAT-MATRIX.md ` ] ( docs/COMPAT-MATRIX.md ) is the one tracked support matrix built on
49+ those rows: 22 hardware rows against 18 operations, from first enumeration through a
50+ sustained bonded uplink, with a hardware-free versus hardware-required split that says which
51+ claims a green CI run establishes and which ones only a bench device can. Every cell is a
52+ member of the same five-state ladder and there is no second status vocabulary, so no
53+ combination is ` certified ` and none may be described as supported. Hardware evidence lives
54+ in [ ` docs/BENCH.md ` ] ( docs/BENCH.md ) ; the matrix links to it and restates none of it.
55+
3056The ModemManager operation surface also exposes runtime USB-composition capability. Known
3157vendors are queried with exact reviewed READ/TEST forms, targets come from the device's own
3258enumeration only when it includes a return path, and writes retain the shared admission,
@@ -38,12 +64,12 @@ data before `ERROR`. Band certification remains catalog-gated and unchanged.
3864
3965## Versioning at a glance
4066
41- ONE unified ** SemVer** tag ` vX.Y.Z ` releases ** both ** artifacts together: ` v1.1.0 ` publishes
42- ` @ceralive/modem-control@1.1.0 ` to npm ** and** the ` .deb ` artifact set in the same release.
43- This repo deliberately does ** not** use the CeraLive CalVer scheme. New upstream-source
44- rebuilds use per-source ` <upstream>-<rev>~ceralive.N ` counters; unchanged sources retain their
45- previous version and exact bytes. Legacy published releases keep their tag-shaped suffixes.
46- Full contract:
67+ ONE unified ** SemVer** tag ` vX.Y.Z ` requires the root, control, and CLI ` package.json `
68+ versions to all be ` X.Y.Z ` ; it publishes ` @ceralive/modem-control@X.Y.Z ` to npm ** and** the
69+ ` .deb ` artifact set in the same release. This repo deliberately does ** not** use the CeraLive
70+ CalVer scheme. New upstream-source rebuilds use per-source ` <upstream>-<rev>~ceralive.N `
71+ counters; unchanged sources retain their previous version and exact bytes. Legacy published
72+ releases keep their tag-shaped suffixes. Full contract:
4773[ ` docs/VERSIONING.md ` ] ( docs/VERSIONING.md ) .
4874
4975## Layout
@@ -55,6 +81,7 @@ modem-stack/
5581├── packaging/ ModemManager-stack .deb rebuilds + provenance/verification CI
5682├── docs/ BENCH.md runbooks, CATALOG-INGESTION.md, COMPOSITION-EVIDENCE.md,
5783│ VERSIONING.md, FM350-DECISION.md, ESIM-DECISION.md
84+ │ └── adr/ ADR-FM350-RNDIS-BEARER.md, ADR-STAY-TYPESCRIPT.md
5885├── AGENTS.md AI routing + repo contract (self-contained; see Rule D)
5986└── POLICY.md no-fork gate + upstream-contribution-first policy
6087```
@@ -64,6 +91,11 @@ Biome via `@ceralive/biome-config`). `packaging/` is built in a bookworm contain
6491The two AST-backed source-shape guard tests use the test-only TypeScript 6 compiler-API
6592compatibility package; workspace typechecking and package emit remain TypeScript 7.
6693
94+ That language choice is recorded, not incidental: a Rust migration was assessed and rejected
95+ by the project owner on 2026-08-24, and the same record carries the MIT-licensed
96+ ` irlserver/modem-metrics ` idea attribution (concepts adopted, no source code copied). See
97+ [ ` docs/adr/ADR-STAY-TYPESCRIPT.md ` ] ( docs/adr/ADR-STAY-TYPESCRIPT.md ) .
98+
6799## Develop
68100
69101``` sh
@@ -142,6 +174,29 @@ ModemManager's own `StateFailedReason: sim-missing`, never from a blank `Sim` ob
142174` Modem.CurrentModes ` and ` Modem.SignalQuality ` are retained as their D-Bus structs, so the
143175preferred mode and the measurement-recency flag survive normalization.
144176
177+ ## Registration context + honest counter rates
178+
179+ An observation now also reports ** who the modem is registered with and to which cell** .
180+ ` operatorName ` / ` operatorCode ` come from ` Modem3gpp ` — the registered operator — and never
181+ from ` Sim.OperatorName ` , which is the SIM's * home* operator and differs throughout roaming;
182+ the code stays text because a two- versus three-digit MNC is a different network. An
183+ additive ` cell ` block reports ` cellId ` and ` tac ` , decoded together out of the existing
184+ ` 3gpp-lac-ci ` source's single five-token value, hex preserved as written. That source is
185+ ** coarse cell context, not a GNSS fix** : it stays outside ` GNSS_SOURCES ` , ` signal_location `
186+ stays false, and nothing on the path enables a location source. No EARFCN is claimed
187+ anywhere — ModemManager publishes none generically, only a per-cell ` earfcn ` (LTE) and
188+ ` nrarfcn ` (5GNR), two keys for two quantities. ` CellReading ` gained ` tac ` and now reads
189+ ModemManager's real ` ci ` key ahead of the older ` cell-id ` spelling.
190+
191+ The data-usage sampler reports throughput as ` rateBytesPerSecond ` , and ** omits it rather
192+ than reporting 0** whenever there was no interval to measure. A counter that goes BACKWARDS
193+ — an interface re-created by a replug or a driver reload — yields no rate at all instead of
194+ a clamped zero or a whole-total spike, and the baseline is rebased in the same pass so the
195+ next interval is measured correctly. Rates are never persisted: a same-boot reload resumes
196+ the cumulative baseline but restarts the rate unmeasured. Idea provenance for the
197+ counter-reset rule: ` irlserver/modem-metrics ` (MIT), concepts adopted, no code copied — see
198+ [ ` docs/adr/ADR-STAY-TYPESCRIPT.md ` ] ( docs/adr/ADR-STAY-TYPESCRIPT.md ) .
199+
145200## Provider-matching conformance matrix (Todo 27)
146201
147202` control/src/providers/conformance-matrix.test.ts ` registers all four providers at once and
0 commit comments