Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Secure Finta fundraising data and investor information. Trigger with phrases like "finta security", "finta data privacy".
.claude/skills/jeremylongshore-finta-security-basics/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 132% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -7% | 0% |
Finta manages fundraising pipelines containing investor contact information, term sheet details, valuation data, cap table snapshots, and deal room documents. A breach exposes confidential fundraising strategy, investor relationships, and financial terms that could damage competitive positioning. Protect API credentials, deal room access controls, and any integration that syncs investor data to external CRMs or spreadsheets.
typescriptfunction createFintaClient(): { apiKey: string; baseUrl: string } { const apiKey = process.env.FINTA_API_KEY; if (!apiKey) { throw new Error("Missing FINTA_API_KEY — store in secrets manager, never in code"); } // Finta keys access investor contacts and financial terms — treat as highly sensitive console.log("Finta client initialized (key suffix:", apiKey.slice(-4), ")"); return { apiKey, baseUrl: "https://api.trustfinta.com/v1" }; }
typescriptimport crypto from "crypto"; import { Request, Response, NextFunction } from "express"; function verifyFintaWebhook(req: Request, res: Response, next: NextFunction): void { const signature = req.headers["x-finta-signature"] as string; const secret = process.env.FINTA_WEBHOOK_SECRET!; const expected = crypto.createHmac("sha256", secret).update(req.body).digest("hex"); if (!signature || !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) { res.status(401).send("Invalid signature"); return; } next(); }
typescriptimport { z } from "zod"; const InvestorContactSchema = z.object({ investor_id: z.string().uuid(), firm_name: z.string().min(1).max(200), contact_email: z.string().email(), deal_stage: z.enum(["prospect", "contacted", "meeting", "term_sheet", "closed", "passed"]), check_size: z.number().positive().optional(), valuation_cap: z.number().positive().optional(), }); function validateInvestorData(data: unknown) { return InvestorContactSchema.parse(data); }
typescriptconst FINTA_SENSITIVE_FIELDS = ["valuation_cap", "check_size", "term_sheet_url", "cap_table", "investor_email", "phone"]; function redactFintaLog(record: Record<string, unknown>): Record<string, unknown> { const redacted = { ...record }; for (const field of FINTA_SENSITIVE_FIELDS) { if (field in redacted) redacted[field] = "[REDACTED]"; } return redacted; }
| Vulnerability | Risk | Mitigation | |---|---|---| | Leaked API key | Full access to investor pipeline and deal terms | Secrets manager + rotation | | Overly broad deal room access | Confidential terms exposed to wrong investors | Per-investor permission scoping | | Unencrypted pipeline exports | Financial strategy leaked via CSV files | GPG encryption + .gitignore | | Stale investor access | Former prospects retain document access | Post-round access review | | CRM sync without redaction | Valuation data leaks to third-party CRM | Field-level redaction before sync |
See finta-prod-checklist.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 40,469 | 22,595 | -44% | 1 | 1 | 0% | 1,776 | 4,125 | +132% | 0 | 0 | — |
case-02 | fail→pass | 18,646 | 10,514 | -44% | 1 | 1 | 0% | 3,882 | 3,118 | -20% | 0 | 0 | — |
case-03 | fail→pass | 13,422 | 14,020 | +4% | 1 | 1 | 0% | 2,494 | 3,168 | +27% | 0 | 0 | — |
case-04 | pass→pass | 11,491 | 8,302 | -28% | 1 | 1 | 0% | 2,245 | 2,351 | +5% | 0 | 0 | — |
case-05 | fail→pass | 221,515 | 118,528 | -46% | 1 | 1 | 0% | 1,010 | 1,644 | +63% | 0 | 0 | — |
case-06 | pass→pass | 14,127 | 8,352 | -41% | 1 | 1 | 0% | 2,186 | 2,320 | +6% | 0 | 0 | — |
case-07 | pass→pass | 10,665 | 10,117 | -5% | 1 | 1 | 0% | 1,909 | 2,883 | +51% | 0 | 0 | — |
case-08 | fail→pass | 8,821 | 3,183 | -64% | 1 | 1 | 0% | 1,559 | 1,448 | -7% | 0 | 0 | — |
case-09 | fail→pass | 37,313 | 8,597 | -77% | 1 | 1 | 0% | 3,876 | 2,742 | -29% | 0 | 0 | — |
case-10 | fail→pass | 12,893 | 8,249 | -36% | 1 | 1 | 0% | 1,981 | 2,219 | +12% | 0 | 0 | — |
case-11 | fail→pass | 16,077 | 5,933 | -63% | 1 | 1 | 0% | 3,411 | 2,154 | -37% | 0 | 0 | — |
case-12 | fail→pass | 15,759 | 12,610 | -20% | 1 | 1 | 0% | 2,442 | 3,175 | +30% | 0 | 0 | — |
case-13 | pass→pass | 14,709 | 7,368 | -50% | 1 | 1 | 0% | 2,259 | 2,104 | -7% | 0 | 0 | — |
case-14 | fail→fail | 14,104 | 12,885 | -9% | 1 | 1 | 0% | 2,146 | 3,095 | +44% | 0 | 0 | — |
case-15 | fail→pass | 15,934 | 10,346 | -35% | 1 | 1 | 0% | 2,259 | 2,651 | +17% | 0 | 0 | — |
case-16 | fail→pass | 10,097 | 3,400 | -66% | 1 | 1 | 0% | 1,571 | 1,596 | +2% | 0 | 0 | — |
case-17 | fail→pass | 10,345 | 2,070 | -80% | 1 | 1 | 0% | 1,646 | 1,253 | -24% | 0 | 0 | — |
case-18 | fail→pass | 10,504 | 4,236 | -60% | 1 | 1 | 0% | 1,557 | 1,678 | +8% | 0 | 0 | — |
case-19 | fail→pass | 7,674 | 2,370 | -69% | 1 | 1 | 0% | 1,212 | 1,376 | +14% | 0 | 0 | — |
case-20 | pass→pass | 11,278 | 10,221 | -9% | 1 | 1 | 0% | 2,195 | 2,887 | +32% | 0 | 0 | — |
case-21 | pass→pass | 19,388 | 19,585 | +1% | 1 | 1 | 0% | 3,879 | 4,967 | +28% | 0 | 0 | — |
case-22 | pass→pass | 14,738 | 12,202 | -17% | 1 | 1 | 0% | 2,870 | 3,300 | +15% | 0 | 0 | — |
case-23 | pass→pass | 43,704 | 21,745 | -50% | 1 | 1 | 0% | 8,218 | 5,455 | -34% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +61 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.