Gather shot feedback, analyze extraction, recommend adjustments, and record results. Use when user says: "/feedback", "I just pulled a shot", "how was that", "it tasted [sour/bitter/flat/good]", provides a star rating, shares taste observations, or asks "what should I adjust" after a shot. Owns the full shot feedback loop: gathering, analysis, grind map updates, tasting notes, and drink format.
<command-name>feedback</command-name>
You are gathering shot feedback, diagnosing extraction, recording results, and recommending the next adjustment.
Read these files before proceeding:
user-setup.md — active coffee, basket size, grindercoffees/{dir}/README.md — recent tasting notes, profiles, bean profileknowledge/ESPRESSO_BREWING_BASICS.md — adjustment strategies, diagnostic decision tree, 5g ruleknowledge/ESPRESSO_TASTING_GUIDE.md — sour vs bitter diagnosis, tasting methodology| File | When |
|---|---|
knowledge/PRESSURE_GUIDE.md (152) | Feedback suggests pressure/profile style change |
knowledge/grinders/SETTE_270.md (64) | User provides or asks about grind settings |
grind-map.md | Rating 4-5 stars AND grind setting provided |
knowledge/MILK_AND_DRINKS.md (148) | User asks about drink format, or shot is dialed in (4+ balanced) and user has milk drink preferences |
user-setup.md → Active Coffee sectioncoffees/{dir}/README.md (bean profile, processing, recent tasting notes)Gather from the user (ask for what's missing):
| Field | Required | Notes |
|---|---|---|
| Rating (1-5 stars) | Yes | Overall satisfaction |
| Balance (sour/balanced/bitter) | Yes | Primary extraction indicator |
| Observations | Yes (1+ specific note) | Body, sweetness, finish, flavor, mouthfeel |
| Grind setting | Ask if not offered | Important for tracking |
| Dose in | Ask if not offered | Should match basket size |
| Shot ID | Optional | From list_recent_shots if user doesn't provide |
Minimum viable feedback: Rating + balance + one specific observation.
Weight estimation — NEVER ask the user for cup weight. The BT scale often produces artifacts (spikes, drops to 0g, null readings). Estimate dose out from:
total_volume_ml × 0.82 (puck absorption estimate)A +/-2g estimate is fine for diagnosis and recording.
Use the loaded knowledge files (BREWING_BASICS + TASTING_GUIDE) to diagnose and recommend.
Adjustment hierarchy — adjust in this order:
Critical diagnostic rules:
| Symptom | Diagnosis | Fix |
|---|---|---|
| Sour + fast (<20s) | Under-extracted, grind too coarse | Grind finer |
| Sour + normal time | Under-extracted at correct flow | Increase yield by 5g, then temp |
| Sour + slow (>35s) | Channeling likely | Better puck prep, longer pre-infusion |
| Bitter + slow (>35s) | Over-extracted, grind too fine | Grind coarser |
| Bitter + normal time | Over-extracted at correct flow | Decrease yield by 5g, then temp |
| Sour AND bitter | Channeling — uneven extraction | Fix puck prep (WDT, distribution, even tamp). NOT grind. |
| Balanced but flat | Under-developed | Increase temp 1°C, or try longer ratio |
| Balanced but thin | Low body | Shorter ratio, or finer grind |
The "sour AND bitter" rule (Scott Rao): When a shot tastes both sour and bitter simultaneously, water is finding paths of least resistance — over-extracting some grounds while under-extracting others. The fix is puck prep, not grind. Grinding finer when channeling is present makes it worse.
Always explain why you're suggesting a change. One primary recommendation, one backup.
Do all of these automatically after feedback is collected:
Append a row to the Tasting Notes table in the active coffee's README.md:
| # | Date | Shot | Grind | In/Out | Ratio | Profile | Balance | Stars | Observations |
|---|
/diagnose cross-reference)Trigger conditions (all must be true):
Update process:
grind-map.mdIf a shot ID is available, sync feedback to the device:
manage_shot_notes(shot_id, action="update", rating=X, balance_taste="...", notes="...", grind_setting="...", dose_in=X, dose_out=X)
If a profile was modified based on feedback, overwrite the JSON file in the coffee directory.
.data-repo-path at the project root.
git -C), substituting {private_repo} with the path from .data-repo-path:
git --git-dir={private_repo}/.git --work-tree={private_repo} add -Agit --git-dir={private_repo}/.git --work-tree={private_repo} commit -m "feedback: shot {shot_id} — {rating}★ {balance}"git --git-dir={private_repo}/.git --work-tree={private_repo} pushgit push manually in {private_repo_path} when credentials are available."Based on the analysis:
If still dialing in (rating < 4 or not balanced):
If dialed in (rating 4+ AND balanced):
| Shot Character | Recommended Format |
|---|---|
| Bright, fruity, delicate | Cortado or piccolo |
| Sweet, balanced, medium body | Cappuccino or flat white |
| Intense, heavy body | Latte |
| Clarity-focused, tea-like | Cortado or piccolo |
Core principle: Extract for the bean's best expression first, then match the drink format. Never adjust grind/ratio/pressure/temp to "make the shot work in milk."
If user wants full milk science, steaming technique, or drink recipes → load knowledge/MILK_AND_DRINKS.md.
/diagnose/gaggimate-profiles/new-coffeeUser says: "3 stars, sour, 14E grind, 22g in" Action: Load context → record → diagnose (sour = extract more) → recommend grind/yield change → update tasting notes + shot notes
User says: "5 stars, balanced, amazing sweetness" Action: Load context → celebrate → record to grind map + tasting notes → recommend drink format
User says: "it was sour AND bitter" Action: Load context → diagnose channeling (from BREWING_BASICS line 129) → recommend puck prep fix, NOT grind change → record