# 2026-05-10 — TIP Price Status + OEM Detail Resolution ## Part-Number Details Verifier Added `packages/scraper/src/utils/verify-part-number-details.ts`. Purpose: - close detail gaps where form factor, reach and fiber are already present but `speed_gbps=0` - use conservative part-number inference only - write canonical `details` evidence with robot `verify:part-number-details` Safety catch: - Cisco `GLC-FE-*` appeared in dry-run - these are Fast Ethernet, so the generic `GLC-* => 1G` rule was rejected - final rule only infers 1G for safe patterns such as `GLC-SX`, `GLC-LX`, `GLC-LH`, `GLC-ZX`, `GLC-EX`, `GLC-BX`, `GLC-T`, `GLC-TE` Live apply: - Juniper Networks: - `375` candidates updated - `375` details verified - Cisco Systems: - `176` candidates updated - `176` details verified - evidence: - `details | verify:part-number-details | 551` Result: - `details_verified` increased to `16913` - Juniper detail gaps dropped from `173` to `43` - Cisco detail gaps dropped from `146` to `80` ## Price Status Model Added migration `sql/105-price-status-and-unavailable-evidence.sql`. New fields: - `transceivers.price_status` - `transceivers.price_status_updated_at` - `transceivers.price_unavailable_verified_at` - `transceivers.price_unavailable_reason` Allowed states: - `public_price` - `no_public_price` - `needs_research` - `ambiguous` - `unknown` Important semantic rule: - `price_verified=true` still requires a real public price observation - quote-only/OEM/no-checkout cases use `price_status=no_public_price` - no price rows are fabricated Added `price_unavailable` evidence type. Added `packages/scraper/src/utils/resolve-price-availability.ts`. Live apply: - resolved quote-only/OEM/manufacturer/test-equipment/hyperscaler vendors to `no_public_price` - wrote `5361` `price_unavailable` evidence rows - preserved real retail/source-discovery vendors as `needs_research` Health API now exposes: - `price_status.public_price` - `price_status.no_public_price` - `price_status.ambiguous` - `price_status.needs_research` Live health after this pass: - active products: `17195` - price verified: `11414` - price status: - `public_price=11414` - `no_public_price=5595` - `needs_research=186` - `ambiguous=0` - image verified: `12104` - details verified: `16913` - fully verified: `10505` - competitor status: - `matched=10775` - `no_valid_match=74` - `ambiguous=556` - `needs_research=5790` Remaining price research: - `10Gtek=126` - `SFPcables=31` - `ShopFiber24=24` - `ATGBICS=3` - `Vcelink=2` Interpretation: - remaining price work is now real retail/source discovery - SFPcables search tests for 10Gtek part numbers did not return reliable direct hits - 10Gtek requires a source/alias discovery robot rather than no-public-price classification