# TIP Verification Truth Model And Evidence Ledger — 2026-05-09

## Scope

- Make TIP verification explainable instead of simply green/red.
- Preserve the difference between:
  - a true 1:1 competitor match
  - verified absence of a valid public match
  - ambiguous candidates
  - unresolved research
- Start an append-only evidence ledger for source-backed verification decisions.

## Implemented

- Added migration `sql/103-verification-evidence-and-competitor-status.sql`.
- Added product-level competitor status:
  - `matched`
  - `no_valid_match`
  - `needs_research`
  - `ambiguous`
  - `unknown`
- Added no-match fields:
  - `no_match_verified_at`
  - `no_match_reason`
- Added `transceiver_verification_evidence`.
  - `price`
  - `image`
  - `details`
  - `competitor_match`
  - `competitor_no_match`
  - `artifact_quarantine`
- Scraper DB helper now records evidence for newly verified price/image/details.
- Quarantine robot now records artifact evidence.
- Matcher records competitor-match evidence for auto-approved matches.
- Review API now supports protected no-valid-match marking:
  - `POST /api/review/transceivers/:id/no-valid-match`
- Health API exposes active competitor-status counts.
- Review stats expose global product competitor-status counts.

## Live Deployment

- Scraper build on Erik: passed.
- API build on Erik: passed after TypeScript route param cast.
- Migration applied successfully.
- `tip-api` restarted and healthy.
- `tip-scraper-daemon` was not restarted because `scrape:pricing:naddod` and `scrape:pricing:qsfptek` were active.

## Live Backfill

- Product status after migration:
  - `matched=11198`
  - `needs_research=6575`
- Evidence ledger seeded:
  - `price=10633`
  - `image=12189`
  - `details=16782`
  - `competitor_match=316`

## Live API Check

- `/api/health`: healthy.
- Active-product competitor status:
  - `matched=11158`
  - `needs_research=6256`
  - `no_valid_match=0`
  - `ambiguous=0`
- Protected Review stats with Dashboard token returned:
  - `matched=11198`
  - `needs_research_products=6575`
  - `no_valid_match=0`
  - `ambiguous=0`

## Operational Next Step

- When `scrape:pricing:naddod` and `scrape:pricing:qsfptek` finish, restart `tip-scraper-daemon` to load the new scheduler matcher/reconcile logic.
- Then run:
  - reconcile
  - matcher
  - Review no-valid-match workflow for products that truly have no valid public 1:1 competitor.

## Training Pool

- Added TIPLLM lessons for:
  - competitor state machine
  - evidence ledger semantics
- `training-data/tip-llm-capabilities-v1.jsonl` validated successfully.

