SKILL.md
SKILL.mdBrowse 2 files
1,264 tokens
5,148 bytes
Token encoding: o200k_base
Snapshot cd49113
1---2name: twenty-partner-triage3description: Rank the partner-application backlog by net-new value and hand back a short chase-list of applicants worth a personal nudge. Use when the user wants to triage, rank, or prioritize partner applications, find which applicants are worth chasing, run the daily or weekly application review, or asks "who should I reach out to" / "which applications matter". Reads the live partners workspace, read-only, never mutates a record.4trigger: /twenty-partner-triage5---6 7# twenty-partner-triage8 9Network upkeep, not the lead path. Rank `APPLICATION`-stage partners by the value they would10*add* (geographies and languages the roster doesn't yet cover, plus proof of real Twenty work)11and hand back a short **chase-list**: the applicants worth a personal nudge.12 13**The door stays open for everyone.** This skill rejects nobody and filters nobody out of the14pipeline. It just makes sure the good applicants bubble up so they don't rot. The point is a15few high-confidence partners, not maximum coverage.16 17Read-only. It never mutates a record.18 19Credentials live in `../_shared/partner-api.md`. This skill needs the partners URL and key.20 21---22 23## Phase 0 — Run the ranker24 25```bash26python3 "$(dirname "$0")/rank.py" # or: python3 rank.py from the skill dir27```28 29`rank.py` is the deterministic core. It pulls every partner, computes each applicant's30net-new geo, language, scope and skills against the **VALIDATED** baseline, detects a "real31Twenty work" proof signal in the notes, scores, and prints ranked JSON. It calls no LLM: the32judgment lives in you, at Phase 1.33 34Each ranked entry: `name, score, tier (A/B/C), new_geo, new_lang, new_scope, new_skills,35proof{workspace_url|customers|migration}, team, contact_name, email, linkedin, website,36notes`.37 38Scoring, tunable in `rank.py`: geo +3 each, language +3 each, scope +1, skills +1 capped at 339(so a dev shop spraying skill lists can't dominate), proof +6. Any proof signal means at least40tier A.41 42**Scope: every application is scored.** There is no booking signal on the Partner object, so43the ranker cannot narrow to the applicants who never booked a call. That is the true chase44set, and reaching it would mean adding a field and populating it from the calendar. Until45someone does, say plainly in the output that the list covers all applications, booked or not.46 47A missing-credentials error means stopping and naming the key to add.48 49---50 51## Phase 1 — Judgment pass (this is the point)52 53The score surfaces; you decide. Read the `notes` of the **top ~15**, plus anything tier-B or54tier-C with a non-trivial note, and adjust:55 56- **Rescue the motivated-but-unobvious.** Thin checkboxes but notes showing real intent, a57 live Twenty instance, named customers, or a thoughtful pitch is a chase even at a low58 score. This is the whole reason a human reads the notes: the applicants who do things the59 form doesn't capture are exactly the ones not to lose.60- **Sanity-check volume inflation.** A high score driven by 6 net-new *languages* from one61 solo, or a long skills list, may be aspirational. Confirm against the notes before ranking62 it top. Real net-new geography with proof beats a long list every time.63- **Demote noise.** Empty notes, agency spam, or `Tally submission: <id>` with nothing else is64 tier C regardless of score. Don't chase them.65- **Note proof quality.** `workspace_url` and `customers` together, a live workspace with66 named clients, is the strongest signal, stronger than the raw score. Call it out.67 68Don't invent facts. An ambiguous note gets said so, not upgraded on a guess.69 70---71 72## Phase 2 — Output the chase-list73 74A tight digest, grouped by tier, A first. Lead with the count and the scope caveat.75 76```77# Partner application triage — N applications ranked (all applications, no booking signal on the model)78 79## Chase now (Tier A — fills a gap AND/OR proven)80- **<name>** (<team>) — +<geo>/<lang>; proof: <workspace+customers/…>81 why: <one line, drawn from notes>82 reach: <email> · <linkedin>83 84## Worth a look (Tier B)85- <name> — <one line>; reach: <email>86 87## Skip for now (Tier C) — <count>, not listed (empty/spam/no gap)88```89 90Rules:91 92- Tier A is the actual worklist. Keep it short. Eighteen entries means the proof-backed93 gap-fillers go first and the volume-only ones go last.94- Always give a reach handle: email from `contact_name` or `email`, else linkedin, else95 website. None on record means saying "no contact on record", which is itself a data-quality96 flag.97- Be honest. A handful genuinely worth chasing is a real answer. Don't pad the A-tier.98 99---100 101## What this is not102 103- **Not a gate.** It never moves anyone to `REJECTED` or out of the funnel.104- **Not a writer.** It never edits a record. Surfacing only.105- **Not a background job.** Nothing here is scheduled. The judgment pass stays here, for106 the runs where a human is in the loop.107 108## Self-check109 110`python3 rank.py --selftest` asserts that the scoring orders a gap-filler-with-proof above a111skill-sprayer above an empty record, and that skill volume stays capped. Run it after any edit112to the weights or the signal regexes.113 Discovery context
Discovered by repository scan. No exact path reference found in the snapshot’s root CLAUDE.md.