- db.init_db gains guarded ALTER TABLE additions for listings.year /
seller_type / extras (schema.sql v1 untouched; PRAGMA-checked idempotent)
- rubric: extras_from_text() returns matched EXTRAS labels (table order)
- importer: normalize computes year (existing helper), seller_type ONLY
from a real state-item signal (dealer/private, else NULL), extras JSON;
upsert rewrites the new columns on both paths
- verified on live DB: import idempotent, counts stay 640/560/80, year
backfilled on 599 rows, extras on 45, seller_type 0 (no state signal)