# 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
