技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
tres-recon-gaps【数据与研究】Query, display, and resolve reconciliation gaps from the TRES Finance MCP connector. Trigger this skill ONLY when the user explicitly requests to view or close reconciliation gaps — for example: "show me the reconciliation gaps", "close the recon gaps", "view gaps for today", "plug the reconciliation gaps for ETH", "fix the gaps for USDC and BTC". Do…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
End-to-end workflow for surfacing, analyzing, and resolving reconciliation gaps in TRES Finance.
Before fetching any data, confirm two things with the user:
The reconciliation queries are scoped to a specific date (the endDate parameter).
"I'll fetch reconciliation gaps for today (YYYY-MM-DD). Let me know if you want a different date."
Use ISO format YYYY-MM-DD throughout.
asset.symbol values before displaying.Use the reconciliation query. Always pass the confirmed endDate. Fetch up to 200 at a time.
query GetReconciliationGaps($limit: Int, $offset: Int, $endDate: Date) {
reconciliation(limit: $limit, offset: $offset, endDate: $endDate) {
totalCount
results {
id
amount
calculatedBalance
state
status
gap
belongsTo {
id
name
identifier
}
asset {
key
identifier
symbol
platform
}
pendingTransactionsCount
pendingTransactionsTotalAmount
}
}
}
Variables: {"limit": 200, "offset": 0, "endDate": "<confirmed-date>"}
Note:
gap=calculatedBalance − historicalBalance. Positive means the ledger has more than on-chain; negative means the ledger has less.
If the user requested specific assets, filter the results now: keep only rows where asset.symbol matches the requested symbols (case-insensitive).
Take all IDs from the (filtered) Step 1 results and query assetBalance:
query GetAssetBalancesWithFiat($ids: [String], $limit: Int, $currency: String) {
assetBalance(id_In: $ids, limit: $limit, currency: $currency, excludeUnderDelegation: true) {
totalCount
results {
id
calculatedBalance
historicalBalance
reconciliation
fiatValue {
value
unitPrice
fiatCurrency
}
belongsTo {
id
name
identifier
}
asset {
key
symbol
platform
identifier
}
}
}
}
Variables: {"currency": "usd", "ids": ["<id1>", "<id2>", ...], "limit": 200}
Important: id_In expects [String], not [ID].
Compute for each row:
fiatGap = reconciliation (token gap) × fiatValue.unitPrice
Always generate a standalone .html file as the primary output — do not fall back to an inline widget.
Read references/html-template-notes.md for the full visual spec (fonts, colors, layout, column widths, modal behavior, API call mechanism).
Key requirements for the generated file:
Filtered: ETH, USDC)After generating the file, present it to the user with present_files.
The user triggers actions by copying a prompt from the HTML dashboard and pasting it into the Claude chat. When Claude receives one of these prompts, execute the corresponding mutation immediately — no further confirmation needed (the user already chose the action in the dashboard).
createPlug)mutation CreatePlug(
$hash: String!
$platform: Platform!
$timestamp: DateTime!
$belongsToId: ID!
$assetId: ID!
$assetIdentifier: String!
$amount: Float!
$direction: Direction!
$thirdPartyIdentifier: String!
) {
createPlug(
hash: $hash
platform: $platform
timestamp: $timestamp
belongsToId: $belongsToId
assetId: $assetId
assetIdentifier: $assetIdentifier
amount: $amount
direction: $direction
thirdPartyIdentifier: $thirdPartyIdentifier
) {
transaction { id identifier platform timestamp }
}
}
Variable mapping:
| Field | Value |
|---|---|
hash | plug_<assetId>_<walletId>_<timestamp_ms> |
platform | asset.platform |
timestamp | new Date().toISOString() |
belongsToId | belongsTo.id |
assetId | asset.key |
assetIdentifier | asset.identifier (use "native" for native assets like ETH/AVAX) |
amount | Math.abs(gap) |
direction | gap > 0 ? "INFLOW" : "OUTFLOW" |
thirdPartyIdentifier | belongsTo.identifier (wallet address) |
createReconciliationGapFillRule)mutation CreateGapFillRule(
$name: String!
$assetId: String!
$internalAccountId: Int!
$interval: Interval!
$startDate: Date!
$endDate: Date!
) {
createReconciliationGapFillRule(
name: $name
assetId: $assetId
internalAccountId: $internalAccountId
interval: $interval
startDate: $startDate
endDate: $endDate
) {
success
message
ruleId
}
}
Variable mapping:
| Field | Value |
|---|---|
name | User-editable rule name (pre-filled: Auto gap-fill · <asset> · <wallet>) |
assetId | asset.key |
internalAccountId | parseInt(belongsTo.id) — must be Int! |
interval | DAILY / WEEKLY / MONTHLY |
startDate | ISO date string, e.g. "2026-04-07" |
endDate | ISO date string (default: 2 years from today) |
Once the user indicates they are finished adding plugs (e.g. "done", "that's all", "looks good"), run a data collect to sync the updated state.
Use the triggerDataCollect mutation (or equivalent — introspect with get_schema_summary if needed):
mutation TriggerDataCollect {
triggerDataCollect {
success
message
}
}
After it completes, inform the user:
"Data collect triggered — TRES will now sync the latest on-chain balances. The reconciliation gaps should update shortly."
Default grouping: by asset symbol
asset.symbol into one groupAlternative: group by wallet (if user requests it)
belongsTo.identifierAlways order by fiat gap, not token gap.
// Fiat values
≥ $1M → "$X.XXXM"
≥ $1K → "$X.XXK"
< $1K → "$X.XX"
// Token quantities
≥ 1B → "X.XXXB"
≥ 1M → "X.XXXM"
≥ 1K → "X.XXXK"
< 1K → up to 6 significant figures, trim trailing zeros
// Signs
Positive gaps: "+" prefix
Negative gaps: "−" (minus sign, not hyphen)
No sign: absolute values (on-chain bal, calculated bal)
| Situation | Handling |
|---|---|
unitPrice = 0 | Show "—" for fiat gap; token gap still displays |
historicalBalance is negative | Display as-is; flag visually if extreme |
pendingTransactionsCount > 0 | Show amber warning badge — pending txs may reduce the gap once confirmed |
| Very large token gaps with tiny fiat value | Still show; sort by fiat means they appear near bottom |
gap field timeouts on large datasets | Use assetBalance.reconciliation field instead (same value, more reliable) |
| Asset filter yields zero rows | Inform the user: "No gaps found for [assets] on [date]" |
reconciliation query — has endDate parameter; returns gap and basic balance fieldsassetBalance query — returns historicalBalance, reconciliation (= gap), and fiatValue { value, unitPrice }; prefer for enriched dataassetBalance(id_In: [String]) — note [String] not [ID]createPlug — belongsToId is ID!, assetId is ID! (pass the asset key string)createReconciliationGapFillRule — internalAccountId is Int!; assetId is String!; interval is Interval! enumETHEREUM, BASE, ARBITRUM, OPTIMISM, POLYGON, AVAX, AVALANCHE_P_CHAIN, MANTRA, etc.