Cong — Restaurant Data Dashboard

Interactive overview of the ingested restaurant database

Restaurants by Type

Click a bar to filter map + source. Ctrl+click (Cmd on Mac) to select multiple types.

Restaurants by Source

Auto-filters when types are selected above.

Restaurant Distribution by State

Ctrl+click tabs to combine multiple types on the map.

Restaurant Types by State

Duplicate Names Within Sources

Restaurants with the same normalized name within a single dataset (likely chains)

Cross-Source Duplicate Names

Same restaurant name appearing in multiple datasets

Top Chain Restaurants (by location count)

Restaurant Types by Source Dataset

Cong — Menu Items

Canonical menu entities, dish-type and section breakdowns, regional spread (RFC-006).

Cong — Conversations (v3 Pipeline)

RFC-009 v3 end-to-end pipeline output — generate → TTS → STT. Per-conversation utterances + WER from base Nemotron.

Conversations

error class:

No v3 conversations yet. Run the pipeline: python scripts/seed_v3_demo.py for a stub demo, or kick off docker run … cong/pipeline-v3 --restaurant 2 --n 10 for the real Shokudo end-to-end.

Cong — TTS Triage

RFC-013 §3.2 audio-integrity gate. tts_audio_quality.verdict = 'fail' grouped by (voice, accent, persona). Click a row to drill into failed utterances.

Top groups by flag rate

Groups with flag_rate are sorted DESC. Excludes utterances without a T1 audit (run scripts/backfill_rfc013_t1.py --apply to populate).

Cong — Proposals + Closure Loop

RFC-013 §3.5.1 Sonnet clustering output + §3.7.2 closure metric. Approve a proposal as standing-category (recurring pattern) or frozen-cohort (one-off cleanup) — standing approvals trigger immediate backfill against the active corpus.

Closure metric

Latest application per (utterance, stt_model) — re-runs and rollback-then-reapply paths don't double-count. Bo's signal: auto_standing_pct trending up means recurring patterns are becoming automatic.

Proposals for review

Effective drop_from_training + still-pending / non-keep clusters. Effective keep_for_training ones live on the Fine-tune Candidates tab (default: accept Sonnet's suggestion — no action needed). Select rows for a bulk decision; expand a row to audit up to 20 sample errors. Refresh the queue by triggering the wer-proposal-audit skill.

How this queue works — read before deciding
  1. Review is subtractive. Every term at/above the fine-tune threshold with no decision already trains by default. Review only removes false-positive WER labels — you never "add" anything.
  2. The audit already worked out the fix. Each actionable row's badge shows the recommendation:
    • enumerated (N) — no clean rule; the audit pre-matched N corpus utterances. Expand () to spot-check the samples, then click Approve-drop (N): it writes the drop decision and those N are out of fine-tuning immediately. One click — no agent, no CLI.
    • rule — a clean universal pair was drafted (hover → rule PR to see it). Approving means a code agent opens that one-line _MORPH_EQUIV/_REPLACEMENTS PR (needs test + re-backfill — can't be a click); it flips fixed after merge.
  3. Reject vs forgive. Reject = "real STT error" → it stays a fine-tune candidate (done). A forgiveness proposal is only done once it reaches fixed (via Approve-drop, or the rule PR).
  4. Snapshot & re-run. A "Snapshot" = canonical_term_stats keyed by corpus_run_id (Fine-tune Candidates tab). A rule fix doesn't move the numbers until backfill_stt_metrics --reclassify-all + compute_per_term_wer re-run against that corpus_run_id. (An enumerated drop needs no re-run — it excludes via the decision directly.)

Default view = actionable only (pending + approved-forgiveness awaiting a fix). Tick Show all to also see rejected / approved-keep / fixed rows.

Cong — Fine-tune Candidates

RFC-013 §3.7 per-canonical-term WER (formulation B). Top terms drive the May 13 fine-tune; click a row to drill into containing utterances. The allocation preview at the bottom combines WER severity with raw restaurant/menu frequency for RFC-019 planning.

Keep-for-training proposals

Clusters whose effective training treatment is keep_for_training (Sonnet's suggestion or an operator override). These feed the fine-tune. Select rows to bulk-change a decision (e.g. demote a cluster to drop); expand a row to audit up to 20 sample errors. The per-term-WER snapshot + allocation preview below are read-only.

Snapshot

A snapshot = canonical_term_stats keyed by corpus_run_id. Recompute via scripts/compute_per_term_wer.py --stt-model <m> --corpus-run-id <tag> after each generation/STT run. After a forgiveness rule change (_MORPH_EQUIV / _REPLACEMENTS) the numbers don't move until you re-run backfill_stt_metrics --reclassify-all then compute_per_term_wer against the same corpus_run_id.

Top terms by per_term_wer

Server-side paginated for the selected snapshot (scales to the full ~200k canonicals). Filter by per_term_wer range, base_dish search, and dish_type; min_occ (n_gt ≥) is a secondary noise floor. Click a row to drill into its utterances.

Frequency-aware allocation preview

RFC-019 planning view. Frequency comes from canonical_term_stats → menu_item_algo_stage → menu_items → restaurant_listings, not coverage_count. The matrix and scatter explain the proposed K tiers; the table shows the highest-priority rows to audit before generation.

K Tier Distribution

Frequency Summary

Top priority rows

Cong — Order Essentials

RFC-014 §3.3 per-entity accuracy. Order-essential entities (phone_number, address, item_count, intent_verb) sit in the priority-2 fine-tune tier; others (modifier, allergen, dietary, pickup_time, payment_method, person_name) are tier-1.

Entity hit-rate

hit = match in {exact, equivalent}; miss = match in {partial, missing}. Click a row to drill into the misses for that type. Run scripts/llm_entity_extract.py against the cloud DB to populate.