关于
This skill provides essential domain knowledge for building secure mobile financial apps like wallets and payment systems. It covers critical concepts such as transaction lifecycles, key custody, idempotency, and KYC/AML to prevent common architectural pitfalls. Use it when designing or implementing any mobile product that handles money to ensure robust and secure financial operations.
快速安装
Claude Code
推荐npx skills add avelikiy/great_cto -a claude-code/plugin add https://github.com/avelikiy/great_ctogit clone https://github.com/avelikiy/great_cto.git ~/.claude/skills/vertical-fintech-mobile在 Claude Code 中复制并粘贴此命令以安装该技能
技能文档
Money on a phone — spec it like the network will fail mid-transfer
A field app that loses a photo is annoying. A money app that loses — or duplicates — a transfer is a loss, a support case, and sometimes a regulator. Everything in the generic mobile contract still applies (offline queue, idempotency, permissions); this pack is the part that is different because it is money, and it is the part community skill sets do not carry, because it is domain knowledge rather than framework knowledge.
The through-line: the phone is not the ledger. It is a client with an opinion, and every screen must be honest about how strong that opinion is.
1. A balance has three states, never two
confirmed · pending · unknown. A number rendered without which of the three
it is, is a lie the user will act on.
- confirmed — the server said so, and the app has heard from the server recently enough to say when.
- pending — the app has applied its own optimistic change on top. It is a display, not a fact, and it is labelled.
- unknown — the app has not reached the server. This is NOT the last confirmed number rendered as though it were current. A stale balance shown as live is the defect this whole pack exists to prevent.
Every balance carries as of when. "£1,240.55" is not an answer; "£1,240.55, as of 14:02" is.
2. The idempotency key must outlive the process
The generic rule is "client-generated id so a re-sync never duplicates". For money that is not enough, because the process dies.
- Mint the key before the intent leaves the screen, and persist it with the intent in the same durable write. A key held in memory is a key that a crash turns into a second payment.
- The key belongs to the user's intent, not to the attempt. Ten retries of one "send £50" share one key. A second tap of the button is a new intent — or it is a double-send, and the UI decides which by disabling or by asking.
- The server contract must state how long it honours a key. An idempotency window shorter than the app's retry backoff is the same as no idempotency.
3. Keys never enter JavaScript memory
For any product that signs — custody, non-custodial wallets, hardware-backed auth:
- Signing happens in the platform's secure hardware (Keychain/Secure Enclave, Keystore/StrongBox). The app asks for a signature; it never holds the key.
- A seed phrase or private key in a JS variable is in the crash dump, the debugger, the redux devtools, and the error reporter. Assume all four.
- Non-custodial means non-recoverable. If the product cannot restore a lost key, the onboarding must say so before the key exists, not in a support article afterwards.
- The signing confirmation shows what is actually being signed, decoded. A hex blob the user cannot read is consent theatre.
4. A transaction is a state machine, and it is written down
Not "sent/failed". At minimum:
drafted → submitted → accepted → settled
↘ rejected
↘ unknown ──(reconcile)──→ settled | rejected
unknownis a real state, and the one that matters. The request left and no answer came back. The app may not guess, may not retry blindly (see §2), and may not show it as failed — a payment shown as failed that actually settled is how a user sends it twice.- Every non-terminal state has a timeout and an owner: what checks it, how often, and what it does when the answer never comes.
- Terminal states are terminal. A settled transaction is not re-driven by a retry queue that woke up late.
5. The device clock may not order financial events
A phone with a wrong clock silently wins every last-write-wins conflict.
- Ordering comes from the server, or from a logical clock the server issues.
- Device time may be recorded as observed metadata — never as the ordering key, never as the audit timestamp.
- The same applies to "which offline edit is newer" for anything money-adjacent.
6. Reconciliation is a feature, not an error path
When the app reconnects after an offline stretch:
- The server's view of money wins, always.
- The difference is surfaced, never silently overwritten. A user who saw a balance and then sees a different one, with no explanation, files a fraud report.
- Reconciliation is idempotent and resumable: it runs on a flaky connection, so it must survive being interrupted halfway.
- Pending local intents that the server never received are re-offered to the user, not auto-sent. Auto-sending an hour-old payment intent is a surprise the user did not consent to.
7. A blocked account is a designed state
KYC/AML is not an error dialog.
- The states are real product states with real screens:
unverified,pending review,verified,limited,frozen. Each says what the user can still do and what happens next. - The app must be able to stop. A limit or a freeze arriving mid-session has to be honoured on the next action, not at next launch.
- Never explain a freeze in terms the user can use to evade it. "Under review" is the whole message; the reason belongs in the case file, not the UI.
- Re-verification prompts must survive an app reinstall — the state lives on the server.
8. The screenshot the OS takes without asking
Both platforms snapshot the app when it backgrounds, and that image goes to disk.
- Balances, account numbers, and anything key-shaped are masked on background.
- Screen-recording and screenshot detection where the platform offers it, at least for seed-phrase and full-PAN screens.
- The clipboard is shared and, on some platforms, synced across devices. An address or code copied to it is not private; expire it.
9. What to model (or the spec is naive)
| Entity | Non-obvious part |
|---|---|
| Intent | Distinct from the transaction. Carries the idempotency key, persisted before send. |
| Transaction | The state machine of §4, with unknown and per-state timeouts. |
| Balance snapshot | Value + state + as of. Never a bare number. |
| Reconciliation run | Resumable, idempotent, with a record of what differed. |
| Verification status | The §7 states, server-owned, survives reinstall. |
| Key reference | A handle to hardware-held material. Never the material. |
| Limit | Per-period, server-evaluated, honoured mid-session. |
10. Where this pack stops
- Payment scope and PSP mechanics →
pci-reviewer. - Ledger integrity and double-entry →
accounting-reviewer. - On-chain oracles, MEV, upgradeability →
oracle-reviewer. - Store policy for financial apps →
mobile-store-reviewer. - Framework performance → the mobile performance invariant in
agents/mobile-app-builder.md.
This pack is the phone's own share of the problem, and it is the share that gets skipped because it looks like plumbing that the backend already handled.
GitHub 仓库
常见问题
什么是 vertical-fintech-mobile Skill?
vertical-fintech-mobile 是一个 Claude Skill,作者为 avelikiy。Skill 将 Claude 按需加载的说明和资源打包,让 Claude 无需额外提示即可执行与 vertical-fintech-mobile 相关的任务。
如何安装 vertical-fintech-mobile?
使用本页的安装命令:将 vertical-fintech-mobile 作为插件添加到 Claude Code,或将其仓库克隆到 skills 目录,然后重启 Claude 以加载该 Skill。
vertical-fintech-mobile 属于哪个分类?
vertical-fintech-mobile 属于元分类。
vertical-fintech-mobile 可以免费使用吗?
可以。vertical-fintech-mobile 已收录在 AIMCP,可免费安装。
相关推荐技能
Content Collections 是一个 TypeScript 优先的构建工具,可将本地 Markdown/MDX 文件转换为类型安全的数据集合。它专为构建博客、文档站和内容密集型 Vite+React 应用而设计,提供基于 Zod 的自动模式验证。该工具涵盖从 Vite 插件配置、MDX 编译到生产环境部署的完整工作流。
这个Claude Skill为开发者提供完整的Polymarket预测市场开发支持,涵盖API调用、交易执行和市场数据分析。关键特性包括实时WebSocket数据流,可监控实时交易、订单和市场动态。开发者可用它构建预测市场应用、实施交易策略并集成实时市场预测功能。
该Skill帮助开发者创建OpenCode插件,用于接入命令、文件、LSP等25+种事件。它提供了插件结构、事件API规范和JavaScript/TypeScript实现模式,适合需要拦截操作、扩展功能或自定义事件处理的场景。开发者可通过它快速构建响应式模块来增强OpenCode AI助手的能力。
SGLang是一个专为LLM设计的高性能推理框架,特别适用于需要结构化输出的场景。它通过RadixAttention前缀缓存技术,在处理JSON、正则表达式、工具调用等具有重复前缀的复杂工作流时,能实现极速生成。如果你正在构建智能体或多轮对话系统,并追求远超vLLM的推理性能,SGLang是理想选择。
