Skip to content
Back to skills

Feedback Pipeline

ASecurity

Autonomous customer feedback intake pipeline: reads new submissions from a Google Sheet, routes each to the correct project owner via a routing table, sends a Slack/chat handoff, tracks response status, monitors SLA, escalates breaches, and emails the customer when resolved. Runs on a 4-hour cron cycle with a 2-hour escalation check. Use when feedback submissions need to reach the right person without manual triage, when SLA compliance is important, or when customer response loops are slow. A...

  • 3 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 29, 2026
ai-agentsrustgobash

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add Tekkiiiii/the-agency --skill feedback-pipeline --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Feedback Pipeline?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Feedback Pipeline
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tekkiiiii-feedback-pipeline/badge)](https://www.skillsdirectory.com/skills/tekkiiiii-feedback-pipeline)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: feedback-pipeline
description: |
  Autonomous customer feedback intake pipeline: reads new submissions from a Google Sheet,
  routes each to the correct project owner via a routing table, sends a Slack/chat handoff,
  tracks response status, monitors SLA, escalates breaches, and emails the customer when
  resolved. Runs on a 4-hour cron cycle with a 2-hour escalation check. Use when feedback
  submissions need to reach the right person without manual triage, when SLA compliance is
  important, or when customer response loops are slow. Also for onboarding new projects into
  the feedback routing system, auditing open feedback, or rebuilding the pipeline state.
triggers:
  - /feedback-pipeline
  - feedback pipeline
  - process feedback
  - new feedback submissions
aliases: []
scope: agency-rooms
dept: [ops]
team: ["team-lead"]
priority: ops
author: agency-rooms
provenance: agency-rooms
last_updated: "2026-04-10"
trust_level: agent-authored
---

# Feedback Pipeline — Skill

## What this does

Autonomous customer feedback intake pipeline:

```
Customer fills Google Form → Sheet row (G=pending)
    │
    │ [Every 4h via cron, or anytime via /feedback-pipeline]
    │
    ├─ 1. Read new "pending" rows from Feedback sheet
    ├─ 2. Route project name → PD slug (routing.json)
    ├─ 3. Assign row (G=assigned, H={slug}-pd)
    ├─ 4. SendMessage to PD + write NEXUS handoff
    │
    │   PD handles work normally
    │
    │   PD signals completion — DUAL MECHANISM:
    │   ├─ SendMessage: "DONE feedback:{row}:{name} Response: {x}"
    │   └─ Sheet col K: set to "DONE"
    │
    ├─ 5. Detect DONE → sheet G=resolved, close row
    ├─ 6. gws gmail send to customer
    ├─ 7. Escalation check every 2h (SLA breach → G=escalated)
    └─ 8. State written to state.json

    Cron: 0 */4 * * *  (main loop)
    Cron: 0 */2 * * *  (escalation only)
```

---

## Files

```
~/.claude/skills/feedback-pipeline/
├── SKILL.md              ← this file
├── routing.json          ← project → PD slug mapping
├── feedback-sheet.ts     ← Google Sheets read/write (11-col schema)
├── feedback-pipeline.ts  ← main orchestrator
└── scripts/
    └── run.sh            ← bash entry for cron

~/.claude/agency-rooms/feedback/feedback-pipeline/
└── state.json            ← pipeline state (checkpoints, per-row state)
```

---

## Sheet Schema

Tab: `Feedback`

| Col | Header | Filled by |
|-----|--------|-----------|
| A | customer_name | Form |
| B | contact_email | Form |
| C | project_product | Form |
| D | feedback_type | Form |
| E | description | Form |
| F | submitted_at | Form |
| G | status | Pipeline (pending→assigned→resolved→closed/escalated) |
| H | assigned_to | Pipeline (PD slug) |
| I | pd_response | Pipeline or manual |
| J | resolved_at | Pipeline |
| K | pd_status | Pipeline/manual ("DONE" triggers completion) |

---

## Setup

### 1. Create Google Sheet + Form

1. Go to Google Sheets → New spreadsheet
2. Rename first tab to `Feedback`
3. Row 1 headers: `customer_name | contact_email | project_product | feedback_type | description | submitted_at | status | assigned_to | pd_response | resolved_at | pd_status`
4. Insert → Form (creates linked Google Form)
5. Configure form fields: Name, Email, Project (dropdown or text), Type (bug/improvement/question/request/complaint), Description
6. Copy the **Sheet ID** from the URL: `docs.google.com/spreadsheets/d/{THIS_PART}/edit`

### 2. Configure

```bash
# Edit state.json — set your sheet ID
cat ~/.claude/agency-rooms/feedback/feedback-pipeline/state.json
# Set "sheet_id" to the ID from step 1.5

# Verify routing.json has your PDs
cat ~/.claude/skills/feedback-pipeline/routing.json
```

### 3. Add routing

Edit `routing.json` to add new projects:
```json
{
  "project_to_pd": {
    "your-project": "your-pd-slug"
  },
  "aliases": {
    "shortcut": "your-project"
  }
}
```

### 4. Test manually

```bash
cd ~/.claude/skills/feedback-pipeline
tsx feedback-pipeline.ts

# Test escalation only
tsx feedback-pipeline.ts escalation
```

### 5. Start cron

```
/loop 4h /feedback-pipeline
/loop 2h "tsx ~/.claude/skills/feedback-pipeline/feedback-pipeline.ts escalation"
```

Or use CronCreate with:
- `0 */4 * * *` — main loop
- `0 */2 * * *` — escalation check

---

## PD Workflow

When a PD receives a feedback task (via SendMessage + NEXUS handoff):

1. Handle the work via normal PD workflow
2. When done, **both** of these:
   - Send team-lead: `DONE feedback:{row}:{customer_name} Response: {what was done}`
   - In the Feedback sheet, set column K (pd_status) to `DONE`

Either mechanism triggers resolution. Both together is fine too.

---

## Routing Resolution Order

1. Exact match in `project_to_pd` keys
2. Alias match → `project_to_pd`
3. Bidirectional partial contains (either direction)
4. Fallback: `fallback_pd` ("team-lead")

---

## State File

`~/.claude/agency-rooms/feedback/feedback-pipeline/state.json`

```json
{
  "last_processed_row": 1,
  "sheet_id": "...",
  "rows": {
    "2": { "status": "assigned", "assigned_to": "examplecrm-pd",
            "email": "...", "escalation_due": "2026-04-14T09:00:00Z",
            "notified_customer": false }
  },
  "sla": { "target_hours": 48, "warning_hours": 36 },
  "stats": { "total_processed": 0, "total_escalated": 0, "last_cycle": null }
}
```

---

## Manual Commands

| Command | What it does |
|---------|-------------|
| `tsx feedback-pipeline.ts` | Full cycle: detect new, route, DONE check, escalate |
| `tsx feedback-pipeline.ts escalation` | Escalation check only |
| `gws sheets +read --spreadsheet SHEET_ID` | Quick peek at sheet |
| `gws gmail send --to "x@y.com" ...` | Send test email |

---

## Troubleshooting

| Issue | Fix |
|-------|-----|
| `sheet_id not set` | Edit `state.json`, set `sheet_id` |
| `state.json not found` | Create at path above, see template in plan |
| PD not getting messages | Verify PD slug in `routing.json` matches actual agent name |
| Email not sending | Run `gws auth status` to check Gmail auth |
| Double-processing | `notified_customer: true` in state prevents re-trigger |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…