Lossless Changelog
fleet

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.

Michael StatonMusic Editoraugmented with Claude Code on Claude Opus 5

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_contact on 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.