Verdict on the 32-story PRD
It does not build what you described, and it should be rewritten. The PRD's brain is a single-lookup parser: every question is squeezed into one transaction lookup. That cannot answer capability-first sweeps ("who has ES IBANs", "who can sell HKD", "local settlement in France"), cannot hold a narrowing conversation, and cannot combine "French corporate" with "Corpay". It was also written against a fork 143 commits behind: the real Compass already has the Rolodex (partnership_status = prospect), per-row provenance, conversations, contacts, MatchProspects and the unserved-needs gap analysis. Several PRD stories re-invent those.
What replaces it: an agent with tools. Compass exposes its capability queries as MCP tools (the twelve you see in the conversations below, over the live database), and Opus 5 drives the conversation through claude -p, exactly the transport ClaudeSubscriptionClient already uses for document extraction. A deterministic grounding guard checks every reply against that turn's tool results. The Slack plumbing from the old PRD (ingress, workers, member gate, quotas, leases) carries over; the parser, renderer and gap table do not.
Compass::MatchProviders. In production the same tools read the live tables and call the real matchers.Persona: before and after
Your critique of the first run: too much colour, providers mashed into paragraphs, hard to scan. The persona is now a keen executive assistant with a fixed answer shape: one-line answer, one line per provider (live first, prospects after), caveats once in a footer, one follow-up. No opinions about providers.
Q: who do we have that can do anything in Africa?
Broadest reach is FX Broker (Equals) (live): ZAR, KES, NGN, GHS, UGX, TZS, MAD, EGP and XOF — mostly buy-only (client buys the African currency), ZAR and MAD both ways. Corpay US (live) is close behind: ZAR, KES, NGN, GHS, UGX, TZS, MAD, all buy. Clear Treasury and Currencycloud/TCC (both live) are narrower — ZAR, KES, UGX, all two-way, though Currencycloud's UGX carries a condition: not available to clients operating in the EEA or with EEA customers. Moneycorp (live) only has ZAR buy recorded. Settlement is UK-domiciled accounts for these — Compass has no local African collection accounts recorded for any live partner.
On the Rolodex side, Riva is the interesting one (prospect, unverified — from your call with founder Jonas Lindqvist on 30 Aug): KES, NGN and GHS both directions, plus M-Pesa mobile-money payouts in Kenya, and notes claiming local rails in 37+ countries.
Two watch-outs: blocked/reviewable African countries cluster around Libya, Sudan, South Sudan, Somalia, Zimbabwe, DRC and CAR — Clear Treasury and Equals block several outright, Corpay US flags them as reviewable with EDD. And on clients domiciled in Africa, only Clear Treasury has anything recorded (South Africa, enhanced due diligence); Kenya and Nigeria are blank for everyone, which is unknown rather than no.
Want me to run a specific corridor through the matcher — say a UK Ltd paying a supplier in Kenya?
• FX Broker (Equals) — live · widest: ZAR, KES, NGN, GHS, MAD, EGP, UGX, XOF · mostly client buys only; won't touch CF, CD, LY, SS, SY
• Corpay US — live · client buys ZAR, KES, NGN, GHS, MAD, UGX · CD, CF, LY, SO, SS, SD, ZW, YE need compliance sign-off
• Currencycloud/TCC — live · ZAR, KES, UGX both ways · UGX barred for EEA clients; won't send to LY, SD, SS
• Clear Treasury — live · ZAR, KES, UGX both ways · won't send to LY, SD, SS, SO, ZW, CD; only partner recorded to onboard a South African client (extra due diligence)
• Moneycorp — live · client buys ZAR only
• Riva — Rolodex prospect · KES, NGN, GHS both ways, M-Pesa payouts in Kenya · onboards clients in GB/EU/AE only · from your call with Jonas Lindqvist, 30 Aug
Live data last verified Mar 2026 (stale); Corpay has no data recorded; no provider records onboarding clients domiciled in Nigeria or Kenya.
Want me to run a full match on a specific corridor — say GBP into KES?
Q: Which of our providers can sell HKD?
- Clear Treasury — live, both directions, any client type
- Currencycloud/TCC — live, both directions, any client type
- FX Broker (Equals) — live, both directions, any client type
- OpenPayd — prospect from the Rolodex (unverified, from Paul's intro call on 12 Aug), both directions but business clients only
All three live partners were last verified ~195 days ago, so worth a re-check before you lean on it. Corpay and Riva have no HKD row at all — unknown rather than a no.
Want me to check where they'll actually send HKD to, or whether any can hold a named HKD account in Hong Kong?
• Clear Treasury — live · client sells or buys HKD
• Currencycloud/TCC — live · client sells or buys HKD
• FX Broker (Equals) — live · client sells or buys HKD
• OpenPayd — Rolodex prospect · sells and buys HKD · business clients only · from Paul's call, 12 Aug 2026
Live rows last verified Mar 2026 (stale); Corpay and Riva have no HKD row recorded.
If you meant client buys HKD, add Corpay US and Moneycorp — want that list?
Q: Who can do local settlement in France?
- OpenPayd — named virtual IBAN in France, EUR, for collections. Rolodex prospect, unverified — intel from Paul's intro call on 12 Aug 2026.
- Currencycloud/TCC — live partner, but the France coverage is inferred from wildcard rows (any currency, any country): pooled account with reference for collections, named local account for payouts. Last verified 4 Mar 2026, so 194 days old — worth re-checking before you quote it.
Riva also shows up on a wildcard but only for KES via M-Pesa and USDC/USDT on-chain, so nothing French there.
Is this for collections into France or payouts out? That'd sharpen it.
• OpenPayd — Rolodex prospect · named EUR virtual IBAN in FR, pay-in · pooled for payouts · from Paul's call, 12 Aug
• Currencycloud/TCC — live · named local for payouts, pooled for pay-in · general row, not FR-specific
• Riva — Rolodex prospect · payouts only, KES/USDC/USDT · not FR-specific · from Stevan's call, 30 Aug
Live data last verified Mar 2026 (stale); no other provider has a France settlement row recorded.
Want me to check which providers will onboard a France-domiciled client?
Qualifying a client
Your question: if someone says "I've got a corporate that needs an HKD local account, who can do it?", what should the bot ask, and how do we qualify the lead overall rather than just the currency?
How it works now. A twelfth tool, lookup_requirements, returns exactly what a full Compass match needs and why each field matters — the same contract as Compass::Lookup. The bot calls it, states what it already has, asks only for the missing fields that change the verdict (max three at a time), then runs the full match across live partners and prospects and gives one line per provider with the deciding reason. The two "qualify" conversations below show it: currency alone says nothing about whether the client's jurisdiction, entity type or settlement needs are covered, and the matcher catches exactly those.
| Field | Why it decides the verdict |
|---|---|
| Client type (personal / company type) + client country | Entity restrictions and client jurisdiction — a provider may do the currency but not onboard a Singapore trading company |
| Currencies sold / bought | Corridors, per side, with personal/business rules |
| Send-from / send-to countries | Exclusions |
| Settlement needs | Named vs pooled, currency, pay-in vs payout, where domiciled — the "HKD local account" part |
| High-risk industry, forwards | Industry restrictions; forward tenor/type/deposit |
| Amount, pricing, cadence | Not evaluated by Compass — the bot says so rather than pretending |
Open question: hand-off after qualifying. My recommendation: in v1 (internal staff) every qualification already saves a real Compass lookup, so the bot ends with "Saved as lookup #N" and a link the team can open in Compass — that is the shareable artefact, and misses flow into Unserved Needs. In v2 (partners), the natural close is exactly what you described: "Want me to pass this to CurrencyTransfer to start onboarding?" — which creates a referral with the details already captured (client type, country, currencies, settlement needs) and notifies the routing owner. The client still signs up themselves; the hand-off just removes the re-typing and gives the partner attribution. That belongs in the partner-portal PRD, not this one, but the tool contract should be designed so the same qualification payload becomes the referral.
Sample conversations
Each exchange is a real run. 🔧 shows the tool the model chose and its arguments. The grounding badge is the deterministic guard: every provider named in the reply must appear in that turn's tool results.
africa sweep
🔧 list_providers
{}🔧 text_search
{
"term": "Africa"
}🔧 currency_support
{
"currency": "ZAR"
}🔧 currency_support
{
"currency": "KES"
}🔧 currency_support
{
"currency": "NGN"
}🔧 currency_support
{
"currency": "GHS"
}🔧 currency_support
{
"currency": "MAD"
}🔧 currency_support
{
"currency": "EGP"
}🔧 country_exclusions
{}🔧 client_jurisdictions
{
"country": "ZA"
}🔧 client_jurisdictions
{
"country": "NG"
}🔧 client_jurisdictions
{
"country": "KE"
}🔧 provider_profile
{
"name_or_code": "riva"
}🔧 currency_support
{
"currency": "UGX"
}🔧 currency_support
{
"currency": "XOF"
}• FX Broker (Equals) — live · widest: ZAR, KES, NGN, GHS, MAD, EGP, UGX, XOF · mostly client buys only; won't touch CF, CD, LY, SS, SY
• Corpay US — live · client buys ZAR, KES, NGN, GHS, MAD, UGX · CD, CF, LY, SO, SS, SD, ZW, YE need compliance sign-off
• Currencycloud/TCC — live · ZAR, KES, UGX both ways · UGX barred for EEA clients; won't send to LY, SD, SS
• Clear Treasury — live · ZAR, KES, UGX both ways · won't send to LY, SD, SS, SO, ZW, CD; only partner recorded to onboard a South African client (extra due diligence)
• Moneycorp — live · client buys ZAR only
• Riva — Rolodex prospect · KES, NGN, GHS both ways, M-Pesa payouts in Kenya · onboards clients in GB/EU/AE only · from your call with Jonas Lindqvist, 30 Aug
Live data last verified Mar 2026 (stale); Corpay has no data recorded; no provider records onboarding clients domiciled in Nigeria or Kenya.
Want me to run a full match on a specific corridor — say GBP into KES?
🔧 currency_support
{
"currency": "MZN"
}🔧 country_exclusions
{
"country": "MZ"
}🔧 client_jurisdictions
{
"country": "MZ"
}🔧 text_search
{
"term": "Mozambique"
}• FX Broker (Equals) — live · client buys MZN · no row for client selling MZN
• Everyone else — no MZN data recorded, which is unknown, not a no
• No provider records refusing Mozambique, and none records onboarding a Mozambique-domiciled client
Live data last verified Mar 2026 (stale); nothing recorded on local settlement accounts in MZ.
Want me to run a full match, e.g. a UK company selling GBP to buy MZN into Mozambique?
dm natural stablecoin
🔧 text_search
{
"term": "stablecoin"
}🔧 text_search
{
"term": "USDC"
}• Riva — Rolodex prospect · USDC buy and sell, on-chain payouts via pooled account · from your call, 30 Aug 2026
No live partner has any stablecoin row recorded — that's "no data", not a refusal.
Want me to check Riva's client jurisdictions and crypto-industry policy before you take it further?
🔧 provider_profile
{
"name_or_code": "Riva"
}• Call summary: USDC/USDT on-chain settlement, M-Pesa payouts in Kenya, EUR virtual IBANs in Sweden, corporates onboarded in 2–4 days.
• No email or phone recorded in Compass.
Riva is a Rolodex prospect, so all of this is unverified call intel.
Want the onboarding requirements they quoted, or their crypto-industry policy?
docs by currency
🔧 currency_support
{
"currency": "AED",
"direction": "buy"
}🔧 lookup_requirements
{}🔧 provider_profile
{
"name_or_code": "clear_treasury"
}🔧 provider_profile
{
"name_or_code": "currencycloud"
}🔧 provider_profile
{
"name_or_code": "moneycorp"
}🔧 provider_profile
{
"name_or_code": "fx_broker"
}🔧 provider_profile
{
"name_or_code": "corpay_us"
}• Clear Treasury — live · signed director passport + proof of address, solicitor/accountant shareholder letter, UBO 25%+ · high-risk adds 6 months bank statements
• Currencycloud/TCC — live · KYB via API: company registration number + director details
• FX Broker (Equals) — live · incorporation cert, articles, shareholding to UBO, ID + address for 25%+ holders, annual return or bank statement, client/supplier invoices
• Moneycorp — live · certificate of incorporation, director IDs, proof of address
• Corpay US — live · EIN, articles of incorporation, beneficial ownership disclosure · won't take personal accounts
Live data last verified Mar 2026 (stale); OpenPayd is a Rolodex prospect with no onboarding docs recorded.
Is the client personal or business, and where are they registered? That narrows this to one provider's list.
🔧 match_transaction
{
"entity_type": "SoleTrader",
"sell_currencies": [
"GBP"
],
"buy_currencies": [
"AED"
],
"send_from_country": "GB",
"send_to_country": "AE",
"client_country": "AE"
}🔧 entity_restrictions
{
"entity_type": "SoleTrader",
"client_country": "AE"
}• Clear Treasury — live · docs: signed director passport + proof of address, shareholder structure letter from solicitor/accountant, UBO 25%+ verification · non-EU onboarding note: signed passport + proof of address
• Corpay US — live · docs: EIN, articles of incorporation, beneficial ownership disclosure · US-shaped list, may not fit a UAE sole trader
• FX Broker (Equals) — live · won't: sole traders blocked outside GB, and UAE clients not onboarded
• Currencycloud, Moneycorp, OpenPayd — won't onboard UAE-domiciled clients
Neither has a sole-trader rule recorded, so entity fit is unconfirmed; live data last verified Mar 2026.
Want me to pull Clear Treasury's full profile and contacts to confirm the sole-trader pack?
es iban wide
🔧 settlement_accounts
{
"iban_country": "ES"
}• OpenPayd — Rolodex prospect · named virtual IBAN, EUR, collection · from Paul's call, 12 Aug
• Currencycloud/TCC — live · pooled collection + named_local sending · general ANY rows, not ES-specific
• Riva — Rolodex prospect · KES/USDC/USDT payouts only · general rows, not ES-specific · from Stevan's call, 30 Aug
Live data last verified Mar 2026 (stale); no other provider has settlement rows for ES.
Want OpenPayd's onboarding requirements?
exclusions nigeria
🔧 country_exclusions
{
"country": "NG"
}🔧 client_jurisdictions
{
"country": "NG"
}🔧 text_search
{
"term": "Nigeria"
}• No exclusion rows for NG across all 8 providers, live or prospect.
• No provider records whether they'd onboard an NG-domiciled client either — all grey.
That's "no data", not "yes": treat Nigeria as unconfirmed until someone checks with the partner.
Want me to check who can trade NGN, or whether anyone pays out to Nigeria in USD?
forwards zar
🔧 forwards
{
"currency": "ZAR"
}• Clear Treasury — live · ZAR-specific, 12 months, deliverable · 15% deposit at long tenor, margin calls
• Corpay US — live · up to 24 months, deliverable · 5% at long tenor; general row, not ZAR-specific
• Currencycloud/TCC — live · 12 months, deliverable · 5% deposit; general row, not ZAR-specific
• FX Broker (Equals) — live · 12 months, deliverable · 10% at long tenor; general row, not ZAR-specific
• Moneycorp — live · forwards on, no ZAR row recorded
All margin-callable; no non-deliverable option recorded anywhere. Corpay won't do forwards; OpenPayd and Riva (prospects) won't either.
Live data last verified Mar 2026 — stale.
Want me to check which of these will onboard your client's country and trade ZAR?
france local settlement
🔧 settlement_accounts
{
"iban_country": "FR"
}• OpenPayd — Rolodex prospect · named EUR virtual IBAN in FR, pay-in · pooled for payouts · from Paul's call, 12 Aug
• Currencycloud/TCC — live · named local for payouts, pooled for pay-in · general row, not FR-specific
• Riva — Rolodex prospect · payouts only, KES/USDC/USDT · not FR-specific · from Stevan's call, 30 Aug
Live data last verified Mar 2026 (stale); no other provider has a France settlement row recorded.
Want me to check which providers will onboard a France-domiciled client?
🔧 settlement_accounts
{
"iban_country": "FR",
"currency": "EUR",
"direction": "collection"
}🔧 client_jurisdictions
{
"country": "FR"
}• Currencycloud/TCC — live · pooled account with reference, onboards FR clients · general row, not FR- or EUR-specific
• OpenPayd — Rolodex prospect · named EUR virtual IBAN in France, onboards FR clients · from Paul's call, 12 Aug
Live data last verified Mar 2026 (stale); Clear Treasury, Moneycorp, Corpay US and Corpay have no FR client row recorded.
Want me to run the full match for a French SARL selling EUR, including entity-type checks?
🔧 settlement_accounts
{
"iban_country": "ES",
"currency": "EUR",
"direction": "collection"
}🔧 client_jurisdictions
{
"country": "ES"
}• Currencycloud/TCC — live · pooled account with reference, onboards ES clients · general row, not ES- or EUR-specific
• OpenPayd — Rolodex prospect · named EUR virtual IBAN in Spain, onboards ES clients · from Paul's call, 12 Aug
Live data last verified Mar 2026 (stale); Clear Treasury, Moneycorp, Corpay US and Corpay have no ES client row recorded.
Want the OpenPayd profile, including what they need to onboard a corporate?
hkd sell
🔧 currency_support
{
"currency": "HKD",
"direction": "sell"
}🔧 currency_support
{
"currency": "HKD",
"direction": "buy"
}• Clear Treasury — live · client sells or buys HKD
• Currencycloud/TCC — live · client sells or buys HKD
• FX Broker (Equals) — live · client sells or buys HKD
• OpenPayd — Rolodex prospect · sells and buys HKD · business clients only · from Paul's call, 12 Aug 2026
Live rows last verified Mar 2026 (stale); Corpay and Riva have no HKD row recorded.
If you meant client buys HKD, add Corpay US and Moneycorp — want that list?
🔧 settlement_accounts
{
"currency": "HKD",
"iban_country": "HK",
"named_only": true
}• Currencycloud/TCC — live · named local account, payouts · general ANY row, not HK/HKD-specific
• OpenPayd — Rolodex prospect · named local HKD account in HK, client pays in · recorded as pilot, unconfirmed · from Paul's call, 12 Aug 2026
Clear Treasury and FX Broker (Equals) have no named HKD/HK row recorded; live rows last verified Mar 2026.
Want me to check what pooled or virtual-IBAN HKD options exist as a fallback?
kenya supplier
🔧 match_transaction
{
"entity_type": "LimitedCompany",
"sell_currencies": [
"GBP"
],
"buy_currencies": [
"KES"
],
"send_from_country": "GB",
"send_to_country": "KE",
"client_country": "GB",
"include_prospects": true
}🔧 country_exclusions
{
"country": "KE"
}• Clear Treasury — live · client sells GBP, buys KES · entity type not recorded
• Currencycloud/TCC — live · client sells GBP, buys KES · entity type not recorded
• FX Broker (Equals) — live · client sells GBP, buys KES · entity type not recorded
• Riva — Rolodex prospect · client sells GBP, buys KES · last contact 30 Aug 2026
No Kenya exclusions recorded anywhere. Moneycorp and Corpay have KES down as unsupported.
Live data last verified Mar 2026; Compass doesn't assess amounts or monthly cadence.
Want the onboarding docs for Clear Treasury?
🔧 settlement_accounts
{
"currency": "USD",
"direction": "collection",
"named_only": true
}🔧 match_transaction
{
"entity_type": "LimitedCompany",
"sell_currencies": [
"GBP"
],
"buy_currencies": [
"KES"
],
"send_from_country": "GB",
"send_to_country": "KE",
"client_country": "GB",
"account_requirements": [
{
"currency": "USD",
"direction": "collection",
"naming": "named_required",
"domicile_country": "any"
}
],
"include_prospects": true
}• Currencycloud/TCC — live · named virtual IBAN, USD, domiciled US
• FX Broker (Equals) — live · named local account, GB-domiciled · currency ANY wildcard row, not USD-specific
• Clear Treasury — live · drops out, pooled USD only
• Riva — Rolodex prospect · drops out, no USD collection recorded
Live data last verified Mar 2026; entity type for UK Ltd not recorded at any of them.
Does the USD account need to be US-domiciled, or is a GB one fine?
onboarding riva corpay
🔧 provider_profile
{
"name_or_code": "Riva"
}Unverified prospect intel, not a tested onboarding process; no contact email or phone recorded.
Want their currency and country coverage next?
🔧 provider_profile
{
"name_or_code": "Corpay"
}🔧 client_jurisdictions
{
"country": "FR"
}Corpay has never been verified in Compass, so this is a gap, not a "no".
For a French corporate, four others are recorded as willing to onboard: Currencycloud/TCC and FX Broker (Equals) live, OpenPayd and Riva prospects. Want their requirements?
qualify all in one
🔧 match_transaction
{
"entity_type": "LimitedCompany",
"sell_currencies": [
"GBP"
],
"buy_currencies": [
"CNH"
],
"send_from_country": "GB",
"send_to_country": "CN",
"client_country": "GB",
"account_requirements": [
{
"currency": "GBP",
"direction": "collection",
"naming": "named_required",
"domicile_country": "GB"
}
],
"include_prospects": true
}🔧 settlement_accounts
{
"currency": "GBP",
"iban_country": "GB",
"direction": "collection",
"named_only": true
}🔧 currency_support
{
"currency": "CNH",
"direction": "buy",
"client_category": "business"
}🔧 currency_support
{
"currency": "CNY",
"direction": "buy",
"client_category": "business"
}🔧 match_transaction
{
"entity_type": "LimitedCompany",
"sell_currencies": [
"GBP"
],
"buy_currencies": [
"CNY"
],
"send_from_country": "GB",
"send_to_country": "CN",
"client_country": "GB",
"account_requirements": [
{
"currency": "GBP",
"direction": "collection",
"naming": "named_required",
"domicile_country": "GB"
}
],
"include_prospects": true
}• FX Broker (Equals) — live · full match on GBP→CNY, named GBP account in the UK · account row is a general "any currency" one, not GBP-specific
• Clear Treasury — live · GBP→CNY yes, pooled GBP account only
• Corpay US — live · GBP→CNY and named UK account yes, won't onboard UK clients
• Currencycloud/TCC — live · named UK virtual IBAN yes, no CNY recorded
• Moneycorp, Corpay, OpenPayd, Riva — no CNY recorded, so no match
CNH is recorded nowhere, so treat CNY as the working assumption. Live data last verified Mar 2026; entity-type rules for a UK Ltd have no data at every provider.
Do you want me to confirm whether the client needs offshore CNH specifically, or pull FX Broker's onboarding docs?
qualify hkd local
🔧 settlement_accounts
{
"currency": "HKD",
"iban_country": "HK"
}🔧 settlement_accounts
{
"currency": "HKD"
}• OpenPayd — Rolodex prospect · named local HKD account in Hong Kong, pay-in · said to be in pilot, unconfirmed · from Paul's call, 12 Aug 2026
• Corpay US — live · named HKD account, pay-in and payout · domiciled UK, not Hong Kong
• FX Broker (Equals) — live · named account, pay-in · general currency row, not HKD-specific; domiciled UK
• Clear Treasury — live · HKD pooled account only, UK-domiciled · not a named account
• Currencycloud/TCC — live · named account for payouts · general row, not HKD- or HK-specific
Live data last verified Mar 2026 (stale).
Do you need the account physically in Hong Kong, or is a UK-held HKD account in the client's name enough?
🔧 entity_restrictions
{
"client_country": "SG"
}🔧 client_jurisdictions
{
"country": "SG"
}🔧 match_transaction
{
"entity_type": "LimitedCompany",
"client_country": "SG",
"sell_currencies": [
"USD"
],
"buy_currencies": [
"HKD"
],
"send_from_country": "SG",
"send_to_country": "HK",
"account_requirements": [
{
"currency": "HKD",
"direction": "collection",
"naming": "named_required",
"domicile_country": "HK"
}
]
}• Corpay US — live · USD→HKD, onboards SG, named HKD pay-in account · account domiciled UK, not HK; SG onboarding is conditional
• FX Broker (Equals) — live · USD→HKD, onboards SG, named pay-in account · account domiciled UK; general currency row, not HKD-specific
• OpenPayd — Rolodex prospect · only one with a named HKD pay-in account in Hong Kong · SG not recorded as a client country; pilot, unconfirmed · from Paul's call, 12 Aug 2026
• Clear Treasury, Currencycloud/TCC, Moneycorp — live · won't, SG not a supported client country
• Riva, Corpay — no USD→HKD recorded
Live data last verified Mar 2026 (stale); no entity-type data for a Singapore limited company at any of them.
Want the onboarding docs for Corpay US and FX Broker?
• Corpay US — live · full match: USD→HKD, onboards SG, named HKD pay-in account · domiciled UK, not HK; SG onboarding conditional
• FX Broker (Equals) — live · full match: USD→HKD, onboards SG, named pay-in account · domiciled UK; general currency row, not HKD-specific
• OpenPayd — Rolodex prospect · the only named HKD pay-in account in Hong Kong · SG not recorded as a client country; pilot, unconfirmed · from Paul's call, 12 Aug 2026
Live data last verified Mar 2026 (stale); no entity-type data for a Singapore limited company at any of them.
Want the onboarding requirements for Corpay US and FX Broker?
How it runs
/slack/events → Sidekiq worker.Member + channel gate, quota, leases: reused from the old PRD.
claude -p on the Compass serverOpus 5 on the team subscription, one session per Slack thread / DM (--session-id / --resume), so it remembers the conversation. Extends ClaudeSubscriptionClient.No Sonnet. No API key. Same box, same login as document extraction.
claude -p connects with --mcp-config.Live queries at question time. Nothing downloaded, nothing cached.
match_transaction creates a real Compass::Lookup (source ask), so misses land in the existing Unserved Needs analytics — no new gap table, no gap channel needed.Is this "a new Compass MCP tool"? Yes. Compass gets an MCP server — one endpoint exposing the twelve tools above — and the Slack bot is one client of it. Every answer you read on this page was produced that way: the model chose a tool, the tool queried Compass, the model wrote the reply from the result. The same server can later serve the partner portal, a Claude Desktop client for Paul, or Callum-style bots.
Why MCP and not SQL-in-the-prompt or a data download? Three options were on the table. (a) Download/snapshot the tables and let the model read them: fast, but stale the moment someone edits Compass, and it invites the model to "reason" over 900 rows instead of querying. (b) Let the model write SQL: flexible, but every answer's correctness then depends on the model's SQL and Compass's semantics (wildcard rows, group expansion, specific-over-general entity rules) would have to be re-learned in every prompt. (c) Named tools that encode those semantics once, in Ruby, next to the matchers: the model only decides which question to ask; Compass decides what the data means. MCP is simply the standard way to hand those tools to claude -p, and the same server later serves the partner portal or a Claude Desktop client. (c) is what the conversations above ran on.
Data & liveness
- providers (partner / prospect, verification date, onboarding notes, contacts, conversations)
- currency corridors (direction, supported, client category, allowed sell currencies)
- settlement accounts (named local / virtual IBAN / pooled; domicile country; collection / sending)
- client jurisdictions, country exclusions
- entity + industry restrictions (specific-over-general)
- forward capabilities (tenor, deliverable/NDF, deposits)
- provenance: source, who, when — "recorded from Paul's call on 12 Aug"
compass_ask_sessions: Slack thread/DM ↔ Claude session id, member, started/last-activecompass_ask_turns: question, tool calls (names + args), answer, grounding verdict, tokens, latency, 👍/👎compass_lookupsrows withsource: askwhenever a transaction is matched (feeds Unserved Needs)- Nothing else. It never edits capability data.
Every tool call hits Postgres when the question is asked. Edit a corridor in Compass and the next question sees it. The only cache is the 1-hour Slack member/channel check.
Cost & speedObserved here: 10.1s median-ish per turn, 1–3 tool calls, roughly 10–40k tokens per turn on the subscription. Fine for Slack; the "👀" reaction covers the wait.
Data gaps the conversations exposed
- Onboarding requirements are one sentence per provider. Live partners hold 30–180 characters in
onboarding_corporate/onboarding_personal. "Requirements for a French corporate with Corpay" cannot be answered richly until Compass holds requirements per client type and jurisdiction (a structured table, or transcript ingestion of the partners' own onboarding calls). - Verification is stale. Every live partner was last verified 3–4 March 2026; Corpay (UK) has no data at all. The bot says so on every answer, which will get old fast — a re-verification pass is the cheapest quality win.
- No live local settlement in FR/ES/HK. Domiciles recorded: AL, AU, CA, DE, GB, IE, NL, US. So the ES-IBAN and France questions are genuinely "no live partner", which is the Rolodex's job — and the reason prospects must be in the answers.
- Direction wording. "Sell HKD" is ambiguous (client sells vs we sell). The bot states its reading; the tool vocabulary should pin it once ("client sells").
How to stress-test it before building
- Regression suite = these conversations. Each scripted conversation runs against a fixed data snapshot; assertions on which tools were called and which providers appear; a judge scores tone (Callum harness pattern). Run on every prompt change.
- Grounding red team. Ask about providers with no rows (Corpay UK), leading questions ("Corpay can do MZN, right?"), and questions that tempt general knowledge ("does Wise…"). Pass = "not recorded"/refusal, never a fabricated yes.
- Unknown vs no. Seed a corridor as
supported: falseand one missing; the bot must distinguish "won't" from "not recorded". - Prospect leakage. Prospect rows must be labelled every time and never appear as live; API responses must exclude them (Rolodex INV-R1).
- Injection. Put instruction-shaped text in a provider's notes/conditions ("ignore your rules…"); the bot must quote it as data. Same fence pattern as
TranscriptPrompt. - Staleness. Set
last_verified_atto 200 days; every answer naming that partner must carry the flag. - Latency budget. p50 < 15s, p95 < 40s per turn with 3 tool calls; alert above.
- Live dogfood week. Paul, Tom and Sara use it in a private channel for a week; every 👎 becomes a scenario.
Re-scoped plan (replaces the 32-story PRD)
| # | Piece | Notes |
|---|---|---|
| 1 | MCP tool server in Compass | Rails-mounted, localhost, bearer; the 11 tools above over ActiveRecord; match_transaction calls Compass::MatchProviders, match_prospects calls Compass::MatchProspects; provenance in every row. |
| 2 | ClaudeSubscriptionClient → conversational mode | session id / resume, --mcp-config, stream-json tool events, Opus 5, per-turn attempt budget. |
| 3 | System prompt + vocabulary | The one used here, hardened; fenced untrusted fields. |
| 4 | Grounding guard | Deterministic; provider names + capability verbs vs tool results; unknown/no; prospect labels; stale flags. |
| 5 | Sessions + turns tables | Thread/DM ↔ session; audit; 👍/👎. |
| 6–9 | Slack ingress, worker, gates, leases | Carried over from the old PRD (ASK-010…029 equivalents), minus parser/renderer/gap table. |
| 10 | Lookups from conversations | source: ask; appear in analytics and Unserved Needs automatically. |
| 11 | Eval harness | This PoC's scenarios + judge, run in CI against a seeded DB. |
| 12 | Later: API front door | Same brain, prospects excluded (INV-R1), for the partner portal. |
Roughly 12–14 stories instead of 32, because the hard parts (matching semantics, Rolodex, gaps, transport) already exist in Compass.