A Skill for Decile Hub, and What Measuring the CRM Revealed
Two GPs get one connector and 158 tools they can't tell apart — so the skill supplies the missing safety tiering. Then measuring the boards found three fields that look populated and aren't.
Why Care?
A VC client's two GPs are going to run their deal pipeline and LP fundraise from
Claude Desktop. Decile Hub already ships the hard part — a native remote MCP
server at <tenant>.decilehub.com/mcp, OAuth with dynamic client registration,
so each person signs in as themselves and the audit trail stays honest. Four
clicks, no keys, no config file.
The problem is what arrives after those four clicks: 158 tools with zero
annotations. Nothing marks a tool read-only or destructive. list_people and
publish_newsletter — which mails every calculated recipient with no unsend —
look identical to the client. Decile's own published skill lists send_email,
send_pact, and send_lpa with no flag that they are irreversible, outbound,
and stage-mutating. send_lpa also creates the LP's capital account on the fund.
So the skill's first job is the missing classification: every tool tiered 🟢 read (85) · 🟡 write (38) · 🟠 confirm (22) · 🔴 outbound (13).
The part we didn't expect
Building a "roundup of comms" procedure meant measuring what the boards actually hold. Three fields look populated and are not:
next_contacton the LP boards — 150 of 200 on one, 102 of 132 on another. Every single one overdue, with timestamps one second apart. Bulk-write residue from an import a year or two ago, not a follow-up plan.last_contact— 82 values across eight distinct dates, 42 of them on a single day.updated_at— populated on 100% of rows, and routinely mistaken for contact recency. It means the record was touched, by anyone, including an API sync.
Had we shipped the obvious version, the GPs' first LP roundup would have read "252 LPs overdue" — confident, derived from real-looking data, and meaningless. That is precisely the output that makes someone stop trusting a tool, and they don't iterate on skills; whatever doesn't work, they stop using.
So the skill now leads with a distribution check: values sharing an exact second, a handful of distinct dates covering many rows, or 100% of dates in the past all mean a batch wrote the field. And it draws a line it will not cross — write "no contact recorded", never "no recent contact." The first is a fact about the CRM; the second is a claim about a relationship.
Where the commitments actually live
capital_commitment is empty on the LP boards, which reads like a gap until you
know the model: Decile ships a pre-set (alterable) LP pipeline that terminates in
a PACT — a Pledge Agreement for Capital Transaction, which is to LP
fundraising what a SAFE is to company fundraising. The pledge is the commitment
record, so list_pacts answers "who committed and how much," and reading
capital_commitment and reporting "no commitments" is a real and available
mistake.
No merge tool, and duplicates already exist
None of the 158 tools merges records. A duplicate is permanent — delete one and
its notes, attachments, and history go with it. Meanwhile the natural key is an
exact match, so Acme Bio and Acme Bio, Inc. are two organizations, and the
well-intentioned move (sending the "better" spelling) is what forks the record.
A 300-organization sample turned up collisions of exactly that shape. But the
first one checked was a false positive worth keeping: a fund's own
Ventures / Ventures, LLC / Fund I, LP / GP I, LLC records are four
distinct legal entities, and the normalizer that finds duplicates is the same
one that destroys the distinction. The rule that came out of it: a name collision
is a candidate, not a verdict — require positive evidence of sameness (same
domain, same people, same business), and when two records differ only by a legal
suffix, the default is that they are different entities.
What shipped
context-v/agent-skills/decilehub-interface/ — 770 lines plus three references
and three fill-in templates (deal upsert, LP upsert, and speech-to-text upsert
for the partner who is on the road and wants a voice memo to end up in the CRM).
Nine ordered procedures, each naming its decision points rather than listing
tools.
Two corrections worth recording, both of which were wrong in an earlier draft of
this same skill. Decile's machine-readable spec does exist, at
decilehub.com/api/docs/v1/swagger.yaml — 122 paths; the /docs/api.json we
probed answers 200 with zero bytes, a decoy. And our on-disk snapshot is 35 paths
behind, missing the entire prospect-attachment family. Both surfaced by reading
Decile's own published skill, which is a better catalogue than ours and a worse
operating guide — the skill now says which wins where they disagree.
Also included: an exploration on whether homebase needs a sandbox (it needs storage, which the Cloudflare R2 backup work already covers — compute can wait), and a reminder capturing why all of this is one connector rather than five.
