Dev surface
Taste exposes two surfaces. /chat is what a customer sees. This page is what an engineer (or external MCP client) sees — 4 Claude Code skills, 6 slash commands, and one MCP server exposing the read-side of Taste.
Per-persona use cases
Use cases by persona — every Claude primitive lives in one of these scenarios (Customer has 6, the other three have 2 each). Click through to trigger one; /chat also has a Run tour button that auto-plays the two customer scenarios with Studio forced on.
Customer
cust_demo · vegan + peanut allergy · prefers thai/med/japanese
- Golden ordermemoryMenuAdvisorRAGcitationsOrderBuilderPreToolUse hookDispatchactive-order contextOpen /chat → "Vegan, under $25" preset →
- Safety-override handoffpre-LLM regex triggerescalation eventHIL holding messageOpen /chat → "Safety-override" preset →
- Compare two restaurants (fan-out)parallel subagent fan-out2× MenuAdvisorsynthesis turncitations from 2 menu docsOpen /chat → "Thai Fresh vs Mediterraneo" preset →
- Change mid-cart (re-plan)iteration loopOrderBuilder re-invocationstate_mutation pendingCartconfirmation-token re-issueOpen /chat → "Actually make it 3 + salad" preset →
- Post-placement "where is it?"state.placedOrders readactive-orders system blockno-op tool path (no place_pending_order)Open /chat → "Where is my order?" preset →
- Refund (Support delegation)request_support toolSupport subagentrefundOrderPostToolUse audit hookstate_mutation refundsOpen /chat → "Cold + late — refund" preset →
Owner
o_thaifresh / o_verts · each manages one restaurant · no auth, persona = ?for=
- View current menuread-side endpointADR-006 persona scopeOpen /owner →
- Upload menu PDFblob uploadCosmos jobmenu-ingest queueDocIntel + Sonnet + Haiku ingest pipelineOpen /owner → Upload →
Driver
drv_001 Maria / drv_005 Priya · ebike fleet · receives Dispatch assignments
- See active assignmentsordersByDriver scope checkfiltered status setOpen /driver →
- Pick up → deliverserver-side ownershipstatus state machineactive-list filterOpen /driver → Mark picked up / delivered →
Agent (HIL)
ag_kim / ag_sam · the return path · view escalated handoffs + reply
- View escalated handoffhandoff inboxconversation snapshottrigger metadataOpen /agent →
- Resolve with a replyresolution writecustomer-side "Check for response"Open /agent → Send & resolve →
Skills
Loaded automatically by Claude Code when the in-session conversation matches its description. The engineer asks a question; the skill's expertise becomes available.
Skill taste-allergen-taxonomy.claude/skills/taste-allergen-taxonomy/SKILL.md ↗Canonical 9-allergen taxonomy + ambiguous-ingredient rulings (does tahini count as sesame?).
Loads when
- Asking Claude Code to tag a dish with allergens
- Explaining allergen reasoning while debugging the Haiku tagger
- Resolving an ambiguous ingredient question
Use cases that invoke it
"What allergens should I tag on a dish that contains tahini and almond butter?"→ Skill auto-loads. Returns: sesame (tahini) + tree_nut (almond). Cites the taxonomy doc.
"The Haiku tagger missed sesame on a hummus dish — what's the rule?"→ Skill loads, explains tahini→sesame is a hard rule in the taxonomy and proposes the fix in ALLERGEN_TAGGER_USER.
Skill taste-eval-judge.claude/skills/taste-eval-judge/SKILL.md ↗How the Opus eval judge scores scenarios — deterministic vs qualitative, calibration heuristics.
Loads when
- Reviewing an eval verdict that feels wrong
- Calibrating a rubric in evals/golden-set.json
- Debugging why a scenario the agent 'clearly passed' got a low score
Use cases that invoke it
"Why did scenario `vegan-peanut-strict` get a 3/5 from the judge?"→ Skill loads. Walks the two-layer scoring split, then reads the rubric + the judge transcript to attribute the deduction.
"Help me write a rubric that the judge won't over-weight on tone."→ Skill loads. Returns the calibration heuristics + a rubric template that anchors on outcomes, not phrasing.
Skill taste-eval-scenario-author.claude/skills/taste-eval-scenario-author/SKILL.md ↗Schema, tag taxonomy, and anti-patterns for authoring a golden-set scenario.
Loads when
- Adding a new entry to evals/golden-set.json
- Fixing a scenario the harness rejected as malformed
- Translating a real bug into a regression scenario
Use cases that invoke it
"Add a regression scenario covering the F-04 spend-cap block."→ Skill loads. Produces a schema-valid entry with deterministic constraints (cart total, hook verdict) + optional judge rubric.
"The harness rejected my new scenario with 'missing rubric.judge_must_cite' — fix it."→ Skill loads. Identifies the missing field, explains the anti-pattern, returns the corrected JSON.
Skill taste-menu-pdf-extract.claude/skills/taste-menu-pdf-extract/SKILL.md ↗Layout heuristics that turn Document Intelligence output into structured Dish records.
Loads when
- Running /taste-onboard-restaurant
- Debugging the ingestMenu queue trigger
- Asking why a dish was extracted with the wrong price or name
Use cases that invoke it
"DocIntel returned this layout JSON — turn it into Dish records."→ Skill loads. Applies the column-detection + price-anchor heuristics; returns a Dish[] matching lib/types.ts.
"Onboarding Thai Fresh missed half the dishes — what went wrong?"→ Skill loads. Walks the section-header rules, points at the heuristic that failed, suggests a layout fixture to add.
Commands
Slash command the engineer types in Claude Code. Deterministic workflow — runs scripts, calls models, returns a structured result.
Command /taste-verify.claude/commands/taste-verify.md ↗Deterministic pre-commit suite — typecheck, hook smoke-test, fixture sanity. Zero Claude calls.
Run it when
- Run before every commit on Phase 1+
- Run when CI fails and you need to repro locally
Use cases that invoke it
/taste-verify→ Runs `npm run typecheck`, smoke-tests the PreToolUse hook with a synthetic cart, sanity-checks fixtures. Reports pass/fail per stage.
Command /taste-eval.claude/commands/taste-eval.md ↗Run the golden-set regression suite. Default mode is deterministic; --judge adds Opus rubric scoring.
Run it when
- After changing a prompt in lib/claude.ts
- Before promoting an ADR-gated change
- Weekly drift check
Use cases that invoke it
/taste-eval→ Runs deterministic checks against evals/golden-set.json. ~$0.02 (one Sonnet call inside MenuAdvisor).
/taste-eval --judge→ Also invokes Opus judge per scenario. ~$0.03/scenario. Use when calibrating rubrics.
Command /taste-cost-report.claude/commands/taste-cost-report.md ↗Aggregate Claude-call telemetry from .taste/telemetry.jsonl — model/agent breakdown + cache-hit trend.
Run it when
- End-of-session cost review
- After a Phase that added new Claude calls
- Debugging a cost spike
Use cases that invoke it
/taste-cost-report→ Prints per-model, per-agent token + $ breakdown for the local telemetry file. No Claude calls — pure file aggregation.
Command /taste-handoff.claude/commands/taste-handoff.md ↗Produce a tight (<500 word) handoff prompt for the next Claude Code session.
Run it when
- End of session
- /compact recommended
- Switching between Taste workstreams
Use cases that invoke it
/taste-handoff→ Reads current branch state + TASKS.md + recent commits, emits a paste-ready handoff covering decisions, files, open questions, next action.
Command /taste-onboard-restaurant.claude/commands/taste-onboard-restaurant.md ↗End-to-end restaurant onboarding — upload PDF to blob, create job, enqueue ingest message.
Run it when
- Phase 3+ — adding a new restaurant to the catalog
Use cases that invoke it
/taste-onboard-restaurant ./menus/thai-fresh.pdf "Thai Fresh" 78704→ Uploads PDF → creates jobs row → enqueues ingestMenu message. Returns in <5s; ingestion (DocIntel → Sonnet extract → Haiku allergen tag → AI Search + Cosmos upsert) runs async.
Command /taste-promote-place-order.claude/commands/taste-promote-place-order.md ↗Architectural change: promote placeOrder from runtime-only to a Claude-callable tool. Requires ADR amendment — does NOT execute silently.
Run it when
- Explicit decision to let the model construct placeOrder payloads directly
Use cases that invoke it
/taste-promote-place-order→ Walks the STOP-list (ADR amendment, schema definition, hook re-validation, eval regression). Refuses to mutate TOOL_SCHEMAS until each is checked.
MCP server
A parallel surface to /chat — same underlying tools, different consumer. External MCP clients (Claude Desktop, Claude Code, third-party agents) drive Taste through this server. Read-side only by ADR-006.
taste-mcptaste-mcp/src/server.ts ↗Streamable-HTTP MCP server exposing Taste over all three MCP primitives (Tools, Resources, Prompts) to external clients — Claude Desktop, Claude Code, third-party agents. Same tools the in-process Concierge uses; different consumer.
Tools (6)
searchRestaurantsFilter catalog by cuisine, allergens, dietary, price.getMenuFull menu for one restaurant.searchMenusHybrid (vector + keyword) semantic search across menus.checkAllergensClassify a dish list against an allergen profile.getOrderHistoryRecent orders for a customer (PII-adjacent; see Resources auth caveat).getDriverETALive ETA for an active order.
Resources (4)
taste://catalogPublicapplication/jsonFull restaurants + dishes.
taste://catalog/summaryPublictext/markdownSame block Concierge prompt-caches — markdown form.
taste://driversOperationalapplication/jsonDriver fixture (Phase 5). Production would redact.
taste://orders/by-customer/{customerId}PIIapplication/jsonDynamic per-customer order list. Demo posture has no auth; production gate requires a signed token in the MCP transport, not a path param.
Prompts (2)
find_dinner(customerId, mood?)Concierge-shaped greeting that loads dietary profile and asks for picks.
complain_about_order(customerId, issue)Opens a support conversation about a specific order. Resolution still routes to human/Support — never through MCP.
NOT exposed (4) — the architectural rule
Capability not present beats capability defended. Write tools stay in-process where the PreToolUse hook and audit trail fire; the MCP server even has a named branch returning tool_not_exposed if a client asks for them.
placeOrderWrite (financial)Charges card, commits inventory. Must traverse Concierge so the PreToolUse fraud + spend-cap hook fires. Bypassing the hook is the whole point of having it.
refundOrderWrite (financial)Moves money. Must traverse Support so the autonomous-refund cap ($20, ADR-001) is enforced and the PostToolUse audit trail fires.
applyPromoWrite (state-changing)Mutates cart pricing; downstream of cart construction. Belongs to OrderBuilder.
memory/<id>.md (resource)PIIAllergies + addresses. Read by in-process runtime only, after Concierge identifies the customer. Never published as a resource.
Drive it from Claude Desktop
Drop this into your claude_desktop_config.json, restart Claude Desktop, then ask "list Taste resources" or invoke the find_dinner prompt.
{
"mcpServers": {
"taste": {
"url": "https://func-taste-dev.azurewebsites.net/api/mcp"
}
}
}