Capability gold set
Every edge on apis.io/capabilities/ is produced by a classifier that maps an API's tag to a business capability. This 39-item set is what decides whether that classifier is right. It is published so the labels can be argued with.
Each label was assigned by reading the item's operations and schema names — never
the tag string, and never the OpenAPI title, which is actively misleading (see below).
15 of 39 labels are
ABSTAIN: a set that forces a mapping teaches the classifier to guess.
Calibration
Does a stated confidence mean what it says?
| stated | n | actually right | gap |
|---|---|---|---|
| 0.6 | 8 | 50% | -10% |
| 0.7 | 5 | 80% | +10% |
| 0.8 | 5 | 80% | +0% |
| 0.9 | 2 | 100% | +10% |
| 1.0 | 4 | 100% | +0% |
Precision at threshold
Where to cut. Only edges at ≥ 0.7 are published.
| threshold | edges | precision |
|---|---|---|
| ≥ 0.7 | 16 | 87.5% |
| ≥ 0.8 | 11 | 90.9% |
| ≥ 0.9 | 6 | 100.0% |
The three-way homograph
The centrepiece. Positions means job positions on Workday
(BC-300), portfolio positions on FactSet (BC-1380), and an
IAM/device artifact on AWS (abstain). Any method that maps a tag string without
reading the vendor's operations must get at least two of the three wrong — and a
fan-out filter cannot help, because each one is specific. It is specific to the wrong sense.
Title traps
refine-openapis builds each split file's title by joining the source
spec's title to the tag name, so titles carry business nouns belonging to a different tag:
PeopleSoft … Accounts Payable Employees API.
The title is the least reliable field the classifier is given, and these items exist to
catch a classifier that reads it.
Every label
Shaded rows are where the classifier disagreed with the label.
| item | gold | classifier | conf | verdict | why this label |
|---|---|---|---|---|---|
workday::Candidates | BC-300 | BC-300 | 0.95 | correct | getCandidates / Candidate schema — recruiting. |
workday::Job Postings | BC-300 | BC-300 | 0.92 | correct | getJobPostings / JobPosting schema. |
workday::Leave of Absence | BC-300 | BC-300 | 0.75 | correct | requestLeaveOfAbsence / LeaveOfAbsenceRequest. |
workday::Compensation Plans | BC-300 | BC-300 | 0.95 | correct | requestCompensationChange / CompensationGrade. |
oracle-fusion::Absences | BC-300 | BC-300 | 0.72 | correct | listAbsences / createAbsence / Absence schema. |
peoplesoft::Employeestitle trap | BC-300 | BC-300 | 0.72 | correct | listEmployees / getEmployee — HCM. The TITLE says "Accounts Payable Employees API". A title-reading classifier maps this to finance. The operations do not. |
peoplesoft::General Ledger | BC-200 | BC-200 | 0.92 | correct | listJournalEntries — financial management. |
peoplesoft::Accounts Payable | BC-200 | BC-200 | 0.85 | correct | listVouchers — payables. |
oracle-fusion::Accounts Receivabletitle trap | BC-200 | BC-200 | 0.95 | correct | listReceivablesInvoices / listReceipts / ReceivablesInvoice. Title carries "Absences" from the source spec; the operations are unambiguous receivables. |
stripe::Payments | BC-1340 | BC-1340 | 0.7 | correct | getPaymentIntents / payment_method — the cleanest true positive in the set. |
stripe::Charges | BC-1340 | BC-1340 | 0.7 | correct | PostCharges / PostChargesChargeRefundsRequest / dispute close. |
bloomberg-emsx::Orders | BC-1370 | BC-1370 | 0.95 | correct | createOrder / modifyOrder on Bloomberg Execution Management — capital markets TRADING, not procurement or e-commerce orders. |
factset::Positionshomograph | BC-1380 | BC-1370 | 0.6 | wrong | "List all open positions of a portfolio" / PostPortfolioPositionClosedListRequest — portfolio positions. Capital markets operations, NOT job positions. |
servicenow::Trouble Ticket | BC-430 | BC-600 | 0.7 | wrong | createTroubleTicket / TroubleTicket — customer service. |
servicenow::Catalog Items | BC-600 | BC-600 | 0.8 | correct | listCatalogItems — IT service catalogue. |
datadog::Audit | BC-600 | ABSTAIN | missed | ListAuditLogs / AuditLogsEventAttributes — IT observability, not internal audit. | |
cloudflare::Accountshomograph | BC-600 | BC-600 | 0.6 | correct | 740 operations — account details, IP address management, zero-trust gateway. "Accounts" here is a TENANT, not a bank account and not accounting. |
citrix::Policieshomograph | BC-600 | BC-600 | 0.6 | correct | deployPolicy on a NetScaler application delivery controller — network policy. NOT insurance policies, which is what the banking frame invites. |
workday::Positionshomograph | BC-300 | BC-300 | 0.8 | correct | getPositions / Position schema on the Staffing API — JOB positions. One third of the three-way `Positions` homograph. |
amazon-web-services::Positionshomograph | ABSTAIN | ABSTAIN | correct | Third of the three-way. One operation, amazonWebServicesUpdatePosition, under an IAM Access Analyzer description, no schemas. Neither trading nor staffing, and there is not enough here to name any capability. ABSTAIN is correct. | |
amazon-web-services::Claimshomograph | ABSTAIN | ABSTAIN | correct | ClaimDevicesByClaimCode — IoT device claiming. NOT insurance or healthcare claims. Context is one operation with no schemas; abstain. | |
jupyter-notebook::Proxyhomograph | ABSTAIN | ABSTAIN | correct | getProxyTable / addProxyRoute / ProxyRoute — HTTP proxy routing in a kernel gateway. NOT proxy voting, which is what a capital-markets frame invites. | |
salesforce::Benefitshomograph title trap | ABSTAIN | BC-420 | 0.75 | wrong — should abstain | One operation, MemberBenefits, inside the Bulk API 2.0 spec, title "Abort Benefits API". Could be HCM benefits or insurance member benefits; the context cannot tell. Abstain — this is precisely where a confident guess is worse than nothing. |
stripe::Capabilitieshomograph | ABSTAIN | ABSTAIN | correct | GetAccountsAccountCapabilities — Stripe's account "capabilities" (which payment methods an account may use). A pure lexical collision with this whole exercise. | |
factset::Alerthomograph | ABSTAIN | ABSTAIN | correct | /alerting/prices/basic/alert/list — price alerting plumbing. The lexical baseline put `Alert` on Financial Crime Management; on a market-data vendor it is a notification feature. Abstain. | |
adobe-suite::Ordershomograph relabelled | BC-4240 | BC-4240 | 0.65 | correct | createOrderUsingPOST / OrderLineItemDto / Subscription / AutoRenewal — reseller product orders in a partner marketplace. Same tag as bloomberg-emsx::Orders, entirely different capability. RELABELLED from BC-410 Sales Management: the first label was written when the frame was Cross-Industry + Banking only, so Subscription Lifecycle Management did not exist as an option. Once Software & Technology joined the frame the classifier chose BC-4240, which the `Subscription` and `AutoRenewal` schemas support better than Sales. The classifier beat the gold label here. |
salesforce::Abort | ABSTAIN | ABSTAIN | correct | AbortaJobQuery / CloseorAbortaJob — bulk job control. | |
salesforce::Async | ABSTAIN | ABSTAIN | correct | ToolingRunTestsAsync — a fragment tag, not a resource. | |
factset::Asynch | ABSTAIN | ABSTAIN | correct | request-files / check-status / get-files — async job plumbing. | |
datadog::Add | ABSTAIN | ABSTAIN | correct | CreateDashboardListItems, CreateFastlyService, AddUserToRole — a verb fragment holding three unrelated operations. No single capability exists to map it to. | |
stripe::Attach | ABSTAIN | BC-1340 | 0.65 | wrong — should abstain | postPaymentMethodsPaymentMethodAttach — one verb fragment off the payments API. |
slack::Auth | ABSTAIN | ABSTAIN | correct | authTest / authRevoke — authentication plumbing. | |
slack::Bookmarks | ABSTAIN | ABSTAIN | correct | Add/Edit/List Bookmark — a chat product feature, no business capability. | |
github::Emojis | ABSTAIN | ABSTAIN | correct | emojis/get. If anything maps this, calibration is broken. | |
github::Gitignore | ABSTAIN | ABSTAIN | correct | gitignore template listing. | |
stripe::Balance Transactions | BC-200 | BC-1340 | 0.6 | wrong | GetBalanceTransactions / balance_transaction. Arguably BC-1340 Payments; labelled Financial Management because the surface is a ledger of settled movements rather than payment initiation. FLAGGED FOR REVIEW — if Kin reads it the other way this label should flip, and the classifier should not be penalised for BC-1340 here. |
github::Billingrelabelled | BC-4250 | BC-4250 | 0.6 | correct | get-github-advanced-security-billing / advanced-security-active-committers — seat-based subscription billing. RELABELLED from BC-200 Financial Management for the same reason as adobe-suite::Orders: Subscription Billing & Revenue Management was not in the 53-L1 frame when this was first labelled. FLAGGED FOR REVIEW. |
mastercard::Claims | BC-1300 | BC-1340 | 0.6 | wrong | getClaimsIdentities, "Share an Identity when the TP is also an RP", with UserConsent and FraudDetectionResponseMeta — identity claims in bill payment. Labelled Banking Customer Management; BC-1400 Financial Crime is a defensible alternative. FLAGGED FOR REVIEW. |
datadog::Accounthomograph | BC-600 | ABSTAIN | missed | CreateGCPSTSAccount / GCPSTSServiceAccount — cloud SERVICE accounts. Not customers, not accounting. |
Contest it
Some of these are judgements, not facts, and are marked as such in the notes —
stripe::Balance Transactions (Financial Management or Payments?),
github::Billing, mastercard::Claims. Two labels have already been
relabelled because the classifier produced a better answer than
the human did.
If you think a label is wrong, say so — open an issue on the roadmap. The set should grow toward more homographs and more abstentions, not more easy positives: the easy ones already score 100% and tell us nothing.
Capability definitions: Turbo EA Capabilities by Vincent Verdet — Turbo EA, github.com/vincentmakes/turbo-ea-capabilities, CC BY 4.0. See the NOTICE.