Update to Quo
Snapshot Oct 28, 2026 · 12:05 UTC · version 8.1.1
Collection source: downloaded plugin package.
Supporting file metadata differs
Supporting file metadata differs
Observed in package metadata. These changes alone do not establish a new customer-facing feature.
Up to 3 plugins free · no card required.
All fields and original values.
Supporting files
Oct 24, 2026 · 12:47 UTC
[{"relative_path":"references/business-facts.md","size_in_bytes":8651},{"relative_path":"references/industry-presets.md","size_in_bytes":16340},{"relative_path":"references/rubric.md","size_in_bytes":14037},{"relative_path":"references/s...
Oct 28, 2026 · 12:05 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":240},{"relative_path":"references/business-facts.md","size_in_bytes":8651},{"relative_path":"references/industry-presets.md","size_in_bytes":16340},{"relative_path":"references/rubri...
Compare saved observations
Download comparison JSONSKILL.md text changes
− removed · + added
No SKILL.md text changes between these observations.
Full technical diff · 1 changed fields
changed /included_files
[
{
"relative_path": "references/business-facts.md",
"size_in_bytes": 8651
},
{
"relative_path": "references/industry-presets.md",
"size_in_bytes": 16340
},
{
"relative_path": "references/rubric.md",
"size_in_bytes": 14037
},
{
"relative_path": "references/scoring-brief.md",
"size_in_bytes": 7718
},
{
"relative_path": "references/setup-cards.md",
"size_in_bytes": 7902
},
{
"relative_path": "references/sheet-layout.md",
"size_in_bytes": 13397
},
{
"relative_path": "scripts/score.py",
"size_in_bytes": 15750
}
][
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 240
},
{
"relative_path": "references/business-facts.md",
"size_in_bytes": 8651
},
{
"relative_path": "references/industry-presets.md",
"size_in_bytes": 16340
},
{
"relative_path": "references/rubric.md",
"size_in_bytes": 14037
},
{
"relative_path": "references/scoring-brief.md",
"size_in_bytes": 7718
},
{
"relative_path": "references/setup-cards.md",
"size_in_bytes": 7902
},
{
"relative_path": "references/sheet-layout.md",
"size_in_bytes": 13397
},
{
"relative_path": "scripts/score.py",
"size_in_bytes": 15750
}
]Full snapshot data
{
"description": "Build a weekly customer service scorecard for each rep on a small business phone team (home services, cleaning, law firms, franchises, agencies), scored from Quo call transcripts on a weighted rubric (compliance gate, solution, empathy, tone, clarity, efficiency, closing, greeting). Outputs a Google Sheet with a team summary, per-rep scorecards with quoted evidence, a call log with manager overrides, and trends. Use whenever a manager or owner wants to score, grade, QA, or review their team's service calls, for example 'run the weekly scorecard', 'score my reps' calls', 'customer service QA for last week', 'how is my front desk doing on the phones', 'which CSR needs coaching', or wants Quo's scorecard template filled in from real calls. Not for one-person sales coaching (sales-call-coaching), daily team call scoring (daily-call-review), or call volume and answer-rate reporting.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 240
},
{
"relative_path": "references/business-facts.md",
"size_in_bytes": 8651
},
{
"relative_path": "references/industry-presets.md",
"size_in_bytes": 16340
},
{
"relative_path": "references/rubric.md",
"size_in_bytes": 14037
},
{
"relative_path": "references/scoring-brief.md",
"size_in_bytes": 7718
},
{
"relative_path": "references/setup-cards.md",
"size_in_bytes": 7902
},
{
"relative_path": "references/sheet-layout.md",
"size_in_bytes": 13397
},
{
"relative_path": "scripts/score.py",
"size_in_bytes": 15750
}
],
"name": "quo-service-scorecard",
"skill_md_contents": "---\nname: \"quo-service-scorecard\"\ndescription: \"Build a weekly customer service scorecard for each rep on a small business phone team (home services, cleaning, law firms, franchises, agencies), scored from Quo call transcripts on a weighted rubric (compliance gate, solution, empathy, tone, clarity, efficiency, closing, greeting). Outputs a Google Sheet with a team summary, per-rep scorecards with quoted evidence, a call log with manager overrides, and trends. Use whenever a manager or owner wants to score, grade, QA, or review their team's service calls, for example 'run the weekly scorecard', 'score my reps' calls', 'customer service QA for last week', 'how is my front desk doing on the phones', 'which CSR needs coaching', or wants Quo's scorecard template filled in from real calls. Not for one-person sales coaching (sales-call-coaching), daily team call scoring (daily-call-review), or call volume and answer-rate reporting.\"\n---\n\n# Quo customer service scorecard\n\nThis skill produces a weekly scorecard a manager uses to review every rep's customer service\ncalls. It is based on Quo's customer service scorecard template, adapted for phone calls:\n\n- The template's **weighted criteria and auto-fail compliance gate** are kept.\n- Criteria that only fit written channels are **swapped for phone equivalents**.\n- Every score is **backed by evidence** taken from the call transcript.\n\nThe people using it run small businesses: home services, cleaning, law firms, franchises, and\nagencies. The person scored is often an office manager, CSR, dispatcher, intake coordinator, or\nfront desk lead, and has probably never had a call reviewed before. Write for them.\n\nRead these before scoring:\n\n- `references/rubric.md`: the criteria, their 1–5 anchors, the compliance gate, and N/A rules.\n Read it on every run.\n- `references/industry-presets.md`: the weights, what counts as a solution, the compliance\n defaults, and sample wording for each industry. Read only the section for the configured\n industry.\n- `references/scoring-brief.md`: the fixed instructions and JSON format for scoring calls. Use it\n word for word every run, whether you score the calls yourself or hand batches to subagents.\n Scores only trend meaningfully if every week is scored the same way.\n- `references/setup-cards.md`: the two setup cards the owner approves on the first run, with the\n exact format. Read it on the first run, or when the owner asks to change settings.\n- `references/business-facts.md`: how to collect, confirm, store and use the business's own facts\n (prices, policies, service area). Read it on the first run and whenever the facts get refreshed.\n- `references/sheet-layout.md`: the exact tabs, columns, and formatting for the Google Sheet. Read\n it before writing output.\n- `scripts/score.py`: does all the weighted math. Use it, not mental arithmetic, so scores are\n identical from week to week.\n\n## Design principles\n\n1. **Evidence or silence.** Every criterion score comes with:\n - a timestamp,\n - a quote of roughly 15 words or fewer,\n - one line in the form \"earned … / capped by …\".\n\n If the transcript can't support a judgment, mark it N/A or low-confidence. Never guess.\n2. **No bare numbers.** \"Empathy 3/5\" teaches nothing. \"Empathy 3/5: acknowledged the leak was\n stressful, then talked over the customer twice while she described the damage\" teaches\n something.\n3. **Score against the anchors, not against the week.** A slow week does not make a 3 into a 4.\n If scores drift up or down with call volume, the trend line becomes meaningless, and the trend\n line is the main reason to run this weekly.\n4. **Transcripts carry words, not voices.** Judge tone from word choice, interruptions, and how\n the customer responds. Don't claim things only audio would show, like warmth, pace, or sighs.\n Where tone is ambiguous, say so and keep the score near the middle.\n5. **Coach behavior, not outcomes.** A rep controls whether they offered a specific arrival\n window. They don't control whether the customer booked.\n6. **Separate the person from the process.** Sometimes the rep had no way to do better:\n - no price sheet exists,\n - nobody told them the refund policy,\n - they answer phones while also dispatching.\n\n These are **owner action items**, not rep deficits. List them in their own section.\n7. **Two focus areas per rep, at most, plus one win.** A scorecard that lists eight weaknesses\n changes nothing, and one that is all criticism gets ignored.\n8. **Reps get a voice.** Leave the self-assessment and dispute fields blank for the rep to fill\n in. Quo's guidance is that scorecards are for development, not \"gotcha\" moments.\n9. **Be honest about coverage.** Only calls with transcripts are visible. State the limits in the\n words given in `references/sheet-layout.md`.\n\n## Step 1: Find the scorecard sheet, load config, and apply last week's overrides\n\nThe Google Sheet is where everything lives between runs:\n\n- the config,\n- the editable rubric,\n- the call history,\n- the trend data.\n\nUse a link the manager gives you, or search Drive for spreadsheets whose title starts with\n`Customer Service Scorecard — [Business name]`:\n\n- Skip anything with `Archive` in the title.\n- Take the one with the latest year: titles end in a year, like `… — Bright Smile Cleaning 2026`.\n- If that sheet's `Config` has a **Next year's sheet** link, follow it.\n\nThe sheet for this run is the one for the year of the review week's Monday. If a Google Workspace skill is available, load it before your first\nwrite to the sheet.\n\n- **If found:**\n - Read the `Config` and `Rubric` tabs. Use the weights, the owner-confirmed solution\n definition and the **Business facts** from the `Rubric` tab, not the preset defaults, because\n the owner may have edited them. Don't re-ask anything already configured.\n - Open the chat summary with the \"Using your saved settings\" line from `setup-cards.md`. If\n the owner replies **settings**, show the setup cards again.\n - If the Business facts' **Last confirmed** date is more than about 90 days old, add one line\n to this week's chat summary asking whether prices or policies have changed. Don't block the\n run on it.\n - Then do the calibration steps below before you score anything.\n- **If not found:** this is the first run. Do Step 2, then create the sheet in Step 7.\n- **If no Google connector is available:** say so once. Then build the same workbook as an `.xlsx`\n file, using an xlsx/spreadsheet skill if one is available. Ask the manager to upload last week's\n file on the next run so the trend carries over.\n\n### Calibration: learn from manager overrides\n\nThe manager reviews the scorecard after each run and fills in **Manager override score** and\n**Override reason** in the `Call log` for any call they scored differently. Calibration is how two\nreviewers, here the AI and the manager, come to score the same way. That's why it happens here,\nbefore this week's scoring, not after.\n\n1. **Recompute last week's numbers.** Read last week's `Call log` rows. On the first run of a new\n year's sheet, those rows and their overrides live in last year's sheet: follow the **Previous\n year's sheet** link in `Config`. If any have an override:\n - Re-run `scripts/score.py` on those rows, with `override_score` filled in.\n - Update **only last week's** `Trend` rows with the corrected values.\n\n This is the one permitted edit to a past week. Without it, overrides would never reach the\n trend, because they're entered after that week's trend rows are written. The corrected rows\n become `previous` and `previous_team` for this week.\n2. **Read the pattern across all overrides to date.** Use the override reasons, which should name\n the criterion. Summarize it in one or two lines. For example: \"Manager scores Empathy about one\n point higher on complaint calls where the rep apologized early.\"\n3. **Apply that note while scoring this week.** Show it in the weekly tab header so the manager can\n correct it. Save it to `Calibration notes` in `Config`.\n\nIf there are no overrides yet, invite the manager in the chat summary to spot-check two or three\ncalls and override any score they disagree with, naming the criterion in the reason. It's the\nfastest way to tune the scoring.\n\n## Step 2: First-run setup\n\nRun setup as **two setup cards**, using the exact templates in `references/setup-cards.md`. Don't\nask the questions one at a time in conversation. Owners skim chat, and a required question\nburied in a paragraph gets missed. This applies in every app, including ChatGPT, which has no\ntappable question interface.\n\n- **Setup card 1** goes out before anything else. It covers a, b, c, g, h, i and j.\n- **Setup card 2** goes out once card 1 is approved and any training docs have been read. It\n covers d, e and f, the weights, and the Business facts list.\n\nEvery card has the same three sections, always in this order:\n\n1. **Needs your answer:** questions the skill can't answer for the owner, plus anything the owner\n must confirm in their own words, such as the solution definition. These always come first, and\n the heading shows how many there are.\n2. **Found in your Quo account** (on card 2, **Taken from your documents**): values the skill\n looked up. They're likely right, but the owner should check them.\n3. **Defaults:** fine to leave as they are.\n\nThe owner replies with their answers to section 1, any changes to sections 2 and 3, and the word\n**approve**. Don't pull or score any calls until both cards are approved.\n\nItems a–j below describe what each setting means and how to fill it in. `setup-cards.md` says\nwhich section of which card each one goes in.\n\n**a) Business, industry, and timezone.**\n\n> What's the business called, what does it do, and what timezone are you in?\n\nMap the answer to one preset: home services, cleaning, law firm, franchise, agency, or general\nsmall business. State the choice back with one line of reasoning so the manager can correct it.\nFor example: \"Sounds like home services. I'll count a call as solved when it ends with a booked\njob and an arrival window.\"\n\nThe timezone sets the review window and every displayed time.\n\n**b) Which numbers.** Call `list-inboxes`. Show the inboxes with their numbers and let the manager\npick the ones the service team answers. `fetch-call-transcripts` needs the E.164 number.\n\n**c) Who gets scored.** Call `list-users` with `maxResults: 50`, and follow `pageToken` until the\nroster is complete. Show it and let the manager pick the reps. Capture each rep's:\n\n- Quo user ID (US…),\n- display name,\n- any name variants they use on calls (for example, \"Mike\" for Michael),\n- role, in the business's own words.\n\nThe user ID is the rep's permanent key in `score.py` and in the sheet; the display name is just\nfor showing. Use the role word in the output instead of \"rep\" wherever it reads naturally.\n\n**d) Greeting standard.** Ask whether they have a set greeting. For example: \"Thanks for calling\nBright Smile Cleaning, this is Ana, how can I help?\" If they have none, use the preset's default\nexpectation: business name, rep's own name, and an offer to help.\n\n**e) Compliance must-dos.** Show the preset's default compliance items from\n`references/industry-presets.md`. Ask which apply and what to add. Ask which items are\n**auto-fail** and which are **note only**.\n\nKeep the auto-fail list short: only things that could hurt a customer or expose the business.\n\nIf an item depends on facts the transcript can't show, capture those facts now, or keep the item\nnote-only. Examples:\n\n- a rep's authority to approve credits or scope changes,\n- the firm's fee policy.\n\n**f) What counts as a solution.** Solution & follow-up carries the most weight, and what a good\noutcome looks like differs a lot from one business to the next. One plumber counts a phone quote\nas a win; another only counts a booked visit. One law firm wants every caller scheduled for a\nconsult; another wants unqualified callers referred out politely.\n\nSo don't assume the preset fits. Show the owner the preset's solution definition from\n`references/industry-presets.md`:\n\n- the one-line \"a solved call ends with…\" statement,\n- the 5 / 3 / 1 anchors,\n- the common call types, with the good outcome for each.\n\nThen ask:\n\n> This is how I'll judge whether a call got the customer what they needed. Does this match how\n> you run things? Change anything that's off. For example: what should happen on a price\n> question, when a rep should hand off to you, or what counts as a good result on a complaint.\n\nThen:\n\n1. Write their answer into the rubric in their own terms.\n2. Read back the final 5 / 3 / 1 anchors in one short block and get a yes before moving on.\n3. Save the confirmed definition to the `Rubric` tab (see `references/sheet-layout.md`).\n\nEvery later run scores Solution from that tab, not from the preset. If the owner makes no changes,\nsave the preset text and note \"confirmed as preset\" with the date.\n\nOn later runs, don't re-ask the full question. Add one line to the chat summary suggesting an\nupdate only if either happens:\n\n- more than about a quarter of a rep's Solution scores came out N/A,\n- a call type keeps showing up that the definition doesn't cover.\n\n**g) This quarter's goal.** Ask which goal matters most right now: first-call resolution, customer\nsatisfaction, retention, or something else. The goal decides which criterion the summary leads\nwith. It doesn't change the weights unless the manager asks.\n\n**h) Weekly score target.** The default is 80/100. Explain what it means: roughly \"mostly 4s, with\na proper greeting and close.\" A call of all 3s, which is polite but transactional, lands in the\nmid-60s. Call it a starting point to adjust after a few weeks.\n\n**i) Where to put the sheet, and who reviews.** Ask which Drive folder to use. Ask who the reviewer\nis: their name goes on the scorecard, because the template asks for reviewer accountability.\n\n**j) Training docs (optional).** Ask once, and make skipping easy:\n\n> If you have training docs, call scripts, FAQs, a price sheet, or written policies\n> (cancellation, refunds, service area), share a link or upload them. I'll use them to check that\n> reps give accurate answers. Totally fine to skip.\n\nAccept a Drive or Notion link, an uploaded file, or text pasted into the chat. Follow\n`references/business-facts.md` to turn them into a short, owner-confirmed Business facts list. If\nthe owner skips, say the skill will propose facts from what reps say on calls after the first\nrun.\n\nAlso confirm the weights: show the preset's table and say the owner can edit the `Rubric` tab at\nany time. Quo's own advice is to build the scorecard with the team and revisit it every quarter.\n\n## Step 3: Set the window and pull calls\n\n**The window.** The default is the most recent fully completed Monday-to-Sunday week, in the\nmanager's timezone. If today is Sunday, that means the week that ended last Sunday, not today.\n\n- Convert the boundaries to UTC for the tool calls.\n- Record the exact local window in the output.\n- Use the window's Monday as the week date. For a custom window, use its start date and note\n \"custom window\" in the header.\n\nRun every fetch **one at a time, never in parallel**. Parallel calls can hit rate limits and\nsilently return incomplete results. Expect a permission prompt for these tools and wait for\napproval.\n\n**1. Pull each rep's calls.** `fetch-call-transcripts` result rows don't include who handled the\ncall. The only reliable way to attribute calls is to pull them **per rep**. For each inbox, then\neach rep, call it with:\n\n- the E.164 number,\n- the rep's `userId`,\n- `createdAfter` and `createdBefore`,\n- `maxResults: 100`.\n\n**Pagination:**\n\n- Follow `conversationPageToken` when the response says more conversations are available.\n- Whole-inbox queries can't use `pageToken`. If a pull returns exactly 100 calls, assume it was\n cut off. Split the window into halves, or into single days, and pull again.\n- If a response is too large, retry at `maxResults: 25` with smaller windows.\n- A busy rep's week can come back as a very large result that the app saves to a file instead of\n showing inline. That's expected. Work from the saved file: count the calls from its first line,\n find each call by its header line (`AC… | participant | direction | …`), and read the file in\n chunks. Never score a call you haven't read in full.\n\n**2. Pull the whole inbox without `userId`.** Do this one day at a time if a single pull returns\n100 calls. Any call in this pull that didn't appear in a rep's pull goes into one of these groups:\n\n- **Answered by the AI receptionist, then handed to a person.** This is common for inbound calls\n at businesses that use Quo's AI receptionist, and these calls don't match the rep's user ID.\n Read the transcript past the AI's part.\n - If a person picks up and gives a name that matches exactly one scored rep (including their\n name variants from Config), include the call for that rep. Mark its attribution as\n `by name (after AI hand-off)` and score only the person's part. Score Greeting `na` on these\n calls. Only reps who say their name can be matched this way, so scoring Greeting here would\n inflate it.\n - If the transcript ends at the hand-off, or the person never gives a name, mark the call\n `attribution: uncertain`.\n- **Handled only by an AI agent, or by a person who isn't scored.** Count these for the coverage\n note.\n- **Attribution uncertain.** Use this when speaker labels suggest a scored rep but nothing\n confirms which one.\n\nUncertain calls stay in the call log and are left out of every average, because silent guessing\ncorrupts the trend.\n\n**If AI hand-offs are a large share of inbound calls** (more than about 1 in 5), say so near the\ntop of the chat summary. Give how many were attributed by name and how many couldn't be. For a\nbusiness that mostly takes inbound calls, this decides whether the scorecard reflects most of\nthe reps' service calls or only a small part of them.\n\nOn a small team, the owner, the office manager, and a tech may all answer the same line. If speaker\nlabels contradict the ID filter, trust the filter. Note the conflict in the call's summary.\n\n**3. Pull missed calls.** Call `fetch-missed-calls` for the same window. Missed calls feed the\nteam-level section only. They aren't charged to individual reps.\n\n## Step 4: Classify calls\n\nSort every call into one of two groups.\n\n**Scorable:** a real two-way conversation with a customer or prospective customer about their\nneeds. This includes service, scheduling, complaint, billing, question, and new-customer calls.\n\n**Excluded:**\n\n- spam and robocalls,\n- wrong numbers,\n- vendor and internal calls,\n- voicemails,\n- calls under about 45 seconds with no real exchange.\n\nCount excluded calls by type for the coverage note.\n\nNew-customer calls count. At a small business, the person who answers the phone is giving customer\nservice whether the caller is new or existing. If a call is clearly an outbound sales pitch from a\ndedicated seller, exclude it and mention that `sales-call-coaching` covers those.\n\n## Step 5: Score every scorable call\n\nScore every scorable call against `references/rubric.md`, using the configured weights, the\n**owner-confirmed solution definition** and **confirmed Business facts** from the `Rubric` tab,\nand the calibration note from Step 1.\n\nFollow `references/scoring-brief.md` for the exact instructions and the JSON format, whether you\nscore the calls yourself or split them across subagents. That file also says when splitting is\nworth it.\n\nFor each call, record:\n\n- **Ratings.** Greeting and Closing: `yes`, `no`, or `na`. Every other criterion: `1`–`5` or `na`.\n- **Compliance:** `pass` or `fail`. For a fail, record the item and the quote.\n- **Evidence for every criterion:** a timestamp, a short quote, and the earned/capped line.\n- **Confidence:** `high` or `low`. Use low when the transcript is garbled, one-sided, or cut off.\n- **A one-line summary:** what the caller needed and how the call ended.\n - Keep sensitive facts out: no case details, health information, codes, or card numbers.\n - For law firms, use only the matter type. For example: \"family law, new client — consult\n booked.\"\n\n**Check fact mismatches across all calls, before running the math.** Each scorer sees only its\nown calls, so it can't tell whether a contradiction is one rep's mistake or a sign the fact is out\nof date. After merging every call's JSON:\n\n1. Group the `fact_mismatch` entries by fact, and by what was said.\n2. A group counts as **possibly outdated** if the same contradicting statement appears on calls\n from 2 or more reps. On a one-rep team, it counts if it appears on 2 or more calls.\n3. For calls in a possibly outdated group:\n - Replace `solution` with `solution_without_fact_penalty`.\n - Set confidence to `low`.\n - Mark the fact `disputed` in the Rubric tab, and list it under **Facts to confirm** (Step 6).\n4. A contradiction that doesn't meet the threshold keeps its penalty. It's a coaching point.\n\n**Run the math.** Write the ratings into the JSON input described at the top of `scripts/score.py`:\n\n- Key each call by `rep_id` (the Quo user ID) and include the display name as `rep`.\n- Pass last week's `Trend` values as `previous` (per rep ID) and `previous_team`.\n- Pass this run's week date as `week`, and the last few weeks' `TEAM` rows from `Trend` (week,\n calls scored, criterion percentages) as `team_history`, oldest first. The script uses them to flag criteria the whole team has maxed\n out.\n\n```bash\npython scripts/score.py input.json > results.json\n```\n\nThe script returns:\n\n- each call's 0–100 score,\n- the \"would have scored\" value for compliance fails,\n- each rep's weekly score, criterion averages, change from last week, and `focus_candidates`,\n- the team score and its change,\n- training gaps and the strongest criterion,\n- `ceiling_flags`: criteria the whole team has scored at 95% or higher for 3 weeks running,\n- any warnings.\n\nUse its numbers in the output exactly as given. If `warnings` is not empty, fix the input and run\nit again before writing anything.\n\n**Why score every call but write up only a few:** AI can review 100% of calls, which is the\nZendesk-style approach. A manager reading a weekly scorecard can take in about four or five calls\nper rep, which is Quo's recommended manual cadence for small teams. So averages use every call,\nand write-ups use a curated few.\n\n## Step 6: Choose deep-dive calls and write the coaching\n\n**Deep-dive calls, 4–5 per rep.** Pick:\n\n- **The 2 lowest-scoring calls that are still teachable.** Skip calls that were doomed from the\n start, like an out-of-area caller angry about something the rep couldn't control.\n- **The single highest-scoring call.**\n- **1–2 at random from the rest,** so the set isn't all extremes.\n\nIf a rep has 5 or fewer scorable calls, deep-dive all of them.\n\nFor each deep-dive call, write:\n\n1. Date, caller (contact name, or the last 4 digits of their number), duration, and score.\n2. **Turning point:** the moment that most shaped the score, with a timestamp and a quote.\n3. **Earned / capped by:** one line.\n4. **\"Try saying\"** (low scores only): the exact words to use next time, specific enough to read\n aloud on the next call. Put a real time window, next step, or policy in it, not \"be more\n empathetic.\"\n\n Every specific in it must come from the confirmed Business facts or from that call's\n transcript. That covers prices, fees, time windows, names and policies. Anything else goes in\n brackets for the owner to fill in, such as `[your diagnostic fee]`. A made-up price in a\n coaching line teaches the rep to quote something the business doesn't charge.\n\n**Per-rep coaching block:**\n\n- **Win to repeat:** one specific thing they did well, with a quote. Open with it.\n- **Focus areas:** at most two.\n - Start from `focus_candidates` in the script output. It already ranks criteria by weighted\n shortfall (low score × high weight).\n - Choose among the top candidates. Prefer a pattern seen across several calls over a single\n slip.\n - Give each focus area a \"Try saying\" line, plus a done-when check that needs no judgment. For\n example: \"Every call ends with a recap of the date, window, and who's coming.\"\n- **Compliance flags:** list each failed call with its \"would have scored\" value, so the\n conversation covers both the violation and the skill.\n\n**Team patterns:**\n\n- **Training gaps.** Report a gap only where `team.training_gaps` lists one: two or more reps under\n 70% on the same criterion, each with at least 3 rated calls on it. When several reps miss the same\n thing, it points to training or process, not to individuals.\n- **Team win.** Name the strongest team criterion, so the team can be recognized for it.\n- **Criteria the team has maxed out.** For each criterion in `team.ceiling_flags`, add one line to\n the chat summary. It isn't separating reps anymore, so suggest the owner tighten its standard\n (for example, require the recap on every Closing) or move some of its weight to a criterion\n where reps differ. Don't change the weights yourself.\n\n**Business facts.** Using the `fact_mismatch` and `stated_facts` fields from scoring, follow\n`references/business-facts.md`:\n\n- **Facts to confirm:** list each possibly outdated group from Step 5, meaning the same\n contradicting statement on calls from 2 or more reps (or 2 or more calls on a one-rep team). Ask\n the owner which is right.\n- **Proposed facts:** if the facts list is thin, propose up to 5 facts reps stated consistently:\n - **Threshold:** at least 3 calls from at least 2 reps (or 3 calls on a one-rep team), with no\n contradictions.\n - **No repeats:** never propose a fact already in the list in any status.\n - **Saving:** ask the owner to confirm them in the chat summary, and save them as `pending` in\n the Rubric tab.\n\n**Owner action items.** List the process problems the calls exposed. Give at most three, each with\na suggested owner. Examples:\n\n- no price list (often visible as the same `[placeholder]` appearing in several reps' \"Try\n saying\" lines),\n- unclear policy,\n- no after-hours coverage,\n- long holds because one person is also dispatching.\n\n**Missed-call context** (team level only). From `fetch-missed-calls`, report:\n\n- the count,\n- the busiest missed hours,\n- how many were followed by a return call to the same number, using outbound calls you already\n pulled. Group them as: within 1 hour, same business day, or no return seen.\n\nLabel this \"returns visible in transcribed calls only\". A text reply or an untranscribed callback\nwon't show up.\n\n## Step 7: Write the Google Sheet\n\nFollow `references/sheet-layout.md` exactly.\n\n**First run:** create the spreadsheet in the chosen folder, titled\n`Customer Service Scorecard — [Business] [year of the week's Monday]`, with these tabs:\n\n- `Config`,\n- `Rubric`,\n- this week's tab, named `Week of YYYY-MM-DD`,\n- `Trend`,\n- `Call log`.\n\n**Later runs:**\n\n- Add the new weekly tab right after `Rubric`, so the newest week is easy to find.\n- **Append** rows to `Call log` and `Trend`.\n- Never change earlier weeks, except for last week's `Trend` rows in Step 1. The history is what\n makes the trend useful.\n\n**Size each weekly tab to its content.** When adding the tab, set its row and column count to\nwhat it holds plus a small margin, not Google's default 1,000 × 26. A Google Sheet holds 10\nmillion cells across all tabs, and empty cells count toward that limit.\n\n**Rollover, so the sheet stays usable for years:**\n\n- **Keep the 12 most recent weekly tabs.** When a 13th would be added, move the oldest to an\n archive spreadsheet named `Customer Service Scorecard — [Business] — Archive [year]`. Create it\n in the same folder if it doesn't exist. Copy the tab across and rename the copy back to its\n original name (copies arrive as \"Copy of …\"). Check that the copy is there, then delete the tab\n from the main sheet. `Call log` and `Trend` keep the full history, so no data is\n lost.\n- **Start a new main sheet each January.** On the first run whose week date (the Monday) falls\n in a new year:\n - Create `Customer Service Scorecard — [Business] [year]`.\n - Carry over `Config`, `Rubric` (including Business facts and calibration notes), and the last 4\n weeks of `Trend` rows, so \"vs last week\" and the ceiling check still work.\n - Start a fresh `Call log`.\n - Put the new sheet's link in the old sheet's `Config`, and the old sheet's link in the new\n one's.\n - Tell the manager in the chat summary that the new sheet replaces the old one.\n- **Before moving or deleting a tab, say what's moving in the chat summary.** Never delete a tab\n that hasn't been copied successfully.\n\n**Caller privacy.** Scorecards get shared with reps, so:\n\n- Use the contact name if Quo has one; otherwise use the last 4 digits of the number.\n- Never put full phone numbers or sensitive details in the sheet.\n\n**Sharing.** Don't change sharing settings. Say who needs access and let the manager grant it:\nthe reviewer, plus each rep if the manager wants reps to see their own scorecard.\n\n**After writing, reply in chat** with the sheet link and a summary under about 120 words that the\nmanager can read or paste into Slack or a team meeting. Include:\n\n- team score and change from last week,\n- each rep's score in one line,\n- one team win,\n- the training gap, if there is one,\n- the top owner action item.\n\nAfter the summary, add short questions for the owner only when they apply:\n\n- AI hand-off coverage (Step 3),\n- facts to confirm, or proposed facts,\n- criteria the team has maxed out,\n- the quarterly facts check.\n\nKeep each to one line, so the paste-ready summary stays clean.\n\n## What this skill does not claim\n\nState these in the coverage note on every weekly tab:\n\n- Only calls with usable transcripts are scored. Calls without transcripts (transcription needs the\n right Quo plan, turned on) are invisible.\n- Counts describe the calls reviewed, not total call volume. Don't compute answer rate or total\n volume from this data; point the manager to Quo Analytics for those.\n- A rep average over fewer than 8 scored calls is **directional**. `score.py` flags it; show the\n flag.\n- Tone is judged from words, not audio.\n- Inbound calls that the AI receptionist hands to a person are included only when the person can\n be identified by name in the transcript. The coverage note gives the count.\n- Accuracy is checked only against facts the owner confirmed. Without them, the skill can't tell\n a wrong price from a right one.\n- Scores are a coaching tool built on partial data, not an HR performance rating.\n\nThis skill only reads from Quo. It never sends messages, edits contacts, or creates tasks in Quo\nunless the manager explicitly asks for a follow-up action after seeing the scorecard.\n"
}SHA-256 of public snapshot: ce4543326381dbecf86017fa29186c54e3e4cf989e9aa7d65d2eb51f5fcf6e57