feedback

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, tasting notes, and drink format.

13 stars

Best use case

feedback is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

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, tasting notes, and drink format.

Teams using feedback should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/feedback/SKILL.md --create-dirs "https://raw.githubusercontent.com/julianleopold/gaggimate-mcp/main/agent-skills/feedback/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/feedback/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How feedback Compares

Feature / AgentfeedbackStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

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, tasting notes, and drink format.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Shot Feedback & Dialing Skill

You are gathering shot feedback, diagnosing extraction, recording results, and recommending the next adjustment.

> Adapted from [gaggimate-barista](https://github.com/charleshall888/gaggimate-barista) by Charlie Hall.

## Context

Knowledge files are available on-demand via the `read_knowledge` MCP tool. Load only what's needed:
- `read_knowledge(action="read", filename="ESPRESSO_BREWING_BASICS")` — adjustment strategies, diagnostic decision tree, variable hierarchy
- `read_knowledge(action="read", filename="ESPRESSO_TASTING_GUIDE")` — sour vs bitter diagnosis, tasting methodology
- `read_knowledge(action="read", filename="PRESSURE_GUIDE")` — when feedback suggests pressure/profile style change
- `read_knowledge(action="read", filename="MILK_AND_DRINKS")` — when shot is dialed in and user wants drink recommendations

---

## Workflow

### 1. GATHER Context

- Read `manage_user_setup(action="read")` to load the user's equipment, basket size, and preferences.
- Read `manage_coffee(action="list")` to check for existing coffee tracking files, then load the relevant one via `manage_coffee(action="read", coffee_name="...")`.
- If no coffee context exists: ask the user what coffee they're brewing before proceeding.
- **Stale check:** If roast date is 30+ days old, gently ask if user is still on this bag.

### 2. COLLECT Feedback

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 |
| **Dose out** | Ask if not offered | Output weight — needed for ratio |
| **Shot ID** | Optional | From `list_recent_shots` if user doesn't provide |

**Minimum viable feedback:** Rating + balance + one specific observation.

**Dose in & dose out:** The brew ratio (dose in : dose out) is important for diagnosis and tracking. Make sure both are captured:
- For dose out: if a BT scale is connected, check `final_weight_g` in `analyze_shot` output first. If telemetry is unavailable or looks unreliable, ask the user.
- For dose in: ask if not volunteered — it should match the basket size from `manage_user_setup`.
- If the user doesn't mention either, ask casually: "What were your dose in and output weight?"
- Log both in shot notes via `dose_in` and `dose_out` parameters.

**Scale data handling:** Prefer telemetry for dose out when a shot ID is available (see `read_knowledge(action="read", filename="diagnostics/TELEMETRY_PATTERNS")` for scale artifact detection). If telemetry is unavailable or looks unreliable, just ask the user.

### 3. ANALYZE & RECOMMEND

Load these knowledge files for diagnosis:
- `read_knowledge(action="read", filename="ESPRESSO_BREWING_BASICS")` — variable hierarchy (grind → ratio → temp → pressure → puck prep) and diagnostic decision tree
- `read_knowledge(action="read", filename="ESPRESSO_TASTING_GUIDE")` — taste diagnosis and the Scott Rao channeling rule (sour + bitter = channeling → fix puck prep, NOT grind)
- `read_knowledge(action="read", filename="diagnostics/DIAGNOSTIC_TREES")` — full diagnostic decision trees for complex cases

Apply the diagnostic rules to the user's feedback. Always explain *why* you're suggesting a change. One primary recommendation, one backup.

### 4. RECORD

Do all of these automatically after feedback is collected:

#### 4a. Shot Notes → Device (via MCP)

If 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)
```

#### 4b. Coffee Tracking (via MCP)

Log a brewing journal entry to the coffee's tracking file — analysis, not raw numbers:
```
manage_coffee(
  action="log_entry",
  coffee_name="[coffee-name]",
  entry_date="YYYY-MM-DD",
  entry_headline="Grind [X], [Profile Name] — [X/5]",
  entry_body="[Agent's analysis: what worked, what didn't, taste description, what to try next. Reference shot ID if available.]"
)
```

The journal entry should capture *thinking*, not numbers. Include:
- What the shot tasted like and why (connect to extraction theory)
- What worked well and what didn't
- Specific recommendation for next shot
- Shot ID reference if available (for `analyze_shot` later)

If no coffee tracking file exists yet, create one first:
```
manage_coffee(
  action="create",
  coffee_name="[coffee-name]",
  roaster="...",
  origin="...",
  process="...",
  roast_level="...",
  roaster_notes="[tasting notes from bag]",
  approach="[Profile name] at [temp]. [Pressure logic reasoning]. Starting at grind [X], [dose]g in, targeting 1:[ratio]. [Why this approach suits this bean.]"
)
```

#### 4c. Grind Map (if 4+ stars)

**If 4+ stars AND grind setting provided**, add to the grind map:
```
manage_grind_map(
  action="add_entry",
  coffee="[name]",
  roast="[light/medium/dark]",
  process="[washed/natural/honey/anaerobic]",
  origin="[country/region]",
  days_off_roast="[X days]",
  grind="[setting]",
  profile="[name]",
  ratio="1:X",
  temp="X°C",
  rating="X/5",
  date="YYYY-MM-DD"
)
```

#### 4d. Brewing Insights (when patterns emerge)

When a meaningful pattern emerges (not after every shot), update the cross-coffee insights:
1. Read current insights: `manage_brewing_insights(action="read")` (or init via `manage_brewing_insights(action="init")` if it doesn't exist)
2. Update with the new learning:
```
manage_brewing_insights(
  action="write",
  content="[updated full markdown with the new insight added to the appropriate section]"
)
```

**When to update brewing insights:**
- Coffee is dialed in (4+ stars, balanced) — record what worked and why
- A clear pattern emerges (e.g. "declining pressure works for all medium-roast honeys we've tried")
- A surprising finding worth remembering across coffees

**When NOT to update:** After every single shot. Only when there's a genuine cross-coffee learning.

### 5. SUGGEST Next Steps

Based on the analysis:

**If still dialing in (rating < 4 or not balanced):**
- State the specific change for the next shot
- Explain what to watch for ("Time to first drip should increase" / "Look for more body")

**If dialed in (rating 4+ AND balanced):**
- Celebrate briefly
- Recommend a drink format based on shot character:

| 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 → reference MILK_AND_DRINKS.md knowledge file.

---

## Integration with Other Skills

- For deeper shot telemetry analysis → suggest `/diagnose`
- For profile modifications → suggest `/gaggimate-profiles`
- For a new coffee → suggest `/new-coffee`

---

## Quick Reference

**User says:** "3 stars, sour, grind 12, 22g in"
**Action:** Gather context → analyze → record journal entry (analysis, not numbers) → diagnose (sour = extract more) → recommend grind/yield change

**User says:** "5 stars, balanced, amazing sweetness"
**Action:** Gather context → celebrate → record journal entry → add to grind map → update brewing insights if pattern emerged → recommend drink format

**User says:** "it was sour AND bitter"
**Action:** Gather context → diagnose **channeling** → recommend puck prep fix, NOT grind change → record journal entry

Related Skills

new-coffee

13
from julianleopold/gaggimate-mcp

Research a new coffee bean and propose starting extraction parameters. Use when: (1) user shares a new bag of coffee (photo, name, or description), (2) user says "new beans", "dialing in a new coffee", (3) user asks "where should I start with this coffee". Accepts bag photos (extracts info via vision) or text descriptions. Researches origin, process, roast level via web search, then recommends temperature, grind, ratio, and profile.

knowledge-lookup

13
from julianleopold/gaggimate-mcp

Answer espresso knowledge questions from the authoritative knowledge files. Use when the user asks about: temperature, pressure, ratios, grind settings, freshness, extraction theory, puck prep, channeling, baskets, decaf, blends, milk steaming, drink specs, profiles, shot styles, or any espresso concept. Routes to the correct knowledge file and answers from its content rather than from memory or training data.

gaggimate-profiles

13
from julianleopold/gaggimate-mcp

Create custom espresso extraction profiles for Gaggimate-equipped machines (Gaggia Classic Pro, Gaggia Classic Evo, Rancilio Silvia). Use when designing pressure profiles, flow profiles, blooming profiles, lever simulation profiles, or helping with espresso extraction settings and troubleshooting. Also use when the user mentions Gaggimate, espresso profiles, pressure profiling, or extraction parameters.

diagnose

13
from julianleopold/gaggimate-mcp

Diagnose espresso extraction issues by correlating machine telemetry with taste feedback. Use when user says: "what went wrong", "analyze that shot", "why did it taste [sour/bitter/flat]", "my shots are inconsistent", or asks about pressure spikes, flow issues, or extraction problems. Fetches shot data via analyze_shot MCP tool, interprets patterns, and provides actionable recommendations.

peer-feedback

11
from aktsmm/Agent-Skills

同僚への半期ピアフィードバック下書きを自動生成する。workIQ で 1:1 チャット・グループチャット・メンション・共通会議・メール・SPO の履歴を収集し、6項目テンプレートに沿ってポジティブかつプロモーション志向で起票する。Use when: ピアフィードバック, フィードバック下書き, 同僚評価, 半期フィードバック, 360度フィードバック。

review-feedback

10
from raddue/crucible

Use when receiving code review feedback, before implementing suggestions, especially if feedback seems unclear or technically questionable - requires technical rigor and verification, not performative agreement or blind implementation

sync-feedback

9
from jpoutrin/product-forge

Review and sync captured feedback to Product Forge

enable-feedback-hooks

9
from jpoutrin/product-forge

Enable feedback capture hooks for the current project

meeting-feedback

9
from coalesce-labs/catalyst

Post-meeting effectiveness feedback and continuous improvement

prototype-feedback

9
from coalesce-labs/catalyst

Build → review → iterate prototype workflow. Structured feedback collection and iteration.

produce-feedback

8
from reidemeister94/development-skills

Use when user wants to produce a factual chronicle of development-skills plugin interactions in the current conversation for later ingestion, or runs /produce-feedback. Pure record, no judgment.

ingest-feedback

8
from reidemeister94/development-skills

Use when user wants to ingest a development-skills feedback report and apply fixes, or runs /ingest-feedback. Challenges every suggestion against the Iron Rules before accepting; most friction points should SKIP. Expect a report path as argument.