81 lines
4.0 KiB
Markdown
81 lines
4.0 KiB
Markdown
# Exotic Vehicle Scout — Implementation Notes
|
|
|
|
Specific implementation details for the Apex Track Experience vehicle database cron job.
|
|
|
|
## Database
|
|
|
|
**Location:** `/root/portal-mockup/vehicles.json` (dev/mockup copy) and `/var/www/static/vehicles.json` (live, served via core.itpropartner.com/vehicles.json)
|
|
|
|
**Schema:** `{Make: {Model: {Year: HP, ...}, ...}}`
|
|
- Makes are top-level keys (capitalized: "Ferrari", "Mercedes-AMG")
|
|
- Models are sub-keys (capitalized: "296 Speciale", "Mustang GTD")
|
|
- Years are string keys (not integers): `{"2025": 819, "2026": 819}`
|
|
- Years span from 2015 onward (the database covers 2015+ per initial requirement)
|
|
|
|
**Duplicates exist:** There are TWO copies — `/root/portal-mockup/vehicles.json` (flat format with single-line years, ~234 lines, simpler) and `/root/docker/docuseal/data/vehicles.json` (pretty-printed, ~2,277 lines, comprehensive). The DocuSeal copy is the canonical one.
|
|
|
|
## De-duplication Check Pattern
|
|
|
|
In Python:
|
|
```python
|
|
import json
|
|
v = json.load(open('/root/portal-mockup/vehicles.json'))
|
|
|
|
def is_in_db(make, model):
|
|
"""Check if a make+model combination exists in the vehicle database."""
|
|
if make in v:
|
|
models = v[make]
|
|
if model in models:
|
|
return True
|
|
# Also check partial matches (e.g., 'Mustang GTD' vs 'Mustang GT')
|
|
matches = [m for m in models.keys() if model.lower() in m.lower()]
|
|
if matches:
|
|
return True
|
|
return False
|
|
```
|
|
|
|
For partial matches, be precise: "Corvette ZR1X" vs "Corvette ZR1" — these are DIFFERENT models. Use python to list ALL models under a make and manually review ambiguous cases.
|
|
|
|
## Prior-Report Cross-Reference
|
|
|
|
Use `session_search(query="exotic-vehicle-scout", limit=5, sort="newest")` to find prior cron runs. Each run delivers a full report with a table of findings. Extract those findings and check each one against the live DB:
|
|
|
|
```python
|
|
# For each prior report's claimed new-find list:
|
|
for item in prior_findings:
|
|
still_missing = not is_in_db(item['make'], item['model'])
|
|
# If still missing, include in the "accumulated" section
|
|
```
|
|
|
|
## Key Sources for Vehicle Research
|
|
|
|
- **Exa Search (MCP via `web_search_exa`)** — best single source for niche/boutique brands (Zenvo, Denza, McMurtry). Semantic search catches what keyword search misses. Returns publication dates for recency filtering. Set `numResults=10`. Use natural-language page descriptions, not keyword lists.
|
|
- **Goodwood Festival of Speed entry lists** (July, annual) — catches boutique/hypercar debuts
|
|
- **motor1.com** — good factory-style coverage of all industry events
|
|
- **CarThrottle** — catches niche/meme-worthy debuts (Ruf B8, Apollo Evo)
|
|
- **roadandtrack.com / thedrive.com** — performance-focused journalism
|
|
- **Manufacturer press sites** — for official HP figures (ferrari.com, pagani.com, audi-mediacenter.com, lamborghini.com/news, ford.com/performance)
|
|
- **carscoops / carnewschina** — Chinese-market vehicles (BYD/Denza, Xiaomi, Nio)
|
|
- **caranddriver.com/future-cars** — aggregated future vehicle guide
|
|
|
|
## Known Model Name Variations
|
|
|
|
When checking the DB, you need to account for inconsistencies in model naming:
|
|
- "Corvette Stingray" != "Stingray" — always use full manufacturer model names
|
|
- "M5" in DB currently ends at 2024/617hp — the 2025+ G90 generation (717hp) needs separate entries
|
|
- "GT 63 S 4-Door" is in the DB but "GT 63 S E Performance Coupe" (2-door, 805hp) is NOT
|
|
- "Ioniq 5 N" vs "IONIQ 5 N" — capitalization differs but python dict check is case-sensitive; check `.lower()` on both sides
|
|
|
|
## Apex Track Experience Event
|
|
|
|
- Date: September 19, 2026
|
|
- Invites: Any vehicle 500+ HP regardless of body style or drivetrain
|
|
- Registration form: DocuSeal-based, fetches make/model from vehicles.json dropdown
|
|
- Known gaps: "custom/homebuilt" option needed for prototype/low-volume builds
|
|
|
|
## Database Corrections (Known)
|
|
|
|
- Aston Martin Valhalla: DB says 998 hp, actual is 1,064 hp (1,079 PS)
|
|
- BMW M5 (G90): 2025+ entries at 717 hp are missing (DB ends at 2024/617hp)
|
|
- Polestar 6 (884 hp, 2026): missing — DB only has Polestar 1
|