Skip to content

fix(data): merge 28 confirmed PDA near-duplicate records - #335

Merged
Seungpyo1007 merged 2 commits into
developfrom
Seungpyo1007/pda-dedup-scan
Sep 29, 2026
Merged

Seungpyo1007 merged 2 commits into
developfrom
Seungpyo1007/pda-dedup-scan

Conversation

@Seungpyo1007

@Seungpyo1007 Seungpyo1007 commented Sep 29, 2026 •

Copy link
Copy Markdown
Member

What

Near-duplicate scan of the pda category (140 records — small enough to review
every match by hand). Merged 28 confirmed duplicate records into 21 keepers
(140 → 112 files), keeping the better-sourced side field by field and unioning
source_urls. Anything ambiguous was left unmerged and is documented below.

Both gates pass on the merged tree:

  • python -m app.validate → passed
  • integrity_check.py <data> --strict → 0 hard anomalies (structural section empty)

Per-pattern breakdown

The same three patterns the tablet/watch (#324) and smartphone (#329/#330) passes
turned up all appear here.

Pattern 1 — identical scrape imported twice under different row-id slugs

Two cigarplug/scrape-gsma rows for the same device, byte-identical except
source_row. Kept the lower row-id, deleted the other (no field change needed):

  • motorola/2002/accompli-388 — kept …-scrapegsma-344, deleted …-1227
  • mitac/2005/mio-a701 — kept …-scrapegsma-278, deleted …-1161

Pattern 2 — same device under a brand-prefixed slug and a bare slug (sibling dirs)

Same convention as the #330 GSMArena/phonedb merge: kept the bare GSMArena/Kaggle
record (real specs + raw_gsmarena, sometimes Wikipedia), upgraded name to the
brand-inclusive form, unioned source_urls to retain the phonedb reference, kept
the keeper's soc/release_date, left verified as-is, deleted the phonedb twin:

Keeper (kept) Deleted twin New name
treo-680 palm-treo-680-palm-lowrider Palm Treo 680
treo-750v palm-treo-750v-htc-cheetah Palm Treo 750v
treo-750 palm-treo-750-htc-cheetah Palm Treo 750
treo-500v palm-treo-500v-palm-otto Palm Treo 500v

Treo 750 vs 750v and Treo 500 vs 500v are distinct SKUs — only the
matching-model twins were merged. palm-treo-500-palm-otto (2008 Treo 500) is a
different device and was left untouched.

Pattern 3 — cross-source duplicate (clean short-slug record + scrape-gsma row, same base dir)

Kept the clean record (correct soc FK, canonical slug), deleted the scrape twin,
and repaired the keeper's ram_gb from the twin's cited memory_internal — the
clean side carried the fabricated ram_gb = 1 placeholder while the scrape side had
the real figure. github.com/cigarplug/scrape-gsma was unioned so the repaired RAM
is sourced. No value invented: in every pair the deleted twin already held the real
value.

  • 16 HP iPAQ pairs — h6310/h6315/h6320/h6325/hw6510/hw6515/hw6910/hw6915/rw6815/
    rw6818/rw6828/514 → 0.0625 GB (64 MB); 610c/910c/data-messenger/voice-messenger
    → 0.125 GB (128 MB).
  • i-mate — pda2 (two identical scrape twins -1004/-121) → 0.125 GB;
    pda2k → 0.125 GB; pdal → 0.062 GB.
  • palm treo-pro (3-way: bare Wikipedia-cited + …-scrapegsma-7066 + phonedb
    palm-treo-pro) — kept the bare record, ram_gb 1 → 0.125 GB (128 MB), name →
    "Palm Treo Pro", unioned all four source_urls.

Left unmerged (ambiguous — documented, not guessed)

  • palm-pre-scrapegsma-7065 (GSM webOS Pre, 2009-10) and palm-pre-plus-scrapegsma-7063
    (GSM Pre Plus, 2010-03) overlap a region-split family — palm-pre[-plus]-palm-castle-c
    (CDMA) and palm-pre[-plus]-gsm-{eu,na}-palm-castle-g — but do not map 1:1, so
    no merge was made.
  • The EU/NA regional variant pairs (palm-pixi-gsm, palm-pixi-plus-gsm,
    palm-pre-2-gsm, palm-pre[-plus]-gsm-…-castle-g) are legitimate separate SKUs
    (different release dates + regions) and were left alone.

Systemic finding (reported, not mass-edited)

The same fabricated-defaults signature the earlier passes flagged is present here:
nearly every clean pda record carries ram_gb = 1 (real values are 16–256 MB),
and many Palm records carry os = "Feature phone" for what are Palm OS / webOS
devices. I only repaired ram_gb inside the confirmed merges (where the deleted
twin supplied a cited real value); the remaining placeholder records were left
untouched rather than mass-edited, since fixing them needs a per-record source and
is out of scope for a dedup pass (per the "never invent values" rule).

Ownership / dump

data/pda/ only, plus the mandatory dump refresh as the last commit (re-dumped the
pdas collection from a fresh scratch DB with TECHAPI_DATA_DIR on this worktree;
pdas 140 → 112, no other collection touched).

Closes #296 — this clears the pda slice of the "near-duplicates in other categories
not yet scanned" item, but that item stays open (smartphone still has 322
documented-unresolved pairs per #330, and other categories are not yet scanned), so
this is Refs, not Closes.

Scanned the pda category (140 records, reviewed every match by hand) for the
three duplicate patterns the tablet/watch (#324) and smartphone (#329/#330)
passes turned up. Merged 28 redundant files into 21 keepers (140 -> 112),
keeping the better-sourced side field by field and unioning source_urls.

Pattern 1 - identical scrape imported twice under different row-id slugs
(100% identical specs, differ only by source_row):
  - motorola/2002/accompli-388: kept ...-scrapegsma-344, deleted ...-1227.
  - mitac/2005/mio-a701: kept ...-scrapegsma-278, deleted ...-1161.

Pattern 2 - same device under a brand-prefixed slug and a bare slug in sibling
dirs. Same convention as the #330 GSMArena/phonedb merge: kept the bare
GSMArena/Kaggle record (real specs + raw_gsmarena, sometimes Wikipedia),
upgraded name to the brand-inclusive form, unioned source_urls to retain the
phonedb reference, kept the keeper's soc/release_date, left verified as-is,
deleted the phonedb twin:
  - treo-680  <- palm-treo-680-palm-lowrider   ("Palm Treo 680")
  - treo-750v <- palm-treo-750v-htc-cheetah    ("Palm Treo 750v")
  - treo-750  <- palm-treo-750-htc-cheetah     ("Palm Treo 750")
  - treo-500v <- palm-treo-500v-palm-otto      ("Palm Treo 500v")
Treo 750 vs 750v and Treo 500 vs 500v were kept as distinct SKUs (only the
matching-model twins were merged). palm-treo-500-palm-otto (2008 Treo 500) is a
different device and was left alone.

Pattern 3 - cross-source duplicate: the same PDA imported as a clean short-slug
record and as a cigarplug/scrape-gsma row in the same base dir. Kept the clean
record (correct soc FK, canonical slug), deleted the scrape twin, and repaired
the keeper's ram_gb from the twin's cited memory_internal (the clean side
carried the fabricated ram_gb=1 placeholder; the scrape side had the real
value). The github.com/cigarplug/scrape-gsma URL was unioned so the repaired
RAM is sourced:
  - 16 HP iPAQ pairs: h6310/h6315/h6320/h6325/hw6510/hw6515 -> 0.0625 GB (64 MB);
    hw6910/hw6915/rw6815/rw6818/rw6828/514 -> 0.0625; 610c/910c/data-messenger/
    voice-messenger -> 0.125 GB (128 MB).
  - i-mate pda2 (two identical scrape twins, -1004 and -121) -> 0.125 GB.
  - i-mate pda2k -> 0.125 GB; i-mate pdal -> 0.062 GB.
  - palm treo-pro (3-way: bare + scrape-gsma-7066 + phonedb palm-treo-pro):
    kept the bare Wikipedia-cited record, ram 1 -> 0.125 GB (128 MB), name ->
    "Palm Treo Pro", unioned all four source_urls.

Left unmerged and documented (ambiguous, per "leave ambiguous unmerged"): the
GSM webOS palm-pre-scrapegsma-7065 and palm-pre-plus-scrapegsma-7063 overlap a
region-split family (palm-pre[-plus]-palm-castle-c CDMA and
palm-pre[-plus]-gsm-*-palm-castle-g EU/NA) but do not map 1:1, so no merge.
The EU/NA regional variant pairs (pixi-gsm, pixi-plus-gsm, pre-2-gsm,
pre[-plus]-gsm-castle-g) are legitimate separate SKUs and were left alone.

No value was invented: every ram_gb repair took the real figure already present
in the deleted twin's cited memory_internal. verified flags unchanged.

Both gates pass: `python -m app.validate` and `integrity_check.py <data>
--strict` (0 hard anomalies).

Refs #296
Re-dumped the pdas collection from the deduped data tree (fresh scratch DB, TECHAPI_DATA_DIR on this worktree). pdas 140 -> 112: 28 merged-away detail pages removed, 21 survivor pages updated (repaired ram_gb, brand-inclusive names, unioned source_urls), and the top-level manifest pda count updated. No other collection touched.
@TechEngineBot

Copy link
Copy Markdown
Member

🔎 Data verification — Tier 0 (offline existence/trust)

Scored by app.verify; posted by TechEngineBot. Informational only — the structural gate (app.validate) is separate and authoritative for merge.

12/12 categories ? 191,791 records ? diff base develop@ea3f31e

Changed records in this PR

24 record(s) assessed.

%%{init: {"theme":"base","themeVariables":{"pie1":"#3fb950","pie2":"#d29922","pie3":"#f85149","pieStrokeWidth":"0px","pieOpacity":"1"}}}%%
pie showData
    title Verification bands — all records
    "Green" : 5
    "Yellow" : 19
    "Red" : 0
Loading
Category Distribution Total 🟢 🟡 🔴 🟢 %
pda 🟩🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 24 5 19 0 20.8%
All 🟩🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 24 5 19 0 20.8%

Full-dataset baseline

191791 record(s) assessed.

%%{init: {"theme":"base","themeVariables":{"pie1":"#3fb950","pie2":"#d29922","pie3":"#f85149","pieStrokeWidth":"0px","pieOpacity":"1"}}}%%
pie showData
    title Verification bands — all records
    "Green" : 32769
    "Yellow" : 157967
    "Red" : 1055
Loading
Category Distribution Total 🟢 🟡 🔴 🟢 %
brand 🟩🟩🟩🟩🟩🟩🟩🟨🟨🟨🟨🟨 207 122 85 0 58.9%
soc 🟩🟩🟨🟨🟨🟨🟨🟥🟥🟥🟥🟥 2117 284 837 996 13.4%
smartphone 🟩🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥 93407 18003 75350 54 19.3%
tablet 🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥 3459 292 3166 1 8.4%
watch 🟩🟩🟩🟨🟨🟨🟨🟨🟨🟨🟨🟥 447 94 350 3 21.0%
pda 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟨🟨🟨 112 80 32 0 71.4%
gpu 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟨🟨🟨 2076 1529 547 0 73.7%
cpu 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟨🟥 4512 4219 292 1 93.5%
laptop 🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 1995 107 1888 0 5.4%
monitor 🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 882 0 882 0 0.0%
software 🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 42493 366 42127 0 0.9%
website 🟩🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 40084 7673 32411 0 19.1%
All 🟩🟩🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥 191791 32769 157967 1055 17.1%

Hard violations (forced red):

Count Check
1 !boost_ge_base

green = authoritative source + complete + consistent · yellow = plausible, needs confirmation · red = sparse/weak source or a hard contradiction. Promotion to verified runs in the scheduled verify-network workflow.

@TechEngineBot

Copy link
Copy Markdown
Member

TechEngine change review: PASS

12/12 categories ? 191,791 records ? diff base develop@ea3f31e

Check Result
python -m app.validate PASS
Changed dump JSON and manifest/index counts PASS
New hard integrity anomalies vs PR base PASS

Changed data

Category Added Modified Deleted Added verified Added unverified Added Kaggle-sourced
brand 0 0 0 0 0 0
soc 0 0 0 0 0 0
smartphone 0 0 0 0 0 0
tablet 0 0 0 0 0 0
watch 0 0 0 0 0 0
pda 0 24 28 0 0 0
gpu 0 0 0 0 0 0
cpu 0 0 0 0 0 0
laptop 0 0 0 0 0 0
monitor 0 0 0 0 0 0
software 0 0 0 0 0 0
website 0 0 0 0 0 0

Changed record examples

pda modified

  • pda/hp/2004/ipaq-h6310/ipaq-h6310.json - iPAQ h6310
  • pda/hp/2004/ipaq-h6315/ipaq-h6315.json - iPAQ h6315
  • pda/hp/2004/ipaq-h6320/ipaq-h6320.json - iPAQ h6320
  • pda/hp/2004/ipaq-h6325/ipaq-h6325.json - iPAQ h6325
  • pda/hp/2005/ipaq-hw6510/ipaq-hw6510.json - iPAQ hw6510
  • pda/hp/2005/ipaq-hw6515/ipaq-hw6515.json - iPAQ hw6515
  • pda/hp/2006/ipaq-hw6910/ipaq-hw6910.json - iPAQ hw6910
  • pda/hp/2006/ipaq-hw6915/ipaq-hw6915.json - iPAQ hw6915
  • pda/hp/2006/ipaq-rw6815/ipaq-rw6815.json - iPAQ rw6815
  • pda/hp/2006/ipaq-rw6818/ipaq-rw6818.json - iPAQ rw6818
  • pda/hp/2006/ipaq-rw6828/ipaq-rw6828.json - iPAQ rw6828
  • pda/hp/2007/ipaq-514/ipaq-514.json - iPAQ 514
  • pda/hp/2007/ipaq-610c/ipaq-610c.json - iPAQ 610c
  • pda/hp/2007/ipaq-910c/ipaq-910c.json - iPAQ 910c
  • pda/hp/2008/ipaq-data-messenger/ipaq-data-messenger.json - iPAQ Data Messenger
  • ... 9 more

pda deleted

  • pda/hp/2004/ipaq-h6310/hp-ipaq-h6310-scrapegsma-3824.json - HP iPAQ h6310
  • pda/hp/2004/ipaq-h6315/hp-ipaq-h6315-scrapegsma-3823.json - HP iPAQ h6315
  • pda/hp/2004/ipaq-h6320/hp-ipaq-h6320-scrapegsma-3822.json - HP iPAQ h6320
  • pda/hp/2004/ipaq-h6325/hp-ipaq-h6325-scrapegsma-3821.json - HP iPAQ h6325
  • pda/hp/2005/ipaq-hw6510/hp-ipaq-hw6510-scrapegsma-3820.json - HP iPAQ hw6510
  • pda/hp/2005/ipaq-hw6515/hp-ipaq-hw6515-scrapegsma-3819.json - HP iPAQ hw6515
  • pda/hp/2006/ipaq-hw6910/hp-ipaq-hw6910-scrapegsma-3818.json - HP iPAQ hw6910
  • pda/hp/2006/ipaq-hw6915/hp-ipaq-hw6915-scrapegsma-3817.json - HP iPAQ hw6915
  • pda/hp/2006/ipaq-rw6815/hp-ipaq-rw6815-scrapegsma-3814.json - HP iPAQ rw6815
  • pda/hp/2006/ipaq-rw6818/hp-ipaq-rw6818-scrapegsma-3816.json - HP iPAQ rw6818
  • pda/hp/2006/ipaq-rw6828/hp-ipaq-rw6828-scrapegsma-3815.json - HP iPAQ rw6828
  • pda/hp/2007/ipaq-514/hp-ipaq-514-scrapegsma-3813.json - HP iPAQ 514
  • pda/hp/2007/ipaq-610c/hp-ipaq-610c-scrapegsma-3812.json - HP iPAQ 610c
  • pda/hp/2007/ipaq-910c/hp-ipaq-910c-scrapegsma-3811.json - HP iPAQ 910c
  • pda/hp/2008/ipaq-data-messenger/hp-ipaq-data-messenger-scrapegsma-3810.json - HP iPAQ Data Messenger
  • ... 13 more

Heuristic review

  • Heuristic warnings: none found.

@TechEngineBot

Copy link
Copy Markdown
Member

TechEngine validation stats: PASS

12/12 categories ? 191,791 records ? diff base develop@ea3f31e

Data summary

Category Total Verified Unverified Missing verified Tracked Verified % of tracked
brand 207 123 84 0 207 59.4%
soc 2117 284 1833 0 2117 13.4%
smartphone 93407 17581 75826 0 93407 18.8%
tablet 3459 288 3171 0 3459 8.3%
watch 447 94 353 0 447 21.0%
pda 112 68 44 0 112 60.7%
gpu 2076 1496 580 0 2076 72.1%
cpu 4512 4219 293 0 4512 93.5%
laptop 1995 105 1890 0 1995 5.3%
monitor 882 0 882 0 882 0.0%
software 42493 358 42135 0 42493 0.8%
website 40084 7635 32449 0 40084 19.0%
all 191791 32251 159540 0 191791 16.8%

Warning

Tracked verified coverage is below 50% for monitor 0.0% (0/882), software 0.8% (358/42493), laptop 5.3% (105/1995), tablet 8.3% (288/3459), soc 13.4% (284/2117), all 16.8% (32251/191791), smartphone 18.8% (17581/93407), website 19.0% (7635/40084), and 1 more.
Tracked coverage excludes records missing the verified field; see the Missing verified column for those records.
This does not fail validation. Keep imported records verified: false until manual audit, but treat this as follow-up verification work before relying on the affected categories as curated data.

Validation notes

  • The integrity gate blocks only hard anomalies introduced by this PR relative to its merge base.
  • Full advisory outlier listings are suppressed on successful runs because they are dataset-wide and mostly stable between PRs.
  • Failure runs still include a detailed log excerpt for debugging.

Key output:

## app.validate
## integrity_check.py (PR head compared with PR base)
loaded CPU=4512 GPU=2076
Integrity section Flagged lines
structural 0
CPU name/tier consistency (desktop mainstream only) 0
CPU single>multi (cinebench/geekbench — should be multi>=single) 0
CPU era-vs-score outliers 0
CPU cross-source ratio outliers (possible wrong-variant) 132
GPU cross-source ratio outliers + sanity 51

@Seungpyo1007
Seungpyo1007 merged commit e5e18a1 into develop Sep 29, 2026
5 checks passed
@Seungpyo1007
Seungpyo1007 deleted the Seungpyo1007/pda-dedup-scan branch September 29, 2026 12:47
@Seungpyo1007 Seungpyo1007 removed the enhancement New feature or request label Sep 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working data Dataset changes

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Data accuracy: corrections, duplicates and dates (workstream)

2 participants