Commit History
-
Call-1 weights: drop the parroted example, default to no-think (A/B verdict)
Live A/B on "quiet green wander" was decisive: - No-think: 9.6s, clean JSON — but byte-identical to the worked example in the prompt (the 1B copied the example's numbers verbatim). - Think: 26s (3x slower/quota), and corrupted the JSON (zeroed the matching categories). Reasoning did not help this scoring task. Two parrot traps now removed: the old `0.0-1.0` schema AND the worked JSON example. New prompt gives NO copyable number-set — it states 0..1 in words and teaches the mapping with short word->type cues, so the model scores the actual vibe. Wrong/empty output still falls through to the embed tier (_is_degenerate). Default flag flipped to no-think; thinking stays toggleable via DISCOVERROUTE_VIBE_THINKING=1. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>36d6af8 -
Call-1 reasoning budget 1024 + no-think A/B flag; narration name lockdown
Live trace findings drove these: - Call-1 reasoning ran past the 512-token budget without emitting JSON (empty -> fallback). Bump think budget to 1024; no-think stays 256. - Add DISCOVERROUTE_VIBE_THINKING A/B flag (config.VIBE_THINKING, default on) and record the chosen mode on every vibe_extraction trace row so think vs no-think can be compared head-to-head. - Narration kept name-dropping real off-route landmarks (Pont des Arts, Mona Lisa, Sorbonne, Sacre-Coeur) -> gate rejected -> template. Tighten the prompt to a hard allowlist (stops + endpoints + gazetteer only; scene-set without proper names) and fix the literal-"H3" artifact. - Scale narration token budget with route length (600..880) so long routes stop truncating mid-name. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5ef2ba5 -
Call-1 vibe weights: reasoning pass + anti-zero prompt + degenerate guard
Live traces showed MiniCPM5-1B returning an all-zero weighting for "quiet green wander" that passed validation (used_fallback=False), so the router got no taste signal and defaulted to nearby well-tagged POIs (public art) — a green vibe came out "arty". Root causes + fixes: - Prompt showed `"cafe": 0.0-1.0`; the 1B parroted `0.0` as the value. Rewrite states 0..1 in words, forbids all-zero/all-equal, gives one worked example on an unrelated vibe (shape, not value). - run_inference now supports enable_thinking (MiniCPM5-1B is hybrid- reasoning, verified on the model card); vibe->weights runs a reasoning pass and the <think> block is stripped before JSON parse. - _is_degenerate() rejects all-zero/all-equal output so the dispatcher falls through to the bge-small embed tier instead of routing tasteless. Test: test_llm_rejects_degenerate_weights (from the real all-zero trace). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>128e312
-
Round-4 fixes: drop overclaiming match-tag, dedup stops, hidden excludes famous
Tristan Leduc +1: Claude Fable 5Adversarial round 4 (NOT-CONVERGED) — root-caused to 3 issues: 1. The per-stop "a match for your vibe" tag overclaimed: any route that backfills a lower-ranked category (bakery on wine, church on jazz, statue on street-food/photography) falsely labelled those stops a match. Removed the tag entirely — each stop's reason text + the interpretation panel carry the honest framing; the model can't guarantee per-stop relevance. 2. No within-route dedup → the same place ("UP /SIDE / DOWN / TOWN") appeared twice in one route. Dedup the shortlist by osm_id AND name. 3. "hidden gems" still surfaced Notre Dame — the attraction-zeroing missed it (it's viewpoint). Discovery cues now drop famous, well-documented POIs by tag-richness (confidence >= FAMOUS_CONFIDENCE 0.85), category-independent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>c16ccf9 -
Round-3 fixes: wire interp weights, ref-name guard, tighten attraction gloss
Tristan Leduc +1: Claude Fable 5Adversarial round 3 (NOT-CONVERGED) found 3 MAJOR issues: 1. The discovery-cue affinity adjustments (zeroing "attraction" for "hidden gems") were COMPUTED then DISCARDED — the pipeline scored with effective_weights() while interp.weights was thrown away. Now the vibe path uses interp's own affinity (blended with profile when present), so "hidden gems" actually drops famous attractions. 2. OSM ref-code names ("PA_1570") surfaced as unfindable stops labelled "a match". Added taxonomy.is_real_name(); such POIs now self-demote (UNNAMED_SCORE_FACTOR) and render as "a <noun>". 3. "attraction" gloss ("famous landmark... worth seeing") embedded near "tour/spots/photo", landing Hôtel de Ville on a coffee tour. Tightened to "a major crowded tourist attraction or world-famous monument". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>720767c -
Round-2 follow-ups: discovery-cue handling + sparse-category honesty
Tristan Leduc +1: Claude Fable 5- "hidden gems / off the beaten path / like a local" now suppresses the famous-"attraction" category (its semantic opposite) and bumps adventurousness to 0.8 so the route favours under-documented places. - When the user's #1 requested category has zero stops on the corridor (e.g. "jazz and live music" with no venues between A and B), the interpretation panel says so instead of silently tagging churches "a match for your vibe". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>7ae16ab -
Round-2 route-fit: top-N category cap + weak-match honesty
Tristan Leduc +1: Claude Fable 5Adversarial round 2 (NOT-CONVERGED) found two systemic issues, both fixed: - AFFINITY_FLOOR let all 17 categories keep weight, so ranks 5-17 silently backfilled routes with off-vibe filler (same statues/churches bled into 10+ unrelated routes). Now cap to TOP_AFFINITY_CATEGORIES=6; the tail is zeroed (sparse routes end honestly short, not confabulated). Applied in embed + centrally in resolve_affinity (covers llm/keyword tiers too). - min-max forces a top category to 1.00 even for weak/out-of-vocabulary vibes, so "brutalist architecture" got churches confidently labelled "a match for your vibe". Added raw-cosine confidence (WEAK_MATCH_SIMILARITY =0.55; real vibes 0.66-0.85, brutalist 0.51, nonsense ~0.49); weak vibes now get honest framing ("no strong match — here's my closest guess") and drop the per-stop "a match for your vibe" tag. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a4c45c1 -
fixed ui
2c5a5d1
-
v2 with model changed and using gradio server func
10cf611
-
Design system, live freshness, autocomplete, and clay-pin markers
Tristan Leduc +1: Claude Fable 5UI/UX (from the design handoff): - Clay-sticker theme, hero, framed Voyager map with warm grade, loading state ("Scouting your wander…"), route-draw + staggered marker pop-in - 14-piece clay-pin marker family (vendored SVGs) with color-by-meaning mapping for all 17 categories, start/dest pins, legend in the family's color language - Start/Destination autocomplete over the local 30k POI-name index - Force-light mode (design is light-only; Gradio dark vars made text unreadable), per-event js fixed to pass inputs through Freshness: - Open-now awareness from OSM opening_hours (9,461 POIs): conservative evaluator (abstains on exotic grammar, per-rule PH/SH handling), plan-time demotion of closed places, night realism for unknown-hours daytime categories, 🟢/🔴 itinerary badges - Optional Google Places live-verify of final stops (GOOGLE_MAPS_API_KEY; ToS-clean: per-request, never stored) - Embedder switched to fastembed/ONNX (no torch in the request path; warms in ~9s), bo…b34c92a -
Wanderlust: taste-aware Paris discovery routing
Tristan LeducBuild Small Hackathon submission - v1 complete All P0 requirements + P1 features: - OSM-based routing with detour budget control - POI extraction with confidence scoring (30k places, 17 categories) - Submodular orienteering solver with diversity optimization - Vibe interpretation via sentence embeddings (bge-small) - Grounded narration (0% hallucination gate) with optional Qwen3.5-9B - Persistent taste profile (browser-based) - Alternative routes (3 options) - Custom UI (clay/sticker design with animations) - Offline-first architecture (no runtime cloud APIs) - Fully tested (42 tests passing) Stack: OSM + networkx + scipy + Gradio 6 + HuggingFace Ready for HF Space deployment. See HACKATHON_DEPLOYMENT.md for push instructions.f00d669