{"id":"47272b18-ea79-4ce1-a930-572f657125b4","shortId":"Q4V3Zk","kind":"skill","title":"user-feedback-synthesizer","tagline":"Synthesize user interview transcripts and feedback files into a prioritized insight report with themes, quotes, and open questions. Use when analyzing batches of user interviews, support tickets, or survey responses. Triggers: 'synthesize feedback', 'analyze user interviews', 'us","description":"# User Feedback Synthesizer\n\nThis skill reads a set of user interview transcripts, support tickets, and survey feedback files (`.md`, `.txt`, `.csv`) and generates a structured insight report: recurring themes ranked by frequency, supporting quotes as evidence, prioritized insights, and open questions. Output is saved as `feedback-insights-YYYY-MM-DD.md`.\n\n**Input:**\n- Folder path or list of `.md` / `.txt` / `.csv` files containing user feedback\n- Optional: research question or focus area (e.g., \"focus on onboarding pain points\")\n- Optional: output format preference (brief / detailed)\n\n**Output:**\n- `feedback-insights-YYYY-MM-DD.md` — structured report with Executive Summary, Themes, Prioritized Insights, Evidence Bank, Open Questions\n\n---\n\n## Language Detection\n\nDetect the user's language from their message:\n- If Russian (or contains Cyrillic): respond in Russian and use Russian labels for all structured outputs (table headers, signal types, section titles, status messages)\n- If English (or other Latin-script language): respond in English\n- If ambiguous: respond in the language of the trigger phrase used\n\n**Russian output labels:**\n- Signal types: Проблема (Pain), Желание (Desire), Похвала (Compliment), Путаница (Confusion)\n- Section titles: Выводы (Executive Summary), Темы (Themes), Приоритизированные Идеи (Prioritized Insights), Открытые Вопросы (Open Questions), Обработанные Файлы (Files Processed)\n- Table headers: Приоритет (Priority), Идея (Insight), Тема (Theme), Источники (Sources)\n- Notes: use Russian equivalents for all standard notes (\"Обнаружены противоречивые сигналы\" for split signals, \"Обработано [N] файлов\" for file counts, etc.)\n\n---\n\n## Instructions\n\n### Step 1: Validate Input\n\n1. Determine input source from the user's message:\n   - Folder path → scan all `.md`, `.txt`, and `.csv` files in that folder\n   - List of files → use those files directly\n   - No path provided → scan the current working directory for `.md`, `.txt`, and `.csv` files\n\n2. Verify files exist and are readable:\n   - If no files found at path: stop. Report \"No .md, .txt, or .csv files found at [path]. Provide a folder path or list of files to process.\"\n   - If a specific file path does not exist: stop. Report \"File not found: [path]. Check the path and try again.\"\n\n3. Check for unsupported formats:\n   - If user provides only `.docx`, `.xlsx`, `.pdf`, or similar: stop. Report \"Unsupported file types. This skill processes .md, .txt, and .csv files only. Convert files first.\"\n\n4. Check for empty files:\n   - If all files are empty: stop. Report \"All provided files are empty. Add feedback content and try again.\"\n   - If some files are empty: note them; skip during processing; include in \"Files with no signals\" list.\n\n5. Note research question if provided; if not provided, add note \"No focus area specified — synthesizing all themes found\".\n\n6. If fewer than 3 files: add note \"Pattern detection is limited with fewer than 3 sources — findings may reflect individual opinions rather than trends.\"\n\n### Step 2: Read and Extract Signals\n\n1. For `.md` and `.txt` files:\n   - Read full content\n   - Extract atomic feedback signals: problems, desires, complaints, compliments, questions, feature requests\n   - For each signal: record text, approximate location (filename, section/line), and signal type\n\n2. For `.csv` files:\n   - Read header row to identify content columns (look for headers containing: \"comment\", \"feedback\", \"response\", \"text\", \"answer\", \"note\", \"message\")\n   - Treat each non-header row as a separate feedback item\n   - If no obvious content column found: use all non-ID, non-timestamp columns; record the column names used in the output under \"Files Processed\" section (note: \"CSV columns processed: [list]\")\n   - Treat each row as equivalent to one feedback source item\n\n3. Signal types to identify:\n   - **Pain** — user expresses a problem, friction, or complaint\n   - **Desire** — user expresses a wish, need, or feature request\n   - **Compliment** — user expresses satisfaction or positive experience\n   - **Confusion** — user expresses uncertainty, misunderstanding, or asks \"why\" / \"how\"\n\n4. Extract verbatim quotes for high-signal sentences (surprising, specific, or emotionally charged phrases)\n\n### Step 3: Cluster Signals into Themes\n\n1. Group extracted signals into named themes:\n   - A theme = a topic that appears in 2+ signals across the dataset\n   - Name each theme with a clear, descriptive label (e.g., \"Onboarding complexity\", \"Missing export feature\")\n   - Assign dominant signal type to each theme (Pain / Desire / Compliment / Confusion)\n\n2. Count per theme:\n   - **Source count**: number of distinct files mentioning this theme\n   - **Mention count**: total number of signals mapped to this theme\n\n3. Handle conflicting signals:\n   - If theme has both Pain and Compliment signals: flag as \"split signal\" in output\n   - Include both perspectives in the theme description\n\n4. Single-source signals:\n   - If a signal appears in only 1 file: do not create a standalone theme\n   - Instead, group under a \"Minor signals\" section in Open Questions\n\n### Step 4: Rank Themes\n\n1. Sort themes by **source count** (number of distinct files) — descending\n2. Secondary sort: by mention count — descending\n3. Include all themes with source count ≥ 2 in the main Themes section\n4. Single-source themes move to Open Questions\n\n### Step 5: Select Evidence Quotes\n\n1. For each top theme (up to top 7):\n   - Select 1–2 representative verbatim quotes\n   - Prefer quotes that are: specific, emotionally expressive, or particularly clear\n   - Record source filename for each quote\n\n2. Do not paraphrase or summarize quotes — use exact text from the source file\n\n### Step 6: Build Prioritized Insights\n\n1. Convert top themes into actionable insight statements:\n   - Insight = a clear statement of what users need, experience, or believe\n   - Format: \"[Signal type]: [User segment / context] [verb phrase] [specific problem or need]\"\n   - Example: \"Pain: Users lose context when navigating between dashboard tabs\"\n\n2. Assign priority:\n   - **High** — theme appears in 3+ source files\n   - **Medium** — theme appears in exactly 2 source files\n   - **Low** — theme appears in 1 file (listed in Open Questions, not Insights table)\n\n### Step 7: Identify Open Questions\n\n1. Collect:\n   - Single-source signals (potentially important but unconfirmed)\n   - Conflicting signals where both perspectives exist\n   - Gaps: topics that are conspicuously absent (e.g., \"no feedback on pricing despite pricing page focus\")\n   - Questions raised by the data but not answerable from current sources\n\n2. Format as actionable research questions where possible:\n   - \"Is [X] a widespread issue or limited to [segment]?\"\n   - \"Does [observed behavior] apply to new users only?\"\n\n### Step 8: Check Output File and Write\n\n1. Determine output date:\n   - Use today's date in YYYY-MM-DD format\n\n2. Check if `feedback-insights-[date].md` already exists in working directory:\n   - If yes: ask user — \"File feedback-insights-[date].md already exists. Overwrite or save as feedback-insights-[date]-v2.md?\"\n   - Wait for response before writing\n\n3. Write `feedback-insights-YYYY-MM-DD.md` using the Output Format below\n\n4. Report in chat: \"Insights saved: feedback-insights-[date].md — [N] files processed, [N] themes identified, [N] insights\"\n\n---\n\n## Output Format\n\nSee `templates/feedback-insights-template.md` for the complete output file structure.\n\nSummary of sections:\n\n```markdown\n# Feedback Insights — [Date]\n\n**Sources:** [N] files | **Signals extracted:** [N] | **Themes identified:** [N]\n[Note: large input / limited sources / language mix / focus area — if applicable]\n\n---\n\n## Executive Summary\n[3–5 sentences: main findings, top 2–3 themes, overall signal health]\n\n---\n\n## Themes\n### 1. [Theme Name] — [N] sources, [N] mentions\n- **Signal type:** Pain / Desire / Compliment / Confusion [/ Split signal]\n- **Description:** [what users say about this theme, 1–3 sentences]\n- **Evidence:**\n  - \"[Verbatim quote]\" — [source-file.md]\n\n### 2. [Theme Name] — [N] sources, [N] mentions\n...\n\n---\n\n## Prioritized Insights\n\n| Priority | Insight | Theme | Sources |\n|----------|---------|-------|---------|\n| High     | [insight statement] | [Theme] | [N] files |\n\n---\n\n## Open Questions\n- [Research question or knowledge gap]\n\n---\n\n## Files Processed\nFiles included: [list]\nFiles with no signals: [list, or \"None\"]\n[Split signals flagged: [list, or omit]]\n```\n\n**Field rules:**\n- Themes: ranked by source count (distinct files), not total mentions\n- Quotes: verbatim from source files; never paraphrased\n- Insights: specific actionable statements, not generic observations\n- Priority: High ≥ 3 files | Medium = 2 files | Low = 1 file (→ Open Questions)\n\n---\n\n## Edge Cases\n\n1. **Fewer than 3 source files** — process normally; add note about limited pattern detection\n2. **CSV with no obvious content column** — use all non-ID/timestamp columns; note column names used\n3. **Mixed-language files (EN + RU)** — process both; group by theme regardless of language; note mix in output\n4. **Split signals (conflicting opinions on same topic)** — include both; flag theme as \"Split signal\"\n5. **Very large input (50+ files or 20,000+ words)** — process all; add header note: \"Large input: [N] files\"\n6. **No focus area provided** — proceed with open synthesis; add note in output header\n7. **Output file already exists** — ask user before overwriting\n\n---\n\n## Negative Cases\n\n- **No files found at path:** Stop. Report \"No .md, .txt, or .csv files found at [path].\"\n- **Unsupported file types only (.docx, .pdf, .xlsx):** Stop. Report \"Unsupported file types. Convert to .md, .txt, or .csv first.\"\n- **All files empty:** Stop. Report \"All provided files are empty.\"","tags":["user","feedback","synthesizer","claude","skills","kit","kirkruglov","agent-skills","agentic-skills","ai-agents","ai-skills","awesome-list"],"capabilities":["skill","source-kirkruglov","skill-user-feedback-synthesizer","topic-agent-skills","topic-agentic-skills","topic-ai-agents","topic-ai-skills","topic-awesome-list","topic-claude","topic-claude-ai","topic-claude-ai-skills","topic-claude-code","topic-claude-cowork","topic-claude-memory","topic-claude-skills"],"categories":["claude-skills-kit"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/KirKruglov/claude-skills-kit/user-feedback-synthesizer","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add KirKruglov/claude-skills-kit","source_repo":"https://github.com/KirKruglov/claude-skills-kit","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (9,775 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:39.322Z","embedding":null,"createdAt":"2026-05-18T13:21:17.395Z","updatedAt":"2026-05-18T19:13:39.322Z","lastSeenAt":"2026-05-18T19:13:39.322Z","tsv":"'/timestamp':1282 '000':1330 '1':254,257,474,640,743,765,810,820,860,923,937,1011,1143,1165,1250,1256 '2':299,469,506,654,684,776,790,821,841,901,916,979,1025,1136,1172,1247,1270 '20':1329 '3':353,447,458,581,635,707,783,908,1064,1130,1137,1166,1244,1259,1288 '4':384,619,732,762,796,1072,1307 '5':424,806,1131,1322 '50':1326 '6':443,856,1341 '7':818,933,1355 '8':1005 'absent':958 'across':656 'action':865,982,1237 'add':401,433,449,1264,1334,1350 'alreadi':1033,1048,1358 'ambigu':179 'analyz':25,38 'answer':525,975 'appear':652,740,906,913,921 'appli':999 'applic':1127 'approxim':499 'area':106,437,1125,1344 'ask':616,1040,1360 'assign':673,902 'atom':484 'bank':130 'batch':26 'behavior':998 'believ':878 'brief':117 'build':857 'case':1255,1365 'charg':632 'chat':1075 'check':347,354,385,1006,1026 'clear':664,834,870 'cluster':636 'collect':938 'column':516,543,553,556,568,1276,1283,1285 'comment':521 'complaint':489,593 'complet':1097 'complex':669 'compliment':199,490,603,682,717,1154 'conflict':709,947,1310 'confus':201,610,683,1155 'conspicu':957 'contain':98,146,520 'content':403,482,515,542,1275 'context':884,895 'convert':381,861,1394 'count':250,685,689,698,770,781,789,1222 'creat':747 'csv':62,96,273,297,318,378,508,567,1271,1377,1399 'current':290,977 'cyril':147 'dashboard':899 'data':972 'dataset':658 'date':1014,1018,1031,1046,1057,1081,1107 'dd':1023 'descend':775,782 'descript':665,731,1158 'desir':197,488,594,681,1153 'despit':964 'detail':118 'detect':134,135,452,1269 'determin':258,1012 'direct':284 'directori':292,1037 'distinct':692,773,1223 'docx':362,1386 'domin':674 'e.g':107,667,959 'edg':1254 'emot':631,830 'empti':387,393,400,411,1403,1410 'en':1293 'english':168,177 'equival':234,575 'etc':251 'evid':77,129,808,1168 'exact':849,915 'exampl':891 'execut':124,205,1128 'exist':302,340,952,1034,1049,1359 'experi':609,876 'export':671 'express':588,596,605,612,831 'extract':472,483,620,642,1112 'featur':492,601,672 'feedback':3,10,37,43,58,100,402,485,522,537,578,961,1029,1044,1055,1079,1105 'feedback-insight':1028,1043,1054,1078 'feedback-insights-yyyy-mm-dd.md':87,120,1066 'fewer':445,456,1257 'field':1216 'file':11,59,97,219,249,274,280,283,298,301,308,319,330,336,343,370,379,382,388,391,398,409,419,448,479,509,563,693,744,774,854,910,918,924,1008,1042,1084,1099,1110,1190,1198,1200,1203,1224,1232,1245,1248,1251,1261,1292,1327,1340,1357,1367,1378,1383,1392,1402,1408 'filenam':501,837 'find':460,1134 'first':383,1400 'flag':719,1212,1317 'focus':105,108,436,967,1124,1343 'folder':89,266,277,325 'format':115,357,879,980,1024,1070,1092 'found':309,320,345,442,544,1368,1379 'frequenc':73 'friction':591 'full':481 'gap':953,1197 'generat':64 'generic':1240 'group':641,752,1297 'handl':708 'header':160,222,511,519,532,1335,1354 'health':1141 'high':625,904,1185,1243 'high-sign':624 'id':549,1281 'identifi':514,585,934,1088,1115 'import':944 'includ':417,725,784,1201,1315 'individu':463 'input':88,256,259,1119,1325,1338 'insight':15,67,79,128,212,226,859,866,868,930,1030,1045,1056,1076,1080,1090,1106,1180,1182,1186,1235 'instead':751 'instruct':252 'interview':7,29,40,52 'issu':991 'item':538,580 'knowledg':1196 'label':154,191,666 'languag':133,139,174,183,1122,1291,1302 'larg':1118,1324,1337 'latin':172 'latin-script':171 'limit':454,993,1120,1267 'list':92,278,328,423,570,925,1202,1207,1213 'locat':500 'look':517 'lose':894 'low':919,1249 'main':793,1133 'map':703 'markdown':1104 'may':461 'md':60,94,270,294,315,375,476,1032,1047,1082,1374,1396 'medium':911,1246 'mention':694,697,780,1149,1178,1227 'messag':142,166,265,527 'minor':755 'miss':670 'misunderstand':614 'mix':1123,1290,1304 'mixed-languag':1289 'mm':1022 'move':801 'n':246,1083,1086,1089,1109,1113,1116,1146,1148,1175,1177,1189,1339 'name':557,645,659,1145,1174,1286 'navig':897 'need':599,875,890 'negat':1364 'never':1233 'new':1001 'non':531,548,551,1280 'non-head':530 'non-id':547,1279 'non-timestamp':550 'none':1209 'normal':1263 'note':231,238,412,425,434,450,526,566,1117,1265,1284,1303,1336,1351 'number':690,700,771 'observ':997,1241 'obvious':541,1274 'omit':1215 'onboard':110,668 'one':577 'open':21,81,131,215,759,803,927,935,1191,1252,1348 'opinion':464,1311 'option':101,113 'output':83,114,119,158,190,561,724,1007,1013,1069,1091,1098,1306,1353,1356 'overal':1139 'overwrit':1050,1363 'page':966 'pain':111,195,586,680,715,892,1152 'paraphras':844,1234 'particular':833 'path':90,267,286,311,322,326,337,346,349,1370,1381 'pattern':451,1268 'pdf':364,1387 'per':686 'perspect':727,951 'phrase':187,633,886 'point':112 'posit':608 'possibl':986 'potenti':943 'prefer':116,825 'price':963,965 'priorit':14,78,127,211,858,1179 'prioriti':224,903,1181,1242 'problem':487,590,888 'proceed':1346 'process':220,332,374,416,564,569,1085,1199,1262,1295,1332 'provid':287,323,360,397,429,432,1345,1407 'question':22,82,103,132,216,427,491,760,804,928,936,968,984,1192,1194,1253 'quot':19,75,622,809,824,826,840,847,1170,1228 'rais':969 'rank':71,763,1219 'rather':465 'read':47,470,480,510 'readabl':305 'record':497,554,835 'recur':69 'reflect':462 'regardless':1300 'report':16,68,122,313,342,368,395,1073,1372,1390,1405 'repres':822 'request':493,602 'research':102,426,983,1193 'respond':148,175,180 'respons':34,523,1061 'row':512,533,573 'ru':1294 'rule':1217 'russian':144,150,153,189,233 'satisfact':606 'save':85,1052,1077 'say':1161 'scan':268,288 'script':173 'secondari':777 'section':163,202,565,757,795,1103 'section/line':502 'see':1093 'segment':883,995 'select':807,819 'sentenc':627,1132,1167 'separ':536 'set':49 'signal':161,192,244,422,473,486,496,504,582,626,637,643,655,675,702,710,718,722,736,739,756,880,942,948,1111,1140,1150,1157,1206,1211,1309,1321 'similar':366 'singl':734,798,940 'single-sourc':733,797,939 'skill':46,373 'skill-user-feedback-synthesizer' 'skip':414 'sort':766,778 'sourc':230,260,459,579,688,735,769,788,799,836,853,909,917,941,978,1108,1121,1147,1176,1184,1221,1231,1260 'source-file.md':1171 'source-kirkruglov' 'specif':335,629,829,887,1236 'specifi':438 'split':243,721,1156,1210,1308,1320 'standalon':749 'standard':237 'statement':867,871,1187,1238 'status':165 'step':253,468,634,761,805,855,932,1004 'stop':312,341,367,394,1371,1389,1404 'structur':66,121,157,1100 'summar':846 'summari':125,206,1101,1129 'support':30,54,74 'surpris':628 'survey':33,57 'synthes':4,5,36,44,439 'synthesi':1349 'tab':900 'tabl':159,221,931 'templates/feedback-insights-template.md':1094 'text':498,524,850 'theme':18,70,126,208,228,441,639,646,648,661,679,687,696,706,712,730,750,764,767,786,794,800,814,863,905,912,920,1087,1114,1138,1142,1144,1164,1173,1183,1188,1218,1299,1318 'ticket':31,55 'timestamp':552 'titl':164,203 'today':1016 'top':813,817,862,1135 'topic':650,954,1314 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agents' 'topic-ai-skills' 'topic-awesome-list' 'topic-claude' 'topic-claude-ai' 'topic-claude-ai-skills' 'topic-claude-code' 'topic-claude-cowork' 'topic-claude-memory' 'topic-claude-skills' 'total':699,1226 'transcript':8,53 'treat':528,571 'trend':467 'tri':351,405 'trigger':35,186 'txt':61,95,271,295,316,376,478,1375,1397 'type':162,193,371,505,583,676,881,1151,1384,1393 'uncertainti':613 'unconfirm':946 'unsupport':356,369,1382,1391 'us':41 'use':23,152,188,232,281,545,558,848,1015,1067,1277,1287 'user':2,6,28,39,42,51,99,137,263,359,587,595,604,611,874,882,893,1002,1041,1160,1361 'user-feedback-synthes':1 'v2.md':1058 'valid':255 'verb':885 'verbatim':621,823,1169,1229 'verifi':300 'wait':1059 'widespread':990 'wish':598 'word':1331 'work':291,1036 'write':1010,1063,1065 'x':988 'xlsx':363,1388 'yes':1039 'yyyi':1021 'yyyy-mm-dd':1020 'вопросы':214 'выводы':204 'желание':196 'идеи':210 'идея':225 'источники':229 'обнаружены':239 'обработанные':217 'обработано':245 'открытые':213 'похвала':198 'приоритет':223 'приоритизированные':209 'проблема':194 'противоречивые':240 'путаница':200 'сигналы':241 'тема':227 'темы':207 'файлов':247 'файлы':218","prices":[{"id":"d0f6eacd-711e-4373-971a-62f2e343bf86","listingId":"47272b18-ea79-4ce1-a930-572f657125b4","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"KirKruglov","category":"claude-skills-kit","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:17.395Z"}],"sources":[{"listingId":"47272b18-ea79-4ce1-a930-572f657125b4","source":"github","sourceId":"KirKruglov/claude-skills-kit/user-feedback-synthesizer","sourceUrl":"https://github.com/KirKruglov/claude-skills-kit/tree/main/skills/user-feedback-synthesizer","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:17.395Z","lastSeenAt":"2026-05-18T19:13:39.322Z"}],"details":{"listingId":"47272b18-ea79-4ce1-a930-572f657125b4","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"KirKruglov","slug":"user-feedback-synthesizer","github":{"repo":"KirKruglov/claude-skills-kit","stars":7,"topics":["agent-skills","agentic-skills","ai","ai-agents","ai-skills","awesome-list","claude","claude-ai","claude-ai-skills","claude-code","claude-cowork","claude-memory","claude-skills","memory-management","productivity","productivity-tools","project-management"],"license":"mit","html_url":"https://github.com/KirKruglov/claude-skills-kit","pushed_at":"2026-05-18T04:27:46Z","description":"40+ curated agent skills for Claude Cowork and Claude.ai — ready-to-use tools for non-technical users: project management, productivity, and AI workflow automation","skill_md_sha":"a238c1ffcc613020b668d50b00b2ea1a69791ec2","skill_md_path":"skills/user-feedback-synthesizer/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/KirKruglov/claude-skills-kit/tree/main/skills/user-feedback-synthesizer"},"layout":"multi","source":"github","category":"claude-skills-kit","frontmatter":{"name":"user-feedback-synthesizer","description":"Synthesize user interview transcripts and feedback files into a prioritized insight report with themes, quotes, and open questions. Use when analyzing batches of user interviews, support tickets, or survey responses. Triggers: 'synthesize feedback', 'analyze user interviews', 'user feedback report', 'синтезируй фидбек', 'разбери транскрипты', 'отчёт по фидбеку'."},"skills_sh_url":"https://skills.sh/KirKruglov/claude-skills-kit/user-feedback-synthesizer"},"updatedAt":"2026-05-18T19:13:39.322Z"}}