Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Configure local development workflows that integrate with Fondo for financial data, using Fondo exports with QuickBooks or accounting tools. Trigger: "fondo dev setup", "fondo export", "fondo QuickBooks", "fondo local data".
.claude/skills/jeremylongshore-fondo-local-dev-loop/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -52% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -33% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -18% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -36% | 0% |
Local development workflow for Fondo startup tax and bookkeeping integration. Provides a fast feedback loop using CSV exports and mock financial data so you can build dashboards, R&D credit calculators, and burn-rate tools without waiting on live Fondo reports. Toggle between mock mode for rapid iteration and real export parsing for production validation.
bashcp .env.example .env # Set your credentials: # FONDO_API_KEY=fondo_xxxxxxxxxxxx # FONDO_EXPORT_DIR=./exports # MOCK_MODE=true npm install express csv-parse dotenv tsx typescript @types/node npm install -D vitest supertest mkdir -p exports
typescript// src/dev/server.ts import express from "express"; const app = express(); app.use(express.json()); const MOCK = process.env.MOCK_MODE === "true"; if (MOCK) { const { mountMockRoutes } = require("./mocks"); mountMockRoutes(app); } else { const { mountExportRoutes } = require("./export-parser"); mountExportRoutes(app, process.env.FONDO_EXPORT_DIR!); } app.listen(3002, () => console.log(`Fondo dev server on :3002 [mock=${MOCK}]`));
typescript// src/dev/mocks.ts — realistic startup financial data export function mountMockRoutes(app: any) { app.get("/api/transactions", (_req: any, res: any) => res.json([ { date: "2025-03-01", description: "AWS Infrastructure", amount: -4200, category: "Cloud Hosting", account: "Operating", isRnD: true }, { date: "2025-03-05", description: "Engineer Salary", amount: -12500, category: "Payroll", account: "Operating", isRnD: true }, { date: "2025-03-10", description: "Stripe Revenue", amount: 8750, category: "Revenue", account: "Income", isRnD: false }, ])); app.get("/api/reports/pnl", (_req: any, res: any) => res.json({ period: "2025-Q1", revenue: 26250, expenses: 50100, netIncome: -23850, })); app.get("/api/reports/rnd-summary", (_req: any, res: any) => res.json({ totalQualified: 38500, categories: ["Cloud Hosting", "Payroll", "Software Tools"], })); }
bashnpm run dev:mock & # Start mock server in background npm run test # Unit tests with vitest npm run test -- --watch # Watch mode for rapid iteration MOCK_MODE=false npm run test:integration # Test against real Fondo CSV exports
exports/ to test parsing without Fondo dashboard access--verbose flag with the parser to log skipped rows and type coercion warnings$1,234.56 vs 1234.56) in Amount column| Issue | Cause | Fix | |-------|-------|-----| | CSV parse error | Malformed export file | Re-export from Fondo with UTF-8 encoding | | NaN in amount | Currency symbols in Amount column | Strip $ and , before parseFloat | | Missing R&D column | Older export format | Use Fondo's updated report template | | ENOENT exports/ | Export directory missing | Run mkdir -p exports | | Empty dataset | Date range has no transactions | Widen the date range in Fondo dashboard |
See fondo-debug-bundle.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 26,956 | 30,400 | +13% | 1 | 1 | 0% | 4,688 | 6,681 | +43% | 0 | 0 | — |
case-02 | pass→fail | 16,537 | 25,553 | +55% | 1 | 1 | 0% | 3,055 | 5,603 | +83% | 0 | 0 | — |
case-03 | fail→fail | 27,506 | 20,686 | -25% | 1 | 1 | 0% | 4,477 | 5,842 | +30% | 0 | 0 | — |
case-04 | fail→fail | 21,914 | 9,459 | -57% | 1 | 1 | 0% | 3,385 | 1,892 | -44% | 0 | 0 | — |
case-05 | fail→pass | 21,976 | 17,758 | -19% | 1 | 1 | 0% | 3,308 | 3,368 | +2% | 0 | 0 | — |
case-06 | fail→pass | 21,227 | 8,137 | -62% | 1 | 1 | 0% | 3,252 | 1,573 | -52% | 0 | 0 | — |
case-07 | pass→fail | 16,640 | 13,021 | -22% | 1 | 1 | 0% | 3,064 | 3,401 | +11% | 0 | 0 | — |
case-08 | fail→pass | 18,399 | 3,297 | -82% | 1 | 1 | 0% | 2,361 | 1,590 | -33% | 0 | 0 | — |
case-09 | fail→pass | 17,641 | 4,999 | -72% | 1 | 1 | 0% | 2,310 | 1,895 | -18% | 0 | 0 | — |
case-10 | fail→pass | 14,233 | 3,360 | -76% | 1 | 1 | 0% | 2,460 | 1,580 | -36% | 0 | 0 | — |
case-11 | pass→pass | 13,795 | 13,781 | -0% | 1 | 1 | 0% | 2,733 | 2,293 | -16% | 0 | 0 | — |
case-12 | fail→fail | 14,459 | 18,920 | +31% | 1 | 1 | 0% | 2,584 | 3,654 | +41% | 0 | 0 | — |
case-13 | fail→fail | 10,516 | 8,125 | -23% | 1 | 1 | 0% | 1,769 | 2,428 | +37% | 0 | 0 | — |
case-14 | pass→pass | 12,096 | 5,688 | -53% | 1 | 1 | 0% | 2,030 | 1,867 | -8% | 0 | 0 | — |
case-15 | fail→pass | 13,716 | 7,311 | -47% | 1 | 1 | 0% | 1,522 | 1,425 | -6% | 0 | 0 | — |
case-16 | fail→fail | 17,042 | 9,020 | -47% | 1 | 1 | 0% | 3,169 | 3,000 | -5% | 0 | 0 | — |
case-17 | fail→pass | 12,902 | 1,740 | -87% | 1 | 1 | 0% | 1,439 | 1,281 | -11% | 0 | 0 | — |
case-18 | fail→pass | 17,524 | 22,021 | +26% | 1 | 1 | 0% | 2,580 | 5,016 | +94% | 0 | 0 | — |
case-19 | fail→pass | 13,681 | 1,511 | -89% | 1 | 1 | 0% | 1,651 | 1,264 | -23% | 0 | 0 | — |
case-20 | fail→fail | 18,138 | 13,611 | -25% | 1 | 1 | 0% | 3,093 | 4,453 | +44% | 0 | 0 | — |
case-21 | fail→fail | 21,556 | 21,152 | -2% | 1 | 1 | 0% | 3,672 | 4,565 | +24% | 0 | 0 | — |
case-22 | fail→fail | 22,868 | 28,758 | +26% | 1 | 1 | 0% | 4,834 | 6,436 | +33% | 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. 22 cases were attempted. The headline lift of +32 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
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.