You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 19bde79
Browse filesBrowse the repository at this point in the historyBrowse files
fix(pipeline): require corroboration before shipping community rows
Re-evaluate legacy community-only rows, retain recent pending evidence, and rebuild signed feed v47 after holding 449 uncorroborated numbers.
The previous pipeline assertions expected same-day reports to ship; those expectations contradicted the new two-day promotion rule and were replaced with hold, promotion, and expiry coverage.
CallShield blocks spam calls and texts using a **15+ layer on-device detection engine** with a gradient-boosted tree ML scorer, bounded campaign and churn evidence, conservative carrier identity metadata signals, an RCS notification filter, and real-time caller ID. Its 51,806-number database sits alongside a trending-numbers feed the app checks every 30 minutes. There are no accounts or tracking.
33
+
CallShield blocks spam calls and texts using a **15+ layer on-device detection engine** with a gradient-boosted tree ML scorer, bounded campaign and churn evidence, conservative carrier identity metadata signals, an RCS notification filter, and real-time caller ID. Its 51,357-number database sits alongside a trending-numbers feed the app checks every 30 minutes. There are no accounts or tracking.
34
34
35
35
The database keeps `data/spam_numbers.json` as a stable legacy GitHub-raw
36
36
endpoint for older clients, while current builds bundle a hash manifest and
@@ -67,7 +67,7 @@ Version highlights for each release are in [CHANGELOG.md](CHANGELOG.md).
67
67
68
68
## How It Works
69
69
70
-
1.**51,806 imported spam numbers.** Sources include FCC consumer complaints (2+ reports each), FTC Do Not Call, ToastedSpam, and community reports.
70
+
1.**51,357 imported spam numbers.** Sources include FCC consumer complaints (2+ reports each), FTC Do Not Call, ToastedSpam, and corroborated community reports.
3.**Real-time caller ID overlay**. An optional SkipCalls spam check for locally suspicious calls, with SIT tone anti-autodialer
73
73
4.**Trending feeds**. The app checks for trending spam numbers and campaign ranges every 30 minutes. The maintainer regenerates them by hand from new community reports
@@ -92,7 +92,7 @@ A fix release, from a review of the work that went into 1.8.0.
92
92
-**Signed protection data.** Every feed the app downloads now carries the maintainer's signature, the certificate pins that had refused downloads since August are fixed, and a feed mirror covers places where GitHub is blocked.
93
93
-**Region rules** reach outside North America, and Settings gains telemarketing ranges for Spain, India and Brazil.
94
94
-**Chinese** now covers every line of system text, and the block log, Lookup and the "why was this blocked" panel are translatable.
95
-
-**Community reports** go out once and wait for a connection when you're offline. The database grows to 51,806 numbers.
95
+
-**Community reports** go out once and wait for a connection when you're offline. A new number enters the database after reports on two different UTC days. Reports with reporter buckets also need three distinct buckets.
96
96
97
97
## Detection Pipeline (v1.8.1)
98
98
@@ -113,7 +113,7 @@ All detection layers implement a shared `IChecker` interface and run in priority
113
113
| 5310 |**Regulatory Prefix**| Block | Opt-in (Settings > Telemarketing ranges) blocks for ranges regulators set aside for sales calls: Spain 400 (from 17 October 2026), India 140 (TRAI), Brazil 0303 (ANATEL). Matches the number with its country code, and without it on a phone from that country |
114
114
| 5300 |**STIR/SHAKEN Authenticated**| Allow | Carrier-authenticated caller ID allows through heuristic/ML suspicion, and through a database match only when that row's newest evidence, community reports included, is over a year old and the number isn't trending right now. Explicit blocks still win first |
115
115
| 5250 |**Regulatory Allow**| Allow | Opt-in protected series that rings through past the database and statistics. India 1600 (banks, insurers and government offices, per TRAI) |
116
-
| 5200 |**Spam Database**| Block | 51,806 imported spam numbers plus the trending-numbers feed |
116
+
| 5200 |**Spam Database**| Block | 51,357 imported spam numbers plus the trending-numbers feed |
-`not_spam_review.json`: Generated community false-positive review candidates
18
18
-`merged_report_ids.json`: Ids of reports merged in the last 14 days, so a report the app resends after its original was merged counts once. The ids are random and already appear in the report files
19
+
-`community_pending.json`: Community-only reports waiting for the two-day and reporter-bucket promotion threshold
19
20
-`reports/*.json`: Pending community reports. `reports/rejected/` holds quarantined files
20
21
21
22
## Consuming this data
@@ -187,6 +188,13 @@ python scripts/evaluate_model.py # exits non-zero if CV F1 regresses
187
188
python scripts/feed_signing.py sign
188
189
```
189
190
191
+
The merge holds a number supported only by community reports in
192
+
`community_pending.json` until reports span two UTC days. If those reports have
193
+
reporter buckets, at least three distinct buckets are also needed. Pending
194
+
reports expire after 30 days. The merge applies this rule to older
195
+
community-only database rows too, including a run with no queued reports.
196
+
Rows backed by FCC, FTC or another source aren't held by this gate.
197
+
190
198
`train_spam_model.py` prints the learned per-feature weights and writes a
191
199
version-stamped `spam_model_weights.json` (GBT trees + a logistic-regression
192
200
fallback). `evaluate_model.py` reports precision/recall/F1 two ways: with the
0 commit comments